datatables.js 4.4 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499
  1. /*
  2. * This combined file was created by the DataTables downloader builder:
  3. * https://datatables.net/download
  4. *
  5. * To rebuild or modify this file with the latest versions of the included
  6. * software please visit:
  7. * https://datatables.net/download/#bs4/jszip-2.5.0/pdfmake-0.1.32/dt-1.10.16/af-2.2.2/b-1.5.1/b-colvis-1.5.1/b-flash-1.5.1/b-html5-1.5.1/b-print-1.5.1/cr-1.4.1/fc-3.2.4/fh-3.1.3/kt-2.3.2/r-2.2.1/rg-1.0.2/rr-1.2.3/sc-1.4.4/sl-1.2.5
  8. *
  9. * Included libraries:
  10. * JSZip 2.5.0, pdfmake 0.1.32, DataTables 1.10.16, AutoFill 2.2.2, Buttons 1.5.1, Column visibility 1.5.1, Flash export 1.5.1, HTML5 export 1.5.1, Print view 1.5.1, ColReorder 1.4.1, FixedColumns 3.2.4, FixedHeader 3.1.3, KeyTable 2.3.2, Responsive 2.2.1, RowGroup 1.0.2, RowReorder 1.2.3, Scroller 1.4.4, Select 1.2.5
  11. */
  12. /*!
  13. JSZip - A Javascript class for generating and reading zip files
  14. <http://stuartk.com/jszip>
  15. (c) 2009-2014 Stuart Knightley <stuart [at] stuartk.com>
  16. Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown.
  17. JSZip uses the library pako released under the MIT license :
  18. https://github.com/nodeca/pako/blob/master/LICENSE
  19. */
  20. !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
  21. 'use strict';
  22. // private property
  23. var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  24. // public method for encoding
  25. exports.encode = function(input, utf8) {
  26. var output = "";
  27. var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
  28. var i = 0;
  29. while (i < input.length) {
  30. chr1 = input.charCodeAt(i++);
  31. chr2 = input.charCodeAt(i++);
  32. chr3 = input.charCodeAt(i++);
  33. enc1 = chr1 >> 2;
  34. enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
  35. enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
  36. enc4 = chr3 & 63;
  37. if (isNaN(chr2)) {
  38. enc3 = enc4 = 64;
  39. }
  40. else if (isNaN(chr3)) {
  41. enc4 = 64;
  42. }
  43. output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
  44. }
  45. return output;
  46. };
  47. // public method for decoding
  48. exports.decode = function(input, utf8) {
  49. var output = "";
  50. var chr1, chr2, chr3;
  51. var enc1, enc2, enc3, enc4;
  52. var i = 0;
  53. input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  54. while (i < input.length) {
  55. enc1 = _keyStr.indexOf(input.charAt(i++));
  56. enc2 = _keyStr.indexOf(input.charAt(i++));
  57. enc3 = _keyStr.indexOf(input.charAt(i++));
  58. enc4 = _keyStr.indexOf(input.charAt(i++));
  59. chr1 = (enc1 << 2) | (enc2 >> 4);
  60. chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  61. chr3 = ((enc3 & 3) << 6) | enc4;
  62. output = output + String.fromCharCode(chr1);
  63. if (enc3 != 64) {
  64. output = output + String.fromCharCode(chr2);
  65. }
  66. if (enc4 != 64) {
  67. output = output + String.fromCharCode(chr3);
  68. }
  69. }
  70. return output;
  71. };
  72. },{}],2:[function(_dereq_,module,exports){
  73. 'use strict';
  74. function CompressedObject() {
  75. this.compressedSize = 0;
  76. this.uncompressedSize = 0;
  77. this.crc32 = 0;
  78. this.compressionMethod = null;
  79. this.compressedContent = null;
  80. }
  81. CompressedObject.prototype = {
  82. /**
  83. * Return the decompressed content in an unspecified format.
  84. * The format will depend on the decompressor.
  85. * @return {Object} the decompressed content.
  86. */
  87. getContent: function() {
  88. return null; // see implementation
  89. },
  90. /**
  91. * Return the compressed content in an unspecified format.
  92. * The format will depend on the compressed conten source.
  93. * @return {Object} the compressed content.
  94. */
  95. getCompressedContent: function() {
  96. return null; // see implementation
  97. }
  98. };
  99. module.exports = CompressedObject;
  100. },{}],3:[function(_dereq_,module,exports){
  101. 'use strict';
  102. exports.STORE = {
  103. magic: "\x00\x00",
  104. compress: function(content, compressionOptions) {
  105. return content; // no compression
  106. },
  107. uncompress: function(content) {
  108. return content; // no compression
  109. },
  110. compressInputType: null,
  111. uncompressInputType: null
  112. };
  113. exports.DEFLATE = _dereq_('./flate');
  114. },{"./flate":8}],4:[function(_dereq_,module,exports){
  115. 'use strict';
  116. var utils = _dereq_('./utils');
  117. var table = [
  118. 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
  119. 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
  120. 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  121. 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
  122. 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
  123. 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  124. 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
  125. 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
  126. 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  127. 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
  128. 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
  129. 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  130. 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
  131. 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
  132. 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  133. 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
  134. 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
  135. 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  136. 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
  137. 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
  138. 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  139. 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
  140. 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
  141. 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  142. 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
  143. 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
  144. 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  145. 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
  146. 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
  147. 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  148. 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
  149. 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
  150. 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  151. 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
  152. 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
  153. 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  154. 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
  155. 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
  156. 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  157. 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
  158. 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
  159. 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  160. 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
  161. 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
  162. 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  163. 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
  164. 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
  165. 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  166. 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
  167. 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
  168. 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  169. 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
  170. 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
  171. 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  172. 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
  173. 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
  174. 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  175. 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
  176. 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
  177. 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  178. 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
  179. 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
  180. 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  181. 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  182. ];
  183. /**
  184. *
  185. * Javascript crc32
  186. * http://www.webtoolkit.info/
  187. *
  188. */
  189. module.exports = function crc32(input, crc) {
  190. if (typeof input === "undefined" || !input.length) {
  191. return 0;
  192. }
  193. var isArray = utils.getTypeOf(input) !== "string";
  194. if (typeof(crc) == "undefined") {
  195. crc = 0;
  196. }
  197. var x = 0;
  198. var y = 0;
  199. var b = 0;
  200. crc = crc ^ (-1);
  201. for (var i = 0, iTop = input.length; i < iTop; i++) {
  202. b = isArray ? input[i] : input.charCodeAt(i);
  203. y = (crc ^ b) & 0xFF;
  204. x = table[y];
  205. crc = (crc >>> 8) ^ x;
  206. }
  207. return crc ^ (-1);
  208. };
  209. // vim: set shiftwidth=4 softtabstop=4:
  210. },{"./utils":21}],5:[function(_dereq_,module,exports){
  211. 'use strict';
  212. var utils = _dereq_('./utils');
  213. function DataReader(data) {
  214. this.data = null; // type : see implementation
  215. this.length = 0;
  216. this.index = 0;
  217. }
  218. DataReader.prototype = {
  219. /**
  220. * Check that the offset will not go too far.
  221. * @param {string} offset the additional offset to check.
  222. * @throws {Error} an Error if the offset is out of bounds.
  223. */
  224. checkOffset: function(offset) {
  225. this.checkIndex(this.index + offset);
  226. },
  227. /**
  228. * Check that the specifed index will not be too far.
  229. * @param {string} newIndex the index to check.
  230. * @throws {Error} an Error if the index is out of bounds.
  231. */
  232. checkIndex: function(newIndex) {
  233. if (this.length < newIndex || newIndex < 0) {
  234. throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?");
  235. }
  236. },
  237. /**
  238. * Change the index.
  239. * @param {number} newIndex The new index.
  240. * @throws {Error} if the new index is out of the data.
  241. */
  242. setIndex: function(newIndex) {
  243. this.checkIndex(newIndex);
  244. this.index = newIndex;
  245. },
  246. /**
  247. * Skip the next n bytes.
  248. * @param {number} n the number of bytes to skip.
  249. * @throws {Error} if the new index is out of the data.
  250. */
  251. skip: function(n) {
  252. this.setIndex(this.index + n);
  253. },
  254. /**
  255. * Get the byte at the specified index.
  256. * @param {number} i the index to use.
  257. * @return {number} a byte.
  258. */
  259. byteAt: function(i) {
  260. // see implementations
  261. },
  262. /**
  263. * Get the next number with a given byte size.
  264. * @param {number} size the number of bytes to read.
  265. * @return {number} the corresponding number.
  266. */
  267. readInt: function(size) {
  268. var result = 0,
  269. i;
  270. this.checkOffset(size);
  271. for (i = this.index + size - 1; i >= this.index; i--) {
  272. result = (result << 8) + this.byteAt(i);
  273. }
  274. this.index += size;
  275. return result;
  276. },
  277. /**
  278. * Get the next string with a given byte size.
  279. * @param {number} size the number of bytes to read.
  280. * @return {string} the corresponding string.
  281. */
  282. readString: function(size) {
  283. return utils.transformTo("string", this.readData(size));
  284. },
  285. /**
  286. * Get raw data without conversion, <size> bytes.
  287. * @param {number} size the number of bytes to read.
  288. * @return {Object} the raw data, implementation specific.
  289. */
  290. readData: function(size) {
  291. // see implementations
  292. },
  293. /**
  294. * Find the last occurence of a zip signature (4 bytes).
  295. * @param {string} sig the signature to find.
  296. * @return {number} the index of the last occurence, -1 if not found.
  297. */
  298. lastIndexOfSignature: function(sig) {
  299. // see implementations
  300. },
  301. /**
  302. * Get the next date.
  303. * @return {Date} the date.
  304. */
  305. readDate: function() {
  306. var dostime = this.readInt(4);
  307. return new Date(
  308. ((dostime >> 25) & 0x7f) + 1980, // year
  309. ((dostime >> 21) & 0x0f) - 1, // month
  310. (dostime >> 16) & 0x1f, // day
  311. (dostime >> 11) & 0x1f, // hour
  312. (dostime >> 5) & 0x3f, // minute
  313. (dostime & 0x1f) << 1); // second
  314. }
  315. };
  316. module.exports = DataReader;
  317. },{"./utils":21}],6:[function(_dereq_,module,exports){
  318. 'use strict';
  319. exports.base64 = false;
  320. exports.binary = false;
  321. exports.dir = false;
  322. exports.createFolders = false;
  323. exports.date = null;
  324. exports.compression = null;
  325. exports.compressionOptions = null;
  326. exports.comment = null;
  327. exports.unixPermissions = null;
  328. exports.dosPermissions = null;
  329. },{}],7:[function(_dereq_,module,exports){
  330. 'use strict';
  331. var utils = _dereq_('./utils');
  332. /**
  333. * @deprecated
  334. * This function will be removed in a future version without replacement.
  335. */
  336. exports.string2binary = function(str) {
  337. return utils.string2binary(str);
  338. };
  339. /**
  340. * @deprecated
  341. * This function will be removed in a future version without replacement.
  342. */
  343. exports.string2Uint8Array = function(str) {
  344. return utils.transformTo("uint8array", str);
  345. };
  346. /**
  347. * @deprecated
  348. * This function will be removed in a future version without replacement.
  349. */
  350. exports.uint8Array2String = function(array) {
  351. return utils.transformTo("string", array);
  352. };
  353. /**
  354. * @deprecated
  355. * This function will be removed in a future version without replacement.
  356. */
  357. exports.string2Blob = function(str) {
  358. var buffer = utils.transformTo("arraybuffer", str);
  359. return utils.arrayBuffer2Blob(buffer);
  360. };
  361. /**
  362. * @deprecated
  363. * This function will be removed in a future version without replacement.
  364. */
  365. exports.arrayBuffer2Blob = function(buffer) {
  366. return utils.arrayBuffer2Blob(buffer);
  367. };
  368. /**
  369. * @deprecated
  370. * This function will be removed in a future version without replacement.
  371. */
  372. exports.transformTo = function(outputType, input) {
  373. return utils.transformTo(outputType, input);
  374. };
  375. /**
  376. * @deprecated
  377. * This function will be removed in a future version without replacement.
  378. */
  379. exports.getTypeOf = function(input) {
  380. return utils.getTypeOf(input);
  381. };
  382. /**
  383. * @deprecated
  384. * This function will be removed in a future version without replacement.
  385. */
  386. exports.checkSupport = function(type) {
  387. return utils.checkSupport(type);
  388. };
  389. /**
  390. * @deprecated
  391. * This value will be removed in a future version without replacement.
  392. */
  393. exports.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
  394. /**
  395. * @deprecated
  396. * This value will be removed in a future version without replacement.
  397. */
  398. exports.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
  399. /**
  400. * @deprecated
  401. * This function will be removed in a future version without replacement.
  402. */
  403. exports.pretty = function(str) {
  404. return utils.pretty(str);
  405. };
  406. /**
  407. * @deprecated
  408. * This function will be removed in a future version without replacement.
  409. */
  410. exports.findCompression = function(compressionMethod) {
  411. return utils.findCompression(compressionMethod);
  412. };
  413. /**
  414. * @deprecated
  415. * This function will be removed in a future version without replacement.
  416. */
  417. exports.isRegExp = function (object) {
  418. return utils.isRegExp(object);
  419. };
  420. },{"./utils":21}],8:[function(_dereq_,module,exports){
  421. 'use strict';
  422. var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined');
  423. var pako = _dereq_("pako");
  424. exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
  425. exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
  426. exports.magic = "\x08\x00";
  427. exports.compress = function(input, compressionOptions) {
  428. return pako.deflateRaw(input, {
  429. level : compressionOptions.level || -1 // default compression
  430. });
  431. };
  432. exports.uncompress = function(input) {
  433. return pako.inflateRaw(input);
  434. };
  435. },{"pako":24}],9:[function(_dereq_,module,exports){
  436. 'use strict';
  437. var base64 = _dereq_('./base64');
  438. /**
  439. Usage:
  440. zip = new JSZip();
  441. zip.file("hello.txt", "Hello, World!").file("tempfile", "nothing");
  442. zip.folder("images").file("smile.gif", base64Data, {base64: true});
  443. zip.file("Xmas.txt", "Ho ho ho !", {date : new Date("December 25, 2007 00:00:01")});
  444. zip.remove("tempfile");
  445. base64zip = zip.generate();
  446. **/
  447. /**
  448. * Representation a of zip file in js
  449. * @constructor
  450. * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional).
  451. * @param {Object=} options the options for creating this objects (optional).
  452. */
  453. function JSZip(data, options) {
  454. // if this constructor is used without `new`, it adds `new` before itself:
  455. if(!(this instanceof JSZip)) return new JSZip(data, options);
  456. // object containing the files :
  457. // {
  458. // "folder/" : {...},
  459. // "folder/data.txt" : {...}
  460. // }
  461. this.files = {};
  462. this.comment = null;
  463. // Where we are in the hierarchy
  464. this.root = "";
  465. if (data) {
  466. this.load(data, options);
  467. }
  468. this.clone = function() {
  469. var newObj = new JSZip();
  470. for (var i in this) {
  471. if (typeof this[i] !== "function") {
  472. newObj[i] = this[i];
  473. }
  474. }
  475. return newObj;
  476. };
  477. }
  478. JSZip.prototype = _dereq_('./object');
  479. JSZip.prototype.load = _dereq_('./load');
  480. JSZip.support = _dereq_('./support');
  481. JSZip.defaults = _dereq_('./defaults');
  482. /**
  483. * @deprecated
  484. * This namespace will be removed in a future version without replacement.
  485. */
  486. JSZip.utils = _dereq_('./deprecatedPublicUtils');
  487. JSZip.base64 = {
  488. /**
  489. * @deprecated
  490. * This method will be removed in a future version without replacement.
  491. */
  492. encode : function(input) {
  493. return base64.encode(input);
  494. },
  495. /**
  496. * @deprecated
  497. * This method will be removed in a future version without replacement.
  498. */
  499. decode : function(input) {
  500. return base64.decode(input);
  501. }
  502. };
  503. JSZip.compressions = _dereq_('./compressions');
  504. module.exports = JSZip;
  505. },{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){
  506. 'use strict';
  507. var base64 = _dereq_('./base64');
  508. var ZipEntries = _dereq_('./zipEntries');
  509. module.exports = function(data, options) {
  510. var files, zipEntries, i, input;
  511. options = options || {};
  512. if (options.base64) {
  513. data = base64.decode(data);
  514. }
  515. zipEntries = new ZipEntries(data, options);
  516. files = zipEntries.files;
  517. for (i = 0; i < files.length; i++) {
  518. input = files[i];
  519. this.file(input.fileName, input.decompressed, {
  520. binary: true,
  521. optimizedBinaryString: true,
  522. date: input.date,
  523. dir: input.dir,
  524. comment : input.fileComment.length ? input.fileComment : null,
  525. unixPermissions : input.unixPermissions,
  526. dosPermissions : input.dosPermissions,
  527. createFolders: options.createFolders
  528. });
  529. }
  530. if (zipEntries.zipComment.length) {
  531. this.comment = zipEntries.zipComment;
  532. }
  533. return this;
  534. };
  535. },{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){
  536. (function (Buffer){
  537. 'use strict';
  538. module.exports = function(data, encoding){
  539. return new Buffer(data, encoding);
  540. };
  541. module.exports.test = function(b){
  542. return Buffer.isBuffer(b);
  543. };
  544. }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
  545. },{}],12:[function(_dereq_,module,exports){
  546. 'use strict';
  547. var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
  548. function NodeBufferReader(data) {
  549. this.data = data;
  550. this.length = this.data.length;
  551. this.index = 0;
  552. }
  553. NodeBufferReader.prototype = new Uint8ArrayReader();
  554. /**
  555. * @see DataReader.readData
  556. */
  557. NodeBufferReader.prototype.readData = function(size) {
  558. this.checkOffset(size);
  559. var result = this.data.slice(this.index, this.index + size);
  560. this.index += size;
  561. return result;
  562. };
  563. module.exports = NodeBufferReader;
  564. },{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){
  565. 'use strict';
  566. var support = _dereq_('./support');
  567. var utils = _dereq_('./utils');
  568. var crc32 = _dereq_('./crc32');
  569. var signature = _dereq_('./signature');
  570. var defaults = _dereq_('./defaults');
  571. var base64 = _dereq_('./base64');
  572. var compressions = _dereq_('./compressions');
  573. var CompressedObject = _dereq_('./compressedObject');
  574. var nodeBuffer = _dereq_('./nodeBuffer');
  575. var utf8 = _dereq_('./utf8');
  576. var StringWriter = _dereq_('./stringWriter');
  577. var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter');
  578. /**
  579. * Returns the raw data of a ZipObject, decompress the content if necessary.
  580. * @param {ZipObject} file the file to use.
  581. * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
  582. */
  583. var getRawData = function(file) {
  584. if (file._data instanceof CompressedObject) {
  585. file._data = file._data.getContent();
  586. file.options.binary = true;
  587. file.options.base64 = false;
  588. if (utils.getTypeOf(file._data) === "uint8array") {
  589. var copy = file._data;
  590. // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.
  591. // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).
  592. file._data = new Uint8Array(copy.length);
  593. // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
  594. if (copy.length !== 0) {
  595. file._data.set(copy, 0);
  596. }
  597. }
  598. }
  599. return file._data;
  600. };
  601. /**
  602. * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.
  603. * @param {ZipObject} file the file to use.
  604. * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.
  605. */
  606. var getBinaryData = function(file) {
  607. var result = getRawData(file),
  608. type = utils.getTypeOf(result);
  609. if (type === "string") {
  610. if (!file.options.binary) {
  611. // unicode text !
  612. // unicode string => binary string is a painful process, check if we can avoid it.
  613. if (support.nodebuffer) {
  614. return nodeBuffer(result, "utf-8");
  615. }
  616. }
  617. return file.asBinary();
  618. }
  619. return result;
  620. };
  621. /**
  622. * Transform this._data into a string.
  623. * @param {function} filter a function String -> String, applied if not null on the result.
  624. * @return {String} the string representing this._data.
  625. */
  626. var dataToString = function(asUTF8) {
  627. var result = getRawData(this);
  628. if (result === null || typeof result === "undefined") {
  629. return "";
  630. }
  631. // if the data is a base64 string, we decode it before checking the encoding !
  632. if (this.options.base64) {
  633. result = base64.decode(result);
  634. }
  635. if (asUTF8 && this.options.binary) {
  636. // JSZip.prototype.utf8decode supports arrays as input
  637. // skip to array => string step, utf8decode will do it.
  638. result = out.utf8decode(result);
  639. }
  640. else {
  641. // no utf8 transformation, do the array => string step.
  642. result = utils.transformTo("string", result);
  643. }
  644. if (!asUTF8 && !this.options.binary) {
  645. result = utils.transformTo("string", out.utf8encode(result));
  646. }
  647. return result;
  648. };
  649. /**
  650. * A simple object representing a file in the zip file.
  651. * @constructor
  652. * @param {string} name the name of the file
  653. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
  654. * @param {Object} options the options of the file
  655. */
  656. var ZipObject = function(name, data, options) {
  657. this.name = name;
  658. this.dir = options.dir;
  659. this.date = options.date;
  660. this.comment = options.comment;
  661. this.unixPermissions = options.unixPermissions;
  662. this.dosPermissions = options.dosPermissions;
  663. this._data = data;
  664. this.options = options;
  665. /*
  666. * This object contains initial values for dir and date.
  667. * With them, we can check if the user changed the deprecated metadata in
  668. * `ZipObject#options` or not.
  669. */
  670. this._initialMetadata = {
  671. dir : options.dir,
  672. date : options.date
  673. };
  674. };
  675. ZipObject.prototype = {
  676. /**
  677. * Return the content as UTF8 string.
  678. * @return {string} the UTF8 string.
  679. */
  680. asText: function() {
  681. return dataToString.call(this, true);
  682. },
  683. /**
  684. * Returns the binary content.
  685. * @return {string} the content as binary.
  686. */
  687. asBinary: function() {
  688. return dataToString.call(this, false);
  689. },
  690. /**
  691. * Returns the content as a nodejs Buffer.
  692. * @return {Buffer} the content as a Buffer.
  693. */
  694. asNodeBuffer: function() {
  695. var result = getBinaryData(this);
  696. return utils.transformTo("nodebuffer", result);
  697. },
  698. /**
  699. * Returns the content as an Uint8Array.
  700. * @return {Uint8Array} the content as an Uint8Array.
  701. */
  702. asUint8Array: function() {
  703. var result = getBinaryData(this);
  704. return utils.transformTo("uint8array", result);
  705. },
  706. /**
  707. * Returns the content as an ArrayBuffer.
  708. * @return {ArrayBuffer} the content as an ArrayBufer.
  709. */
  710. asArrayBuffer: function() {
  711. return this.asUint8Array().buffer;
  712. }
  713. };
  714. /**
  715. * Transform an integer into a string in hexadecimal.
  716. * @private
  717. * @param {number} dec the number to convert.
  718. * @param {number} bytes the number of bytes to generate.
  719. * @returns {string} the result.
  720. */
  721. var decToHex = function(dec, bytes) {
  722. var hex = "",
  723. i;
  724. for (i = 0; i < bytes; i++) {
  725. hex += String.fromCharCode(dec & 0xff);
  726. dec = dec >>> 8;
  727. }
  728. return hex;
  729. };
  730. /**
  731. * Merge the objects passed as parameters into a new one.
  732. * @private
  733. * @param {...Object} var_args All objects to merge.
  734. * @return {Object} a new object with the data of the others.
  735. */
  736. var extend = function() {
  737. var result = {}, i, attr;
  738. for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers
  739. for (attr in arguments[i]) {
  740. if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
  741. result[attr] = arguments[i][attr];
  742. }
  743. }
  744. }
  745. return result;
  746. };
  747. /**
  748. * Transforms the (incomplete) options from the user into the complete
  749. * set of options to create a file.
  750. * @private
  751. * @param {Object} o the options from the user.
  752. * @return {Object} the complete set of options.
  753. */
  754. var prepareFileAttrs = function(o) {
  755. o = o || {};
  756. if (o.base64 === true && (o.binary === null || o.binary === undefined)) {
  757. o.binary = true;
  758. }
  759. o = extend(o, defaults);
  760. o.date = o.date || new Date();
  761. if (o.compression !== null) o.compression = o.compression.toUpperCase();
  762. return o;
  763. };
  764. /**
  765. * Add a file in the current folder.
  766. * @private
  767. * @param {string} name the name of the file
  768. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file
  769. * @param {Object} o the options of the file
  770. * @return {Object} the new file.
  771. */
  772. var fileAdd = function(name, data, o) {
  773. // be sure sub folders exist
  774. var dataType = utils.getTypeOf(data),
  775. parent;
  776. o = prepareFileAttrs(o);
  777. if (typeof o.unixPermissions === "string") {
  778. o.unixPermissions = parseInt(o.unixPermissions, 8);
  779. }
  780. // UNX_IFDIR 0040000 see zipinfo.c
  781. if (o.unixPermissions && (o.unixPermissions & 0x4000)) {
  782. o.dir = true;
  783. }
  784. // Bit 4 Directory
  785. if (o.dosPermissions && (o.dosPermissions & 0x0010)) {
  786. o.dir = true;
  787. }
  788. if (o.dir) {
  789. name = forceTrailingSlash(name);
  790. }
  791. if (o.createFolders && (parent = parentFolder(name))) {
  792. folderAdd.call(this, parent, true);
  793. }
  794. if (o.dir || data === null || typeof data === "undefined") {
  795. o.base64 = false;
  796. o.binary = false;
  797. data = null;
  798. dataType = null;
  799. }
  800. else if (dataType === "string") {
  801. if (o.binary && !o.base64) {
  802. // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask
  803. if (o.optimizedBinaryString !== true) {
  804. // this is a string, not in a base64 format.
  805. // Be sure that this is a correct "binary string"
  806. data = utils.string2binary(data);
  807. }
  808. }
  809. }
  810. else { // arraybuffer, uint8array, ...
  811. o.base64 = false;
  812. o.binary = true;
  813. if (!dataType && !(data instanceof CompressedObject)) {
  814. throw new Error("The data of '" + name + "' is in an unsupported format !");
  815. }
  816. // special case : it's way easier to work with Uint8Array than with ArrayBuffer
  817. if (dataType === "arraybuffer") {
  818. data = utils.transformTo("uint8array", data);
  819. }
  820. }
  821. var object = new ZipObject(name, data, o);
  822. this.files[name] = object;
  823. return object;
  824. };
  825. /**
  826. * Find the parent folder of the path.
  827. * @private
  828. * @param {string} path the path to use
  829. * @return {string} the parent folder, or ""
  830. */
  831. var parentFolder = function (path) {
  832. if (path.slice(-1) == '/') {
  833. path = path.substring(0, path.length - 1);
  834. }
  835. var lastSlash = path.lastIndexOf('/');
  836. return (lastSlash > 0) ? path.substring(0, lastSlash) : "";
  837. };
  838. /**
  839. * Returns the path with a slash at the end.
  840. * @private
  841. * @param {String} path the path to check.
  842. * @return {String} the path with a trailing slash.
  843. */
  844. var forceTrailingSlash = function(path) {
  845. // Check the name ends with a /
  846. if (path.slice(-1) != "/") {
  847. path += "/"; // IE doesn't like substr(-1)
  848. }
  849. return path;
  850. };
  851. /**
  852. * Add a (sub) folder in the current folder.
  853. * @private
  854. * @param {string} name the folder's name
  855. * @param {boolean=} [createFolders] If true, automatically create sub
  856. * folders. Defaults to false.
  857. * @return {Object} the new folder.
  858. */
  859. var folderAdd = function(name, createFolders) {
  860. createFolders = (typeof createFolders !== 'undefined') ? createFolders : false;
  861. name = forceTrailingSlash(name);
  862. // Does this folder already exist?
  863. if (!this.files[name]) {
  864. fileAdd.call(this, name, null, {
  865. dir: true,
  866. createFolders: createFolders
  867. });
  868. }
  869. return this.files[name];
  870. };
  871. /**
  872. * Generate a JSZip.CompressedObject for a given zipOject.
  873. * @param {ZipObject} file the object to read.
  874. * @param {JSZip.compression} compression the compression to use.
  875. * @param {Object} compressionOptions the options to use when compressing.
  876. * @return {JSZip.CompressedObject} the compressed result.
  877. */
  878. var generateCompressedObjectFrom = function(file, compression, compressionOptions) {
  879. var result = new CompressedObject(),
  880. content;
  881. // the data has not been decompressed, we might reuse things !
  882. if (file._data instanceof CompressedObject) {
  883. result.uncompressedSize = file._data.uncompressedSize;
  884. result.crc32 = file._data.crc32;
  885. if (result.uncompressedSize === 0 || file.dir) {
  886. compression = compressions['STORE'];
  887. result.compressedContent = "";
  888. result.crc32 = 0;
  889. }
  890. else if (file._data.compressionMethod === compression.magic) {
  891. result.compressedContent = file._data.getCompressedContent();
  892. }
  893. else {
  894. content = file._data.getContent();
  895. // need to decompress / recompress
  896. result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
  897. }
  898. }
  899. else {
  900. // have uncompressed data
  901. content = getBinaryData(file);
  902. if (!content || content.length === 0 || file.dir) {
  903. compression = compressions['STORE'];
  904. content = "";
  905. }
  906. result.uncompressedSize = content.length;
  907. result.crc32 = crc32(content);
  908. result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions);
  909. }
  910. result.compressedSize = result.compressedContent.length;
  911. result.compressionMethod = compression.magic;
  912. return result;
  913. };
  914. /**
  915. * Generate the UNIX part of the external file attributes.
  916. * @param {Object} unixPermissions the unix permissions or null.
  917. * @param {Boolean} isDir true if the entry is a directory, false otherwise.
  918. * @return {Number} a 32 bit integer.
  919. *
  920. * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute :
  921. *
  922. * TTTTsstrwxrwxrwx0000000000ADVSHR
  923. * ^^^^____________________________ file type, see zipinfo.c (UNX_*)
  924. * ^^^_________________________ setuid, setgid, sticky
  925. * ^^^^^^^^^________________ permissions
  926. * ^^^^^^^^^^______ not used ?
  927. * ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only
  928. */
  929. var generateUnixExternalFileAttr = function (unixPermissions, isDir) {
  930. var result = unixPermissions;
  931. if (!unixPermissions) {
  932. // I can't use octal values in strict mode, hence the hexa.
  933. // 040775 => 0x41fd
  934. // 0100664 => 0x81b4
  935. result = isDir ? 0x41fd : 0x81b4;
  936. }
  937. return (result & 0xFFFF) << 16;
  938. };
  939. /**
  940. * Generate the DOS part of the external file attributes.
  941. * @param {Object} dosPermissions the dos permissions or null.
  942. * @param {Boolean} isDir true if the entry is a directory, false otherwise.
  943. * @return {Number} a 32 bit integer.
  944. *
  945. * Bit 0 Read-Only
  946. * Bit 1 Hidden
  947. * Bit 2 System
  948. * Bit 3 Volume Label
  949. * Bit 4 Directory
  950. * Bit 5 Archive
  951. */
  952. var generateDosExternalFileAttr = function (dosPermissions, isDir) {
  953. // the dir flag is already set for compatibility
  954. return (dosPermissions || 0) & 0x3F;
  955. };
  956. /**
  957. * Generate the various parts used in the construction of the final zip file.
  958. * @param {string} name the file name.
  959. * @param {ZipObject} file the file content.
  960. * @param {JSZip.CompressedObject} compressedObject the compressed object.
  961. * @param {number} offset the current offset from the start of the zip file.
  962. * @param {String} platform let's pretend we are this platform (change platform dependents fields)
  963. * @return {object} the zip parts.
  964. */
  965. var generateZipParts = function(name, file, compressedObject, offset, platform) {
  966. var data = compressedObject.compressedContent,
  967. utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)),
  968. comment = file.comment || "",
  969. utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)),
  970. useUTF8ForFileName = utfEncodedFileName.length !== file.name.length,
  971. useUTF8ForComment = utfEncodedComment.length !== comment.length,
  972. o = file.options,
  973. dosTime,
  974. dosDate,
  975. extraFields = "",
  976. unicodePathExtraField = "",
  977. unicodeCommentExtraField = "",
  978. dir, date;
  979. // handle the deprecated options.dir
  980. if (file._initialMetadata.dir !== file.dir) {
  981. dir = file.dir;
  982. } else {
  983. dir = o.dir;
  984. }
  985. // handle the deprecated options.date
  986. if(file._initialMetadata.date !== file.date) {
  987. date = file.date;
  988. } else {
  989. date = o.date;
  990. }
  991. var extFileAttr = 0;
  992. var versionMadeBy = 0;
  993. if (dir) {
  994. // dos or unix, we set the dos dir flag
  995. extFileAttr |= 0x00010;
  996. }
  997. if(platform === "UNIX") {
  998. versionMadeBy = 0x031E; // UNIX, version 3.0
  999. extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir);
  1000. } else { // DOS or other, fallback to DOS
  1001. versionMadeBy = 0x0014; // DOS, version 2.0
  1002. extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir);
  1003. }
  1004. // date
  1005. // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html
  1006. // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html
  1007. // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html
  1008. dosTime = date.getHours();
  1009. dosTime = dosTime << 6;
  1010. dosTime = dosTime | date.getMinutes();
  1011. dosTime = dosTime << 5;
  1012. dosTime = dosTime | date.getSeconds() / 2;
  1013. dosDate = date.getFullYear() - 1980;
  1014. dosDate = dosDate << 4;
  1015. dosDate = dosDate | (date.getMonth() + 1);
  1016. dosDate = dosDate << 5;
  1017. dosDate = dosDate | date.getDate();
  1018. if (useUTF8ForFileName) {
  1019. // set the unicode path extra field. unzip needs at least one extra
  1020. // field to correctly handle unicode path, so using the path is as good
  1021. // as any other information. This could improve the situation with
  1022. // other archive managers too.
  1023. // This field is usually used without the utf8 flag, with a non
  1024. // unicode path in the header (winrar, winzip). This helps (a bit)
  1025. // with the messy Windows' default compressed folders feature but
  1026. // breaks on p7zip which doesn't seek the unicode path extra field.
  1027. // So for now, UTF-8 everywhere !
  1028. unicodePathExtraField =
  1029. // Version
  1030. decToHex(1, 1) +
  1031. // NameCRC32
  1032. decToHex(crc32(utfEncodedFileName), 4) +
  1033. // UnicodeName
  1034. utfEncodedFileName;
  1035. extraFields +=
  1036. // Info-ZIP Unicode Path Extra Field
  1037. "\x75\x70" +
  1038. // size
  1039. decToHex(unicodePathExtraField.length, 2) +
  1040. // content
  1041. unicodePathExtraField;
  1042. }
  1043. if(useUTF8ForComment) {
  1044. unicodeCommentExtraField =
  1045. // Version
  1046. decToHex(1, 1) +
  1047. // CommentCRC32
  1048. decToHex(this.crc32(utfEncodedComment), 4) +
  1049. // UnicodeName
  1050. utfEncodedComment;
  1051. extraFields +=
  1052. // Info-ZIP Unicode Path Extra Field
  1053. "\x75\x63" +
  1054. // size
  1055. decToHex(unicodeCommentExtraField.length, 2) +
  1056. // content
  1057. unicodeCommentExtraField;
  1058. }
  1059. var header = "";
  1060. // version needed to extract
  1061. header += "\x0A\x00";
  1062. // general purpose bit flag
  1063. // set bit 11 if utf8
  1064. header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00";
  1065. // compression method
  1066. header += compressedObject.compressionMethod;
  1067. // last mod file time
  1068. header += decToHex(dosTime, 2);
  1069. // last mod file date
  1070. header += decToHex(dosDate, 2);
  1071. // crc-32
  1072. header += decToHex(compressedObject.crc32, 4);
  1073. // compressed size
  1074. header += decToHex(compressedObject.compressedSize, 4);
  1075. // uncompressed size
  1076. header += decToHex(compressedObject.uncompressedSize, 4);
  1077. // file name length
  1078. header += decToHex(utfEncodedFileName.length, 2);
  1079. // extra field length
  1080. header += decToHex(extraFields.length, 2);
  1081. var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
  1082. var dirRecord = signature.CENTRAL_FILE_HEADER +
  1083. // version made by (00: DOS)
  1084. decToHex(versionMadeBy, 2) +
  1085. // file header (common to file and central directory)
  1086. header +
  1087. // file comment length
  1088. decToHex(utfEncodedComment.length, 2) +
  1089. // disk number start
  1090. "\x00\x00" +
  1091. // internal file attributes TODO
  1092. "\x00\x00" +
  1093. // external file attributes
  1094. decToHex(extFileAttr, 4) +
  1095. // relative offset of local header
  1096. decToHex(offset, 4) +
  1097. // file name
  1098. utfEncodedFileName +
  1099. // extra field
  1100. extraFields +
  1101. // file comment
  1102. utfEncodedComment;
  1103. return {
  1104. fileRecord: fileRecord,
  1105. dirRecord: dirRecord,
  1106. compressedObject: compressedObject
  1107. };
  1108. };
  1109. // return the actual prototype of JSZip
  1110. var out = {
  1111. /**
  1112. * Read an existing zip and merge the data in the current JSZip object.
  1113. * The implementation is in jszip-load.js, don't forget to include it.
  1114. * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load
  1115. * @param {Object} options Options for loading the stream.
  1116. * options.base64 : is the stream in base64 ? default : false
  1117. * @return {JSZip} the current JSZip object
  1118. */
  1119. load: function(stream, options) {
  1120. throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
  1121. },
  1122. /**
  1123. * Filter nested files/folders with the specified function.
  1124. * @param {Function} search the predicate to use :
  1125. * function (relativePath, file) {...}
  1126. * It takes 2 arguments : the relative path and the file.
  1127. * @return {Array} An array of matching elements.
  1128. */
  1129. filter: function(search) {
  1130. var result = [],
  1131. filename, relativePath, file, fileClone;
  1132. for (filename in this.files) {
  1133. if (!this.files.hasOwnProperty(filename)) {
  1134. continue;
  1135. }
  1136. file = this.files[filename];
  1137. // return a new object, don't let the user mess with our internal objects :)
  1138. fileClone = new ZipObject(file.name, file._data, extend(file.options));
  1139. relativePath = filename.slice(this.root.length, filename.length);
  1140. if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
  1141. search(relativePath, fileClone)) { // and the file matches the function
  1142. result.push(fileClone);
  1143. }
  1144. }
  1145. return result;
  1146. },
  1147. /**
  1148. * Add a file to the zip file, or search a file.
  1149. * @param {string|RegExp} name The name of the file to add (if data is defined),
  1150. * the name of the file to find (if no data) or a regex to match files.
  1151. * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded
  1152. * @param {Object} o File options
  1153. * @return {JSZip|Object|Array} this JSZip object (when adding a file),
  1154. * a file (when searching by string) or an array of files (when searching by regex).
  1155. */
  1156. file: function(name, data, o) {
  1157. if (arguments.length === 1) {
  1158. if (utils.isRegExp(name)) {
  1159. var regexp = name;
  1160. return this.filter(function(relativePath, file) {
  1161. return !file.dir && regexp.test(relativePath);
  1162. });
  1163. }
  1164. else { // text
  1165. return this.filter(function(relativePath, file) {
  1166. return !file.dir && relativePath === name;
  1167. })[0] || null;
  1168. }
  1169. }
  1170. else { // more than one argument : we have data !
  1171. name = this.root + name;
  1172. fileAdd.call(this, name, data, o);
  1173. }
  1174. return this;
  1175. },
  1176. /**
  1177. * Add a directory to the zip file, or search.
  1178. * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders.
  1179. * @return {JSZip} an object with the new directory as the root, or an array containing matching folders.
  1180. */
  1181. folder: function(arg) {
  1182. if (!arg) {
  1183. return this;
  1184. }
  1185. if (utils.isRegExp(arg)) {
  1186. return this.filter(function(relativePath, file) {
  1187. return file.dir && arg.test(relativePath);
  1188. });
  1189. }
  1190. // else, name is a new folder
  1191. var name = this.root + arg;
  1192. var newFolder = folderAdd.call(this, name);
  1193. // Allow chaining by returning a new object with this folder as the root
  1194. var ret = this.clone();
  1195. ret.root = newFolder.name;
  1196. return ret;
  1197. },
  1198. /**
  1199. * Delete a file, or a directory and all sub-files, from the zip
  1200. * @param {string} name the name of the file to delete
  1201. * @return {JSZip} this JSZip object
  1202. */
  1203. remove: function(name) {
  1204. name = this.root + name;
  1205. var file = this.files[name];
  1206. if (!file) {
  1207. // Look for any folders
  1208. if (name.slice(-1) != "/") {
  1209. name += "/";
  1210. }
  1211. file = this.files[name];
  1212. }
  1213. if (file && !file.dir) {
  1214. // file
  1215. delete this.files[name];
  1216. } else {
  1217. // maybe a folder, delete recursively
  1218. var kids = this.filter(function(relativePath, file) {
  1219. return file.name.slice(0, name.length) === name;
  1220. });
  1221. for (var i = 0; i < kids.length; i++) {
  1222. delete this.files[kids[i].name];
  1223. }
  1224. }
  1225. return this;
  1226. },
  1227. /**
  1228. * Generate the complete zip file
  1229. * @param {Object} options the options to generate the zip file :
  1230. * - base64, (deprecated, use type instead) true to generate base64.
  1231. * - compression, "STORE" by default.
  1232. * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
  1233. * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
  1234. */
  1235. generate: function(options) {
  1236. options = extend(options || {}, {
  1237. base64: true,
  1238. compression: "STORE",
  1239. compressionOptions : null,
  1240. type: "base64",
  1241. platform: "DOS",
  1242. comment: null,
  1243. mimeType: 'application/zip'
  1244. });
  1245. utils.checkSupport(options.type);
  1246. // accept nodejs `process.platform`
  1247. if(
  1248. options.platform === 'darwin' ||
  1249. options.platform === 'freebsd' ||
  1250. options.platform === 'linux' ||
  1251. options.platform === 'sunos'
  1252. ) {
  1253. options.platform = "UNIX";
  1254. }
  1255. if (options.platform === 'win32') {
  1256. options.platform = "DOS";
  1257. }
  1258. var zipData = [],
  1259. localDirLength = 0,
  1260. centralDirLength = 0,
  1261. writer, i,
  1262. utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
  1263. // first, generate all the zip parts.
  1264. for (var name in this.files) {
  1265. if (!this.files.hasOwnProperty(name)) {
  1266. continue;
  1267. }
  1268. var file = this.files[name];
  1269. var compressionName = file.options.compression || options.compression.toUpperCase();
  1270. var compression = compressions[compressionName];
  1271. if (!compression) {
  1272. throw new Error(compressionName + " is not a valid compression method !");
  1273. }
  1274. var compressionOptions = file.options.compressionOptions || options.compressionOptions || {};
  1275. var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions);
  1276. var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform);
  1277. localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
  1278. centralDirLength += zipPart.dirRecord.length;
  1279. zipData.push(zipPart);
  1280. }
  1281. var dirEnd = "";
  1282. // end of central dir signature
  1283. dirEnd = signature.CENTRAL_DIRECTORY_END +
  1284. // number of this disk
  1285. "\x00\x00" +
  1286. // number of the disk with the start of the central directory
  1287. "\x00\x00" +
  1288. // total number of entries in the central directory on this disk
  1289. decToHex(zipData.length, 2) +
  1290. // total number of entries in the central directory
  1291. decToHex(zipData.length, 2) +
  1292. // size of the central directory 4 bytes
  1293. decToHex(centralDirLength, 4) +
  1294. // offset of start of central directory with respect to the starting disk number
  1295. decToHex(localDirLength, 4) +
  1296. // .ZIP file comment length
  1297. decToHex(utfEncodedComment.length, 2) +
  1298. // .ZIP file comment
  1299. utfEncodedComment;
  1300. // we have all the parts (and the total length)
  1301. // time to create a writer !
  1302. var typeName = options.type.toLowerCase();
  1303. if(typeName==="uint8array"||typeName==="arraybuffer"||typeName==="blob"||typeName==="nodebuffer") {
  1304. writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
  1305. }else{
  1306. writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
  1307. }
  1308. for (i = 0; i < zipData.length; i++) {
  1309. writer.append(zipData[i].fileRecord);
  1310. writer.append(zipData[i].compressedObject.compressedContent);
  1311. }
  1312. for (i = 0; i < zipData.length; i++) {
  1313. writer.append(zipData[i].dirRecord);
  1314. }
  1315. writer.append(dirEnd);
  1316. var zip = writer.finalize();
  1317. switch(options.type.toLowerCase()) {
  1318. // case "zip is an Uint8Array"
  1319. case "uint8array" :
  1320. case "arraybuffer" :
  1321. case "nodebuffer" :
  1322. return utils.transformTo(options.type.toLowerCase(), zip);
  1323. case "blob" :
  1324. return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType);
  1325. // case "zip is a string"
  1326. case "base64" :
  1327. return (options.base64) ? base64.encode(zip) : zip;
  1328. default : // case "string" :
  1329. return zip;
  1330. }
  1331. },
  1332. /**
  1333. * @deprecated
  1334. * This method will be removed in a future version without replacement.
  1335. */
  1336. crc32: function (input, crc) {
  1337. return crc32(input, crc);
  1338. },
  1339. /**
  1340. * @deprecated
  1341. * This method will be removed in a future version without replacement.
  1342. */
  1343. utf8encode: function (string) {
  1344. return utils.transformTo("string", utf8.utf8encode(string));
  1345. },
  1346. /**
  1347. * @deprecated
  1348. * This method will be removed in a future version without replacement.
  1349. */
  1350. utf8decode: function (input) {
  1351. return utf8.utf8decode(input);
  1352. }
  1353. };
  1354. module.exports = out;
  1355. },{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){
  1356. 'use strict';
  1357. exports.LOCAL_FILE_HEADER = "PK\x03\x04";
  1358. exports.CENTRAL_FILE_HEADER = "PK\x01\x02";
  1359. exports.CENTRAL_DIRECTORY_END = "PK\x05\x06";
  1360. exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07";
  1361. exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06";
  1362. exports.DATA_DESCRIPTOR = "PK\x07\x08";
  1363. },{}],15:[function(_dereq_,module,exports){
  1364. 'use strict';
  1365. var DataReader = _dereq_('./dataReader');
  1366. var utils = _dereq_('./utils');
  1367. function StringReader(data, optimizedBinaryString) {
  1368. this.data = data;
  1369. if (!optimizedBinaryString) {
  1370. this.data = utils.string2binary(this.data);
  1371. }
  1372. this.length = this.data.length;
  1373. this.index = 0;
  1374. }
  1375. StringReader.prototype = new DataReader();
  1376. /**
  1377. * @see DataReader.byteAt
  1378. */
  1379. StringReader.prototype.byteAt = function(i) {
  1380. return this.data.charCodeAt(i);
  1381. };
  1382. /**
  1383. * @see DataReader.lastIndexOfSignature
  1384. */
  1385. StringReader.prototype.lastIndexOfSignature = function(sig) {
  1386. return this.data.lastIndexOf(sig);
  1387. };
  1388. /**
  1389. * @see DataReader.readData
  1390. */
  1391. StringReader.prototype.readData = function(size) {
  1392. this.checkOffset(size);
  1393. // this will work because the constructor applied the "& 0xff" mask.
  1394. var result = this.data.slice(this.index, this.index + size);
  1395. this.index += size;
  1396. return result;
  1397. };
  1398. module.exports = StringReader;
  1399. },{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){
  1400. 'use strict';
  1401. var utils = _dereq_('./utils');
  1402. /**
  1403. * An object to write any content to a string.
  1404. * @constructor
  1405. */
  1406. var StringWriter = function() {
  1407. this.data = [];
  1408. };
  1409. StringWriter.prototype = {
  1410. /**
  1411. * Append any content to the current string.
  1412. * @param {Object} input the content to add.
  1413. */
  1414. append: function(input) {
  1415. input = utils.transformTo("string", input);
  1416. this.data.push(input);
  1417. },
  1418. /**
  1419. * Finalize the construction an return the result.
  1420. * @return {string} the generated string.
  1421. */
  1422. finalize: function() {
  1423. return this.data.join("");
  1424. }
  1425. };
  1426. module.exports = StringWriter;
  1427. },{"./utils":21}],17:[function(_dereq_,module,exports){
  1428. (function (Buffer){
  1429. 'use strict';
  1430. exports.base64 = true;
  1431. exports.array = true;
  1432. exports.string = true;
  1433. exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
  1434. // contains true if JSZip can read/generate nodejs Buffer, false otherwise.
  1435. // Browserify will provide a Buffer implementation for browsers, which is
  1436. // an augmented Uint8Array (i.e., can be used as either Buffer or U8).
  1437. exports.nodebuffer = typeof Buffer !== "undefined";
  1438. // contains true if JSZip can read/generate Uint8Array, false otherwise.
  1439. exports.uint8array = typeof Uint8Array !== "undefined";
  1440. if (typeof ArrayBuffer === "undefined") {
  1441. exports.blob = false;
  1442. }
  1443. else {
  1444. var buffer = new ArrayBuffer(0);
  1445. try {
  1446. exports.blob = new Blob([buffer], {
  1447. type: "application/zip"
  1448. }).size === 0;
  1449. }
  1450. catch (e) {
  1451. try {
  1452. var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
  1453. var builder = new Builder();
  1454. builder.append(buffer);
  1455. exports.blob = builder.getBlob('application/zip').size === 0;
  1456. }
  1457. catch (e) {
  1458. exports.blob = false;
  1459. }
  1460. }
  1461. }
  1462. }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined))
  1463. },{}],18:[function(_dereq_,module,exports){
  1464. 'use strict';
  1465. var DataReader = _dereq_('./dataReader');
  1466. function Uint8ArrayReader(data) {
  1467. if (data) {
  1468. this.data = data;
  1469. this.length = this.data.length;
  1470. this.index = 0;
  1471. }
  1472. }
  1473. Uint8ArrayReader.prototype = new DataReader();
  1474. /**
  1475. * @see DataReader.byteAt
  1476. */
  1477. Uint8ArrayReader.prototype.byteAt = function(i) {
  1478. return this.data[i];
  1479. };
  1480. /**
  1481. * @see DataReader.lastIndexOfSignature
  1482. */
  1483. Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
  1484. var sig0 = sig.charCodeAt(0),
  1485. sig1 = sig.charCodeAt(1),
  1486. sig2 = sig.charCodeAt(2),
  1487. sig3 = sig.charCodeAt(3);
  1488. for (var i = this.length - 4; i >= 0; --i) {
  1489. if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) {
  1490. return i;
  1491. }
  1492. }
  1493. return -1;
  1494. };
  1495. /**
  1496. * @see DataReader.readData
  1497. */
  1498. Uint8ArrayReader.prototype.readData = function(size) {
  1499. this.checkOffset(size);
  1500. if(size === 0) {
  1501. // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of [].
  1502. return new Uint8Array(0);
  1503. }
  1504. var result = this.data.subarray(this.index, this.index + size);
  1505. this.index += size;
  1506. return result;
  1507. };
  1508. module.exports = Uint8ArrayReader;
  1509. },{"./dataReader":5}],19:[function(_dereq_,module,exports){
  1510. 'use strict';
  1511. var utils = _dereq_('./utils');
  1512. /**
  1513. * An object to write any content to an Uint8Array.
  1514. * @constructor
  1515. * @param {number} length The length of the array.
  1516. */
  1517. var Uint8ArrayWriter = function(length) {
  1518. this.data = new Uint8Array(length);
  1519. this.index = 0;
  1520. };
  1521. Uint8ArrayWriter.prototype = {
  1522. /**
  1523. * Append any content to the current array.
  1524. * @param {Object} input the content to add.
  1525. */
  1526. append: function(input) {
  1527. if (input.length !== 0) {
  1528. // with an empty Uint8Array, Opera fails with a "Offset larger than array size"
  1529. input = utils.transformTo("uint8array", input);
  1530. this.data.set(input, this.index);
  1531. this.index += input.length;
  1532. }
  1533. },
  1534. /**
  1535. * Finalize the construction an return the result.
  1536. * @return {Uint8Array} the generated array.
  1537. */
  1538. finalize: function() {
  1539. return this.data;
  1540. }
  1541. };
  1542. module.exports = Uint8ArrayWriter;
  1543. },{"./utils":21}],20:[function(_dereq_,module,exports){
  1544. 'use strict';
  1545. var utils = _dereq_('./utils');
  1546. var support = _dereq_('./support');
  1547. var nodeBuffer = _dereq_('./nodeBuffer');
  1548. /**
  1549. * The following functions come from pako, from pako/lib/utils/strings
  1550. * released under the MIT license, see pako https://github.com/nodeca/pako/
  1551. */
  1552. // Table with utf8 lengths (calculated by first byte of sequence)
  1553. // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
  1554. // because max possible codepoint is 0x10ffff
  1555. var _utf8len = new Array(256);
  1556. for (var i=0; i<256; i++) {
  1557. _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
  1558. }
  1559. _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
  1560. // convert string to array (typed, when possible)
  1561. var string2buf = function (str) {
  1562. var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
  1563. // count binary size
  1564. for (m_pos = 0; m_pos < str_len; m_pos++) {
  1565. c = str.charCodeAt(m_pos);
  1566. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  1567. c2 = str.charCodeAt(m_pos+1);
  1568. if ((c2 & 0xfc00) === 0xdc00) {
  1569. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  1570. m_pos++;
  1571. }
  1572. }
  1573. buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
  1574. }
  1575. // allocate buffer
  1576. if (support.uint8array) {
  1577. buf = new Uint8Array(buf_len);
  1578. } else {
  1579. buf = new Array(buf_len);
  1580. }
  1581. // convert
  1582. for (i=0, m_pos = 0; i < buf_len; m_pos++) {
  1583. c = str.charCodeAt(m_pos);
  1584. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  1585. c2 = str.charCodeAt(m_pos+1);
  1586. if ((c2 & 0xfc00) === 0xdc00) {
  1587. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  1588. m_pos++;
  1589. }
  1590. }
  1591. if (c < 0x80) {
  1592. /* one byte */
  1593. buf[i++] = c;
  1594. } else if (c < 0x800) {
  1595. /* two bytes */
  1596. buf[i++] = 0xC0 | (c >>> 6);
  1597. buf[i++] = 0x80 | (c & 0x3f);
  1598. } else if (c < 0x10000) {
  1599. /* three bytes */
  1600. buf[i++] = 0xE0 | (c >>> 12);
  1601. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  1602. buf[i++] = 0x80 | (c & 0x3f);
  1603. } else {
  1604. /* four bytes */
  1605. buf[i++] = 0xf0 | (c >>> 18);
  1606. buf[i++] = 0x80 | (c >>> 12 & 0x3f);
  1607. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  1608. buf[i++] = 0x80 | (c & 0x3f);
  1609. }
  1610. }
  1611. return buf;
  1612. };
  1613. // Calculate max possible position in utf8 buffer,
  1614. // that will not break sequence. If that's not possible
  1615. // - (very small limits) return max size as is.
  1616. //
  1617. // buf[] - utf8 bytes array
  1618. // max - length limit (mandatory);
  1619. var utf8border = function(buf, max) {
  1620. var pos;
  1621. max = max || buf.length;
  1622. if (max > buf.length) { max = buf.length; }
  1623. // go back from last position, until start of sequence found
  1624. pos = max-1;
  1625. while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
  1626. // Fuckup - very small and broken sequence,
  1627. // return max, because we should return something anyway.
  1628. if (pos < 0) { return max; }
  1629. // If we came to start of buffer - that means vuffer is too small,
  1630. // return max too.
  1631. if (pos === 0) { return max; }
  1632. return (pos + _utf8len[buf[pos]] > max) ? pos : max;
  1633. };
  1634. // convert array to string
  1635. var buf2string = function (buf) {
  1636. var str, i, out, c, c_len;
  1637. var len = buf.length;
  1638. // Reserve max possible length (2 words per char)
  1639. // NB: by unknown reasons, Array is significantly faster for
  1640. // String.fromCharCode.apply than Uint16Array.
  1641. var utf16buf = new Array(len*2);
  1642. for (out=0, i=0; i<len;) {
  1643. c = buf[i++];
  1644. // quick process ascii
  1645. if (c < 0x80) { utf16buf[out++] = c; continue; }
  1646. c_len = _utf8len[c];
  1647. // skip 5 & 6 byte codes
  1648. if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
  1649. // apply mask on first byte
  1650. c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
  1651. // join the rest
  1652. while (c_len > 1 && i < len) {
  1653. c = (c << 6) | (buf[i++] & 0x3f);
  1654. c_len--;
  1655. }
  1656. // terminated by end of string?
  1657. if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
  1658. if (c < 0x10000) {
  1659. utf16buf[out++] = c;
  1660. } else {
  1661. c -= 0x10000;
  1662. utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
  1663. utf16buf[out++] = 0xdc00 | (c & 0x3ff);
  1664. }
  1665. }
  1666. // shrinkBuf(utf16buf, out)
  1667. if (utf16buf.length !== out) {
  1668. if(utf16buf.subarray) {
  1669. utf16buf = utf16buf.subarray(0, out);
  1670. } else {
  1671. utf16buf.length = out;
  1672. }
  1673. }
  1674. // return String.fromCharCode.apply(null, utf16buf);
  1675. return utils.applyFromCharCode(utf16buf);
  1676. };
  1677. // That's all for the pako functions.
  1678. /**
  1679. * Transform a javascript string into an array (typed if possible) of bytes,
  1680. * UTF-8 encoded.
  1681. * @param {String} str the string to encode
  1682. * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string.
  1683. */
  1684. exports.utf8encode = function utf8encode(str) {
  1685. if (support.nodebuffer) {
  1686. return nodeBuffer(str, "utf-8");
  1687. }
  1688. return string2buf(str);
  1689. };
  1690. /**
  1691. * Transform a bytes array (or a representation) representing an UTF-8 encoded
  1692. * string into a javascript string.
  1693. * @param {Array|Uint8Array|Buffer} buf the data de decode
  1694. * @return {String} the decoded string.
  1695. */
  1696. exports.utf8decode = function utf8decode(buf) {
  1697. if (support.nodebuffer) {
  1698. return utils.transformTo("nodebuffer", buf).toString("utf-8");
  1699. }
  1700. buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
  1701. // return buf2string(buf);
  1702. // Chrome prefers to work with "small" chunks of data
  1703. // for the method buf2string.
  1704. // Firefox and Chrome has their own shortcut, IE doesn't seem to really care.
  1705. var result = [], k = 0, len = buf.length, chunk = 65536;
  1706. while (k < len) {
  1707. var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
  1708. if (support.uint8array) {
  1709. result.push(buf2string(buf.subarray(k, nextBoundary)));
  1710. } else {
  1711. result.push(buf2string(buf.slice(k, nextBoundary)));
  1712. }
  1713. k = nextBoundary;
  1714. }
  1715. return result.join("");
  1716. };
  1717. // vim: set shiftwidth=4 softtabstop=4:
  1718. },{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){
  1719. 'use strict';
  1720. var support = _dereq_('./support');
  1721. var compressions = _dereq_('./compressions');
  1722. var nodeBuffer = _dereq_('./nodeBuffer');
  1723. /**
  1724. * Convert a string to a "binary string" : a string containing only char codes between 0 and 255.
  1725. * @param {string} str the string to transform.
  1726. * @return {String} the binary string.
  1727. */
  1728. exports.string2binary = function(str) {
  1729. var result = "";
  1730. for (var i = 0; i < str.length; i++) {
  1731. result += String.fromCharCode(str.charCodeAt(i) & 0xff);
  1732. }
  1733. return result;
  1734. };
  1735. exports.arrayBuffer2Blob = function(buffer, mimeType) {
  1736. exports.checkSupport("blob");
  1737. mimeType = mimeType || 'application/zip';
  1738. try {
  1739. // Blob constructor
  1740. return new Blob([buffer], {
  1741. type: mimeType
  1742. });
  1743. }
  1744. catch (e) {
  1745. try {
  1746. // deprecated, browser only, old way
  1747. var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
  1748. var builder = new Builder();
  1749. builder.append(buffer);
  1750. return builder.getBlob(mimeType);
  1751. }
  1752. catch (e) {
  1753. // well, fuck ?!
  1754. throw new Error("Bug : can't construct the Blob.");
  1755. }
  1756. }
  1757. };
  1758. /**
  1759. * The identity function.
  1760. * @param {Object} input the input.
  1761. * @return {Object} the same input.
  1762. */
  1763. function identity(input) {
  1764. return input;
  1765. }
  1766. /**
  1767. * Fill in an array with a string.
  1768. * @param {String} str the string to use.
  1769. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).
  1770. * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.
  1771. */
  1772. function stringToArrayLike(str, array) {
  1773. for (var i = 0; i < str.length; ++i) {
  1774. array[i] = str.charCodeAt(i) & 0xFF;
  1775. }
  1776. return array;
  1777. }
  1778. /**
  1779. * Transform an array-like object to a string.
  1780. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.
  1781. * @return {String} the result.
  1782. */
  1783. function arrayLikeToString(array) {
  1784. // Performances notes :
  1785. // --------------------
  1786. // String.fromCharCode.apply(null, array) is the fastest, see
  1787. // see http://jsperf.com/converting-a-uint8array-to-a-string/2
  1788. // but the stack is limited (and we can get huge arrays !).
  1789. //
  1790. // result += String.fromCharCode(array[i]); generate too many strings !
  1791. //
  1792. // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2
  1793. var chunk = 65536;
  1794. var result = [],
  1795. len = array.length,
  1796. type = exports.getTypeOf(array),
  1797. k = 0,
  1798. canUseApply = true;
  1799. try {
  1800. switch(type) {
  1801. case "uint8array":
  1802. String.fromCharCode.apply(null, new Uint8Array(0));
  1803. break;
  1804. case "nodebuffer":
  1805. String.fromCharCode.apply(null, nodeBuffer(0));
  1806. break;
  1807. }
  1808. } catch(e) {
  1809. canUseApply = false;
  1810. }
  1811. // no apply : slow and painful algorithm
  1812. // default browser on android 4.*
  1813. if (!canUseApply) {
  1814. var resultStr = "";
  1815. for(var i = 0; i < array.length;i++) {
  1816. resultStr += String.fromCharCode(array[i]);
  1817. }
  1818. return resultStr;
  1819. }
  1820. while (k < len && chunk > 1) {
  1821. try {
  1822. if (type === "array" || type === "nodebuffer") {
  1823. result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
  1824. }
  1825. else {
  1826. result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
  1827. }
  1828. k += chunk;
  1829. }
  1830. catch (e) {
  1831. chunk = Math.floor(chunk / 2);
  1832. }
  1833. }
  1834. return result.join("");
  1835. }
  1836. exports.applyFromCharCode = arrayLikeToString;
  1837. /**
  1838. * Copy the data from an array-like to an other array-like.
  1839. * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.
  1840. * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.
  1841. * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.
  1842. */
  1843. function arrayLikeToArrayLike(arrayFrom, arrayTo) {
  1844. for (var i = 0; i < arrayFrom.length; i++) {
  1845. arrayTo[i] = arrayFrom[i];
  1846. }
  1847. return arrayTo;
  1848. }
  1849. // a matrix containing functions to transform everything into everything.
  1850. var transform = {};
  1851. // string to ?
  1852. transform["string"] = {
  1853. "string": identity,
  1854. "array": function(input) {
  1855. return stringToArrayLike(input, new Array(input.length));
  1856. },
  1857. "arraybuffer": function(input) {
  1858. return transform["string"]["uint8array"](input).buffer;
  1859. },
  1860. "uint8array": function(input) {
  1861. return stringToArrayLike(input, new Uint8Array(input.length));
  1862. },
  1863. "nodebuffer": function(input) {
  1864. return stringToArrayLike(input, nodeBuffer(input.length));
  1865. }
  1866. };
  1867. // array to ?
  1868. transform["array"] = {
  1869. "string": arrayLikeToString,
  1870. "array": identity,
  1871. "arraybuffer": function(input) {
  1872. return (new Uint8Array(input)).buffer;
  1873. },
  1874. "uint8array": function(input) {
  1875. return new Uint8Array(input);
  1876. },
  1877. "nodebuffer": function(input) {
  1878. return nodeBuffer(input);
  1879. }
  1880. };
  1881. // arraybuffer to ?
  1882. transform["arraybuffer"] = {
  1883. "string": function(input) {
  1884. return arrayLikeToString(new Uint8Array(input));
  1885. },
  1886. "array": function(input) {
  1887. return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
  1888. },
  1889. "arraybuffer": identity,
  1890. "uint8array": function(input) {
  1891. return new Uint8Array(input);
  1892. },
  1893. "nodebuffer": function(input) {
  1894. return nodeBuffer(new Uint8Array(input));
  1895. }
  1896. };
  1897. // uint8array to ?
  1898. transform["uint8array"] = {
  1899. "string": arrayLikeToString,
  1900. "array": function(input) {
  1901. return arrayLikeToArrayLike(input, new Array(input.length));
  1902. },
  1903. "arraybuffer": function(input) {
  1904. return input.buffer;
  1905. },
  1906. "uint8array": identity,
  1907. "nodebuffer": function(input) {
  1908. return nodeBuffer(input);
  1909. }
  1910. };
  1911. // nodebuffer to ?
  1912. transform["nodebuffer"] = {
  1913. "string": arrayLikeToString,
  1914. "array": function(input) {
  1915. return arrayLikeToArrayLike(input, new Array(input.length));
  1916. },
  1917. "arraybuffer": function(input) {
  1918. return transform["nodebuffer"]["uint8array"](input).buffer;
  1919. },
  1920. "uint8array": function(input) {
  1921. return arrayLikeToArrayLike(input, new Uint8Array(input.length));
  1922. },
  1923. "nodebuffer": identity
  1924. };
  1925. /**
  1926. * Transform an input into any type.
  1927. * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.
  1928. * If no output type is specified, the unmodified input will be returned.
  1929. * @param {String} outputType the output type.
  1930. * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.
  1931. * @throws {Error} an Error if the browser doesn't support the requested output type.
  1932. */
  1933. exports.transformTo = function(outputType, input) {
  1934. if (!input) {
  1935. // undefined, null, etc
  1936. // an empty string won't harm.
  1937. input = "";
  1938. }
  1939. if (!outputType) {
  1940. return input;
  1941. }
  1942. exports.checkSupport(outputType);
  1943. var inputType = exports.getTypeOf(input);
  1944. var result = transform[inputType][outputType](input);
  1945. return result;
  1946. };
  1947. /**
  1948. * Return the type of the input.
  1949. * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.
  1950. * @param {Object} input the input to identify.
  1951. * @return {String} the (lowercase) type of the input.
  1952. */
  1953. exports.getTypeOf = function(input) {
  1954. if (typeof input === "string") {
  1955. return "string";
  1956. }
  1957. if (Object.prototype.toString.call(input) === "[object Array]") {
  1958. return "array";
  1959. }
  1960. if (support.nodebuffer && nodeBuffer.test(input)) {
  1961. return "nodebuffer";
  1962. }
  1963. if (support.uint8array && input instanceof Uint8Array) {
  1964. return "uint8array";
  1965. }
  1966. if (support.arraybuffer && input instanceof ArrayBuffer) {
  1967. return "arraybuffer";
  1968. }
  1969. };
  1970. /**
  1971. * Throw an exception if the type is not supported.
  1972. * @param {String} type the type to check.
  1973. * @throws {Error} an Error if the browser doesn't support the requested type.
  1974. */
  1975. exports.checkSupport = function(type) {
  1976. var supported = support[type.toLowerCase()];
  1977. if (!supported) {
  1978. throw new Error(type + " is not supported by this browser");
  1979. }
  1980. };
  1981. exports.MAX_VALUE_16BITS = 65535;
  1982. exports.MAX_VALUE_32BITS = -1; // well, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" is parsed as -1
  1983. /**
  1984. * Prettify a string read as binary.
  1985. * @param {string} str the string to prettify.
  1986. * @return {string} a pretty string.
  1987. */
  1988. exports.pretty = function(str) {
  1989. var res = '',
  1990. code, i;
  1991. for (i = 0; i < (str || "").length; i++) {
  1992. code = str.charCodeAt(i);
  1993. res += '\\x' + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
  1994. }
  1995. return res;
  1996. };
  1997. /**
  1998. * Find a compression registered in JSZip.
  1999. * @param {string} compressionMethod the method magic to find.
  2000. * @return {Object|null} the JSZip compression object, null if none found.
  2001. */
  2002. exports.findCompression = function(compressionMethod) {
  2003. for (var method in compressions) {
  2004. if (!compressions.hasOwnProperty(method)) {
  2005. continue;
  2006. }
  2007. if (compressions[method].magic === compressionMethod) {
  2008. return compressions[method];
  2009. }
  2010. }
  2011. return null;
  2012. };
  2013. /**
  2014. * Cross-window, cross-Node-context regular expression detection
  2015. * @param {Object} object Anything
  2016. * @return {Boolean} true if the object is a regular expression,
  2017. * false otherwise
  2018. */
  2019. exports.isRegExp = function (object) {
  2020. return Object.prototype.toString.call(object) === "[object RegExp]";
  2021. };
  2022. },{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){
  2023. 'use strict';
  2024. var StringReader = _dereq_('./stringReader');
  2025. var NodeBufferReader = _dereq_('./nodeBufferReader');
  2026. var Uint8ArrayReader = _dereq_('./uint8ArrayReader');
  2027. var utils = _dereq_('./utils');
  2028. var sig = _dereq_('./signature');
  2029. var ZipEntry = _dereq_('./zipEntry');
  2030. var support = _dereq_('./support');
  2031. var jszipProto = _dereq_('./object');
  2032. // class ZipEntries {{{
  2033. /**
  2034. * All the entries in the zip file.
  2035. * @constructor
  2036. * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load.
  2037. * @param {Object} loadOptions Options for loading the stream.
  2038. */
  2039. function ZipEntries(data, loadOptions) {
  2040. this.files = [];
  2041. this.loadOptions = loadOptions;
  2042. if (data) {
  2043. this.load(data);
  2044. }
  2045. }
  2046. ZipEntries.prototype = {
  2047. /**
  2048. * Check that the reader is on the speficied signature.
  2049. * @param {string} expectedSignature the expected signature.
  2050. * @throws {Error} if it is an other signature.
  2051. */
  2052. checkSignature: function(expectedSignature) {
  2053. var signature = this.reader.readString(4);
  2054. if (signature !== expectedSignature) {
  2055. throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
  2056. }
  2057. },
  2058. /**
  2059. * Read the end of the central directory.
  2060. */
  2061. readBlockEndOfCentral: function() {
  2062. this.diskNumber = this.reader.readInt(2);
  2063. this.diskWithCentralDirStart = this.reader.readInt(2);
  2064. this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
  2065. this.centralDirRecords = this.reader.readInt(2);
  2066. this.centralDirSize = this.reader.readInt(4);
  2067. this.centralDirOffset = this.reader.readInt(4);
  2068. this.zipCommentLength = this.reader.readInt(2);
  2069. // warning : the encoding depends of the system locale
  2070. // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded.
  2071. // On a windows machine, this field is encoded with the localized windows code page.
  2072. this.zipComment = this.reader.readString(this.zipCommentLength);
  2073. // To get consistent behavior with the generation part, we will assume that
  2074. // this is utf8 encoded.
  2075. this.zipComment = jszipProto.utf8decode(this.zipComment);
  2076. },
  2077. /**
  2078. * Read the end of the Zip 64 central directory.
  2079. * Not merged with the method readEndOfCentral :
  2080. * The end of central can coexist with its Zip64 brother,
  2081. * I don't want to read the wrong number of bytes !
  2082. */
  2083. readBlockZip64EndOfCentral: function() {
  2084. this.zip64EndOfCentralSize = this.reader.readInt(8);
  2085. this.versionMadeBy = this.reader.readString(2);
  2086. this.versionNeeded = this.reader.readInt(2);
  2087. this.diskNumber = this.reader.readInt(4);
  2088. this.diskWithCentralDirStart = this.reader.readInt(4);
  2089. this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
  2090. this.centralDirRecords = this.reader.readInt(8);
  2091. this.centralDirSize = this.reader.readInt(8);
  2092. this.centralDirOffset = this.reader.readInt(8);
  2093. this.zip64ExtensibleData = {};
  2094. var extraDataSize = this.zip64EndOfCentralSize - 44,
  2095. index = 0,
  2096. extraFieldId,
  2097. extraFieldLength,
  2098. extraFieldValue;
  2099. while (index < extraDataSize) {
  2100. extraFieldId = this.reader.readInt(2);
  2101. extraFieldLength = this.reader.readInt(4);
  2102. extraFieldValue = this.reader.readString(extraFieldLength);
  2103. this.zip64ExtensibleData[extraFieldId] = {
  2104. id: extraFieldId,
  2105. length: extraFieldLength,
  2106. value: extraFieldValue
  2107. };
  2108. }
  2109. },
  2110. /**
  2111. * Read the end of the Zip 64 central directory locator.
  2112. */
  2113. readBlockZip64EndOfCentralLocator: function() {
  2114. this.diskWithZip64CentralDirStart = this.reader.readInt(4);
  2115. this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
  2116. this.disksCount = this.reader.readInt(4);
  2117. if (this.disksCount > 1) {
  2118. throw new Error("Multi-volumes zip are not supported");
  2119. }
  2120. },
  2121. /**
  2122. * Read the local files, based on the offset read in the central part.
  2123. */
  2124. readLocalFiles: function() {
  2125. var i, file;
  2126. for (i = 0; i < this.files.length; i++) {
  2127. file = this.files[i];
  2128. this.reader.setIndex(file.localHeaderOffset);
  2129. this.checkSignature(sig.LOCAL_FILE_HEADER);
  2130. file.readLocalPart(this.reader);
  2131. file.handleUTF8();
  2132. file.processAttributes();
  2133. }
  2134. },
  2135. /**
  2136. * Read the central directory.
  2137. */
  2138. readCentralDir: function() {
  2139. var file;
  2140. this.reader.setIndex(this.centralDirOffset);
  2141. while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
  2142. file = new ZipEntry({
  2143. zip64: this.zip64
  2144. }, this.loadOptions);
  2145. file.readCentralPart(this.reader);
  2146. this.files.push(file);
  2147. }
  2148. },
  2149. /**
  2150. * Read the end of central directory.
  2151. */
  2152. readEndOfCentral: function() {
  2153. var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
  2154. if (offset === -1) {
  2155. // Check if the content is a truncated zip or complete garbage.
  2156. // A "LOCAL_FILE_HEADER" is not required at the beginning (auto
  2157. // extractible zip for example) but it can give a good hint.
  2158. // If an ajax request was used without responseType, we will also
  2159. // get unreadable data.
  2160. var isGarbage = true;
  2161. try {
  2162. this.reader.setIndex(0);
  2163. this.checkSignature(sig.LOCAL_FILE_HEADER);
  2164. isGarbage = false;
  2165. } catch (e) {}
  2166. if (isGarbage) {
  2167. throw new Error("Can't find end of central directory : is this a zip file ? " +
  2168. "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html");
  2169. } else {
  2170. throw new Error("Corrupted zip : can't find end of central directory");
  2171. }
  2172. }
  2173. this.reader.setIndex(offset);
  2174. this.checkSignature(sig.CENTRAL_DIRECTORY_END);
  2175. this.readBlockEndOfCentral();
  2176. /* extract from the zip spec :
  2177. 4) If one of the fields in the end of central directory
  2178. record is too small to hold required data, the field
  2179. should be set to -1 (0xFFFF or 0xFFFFFFFF) and the
  2180. ZIP64 format record should be created.
  2181. 5) The end of central directory record and the
  2182. Zip64 end of central directory locator record must
  2183. reside on the same disk when splitting or spanning
  2184. an archive.
  2185. */
  2186. if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
  2187. this.zip64 = true;
  2188. /*
  2189. Warning : the zip64 extension is supported, but ONLY if the 64bits integer read from
  2190. the zip file can fit into a 32bits integer. This cannot be solved : Javascript represents
  2191. all numbers as 64-bit double precision IEEE 754 floating point numbers.
  2192. So, we have 53bits for integers and bitwise operations treat everything as 32bits.
  2193. see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators
  2194. and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf section 8.5
  2195. */
  2196. // should look for a zip64 EOCD locator
  2197. offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
  2198. if (offset === -1) {
  2199. throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
  2200. }
  2201. this.reader.setIndex(offset);
  2202. this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
  2203. this.readBlockZip64EndOfCentralLocator();
  2204. // now the zip64 EOCD record
  2205. this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
  2206. this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
  2207. this.readBlockZip64EndOfCentral();
  2208. }
  2209. },
  2210. prepareReader: function(data) {
  2211. var type = utils.getTypeOf(data);
  2212. if (type === "string" && !support.uint8array) {
  2213. this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
  2214. }
  2215. else if (type === "nodebuffer") {
  2216. this.reader = new NodeBufferReader(data);
  2217. }
  2218. else {
  2219. this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
  2220. }
  2221. },
  2222. /**
  2223. * Read a zip file and create ZipEntries.
  2224. * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
  2225. */
  2226. load: function(data) {
  2227. this.prepareReader(data);
  2228. this.readEndOfCentral();
  2229. this.readCentralDir();
  2230. this.readLocalFiles();
  2231. }
  2232. };
  2233. // }}} end of ZipEntries
  2234. module.exports = ZipEntries;
  2235. },{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){
  2236. 'use strict';
  2237. var StringReader = _dereq_('./stringReader');
  2238. var utils = _dereq_('./utils');
  2239. var CompressedObject = _dereq_('./compressedObject');
  2240. var jszipProto = _dereq_('./object');
  2241. var MADE_BY_DOS = 0x00;
  2242. var MADE_BY_UNIX = 0x03;
  2243. // class ZipEntry {{{
  2244. /**
  2245. * An entry in the zip file.
  2246. * @constructor
  2247. * @param {Object} options Options of the current file.
  2248. * @param {Object} loadOptions Options for loading the stream.
  2249. */
  2250. function ZipEntry(options, loadOptions) {
  2251. this.options = options;
  2252. this.loadOptions = loadOptions;
  2253. }
  2254. ZipEntry.prototype = {
  2255. /**
  2256. * say if the file is encrypted.
  2257. * @return {boolean} true if the file is encrypted, false otherwise.
  2258. */
  2259. isEncrypted: function() {
  2260. // bit 1 is set
  2261. return (this.bitFlag & 0x0001) === 0x0001;
  2262. },
  2263. /**
  2264. * say if the file has utf-8 filename/comment.
  2265. * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
  2266. */
  2267. useUTF8: function() {
  2268. // bit 11 is set
  2269. return (this.bitFlag & 0x0800) === 0x0800;
  2270. },
  2271. /**
  2272. * Prepare the function used to generate the compressed content from this ZipFile.
  2273. * @param {DataReader} reader the reader to use.
  2274. * @param {number} from the offset from where we should read the data.
  2275. * @param {number} length the length of the data to read.
  2276. * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
  2277. */
  2278. prepareCompressedContent: function(reader, from, length) {
  2279. return function() {
  2280. var previousIndex = reader.index;
  2281. reader.setIndex(from);
  2282. var compressedFileData = reader.readData(length);
  2283. reader.setIndex(previousIndex);
  2284. return compressedFileData;
  2285. };
  2286. },
  2287. /**
  2288. * Prepare the function used to generate the uncompressed content from this ZipFile.
  2289. * @param {DataReader} reader the reader to use.
  2290. * @param {number} from the offset from where we should read the data.
  2291. * @param {number} length the length of the data to read.
  2292. * @param {JSZip.compression} compression the compression used on this file.
  2293. * @param {number} uncompressedSize the uncompressed size to expect.
  2294. * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
  2295. */
  2296. prepareContent: function(reader, from, length, compression, uncompressedSize) {
  2297. return function() {
  2298. var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
  2299. var uncompressedFileData = compression.uncompress(compressedFileData);
  2300. if (uncompressedFileData.length !== uncompressedSize) {
  2301. throw new Error("Bug : uncompressed data size mismatch");
  2302. }
  2303. return uncompressedFileData;
  2304. };
  2305. },
  2306. /**
  2307. * Read the local part of a zip file and add the info in this object.
  2308. * @param {DataReader} reader the reader to use.
  2309. */
  2310. readLocalPart: function(reader) {
  2311. var compression, localExtraFieldsLength;
  2312. // we already know everything from the central dir !
  2313. // If the central dir data are false, we are doomed.
  2314. // On the bright side, the local part is scary : zip64, data descriptors, both, etc.
  2315. // The less data we get here, the more reliable this should be.
  2316. // Let's skip the whole header and dash to the data !
  2317. reader.skip(22);
  2318. // in some zip created on windows, the filename stored in the central dir contains \ instead of /.
  2319. // Strangely, the filename here is OK.
  2320. // I would love to treat these zip files as corrupted (see http://www.info-zip.org/FAQ.html#backslashes
  2321. // or APPNOTE#4.4.17.1, "All slashes MUST be forward slashes '/'") but there are a lot of bad zip generators...
  2322. // Search "unzip mismatching "local" filename continuing with "central" filename version" on
  2323. // the internet.
  2324. //
  2325. // I think I see the logic here : the central directory is used to display
  2326. // content and the local directory is used to extract the files. Mixing / and \
  2327. // may be used to display \ to windows users and use / when extracting the files.
  2328. // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394
  2329. this.fileNameLength = reader.readInt(2);
  2330. localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir
  2331. this.fileName = reader.readString(this.fileNameLength);
  2332. reader.skip(localExtraFieldsLength);
  2333. if (this.compressedSize == -1 || this.uncompressedSize == -1) {
  2334. throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize == -1 || uncompressedSize == -1)");
  2335. }
  2336. compression = utils.findCompression(this.compressionMethod);
  2337. if (compression === null) { // no compression found
  2338. throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
  2339. }
  2340. this.decompressed = new CompressedObject();
  2341. this.decompressed.compressedSize = this.compressedSize;
  2342. this.decompressed.uncompressedSize = this.uncompressedSize;
  2343. this.decompressed.crc32 = this.crc32;
  2344. this.decompressed.compressionMethod = this.compressionMethod;
  2345. this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
  2346. this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
  2347. // we need to compute the crc32...
  2348. if (this.loadOptions.checkCRC32) {
  2349. this.decompressed = utils.transformTo("string", this.decompressed.getContent());
  2350. if (jszipProto.crc32(this.decompressed) !== this.crc32) {
  2351. throw new Error("Corrupted zip : CRC32 mismatch");
  2352. }
  2353. }
  2354. },
  2355. /**
  2356. * Read the central part of a zip file and add the info in this object.
  2357. * @param {DataReader} reader the reader to use.
  2358. */
  2359. readCentralPart: function(reader) {
  2360. this.versionMadeBy = reader.readInt(2);
  2361. this.versionNeeded = reader.readInt(2);
  2362. this.bitFlag = reader.readInt(2);
  2363. this.compressionMethod = reader.readString(2);
  2364. this.date = reader.readDate();
  2365. this.crc32 = reader.readInt(4);
  2366. this.compressedSize = reader.readInt(4);
  2367. this.uncompressedSize = reader.readInt(4);
  2368. this.fileNameLength = reader.readInt(2);
  2369. this.extraFieldsLength = reader.readInt(2);
  2370. this.fileCommentLength = reader.readInt(2);
  2371. this.diskNumberStart = reader.readInt(2);
  2372. this.internalFileAttributes = reader.readInt(2);
  2373. this.externalFileAttributes = reader.readInt(4);
  2374. this.localHeaderOffset = reader.readInt(4);
  2375. if (this.isEncrypted()) {
  2376. throw new Error("Encrypted zip are not supported");
  2377. }
  2378. this.fileName = reader.readString(this.fileNameLength);
  2379. this.readExtraFields(reader);
  2380. this.parseZIP64ExtraField(reader);
  2381. this.fileComment = reader.readString(this.fileCommentLength);
  2382. },
  2383. /**
  2384. * Parse the external file attributes and get the unix/dos permissions.
  2385. */
  2386. processAttributes: function () {
  2387. this.unixPermissions = null;
  2388. this.dosPermissions = null;
  2389. var madeBy = this.versionMadeBy >> 8;
  2390. // Check if we have the DOS directory flag set.
  2391. // We look for it in the DOS and UNIX permissions
  2392. // but some unknown platform could set it as a compatibility flag.
  2393. this.dir = this.externalFileAttributes & 0x0010 ? true : false;
  2394. if(madeBy === MADE_BY_DOS) {
  2395. // first 6 bits (0 to 5)
  2396. this.dosPermissions = this.externalFileAttributes & 0x3F;
  2397. }
  2398. if(madeBy === MADE_BY_UNIX) {
  2399. this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF;
  2400. // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8);
  2401. }
  2402. // fail safe : if the name ends with a / it probably means a folder
  2403. if (!this.dir && this.fileName.slice(-1) === '/') {
  2404. this.dir = true;
  2405. }
  2406. },
  2407. /**
  2408. * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
  2409. * @param {DataReader} reader the reader to use.
  2410. */
  2411. parseZIP64ExtraField: function(reader) {
  2412. if (!this.extraFields[0x0001]) {
  2413. return;
  2414. }
  2415. // should be something, preparing the extra reader
  2416. var extraReader = new StringReader(this.extraFields[0x0001].value);
  2417. // I really hope that these 64bits integer can fit in 32 bits integer, because js
  2418. // won't let us have more.
  2419. if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
  2420. this.uncompressedSize = extraReader.readInt(8);
  2421. }
  2422. if (this.compressedSize === utils.MAX_VALUE_32BITS) {
  2423. this.compressedSize = extraReader.readInt(8);
  2424. }
  2425. if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
  2426. this.localHeaderOffset = extraReader.readInt(8);
  2427. }
  2428. if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
  2429. this.diskNumberStart = extraReader.readInt(4);
  2430. }
  2431. },
  2432. /**
  2433. * Read the central part of a zip file and add the info in this object.
  2434. * @param {DataReader} reader the reader to use.
  2435. */
  2436. readExtraFields: function(reader) {
  2437. var start = reader.index,
  2438. extraFieldId,
  2439. extraFieldLength,
  2440. extraFieldValue;
  2441. this.extraFields = this.extraFields || {};
  2442. while (reader.index < start + this.extraFieldsLength) {
  2443. extraFieldId = reader.readInt(2);
  2444. extraFieldLength = reader.readInt(2);
  2445. extraFieldValue = reader.readString(extraFieldLength);
  2446. this.extraFields[extraFieldId] = {
  2447. id: extraFieldId,
  2448. length: extraFieldLength,
  2449. value: extraFieldValue
  2450. };
  2451. }
  2452. },
  2453. /**
  2454. * Apply an UTF8 transformation if needed.
  2455. */
  2456. handleUTF8: function() {
  2457. if (this.useUTF8()) {
  2458. this.fileName = jszipProto.utf8decode(this.fileName);
  2459. this.fileComment = jszipProto.utf8decode(this.fileComment);
  2460. } else {
  2461. var upath = this.findExtraFieldUnicodePath();
  2462. if (upath !== null) {
  2463. this.fileName = upath;
  2464. }
  2465. var ucomment = this.findExtraFieldUnicodeComment();
  2466. if (ucomment !== null) {
  2467. this.fileComment = ucomment;
  2468. }
  2469. }
  2470. },
  2471. /**
  2472. * Find the unicode path declared in the extra field, if any.
  2473. * @return {String} the unicode path, null otherwise.
  2474. */
  2475. findExtraFieldUnicodePath: function() {
  2476. var upathField = this.extraFields[0x7075];
  2477. if (upathField) {
  2478. var extraReader = new StringReader(upathField.value);
  2479. // wrong version
  2480. if (extraReader.readInt(1) !== 1) {
  2481. return null;
  2482. }
  2483. // the crc of the filename changed, this field is out of date.
  2484. if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
  2485. return null;
  2486. }
  2487. return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
  2488. }
  2489. return null;
  2490. },
  2491. /**
  2492. * Find the unicode comment declared in the extra field, if any.
  2493. * @return {String} the unicode comment, null otherwise.
  2494. */
  2495. findExtraFieldUnicodeComment: function() {
  2496. var ucommentField = this.extraFields[0x6375];
  2497. if (ucommentField) {
  2498. var extraReader = new StringReader(ucommentField.value);
  2499. // wrong version
  2500. if (extraReader.readInt(1) !== 1) {
  2501. return null;
  2502. }
  2503. // the crc of the comment changed, this field is out of date.
  2504. if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
  2505. return null;
  2506. }
  2507. return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
  2508. }
  2509. return null;
  2510. }
  2511. };
  2512. module.exports = ZipEntry;
  2513. },{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){
  2514. // Top level file is just a mixin of submodules & constants
  2515. 'use strict';
  2516. var assign = _dereq_('./lib/utils/common').assign;
  2517. var deflate = _dereq_('./lib/deflate');
  2518. var inflate = _dereq_('./lib/inflate');
  2519. var constants = _dereq_('./lib/zlib/constants');
  2520. var pako = {};
  2521. assign(pako, deflate, inflate, constants);
  2522. module.exports = pako;
  2523. },{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){
  2524. 'use strict';
  2525. var zlib_deflate = _dereq_('./zlib/deflate.js');
  2526. var utils = _dereq_('./utils/common');
  2527. var strings = _dereq_('./utils/strings');
  2528. var msg = _dereq_('./zlib/messages');
  2529. var zstream = _dereq_('./zlib/zstream');
  2530. /* Public constants ==========================================================*/
  2531. /* ===========================================================================*/
  2532. var Z_NO_FLUSH = 0;
  2533. var Z_FINISH = 4;
  2534. var Z_OK = 0;
  2535. var Z_STREAM_END = 1;
  2536. var Z_DEFAULT_COMPRESSION = -1;
  2537. var Z_DEFAULT_STRATEGY = 0;
  2538. var Z_DEFLATED = 8;
  2539. /* ===========================================================================*/
  2540. /**
  2541. * class Deflate
  2542. *
  2543. * Generic JS-style wrapper for zlib calls. If you don't need
  2544. * streaming behaviour - use more simple functions: [[deflate]],
  2545. * [[deflateRaw]] and [[gzip]].
  2546. **/
  2547. /* internal
  2548. * Deflate.chunks -> Array
  2549. *
  2550. * Chunks of output data, if [[Deflate#onData]] not overriden.
  2551. **/
  2552. /**
  2553. * Deflate.result -> Uint8Array|Array
  2554. *
  2555. * Compressed result, generated by default [[Deflate#onData]]
  2556. * and [[Deflate#onEnd]] handlers. Filled after you push last chunk
  2557. * (call [[Deflate#push]] with `Z_FINISH` / `true` param).
  2558. **/
  2559. /**
  2560. * Deflate.err -> Number
  2561. *
  2562. * Error code after deflate finished. 0 (Z_OK) on success.
  2563. * You will not need it in real life, because deflate errors
  2564. * are possible only on wrong options or bad `onData` / `onEnd`
  2565. * custom handlers.
  2566. **/
  2567. /**
  2568. * Deflate.msg -> String
  2569. *
  2570. * Error message, if [[Deflate.err]] != 0
  2571. **/
  2572. /**
  2573. * new Deflate(options)
  2574. * - options (Object): zlib deflate options.
  2575. *
  2576. * Creates new deflator instance with specified params. Throws exception
  2577. * on bad params. Supported options:
  2578. *
  2579. * - `level`
  2580. * - `windowBits`
  2581. * - `memLevel`
  2582. * - `strategy`
  2583. *
  2584. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  2585. * for more information on these.
  2586. *
  2587. * Additional options, for internal needs:
  2588. *
  2589. * - `chunkSize` - size of generated data chunks (16K by default)
  2590. * - `raw` (Boolean) - do raw deflate
  2591. * - `gzip` (Boolean) - create gzip wrapper
  2592. * - `to` (String) - if equal to 'string', then result will be "binary string"
  2593. * (each char code [0..255])
  2594. * - `header` (Object) - custom header for gzip
  2595. * - `text` (Boolean) - true if compressed data believed to be text
  2596. * - `time` (Number) - modification time, unix timestamp
  2597. * - `os` (Number) - operation system code
  2598. * - `extra` (Array) - array of bytes with extra data (max 65536)
  2599. * - `name` (String) - file name (binary string)
  2600. * - `comment` (String) - comment (binary string)
  2601. * - `hcrc` (Boolean) - true if header crc should be added
  2602. *
  2603. * ##### Example:
  2604. *
  2605. * ```javascript
  2606. * var pako = require('pako')
  2607. * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
  2608. * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
  2609. *
  2610. * var deflate = new pako.Deflate({ level: 3});
  2611. *
  2612. * deflate.push(chunk1, false);
  2613. * deflate.push(chunk2, true); // true -> last chunk
  2614. *
  2615. * if (deflate.err) { throw new Error(deflate.err); }
  2616. *
  2617. * console.log(deflate.result);
  2618. * ```
  2619. **/
  2620. var Deflate = function(options) {
  2621. this.options = utils.assign({
  2622. level: Z_DEFAULT_COMPRESSION,
  2623. method: Z_DEFLATED,
  2624. chunkSize: 16384,
  2625. windowBits: 15,
  2626. memLevel: 8,
  2627. strategy: Z_DEFAULT_STRATEGY,
  2628. to: ''
  2629. }, options || {});
  2630. var opt = this.options;
  2631. if (opt.raw && (opt.windowBits > 0)) {
  2632. opt.windowBits = -opt.windowBits;
  2633. }
  2634. else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {
  2635. opt.windowBits += 16;
  2636. }
  2637. this.err = 0; // error code, if happens (0 = Z_OK)
  2638. this.msg = ''; // error message
  2639. this.ended = false; // used to avoid multiple onEnd() calls
  2640. this.chunks = []; // chunks of compressed data
  2641. this.strm = new zstream();
  2642. this.strm.avail_out = 0;
  2643. var status = zlib_deflate.deflateInit2(
  2644. this.strm,
  2645. opt.level,
  2646. opt.method,
  2647. opt.windowBits,
  2648. opt.memLevel,
  2649. opt.strategy
  2650. );
  2651. if (status !== Z_OK) {
  2652. throw new Error(msg[status]);
  2653. }
  2654. if (opt.header) {
  2655. zlib_deflate.deflateSetHeader(this.strm, opt.header);
  2656. }
  2657. };
  2658. /**
  2659. * Deflate#push(data[, mode]) -> Boolean
  2660. * - data (Uint8Array|Array|String): input data. Strings will be converted to
  2661. * utf8 byte sequence.
  2662. * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
  2663. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
  2664. *
  2665. * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with
  2666. * new compressed chunks. Returns `true` on success. The last data block must have
  2667. * mode Z_FINISH (or `true`). That flush internal pending buffers and call
  2668. * [[Deflate#onEnd]].
  2669. *
  2670. * On fail call [[Deflate#onEnd]] with error code and return false.
  2671. *
  2672. * We strongly recommend to use `Uint8Array` on input for best speed (output
  2673. * array format is detected automatically). Also, don't skip last param and always
  2674. * use the same type in your code (boolean or number). That will improve JS speed.
  2675. *
  2676. * For regular `Array`-s make sure all elements are [0..255].
  2677. *
  2678. * ##### Example
  2679. *
  2680. * ```javascript
  2681. * push(chunk, false); // push one of data chunks
  2682. * ...
  2683. * push(chunk, true); // push last chunk
  2684. * ```
  2685. **/
  2686. Deflate.prototype.push = function(data, mode) {
  2687. var strm = this.strm;
  2688. var chunkSize = this.options.chunkSize;
  2689. var status, _mode;
  2690. if (this.ended) { return false; }
  2691. _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);
  2692. // Convert data if needed
  2693. if (typeof data === 'string') {
  2694. // If we need to compress text, change encoding to utf8.
  2695. strm.input = strings.string2buf(data);
  2696. } else {
  2697. strm.input = data;
  2698. }
  2699. strm.next_in = 0;
  2700. strm.avail_in = strm.input.length;
  2701. do {
  2702. if (strm.avail_out === 0) {
  2703. strm.output = new utils.Buf8(chunkSize);
  2704. strm.next_out = 0;
  2705. strm.avail_out = chunkSize;
  2706. }
  2707. status = zlib_deflate.deflate(strm, _mode); /* no bad return value */
  2708. if (status !== Z_STREAM_END && status !== Z_OK) {
  2709. this.onEnd(status);
  2710. this.ended = true;
  2711. return false;
  2712. }
  2713. if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) {
  2714. if (this.options.to === 'string') {
  2715. this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
  2716. } else {
  2717. this.onData(utils.shrinkBuf(strm.output, strm.next_out));
  2718. }
  2719. }
  2720. } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
  2721. // Finalize on the last chunk.
  2722. if (_mode === Z_FINISH) {
  2723. status = zlib_deflate.deflateEnd(this.strm);
  2724. this.onEnd(status);
  2725. this.ended = true;
  2726. return status === Z_OK;
  2727. }
  2728. return true;
  2729. };
  2730. /**
  2731. * Deflate#onData(chunk) -> Void
  2732. * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
  2733. * on js engine support. When string output requested, each chunk
  2734. * will be string.
  2735. *
  2736. * By default, stores data blocks in `chunks[]` property and glue
  2737. * those in `onEnd`. Override this handler, if you need another behaviour.
  2738. **/
  2739. Deflate.prototype.onData = function(chunk) {
  2740. this.chunks.push(chunk);
  2741. };
  2742. /**
  2743. * Deflate#onEnd(status) -> Void
  2744. * - status (Number): deflate status. 0 (Z_OK) on success,
  2745. * other if not.
  2746. *
  2747. * Called once after you tell deflate that input stream complete
  2748. * or error happenned. By default - join collected chunks,
  2749. * free memory and fill `results` / `err` properties.
  2750. **/
  2751. Deflate.prototype.onEnd = function(status) {
  2752. // On success - join
  2753. if (status === Z_OK) {
  2754. if (this.options.to === 'string') {
  2755. this.result = this.chunks.join('');
  2756. } else {
  2757. this.result = utils.flattenChunks(this.chunks);
  2758. }
  2759. }
  2760. this.chunks = [];
  2761. this.err = status;
  2762. this.msg = this.strm.msg;
  2763. };
  2764. /**
  2765. * deflate(data[, options]) -> Uint8Array|Array|String
  2766. * - data (Uint8Array|Array|String): input data to compress.
  2767. * - options (Object): zlib deflate options.
  2768. *
  2769. * Compress `data` with deflate alrorythm and `options`.
  2770. *
  2771. * Supported options are:
  2772. *
  2773. * - level
  2774. * - windowBits
  2775. * - memLevel
  2776. * - strategy
  2777. *
  2778. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  2779. * for more information on these.
  2780. *
  2781. * Sugar (options):
  2782. *
  2783. * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
  2784. * negative windowBits implicitly.
  2785. * - `to` (String) - if equal to 'string', then result will be "binary string"
  2786. * (each char code [0..255])
  2787. *
  2788. * ##### Example:
  2789. *
  2790. * ```javascript
  2791. * var pako = require('pako')
  2792. * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);
  2793. *
  2794. * console.log(pako.deflate(data));
  2795. * ```
  2796. **/
  2797. function deflate(input, options) {
  2798. var deflator = new Deflate(options);
  2799. deflator.push(input, true);
  2800. // That will never happens, if you don't cheat with options :)
  2801. if (deflator.err) { throw deflator.msg; }
  2802. return deflator.result;
  2803. }
  2804. /**
  2805. * deflateRaw(data[, options]) -> Uint8Array|Array|String
  2806. * - data (Uint8Array|Array|String): input data to compress.
  2807. * - options (Object): zlib deflate options.
  2808. *
  2809. * The same as [[deflate]], but creates raw data, without wrapper
  2810. * (header and adler32 crc).
  2811. **/
  2812. function deflateRaw(input, options) {
  2813. options = options || {};
  2814. options.raw = true;
  2815. return deflate(input, options);
  2816. }
  2817. /**
  2818. * gzip(data[, options]) -> Uint8Array|Array|String
  2819. * - data (Uint8Array|Array|String): input data to compress.
  2820. * - options (Object): zlib deflate options.
  2821. *
  2822. * The same as [[deflate]], but create gzip wrapper instead of
  2823. * deflate one.
  2824. **/
  2825. function gzip(input, options) {
  2826. options = options || {};
  2827. options.gzip = true;
  2828. return deflate(input, options);
  2829. }
  2830. exports.Deflate = Deflate;
  2831. exports.deflate = deflate;
  2832. exports.deflateRaw = deflateRaw;
  2833. exports.gzip = gzip;
  2834. },{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){
  2835. 'use strict';
  2836. var zlib_inflate = _dereq_('./zlib/inflate.js');
  2837. var utils = _dereq_('./utils/common');
  2838. var strings = _dereq_('./utils/strings');
  2839. var c = _dereq_('./zlib/constants');
  2840. var msg = _dereq_('./zlib/messages');
  2841. var zstream = _dereq_('./zlib/zstream');
  2842. var gzheader = _dereq_('./zlib/gzheader');
  2843. /**
  2844. * class Inflate
  2845. *
  2846. * Generic JS-style wrapper for zlib calls. If you don't need
  2847. * streaming behaviour - use more simple functions: [[inflate]]
  2848. * and [[inflateRaw]].
  2849. **/
  2850. /* internal
  2851. * inflate.chunks -> Array
  2852. *
  2853. * Chunks of output data, if [[Inflate#onData]] not overriden.
  2854. **/
  2855. /**
  2856. * Inflate.result -> Uint8Array|Array|String
  2857. *
  2858. * Uncompressed result, generated by default [[Inflate#onData]]
  2859. * and [[Inflate#onEnd]] handlers. Filled after you push last chunk
  2860. * (call [[Inflate#push]] with `Z_FINISH` / `true` param).
  2861. **/
  2862. /**
  2863. * Inflate.err -> Number
  2864. *
  2865. * Error code after inflate finished. 0 (Z_OK) on success.
  2866. * Should be checked if broken data possible.
  2867. **/
  2868. /**
  2869. * Inflate.msg -> String
  2870. *
  2871. * Error message, if [[Inflate.err]] != 0
  2872. **/
  2873. /**
  2874. * new Inflate(options)
  2875. * - options (Object): zlib inflate options.
  2876. *
  2877. * Creates new inflator instance with specified params. Throws exception
  2878. * on bad params. Supported options:
  2879. *
  2880. * - `windowBits`
  2881. *
  2882. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  2883. * for more information on these.
  2884. *
  2885. * Additional options, for internal needs:
  2886. *
  2887. * - `chunkSize` - size of generated data chunks (16K by default)
  2888. * - `raw` (Boolean) - do raw inflate
  2889. * - `to` (String) - if equal to 'string', then result will be converted
  2890. * from utf8 to utf16 (javascript) string. When string output requested,
  2891. * chunk length can differ from `chunkSize`, depending on content.
  2892. *
  2893. * By default, when no options set, autodetect deflate/gzip data format via
  2894. * wrapper header.
  2895. *
  2896. * ##### Example:
  2897. *
  2898. * ```javascript
  2899. * var pako = require('pako')
  2900. * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])
  2901. * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);
  2902. *
  2903. * var inflate = new pako.Inflate({ level: 3});
  2904. *
  2905. * inflate.push(chunk1, false);
  2906. * inflate.push(chunk2, true); // true -> last chunk
  2907. *
  2908. * if (inflate.err) { throw new Error(inflate.err); }
  2909. *
  2910. * console.log(inflate.result);
  2911. * ```
  2912. **/
  2913. var Inflate = function(options) {
  2914. this.options = utils.assign({
  2915. chunkSize: 16384,
  2916. windowBits: 0,
  2917. to: ''
  2918. }, options || {});
  2919. var opt = this.options;
  2920. // Force window size for `raw` data, if not set directly,
  2921. // because we have no header for autodetect.
  2922. if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {
  2923. opt.windowBits = -opt.windowBits;
  2924. if (opt.windowBits === 0) { opt.windowBits = -15; }
  2925. }
  2926. // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate
  2927. if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&
  2928. !(options && options.windowBits)) {
  2929. opt.windowBits += 32;
  2930. }
  2931. // Gzip header has no info about windows size, we can do autodetect only
  2932. // for deflate. So, if window size not set, force it to max when gzip possible
  2933. if ((opt.windowBits > 15) && (opt.windowBits < 48)) {
  2934. // bit 3 (16) -> gzipped data
  2935. // bit 4 (32) -> autodetect gzip/deflate
  2936. if ((opt.windowBits & 15) === 0) {
  2937. opt.windowBits |= 15;
  2938. }
  2939. }
  2940. this.err = 0; // error code, if happens (0 = Z_OK)
  2941. this.msg = ''; // error message
  2942. this.ended = false; // used to avoid multiple onEnd() calls
  2943. this.chunks = []; // chunks of compressed data
  2944. this.strm = new zstream();
  2945. this.strm.avail_out = 0;
  2946. var status = zlib_inflate.inflateInit2(
  2947. this.strm,
  2948. opt.windowBits
  2949. );
  2950. if (status !== c.Z_OK) {
  2951. throw new Error(msg[status]);
  2952. }
  2953. this.header = new gzheader();
  2954. zlib_inflate.inflateGetHeader(this.strm, this.header);
  2955. };
  2956. /**
  2957. * Inflate#push(data[, mode]) -> Boolean
  2958. * - data (Uint8Array|Array|String): input data
  2959. * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.
  2960. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH.
  2961. *
  2962. * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with
  2963. * new output chunks. Returns `true` on success. The last data block must have
  2964. * mode Z_FINISH (or `true`). That flush internal pending buffers and call
  2965. * [[Inflate#onEnd]].
  2966. *
  2967. * On fail call [[Inflate#onEnd]] with error code and return false.
  2968. *
  2969. * We strongly recommend to use `Uint8Array` on input for best speed (output
  2970. * format is detected automatically). Also, don't skip last param and always
  2971. * use the same type in your code (boolean or number). That will improve JS speed.
  2972. *
  2973. * For regular `Array`-s make sure all elements are [0..255].
  2974. *
  2975. * ##### Example
  2976. *
  2977. * ```javascript
  2978. * push(chunk, false); // push one of data chunks
  2979. * ...
  2980. * push(chunk, true); // push last chunk
  2981. * ```
  2982. **/
  2983. Inflate.prototype.push = function(data, mode) {
  2984. var strm = this.strm;
  2985. var chunkSize = this.options.chunkSize;
  2986. var status, _mode;
  2987. var next_out_utf8, tail, utf8str;
  2988. if (this.ended) { return false; }
  2989. _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);
  2990. // Convert data if needed
  2991. if (typeof data === 'string') {
  2992. // Only binary strings can be decompressed on practice
  2993. strm.input = strings.binstring2buf(data);
  2994. } else {
  2995. strm.input = data;
  2996. }
  2997. strm.next_in = 0;
  2998. strm.avail_in = strm.input.length;
  2999. do {
  3000. if (strm.avail_out === 0) {
  3001. strm.output = new utils.Buf8(chunkSize);
  3002. strm.next_out = 0;
  3003. strm.avail_out = chunkSize;
  3004. }
  3005. status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */
  3006. if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
  3007. this.onEnd(status);
  3008. this.ended = true;
  3009. return false;
  3010. }
  3011. if (strm.next_out) {
  3012. if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) {
  3013. if (this.options.to === 'string') {
  3014. next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
  3015. tail = strm.next_out - next_out_utf8;
  3016. utf8str = strings.buf2string(strm.output, next_out_utf8);
  3017. // move tail
  3018. strm.next_out = tail;
  3019. strm.avail_out = chunkSize - tail;
  3020. if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }
  3021. this.onData(utf8str);
  3022. } else {
  3023. this.onData(utils.shrinkBuf(strm.output, strm.next_out));
  3024. }
  3025. }
  3026. }
  3027. } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END);
  3028. if (status === c.Z_STREAM_END) {
  3029. _mode = c.Z_FINISH;
  3030. }
  3031. // Finalize on the last chunk.
  3032. if (_mode === c.Z_FINISH) {
  3033. status = zlib_inflate.inflateEnd(this.strm);
  3034. this.onEnd(status);
  3035. this.ended = true;
  3036. return status === c.Z_OK;
  3037. }
  3038. return true;
  3039. };
  3040. /**
  3041. * Inflate#onData(chunk) -> Void
  3042. * - chunk (Uint8Array|Array|String): ouput data. Type of array depends
  3043. * on js engine support. When string output requested, each chunk
  3044. * will be string.
  3045. *
  3046. * By default, stores data blocks in `chunks[]` property and glue
  3047. * those in `onEnd`. Override this handler, if you need another behaviour.
  3048. **/
  3049. Inflate.prototype.onData = function(chunk) {
  3050. this.chunks.push(chunk);
  3051. };
  3052. /**
  3053. * Inflate#onEnd(status) -> Void
  3054. * - status (Number): inflate status. 0 (Z_OK) on success,
  3055. * other if not.
  3056. *
  3057. * Called once after you tell inflate that input stream complete
  3058. * or error happenned. By default - join collected chunks,
  3059. * free memory and fill `results` / `err` properties.
  3060. **/
  3061. Inflate.prototype.onEnd = function(status) {
  3062. // On success - join
  3063. if (status === c.Z_OK) {
  3064. if (this.options.to === 'string') {
  3065. // Glue & convert here, until we teach pako to send
  3066. // utf8 alligned strings to onData
  3067. this.result = this.chunks.join('');
  3068. } else {
  3069. this.result = utils.flattenChunks(this.chunks);
  3070. }
  3071. }
  3072. this.chunks = [];
  3073. this.err = status;
  3074. this.msg = this.strm.msg;
  3075. };
  3076. /**
  3077. * inflate(data[, options]) -> Uint8Array|Array|String
  3078. * - data (Uint8Array|Array|String): input data to decompress.
  3079. * - options (Object): zlib inflate options.
  3080. *
  3081. * Decompress `data` with inflate/ungzip and `options`. Autodetect
  3082. * format via wrapper header by default. That's why we don't provide
  3083. * separate `ungzip` method.
  3084. *
  3085. * Supported options are:
  3086. *
  3087. * - windowBits
  3088. *
  3089. * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
  3090. * for more information.
  3091. *
  3092. * Sugar (options):
  3093. *
  3094. * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify
  3095. * negative windowBits implicitly.
  3096. * - `to` (String) - if equal to 'string', then result will be converted
  3097. * from utf8 to utf16 (javascript) string. When string output requested,
  3098. * chunk length can differ from `chunkSize`, depending on content.
  3099. *
  3100. *
  3101. * ##### Example:
  3102. *
  3103. * ```javascript
  3104. * var pako = require('pako')
  3105. * , input = pako.deflate([1,2,3,4,5,6,7,8,9])
  3106. * , output;
  3107. *
  3108. * try {
  3109. * output = pako.inflate(input);
  3110. * } catch (err)
  3111. * console.log(err);
  3112. * }
  3113. * ```
  3114. **/
  3115. function inflate(input, options) {
  3116. var inflator = new Inflate(options);
  3117. inflator.push(input, true);
  3118. // That will never happens, if you don't cheat with options :)
  3119. if (inflator.err) { throw inflator.msg; }
  3120. return inflator.result;
  3121. }
  3122. /**
  3123. * inflateRaw(data[, options]) -> Uint8Array|Array|String
  3124. * - data (Uint8Array|Array|String): input data to decompress.
  3125. * - options (Object): zlib inflate options.
  3126. *
  3127. * The same as [[inflate]], but creates raw data, without wrapper
  3128. * (header and adler32 crc).
  3129. **/
  3130. function inflateRaw(input, options) {
  3131. options = options || {};
  3132. options.raw = true;
  3133. return inflate(input, options);
  3134. }
  3135. /**
  3136. * ungzip(data[, options]) -> Uint8Array|Array|String
  3137. * - data (Uint8Array|Array|String): input data to decompress.
  3138. * - options (Object): zlib inflate options.
  3139. *
  3140. * Just shortcut to [[inflate]], because it autodetects format
  3141. * by header.content. Done for convenience.
  3142. **/
  3143. exports.Inflate = Inflate;
  3144. exports.inflate = inflate;
  3145. exports.inflateRaw = inflateRaw;
  3146. exports.ungzip = inflate;
  3147. },{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){
  3148. 'use strict';
  3149. var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
  3150. (typeof Uint16Array !== 'undefined') &&
  3151. (typeof Int32Array !== 'undefined');
  3152. exports.assign = function (obj /*from1, from2, from3, ...*/) {
  3153. var sources = Array.prototype.slice.call(arguments, 1);
  3154. while (sources.length) {
  3155. var source = sources.shift();
  3156. if (!source) { continue; }
  3157. if (typeof(source) !== 'object') {
  3158. throw new TypeError(source + 'must be non-object');
  3159. }
  3160. for (var p in source) {
  3161. if (source.hasOwnProperty(p)) {
  3162. obj[p] = source[p];
  3163. }
  3164. }
  3165. }
  3166. return obj;
  3167. };
  3168. // reduce buffer size, avoiding mem copy
  3169. exports.shrinkBuf = function (buf, size) {
  3170. if (buf.length === size) { return buf; }
  3171. if (buf.subarray) { return buf.subarray(0, size); }
  3172. buf.length = size;
  3173. return buf;
  3174. };
  3175. var fnTyped = {
  3176. arraySet: function (dest, src, src_offs, len, dest_offs) {
  3177. if (src.subarray && dest.subarray) {
  3178. dest.set(src.subarray(src_offs, src_offs+len), dest_offs);
  3179. return;
  3180. }
  3181. // Fallback to ordinary array
  3182. for(var i=0; i<len; i++) {
  3183. dest[dest_offs + i] = src[src_offs + i];
  3184. }
  3185. },
  3186. // Join array of chunks to single array.
  3187. flattenChunks: function(chunks) {
  3188. var i, l, len, pos, chunk, result;
  3189. // calculate data length
  3190. len = 0;
  3191. for (i=0, l=chunks.length; i<l; i++) {
  3192. len += chunks[i].length;
  3193. }
  3194. // join chunks
  3195. result = new Uint8Array(len);
  3196. pos = 0;
  3197. for (i=0, l=chunks.length; i<l; i++) {
  3198. chunk = chunks[i];
  3199. result.set(chunk, pos);
  3200. pos += chunk.length;
  3201. }
  3202. return result;
  3203. }
  3204. };
  3205. var fnUntyped = {
  3206. arraySet: function (dest, src, src_offs, len, dest_offs) {
  3207. for(var i=0; i<len; i++) {
  3208. dest[dest_offs + i] = src[src_offs + i];
  3209. }
  3210. },
  3211. // Join array of chunks to single array.
  3212. flattenChunks: function(chunks) {
  3213. return [].concat.apply([], chunks);
  3214. }
  3215. };
  3216. // Enable/Disable typed arrays use, for testing
  3217. //
  3218. exports.setTyped = function (on) {
  3219. if (on) {
  3220. exports.Buf8 = Uint8Array;
  3221. exports.Buf16 = Uint16Array;
  3222. exports.Buf32 = Int32Array;
  3223. exports.assign(exports, fnTyped);
  3224. } else {
  3225. exports.Buf8 = Array;
  3226. exports.Buf16 = Array;
  3227. exports.Buf32 = Array;
  3228. exports.assign(exports, fnUntyped);
  3229. }
  3230. };
  3231. exports.setTyped(TYPED_OK);
  3232. },{}],28:[function(_dereq_,module,exports){
  3233. // String encode/decode helpers
  3234. 'use strict';
  3235. var utils = _dereq_('./common');
  3236. // Quick check if we can use fast array to bin string conversion
  3237. //
  3238. // - apply(Array) can fail on Android 2.2
  3239. // - apply(Uint8Array) can fail on iOS 5.1 Safary
  3240. //
  3241. var STR_APPLY_OK = true;
  3242. var STR_APPLY_UIA_OK = true;
  3243. try { String.fromCharCode.apply(null, [0]); } catch(__) { STR_APPLY_OK = false; }
  3244. try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch(__) { STR_APPLY_UIA_OK = false; }
  3245. // Table with utf8 lengths (calculated by first byte of sequence)
  3246. // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,
  3247. // because max possible codepoint is 0x10ffff
  3248. var _utf8len = new utils.Buf8(256);
  3249. for (var i=0; i<256; i++) {
  3250. _utf8len[i] = (i >= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1);
  3251. }
  3252. _utf8len[254]=_utf8len[254]=1; // Invalid sequence start
  3253. // convert string to array (typed, when possible)
  3254. exports.string2buf = function (str) {
  3255. var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;
  3256. // count binary size
  3257. for (m_pos = 0; m_pos < str_len; m_pos++) {
  3258. c = str.charCodeAt(m_pos);
  3259. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  3260. c2 = str.charCodeAt(m_pos+1);
  3261. if ((c2 & 0xfc00) === 0xdc00) {
  3262. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  3263. m_pos++;
  3264. }
  3265. }
  3266. buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;
  3267. }
  3268. // allocate buffer
  3269. buf = new utils.Buf8(buf_len);
  3270. // convert
  3271. for (i=0, m_pos = 0; i < buf_len; m_pos++) {
  3272. c = str.charCodeAt(m_pos);
  3273. if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) {
  3274. c2 = str.charCodeAt(m_pos+1);
  3275. if ((c2 & 0xfc00) === 0xdc00) {
  3276. c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);
  3277. m_pos++;
  3278. }
  3279. }
  3280. if (c < 0x80) {
  3281. /* one byte */
  3282. buf[i++] = c;
  3283. } else if (c < 0x800) {
  3284. /* two bytes */
  3285. buf[i++] = 0xC0 | (c >>> 6);
  3286. buf[i++] = 0x80 | (c & 0x3f);
  3287. } else if (c < 0x10000) {
  3288. /* three bytes */
  3289. buf[i++] = 0xE0 | (c >>> 12);
  3290. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  3291. buf[i++] = 0x80 | (c & 0x3f);
  3292. } else {
  3293. /* four bytes */
  3294. buf[i++] = 0xf0 | (c >>> 18);
  3295. buf[i++] = 0x80 | (c >>> 12 & 0x3f);
  3296. buf[i++] = 0x80 | (c >>> 6 & 0x3f);
  3297. buf[i++] = 0x80 | (c & 0x3f);
  3298. }
  3299. }
  3300. return buf;
  3301. };
  3302. // Helper (used in 2 places)
  3303. function buf2binstring(buf, len) {
  3304. // use fallback for big arrays to avoid stack overflow
  3305. if (len < 65537) {
  3306. if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {
  3307. return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
  3308. }
  3309. }
  3310. var result = '';
  3311. for(var i=0; i < len; i++) {
  3312. result += String.fromCharCode(buf[i]);
  3313. }
  3314. return result;
  3315. }
  3316. // Convert byte array to binary string
  3317. exports.buf2binstring = function(buf) {
  3318. return buf2binstring(buf, buf.length);
  3319. };
  3320. // Convert binary string (typed, when possible)
  3321. exports.binstring2buf = function(str) {
  3322. var buf = new utils.Buf8(str.length);
  3323. for(var i=0, len=buf.length; i < len; i++) {
  3324. buf[i] = str.charCodeAt(i);
  3325. }
  3326. return buf;
  3327. };
  3328. // convert array to string
  3329. exports.buf2string = function (buf, max) {
  3330. var i, out, c, c_len;
  3331. var len = max || buf.length;
  3332. // Reserve max possible length (2 words per char)
  3333. // NB: by unknown reasons, Array is significantly faster for
  3334. // String.fromCharCode.apply than Uint16Array.
  3335. var utf16buf = new Array(len*2);
  3336. for (out=0, i=0; i<len;) {
  3337. c = buf[i++];
  3338. // quick process ascii
  3339. if (c < 0x80) { utf16buf[out++] = c; continue; }
  3340. c_len = _utf8len[c];
  3341. // skip 5 & 6 byte codes
  3342. if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; }
  3343. // apply mask on first byte
  3344. c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;
  3345. // join the rest
  3346. while (c_len > 1 && i < len) {
  3347. c = (c << 6) | (buf[i++] & 0x3f);
  3348. c_len--;
  3349. }
  3350. // terminated by end of string?
  3351. if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }
  3352. if (c < 0x10000) {
  3353. utf16buf[out++] = c;
  3354. } else {
  3355. c -= 0x10000;
  3356. utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);
  3357. utf16buf[out++] = 0xdc00 | (c & 0x3ff);
  3358. }
  3359. }
  3360. return buf2binstring(utf16buf, out);
  3361. };
  3362. // Calculate max possible position in utf8 buffer,
  3363. // that will not break sequence. If that's not possible
  3364. // - (very small limits) return max size as is.
  3365. //
  3366. // buf[] - utf8 bytes array
  3367. // max - length limit (mandatory);
  3368. exports.utf8border = function(buf, max) {
  3369. var pos;
  3370. max = max || buf.length;
  3371. if (max > buf.length) { max = buf.length; }
  3372. // go back from last position, until start of sequence found
  3373. pos = max-1;
  3374. while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }
  3375. // Fuckup - very small and broken sequence,
  3376. // return max, because we should return something anyway.
  3377. if (pos < 0) { return max; }
  3378. // If we came to start of buffer - that means vuffer is too small,
  3379. // return max too.
  3380. if (pos === 0) { return max; }
  3381. return (pos + _utf8len[buf[pos]] > max) ? pos : max;
  3382. };
  3383. },{"./common":27}],29:[function(_dereq_,module,exports){
  3384. 'use strict';
  3385. // Note: adler32 takes 12% for level 0 and 2% for level 6.
  3386. // It doesn't worth to make additional optimizationa as in original.
  3387. // Small size is preferable.
  3388. function adler32(adler, buf, len, pos) {
  3389. var s1 = (adler & 0xffff) |0
  3390. , s2 = ((adler >>> 16) & 0xffff) |0
  3391. , n = 0;
  3392. while (len !== 0) {
  3393. // Set limit ~ twice less than 5552, to keep
  3394. // s2 in 31-bits, because we force signed ints.
  3395. // in other case %= will fail.
  3396. n = len > 2000 ? 2000 : len;
  3397. len -= n;
  3398. do {
  3399. s1 = (s1 + buf[pos++]) |0;
  3400. s2 = (s2 + s1) |0;
  3401. } while (--n);
  3402. s1 %= 65521;
  3403. s2 %= 65521;
  3404. }
  3405. return (s1 | (s2 << 16)) |0;
  3406. }
  3407. module.exports = adler32;
  3408. },{}],30:[function(_dereq_,module,exports){
  3409. module.exports = {
  3410. /* Allowed flush values; see deflate() and inflate() below for details */
  3411. Z_NO_FLUSH: 0,
  3412. Z_PARTIAL_FLUSH: 1,
  3413. Z_SYNC_FLUSH: 2,
  3414. Z_FULL_FLUSH: 3,
  3415. Z_FINISH: 4,
  3416. Z_BLOCK: 5,
  3417. Z_TREES: 6,
  3418. /* Return codes for the compression/decompression functions. Negative values
  3419. * are errors, positive values are used for special but normal events.
  3420. */
  3421. Z_OK: 0,
  3422. Z_STREAM_END: 1,
  3423. Z_NEED_DICT: 2,
  3424. Z_ERRNO: -1,
  3425. Z_STREAM_ERROR: -2,
  3426. Z_DATA_ERROR: -3,
  3427. //Z_MEM_ERROR: -4,
  3428. Z_BUF_ERROR: -5,
  3429. //Z_VERSION_ERROR: -6,
  3430. /* compression levels */
  3431. Z_NO_COMPRESSION: 0,
  3432. Z_BEST_SPEED: 1,
  3433. Z_BEST_COMPRESSION: 9,
  3434. Z_DEFAULT_COMPRESSION: -1,
  3435. Z_FILTERED: 1,
  3436. Z_HUFFMAN_ONLY: 2,
  3437. Z_RLE: 3,
  3438. Z_FIXED: 4,
  3439. Z_DEFAULT_STRATEGY: 0,
  3440. /* Possible values of the data_type field (though see inflate()) */
  3441. Z_BINARY: 0,
  3442. Z_TEXT: 1,
  3443. //Z_ASCII: 1, // = Z_TEXT (deprecated)
  3444. Z_UNKNOWN: 2,
  3445. /* The deflate compression method */
  3446. Z_DEFLATED: 8
  3447. //Z_NULL: null // Use -1 or null inline, depending on var type
  3448. };
  3449. },{}],31:[function(_dereq_,module,exports){
  3450. 'use strict';
  3451. // Note: we can't get significant speed boost here.
  3452. // So write code to minimize size - no pregenerated tables
  3453. // and array tools dependencies.
  3454. // Use ordinary array, since untyped makes no boost here
  3455. function makeTable() {
  3456. var c, table = [];
  3457. for(var n =0; n < 256; n++){
  3458. c = n;
  3459. for(var k =0; k < 8; k++){
  3460. c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
  3461. }
  3462. table[n] = c;
  3463. }
  3464. return table;
  3465. }
  3466. // Create table on load. Just 255 signed longs. Not a problem.
  3467. var crcTable = makeTable();
  3468. function crc32(crc, buf, len, pos) {
  3469. var t = crcTable
  3470. , end = pos + len;
  3471. crc = crc ^ (-1);
  3472. for (var i = pos; i < end; i++ ) {
  3473. crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
  3474. }
  3475. return (crc ^ (-1)); // >>> 0;
  3476. }
  3477. module.exports = crc32;
  3478. },{}],32:[function(_dereq_,module,exports){
  3479. 'use strict';
  3480. var utils = _dereq_('../utils/common');
  3481. var trees = _dereq_('./trees');
  3482. var adler32 = _dereq_('./adler32');
  3483. var crc32 = _dereq_('./crc32');
  3484. var msg = _dereq_('./messages');
  3485. /* Public constants ==========================================================*/
  3486. /* ===========================================================================*/
  3487. /* Allowed flush values; see deflate() and inflate() below for details */
  3488. var Z_NO_FLUSH = 0;
  3489. var Z_PARTIAL_FLUSH = 1;
  3490. //var Z_SYNC_FLUSH = 2;
  3491. var Z_FULL_FLUSH = 3;
  3492. var Z_FINISH = 4;
  3493. var Z_BLOCK = 5;
  3494. //var Z_TREES = 6;
  3495. /* Return codes for the compression/decompression functions. Negative values
  3496. * are errors, positive values are used for special but normal events.
  3497. */
  3498. var Z_OK = 0;
  3499. var Z_STREAM_END = 1;
  3500. //var Z_NEED_DICT = 2;
  3501. //var Z_ERRNO = -1;
  3502. var Z_STREAM_ERROR = -2;
  3503. var Z_DATA_ERROR = -3;
  3504. //var Z_MEM_ERROR = -4;
  3505. var Z_BUF_ERROR = -5;
  3506. //var Z_VERSION_ERROR = -6;
  3507. /* compression levels */
  3508. //var Z_NO_COMPRESSION = 0;
  3509. //var Z_BEST_SPEED = 1;
  3510. //var Z_BEST_COMPRESSION = 9;
  3511. var Z_DEFAULT_COMPRESSION = -1;
  3512. var Z_FILTERED = 1;
  3513. var Z_HUFFMAN_ONLY = 2;
  3514. var Z_RLE = 3;
  3515. var Z_FIXED = 4;
  3516. var Z_DEFAULT_STRATEGY = 0;
  3517. /* Possible values of the data_type field (though see inflate()) */
  3518. //var Z_BINARY = 0;
  3519. //var Z_TEXT = 1;
  3520. //var Z_ASCII = 1; // = Z_TEXT
  3521. var Z_UNKNOWN = 2;
  3522. /* The deflate compression method */
  3523. var Z_DEFLATED = 8;
  3524. /*============================================================================*/
  3525. var MAX_MEM_LEVEL = 9;
  3526. /* Maximum value for memLevel in deflateInit2 */
  3527. var MAX_WBITS = 15;
  3528. /* 32K LZ77 window */
  3529. var DEF_MEM_LEVEL = 8;
  3530. var LENGTH_CODES = 29;
  3531. /* number of length codes, not counting the special END_BLOCK code */
  3532. var LITERALS = 256;
  3533. /* number of literal bytes 0..255 */
  3534. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  3535. /* number of Literal or Length codes, including the END_BLOCK code */
  3536. var D_CODES = 30;
  3537. /* number of distance codes */
  3538. var BL_CODES = 19;
  3539. /* number of codes used to transfer the bit lengths */
  3540. var HEAP_SIZE = 2*L_CODES + 1;
  3541. /* maximum heap size */
  3542. var MAX_BITS = 15;
  3543. /* All codes must not exceed MAX_BITS bits */
  3544. var MIN_MATCH = 3;
  3545. var MAX_MATCH = 258;
  3546. var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
  3547. var PRESET_DICT = 0x20;
  3548. var INIT_STATE = 42;
  3549. var EXTRA_STATE = 69;
  3550. var NAME_STATE = 73;
  3551. var COMMENT_STATE = 91;
  3552. var HCRC_STATE = 103;
  3553. var BUSY_STATE = 113;
  3554. var FINISH_STATE = 666;
  3555. var BS_NEED_MORE = 1; /* block not completed, need more input or more output */
  3556. var BS_BLOCK_DONE = 2; /* block flush performed */
  3557. var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
  3558. var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */
  3559. var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
  3560. function err(strm, errorCode) {
  3561. strm.msg = msg[errorCode];
  3562. return errorCode;
  3563. }
  3564. function rank(f) {
  3565. return ((f) << 1) - ((f) > 4 ? 9 : 0);
  3566. }
  3567. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  3568. /* =========================================================================
  3569. * Flush as much pending output as possible. All deflate() output goes
  3570. * through this function so some applications may wish to modify it
  3571. * to avoid allocating a large strm->output buffer and copying into it.
  3572. * (See also read_buf()).
  3573. */
  3574. function flush_pending(strm) {
  3575. var s = strm.state;
  3576. //_tr_flush_bits(s);
  3577. var len = s.pending;
  3578. if (len > strm.avail_out) {
  3579. len = strm.avail_out;
  3580. }
  3581. if (len === 0) { return; }
  3582. utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
  3583. strm.next_out += len;
  3584. s.pending_out += len;
  3585. strm.total_out += len;
  3586. strm.avail_out -= len;
  3587. s.pending -= len;
  3588. if (s.pending === 0) {
  3589. s.pending_out = 0;
  3590. }
  3591. }
  3592. function flush_block_only (s, last) {
  3593. trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
  3594. s.block_start = s.strstart;
  3595. flush_pending(s.strm);
  3596. }
  3597. function put_byte(s, b) {
  3598. s.pending_buf[s.pending++] = b;
  3599. }
  3600. /* =========================================================================
  3601. * Put a short in the pending buffer. The 16-bit value is put in MSB order.
  3602. * IN assertion: the stream state is correct and there is enough room in
  3603. * pending_buf.
  3604. */
  3605. function putShortMSB(s, b) {
  3606. // put_byte(s, (Byte)(b >> 8));
  3607. // put_byte(s, (Byte)(b & 0xff));
  3608. s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
  3609. s.pending_buf[s.pending++] = b & 0xff;
  3610. }
  3611. /* ===========================================================================
  3612. * Read a new buffer from the current input stream, update the adler32
  3613. * and total number of bytes read. All deflate() input goes through
  3614. * this function so some applications may wish to modify it to avoid
  3615. * allocating a large strm->input buffer and copying from it.
  3616. * (See also flush_pending()).
  3617. */
  3618. function read_buf(strm, buf, start, size) {
  3619. var len = strm.avail_in;
  3620. if (len > size) { len = size; }
  3621. if (len === 0) { return 0; }
  3622. strm.avail_in -= len;
  3623. utils.arraySet(buf, strm.input, strm.next_in, len, start);
  3624. if (strm.state.wrap === 1) {
  3625. strm.adler = adler32(strm.adler, buf, len, start);
  3626. }
  3627. else if (strm.state.wrap === 2) {
  3628. strm.adler = crc32(strm.adler, buf, len, start);
  3629. }
  3630. strm.next_in += len;
  3631. strm.total_in += len;
  3632. return len;
  3633. }
  3634. /* ===========================================================================
  3635. * Set match_start to the longest match starting at the given string and
  3636. * return its length. Matches shorter or equal to prev_length are discarded,
  3637. * in which case the result is equal to prev_length and match_start is
  3638. * garbage.
  3639. * IN assertions: cur_match is the head of the hash chain for the current
  3640. * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  3641. * OUT assertion: the match length is not greater than s->lookahead.
  3642. */
  3643. function longest_match(s, cur_match) {
  3644. var chain_length = s.max_chain_length; /* max hash chain length */
  3645. var scan = s.strstart; /* current string */
  3646. var match; /* matched string */
  3647. var len; /* length of current match */
  3648. var best_len = s.prev_length; /* best match length so far */
  3649. var nice_match = s.nice_match; /* stop if match long enough */
  3650. var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
  3651. s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
  3652. var _win = s.window; // shortcut
  3653. var wmask = s.w_mask;
  3654. var prev = s.prev;
  3655. /* Stop when cur_match becomes <= limit. To simplify the code,
  3656. * we prevent matches with the string of window index 0.
  3657. */
  3658. var strend = s.strstart + MAX_MATCH;
  3659. var scan_end1 = _win[scan + best_len - 1];
  3660. var scan_end = _win[scan + best_len];
  3661. /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
  3662. * It is easy to get rid of this optimization if necessary.
  3663. */
  3664. // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
  3665. /* Do not waste too much time if we already have a good match: */
  3666. if (s.prev_length >= s.good_match) {
  3667. chain_length >>= 2;
  3668. }
  3669. /* Do not look for matches beyond the end of the input. This is necessary
  3670. * to make deflate deterministic.
  3671. */
  3672. if (nice_match > s.lookahead) { nice_match = s.lookahead; }
  3673. // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
  3674. do {
  3675. // Assert(cur_match < s->strstart, "no future");
  3676. match = cur_match;
  3677. /* Skip to next match if the match length cannot increase
  3678. * or if the match length is less than 2. Note that the checks below
  3679. * for insufficient lookahead only occur occasionally for performance
  3680. * reasons. Therefore uninitialized memory will be accessed, and
  3681. * conditional jumps will be made that depend on those values.
  3682. * However the length of the match is limited to the lookahead, so
  3683. * the output of deflate is not affected by the uninitialized values.
  3684. */
  3685. if (_win[match + best_len] !== scan_end ||
  3686. _win[match + best_len - 1] !== scan_end1 ||
  3687. _win[match] !== _win[scan] ||
  3688. _win[++match] !== _win[scan + 1]) {
  3689. continue;
  3690. }
  3691. /* The check at best_len-1 can be removed because it will be made
  3692. * again later. (This heuristic is not always a win.)
  3693. * It is not necessary to compare scan[2] and match[2] since they
  3694. * are always equal when the other bytes match, given that
  3695. * the hash keys are equal and that HASH_BITS >= 8.
  3696. */
  3697. scan += 2;
  3698. match++;
  3699. // Assert(*scan == *match, "match[2]?");
  3700. /* We check for insufficient lookahead only every 8th comparison;
  3701. * the 256th check will be made at strstart+258.
  3702. */
  3703. do {
  3704. /*jshint noempty:false*/
  3705. } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  3706. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  3707. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  3708. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  3709. scan < strend);
  3710. // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
  3711. len = MAX_MATCH - (strend - scan);
  3712. scan = strend - MAX_MATCH;
  3713. if (len > best_len) {
  3714. s.match_start = cur_match;
  3715. best_len = len;
  3716. if (len >= nice_match) {
  3717. break;
  3718. }
  3719. scan_end1 = _win[scan + best_len - 1];
  3720. scan_end = _win[scan + best_len];
  3721. }
  3722. } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
  3723. if (best_len <= s.lookahead) {
  3724. return best_len;
  3725. }
  3726. return s.lookahead;
  3727. }
  3728. /* ===========================================================================
  3729. * Fill the window when the lookahead becomes insufficient.
  3730. * Updates strstart and lookahead.
  3731. *
  3732. * IN assertion: lookahead < MIN_LOOKAHEAD
  3733. * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
  3734. * At least one byte has been read, or avail_in == 0; reads are
  3735. * performed for at least two bytes (required for the zip translate_eol
  3736. * option -- not supported here).
  3737. */
  3738. function fill_window(s) {
  3739. var _w_size = s.w_size;
  3740. var p, n, m, more, str;
  3741. //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
  3742. do {
  3743. more = s.window_size - s.lookahead - s.strstart;
  3744. // JS ints have 32 bit, block below not needed
  3745. /* Deal with !@#$% 64K limit: */
  3746. //if (sizeof(int) <= 2) {
  3747. // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
  3748. // more = wsize;
  3749. //
  3750. // } else if (more == (unsigned)(-1)) {
  3751. // /* Very unlikely, but possible on 16 bit machine if
  3752. // * strstart == 0 && lookahead == 1 (input done a byte at time)
  3753. // */
  3754. // more--;
  3755. // }
  3756. //}
  3757. /* If the window is almost full and there is insufficient lookahead,
  3758. * move the upper half to the lower one to make room in the upper half.
  3759. */
  3760. if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
  3761. utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
  3762. s.match_start -= _w_size;
  3763. s.strstart -= _w_size;
  3764. /* we now have strstart >= MAX_DIST */
  3765. s.block_start -= _w_size;
  3766. /* Slide the hash table (could be avoided with 32 bit values
  3767. at the expense of memory usage). We slide even when level == 0
  3768. to keep the hash table consistent if we switch back to level > 0
  3769. later. (Using level 0 permanently is not an optimal usage of
  3770. zlib, so we don't care about this pathological case.)
  3771. */
  3772. n = s.hash_size;
  3773. p = n;
  3774. do {
  3775. m = s.head[--p];
  3776. s.head[p] = (m >= _w_size ? m - _w_size : 0);
  3777. } while (--n);
  3778. n = _w_size;
  3779. p = n;
  3780. do {
  3781. m = s.prev[--p];
  3782. s.prev[p] = (m >= _w_size ? m - _w_size : 0);
  3783. /* If n is not on any hash chain, prev[n] is garbage but
  3784. * its value will never be used.
  3785. */
  3786. } while (--n);
  3787. more += _w_size;
  3788. }
  3789. if (s.strm.avail_in === 0) {
  3790. break;
  3791. }
  3792. /* If there was no sliding:
  3793. * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
  3794. * more == window_size - lookahead - strstart
  3795. * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
  3796. * => more >= window_size - 2*WSIZE + 2
  3797. * In the BIG_MEM or MMAP case (not yet supported),
  3798. * window_size == input_size + MIN_LOOKAHEAD &&
  3799. * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
  3800. * Otherwise, window_size == 2*WSIZE so more >= 2.
  3801. * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
  3802. */
  3803. //Assert(more >= 2, "more < 2");
  3804. n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
  3805. s.lookahead += n;
  3806. /* Initialize the hash value now that we have some input: */
  3807. if (s.lookahead + s.insert >= MIN_MATCH) {
  3808. str = s.strstart - s.insert;
  3809. s.ins_h = s.window[str];
  3810. /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
  3811. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
  3812. //#if MIN_MATCH != 3
  3813. // Call update_hash() MIN_MATCH-3 more times
  3814. //#endif
  3815. while (s.insert) {
  3816. /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
  3817. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask;
  3818. s.prev[str & s.w_mask] = s.head[s.ins_h];
  3819. s.head[s.ins_h] = str;
  3820. str++;
  3821. s.insert--;
  3822. if (s.lookahead + s.insert < MIN_MATCH) {
  3823. break;
  3824. }
  3825. }
  3826. }
  3827. /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
  3828. * but this is not important since only literal bytes will be emitted.
  3829. */
  3830. } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
  3831. /* If the WIN_INIT bytes after the end of the current data have never been
  3832. * written, then zero those bytes in order to avoid memory check reports of
  3833. * the use of uninitialized (or uninitialised as Julian writes) bytes by
  3834. * the longest match routines. Update the high water mark for the next
  3835. * time through here. WIN_INIT is set to MAX_MATCH since the longest match
  3836. * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
  3837. */
  3838. // if (s.high_water < s.window_size) {
  3839. // var curr = s.strstart + s.lookahead;
  3840. // var init = 0;
  3841. //
  3842. // if (s.high_water < curr) {
  3843. // /* Previous high water mark below current data -- zero WIN_INIT
  3844. // * bytes or up to end of window, whichever is less.
  3845. // */
  3846. // init = s.window_size - curr;
  3847. // if (init > WIN_INIT)
  3848. // init = WIN_INIT;
  3849. // zmemzero(s->window + curr, (unsigned)init);
  3850. // s->high_water = curr + init;
  3851. // }
  3852. // else if (s->high_water < (ulg)curr + WIN_INIT) {
  3853. // /* High water mark at or above current data, but below current data
  3854. // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
  3855. // * to end of window, whichever is less.
  3856. // */
  3857. // init = (ulg)curr + WIN_INIT - s->high_water;
  3858. // if (init > s->window_size - s->high_water)
  3859. // init = s->window_size - s->high_water;
  3860. // zmemzero(s->window + s->high_water, (unsigned)init);
  3861. // s->high_water += init;
  3862. // }
  3863. // }
  3864. //
  3865. // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
  3866. // "not enough room for search");
  3867. }
  3868. /* ===========================================================================
  3869. * Copy without compression as much as possible from the input stream, return
  3870. * the current block state.
  3871. * This function does not insert new strings in the dictionary since
  3872. * uncompressible data is probably not useful. This function is used
  3873. * only for the level=0 compression option.
  3874. * NOTE: this function should be optimized to avoid extra copying from
  3875. * window to pending_buf.
  3876. */
  3877. function deflate_stored(s, flush) {
  3878. /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
  3879. * to pending_buf_size, and each stored block has a 5 byte header:
  3880. */
  3881. var max_block_size = 0xffff;
  3882. if (max_block_size > s.pending_buf_size - 5) {
  3883. max_block_size = s.pending_buf_size - 5;
  3884. }
  3885. /* Copy as much as possible from input to output: */
  3886. for (;;) {
  3887. /* Fill the window as much as possible: */
  3888. if (s.lookahead <= 1) {
  3889. //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
  3890. // s->block_start >= (long)s->w_size, "slide too late");
  3891. // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
  3892. // s.block_start >= s.w_size)) {
  3893. // throw new Error("slide too late");
  3894. // }
  3895. fill_window(s);
  3896. if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
  3897. return BS_NEED_MORE;
  3898. }
  3899. if (s.lookahead === 0) {
  3900. break;
  3901. }
  3902. /* flush the current block */
  3903. }
  3904. //Assert(s->block_start >= 0L, "block gone");
  3905. // if (s.block_start < 0) throw new Error("block gone");
  3906. s.strstart += s.lookahead;
  3907. s.lookahead = 0;
  3908. /* Emit a stored block if pending_buf will be full: */
  3909. var max_start = s.block_start + max_block_size;
  3910. if (s.strstart === 0 || s.strstart >= max_start) {
  3911. /* strstart == 0 is possible when wraparound on 16-bit machine */
  3912. s.lookahead = s.strstart - max_start;
  3913. s.strstart = max_start;
  3914. /*** FLUSH_BLOCK(s, 0); ***/
  3915. flush_block_only(s, false);
  3916. if (s.strm.avail_out === 0) {
  3917. return BS_NEED_MORE;
  3918. }
  3919. /***/
  3920. }
  3921. /* Flush if we may have to slide, otherwise block_start may become
  3922. * negative and the data will be gone:
  3923. */
  3924. if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
  3925. /*** FLUSH_BLOCK(s, 0); ***/
  3926. flush_block_only(s, false);
  3927. if (s.strm.avail_out === 0) {
  3928. return BS_NEED_MORE;
  3929. }
  3930. /***/
  3931. }
  3932. }
  3933. s.insert = 0;
  3934. if (flush === Z_FINISH) {
  3935. /*** FLUSH_BLOCK(s, 1); ***/
  3936. flush_block_only(s, true);
  3937. if (s.strm.avail_out === 0) {
  3938. return BS_FINISH_STARTED;
  3939. }
  3940. /***/
  3941. return BS_FINISH_DONE;
  3942. }
  3943. if (s.strstart > s.block_start) {
  3944. /*** FLUSH_BLOCK(s, 0); ***/
  3945. flush_block_only(s, false);
  3946. if (s.strm.avail_out === 0) {
  3947. return BS_NEED_MORE;
  3948. }
  3949. /***/
  3950. }
  3951. return BS_NEED_MORE;
  3952. }
  3953. /* ===========================================================================
  3954. * Compress as much as possible from the input stream, return the current
  3955. * block state.
  3956. * This function does not perform lazy evaluation of matches and inserts
  3957. * new strings in the dictionary only for unmatched strings or for short
  3958. * matches. It is used only for the fast compression options.
  3959. */
  3960. function deflate_fast(s, flush) {
  3961. var hash_head; /* head of the hash chain */
  3962. var bflush; /* set if current block must be flushed */
  3963. for (;;) {
  3964. /* Make sure that we always have enough lookahead, except
  3965. * at the end of the input file. We need MAX_MATCH bytes
  3966. * for the next match, plus MIN_MATCH bytes to insert the
  3967. * string following the next match.
  3968. */
  3969. if (s.lookahead < MIN_LOOKAHEAD) {
  3970. fill_window(s);
  3971. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  3972. return BS_NEED_MORE;
  3973. }
  3974. if (s.lookahead === 0) {
  3975. break; /* flush the current block */
  3976. }
  3977. }
  3978. /* Insert the string window[strstart .. strstart+2] in the
  3979. * dictionary, and set hash_head to the head of the hash chain:
  3980. */
  3981. hash_head = 0/*NIL*/;
  3982. if (s.lookahead >= MIN_MATCH) {
  3983. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  3984. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  3985. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  3986. s.head[s.ins_h] = s.strstart;
  3987. /***/
  3988. }
  3989. /* Find the longest match, discarding those <= prev_length.
  3990. * At this point we have always match_length < MIN_MATCH
  3991. */
  3992. if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
  3993. /* To simplify the code, we prevent matches with the string
  3994. * of window index 0 (in particular we have to avoid a match
  3995. * of the string with itself at the start of the input file).
  3996. */
  3997. s.match_length = longest_match(s, hash_head);
  3998. /* longest_match() sets match_start */
  3999. }
  4000. if (s.match_length >= MIN_MATCH) {
  4001. // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
  4002. /*** _tr_tally_dist(s, s.strstart - s.match_start,
  4003. s.match_length - MIN_MATCH, bflush); ***/
  4004. bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
  4005. s.lookahead -= s.match_length;
  4006. /* Insert new strings in the hash table only if the match length
  4007. * is not too large. This saves time but degrades compression.
  4008. */
  4009. if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
  4010. s.match_length--; /* string at strstart already in table */
  4011. do {
  4012. s.strstart++;
  4013. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  4014. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  4015. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  4016. s.head[s.ins_h] = s.strstart;
  4017. /***/
  4018. /* strstart never exceeds WSIZE-MAX_MATCH, so there are
  4019. * always MIN_MATCH bytes ahead.
  4020. */
  4021. } while (--s.match_length !== 0);
  4022. s.strstart++;
  4023. } else
  4024. {
  4025. s.strstart += s.match_length;
  4026. s.match_length = 0;
  4027. s.ins_h = s.window[s.strstart];
  4028. /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
  4029. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
  4030. //#if MIN_MATCH != 3
  4031. // Call UPDATE_HASH() MIN_MATCH-3 more times
  4032. //#endif
  4033. /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
  4034. * matter since it will be recomputed at next deflate call.
  4035. */
  4036. }
  4037. } else {
  4038. /* No match, output a literal byte */
  4039. //Tracevv((stderr,"%c", s.window[s.strstart]));
  4040. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  4041. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  4042. s.lookahead--;
  4043. s.strstart++;
  4044. }
  4045. if (bflush) {
  4046. /*** FLUSH_BLOCK(s, 0); ***/
  4047. flush_block_only(s, false);
  4048. if (s.strm.avail_out === 0) {
  4049. return BS_NEED_MORE;
  4050. }
  4051. /***/
  4052. }
  4053. }
  4054. s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1);
  4055. if (flush === Z_FINISH) {
  4056. /*** FLUSH_BLOCK(s, 1); ***/
  4057. flush_block_only(s, true);
  4058. if (s.strm.avail_out === 0) {
  4059. return BS_FINISH_STARTED;
  4060. }
  4061. /***/
  4062. return BS_FINISH_DONE;
  4063. }
  4064. if (s.last_lit) {
  4065. /*** FLUSH_BLOCK(s, 0); ***/
  4066. flush_block_only(s, false);
  4067. if (s.strm.avail_out === 0) {
  4068. return BS_NEED_MORE;
  4069. }
  4070. /***/
  4071. }
  4072. return BS_BLOCK_DONE;
  4073. }
  4074. /* ===========================================================================
  4075. * Same as above, but achieves better compression. We use a lazy
  4076. * evaluation for matches: a match is finally adopted only if there is
  4077. * no better match at the next window position.
  4078. */
  4079. function deflate_slow(s, flush) {
  4080. var hash_head; /* head of hash chain */
  4081. var bflush; /* set if current block must be flushed */
  4082. var max_insert;
  4083. /* Process the input block. */
  4084. for (;;) {
  4085. /* Make sure that we always have enough lookahead, except
  4086. * at the end of the input file. We need MAX_MATCH bytes
  4087. * for the next match, plus MIN_MATCH bytes to insert the
  4088. * string following the next match.
  4089. */
  4090. if (s.lookahead < MIN_LOOKAHEAD) {
  4091. fill_window(s);
  4092. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  4093. return BS_NEED_MORE;
  4094. }
  4095. if (s.lookahead === 0) { break; } /* flush the current block */
  4096. }
  4097. /* Insert the string window[strstart .. strstart+2] in the
  4098. * dictionary, and set hash_head to the head of the hash chain:
  4099. */
  4100. hash_head = 0/*NIL*/;
  4101. if (s.lookahead >= MIN_MATCH) {
  4102. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  4103. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  4104. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  4105. s.head[s.ins_h] = s.strstart;
  4106. /***/
  4107. }
  4108. /* Find the longest match, discarding those <= prev_length.
  4109. */
  4110. s.prev_length = s.match_length;
  4111. s.prev_match = s.match_start;
  4112. s.match_length = MIN_MATCH-1;
  4113. if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
  4114. s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
  4115. /* To simplify the code, we prevent matches with the string
  4116. * of window index 0 (in particular we have to avoid a match
  4117. * of the string with itself at the start of the input file).
  4118. */
  4119. s.match_length = longest_match(s, hash_head);
  4120. /* longest_match() sets match_start */
  4121. if (s.match_length <= 5 &&
  4122. (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
  4123. /* If prev_match is also MIN_MATCH, match_start is garbage
  4124. * but we will ignore the current match anyway.
  4125. */
  4126. s.match_length = MIN_MATCH-1;
  4127. }
  4128. }
  4129. /* If there was a match at the previous step and the current
  4130. * match is not better, output the previous match:
  4131. */
  4132. if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
  4133. max_insert = s.strstart + s.lookahead - MIN_MATCH;
  4134. /* Do not insert strings in hash table beyond this. */
  4135. //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
  4136. /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
  4137. s.prev_length - MIN_MATCH, bflush);***/
  4138. bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH);
  4139. /* Insert in hash table all strings up to the end of the match.
  4140. * strstart-1 and strstart are already inserted. If there is not
  4141. * enough lookahead, the last two strings are not inserted in
  4142. * the hash table.
  4143. */
  4144. s.lookahead -= s.prev_length-1;
  4145. s.prev_length -= 2;
  4146. do {
  4147. if (++s.strstart <= max_insert) {
  4148. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  4149. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  4150. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  4151. s.head[s.ins_h] = s.strstart;
  4152. /***/
  4153. }
  4154. } while (--s.prev_length !== 0);
  4155. s.match_available = 0;
  4156. s.match_length = MIN_MATCH-1;
  4157. s.strstart++;
  4158. if (bflush) {
  4159. /*** FLUSH_BLOCK(s, 0); ***/
  4160. flush_block_only(s, false);
  4161. if (s.strm.avail_out === 0) {
  4162. return BS_NEED_MORE;
  4163. }
  4164. /***/
  4165. }
  4166. } else if (s.match_available) {
  4167. /* If there was no match at the previous position, output a
  4168. * single literal. If there was a match but the current match
  4169. * is longer, truncate the previous match to a single literal.
  4170. */
  4171. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  4172. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  4173. bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
  4174. if (bflush) {
  4175. /*** FLUSH_BLOCK_ONLY(s, 0) ***/
  4176. flush_block_only(s, false);
  4177. /***/
  4178. }
  4179. s.strstart++;
  4180. s.lookahead--;
  4181. if (s.strm.avail_out === 0) {
  4182. return BS_NEED_MORE;
  4183. }
  4184. } else {
  4185. /* There is no previous match to compare with, wait for
  4186. * the next step to decide.
  4187. */
  4188. s.match_available = 1;
  4189. s.strstart++;
  4190. s.lookahead--;
  4191. }
  4192. }
  4193. //Assert (flush != Z_NO_FLUSH, "no flush?");
  4194. if (s.match_available) {
  4195. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  4196. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  4197. bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]);
  4198. s.match_available = 0;
  4199. }
  4200. s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1;
  4201. if (flush === Z_FINISH) {
  4202. /*** FLUSH_BLOCK(s, 1); ***/
  4203. flush_block_only(s, true);
  4204. if (s.strm.avail_out === 0) {
  4205. return BS_FINISH_STARTED;
  4206. }
  4207. /***/
  4208. return BS_FINISH_DONE;
  4209. }
  4210. if (s.last_lit) {
  4211. /*** FLUSH_BLOCK(s, 0); ***/
  4212. flush_block_only(s, false);
  4213. if (s.strm.avail_out === 0) {
  4214. return BS_NEED_MORE;
  4215. }
  4216. /***/
  4217. }
  4218. return BS_BLOCK_DONE;
  4219. }
  4220. /* ===========================================================================
  4221. * For Z_RLE, simply look for runs of bytes, generate matches only of distance
  4222. * one. Do not maintain a hash table. (It will be regenerated if this run of
  4223. * deflate switches away from Z_RLE.)
  4224. */
  4225. function deflate_rle(s, flush) {
  4226. var bflush; /* set if current block must be flushed */
  4227. var prev; /* byte at distance one to match */
  4228. var scan, strend; /* scan goes up to strend for length of run */
  4229. var _win = s.window;
  4230. for (;;) {
  4231. /* Make sure that we always have enough lookahead, except
  4232. * at the end of the input file. We need MAX_MATCH bytes
  4233. * for the longest run, plus one for the unrolled loop.
  4234. */
  4235. if (s.lookahead <= MAX_MATCH) {
  4236. fill_window(s);
  4237. if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
  4238. return BS_NEED_MORE;
  4239. }
  4240. if (s.lookahead === 0) { break; } /* flush the current block */
  4241. }
  4242. /* See how many times the previous byte repeats */
  4243. s.match_length = 0;
  4244. if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
  4245. scan = s.strstart - 1;
  4246. prev = _win[scan];
  4247. if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
  4248. strend = s.strstart + MAX_MATCH;
  4249. do {
  4250. /*jshint noempty:false*/
  4251. } while (prev === _win[++scan] && prev === _win[++scan] &&
  4252. prev === _win[++scan] && prev === _win[++scan] &&
  4253. prev === _win[++scan] && prev === _win[++scan] &&
  4254. prev === _win[++scan] && prev === _win[++scan] &&
  4255. scan < strend);
  4256. s.match_length = MAX_MATCH - (strend - scan);
  4257. if (s.match_length > s.lookahead) {
  4258. s.match_length = s.lookahead;
  4259. }
  4260. }
  4261. //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
  4262. }
  4263. /* Emit match if have run of MIN_MATCH or longer, else emit literal */
  4264. if (s.match_length >= MIN_MATCH) {
  4265. //check_match(s, s.strstart, s.strstart - 1, s.match_length);
  4266. /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
  4267. bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
  4268. s.lookahead -= s.match_length;
  4269. s.strstart += s.match_length;
  4270. s.match_length = 0;
  4271. } else {
  4272. /* No match, output a literal byte */
  4273. //Tracevv((stderr,"%c", s->window[s->strstart]));
  4274. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  4275. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  4276. s.lookahead--;
  4277. s.strstart++;
  4278. }
  4279. if (bflush) {
  4280. /*** FLUSH_BLOCK(s, 0); ***/
  4281. flush_block_only(s, false);
  4282. if (s.strm.avail_out === 0) {
  4283. return BS_NEED_MORE;
  4284. }
  4285. /***/
  4286. }
  4287. }
  4288. s.insert = 0;
  4289. if (flush === Z_FINISH) {
  4290. /*** FLUSH_BLOCK(s, 1); ***/
  4291. flush_block_only(s, true);
  4292. if (s.strm.avail_out === 0) {
  4293. return BS_FINISH_STARTED;
  4294. }
  4295. /***/
  4296. return BS_FINISH_DONE;
  4297. }
  4298. if (s.last_lit) {
  4299. /*** FLUSH_BLOCK(s, 0); ***/
  4300. flush_block_only(s, false);
  4301. if (s.strm.avail_out === 0) {
  4302. return BS_NEED_MORE;
  4303. }
  4304. /***/
  4305. }
  4306. return BS_BLOCK_DONE;
  4307. }
  4308. /* ===========================================================================
  4309. * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
  4310. * (It will be regenerated if this run of deflate switches away from Huffman.)
  4311. */
  4312. function deflate_huff(s, flush) {
  4313. var bflush; /* set if current block must be flushed */
  4314. for (;;) {
  4315. /* Make sure that we have a literal to write. */
  4316. if (s.lookahead === 0) {
  4317. fill_window(s);
  4318. if (s.lookahead === 0) {
  4319. if (flush === Z_NO_FLUSH) {
  4320. return BS_NEED_MORE;
  4321. }
  4322. break; /* flush the current block */
  4323. }
  4324. }
  4325. /* Output a literal byte */
  4326. s.match_length = 0;
  4327. //Tracevv((stderr,"%c", s->window[s->strstart]));
  4328. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  4329. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  4330. s.lookahead--;
  4331. s.strstart++;
  4332. if (bflush) {
  4333. /*** FLUSH_BLOCK(s, 0); ***/
  4334. flush_block_only(s, false);
  4335. if (s.strm.avail_out === 0) {
  4336. return BS_NEED_MORE;
  4337. }
  4338. /***/
  4339. }
  4340. }
  4341. s.insert = 0;
  4342. if (flush === Z_FINISH) {
  4343. /*** FLUSH_BLOCK(s, 1); ***/
  4344. flush_block_only(s, true);
  4345. if (s.strm.avail_out === 0) {
  4346. return BS_FINISH_STARTED;
  4347. }
  4348. /***/
  4349. return BS_FINISH_DONE;
  4350. }
  4351. if (s.last_lit) {
  4352. /*** FLUSH_BLOCK(s, 0); ***/
  4353. flush_block_only(s, false);
  4354. if (s.strm.avail_out === 0) {
  4355. return BS_NEED_MORE;
  4356. }
  4357. /***/
  4358. }
  4359. return BS_BLOCK_DONE;
  4360. }
  4361. /* Values for max_lazy_match, good_match and max_chain_length, depending on
  4362. * the desired pack level (0..9). The values given below have been tuned to
  4363. * exclude worst case performance for pathological files. Better values may be
  4364. * found for specific files.
  4365. */
  4366. var Config = function (good_length, max_lazy, nice_length, max_chain, func) {
  4367. this.good_length = good_length;
  4368. this.max_lazy = max_lazy;
  4369. this.nice_length = nice_length;
  4370. this.max_chain = max_chain;
  4371. this.func = func;
  4372. };
  4373. var configuration_table;
  4374. configuration_table = [
  4375. /* good lazy nice chain */
  4376. new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */
  4377. new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */
  4378. new Config(4, 5, 16, 8, deflate_fast), /* 2 */
  4379. new Config(4, 6, 32, 32, deflate_fast), /* 3 */
  4380. new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */
  4381. new Config(8, 16, 32, 32, deflate_slow), /* 5 */
  4382. new Config(8, 16, 128, 128, deflate_slow), /* 6 */
  4383. new Config(8, 32, 128, 256, deflate_slow), /* 7 */
  4384. new Config(32, 128, 258, 1024, deflate_slow), /* 8 */
  4385. new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */
  4386. ];
  4387. /* ===========================================================================
  4388. * Initialize the "longest match" routines for a new zlib stream
  4389. */
  4390. function lm_init(s) {
  4391. s.window_size = 2 * s.w_size;
  4392. /*** CLEAR_HASH(s); ***/
  4393. zero(s.head); // Fill with NIL (= 0);
  4394. /* Set the default configuration parameters:
  4395. */
  4396. s.max_lazy_match = configuration_table[s.level].max_lazy;
  4397. s.good_match = configuration_table[s.level].good_length;
  4398. s.nice_match = configuration_table[s.level].nice_length;
  4399. s.max_chain_length = configuration_table[s.level].max_chain;
  4400. s.strstart = 0;
  4401. s.block_start = 0;
  4402. s.lookahead = 0;
  4403. s.insert = 0;
  4404. s.match_length = s.prev_length = MIN_MATCH - 1;
  4405. s.match_available = 0;
  4406. s.ins_h = 0;
  4407. }
  4408. function DeflateState() {
  4409. this.strm = null; /* pointer back to this zlib stream */
  4410. this.status = 0; /* as the name implies */
  4411. this.pending_buf = null; /* output still pending */
  4412. this.pending_buf_size = 0; /* size of pending_buf */
  4413. this.pending_out = 0; /* next pending byte to output to the stream */
  4414. this.pending = 0; /* nb of bytes in the pending buffer */
  4415. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  4416. this.gzhead = null; /* gzip header information to write */
  4417. this.gzindex = 0; /* where in extra, name, or comment */
  4418. this.method = Z_DEFLATED; /* can only be DEFLATED */
  4419. this.last_flush = -1; /* value of flush param for previous deflate call */
  4420. this.w_size = 0; /* LZ77 window size (32K by default) */
  4421. this.w_bits = 0; /* log2(w_size) (8..16) */
  4422. this.w_mask = 0; /* w_size - 1 */
  4423. this.window = null;
  4424. /* Sliding window. Input bytes are read into the second half of the window,
  4425. * and move to the first half later to keep a dictionary of at least wSize
  4426. * bytes. With this organization, matches are limited to a distance of
  4427. * wSize-MAX_MATCH bytes, but this ensures that IO is always
  4428. * performed with a length multiple of the block size.
  4429. */
  4430. this.window_size = 0;
  4431. /* Actual size of window: 2*wSize, except when the user input buffer
  4432. * is directly used as sliding window.
  4433. */
  4434. this.prev = null;
  4435. /* Link to older string with same hash index. To limit the size of this
  4436. * array to 64K, this link is maintained only for the last 32K strings.
  4437. * An index in this array is thus a window index modulo 32K.
  4438. */
  4439. this.head = null; /* Heads of the hash chains or NIL. */
  4440. this.ins_h = 0; /* hash index of string to be inserted */
  4441. this.hash_size = 0; /* number of elements in hash table */
  4442. this.hash_bits = 0; /* log2(hash_size) */
  4443. this.hash_mask = 0; /* hash_size-1 */
  4444. this.hash_shift = 0;
  4445. /* Number of bits by which ins_h must be shifted at each input
  4446. * step. It must be such that after MIN_MATCH steps, the oldest
  4447. * byte no longer takes part in the hash key, that is:
  4448. * hash_shift * MIN_MATCH >= hash_bits
  4449. */
  4450. this.block_start = 0;
  4451. /* Window position at the beginning of the current output block. Gets
  4452. * negative when the window is moved backwards.
  4453. */
  4454. this.match_length = 0; /* length of best match */
  4455. this.prev_match = 0; /* previous match */
  4456. this.match_available = 0; /* set if previous match exists */
  4457. this.strstart = 0; /* start of string to insert */
  4458. this.match_start = 0; /* start of matching string */
  4459. this.lookahead = 0; /* number of valid bytes ahead in window */
  4460. this.prev_length = 0;
  4461. /* Length of the best match at previous step. Matches not greater than this
  4462. * are discarded. This is used in the lazy match evaluation.
  4463. */
  4464. this.max_chain_length = 0;
  4465. /* To speed up deflation, hash chains are never searched beyond this
  4466. * length. A higher limit improves compression ratio but degrades the
  4467. * speed.
  4468. */
  4469. this.max_lazy_match = 0;
  4470. /* Attempt to find a better match only when the current match is strictly
  4471. * smaller than this value. This mechanism is used only for compression
  4472. * levels >= 4.
  4473. */
  4474. // That's alias to max_lazy_match, don't use directly
  4475. //this.max_insert_length = 0;
  4476. /* Insert new strings in the hash table only if the match length is not
  4477. * greater than this length. This saves time but degrades compression.
  4478. * max_insert_length is used only for compression levels <= 3.
  4479. */
  4480. this.level = 0; /* compression level (1..9) */
  4481. this.strategy = 0; /* favor or force Huffman coding*/
  4482. this.good_match = 0;
  4483. /* Use a faster search when the previous match is longer than this */
  4484. this.nice_match = 0; /* Stop searching when current match exceeds this */
  4485. /* used by trees.c: */
  4486. /* Didn't use ct_data typedef below to suppress compiler warning */
  4487. // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
  4488. // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
  4489. // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
  4490. // Use flat array of DOUBLE size, with interleaved fata,
  4491. // because JS does not support effective
  4492. this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);
  4493. this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2);
  4494. this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2);
  4495. zero(this.dyn_ltree);
  4496. zero(this.dyn_dtree);
  4497. zero(this.bl_tree);
  4498. this.l_desc = null; /* desc. for literal tree */
  4499. this.d_desc = null; /* desc. for distance tree */
  4500. this.bl_desc = null; /* desc. for bit length tree */
  4501. //ush bl_count[MAX_BITS+1];
  4502. this.bl_count = new utils.Buf16(MAX_BITS+1);
  4503. /* number of codes at each bit length for an optimal tree */
  4504. //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
  4505. this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */
  4506. zero(this.heap);
  4507. this.heap_len = 0; /* number of elements in the heap */
  4508. this.heap_max = 0; /* element of largest frequency */
  4509. /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
  4510. * The same heap array is used to build all trees.
  4511. */
  4512. this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1];
  4513. zero(this.depth);
  4514. /* Depth of each subtree used as tie breaker for trees of equal frequency
  4515. */
  4516. this.l_buf = 0; /* buffer index for literals or lengths */
  4517. this.lit_bufsize = 0;
  4518. /* Size of match buffer for literals/lengths. There are 4 reasons for
  4519. * limiting lit_bufsize to 64K:
  4520. * - frequencies can be kept in 16 bit counters
  4521. * - if compression is not successful for the first block, all input
  4522. * data is still in the window so we can still emit a stored block even
  4523. * when input comes from standard input. (This can also be done for
  4524. * all blocks if lit_bufsize is not greater than 32K.)
  4525. * - if compression is not successful for a file smaller than 64K, we can
  4526. * even emit a stored file instead of a stored block (saving 5 bytes).
  4527. * This is applicable only for zip (not gzip or zlib).
  4528. * - creating new Huffman trees less frequently may not provide fast
  4529. * adaptation to changes in the input data statistics. (Take for
  4530. * example a binary file with poorly compressible code followed by
  4531. * a highly compressible string table.) Smaller buffer sizes give
  4532. * fast adaptation but have of course the overhead of transmitting
  4533. * trees more frequently.
  4534. * - I can't count above 4
  4535. */
  4536. this.last_lit = 0; /* running index in l_buf */
  4537. this.d_buf = 0;
  4538. /* Buffer index for distances. To simplify the code, d_buf and l_buf have
  4539. * the same number of elements. To use different lengths, an extra flag
  4540. * array would be necessary.
  4541. */
  4542. this.opt_len = 0; /* bit length of current block with optimal trees */
  4543. this.static_len = 0; /* bit length of current block with static trees */
  4544. this.matches = 0; /* number of string matches in current block */
  4545. this.insert = 0; /* bytes at end of window left to insert */
  4546. this.bi_buf = 0;
  4547. /* Output buffer. bits are inserted starting at the bottom (least
  4548. * significant bits).
  4549. */
  4550. this.bi_valid = 0;
  4551. /* Number of valid bits in bi_buf. All bits above the last valid bit
  4552. * are always zero.
  4553. */
  4554. // Used for window memory init. We safely ignore it for JS. That makes
  4555. // sense only for pointers and memory check tools.
  4556. //this.high_water = 0;
  4557. /* High water mark offset in window for initialized bytes -- bytes above
  4558. * this are set to zero in order to avoid memory check warnings when
  4559. * longest match routines access bytes past the input. This is then
  4560. * updated to the new high water mark.
  4561. */
  4562. }
  4563. function deflateResetKeep(strm) {
  4564. var s;
  4565. if (!strm || !strm.state) {
  4566. return err(strm, Z_STREAM_ERROR);
  4567. }
  4568. strm.total_in = strm.total_out = 0;
  4569. strm.data_type = Z_UNKNOWN;
  4570. s = strm.state;
  4571. s.pending = 0;
  4572. s.pending_out = 0;
  4573. if (s.wrap < 0) {
  4574. s.wrap = -s.wrap;
  4575. /* was made negative by deflate(..., Z_FINISH); */
  4576. }
  4577. s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
  4578. strm.adler = (s.wrap === 2) ?
  4579. 0 // crc32(0, Z_NULL, 0)
  4580. :
  4581. 1; // adler32(0, Z_NULL, 0)
  4582. s.last_flush = Z_NO_FLUSH;
  4583. trees._tr_init(s);
  4584. return Z_OK;
  4585. }
  4586. function deflateReset(strm) {
  4587. var ret = deflateResetKeep(strm);
  4588. if (ret === Z_OK) {
  4589. lm_init(strm.state);
  4590. }
  4591. return ret;
  4592. }
  4593. function deflateSetHeader(strm, head) {
  4594. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  4595. if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
  4596. strm.state.gzhead = head;
  4597. return Z_OK;
  4598. }
  4599. function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
  4600. if (!strm) { // === Z_NULL
  4601. return Z_STREAM_ERROR;
  4602. }
  4603. var wrap = 1;
  4604. if (level === Z_DEFAULT_COMPRESSION) {
  4605. level = 6;
  4606. }
  4607. if (windowBits < 0) { /* suppress zlib wrapper */
  4608. wrap = 0;
  4609. windowBits = -windowBits;
  4610. }
  4611. else if (windowBits > 15) {
  4612. wrap = 2; /* write gzip wrapper instead */
  4613. windowBits -= 16;
  4614. }
  4615. if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
  4616. windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
  4617. strategy < 0 || strategy > Z_FIXED) {
  4618. return err(strm, Z_STREAM_ERROR);
  4619. }
  4620. if (windowBits === 8) {
  4621. windowBits = 9;
  4622. }
  4623. /* until 256-byte window bug fixed */
  4624. var s = new DeflateState();
  4625. strm.state = s;
  4626. s.strm = strm;
  4627. s.wrap = wrap;
  4628. s.gzhead = null;
  4629. s.w_bits = windowBits;
  4630. s.w_size = 1 << s.w_bits;
  4631. s.w_mask = s.w_size - 1;
  4632. s.hash_bits = memLevel + 7;
  4633. s.hash_size = 1 << s.hash_bits;
  4634. s.hash_mask = s.hash_size - 1;
  4635. s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
  4636. s.window = new utils.Buf8(s.w_size * 2);
  4637. s.head = new utils.Buf16(s.hash_size);
  4638. s.prev = new utils.Buf16(s.w_size);
  4639. // Don't need mem init magic for JS.
  4640. //s.high_water = 0; /* nothing written to s->window yet */
  4641. s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
  4642. s.pending_buf_size = s.lit_bufsize * 4;
  4643. s.pending_buf = new utils.Buf8(s.pending_buf_size);
  4644. s.d_buf = s.lit_bufsize >> 1;
  4645. s.l_buf = (1 + 2) * s.lit_bufsize;
  4646. s.level = level;
  4647. s.strategy = strategy;
  4648. s.method = method;
  4649. return deflateReset(strm);
  4650. }
  4651. function deflateInit(strm, level) {
  4652. return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
  4653. }
  4654. function deflate(strm, flush) {
  4655. var old_flush, s;
  4656. var beg, val; // for gzip header write only
  4657. if (!strm || !strm.state ||
  4658. flush > Z_BLOCK || flush < 0) {
  4659. return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
  4660. }
  4661. s = strm.state;
  4662. if (!strm.output ||
  4663. (!strm.input && strm.avail_in !== 0) ||
  4664. (s.status === FINISH_STATE && flush !== Z_FINISH)) {
  4665. return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
  4666. }
  4667. s.strm = strm; /* just in case */
  4668. old_flush = s.last_flush;
  4669. s.last_flush = flush;
  4670. /* Write the header */
  4671. if (s.status === INIT_STATE) {
  4672. if (s.wrap === 2) { // GZIP header
  4673. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  4674. put_byte(s, 31);
  4675. put_byte(s, 139);
  4676. put_byte(s, 8);
  4677. if (!s.gzhead) { // s->gzhead == Z_NULL
  4678. put_byte(s, 0);
  4679. put_byte(s, 0);
  4680. put_byte(s, 0);
  4681. put_byte(s, 0);
  4682. put_byte(s, 0);
  4683. put_byte(s, s.level === 9 ? 2 :
  4684. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  4685. 4 : 0));
  4686. put_byte(s, OS_CODE);
  4687. s.status = BUSY_STATE;
  4688. }
  4689. else {
  4690. put_byte(s, (s.gzhead.text ? 1 : 0) +
  4691. (s.gzhead.hcrc ? 2 : 0) +
  4692. (!s.gzhead.extra ? 0 : 4) +
  4693. (!s.gzhead.name ? 0 : 8) +
  4694. (!s.gzhead.comment ? 0 : 16)
  4695. );
  4696. put_byte(s, s.gzhead.time & 0xff);
  4697. put_byte(s, (s.gzhead.time >> 8) & 0xff);
  4698. put_byte(s, (s.gzhead.time >> 16) & 0xff);
  4699. put_byte(s, (s.gzhead.time >> 24) & 0xff);
  4700. put_byte(s, s.level === 9 ? 2 :
  4701. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  4702. 4 : 0));
  4703. put_byte(s, s.gzhead.os & 0xff);
  4704. if (s.gzhead.extra && s.gzhead.extra.length) {
  4705. put_byte(s, s.gzhead.extra.length & 0xff);
  4706. put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
  4707. }
  4708. if (s.gzhead.hcrc) {
  4709. strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
  4710. }
  4711. s.gzindex = 0;
  4712. s.status = EXTRA_STATE;
  4713. }
  4714. }
  4715. else // DEFLATE header
  4716. {
  4717. var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
  4718. var level_flags = -1;
  4719. if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
  4720. level_flags = 0;
  4721. } else if (s.level < 6) {
  4722. level_flags = 1;
  4723. } else if (s.level === 6) {
  4724. level_flags = 2;
  4725. } else {
  4726. level_flags = 3;
  4727. }
  4728. header |= (level_flags << 6);
  4729. if (s.strstart !== 0) { header |= PRESET_DICT; }
  4730. header += 31 - (header % 31);
  4731. s.status = BUSY_STATE;
  4732. putShortMSB(s, header);
  4733. /* Save the adler32 of the preset dictionary: */
  4734. if (s.strstart !== 0) {
  4735. putShortMSB(s, strm.adler >>> 16);
  4736. putShortMSB(s, strm.adler & 0xffff);
  4737. }
  4738. strm.adler = 1; // adler32(0L, Z_NULL, 0);
  4739. }
  4740. }
  4741. //#ifdef GZIP
  4742. if (s.status === EXTRA_STATE) {
  4743. if (s.gzhead.extra/* != Z_NULL*/) {
  4744. beg = s.pending; /* start of bytes to update crc */
  4745. while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
  4746. if (s.pending === s.pending_buf_size) {
  4747. if (s.gzhead.hcrc && s.pending > beg) {
  4748. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4749. }
  4750. flush_pending(strm);
  4751. beg = s.pending;
  4752. if (s.pending === s.pending_buf_size) {
  4753. break;
  4754. }
  4755. }
  4756. put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
  4757. s.gzindex++;
  4758. }
  4759. if (s.gzhead.hcrc && s.pending > beg) {
  4760. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4761. }
  4762. if (s.gzindex === s.gzhead.extra.length) {
  4763. s.gzindex = 0;
  4764. s.status = NAME_STATE;
  4765. }
  4766. }
  4767. else {
  4768. s.status = NAME_STATE;
  4769. }
  4770. }
  4771. if (s.status === NAME_STATE) {
  4772. if (s.gzhead.name/* != Z_NULL*/) {
  4773. beg = s.pending; /* start of bytes to update crc */
  4774. //int val;
  4775. do {
  4776. if (s.pending === s.pending_buf_size) {
  4777. if (s.gzhead.hcrc && s.pending > beg) {
  4778. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4779. }
  4780. flush_pending(strm);
  4781. beg = s.pending;
  4782. if (s.pending === s.pending_buf_size) {
  4783. val = 1;
  4784. break;
  4785. }
  4786. }
  4787. // JS specific: little magic to add zero terminator to end of string
  4788. if (s.gzindex < s.gzhead.name.length) {
  4789. val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
  4790. } else {
  4791. val = 0;
  4792. }
  4793. put_byte(s, val);
  4794. } while (val !== 0);
  4795. if (s.gzhead.hcrc && s.pending > beg){
  4796. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4797. }
  4798. if (val === 0) {
  4799. s.gzindex = 0;
  4800. s.status = COMMENT_STATE;
  4801. }
  4802. }
  4803. else {
  4804. s.status = COMMENT_STATE;
  4805. }
  4806. }
  4807. if (s.status === COMMENT_STATE) {
  4808. if (s.gzhead.comment/* != Z_NULL*/) {
  4809. beg = s.pending; /* start of bytes to update crc */
  4810. //int val;
  4811. do {
  4812. if (s.pending === s.pending_buf_size) {
  4813. if (s.gzhead.hcrc && s.pending > beg) {
  4814. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4815. }
  4816. flush_pending(strm);
  4817. beg = s.pending;
  4818. if (s.pending === s.pending_buf_size) {
  4819. val = 1;
  4820. break;
  4821. }
  4822. }
  4823. // JS specific: little magic to add zero terminator to end of string
  4824. if (s.gzindex < s.gzhead.comment.length) {
  4825. val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
  4826. } else {
  4827. val = 0;
  4828. }
  4829. put_byte(s, val);
  4830. } while (val !== 0);
  4831. if (s.gzhead.hcrc && s.pending > beg) {
  4832. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  4833. }
  4834. if (val === 0) {
  4835. s.status = HCRC_STATE;
  4836. }
  4837. }
  4838. else {
  4839. s.status = HCRC_STATE;
  4840. }
  4841. }
  4842. if (s.status === HCRC_STATE) {
  4843. if (s.gzhead.hcrc) {
  4844. if (s.pending + 2 > s.pending_buf_size) {
  4845. flush_pending(strm);
  4846. }
  4847. if (s.pending + 2 <= s.pending_buf_size) {
  4848. put_byte(s, strm.adler & 0xff);
  4849. put_byte(s, (strm.adler >> 8) & 0xff);
  4850. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  4851. s.status = BUSY_STATE;
  4852. }
  4853. }
  4854. else {
  4855. s.status = BUSY_STATE;
  4856. }
  4857. }
  4858. //#endif
  4859. /* Flush as much pending output as possible */
  4860. if (s.pending !== 0) {
  4861. flush_pending(strm);
  4862. if (strm.avail_out === 0) {
  4863. /* Since avail_out is 0, deflate will be called again with
  4864. * more output space, but possibly with both pending and
  4865. * avail_in equal to zero. There won't be anything to do,
  4866. * but this is not an error situation so make sure we
  4867. * return OK instead of BUF_ERROR at next call of deflate:
  4868. */
  4869. s.last_flush = -1;
  4870. return Z_OK;
  4871. }
  4872. /* Make sure there is something to do and avoid duplicate consecutive
  4873. * flushes. For repeated and useless calls with Z_FINISH, we keep
  4874. * returning Z_STREAM_END instead of Z_BUF_ERROR.
  4875. */
  4876. } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
  4877. flush !== Z_FINISH) {
  4878. return err(strm, Z_BUF_ERROR);
  4879. }
  4880. /* User must not provide more input after the first FINISH: */
  4881. if (s.status === FINISH_STATE && strm.avail_in !== 0) {
  4882. return err(strm, Z_BUF_ERROR);
  4883. }
  4884. /* Start a new block or continue the current one.
  4885. */
  4886. if (strm.avail_in !== 0 || s.lookahead !== 0 ||
  4887. (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
  4888. var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
  4889. (s.strategy === Z_RLE ? deflate_rle(s, flush) :
  4890. configuration_table[s.level].func(s, flush));
  4891. if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
  4892. s.status = FINISH_STATE;
  4893. }
  4894. if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
  4895. if (strm.avail_out === 0) {
  4896. s.last_flush = -1;
  4897. /* avoid BUF_ERROR next call, see above */
  4898. }
  4899. return Z_OK;
  4900. /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
  4901. * of deflate should use the same flush parameter to make sure
  4902. * that the flush is complete. So we don't have to output an
  4903. * empty block here, this will be done at next call. This also
  4904. * ensures that for a very small output buffer, we emit at most
  4905. * one empty block.
  4906. */
  4907. }
  4908. if (bstate === BS_BLOCK_DONE) {
  4909. if (flush === Z_PARTIAL_FLUSH) {
  4910. trees._tr_align(s);
  4911. }
  4912. else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
  4913. trees._tr_stored_block(s, 0, 0, false);
  4914. /* For a full flush, this empty block will be recognized
  4915. * as a special marker by inflate_sync().
  4916. */
  4917. if (flush === Z_FULL_FLUSH) {
  4918. /*** CLEAR_HASH(s); ***/ /* forget history */
  4919. zero(s.head); // Fill with NIL (= 0);
  4920. if (s.lookahead === 0) {
  4921. s.strstart = 0;
  4922. s.block_start = 0;
  4923. s.insert = 0;
  4924. }
  4925. }
  4926. }
  4927. flush_pending(strm);
  4928. if (strm.avail_out === 0) {
  4929. s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
  4930. return Z_OK;
  4931. }
  4932. }
  4933. }
  4934. //Assert(strm->avail_out > 0, "bug2");
  4935. //if (strm.avail_out <= 0) { throw new Error("bug2");}
  4936. if (flush !== Z_FINISH) { return Z_OK; }
  4937. if (s.wrap <= 0) { return Z_STREAM_END; }
  4938. /* Write the trailer */
  4939. if (s.wrap === 2) {
  4940. put_byte(s, strm.adler & 0xff);
  4941. put_byte(s, (strm.adler >> 8) & 0xff);
  4942. put_byte(s, (strm.adler >> 16) & 0xff);
  4943. put_byte(s, (strm.adler >> 24) & 0xff);
  4944. put_byte(s, strm.total_in & 0xff);
  4945. put_byte(s, (strm.total_in >> 8) & 0xff);
  4946. put_byte(s, (strm.total_in >> 16) & 0xff);
  4947. put_byte(s, (strm.total_in >> 24) & 0xff);
  4948. }
  4949. else
  4950. {
  4951. putShortMSB(s, strm.adler >>> 16);
  4952. putShortMSB(s, strm.adler & 0xffff);
  4953. }
  4954. flush_pending(strm);
  4955. /* If avail_out is zero, the application will call deflate again
  4956. * to flush the rest.
  4957. */
  4958. if (s.wrap > 0) { s.wrap = -s.wrap; }
  4959. /* write the trailer only once! */
  4960. return s.pending !== 0 ? Z_OK : Z_STREAM_END;
  4961. }
  4962. function deflateEnd(strm) {
  4963. var status;
  4964. if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
  4965. return Z_STREAM_ERROR;
  4966. }
  4967. status = strm.state.status;
  4968. if (status !== INIT_STATE &&
  4969. status !== EXTRA_STATE &&
  4970. status !== NAME_STATE &&
  4971. status !== COMMENT_STATE &&
  4972. status !== HCRC_STATE &&
  4973. status !== BUSY_STATE &&
  4974. status !== FINISH_STATE
  4975. ) {
  4976. return err(strm, Z_STREAM_ERROR);
  4977. }
  4978. strm.state = null;
  4979. return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
  4980. }
  4981. /* =========================================================================
  4982. * Copy the source state to the destination state
  4983. */
  4984. //function deflateCopy(dest, source) {
  4985. //
  4986. //}
  4987. exports.deflateInit = deflateInit;
  4988. exports.deflateInit2 = deflateInit2;
  4989. exports.deflateReset = deflateReset;
  4990. exports.deflateResetKeep = deflateResetKeep;
  4991. exports.deflateSetHeader = deflateSetHeader;
  4992. exports.deflate = deflate;
  4993. exports.deflateEnd = deflateEnd;
  4994. exports.deflateInfo = 'pako deflate (from Nodeca project)';
  4995. /* Not implemented
  4996. exports.deflateBound = deflateBound;
  4997. exports.deflateCopy = deflateCopy;
  4998. exports.deflateSetDictionary = deflateSetDictionary;
  4999. exports.deflateParams = deflateParams;
  5000. exports.deflatePending = deflatePending;
  5001. exports.deflatePrime = deflatePrime;
  5002. exports.deflateTune = deflateTune;
  5003. */
  5004. },{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){
  5005. 'use strict';
  5006. function GZheader() {
  5007. /* true if compressed data believed to be text */
  5008. this.text = 0;
  5009. /* modification time */
  5010. this.time = 0;
  5011. /* extra flags (not used when writing a gzip file) */
  5012. this.xflags = 0;
  5013. /* operating system */
  5014. this.os = 0;
  5015. /* pointer to extra field or Z_NULL if none */
  5016. this.extra = null;
  5017. /* extra field length (valid if extra != Z_NULL) */
  5018. this.extra_len = 0; // Actually, we don't need it in JS,
  5019. // but leave for few code modifications
  5020. //
  5021. // Setup limits is not necessary because in js we should not preallocate memory
  5022. // for inflate use constant limit in 65536 bytes
  5023. //
  5024. /* space at extra (only when reading header) */
  5025. // this.extra_max = 0;
  5026. /* pointer to zero-terminated file name or Z_NULL */
  5027. this.name = '';
  5028. /* space at name (only when reading header) */
  5029. // this.name_max = 0;
  5030. /* pointer to zero-terminated comment or Z_NULL */
  5031. this.comment = '';
  5032. /* space at comment (only when reading header) */
  5033. // this.comm_max = 0;
  5034. /* true if there was or will be a header crc */
  5035. this.hcrc = 0;
  5036. /* true when done reading gzip header (not used when writing a gzip file) */
  5037. this.done = false;
  5038. }
  5039. module.exports = GZheader;
  5040. },{}],34:[function(_dereq_,module,exports){
  5041. 'use strict';
  5042. // See state defs from inflate.js
  5043. var BAD = 30; /* got a data error -- remain here until reset */
  5044. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  5045. /*
  5046. Decode literal, length, and distance codes and write out the resulting
  5047. literal and match bytes until either not enough input or output is
  5048. available, an end-of-block is encountered, or a data error is encountered.
  5049. When large enough input and output buffers are supplied to inflate(), for
  5050. example, a 16K input buffer and a 64K output buffer, more than 95% of the
  5051. inflate execution time is spent in this routine.
  5052. Entry assumptions:
  5053. state.mode === LEN
  5054. strm.avail_in >= 6
  5055. strm.avail_out >= 258
  5056. start >= strm.avail_out
  5057. state.bits < 8
  5058. On return, state.mode is one of:
  5059. LEN -- ran out of enough output space or enough available input
  5060. TYPE -- reached end of block code, inflate() to interpret next block
  5061. BAD -- error in block data
  5062. Notes:
  5063. - The maximum input bits used by a length/distance pair is 15 bits for the
  5064. length code, 5 bits for the length extra, 15 bits for the distance code,
  5065. and 13 bits for the distance extra. This totals 48 bits, or six bytes.
  5066. Therefore if strm.avail_in >= 6, then there is enough input to avoid
  5067. checking for available input while decoding.
  5068. - The maximum bytes that a single length/distance pair can output is 258
  5069. bytes, which is the maximum length that can be coded. inflate_fast()
  5070. requires strm.avail_out >= 258 for each loop to avoid checking for
  5071. output space.
  5072. */
  5073. module.exports = function inflate_fast(strm, start) {
  5074. var state;
  5075. var _in; /* local strm.input */
  5076. var last; /* have enough input while in < last */
  5077. var _out; /* local strm.output */
  5078. var beg; /* inflate()'s initial strm.output */
  5079. var end; /* while out < end, enough space available */
  5080. //#ifdef INFLATE_STRICT
  5081. var dmax; /* maximum distance from zlib header */
  5082. //#endif
  5083. var wsize; /* window size or zero if not using window */
  5084. var whave; /* valid bytes in the window */
  5085. var wnext; /* window write index */
  5086. var window; /* allocated sliding window, if wsize != 0 */
  5087. var hold; /* local strm.hold */
  5088. var bits; /* local strm.bits */
  5089. var lcode; /* local strm.lencode */
  5090. var dcode; /* local strm.distcode */
  5091. var lmask; /* mask for first level of length codes */
  5092. var dmask; /* mask for first level of distance codes */
  5093. var here; /* retrieved table entry */
  5094. var op; /* code bits, operation, extra bits, or */
  5095. /* window position, window bytes to copy */
  5096. var len; /* match length, unused bytes */
  5097. var dist; /* match distance */
  5098. var from; /* where to copy match from */
  5099. var from_source;
  5100. var input, output; // JS specific, because we have no pointers
  5101. /* copy state to local variables */
  5102. state = strm.state;
  5103. //here = state.here;
  5104. _in = strm.next_in;
  5105. input = strm.input;
  5106. last = _in + (strm.avail_in - 5);
  5107. _out = strm.next_out;
  5108. output = strm.output;
  5109. beg = _out - (start - strm.avail_out);
  5110. end = _out + (strm.avail_out - 257);
  5111. //#ifdef INFLATE_STRICT
  5112. dmax = state.dmax;
  5113. //#endif
  5114. wsize = state.wsize;
  5115. whave = state.whave;
  5116. wnext = state.wnext;
  5117. window = state.window;
  5118. hold = state.hold;
  5119. bits = state.bits;
  5120. lcode = state.lencode;
  5121. dcode = state.distcode;
  5122. lmask = (1 << state.lenbits) - 1;
  5123. dmask = (1 << state.distbits) - 1;
  5124. /* decode literals and length/distances until end-of-block or not enough
  5125. input data or output space */
  5126. top:
  5127. do {
  5128. if (bits < 15) {
  5129. hold += input[_in++] << bits;
  5130. bits += 8;
  5131. hold += input[_in++] << bits;
  5132. bits += 8;
  5133. }
  5134. here = lcode[hold & lmask];
  5135. dolen:
  5136. for (;;) { // Goto emulation
  5137. op = here >>> 24/*here.bits*/;
  5138. hold >>>= op;
  5139. bits -= op;
  5140. op = (here >>> 16) & 0xff/*here.op*/;
  5141. if (op === 0) { /* literal */
  5142. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  5143. // "inflate: literal '%c'\n" :
  5144. // "inflate: literal 0x%02x\n", here.val));
  5145. output[_out++] = here & 0xffff/*here.val*/;
  5146. }
  5147. else if (op & 16) { /* length base */
  5148. len = here & 0xffff/*here.val*/;
  5149. op &= 15; /* number of extra bits */
  5150. if (op) {
  5151. if (bits < op) {
  5152. hold += input[_in++] << bits;
  5153. bits += 8;
  5154. }
  5155. len += hold & ((1 << op) - 1);
  5156. hold >>>= op;
  5157. bits -= op;
  5158. }
  5159. //Tracevv((stderr, "inflate: length %u\n", len));
  5160. if (bits < 15) {
  5161. hold += input[_in++] << bits;
  5162. bits += 8;
  5163. hold += input[_in++] << bits;
  5164. bits += 8;
  5165. }
  5166. here = dcode[hold & dmask];
  5167. dodist:
  5168. for (;;) { // goto emulation
  5169. op = here >>> 24/*here.bits*/;
  5170. hold >>>= op;
  5171. bits -= op;
  5172. op = (here >>> 16) & 0xff/*here.op*/;
  5173. if (op & 16) { /* distance base */
  5174. dist = here & 0xffff/*here.val*/;
  5175. op &= 15; /* number of extra bits */
  5176. if (bits < op) {
  5177. hold += input[_in++] << bits;
  5178. bits += 8;
  5179. if (bits < op) {
  5180. hold += input[_in++] << bits;
  5181. bits += 8;
  5182. }
  5183. }
  5184. dist += hold & ((1 << op) - 1);
  5185. //#ifdef INFLATE_STRICT
  5186. if (dist > dmax) {
  5187. strm.msg = 'invalid distance too far back';
  5188. state.mode = BAD;
  5189. break top;
  5190. }
  5191. //#endif
  5192. hold >>>= op;
  5193. bits -= op;
  5194. //Tracevv((stderr, "inflate: distance %u\n", dist));
  5195. op = _out - beg; /* max distance in output */
  5196. if (dist > op) { /* see if copy from window */
  5197. op = dist - op; /* distance back in window */
  5198. if (op > whave) {
  5199. if (state.sane) {
  5200. strm.msg = 'invalid distance too far back';
  5201. state.mode = BAD;
  5202. break top;
  5203. }
  5204. // (!) This block is disabled in zlib defailts,
  5205. // don't enable it for binary compatibility
  5206. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  5207. // if (len <= op - whave) {
  5208. // do {
  5209. // output[_out++] = 0;
  5210. // } while (--len);
  5211. // continue top;
  5212. // }
  5213. // len -= op - whave;
  5214. // do {
  5215. // output[_out++] = 0;
  5216. // } while (--op > whave);
  5217. // if (op === 0) {
  5218. // from = _out - dist;
  5219. // do {
  5220. // output[_out++] = output[from++];
  5221. // } while (--len);
  5222. // continue top;
  5223. // }
  5224. //#endif
  5225. }
  5226. from = 0; // window index
  5227. from_source = window;
  5228. if (wnext === 0) { /* very common case */
  5229. from += wsize - op;
  5230. if (op < len) { /* some from window */
  5231. len -= op;
  5232. do {
  5233. output[_out++] = window[from++];
  5234. } while (--op);
  5235. from = _out - dist; /* rest from output */
  5236. from_source = output;
  5237. }
  5238. }
  5239. else if (wnext < op) { /* wrap around window */
  5240. from += wsize + wnext - op;
  5241. op -= wnext;
  5242. if (op < len) { /* some from end of window */
  5243. len -= op;
  5244. do {
  5245. output[_out++] = window[from++];
  5246. } while (--op);
  5247. from = 0;
  5248. if (wnext < len) { /* some from start of window */
  5249. op = wnext;
  5250. len -= op;
  5251. do {
  5252. output[_out++] = window[from++];
  5253. } while (--op);
  5254. from = _out - dist; /* rest from output */
  5255. from_source = output;
  5256. }
  5257. }
  5258. }
  5259. else { /* contiguous in window */
  5260. from += wnext - op;
  5261. if (op < len) { /* some from window */
  5262. len -= op;
  5263. do {
  5264. output[_out++] = window[from++];
  5265. } while (--op);
  5266. from = _out - dist; /* rest from output */
  5267. from_source = output;
  5268. }
  5269. }
  5270. while (len > 2) {
  5271. output[_out++] = from_source[from++];
  5272. output[_out++] = from_source[from++];
  5273. output[_out++] = from_source[from++];
  5274. len -= 3;
  5275. }
  5276. if (len) {
  5277. output[_out++] = from_source[from++];
  5278. if (len > 1) {
  5279. output[_out++] = from_source[from++];
  5280. }
  5281. }
  5282. }
  5283. else {
  5284. from = _out - dist; /* copy direct from output */
  5285. do { /* minimum length is three */
  5286. output[_out++] = output[from++];
  5287. output[_out++] = output[from++];
  5288. output[_out++] = output[from++];
  5289. len -= 3;
  5290. } while (len > 2);
  5291. if (len) {
  5292. output[_out++] = output[from++];
  5293. if (len > 1) {
  5294. output[_out++] = output[from++];
  5295. }
  5296. }
  5297. }
  5298. }
  5299. else if ((op & 64) === 0) { /* 2nd level distance code */
  5300. here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  5301. continue dodist;
  5302. }
  5303. else {
  5304. strm.msg = 'invalid distance code';
  5305. state.mode = BAD;
  5306. break top;
  5307. }
  5308. break; // need to emulate goto via "continue"
  5309. }
  5310. }
  5311. else if ((op & 64) === 0) { /* 2nd level length code */
  5312. here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  5313. continue dolen;
  5314. }
  5315. else if (op & 32) { /* end-of-block */
  5316. //Tracevv((stderr, "inflate: end of block\n"));
  5317. state.mode = TYPE;
  5318. break top;
  5319. }
  5320. else {
  5321. strm.msg = 'invalid literal/length code';
  5322. state.mode = BAD;
  5323. break top;
  5324. }
  5325. break; // need to emulate goto via "continue"
  5326. }
  5327. } while (_in < last && _out < end);
  5328. /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
  5329. len = bits >> 3;
  5330. _in -= len;
  5331. bits -= len << 3;
  5332. hold &= (1 << bits) - 1;
  5333. /* update state and return */
  5334. strm.next_in = _in;
  5335. strm.next_out = _out;
  5336. strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
  5337. strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
  5338. state.hold = hold;
  5339. state.bits = bits;
  5340. return;
  5341. };
  5342. },{}],35:[function(_dereq_,module,exports){
  5343. 'use strict';
  5344. var utils = _dereq_('../utils/common');
  5345. var adler32 = _dereq_('./adler32');
  5346. var crc32 = _dereq_('./crc32');
  5347. var inflate_fast = _dereq_('./inffast');
  5348. var inflate_table = _dereq_('./inftrees');
  5349. var CODES = 0;
  5350. var LENS = 1;
  5351. var DISTS = 2;
  5352. /* Public constants ==========================================================*/
  5353. /* ===========================================================================*/
  5354. /* Allowed flush values; see deflate() and inflate() below for details */
  5355. //var Z_NO_FLUSH = 0;
  5356. //var Z_PARTIAL_FLUSH = 1;
  5357. //var Z_SYNC_FLUSH = 2;
  5358. //var Z_FULL_FLUSH = 3;
  5359. var Z_FINISH = 4;
  5360. var Z_BLOCK = 5;
  5361. var Z_TREES = 6;
  5362. /* Return codes for the compression/decompression functions. Negative values
  5363. * are errors, positive values are used for special but normal events.
  5364. */
  5365. var Z_OK = 0;
  5366. var Z_STREAM_END = 1;
  5367. var Z_NEED_DICT = 2;
  5368. //var Z_ERRNO = -1;
  5369. var Z_STREAM_ERROR = -2;
  5370. var Z_DATA_ERROR = -3;
  5371. var Z_MEM_ERROR = -4;
  5372. var Z_BUF_ERROR = -5;
  5373. //var Z_VERSION_ERROR = -6;
  5374. /* The deflate compression method */
  5375. var Z_DEFLATED = 8;
  5376. /* STATES ====================================================================*/
  5377. /* ===========================================================================*/
  5378. var HEAD = 1; /* i: waiting for magic header */
  5379. var FLAGS = 2; /* i: waiting for method and flags (gzip) */
  5380. var TIME = 3; /* i: waiting for modification time (gzip) */
  5381. var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
  5382. var EXLEN = 5; /* i: waiting for extra length (gzip) */
  5383. var EXTRA = 6; /* i: waiting for extra bytes (gzip) */
  5384. var NAME = 7; /* i: waiting for end of file name (gzip) */
  5385. var COMMENT = 8; /* i: waiting for end of comment (gzip) */
  5386. var HCRC = 9; /* i: waiting for header crc (gzip) */
  5387. var DICTID = 10; /* i: waiting for dictionary check value */
  5388. var DICT = 11; /* waiting for inflateSetDictionary() call */
  5389. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  5390. var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
  5391. var STORED = 14; /* i: waiting for stored size (length and complement) */
  5392. var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
  5393. var COPY = 16; /* i/o: waiting for input or output to copy stored block */
  5394. var TABLE = 17; /* i: waiting for dynamic block table lengths */
  5395. var LENLENS = 18; /* i: waiting for code length code lengths */
  5396. var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
  5397. var LEN_ = 20; /* i: same as LEN below, but only first time in */
  5398. var LEN = 21; /* i: waiting for length/lit/eob code */
  5399. var LENEXT = 22; /* i: waiting for length extra bits */
  5400. var DIST = 23; /* i: waiting for distance code */
  5401. var DISTEXT = 24; /* i: waiting for distance extra bits */
  5402. var MATCH = 25; /* o: waiting for output space to copy string */
  5403. var LIT = 26; /* o: waiting for output space to write literal */
  5404. var CHECK = 27; /* i: waiting for 32-bit check value */
  5405. var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
  5406. var DONE = 29; /* finished check, done -- remain here until reset */
  5407. var BAD = 30; /* got a data error -- remain here until reset */
  5408. var MEM = 31; /* got an inflate() memory error -- remain here until reset */
  5409. var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
  5410. /* ===========================================================================*/
  5411. var ENOUGH_LENS = 852;
  5412. var ENOUGH_DISTS = 592;
  5413. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  5414. var MAX_WBITS = 15;
  5415. /* 32K LZ77 window */
  5416. var DEF_WBITS = MAX_WBITS;
  5417. function ZSWAP32(q) {
  5418. return (((q >>> 24) & 0xff) +
  5419. ((q >>> 8) & 0xff00) +
  5420. ((q & 0xff00) << 8) +
  5421. ((q & 0xff) << 24));
  5422. }
  5423. function InflateState() {
  5424. this.mode = 0; /* current inflate mode */
  5425. this.last = false; /* true if processing last block */
  5426. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  5427. this.havedict = false; /* true if dictionary provided */
  5428. this.flags = 0; /* gzip header method and flags (0 if zlib) */
  5429. this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
  5430. this.check = 0; /* protected copy of check value */
  5431. this.total = 0; /* protected copy of output count */
  5432. // TODO: may be {}
  5433. this.head = null; /* where to save gzip header information */
  5434. /* sliding window */
  5435. this.wbits = 0; /* log base 2 of requested window size */
  5436. this.wsize = 0; /* window size or zero if not using window */
  5437. this.whave = 0; /* valid bytes in the window */
  5438. this.wnext = 0; /* window write index */
  5439. this.window = null; /* allocated sliding window, if needed */
  5440. /* bit accumulator */
  5441. this.hold = 0; /* input bit accumulator */
  5442. this.bits = 0; /* number of bits in "in" */
  5443. /* for string and stored block copying */
  5444. this.length = 0; /* literal or length of data to copy */
  5445. this.offset = 0; /* distance back to copy string from */
  5446. /* for table and code decoding */
  5447. this.extra = 0; /* extra bits needed */
  5448. /* fixed and dynamic code tables */
  5449. this.lencode = null; /* starting table for length/literal codes */
  5450. this.distcode = null; /* starting table for distance codes */
  5451. this.lenbits = 0; /* index bits for lencode */
  5452. this.distbits = 0; /* index bits for distcode */
  5453. /* dynamic table building */
  5454. this.ncode = 0; /* number of code length code lengths */
  5455. this.nlen = 0; /* number of length code lengths */
  5456. this.ndist = 0; /* number of distance code lengths */
  5457. this.have = 0; /* number of code lengths in lens[] */
  5458. this.next = null; /* next available space in codes[] */
  5459. this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
  5460. this.work = new utils.Buf16(288); /* work area for code table building */
  5461. /*
  5462. because we don't have pointers in js, we use lencode and distcode directly
  5463. as buffers so we don't need codes
  5464. */
  5465. //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
  5466. this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
  5467. this.distdyn = null; /* dynamic table for distance codes (JS specific) */
  5468. this.sane = 0; /* if false, allow invalid distance too far */
  5469. this.back = 0; /* bits back of last unprocessed length/lit */
  5470. this.was = 0; /* initial length of match */
  5471. }
  5472. function inflateResetKeep(strm) {
  5473. var state;
  5474. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  5475. state = strm.state;
  5476. strm.total_in = strm.total_out = state.total = 0;
  5477. strm.msg = ''; /*Z_NULL*/
  5478. if (state.wrap) { /* to support ill-conceived Java test suite */
  5479. strm.adler = state.wrap & 1;
  5480. }
  5481. state.mode = HEAD;
  5482. state.last = 0;
  5483. state.havedict = 0;
  5484. state.dmax = 32768;
  5485. state.head = null/*Z_NULL*/;
  5486. state.hold = 0;
  5487. state.bits = 0;
  5488. //state.lencode = state.distcode = state.next = state.codes;
  5489. state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
  5490. state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
  5491. state.sane = 1;
  5492. state.back = -1;
  5493. //Tracev((stderr, "inflate: reset\n"));
  5494. return Z_OK;
  5495. }
  5496. function inflateReset(strm) {
  5497. var state;
  5498. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  5499. state = strm.state;
  5500. state.wsize = 0;
  5501. state.whave = 0;
  5502. state.wnext = 0;
  5503. return inflateResetKeep(strm);
  5504. }
  5505. function inflateReset2(strm, windowBits) {
  5506. var wrap;
  5507. var state;
  5508. /* get the state */
  5509. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  5510. state = strm.state;
  5511. /* extract wrap request from windowBits parameter */
  5512. if (windowBits < 0) {
  5513. wrap = 0;
  5514. windowBits = -windowBits;
  5515. }
  5516. else {
  5517. wrap = (windowBits >> 4) + 1;
  5518. if (windowBits < 48) {
  5519. windowBits &= 15;
  5520. }
  5521. }
  5522. /* set number of window bits, free window if different */
  5523. if (windowBits && (windowBits < 8 || windowBits > 15)) {
  5524. return Z_STREAM_ERROR;
  5525. }
  5526. if (state.window !== null && state.wbits !== windowBits) {
  5527. state.window = null;
  5528. }
  5529. /* update state and reset the rest of it */
  5530. state.wrap = wrap;
  5531. state.wbits = windowBits;
  5532. return inflateReset(strm);
  5533. }
  5534. function inflateInit2(strm, windowBits) {
  5535. var ret;
  5536. var state;
  5537. if (!strm) { return Z_STREAM_ERROR; }
  5538. //strm.msg = Z_NULL; /* in case we return an error */
  5539. state = new InflateState();
  5540. //if (state === Z_NULL) return Z_MEM_ERROR;
  5541. //Tracev((stderr, "inflate: allocated\n"));
  5542. strm.state = state;
  5543. state.window = null/*Z_NULL*/;
  5544. ret = inflateReset2(strm, windowBits);
  5545. if (ret !== Z_OK) {
  5546. strm.state = null/*Z_NULL*/;
  5547. }
  5548. return ret;
  5549. }
  5550. function inflateInit(strm) {
  5551. return inflateInit2(strm, DEF_WBITS);
  5552. }
  5553. /*
  5554. Return state with length and distance decoding tables and index sizes set to
  5555. fixed code decoding. Normally this returns fixed tables from inffixed.h.
  5556. If BUILDFIXED is defined, then instead this routine builds the tables the
  5557. first time it's called, and returns those tables the first time and
  5558. thereafter. This reduces the size of the code by about 2K bytes, in
  5559. exchange for a little execution time. However, BUILDFIXED should not be
  5560. used for threaded applications, since the rewriting of the tables and virgin
  5561. may not be thread-safe.
  5562. */
  5563. var virgin = true;
  5564. var lenfix, distfix; // We have no pointers in JS, so keep tables separate
  5565. function fixedtables(state) {
  5566. /* build fixed huffman tables if first call (may not be thread safe) */
  5567. if (virgin) {
  5568. var sym;
  5569. lenfix = new utils.Buf32(512);
  5570. distfix = new utils.Buf32(32);
  5571. /* literal/length table */
  5572. sym = 0;
  5573. while (sym < 144) { state.lens[sym++] = 8; }
  5574. while (sym < 256) { state.lens[sym++] = 9; }
  5575. while (sym < 280) { state.lens[sym++] = 7; }
  5576. while (sym < 288) { state.lens[sym++] = 8; }
  5577. inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9});
  5578. /* distance table */
  5579. sym = 0;
  5580. while (sym < 32) { state.lens[sym++] = 5; }
  5581. inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5});
  5582. /* do this just once */
  5583. virgin = false;
  5584. }
  5585. state.lencode = lenfix;
  5586. state.lenbits = 9;
  5587. state.distcode = distfix;
  5588. state.distbits = 5;
  5589. }
  5590. /*
  5591. Update the window with the last wsize (normally 32K) bytes written before
  5592. returning. If window does not exist yet, create it. This is only called
  5593. when a window is already in use, or when output has been written during this
  5594. inflate call, but the end of the deflate stream has not been reached yet.
  5595. It is also called to create a window for dictionary data when a dictionary
  5596. is loaded.
  5597. Providing output buffers larger than 32K to inflate() should provide a speed
  5598. advantage, since only the last 32K of output is copied to the sliding window
  5599. upon return from inflate(), and since all distances after the first 32K of
  5600. output will fall in the output data, making match copies simpler and faster.
  5601. The advantage may be dependent on the size of the processor's data caches.
  5602. */
  5603. function updatewindow(strm, src, end, copy) {
  5604. var dist;
  5605. var state = strm.state;
  5606. /* if it hasn't been done already, allocate space for the window */
  5607. if (state.window === null) {
  5608. state.wsize = 1 << state.wbits;
  5609. state.wnext = 0;
  5610. state.whave = 0;
  5611. state.window = new utils.Buf8(state.wsize);
  5612. }
  5613. /* copy state->wsize or less output bytes into the circular window */
  5614. if (copy >= state.wsize) {
  5615. utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0);
  5616. state.wnext = 0;
  5617. state.whave = state.wsize;
  5618. }
  5619. else {
  5620. dist = state.wsize - state.wnext;
  5621. if (dist > copy) {
  5622. dist = copy;
  5623. }
  5624. //zmemcpy(state->window + state->wnext, end - copy, dist);
  5625. utils.arraySet(state.window,src, end - copy, dist, state.wnext);
  5626. copy -= dist;
  5627. if (copy) {
  5628. //zmemcpy(state->window, end - copy, copy);
  5629. utils.arraySet(state.window,src, end - copy, copy, 0);
  5630. state.wnext = copy;
  5631. state.whave = state.wsize;
  5632. }
  5633. else {
  5634. state.wnext += dist;
  5635. if (state.wnext === state.wsize) { state.wnext = 0; }
  5636. if (state.whave < state.wsize) { state.whave += dist; }
  5637. }
  5638. }
  5639. return 0;
  5640. }
  5641. function inflate(strm, flush) {
  5642. var state;
  5643. var input, output; // input/output buffers
  5644. var next; /* next input INDEX */
  5645. var put; /* next output INDEX */
  5646. var have, left; /* available input and output */
  5647. var hold; /* bit buffer */
  5648. var bits; /* bits in bit buffer */
  5649. var _in, _out; /* save starting available input and output */
  5650. var copy; /* number of stored or match bytes to copy */
  5651. var from; /* where to copy match bytes from */
  5652. var from_source;
  5653. var here = 0; /* current decoding table entry */
  5654. var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
  5655. //var last; /* parent table entry */
  5656. var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
  5657. var len; /* length to copy for repeats, bits to drop */
  5658. var ret; /* return code */
  5659. var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */
  5660. var opts;
  5661. var n; // temporary var for NEED_BITS
  5662. var order = /* permutation of code lengths */
  5663. [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
  5664. if (!strm || !strm.state || !strm.output ||
  5665. (!strm.input && strm.avail_in !== 0)) {
  5666. return Z_STREAM_ERROR;
  5667. }
  5668. state = strm.state;
  5669. if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */
  5670. //--- LOAD() ---
  5671. put = strm.next_out;
  5672. output = strm.output;
  5673. left = strm.avail_out;
  5674. next = strm.next_in;
  5675. input = strm.input;
  5676. have = strm.avail_in;
  5677. hold = state.hold;
  5678. bits = state.bits;
  5679. //---
  5680. _in = have;
  5681. _out = left;
  5682. ret = Z_OK;
  5683. inf_leave: // goto emulation
  5684. for (;;) {
  5685. switch (state.mode) {
  5686. case HEAD:
  5687. if (state.wrap === 0) {
  5688. state.mode = TYPEDO;
  5689. break;
  5690. }
  5691. //=== NEEDBITS(16);
  5692. while (bits < 16) {
  5693. if (have === 0) { break inf_leave; }
  5694. have--;
  5695. hold += input[next++] << bits;
  5696. bits += 8;
  5697. }
  5698. //===//
  5699. if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
  5700. state.check = 0/*crc32(0L, Z_NULL, 0)*/;
  5701. //=== CRC2(state.check, hold);
  5702. hbuf[0] = hold & 0xff;
  5703. hbuf[1] = (hold >>> 8) & 0xff;
  5704. state.check = crc32(state.check, hbuf, 2, 0);
  5705. //===//
  5706. //=== INITBITS();
  5707. hold = 0;
  5708. bits = 0;
  5709. //===//
  5710. state.mode = FLAGS;
  5711. break;
  5712. }
  5713. state.flags = 0; /* expect zlib header */
  5714. if (state.head) {
  5715. state.head.done = false;
  5716. }
  5717. if (!(state.wrap & 1) || /* check if zlib header allowed */
  5718. (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
  5719. strm.msg = 'incorrect header check';
  5720. state.mode = BAD;
  5721. break;
  5722. }
  5723. if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
  5724. strm.msg = 'unknown compression method';
  5725. state.mode = BAD;
  5726. break;
  5727. }
  5728. //--- DROPBITS(4) ---//
  5729. hold >>>= 4;
  5730. bits -= 4;
  5731. //---//
  5732. len = (hold & 0x0f)/*BITS(4)*/ + 8;
  5733. if (state.wbits === 0) {
  5734. state.wbits = len;
  5735. }
  5736. else if (len > state.wbits) {
  5737. strm.msg = 'invalid window size';
  5738. state.mode = BAD;
  5739. break;
  5740. }
  5741. state.dmax = 1 << len;
  5742. //Tracev((stderr, "inflate: zlib header ok\n"));
  5743. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  5744. state.mode = hold & 0x200 ? DICTID : TYPE;
  5745. //=== INITBITS();
  5746. hold = 0;
  5747. bits = 0;
  5748. //===//
  5749. break;
  5750. case FLAGS:
  5751. //=== NEEDBITS(16); */
  5752. while (bits < 16) {
  5753. if (have === 0) { break inf_leave; }
  5754. have--;
  5755. hold += input[next++] << bits;
  5756. bits += 8;
  5757. }
  5758. //===//
  5759. state.flags = hold;
  5760. if ((state.flags & 0xff) !== Z_DEFLATED) {
  5761. strm.msg = 'unknown compression method';
  5762. state.mode = BAD;
  5763. break;
  5764. }
  5765. if (state.flags & 0xe000) {
  5766. strm.msg = 'unknown header flags set';
  5767. state.mode = BAD;
  5768. break;
  5769. }
  5770. if (state.head) {
  5771. state.head.text = ((hold >> 8) & 1);
  5772. }
  5773. if (state.flags & 0x0200) {
  5774. //=== CRC2(state.check, hold);
  5775. hbuf[0] = hold & 0xff;
  5776. hbuf[1] = (hold >>> 8) & 0xff;
  5777. state.check = crc32(state.check, hbuf, 2, 0);
  5778. //===//
  5779. }
  5780. //=== INITBITS();
  5781. hold = 0;
  5782. bits = 0;
  5783. //===//
  5784. state.mode = TIME;
  5785. /* falls through */
  5786. case TIME:
  5787. //=== NEEDBITS(32); */
  5788. while (bits < 32) {
  5789. if (have === 0) { break inf_leave; }
  5790. have--;
  5791. hold += input[next++] << bits;
  5792. bits += 8;
  5793. }
  5794. //===//
  5795. if (state.head) {
  5796. state.head.time = hold;
  5797. }
  5798. if (state.flags & 0x0200) {
  5799. //=== CRC4(state.check, hold)
  5800. hbuf[0] = hold & 0xff;
  5801. hbuf[1] = (hold >>> 8) & 0xff;
  5802. hbuf[2] = (hold >>> 16) & 0xff;
  5803. hbuf[3] = (hold >>> 24) & 0xff;
  5804. state.check = crc32(state.check, hbuf, 4, 0);
  5805. //===
  5806. }
  5807. //=== INITBITS();
  5808. hold = 0;
  5809. bits = 0;
  5810. //===//
  5811. state.mode = OS;
  5812. /* falls through */
  5813. case OS:
  5814. //=== NEEDBITS(16); */
  5815. while (bits < 16) {
  5816. if (have === 0) { break inf_leave; }
  5817. have--;
  5818. hold += input[next++] << bits;
  5819. bits += 8;
  5820. }
  5821. //===//
  5822. if (state.head) {
  5823. state.head.xflags = (hold & 0xff);
  5824. state.head.os = (hold >> 8);
  5825. }
  5826. if (state.flags & 0x0200) {
  5827. //=== CRC2(state.check, hold);
  5828. hbuf[0] = hold & 0xff;
  5829. hbuf[1] = (hold >>> 8) & 0xff;
  5830. state.check = crc32(state.check, hbuf, 2, 0);
  5831. //===//
  5832. }
  5833. //=== INITBITS();
  5834. hold = 0;
  5835. bits = 0;
  5836. //===//
  5837. state.mode = EXLEN;
  5838. /* falls through */
  5839. case EXLEN:
  5840. if (state.flags & 0x0400) {
  5841. //=== NEEDBITS(16); */
  5842. while (bits < 16) {
  5843. if (have === 0) { break inf_leave; }
  5844. have--;
  5845. hold += input[next++] << bits;
  5846. bits += 8;
  5847. }
  5848. //===//
  5849. state.length = hold;
  5850. if (state.head) {
  5851. state.head.extra_len = hold;
  5852. }
  5853. if (state.flags & 0x0200) {
  5854. //=== CRC2(state.check, hold);
  5855. hbuf[0] = hold & 0xff;
  5856. hbuf[1] = (hold >>> 8) & 0xff;
  5857. state.check = crc32(state.check, hbuf, 2, 0);
  5858. //===//
  5859. }
  5860. //=== INITBITS();
  5861. hold = 0;
  5862. bits = 0;
  5863. //===//
  5864. }
  5865. else if (state.head) {
  5866. state.head.extra = null/*Z_NULL*/;
  5867. }
  5868. state.mode = EXTRA;
  5869. /* falls through */
  5870. case EXTRA:
  5871. if (state.flags & 0x0400) {
  5872. copy = state.length;
  5873. if (copy > have) { copy = have; }
  5874. if (copy) {
  5875. if (state.head) {
  5876. len = state.head.extra_len - state.length;
  5877. if (!state.head.extra) {
  5878. // Use untyped array for more conveniend processing later
  5879. state.head.extra = new Array(state.head.extra_len);
  5880. }
  5881. utils.arraySet(
  5882. state.head.extra,
  5883. input,
  5884. next,
  5885. // extra field is limited to 65536 bytes
  5886. // - no need for additional size check
  5887. copy,
  5888. /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
  5889. len
  5890. );
  5891. //zmemcpy(state.head.extra + len, next,
  5892. // len + copy > state.head.extra_max ?
  5893. // state.head.extra_max - len : copy);
  5894. }
  5895. if (state.flags & 0x0200) {
  5896. state.check = crc32(state.check, input, copy, next);
  5897. }
  5898. have -= copy;
  5899. next += copy;
  5900. state.length -= copy;
  5901. }
  5902. if (state.length) { break inf_leave; }
  5903. }
  5904. state.length = 0;
  5905. state.mode = NAME;
  5906. /* falls through */
  5907. case NAME:
  5908. if (state.flags & 0x0800) {
  5909. if (have === 0) { break inf_leave; }
  5910. copy = 0;
  5911. do {
  5912. // TODO: 2 or 1 bytes?
  5913. len = input[next + copy++];
  5914. /* use constant limit because in js we should not preallocate memory */
  5915. if (state.head && len &&
  5916. (state.length < 65536 /*state.head.name_max*/)) {
  5917. state.head.name += String.fromCharCode(len);
  5918. }
  5919. } while (len && copy < have);
  5920. if (state.flags & 0x0200) {
  5921. state.check = crc32(state.check, input, copy, next);
  5922. }
  5923. have -= copy;
  5924. next += copy;
  5925. if (len) { break inf_leave; }
  5926. }
  5927. else if (state.head) {
  5928. state.head.name = null;
  5929. }
  5930. state.length = 0;
  5931. state.mode = COMMENT;
  5932. /* falls through */
  5933. case COMMENT:
  5934. if (state.flags & 0x1000) {
  5935. if (have === 0) { break inf_leave; }
  5936. copy = 0;
  5937. do {
  5938. len = input[next + copy++];
  5939. /* use constant limit because in js we should not preallocate memory */
  5940. if (state.head && len &&
  5941. (state.length < 65536 /*state.head.comm_max*/)) {
  5942. state.head.comment += String.fromCharCode(len);
  5943. }
  5944. } while (len && copy < have);
  5945. if (state.flags & 0x0200) {
  5946. state.check = crc32(state.check, input, copy, next);
  5947. }
  5948. have -= copy;
  5949. next += copy;
  5950. if (len) { break inf_leave; }
  5951. }
  5952. else if (state.head) {
  5953. state.head.comment = null;
  5954. }
  5955. state.mode = HCRC;
  5956. /* falls through */
  5957. case HCRC:
  5958. if (state.flags & 0x0200) {
  5959. //=== NEEDBITS(16); */
  5960. while (bits < 16) {
  5961. if (have === 0) { break inf_leave; }
  5962. have--;
  5963. hold += input[next++] << bits;
  5964. bits += 8;
  5965. }
  5966. //===//
  5967. if (hold !== (state.check & 0xffff)) {
  5968. strm.msg = 'header crc mismatch';
  5969. state.mode = BAD;
  5970. break;
  5971. }
  5972. //=== INITBITS();
  5973. hold = 0;
  5974. bits = 0;
  5975. //===//
  5976. }
  5977. if (state.head) {
  5978. state.head.hcrc = ((state.flags >> 9) & 1);
  5979. state.head.done = true;
  5980. }
  5981. strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/;
  5982. state.mode = TYPE;
  5983. break;
  5984. case DICTID:
  5985. //=== NEEDBITS(32); */
  5986. while (bits < 32) {
  5987. if (have === 0) { break inf_leave; }
  5988. have--;
  5989. hold += input[next++] << bits;
  5990. bits += 8;
  5991. }
  5992. //===//
  5993. strm.adler = state.check = ZSWAP32(hold);
  5994. //=== INITBITS();
  5995. hold = 0;
  5996. bits = 0;
  5997. //===//
  5998. state.mode = DICT;
  5999. /* falls through */
  6000. case DICT:
  6001. if (state.havedict === 0) {
  6002. //--- RESTORE() ---
  6003. strm.next_out = put;
  6004. strm.avail_out = left;
  6005. strm.next_in = next;
  6006. strm.avail_in = have;
  6007. state.hold = hold;
  6008. state.bits = bits;
  6009. //---
  6010. return Z_NEED_DICT;
  6011. }
  6012. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  6013. state.mode = TYPE;
  6014. /* falls through */
  6015. case TYPE:
  6016. if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
  6017. /* falls through */
  6018. case TYPEDO:
  6019. if (state.last) {
  6020. //--- BYTEBITS() ---//
  6021. hold >>>= bits & 7;
  6022. bits -= bits & 7;
  6023. //---//
  6024. state.mode = CHECK;
  6025. break;
  6026. }
  6027. //=== NEEDBITS(3); */
  6028. while (bits < 3) {
  6029. if (have === 0) { break inf_leave; }
  6030. have--;
  6031. hold += input[next++] << bits;
  6032. bits += 8;
  6033. }
  6034. //===//
  6035. state.last = (hold & 0x01)/*BITS(1)*/;
  6036. //--- DROPBITS(1) ---//
  6037. hold >>>= 1;
  6038. bits -= 1;
  6039. //---//
  6040. switch ((hold & 0x03)/*BITS(2)*/) {
  6041. case 0: /* stored block */
  6042. //Tracev((stderr, "inflate: stored block%s\n",
  6043. // state.last ? " (last)" : ""));
  6044. state.mode = STORED;
  6045. break;
  6046. case 1: /* fixed block */
  6047. fixedtables(state);
  6048. //Tracev((stderr, "inflate: fixed codes block%s\n",
  6049. // state.last ? " (last)" : ""));
  6050. state.mode = LEN_; /* decode codes */
  6051. if (flush === Z_TREES) {
  6052. //--- DROPBITS(2) ---//
  6053. hold >>>= 2;
  6054. bits -= 2;
  6055. //---//
  6056. break inf_leave;
  6057. }
  6058. break;
  6059. case 2: /* dynamic block */
  6060. //Tracev((stderr, "inflate: dynamic codes block%s\n",
  6061. // state.last ? " (last)" : ""));
  6062. state.mode = TABLE;
  6063. break;
  6064. case 3:
  6065. strm.msg = 'invalid block type';
  6066. state.mode = BAD;
  6067. }
  6068. //--- DROPBITS(2) ---//
  6069. hold >>>= 2;
  6070. bits -= 2;
  6071. //---//
  6072. break;
  6073. case STORED:
  6074. //--- BYTEBITS() ---// /* go to byte boundary */
  6075. hold >>>= bits & 7;
  6076. bits -= bits & 7;
  6077. //---//
  6078. //=== NEEDBITS(32); */
  6079. while (bits < 32) {
  6080. if (have === 0) { break inf_leave; }
  6081. have--;
  6082. hold += input[next++] << bits;
  6083. bits += 8;
  6084. }
  6085. //===//
  6086. if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
  6087. strm.msg = 'invalid stored block lengths';
  6088. state.mode = BAD;
  6089. break;
  6090. }
  6091. state.length = hold & 0xffff;
  6092. //Tracev((stderr, "inflate: stored length %u\n",
  6093. // state.length));
  6094. //=== INITBITS();
  6095. hold = 0;
  6096. bits = 0;
  6097. //===//
  6098. state.mode = COPY_;
  6099. if (flush === Z_TREES) { break inf_leave; }
  6100. /* falls through */
  6101. case COPY_:
  6102. state.mode = COPY;
  6103. /* falls through */
  6104. case COPY:
  6105. copy = state.length;
  6106. if (copy) {
  6107. if (copy > have) { copy = have; }
  6108. if (copy > left) { copy = left; }
  6109. if (copy === 0) { break inf_leave; }
  6110. //--- zmemcpy(put, next, copy); ---
  6111. utils.arraySet(output, input, next, copy, put);
  6112. //---//
  6113. have -= copy;
  6114. next += copy;
  6115. left -= copy;
  6116. put += copy;
  6117. state.length -= copy;
  6118. break;
  6119. }
  6120. //Tracev((stderr, "inflate: stored end\n"));
  6121. state.mode = TYPE;
  6122. break;
  6123. case TABLE:
  6124. //=== NEEDBITS(14); */
  6125. while (bits < 14) {
  6126. if (have === 0) { break inf_leave; }
  6127. have--;
  6128. hold += input[next++] << bits;
  6129. bits += 8;
  6130. }
  6131. //===//
  6132. state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
  6133. //--- DROPBITS(5) ---//
  6134. hold >>>= 5;
  6135. bits -= 5;
  6136. //---//
  6137. state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
  6138. //--- DROPBITS(5) ---//
  6139. hold >>>= 5;
  6140. bits -= 5;
  6141. //---//
  6142. state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
  6143. //--- DROPBITS(4) ---//
  6144. hold >>>= 4;
  6145. bits -= 4;
  6146. //---//
  6147. //#ifndef PKZIP_BUG_WORKAROUND
  6148. if (state.nlen > 286 || state.ndist > 30) {
  6149. strm.msg = 'too many length or distance symbols';
  6150. state.mode = BAD;
  6151. break;
  6152. }
  6153. //#endif
  6154. //Tracev((stderr, "inflate: table sizes ok\n"));
  6155. state.have = 0;
  6156. state.mode = LENLENS;
  6157. /* falls through */
  6158. case LENLENS:
  6159. while (state.have < state.ncode) {
  6160. //=== NEEDBITS(3);
  6161. while (bits < 3) {
  6162. if (have === 0) { break inf_leave; }
  6163. have--;
  6164. hold += input[next++] << bits;
  6165. bits += 8;
  6166. }
  6167. //===//
  6168. state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
  6169. //--- DROPBITS(3) ---//
  6170. hold >>>= 3;
  6171. bits -= 3;
  6172. //---//
  6173. }
  6174. while (state.have < 19) {
  6175. state.lens[order[state.have++]] = 0;
  6176. }
  6177. // We have separate tables & no pointers. 2 commented lines below not needed.
  6178. //state.next = state.codes;
  6179. //state.lencode = state.next;
  6180. // Switch to use dynamic table
  6181. state.lencode = state.lendyn;
  6182. state.lenbits = 7;
  6183. opts = {bits: state.lenbits};
  6184. ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
  6185. state.lenbits = opts.bits;
  6186. if (ret) {
  6187. strm.msg = 'invalid code lengths set';
  6188. state.mode = BAD;
  6189. break;
  6190. }
  6191. //Tracev((stderr, "inflate: code lengths ok\n"));
  6192. state.have = 0;
  6193. state.mode = CODELENS;
  6194. /* falls through */
  6195. case CODELENS:
  6196. while (state.have < state.nlen + state.ndist) {
  6197. for (;;) {
  6198. here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
  6199. here_bits = here >>> 24;
  6200. here_op = (here >>> 16) & 0xff;
  6201. here_val = here & 0xffff;
  6202. if ((here_bits) <= bits) { break; }
  6203. //--- PULLBYTE() ---//
  6204. if (have === 0) { break inf_leave; }
  6205. have--;
  6206. hold += input[next++] << bits;
  6207. bits += 8;
  6208. //---//
  6209. }
  6210. if (here_val < 16) {
  6211. //--- DROPBITS(here.bits) ---//
  6212. hold >>>= here_bits;
  6213. bits -= here_bits;
  6214. //---//
  6215. state.lens[state.have++] = here_val;
  6216. }
  6217. else {
  6218. if (here_val === 16) {
  6219. //=== NEEDBITS(here.bits + 2);
  6220. n = here_bits + 2;
  6221. while (bits < n) {
  6222. if (have === 0) { break inf_leave; }
  6223. have--;
  6224. hold += input[next++] << bits;
  6225. bits += 8;
  6226. }
  6227. //===//
  6228. //--- DROPBITS(here.bits) ---//
  6229. hold >>>= here_bits;
  6230. bits -= here_bits;
  6231. //---//
  6232. if (state.have === 0) {
  6233. strm.msg = 'invalid bit length repeat';
  6234. state.mode = BAD;
  6235. break;
  6236. }
  6237. len = state.lens[state.have - 1];
  6238. copy = 3 + (hold & 0x03);//BITS(2);
  6239. //--- DROPBITS(2) ---//
  6240. hold >>>= 2;
  6241. bits -= 2;
  6242. //---//
  6243. }
  6244. else if (here_val === 17) {
  6245. //=== NEEDBITS(here.bits + 3);
  6246. n = here_bits + 3;
  6247. while (bits < n) {
  6248. if (have === 0) { break inf_leave; }
  6249. have--;
  6250. hold += input[next++] << bits;
  6251. bits += 8;
  6252. }
  6253. //===//
  6254. //--- DROPBITS(here.bits) ---//
  6255. hold >>>= here_bits;
  6256. bits -= here_bits;
  6257. //---//
  6258. len = 0;
  6259. copy = 3 + (hold & 0x07);//BITS(3);
  6260. //--- DROPBITS(3) ---//
  6261. hold >>>= 3;
  6262. bits -= 3;
  6263. //---//
  6264. }
  6265. else {
  6266. //=== NEEDBITS(here.bits + 7);
  6267. n = here_bits + 7;
  6268. while (bits < n) {
  6269. if (have === 0) { break inf_leave; }
  6270. have--;
  6271. hold += input[next++] << bits;
  6272. bits += 8;
  6273. }
  6274. //===//
  6275. //--- DROPBITS(here.bits) ---//
  6276. hold >>>= here_bits;
  6277. bits -= here_bits;
  6278. //---//
  6279. len = 0;
  6280. copy = 11 + (hold & 0x7f);//BITS(7);
  6281. //--- DROPBITS(7) ---//
  6282. hold >>>= 7;
  6283. bits -= 7;
  6284. //---//
  6285. }
  6286. if (state.have + copy > state.nlen + state.ndist) {
  6287. strm.msg = 'invalid bit length repeat';
  6288. state.mode = BAD;
  6289. break;
  6290. }
  6291. while (copy--) {
  6292. state.lens[state.have++] = len;
  6293. }
  6294. }
  6295. }
  6296. /* handle error breaks in while */
  6297. if (state.mode === BAD) { break; }
  6298. /* check for end-of-block code (better have one) */
  6299. if (state.lens[256] === 0) {
  6300. strm.msg = 'invalid code -- missing end-of-block';
  6301. state.mode = BAD;
  6302. break;
  6303. }
  6304. /* build code tables -- note: do not change the lenbits or distbits
  6305. values here (9 and 6) without reading the comments in inftrees.h
  6306. concerning the ENOUGH constants, which depend on those values */
  6307. state.lenbits = 9;
  6308. opts = {bits: state.lenbits};
  6309. ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
  6310. // We have separate tables & no pointers. 2 commented lines below not needed.
  6311. // state.next_index = opts.table_index;
  6312. state.lenbits = opts.bits;
  6313. // state.lencode = state.next;
  6314. if (ret) {
  6315. strm.msg = 'invalid literal/lengths set';
  6316. state.mode = BAD;
  6317. break;
  6318. }
  6319. state.distbits = 6;
  6320. //state.distcode.copy(state.codes);
  6321. // Switch to use dynamic table
  6322. state.distcode = state.distdyn;
  6323. opts = {bits: state.distbits};
  6324. ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
  6325. // We have separate tables & no pointers. 2 commented lines below not needed.
  6326. // state.next_index = opts.table_index;
  6327. state.distbits = opts.bits;
  6328. // state.distcode = state.next;
  6329. if (ret) {
  6330. strm.msg = 'invalid distances set';
  6331. state.mode = BAD;
  6332. break;
  6333. }
  6334. //Tracev((stderr, 'inflate: codes ok\n'));
  6335. state.mode = LEN_;
  6336. if (flush === Z_TREES) { break inf_leave; }
  6337. /* falls through */
  6338. case LEN_:
  6339. state.mode = LEN;
  6340. /* falls through */
  6341. case LEN:
  6342. if (have >= 6 && left >= 258) {
  6343. //--- RESTORE() ---
  6344. strm.next_out = put;
  6345. strm.avail_out = left;
  6346. strm.next_in = next;
  6347. strm.avail_in = have;
  6348. state.hold = hold;
  6349. state.bits = bits;
  6350. //---
  6351. inflate_fast(strm, _out);
  6352. //--- LOAD() ---
  6353. put = strm.next_out;
  6354. output = strm.output;
  6355. left = strm.avail_out;
  6356. next = strm.next_in;
  6357. input = strm.input;
  6358. have = strm.avail_in;
  6359. hold = state.hold;
  6360. bits = state.bits;
  6361. //---
  6362. if (state.mode === TYPE) {
  6363. state.back = -1;
  6364. }
  6365. break;
  6366. }
  6367. state.back = 0;
  6368. for (;;) {
  6369. here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/
  6370. here_bits = here >>> 24;
  6371. here_op = (here >>> 16) & 0xff;
  6372. here_val = here & 0xffff;
  6373. if (here_bits <= bits) { break; }
  6374. //--- PULLBYTE() ---//
  6375. if (have === 0) { break inf_leave; }
  6376. have--;
  6377. hold += input[next++] << bits;
  6378. bits += 8;
  6379. //---//
  6380. }
  6381. if (here_op && (here_op & 0xf0) === 0) {
  6382. last_bits = here_bits;
  6383. last_op = here_op;
  6384. last_val = here_val;
  6385. for (;;) {
  6386. here = state.lencode[last_val +
  6387. ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  6388. here_bits = here >>> 24;
  6389. here_op = (here >>> 16) & 0xff;
  6390. here_val = here & 0xffff;
  6391. if ((last_bits + here_bits) <= bits) { break; }
  6392. //--- PULLBYTE() ---//
  6393. if (have === 0) { break inf_leave; }
  6394. have--;
  6395. hold += input[next++] << bits;
  6396. bits += 8;
  6397. //---//
  6398. }
  6399. //--- DROPBITS(last.bits) ---//
  6400. hold >>>= last_bits;
  6401. bits -= last_bits;
  6402. //---//
  6403. state.back += last_bits;
  6404. }
  6405. //--- DROPBITS(here.bits) ---//
  6406. hold >>>= here_bits;
  6407. bits -= here_bits;
  6408. //---//
  6409. state.back += here_bits;
  6410. state.length = here_val;
  6411. if (here_op === 0) {
  6412. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  6413. // "inflate: literal '%c'\n" :
  6414. // "inflate: literal 0x%02x\n", here.val));
  6415. state.mode = LIT;
  6416. break;
  6417. }
  6418. if (here_op & 32) {
  6419. //Tracevv((stderr, "inflate: end of block\n"));
  6420. state.back = -1;
  6421. state.mode = TYPE;
  6422. break;
  6423. }
  6424. if (here_op & 64) {
  6425. strm.msg = 'invalid literal/length code';
  6426. state.mode = BAD;
  6427. break;
  6428. }
  6429. state.extra = here_op & 15;
  6430. state.mode = LENEXT;
  6431. /* falls through */
  6432. case LENEXT:
  6433. if (state.extra) {
  6434. //=== NEEDBITS(state.extra);
  6435. n = state.extra;
  6436. while (bits < n) {
  6437. if (have === 0) { break inf_leave; }
  6438. have--;
  6439. hold += input[next++] << bits;
  6440. bits += 8;
  6441. }
  6442. //===//
  6443. state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
  6444. //--- DROPBITS(state.extra) ---//
  6445. hold >>>= state.extra;
  6446. bits -= state.extra;
  6447. //---//
  6448. state.back += state.extra;
  6449. }
  6450. //Tracevv((stderr, "inflate: length %u\n", state.length));
  6451. state.was = state.length;
  6452. state.mode = DIST;
  6453. /* falls through */
  6454. case DIST:
  6455. for (;;) {
  6456. here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/
  6457. here_bits = here >>> 24;
  6458. here_op = (here >>> 16) & 0xff;
  6459. here_val = here & 0xffff;
  6460. if ((here_bits) <= bits) { break; }
  6461. //--- PULLBYTE() ---//
  6462. if (have === 0) { break inf_leave; }
  6463. have--;
  6464. hold += input[next++] << bits;
  6465. bits += 8;
  6466. //---//
  6467. }
  6468. if ((here_op & 0xf0) === 0) {
  6469. last_bits = here_bits;
  6470. last_op = here_op;
  6471. last_val = here_val;
  6472. for (;;) {
  6473. here = state.distcode[last_val +
  6474. ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  6475. here_bits = here >>> 24;
  6476. here_op = (here >>> 16) & 0xff;
  6477. here_val = here & 0xffff;
  6478. if ((last_bits + here_bits) <= bits) { break; }
  6479. //--- PULLBYTE() ---//
  6480. if (have === 0) { break inf_leave; }
  6481. have--;
  6482. hold += input[next++] << bits;
  6483. bits += 8;
  6484. //---//
  6485. }
  6486. //--- DROPBITS(last.bits) ---//
  6487. hold >>>= last_bits;
  6488. bits -= last_bits;
  6489. //---//
  6490. state.back += last_bits;
  6491. }
  6492. //--- DROPBITS(here.bits) ---//
  6493. hold >>>= here_bits;
  6494. bits -= here_bits;
  6495. //---//
  6496. state.back += here_bits;
  6497. if (here_op & 64) {
  6498. strm.msg = 'invalid distance code';
  6499. state.mode = BAD;
  6500. break;
  6501. }
  6502. state.offset = here_val;
  6503. state.extra = (here_op) & 15;
  6504. state.mode = DISTEXT;
  6505. /* falls through */
  6506. case DISTEXT:
  6507. if (state.extra) {
  6508. //=== NEEDBITS(state.extra);
  6509. n = state.extra;
  6510. while (bits < n) {
  6511. if (have === 0) { break inf_leave; }
  6512. have--;
  6513. hold += input[next++] << bits;
  6514. bits += 8;
  6515. }
  6516. //===//
  6517. state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/;
  6518. //--- DROPBITS(state.extra) ---//
  6519. hold >>>= state.extra;
  6520. bits -= state.extra;
  6521. //---//
  6522. state.back += state.extra;
  6523. }
  6524. //#ifdef INFLATE_STRICT
  6525. if (state.offset > state.dmax) {
  6526. strm.msg = 'invalid distance too far back';
  6527. state.mode = BAD;
  6528. break;
  6529. }
  6530. //#endif
  6531. //Tracevv((stderr, "inflate: distance %u\n", state.offset));
  6532. state.mode = MATCH;
  6533. /* falls through */
  6534. case MATCH:
  6535. if (left === 0) { break inf_leave; }
  6536. copy = _out - left;
  6537. if (state.offset > copy) { /* copy from window */
  6538. copy = state.offset - copy;
  6539. if (copy > state.whave) {
  6540. if (state.sane) {
  6541. strm.msg = 'invalid distance too far back';
  6542. state.mode = BAD;
  6543. break;
  6544. }
  6545. // (!) This block is disabled in zlib defailts,
  6546. // don't enable it for binary compatibility
  6547. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  6548. // Trace((stderr, "inflate.c too far\n"));
  6549. // copy -= state.whave;
  6550. // if (copy > state.length) { copy = state.length; }
  6551. // if (copy > left) { copy = left; }
  6552. // left -= copy;
  6553. // state.length -= copy;
  6554. // do {
  6555. // output[put++] = 0;
  6556. // } while (--copy);
  6557. // if (state.length === 0) { state.mode = LEN; }
  6558. // break;
  6559. //#endif
  6560. }
  6561. if (copy > state.wnext) {
  6562. copy -= state.wnext;
  6563. from = state.wsize - copy;
  6564. }
  6565. else {
  6566. from = state.wnext - copy;
  6567. }
  6568. if (copy > state.length) { copy = state.length; }
  6569. from_source = state.window;
  6570. }
  6571. else { /* copy from output */
  6572. from_source = output;
  6573. from = put - state.offset;
  6574. copy = state.length;
  6575. }
  6576. if (copy > left) { copy = left; }
  6577. left -= copy;
  6578. state.length -= copy;
  6579. do {
  6580. output[put++] = from_source[from++];
  6581. } while (--copy);
  6582. if (state.length === 0) { state.mode = LEN; }
  6583. break;
  6584. case LIT:
  6585. if (left === 0) { break inf_leave; }
  6586. output[put++] = state.length;
  6587. left--;
  6588. state.mode = LEN;
  6589. break;
  6590. case CHECK:
  6591. if (state.wrap) {
  6592. //=== NEEDBITS(32);
  6593. while (bits < 32) {
  6594. if (have === 0) { break inf_leave; }
  6595. have--;
  6596. // Use '|' insdead of '+' to make sure that result is signed
  6597. hold |= input[next++] << bits;
  6598. bits += 8;
  6599. }
  6600. //===//
  6601. _out -= left;
  6602. strm.total_out += _out;
  6603. state.total += _out;
  6604. if (_out) {
  6605. strm.adler = state.check =
  6606. /*UPDATE(state.check, put - _out, _out);*/
  6607. (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
  6608. }
  6609. _out = left;
  6610. // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too
  6611. if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
  6612. strm.msg = 'incorrect data check';
  6613. state.mode = BAD;
  6614. break;
  6615. }
  6616. //=== INITBITS();
  6617. hold = 0;
  6618. bits = 0;
  6619. //===//
  6620. //Tracev((stderr, "inflate: check matches trailer\n"));
  6621. }
  6622. state.mode = LENGTH;
  6623. /* falls through */
  6624. case LENGTH:
  6625. if (state.wrap && state.flags) {
  6626. //=== NEEDBITS(32);
  6627. while (bits < 32) {
  6628. if (have === 0) { break inf_leave; }
  6629. have--;
  6630. hold += input[next++] << bits;
  6631. bits += 8;
  6632. }
  6633. //===//
  6634. if (hold !== (state.total & 0xffffffff)) {
  6635. strm.msg = 'incorrect length check';
  6636. state.mode = BAD;
  6637. break;
  6638. }
  6639. //=== INITBITS();
  6640. hold = 0;
  6641. bits = 0;
  6642. //===//
  6643. //Tracev((stderr, "inflate: length matches trailer\n"));
  6644. }
  6645. state.mode = DONE;
  6646. /* falls through */
  6647. case DONE:
  6648. ret = Z_STREAM_END;
  6649. break inf_leave;
  6650. case BAD:
  6651. ret = Z_DATA_ERROR;
  6652. break inf_leave;
  6653. case MEM:
  6654. return Z_MEM_ERROR;
  6655. case SYNC:
  6656. /* falls through */
  6657. default:
  6658. return Z_STREAM_ERROR;
  6659. }
  6660. }
  6661. // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
  6662. /*
  6663. Return from inflate(), updating the total counts and the check value.
  6664. If there was no progress during the inflate() call, return a buffer
  6665. error. Call updatewindow() to create and/or update the window state.
  6666. Note: a memory error from inflate() is non-recoverable.
  6667. */
  6668. //--- RESTORE() ---
  6669. strm.next_out = put;
  6670. strm.avail_out = left;
  6671. strm.next_in = next;
  6672. strm.avail_in = have;
  6673. state.hold = hold;
  6674. state.bits = bits;
  6675. //---
  6676. if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
  6677. (state.mode < CHECK || flush !== Z_FINISH))) {
  6678. if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
  6679. state.mode = MEM;
  6680. return Z_MEM_ERROR;
  6681. }
  6682. }
  6683. _in -= strm.avail_in;
  6684. _out -= strm.avail_out;
  6685. strm.total_in += _in;
  6686. strm.total_out += _out;
  6687. state.total += _out;
  6688. if (state.wrap && _out) {
  6689. strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
  6690. (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
  6691. }
  6692. strm.data_type = state.bits + (state.last ? 64 : 0) +
  6693. (state.mode === TYPE ? 128 : 0) +
  6694. (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
  6695. if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
  6696. ret = Z_BUF_ERROR;
  6697. }
  6698. return ret;
  6699. }
  6700. function inflateEnd(strm) {
  6701. if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
  6702. return Z_STREAM_ERROR;
  6703. }
  6704. var state = strm.state;
  6705. if (state.window) {
  6706. state.window = null;
  6707. }
  6708. strm.state = null;
  6709. return Z_OK;
  6710. }
  6711. function inflateGetHeader(strm, head) {
  6712. var state;
  6713. /* check state */
  6714. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  6715. state = strm.state;
  6716. if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
  6717. /* save header structure */
  6718. state.head = head;
  6719. head.done = false;
  6720. return Z_OK;
  6721. }
  6722. exports.inflateReset = inflateReset;
  6723. exports.inflateReset2 = inflateReset2;
  6724. exports.inflateResetKeep = inflateResetKeep;
  6725. exports.inflateInit = inflateInit;
  6726. exports.inflateInit2 = inflateInit2;
  6727. exports.inflate = inflate;
  6728. exports.inflateEnd = inflateEnd;
  6729. exports.inflateGetHeader = inflateGetHeader;
  6730. exports.inflateInfo = 'pako inflate (from Nodeca project)';
  6731. /* Not implemented
  6732. exports.inflateCopy = inflateCopy;
  6733. exports.inflateGetDictionary = inflateGetDictionary;
  6734. exports.inflateMark = inflateMark;
  6735. exports.inflatePrime = inflatePrime;
  6736. exports.inflateSetDictionary = inflateSetDictionary;
  6737. exports.inflateSync = inflateSync;
  6738. exports.inflateSyncPoint = inflateSyncPoint;
  6739. exports.inflateUndermine = inflateUndermine;
  6740. */
  6741. },{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){
  6742. 'use strict';
  6743. var utils = _dereq_('../utils/common');
  6744. var MAXBITS = 15;
  6745. var ENOUGH_LENS = 852;
  6746. var ENOUGH_DISTS = 592;
  6747. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  6748. var CODES = 0;
  6749. var LENS = 1;
  6750. var DISTS = 2;
  6751. var lbase = [ /* Length codes 257..285 base */
  6752. 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
  6753. 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
  6754. ];
  6755. var lext = [ /* Length codes 257..285 extra */
  6756. 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
  6757. 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
  6758. ];
  6759. var dbase = [ /* Distance codes 0..29 base */
  6760. 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
  6761. 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
  6762. 8193, 12289, 16385, 24577, 0, 0
  6763. ];
  6764. var dext = [ /* Distance codes 0..29 extra */
  6765. 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
  6766. 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
  6767. 28, 28, 29, 29, 64, 64
  6768. ];
  6769. module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
  6770. {
  6771. var bits = opts.bits;
  6772. //here = opts.here; /* table entry for duplication */
  6773. var len = 0; /* a code's length in bits */
  6774. var sym = 0; /* index of code symbols */
  6775. var min = 0, max = 0; /* minimum and maximum code lengths */
  6776. var root = 0; /* number of index bits for root table */
  6777. var curr = 0; /* number of index bits for current table */
  6778. var drop = 0; /* code bits to drop for sub-table */
  6779. var left = 0; /* number of prefix codes available */
  6780. var used = 0; /* code entries in table used */
  6781. var huff = 0; /* Huffman code */
  6782. var incr; /* for incrementing code, index */
  6783. var fill; /* index for replicating entries */
  6784. var low; /* low bits for current root entry */
  6785. var mask; /* mask for low root bits */
  6786. var next; /* next available space in table */
  6787. var base = null; /* base value table to use */
  6788. var base_index = 0;
  6789. // var shoextra; /* extra bits table to use */
  6790. var end; /* use base and extra for symbol > end */
  6791. var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */
  6792. var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */
  6793. var extra = null;
  6794. var extra_index = 0;
  6795. var here_bits, here_op, here_val;
  6796. /*
  6797. Process a set of code lengths to create a canonical Huffman code. The
  6798. code lengths are lens[0..codes-1]. Each length corresponds to the
  6799. symbols 0..codes-1. The Huffman code is generated by first sorting the
  6800. symbols by length from short to long, and retaining the symbol order
  6801. for codes with equal lengths. Then the code starts with all zero bits
  6802. for the first code of the shortest length, and the codes are integer
  6803. increments for the same length, and zeros are appended as the length
  6804. increases. For the deflate format, these bits are stored backwards
  6805. from their more natural integer increment ordering, and so when the
  6806. decoding tables are built in the large loop below, the integer codes
  6807. are incremented backwards.
  6808. This routine assumes, but does not check, that all of the entries in
  6809. lens[] are in the range 0..MAXBITS. The caller must assure this.
  6810. 1..MAXBITS is interpreted as that code length. zero means that that
  6811. symbol does not occur in this code.
  6812. The codes are sorted by computing a count of codes for each length,
  6813. creating from that a table of starting indices for each length in the
  6814. sorted table, and then entering the symbols in order in the sorted
  6815. table. The sorted table is work[], with that space being provided by
  6816. the caller.
  6817. The length counts are used for other purposes as well, i.e. finding
  6818. the minimum and maximum length codes, determining if there are any
  6819. codes at all, checking for a valid set of lengths, and looking ahead
  6820. at length counts to determine sub-table sizes when building the
  6821. decoding tables.
  6822. */
  6823. /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
  6824. for (len = 0; len <= MAXBITS; len++) {
  6825. count[len] = 0;
  6826. }
  6827. for (sym = 0; sym < codes; sym++) {
  6828. count[lens[lens_index + sym]]++;
  6829. }
  6830. /* bound code lengths, force root to be within code lengths */
  6831. root = bits;
  6832. for (max = MAXBITS; max >= 1; max--) {
  6833. if (count[max] !== 0) { break; }
  6834. }
  6835. if (root > max) {
  6836. root = max;
  6837. }
  6838. if (max === 0) { /* no symbols to code at all */
  6839. //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
  6840. //table.bits[opts.table_index] = 1; //here.bits = (var char)1;
  6841. //table.val[opts.table_index++] = 0; //here.val = (var short)0;
  6842. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  6843. //table.op[opts.table_index] = 64;
  6844. //table.bits[opts.table_index] = 1;
  6845. //table.val[opts.table_index++] = 0;
  6846. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  6847. opts.bits = 1;
  6848. return 0; /* no symbols, but wait for decoding to report error */
  6849. }
  6850. for (min = 1; min < max; min++) {
  6851. if (count[min] !== 0) { break; }
  6852. }
  6853. if (root < min) {
  6854. root = min;
  6855. }
  6856. /* check for an over-subscribed or incomplete set of lengths */
  6857. left = 1;
  6858. for (len = 1; len <= MAXBITS; len++) {
  6859. left <<= 1;
  6860. left -= count[len];
  6861. if (left < 0) {
  6862. return -1;
  6863. } /* over-subscribed */
  6864. }
  6865. if (left > 0 && (type === CODES || max !== 1)) {
  6866. return -1; /* incomplete set */
  6867. }
  6868. /* generate offsets into symbol table for each length for sorting */
  6869. offs[1] = 0;
  6870. for (len = 1; len < MAXBITS; len++) {
  6871. offs[len + 1] = offs[len] + count[len];
  6872. }
  6873. /* sort symbols by length, by symbol order within each length */
  6874. for (sym = 0; sym < codes; sym++) {
  6875. if (lens[lens_index + sym] !== 0) {
  6876. work[offs[lens[lens_index + sym]]++] = sym;
  6877. }
  6878. }
  6879. /*
  6880. Create and fill in decoding tables. In this loop, the table being
  6881. filled is at next and has curr index bits. The code being used is huff
  6882. with length len. That code is converted to an index by dropping drop
  6883. bits off of the bottom. For codes where len is less than drop + curr,
  6884. those top drop + curr - len bits are incremented through all values to
  6885. fill the table with replicated entries.
  6886. root is the number of index bits for the root table. When len exceeds
  6887. root, sub-tables are created pointed to by the root entry with an index
  6888. of the low root bits of huff. This is saved in low to check for when a
  6889. new sub-table should be started. drop is zero when the root table is
  6890. being filled, and drop is root when sub-tables are being filled.
  6891. When a new sub-table is needed, it is necessary to look ahead in the
  6892. code lengths to determine what size sub-table is needed. The length
  6893. counts are used for this, and so count[] is decremented as codes are
  6894. entered in the tables.
  6895. used keeps track of how many table entries have been allocated from the
  6896. provided *table space. It is checked for LENS and DIST tables against
  6897. the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
  6898. the initial root table size constants. See the comments in inftrees.h
  6899. for more information.
  6900. sym increments through all symbols, and the loop terminates when
  6901. all codes of length max, i.e. all codes, have been processed. This
  6902. routine permits incomplete codes, so another loop after this one fills
  6903. in the rest of the decoding tables with invalid code markers.
  6904. */
  6905. /* set up for code type */
  6906. // poor man optimization - use if-else instead of switch,
  6907. // to avoid deopts in old v8
  6908. if (type === CODES) {
  6909. base = extra = work; /* dummy value--not used */
  6910. end = 19;
  6911. } else if (type === LENS) {
  6912. base = lbase;
  6913. base_index -= 257;
  6914. extra = lext;
  6915. extra_index -= 257;
  6916. end = 256;
  6917. } else { /* DISTS */
  6918. base = dbase;
  6919. extra = dext;
  6920. end = -1;
  6921. }
  6922. /* initialize opts for loop */
  6923. huff = 0; /* starting code */
  6924. sym = 0; /* starting code symbol */
  6925. len = min; /* starting code length */
  6926. next = table_index; /* current table to fill in */
  6927. curr = root; /* current table index bits */
  6928. drop = 0; /* current bits to drop from code for index */
  6929. low = -1; /* trigger new sub-table when len > root */
  6930. used = 1 << root; /* use root table entries */
  6931. mask = used - 1; /* mask for comparing low */
  6932. /* check available table space */
  6933. if ((type === LENS && used > ENOUGH_LENS) ||
  6934. (type === DISTS && used > ENOUGH_DISTS)) {
  6935. return 1;
  6936. }
  6937. var i=0;
  6938. /* process all codes and make table entries */
  6939. for (;;) {
  6940. i++;
  6941. /* create table entry */
  6942. here_bits = len - drop;
  6943. if (work[sym] < end) {
  6944. here_op = 0;
  6945. here_val = work[sym];
  6946. }
  6947. else if (work[sym] > end) {
  6948. here_op = extra[extra_index + work[sym]];
  6949. here_val = base[base_index + work[sym]];
  6950. }
  6951. else {
  6952. here_op = 32 + 64; /* end of block */
  6953. here_val = 0;
  6954. }
  6955. /* replicate for those indices with low len bits equal to huff */
  6956. incr = 1 << (len - drop);
  6957. fill = 1 << curr;
  6958. min = fill; /* save offset to next table */
  6959. do {
  6960. fill -= incr;
  6961. table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
  6962. } while (fill !== 0);
  6963. /* backwards increment the len-bit code huff */
  6964. incr = 1 << (len - 1);
  6965. while (huff & incr) {
  6966. incr >>= 1;
  6967. }
  6968. if (incr !== 0) {
  6969. huff &= incr - 1;
  6970. huff += incr;
  6971. } else {
  6972. huff = 0;
  6973. }
  6974. /* go to next symbol, update count, len */
  6975. sym++;
  6976. if (--count[len] === 0) {
  6977. if (len === max) { break; }
  6978. len = lens[lens_index + work[sym]];
  6979. }
  6980. /* create new sub-table if needed */
  6981. if (len > root && (huff & mask) !== low) {
  6982. /* if first time, transition to sub-tables */
  6983. if (drop === 0) {
  6984. drop = root;
  6985. }
  6986. /* increment past last table */
  6987. next += min; /* here min is 1 << curr */
  6988. /* determine length of next table */
  6989. curr = len - drop;
  6990. left = 1 << curr;
  6991. while (curr + drop < max) {
  6992. left -= count[curr + drop];
  6993. if (left <= 0) { break; }
  6994. curr++;
  6995. left <<= 1;
  6996. }
  6997. /* check for enough space */
  6998. used += 1 << curr;
  6999. if ((type === LENS && used > ENOUGH_LENS) ||
  7000. (type === DISTS && used > ENOUGH_DISTS)) {
  7001. return 1;
  7002. }
  7003. /* point entry in root table to sub-table */
  7004. low = huff & mask;
  7005. /*table.op[low] = curr;
  7006. table.bits[low] = root;
  7007. table.val[low] = next - opts.table_index;*/
  7008. table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
  7009. }
  7010. }
  7011. /* fill in remaining table entry if code is incomplete (guaranteed to have
  7012. at most one remaining entry, since if the code is incomplete, the
  7013. maximum code length that was allowed to get this far is one bit) */
  7014. if (huff !== 0) {
  7015. //table.op[next + huff] = 64; /* invalid code marker */
  7016. //table.bits[next + huff] = len - drop;
  7017. //table.val[next + huff] = 0;
  7018. table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
  7019. }
  7020. /* set return parameters */
  7021. //opts.table_index += used;
  7022. opts.bits = root;
  7023. return 0;
  7024. };
  7025. },{"../utils/common":27}],37:[function(_dereq_,module,exports){
  7026. 'use strict';
  7027. module.exports = {
  7028. '2': 'need dictionary', /* Z_NEED_DICT 2 */
  7029. '1': 'stream end', /* Z_STREAM_END 1 */
  7030. '0': '', /* Z_OK 0 */
  7031. '-1': 'file error', /* Z_ERRNO (-1) */
  7032. '-2': 'stream error', /* Z_STREAM_ERROR (-2) */
  7033. '-3': 'data error', /* Z_DATA_ERROR (-3) */
  7034. '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
  7035. '-5': 'buffer error', /* Z_BUF_ERROR (-5) */
  7036. '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
  7037. };
  7038. },{}],38:[function(_dereq_,module,exports){
  7039. 'use strict';
  7040. var utils = _dereq_('../utils/common');
  7041. /* Public constants ==========================================================*/
  7042. /* ===========================================================================*/
  7043. //var Z_FILTERED = 1;
  7044. //var Z_HUFFMAN_ONLY = 2;
  7045. //var Z_RLE = 3;
  7046. var Z_FIXED = 4;
  7047. //var Z_DEFAULT_STRATEGY = 0;
  7048. /* Possible values of the data_type field (though see inflate()) */
  7049. var Z_BINARY = 0;
  7050. var Z_TEXT = 1;
  7051. //var Z_ASCII = 1; // = Z_TEXT
  7052. var Z_UNKNOWN = 2;
  7053. /*============================================================================*/
  7054. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  7055. // From zutil.h
  7056. var STORED_BLOCK = 0;
  7057. var STATIC_TREES = 1;
  7058. var DYN_TREES = 2;
  7059. /* The three kinds of block type */
  7060. var MIN_MATCH = 3;
  7061. var MAX_MATCH = 258;
  7062. /* The minimum and maximum match lengths */
  7063. // From deflate.h
  7064. /* ===========================================================================
  7065. * Internal compression state.
  7066. */
  7067. var LENGTH_CODES = 29;
  7068. /* number of length codes, not counting the special END_BLOCK code */
  7069. var LITERALS = 256;
  7070. /* number of literal bytes 0..255 */
  7071. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  7072. /* number of Literal or Length codes, including the END_BLOCK code */
  7073. var D_CODES = 30;
  7074. /* number of distance codes */
  7075. var BL_CODES = 19;
  7076. /* number of codes used to transfer the bit lengths */
  7077. var HEAP_SIZE = 2*L_CODES + 1;
  7078. /* maximum heap size */
  7079. var MAX_BITS = 15;
  7080. /* All codes must not exceed MAX_BITS bits */
  7081. var Buf_size = 16;
  7082. /* size of bit buffer in bi_buf */
  7083. /* ===========================================================================
  7084. * Constants
  7085. */
  7086. var MAX_BL_BITS = 7;
  7087. /* Bit length codes must not exceed MAX_BL_BITS bits */
  7088. var END_BLOCK = 256;
  7089. /* end of block literal code */
  7090. var REP_3_6 = 16;
  7091. /* repeat previous bit length 3-6 times (2 bits of repeat count) */
  7092. var REPZ_3_10 = 17;
  7093. /* repeat a zero length 3-10 times (3 bits of repeat count) */
  7094. var REPZ_11_138 = 18;
  7095. /* repeat a zero length 11-138 times (7 bits of repeat count) */
  7096. var extra_lbits = /* extra bits for each length code */
  7097. [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
  7098. var extra_dbits = /* extra bits for each distance code */
  7099. [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
  7100. var extra_blbits = /* extra bits for each bit length code */
  7101. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
  7102. var bl_order =
  7103. [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
  7104. /* The lengths of the bit length codes are sent in order of decreasing
  7105. * probability, to avoid transmitting the lengths for unused bit length codes.
  7106. */
  7107. /* ===========================================================================
  7108. * Local data. These are initialized only once.
  7109. */
  7110. // We pre-fill arrays with 0 to avoid uninitialized gaps
  7111. var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
  7112. // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
  7113. var static_ltree = new Array((L_CODES+2) * 2);
  7114. zero(static_ltree);
  7115. /* The static literal tree. Since the bit lengths are imposed, there is no
  7116. * need for the L_CODES extra codes used during heap construction. However
  7117. * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
  7118. * below).
  7119. */
  7120. var static_dtree = new Array(D_CODES * 2);
  7121. zero(static_dtree);
  7122. /* The static distance tree. (Actually a trivial tree since all codes use
  7123. * 5 bits.)
  7124. */
  7125. var _dist_code = new Array(DIST_CODE_LEN);
  7126. zero(_dist_code);
  7127. /* Distance codes. The first 256 values correspond to the distances
  7128. * 3 .. 258, the last 256 values correspond to the top 8 bits of
  7129. * the 15 bit distances.
  7130. */
  7131. var _length_code = new Array(MAX_MATCH-MIN_MATCH+1);
  7132. zero(_length_code);
  7133. /* length code for each normalized match length (0 == MIN_MATCH) */
  7134. var base_length = new Array(LENGTH_CODES);
  7135. zero(base_length);
  7136. /* First normalized length for each code (0 = MIN_MATCH) */
  7137. var base_dist = new Array(D_CODES);
  7138. zero(base_dist);
  7139. /* First normalized distance for each code (0 = distance of 1) */
  7140. var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) {
  7141. this.static_tree = static_tree; /* static tree or NULL */
  7142. this.extra_bits = extra_bits; /* extra bits for each code or NULL */
  7143. this.extra_base = extra_base; /* base index for extra_bits */
  7144. this.elems = elems; /* max number of elements in the tree */
  7145. this.max_length = max_length; /* max bit length for the codes */
  7146. // show if `static_tree` has data or dummy - needed for monomorphic objects
  7147. this.has_stree = static_tree && static_tree.length;
  7148. };
  7149. var static_l_desc;
  7150. var static_d_desc;
  7151. var static_bl_desc;
  7152. var TreeDesc = function(dyn_tree, stat_desc) {
  7153. this.dyn_tree = dyn_tree; /* the dynamic tree */
  7154. this.max_code = 0; /* largest code with non zero frequency */
  7155. this.stat_desc = stat_desc; /* the corresponding static tree */
  7156. };
  7157. function d_code(dist) {
  7158. return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
  7159. }
  7160. /* ===========================================================================
  7161. * Output a short LSB first on the stream.
  7162. * IN assertion: there is enough room in pendingBuf.
  7163. */
  7164. function put_short (s, w) {
  7165. // put_byte(s, (uch)((w) & 0xff));
  7166. // put_byte(s, (uch)((ush)(w) >> 8));
  7167. s.pending_buf[s.pending++] = (w) & 0xff;
  7168. s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
  7169. }
  7170. /* ===========================================================================
  7171. * Send a value on a given number of bits.
  7172. * IN assertion: length <= 16 and value fits in length bits.
  7173. */
  7174. function send_bits(s, value, length) {
  7175. if (s.bi_valid > (Buf_size - length)) {
  7176. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  7177. put_short(s, s.bi_buf);
  7178. s.bi_buf = value >> (Buf_size - s.bi_valid);
  7179. s.bi_valid += length - Buf_size;
  7180. } else {
  7181. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  7182. s.bi_valid += length;
  7183. }
  7184. }
  7185. function send_code(s, c, tree) {
  7186. send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/);
  7187. }
  7188. /* ===========================================================================
  7189. * Reverse the first len bits of a code, using straightforward code (a faster
  7190. * method would use a table)
  7191. * IN assertion: 1 <= len <= 15
  7192. */
  7193. function bi_reverse(code, len) {
  7194. var res = 0;
  7195. do {
  7196. res |= code & 1;
  7197. code >>>= 1;
  7198. res <<= 1;
  7199. } while (--len > 0);
  7200. return res >>> 1;
  7201. }
  7202. /* ===========================================================================
  7203. * Flush the bit buffer, keeping at most 7 bits in it.
  7204. */
  7205. function bi_flush(s) {
  7206. if (s.bi_valid === 16) {
  7207. put_short(s, s.bi_buf);
  7208. s.bi_buf = 0;
  7209. s.bi_valid = 0;
  7210. } else if (s.bi_valid >= 8) {
  7211. s.pending_buf[s.pending++] = s.bi_buf & 0xff;
  7212. s.bi_buf >>= 8;
  7213. s.bi_valid -= 8;
  7214. }
  7215. }
  7216. /* ===========================================================================
  7217. * Compute the optimal bit lengths for a tree and update the total bit length
  7218. * for the current block.
  7219. * IN assertion: the fields freq and dad are set, heap[heap_max] and
  7220. * above are the tree nodes sorted by increasing frequency.
  7221. * OUT assertions: the field len is set to the optimal bit length, the
  7222. * array bl_count contains the frequencies for each bit length.
  7223. * The length opt_len is updated; static_len is also updated if stree is
  7224. * not null.
  7225. */
  7226. function gen_bitlen(s, desc)
  7227. // deflate_state *s;
  7228. // tree_desc *desc; /* the tree descriptor */
  7229. {
  7230. var tree = desc.dyn_tree;
  7231. var max_code = desc.max_code;
  7232. var stree = desc.stat_desc.static_tree;
  7233. var has_stree = desc.stat_desc.has_stree;
  7234. var extra = desc.stat_desc.extra_bits;
  7235. var base = desc.stat_desc.extra_base;
  7236. var max_length = desc.stat_desc.max_length;
  7237. var h; /* heap index */
  7238. var n, m; /* iterate over the tree elements */
  7239. var bits; /* bit length */
  7240. var xbits; /* extra bits */
  7241. var f; /* frequency */
  7242. var overflow = 0; /* number of elements with bit length too large */
  7243. for (bits = 0; bits <= MAX_BITS; bits++) {
  7244. s.bl_count[bits] = 0;
  7245. }
  7246. /* In a first pass, compute the optimal bit lengths (which may
  7247. * overflow in the case of the bit length tree).
  7248. */
  7249. tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */
  7250. for (h = s.heap_max+1; h < HEAP_SIZE; h++) {
  7251. n = s.heap[h];
  7252. bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
  7253. if (bits > max_length) {
  7254. bits = max_length;
  7255. overflow++;
  7256. }
  7257. tree[n*2 + 1]/*.Len*/ = bits;
  7258. /* We overwrite tree[n].Dad which is no longer needed */
  7259. if (n > max_code) { continue; } /* not a leaf node */
  7260. s.bl_count[bits]++;
  7261. xbits = 0;
  7262. if (n >= base) {
  7263. xbits = extra[n-base];
  7264. }
  7265. f = tree[n * 2]/*.Freq*/;
  7266. s.opt_len += f * (bits + xbits);
  7267. if (has_stree) {
  7268. s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits);
  7269. }
  7270. }
  7271. if (overflow === 0) { return; }
  7272. // Trace((stderr,"\nbit length overflow\n"));
  7273. /* This happens for example on obj2 and pic of the Calgary corpus */
  7274. /* Find the first bit length which could increase: */
  7275. do {
  7276. bits = max_length-1;
  7277. while (s.bl_count[bits] === 0) { bits--; }
  7278. s.bl_count[bits]--; /* move one leaf down the tree */
  7279. s.bl_count[bits+1] += 2; /* move one overflow item as its brother */
  7280. s.bl_count[max_length]--;
  7281. /* The brother of the overflow item also moves one step up,
  7282. * but this does not affect bl_count[max_length]
  7283. */
  7284. overflow -= 2;
  7285. } while (overflow > 0);
  7286. /* Now recompute all bit lengths, scanning in increasing frequency.
  7287. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
  7288. * lengths instead of fixing only the wrong ones. This idea is taken
  7289. * from 'ar' written by Haruhiko Okumura.)
  7290. */
  7291. for (bits = max_length; bits !== 0; bits--) {
  7292. n = s.bl_count[bits];
  7293. while (n !== 0) {
  7294. m = s.heap[--h];
  7295. if (m > max_code) { continue; }
  7296. if (tree[m*2 + 1]/*.Len*/ !== bits) {
  7297. // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
  7298. s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/;
  7299. tree[m*2 + 1]/*.Len*/ = bits;
  7300. }
  7301. n--;
  7302. }
  7303. }
  7304. }
  7305. /* ===========================================================================
  7306. * Generate the codes for a given tree and bit counts (which need not be
  7307. * optimal).
  7308. * IN assertion: the array bl_count contains the bit length statistics for
  7309. * the given tree and the field len is set for all tree elements.
  7310. * OUT assertion: the field code is set for all tree elements of non
  7311. * zero code length.
  7312. */
  7313. function gen_codes(tree, max_code, bl_count)
  7314. // ct_data *tree; /* the tree to decorate */
  7315. // int max_code; /* largest code with non zero frequency */
  7316. // ushf *bl_count; /* number of codes at each bit length */
  7317. {
  7318. var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */
  7319. var code = 0; /* running code value */
  7320. var bits; /* bit index */
  7321. var n; /* code index */
  7322. /* The distribution counts are first used to generate the code values
  7323. * without bit reversal.
  7324. */
  7325. for (bits = 1; bits <= MAX_BITS; bits++) {
  7326. next_code[bits] = code = (code + bl_count[bits-1]) << 1;
  7327. }
  7328. /* Check that the bit counts in bl_count are consistent. The last code
  7329. * must be all ones.
  7330. */
  7331. //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
  7332. // "inconsistent bit counts");
  7333. //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
  7334. for (n = 0; n <= max_code; n++) {
  7335. var len = tree[n*2 + 1]/*.Len*/;
  7336. if (len === 0) { continue; }
  7337. /* Now reverse the bits */
  7338. tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len);
  7339. //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
  7340. // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
  7341. }
  7342. }
  7343. /* ===========================================================================
  7344. * Initialize the various 'constant' tables.
  7345. */
  7346. function tr_static_init() {
  7347. var n; /* iterates over tree elements */
  7348. var bits; /* bit counter */
  7349. var length; /* length value */
  7350. var code; /* code value */
  7351. var dist; /* distance index */
  7352. var bl_count = new Array(MAX_BITS+1);
  7353. /* number of codes at each bit length for an optimal tree */
  7354. // do check in _tr_init()
  7355. //if (static_init_done) return;
  7356. /* For some embedded targets, global variables are not initialized: */
  7357. /*#ifdef NO_INIT_GLOBAL_POINTERS
  7358. static_l_desc.static_tree = static_ltree;
  7359. static_l_desc.extra_bits = extra_lbits;
  7360. static_d_desc.static_tree = static_dtree;
  7361. static_d_desc.extra_bits = extra_dbits;
  7362. static_bl_desc.extra_bits = extra_blbits;
  7363. #endif*/
  7364. /* Initialize the mapping length (0..255) -> length code (0..28) */
  7365. length = 0;
  7366. for (code = 0; code < LENGTH_CODES-1; code++) {
  7367. base_length[code] = length;
  7368. for (n = 0; n < (1<<extra_lbits[code]); n++) {
  7369. _length_code[length++] = code;
  7370. }
  7371. }
  7372. //Assert (length == 256, "tr_static_init: length != 256");
  7373. /* Note that the length 255 (match length 258) can be represented
  7374. * in two different ways: code 284 + 5 bits or code 285, so we
  7375. * overwrite length_code[255] to use the best encoding:
  7376. */
  7377. _length_code[length-1] = code;
  7378. /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
  7379. dist = 0;
  7380. for (code = 0 ; code < 16; code++) {
  7381. base_dist[code] = dist;
  7382. for (n = 0; n < (1<<extra_dbits[code]); n++) {
  7383. _dist_code[dist++] = code;
  7384. }
  7385. }
  7386. //Assert (dist == 256, "tr_static_init: dist != 256");
  7387. dist >>= 7; /* from now on, all distances are divided by 128 */
  7388. for ( ; code < D_CODES; code++) {
  7389. base_dist[code] = dist << 7;
  7390. for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
  7391. _dist_code[256 + dist++] = code;
  7392. }
  7393. }
  7394. //Assert (dist == 256, "tr_static_init: 256+dist != 512");
  7395. /* Construct the codes of the static literal tree */
  7396. for (bits = 0; bits <= MAX_BITS; bits++) {
  7397. bl_count[bits] = 0;
  7398. }
  7399. n = 0;
  7400. while (n <= 143) {
  7401. static_ltree[n*2 + 1]/*.Len*/ = 8;
  7402. n++;
  7403. bl_count[8]++;
  7404. }
  7405. while (n <= 255) {
  7406. static_ltree[n*2 + 1]/*.Len*/ = 9;
  7407. n++;
  7408. bl_count[9]++;
  7409. }
  7410. while (n <= 279) {
  7411. static_ltree[n*2 + 1]/*.Len*/ = 7;
  7412. n++;
  7413. bl_count[7]++;
  7414. }
  7415. while (n <= 287) {
  7416. static_ltree[n*2 + 1]/*.Len*/ = 8;
  7417. n++;
  7418. bl_count[8]++;
  7419. }
  7420. /* Codes 286 and 287 do not exist, but we must include them in the
  7421. * tree construction to get a canonical Huffman tree (longest code
  7422. * all ones)
  7423. */
  7424. gen_codes(static_ltree, L_CODES+1, bl_count);
  7425. /* The static distance tree is trivial: */
  7426. for (n = 0; n < D_CODES; n++) {
  7427. static_dtree[n*2 + 1]/*.Len*/ = 5;
  7428. static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5);
  7429. }
  7430. // Now data ready and we can init static trees
  7431. static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS);
  7432. static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
  7433. static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
  7434. //static_init_done = true;
  7435. }
  7436. /* ===========================================================================
  7437. * Initialize a new block.
  7438. */
  7439. function init_block(s) {
  7440. var n; /* iterates over tree elements */
  7441. /* Initialize the trees. */
  7442. for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; }
  7443. for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; }
  7444. for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; }
  7445. s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1;
  7446. s.opt_len = s.static_len = 0;
  7447. s.last_lit = s.matches = 0;
  7448. }
  7449. /* ===========================================================================
  7450. * Flush the bit buffer and align the output on a byte boundary
  7451. */
  7452. function bi_windup(s)
  7453. {
  7454. if (s.bi_valid > 8) {
  7455. put_short(s, s.bi_buf);
  7456. } else if (s.bi_valid > 0) {
  7457. //put_byte(s, (Byte)s->bi_buf);
  7458. s.pending_buf[s.pending++] = s.bi_buf;
  7459. }
  7460. s.bi_buf = 0;
  7461. s.bi_valid = 0;
  7462. }
  7463. /* ===========================================================================
  7464. * Copy a stored block, storing first the length and its
  7465. * one's complement if requested.
  7466. */
  7467. function copy_block(s, buf, len, header)
  7468. //DeflateState *s;
  7469. //charf *buf; /* the input data */
  7470. //unsigned len; /* its length */
  7471. //int header; /* true if block header must be written */
  7472. {
  7473. bi_windup(s); /* align on byte boundary */
  7474. if (header) {
  7475. put_short(s, len);
  7476. put_short(s, ~len);
  7477. }
  7478. // while (len--) {
  7479. // put_byte(s, *buf++);
  7480. // }
  7481. utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
  7482. s.pending += len;
  7483. }
  7484. /* ===========================================================================
  7485. * Compares to subtrees, using the tree depth as tie breaker when
  7486. * the subtrees have equal frequency. This minimizes the worst case length.
  7487. */
  7488. function smaller(tree, n, m, depth) {
  7489. var _n2 = n*2;
  7490. var _m2 = m*2;
  7491. return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
  7492. (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
  7493. }
  7494. /* ===========================================================================
  7495. * Restore the heap property by moving down the tree starting at node k,
  7496. * exchanging a node with the smallest of its two sons if necessary, stopping
  7497. * when the heap property is re-established (each father smaller than its
  7498. * two sons).
  7499. */
  7500. function pqdownheap(s, tree, k)
  7501. // deflate_state *s;
  7502. // ct_data *tree; /* the tree to restore */
  7503. // int k; /* node to move down */
  7504. {
  7505. var v = s.heap[k];
  7506. var j = k << 1; /* left son of k */
  7507. while (j <= s.heap_len) {
  7508. /* Set j to the smallest of the two sons: */
  7509. if (j < s.heap_len &&
  7510. smaller(tree, s.heap[j+1], s.heap[j], s.depth)) {
  7511. j++;
  7512. }
  7513. /* Exit if v is smaller than both sons */
  7514. if (smaller(tree, v, s.heap[j], s.depth)) { break; }
  7515. /* Exchange v with the smallest son */
  7516. s.heap[k] = s.heap[j];
  7517. k = j;
  7518. /* And continue down the tree, setting j to the left son of k */
  7519. j <<= 1;
  7520. }
  7521. s.heap[k] = v;
  7522. }
  7523. // inlined manually
  7524. // var SMALLEST = 1;
  7525. /* ===========================================================================
  7526. * Send the block data compressed using the given Huffman trees
  7527. */
  7528. function compress_block(s, ltree, dtree)
  7529. // deflate_state *s;
  7530. // const ct_data *ltree; /* literal tree */
  7531. // const ct_data *dtree; /* distance tree */
  7532. {
  7533. var dist; /* distance of matched string */
  7534. var lc; /* match length or unmatched char (if dist == 0) */
  7535. var lx = 0; /* running index in l_buf */
  7536. var code; /* the code to send */
  7537. var extra; /* number of extra bits to send */
  7538. if (s.last_lit !== 0) {
  7539. do {
  7540. dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]);
  7541. lc = s.pending_buf[s.l_buf + lx];
  7542. lx++;
  7543. if (dist === 0) {
  7544. send_code(s, lc, ltree); /* send a literal byte */
  7545. //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
  7546. } else {
  7547. /* Here, lc is the match length - MIN_MATCH */
  7548. code = _length_code[lc];
  7549. send_code(s, code+LITERALS+1, ltree); /* send the length code */
  7550. extra = extra_lbits[code];
  7551. if (extra !== 0) {
  7552. lc -= base_length[code];
  7553. send_bits(s, lc, extra); /* send the extra length bits */
  7554. }
  7555. dist--; /* dist is now the match distance - 1 */
  7556. code = d_code(dist);
  7557. //Assert (code < D_CODES, "bad d_code");
  7558. send_code(s, code, dtree); /* send the distance code */
  7559. extra = extra_dbits[code];
  7560. if (extra !== 0) {
  7561. dist -= base_dist[code];
  7562. send_bits(s, dist, extra); /* send the extra distance bits */
  7563. }
  7564. } /* literal or match pair ? */
  7565. /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
  7566. //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
  7567. // "pendingBuf overflow");
  7568. } while (lx < s.last_lit);
  7569. }
  7570. send_code(s, END_BLOCK, ltree);
  7571. }
  7572. /* ===========================================================================
  7573. * Construct one Huffman tree and assigns the code bit strings and lengths.
  7574. * Update the total bit length for the current block.
  7575. * IN assertion: the field freq is set for all tree elements.
  7576. * OUT assertions: the fields len and code are set to the optimal bit length
  7577. * and corresponding code. The length opt_len is updated; static_len is
  7578. * also updated if stree is not null. The field max_code is set.
  7579. */
  7580. function build_tree(s, desc)
  7581. // deflate_state *s;
  7582. // tree_desc *desc; /* the tree descriptor */
  7583. {
  7584. var tree = desc.dyn_tree;
  7585. var stree = desc.stat_desc.static_tree;
  7586. var has_stree = desc.stat_desc.has_stree;
  7587. var elems = desc.stat_desc.elems;
  7588. var n, m; /* iterate over heap elements */
  7589. var max_code = -1; /* largest code with non zero frequency */
  7590. var node; /* new node being created */
  7591. /* Construct the initial heap, with least frequent element in
  7592. * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
  7593. * heap[0] is not used.
  7594. */
  7595. s.heap_len = 0;
  7596. s.heap_max = HEAP_SIZE;
  7597. for (n = 0; n < elems; n++) {
  7598. if (tree[n * 2]/*.Freq*/ !== 0) {
  7599. s.heap[++s.heap_len] = max_code = n;
  7600. s.depth[n] = 0;
  7601. } else {
  7602. tree[n*2 + 1]/*.Len*/ = 0;
  7603. }
  7604. }
  7605. /* The pkzip format requires that at least one distance code exists,
  7606. * and that at least one bit should be sent even if there is only one
  7607. * possible code. So to avoid special checks later on we force at least
  7608. * two codes of non zero frequency.
  7609. */
  7610. while (s.heap_len < 2) {
  7611. node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
  7612. tree[node * 2]/*.Freq*/ = 1;
  7613. s.depth[node] = 0;
  7614. s.opt_len--;
  7615. if (has_stree) {
  7616. s.static_len -= stree[node*2 + 1]/*.Len*/;
  7617. }
  7618. /* node is 0 or 1 so it does not have extra bits */
  7619. }
  7620. desc.max_code = max_code;
  7621. /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
  7622. * establish sub-heaps of increasing lengths:
  7623. */
  7624. for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
  7625. /* Construct the Huffman tree by repeatedly combining the least two
  7626. * frequent nodes.
  7627. */
  7628. node = elems; /* next internal node of the tree */
  7629. do {
  7630. //pqremove(s, tree, n); /* n = node of least frequency */
  7631. /*** pqremove ***/
  7632. n = s.heap[1/*SMALLEST*/];
  7633. s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
  7634. pqdownheap(s, tree, 1/*SMALLEST*/);
  7635. /***/
  7636. m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
  7637. s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
  7638. s.heap[--s.heap_max] = m;
  7639. /* Create a new node father of n and m */
  7640. tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
  7641. s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
  7642. tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node;
  7643. /* and insert the new node in the heap */
  7644. s.heap[1/*SMALLEST*/] = node++;
  7645. pqdownheap(s, tree, 1/*SMALLEST*/);
  7646. } while (s.heap_len >= 2);
  7647. s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
  7648. /* At this point, the fields freq and dad are set. We can now
  7649. * generate the bit lengths.
  7650. */
  7651. gen_bitlen(s, desc);
  7652. /* The field len is now set, we can generate the bit codes */
  7653. gen_codes(tree, max_code, s.bl_count);
  7654. }
  7655. /* ===========================================================================
  7656. * Scan a literal or distance tree to determine the frequencies of the codes
  7657. * in the bit length tree.
  7658. */
  7659. function scan_tree(s, tree, max_code)
  7660. // deflate_state *s;
  7661. // ct_data *tree; /* the tree to be scanned */
  7662. // int max_code; /* and its largest code of non zero frequency */
  7663. {
  7664. var n; /* iterates over all tree elements */
  7665. var prevlen = -1; /* last emitted length */
  7666. var curlen; /* length of current code */
  7667. var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
  7668. var count = 0; /* repeat count of the current code */
  7669. var max_count = 7; /* max repeat count */
  7670. var min_count = 4; /* min repeat count */
  7671. if (nextlen === 0) {
  7672. max_count = 138;
  7673. min_count = 3;
  7674. }
  7675. tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */
  7676. for (n = 0; n <= max_code; n++) {
  7677. curlen = nextlen;
  7678. nextlen = tree[(n+1)*2 + 1]/*.Len*/;
  7679. if (++count < max_count && curlen === nextlen) {
  7680. continue;
  7681. } else if (count < min_count) {
  7682. s.bl_tree[curlen * 2]/*.Freq*/ += count;
  7683. } else if (curlen !== 0) {
  7684. if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
  7685. s.bl_tree[REP_3_6*2]/*.Freq*/++;
  7686. } else if (count <= 10) {
  7687. s.bl_tree[REPZ_3_10*2]/*.Freq*/++;
  7688. } else {
  7689. s.bl_tree[REPZ_11_138*2]/*.Freq*/++;
  7690. }
  7691. count = 0;
  7692. prevlen = curlen;
  7693. if (nextlen === 0) {
  7694. max_count = 138;
  7695. min_count = 3;
  7696. } else if (curlen === nextlen) {
  7697. max_count = 6;
  7698. min_count = 3;
  7699. } else {
  7700. max_count = 7;
  7701. min_count = 4;
  7702. }
  7703. }
  7704. }
  7705. /* ===========================================================================
  7706. * Send a literal or distance tree in compressed form, using the codes in
  7707. * bl_tree.
  7708. */
  7709. function send_tree(s, tree, max_code)
  7710. // deflate_state *s;
  7711. // ct_data *tree; /* the tree to be scanned */
  7712. // int max_code; /* and its largest code of non zero frequency */
  7713. {
  7714. var n; /* iterates over all tree elements */
  7715. var prevlen = -1; /* last emitted length */
  7716. var curlen; /* length of current code */
  7717. var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */
  7718. var count = 0; /* repeat count of the current code */
  7719. var max_count = 7; /* max repeat count */
  7720. var min_count = 4; /* min repeat count */
  7721. /* tree[max_code+1].Len = -1; */ /* guard already set */
  7722. if (nextlen === 0) {
  7723. max_count = 138;
  7724. min_count = 3;
  7725. }
  7726. for (n = 0; n <= max_code; n++) {
  7727. curlen = nextlen;
  7728. nextlen = tree[(n+1)*2 + 1]/*.Len*/;
  7729. if (++count < max_count && curlen === nextlen) {
  7730. continue;
  7731. } else if (count < min_count) {
  7732. do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
  7733. } else if (curlen !== 0) {
  7734. if (curlen !== prevlen) {
  7735. send_code(s, curlen, s.bl_tree);
  7736. count--;
  7737. }
  7738. //Assert(count >= 3 && count <= 6, " 3_6?");
  7739. send_code(s, REP_3_6, s.bl_tree);
  7740. send_bits(s, count-3, 2);
  7741. } else if (count <= 10) {
  7742. send_code(s, REPZ_3_10, s.bl_tree);
  7743. send_bits(s, count-3, 3);
  7744. } else {
  7745. send_code(s, REPZ_11_138, s.bl_tree);
  7746. send_bits(s, count-11, 7);
  7747. }
  7748. count = 0;
  7749. prevlen = curlen;
  7750. if (nextlen === 0) {
  7751. max_count = 138;
  7752. min_count = 3;
  7753. } else if (curlen === nextlen) {
  7754. max_count = 6;
  7755. min_count = 3;
  7756. } else {
  7757. max_count = 7;
  7758. min_count = 4;
  7759. }
  7760. }
  7761. }
  7762. /* ===========================================================================
  7763. * Construct the Huffman tree for the bit lengths and return the index in
  7764. * bl_order of the last bit length code to send.
  7765. */
  7766. function build_bl_tree(s) {
  7767. var max_blindex; /* index of last bit length code of non zero freq */
  7768. /* Determine the bit length frequencies for literal and distance trees */
  7769. scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
  7770. scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
  7771. /* Build the bit length tree: */
  7772. build_tree(s, s.bl_desc);
  7773. /* opt_len now includes the length of the tree representations, except
  7774. * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
  7775. */
  7776. /* Determine the number of bit length codes to send. The pkzip format
  7777. * requires that at least 4 bit length codes be sent. (appnote.txt says
  7778. * 3 but the actual value used is 4.)
  7779. */
  7780. for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
  7781. if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) {
  7782. break;
  7783. }
  7784. }
  7785. /* Update opt_len to include the bit length tree and counts */
  7786. s.opt_len += 3*(max_blindex+1) + 5+5+4;
  7787. //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
  7788. // s->opt_len, s->static_len));
  7789. return max_blindex;
  7790. }
  7791. /* ===========================================================================
  7792. * Send the header for a block using dynamic Huffman trees: the counts, the
  7793. * lengths of the bit length codes, the literal tree and the distance tree.
  7794. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  7795. */
  7796. function send_all_trees(s, lcodes, dcodes, blcodes)
  7797. // deflate_state *s;
  7798. // int lcodes, dcodes, blcodes; /* number of codes for each tree */
  7799. {
  7800. var rank; /* index in bl_order */
  7801. //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
  7802. //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
  7803. // "too many codes");
  7804. //Tracev((stderr, "\nbl counts: "));
  7805. send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
  7806. send_bits(s, dcodes-1, 5);
  7807. send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
  7808. for (rank = 0; rank < blcodes; rank++) {
  7809. //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
  7810. send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3);
  7811. }
  7812. //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
  7813. send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */
  7814. //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
  7815. send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */
  7816. //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
  7817. }
  7818. /* ===========================================================================
  7819. * Check if the data type is TEXT or BINARY, using the following algorithm:
  7820. * - TEXT if the two conditions below are satisfied:
  7821. * a) There are no non-portable control characters belonging to the
  7822. * "black list" (0..6, 14..25, 28..31).
  7823. * b) There is at least one printable character belonging to the
  7824. * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
  7825. * - BINARY otherwise.
  7826. * - The following partially-portable control characters form a
  7827. * "gray list" that is ignored in this detection algorithm:
  7828. * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
  7829. * IN assertion: the fields Freq of dyn_ltree are set.
  7830. */
  7831. function detect_data_type(s) {
  7832. /* black_mask is the bit mask of black-listed bytes
  7833. * set bits 0..6, 14..25, and 28..31
  7834. * 0xf3ffc07f = binary 11110011111111111100000001111111
  7835. */
  7836. var black_mask = 0xf3ffc07f;
  7837. var n;
  7838. /* Check for non-textual ("black-listed") bytes. */
  7839. for (n = 0; n <= 31; n++, black_mask >>>= 1) {
  7840. if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) {
  7841. return Z_BINARY;
  7842. }
  7843. }
  7844. /* Check for textual ("white-listed") bytes. */
  7845. if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
  7846. s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
  7847. return Z_TEXT;
  7848. }
  7849. for (n = 32; n < LITERALS; n++) {
  7850. if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
  7851. return Z_TEXT;
  7852. }
  7853. }
  7854. /* There are no "black-listed" or "white-listed" bytes:
  7855. * this stream either is empty or has tolerated ("gray-listed") bytes only.
  7856. */
  7857. return Z_BINARY;
  7858. }
  7859. var static_init_done = false;
  7860. /* ===========================================================================
  7861. * Initialize the tree data structures for a new zlib stream.
  7862. */
  7863. function _tr_init(s)
  7864. {
  7865. if (!static_init_done) {
  7866. tr_static_init();
  7867. static_init_done = true;
  7868. }
  7869. s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
  7870. s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
  7871. s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
  7872. s.bi_buf = 0;
  7873. s.bi_valid = 0;
  7874. /* Initialize the first block of the first file: */
  7875. init_block(s);
  7876. }
  7877. /* ===========================================================================
  7878. * Send a stored block
  7879. */
  7880. function _tr_stored_block(s, buf, stored_len, last)
  7881. //DeflateState *s;
  7882. //charf *buf; /* input block */
  7883. //ulg stored_len; /* length of input block */
  7884. //int last; /* one if this is the last block for a file */
  7885. {
  7886. send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */
  7887. copy_block(s, buf, stored_len, true); /* with header */
  7888. }
  7889. /* ===========================================================================
  7890. * Send one empty static block to give enough lookahead for inflate.
  7891. * This takes 10 bits, of which 7 may remain in the bit buffer.
  7892. */
  7893. function _tr_align(s) {
  7894. send_bits(s, STATIC_TREES<<1, 3);
  7895. send_code(s, END_BLOCK, static_ltree);
  7896. bi_flush(s);
  7897. }
  7898. /* ===========================================================================
  7899. * Determine the best encoding for the current block: dynamic trees, static
  7900. * trees or store, and output the encoded block to the zip file.
  7901. */
  7902. function _tr_flush_block(s, buf, stored_len, last)
  7903. //DeflateState *s;
  7904. //charf *buf; /* input block, or NULL if too old */
  7905. //ulg stored_len; /* length of input block */
  7906. //int last; /* one if this is the last block for a file */
  7907. {
  7908. var opt_lenb, static_lenb; /* opt_len and static_len in bytes */
  7909. var max_blindex = 0; /* index of last bit length code of non zero freq */
  7910. /* Build the Huffman trees unless a stored block is forced */
  7911. if (s.level > 0) {
  7912. /* Check if the file is binary or text */
  7913. if (s.strm.data_type === Z_UNKNOWN) {
  7914. s.strm.data_type = detect_data_type(s);
  7915. }
  7916. /* Construct the literal and distance trees */
  7917. build_tree(s, s.l_desc);
  7918. // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
  7919. // s->static_len));
  7920. build_tree(s, s.d_desc);
  7921. // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
  7922. // s->static_len));
  7923. /* At this point, opt_len and static_len are the total bit lengths of
  7924. * the compressed block data, excluding the tree representations.
  7925. */
  7926. /* Build the bit length tree for the above two trees, and get the index
  7927. * in bl_order of the last bit length code to send.
  7928. */
  7929. max_blindex = build_bl_tree(s);
  7930. /* Determine the best encoding. Compute the block lengths in bytes. */
  7931. opt_lenb = (s.opt_len+3+7) >>> 3;
  7932. static_lenb = (s.static_len+3+7) >>> 3;
  7933. // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
  7934. // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
  7935. // s->last_lit));
  7936. if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
  7937. } else {
  7938. // Assert(buf != (char*)0, "lost buf");
  7939. opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
  7940. }
  7941. if ((stored_len+4 <= opt_lenb) && (buf !== -1)) {
  7942. /* 4: two words for the lengths */
  7943. /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
  7944. * Otherwise we can't have processed more than WSIZE input bytes since
  7945. * the last block flush, because compression would have been
  7946. * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
  7947. * transform a block into a stored block.
  7948. */
  7949. _tr_stored_block(s, buf, stored_len, last);
  7950. } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
  7951. send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3);
  7952. compress_block(s, static_ltree, static_dtree);
  7953. } else {
  7954. send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3);
  7955. send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1);
  7956. compress_block(s, s.dyn_ltree, s.dyn_dtree);
  7957. }
  7958. // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
  7959. /* The above check is made mod 2^32, for files larger than 512 MB
  7960. * and uLong implemented on 32 bits.
  7961. */
  7962. init_block(s);
  7963. if (last) {
  7964. bi_windup(s);
  7965. }
  7966. // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
  7967. // s->compressed_len-7*last));
  7968. }
  7969. /* ===========================================================================
  7970. * Save the match info and tally the frequency counts. Return true if
  7971. * the current block must be flushed.
  7972. */
  7973. function _tr_tally(s, dist, lc)
  7974. // deflate_state *s;
  7975. // unsigned dist; /* distance of matched string */
  7976. // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
  7977. {
  7978. //var out_length, in_length, dcode;
  7979. s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;
  7980. s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
  7981. s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
  7982. s.last_lit++;
  7983. if (dist === 0) {
  7984. /* lc is the unmatched char */
  7985. s.dyn_ltree[lc*2]/*.Freq*/++;
  7986. } else {
  7987. s.matches++;
  7988. /* Here, lc is the match length - MIN_MATCH */
  7989. dist--; /* dist = match distance - 1 */
  7990. //Assert((ush)dist < (ush)MAX_DIST(s) &&
  7991. // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
  7992. // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
  7993. s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++;
  7994. s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
  7995. }
  7996. // (!) This block is disabled in zlib defailts,
  7997. // don't enable it for binary compatibility
  7998. //#ifdef TRUNCATE_BLOCK
  7999. // /* Try to guess if it is profitable to stop the current block here */
  8000. // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
  8001. // /* Compute an upper bound for the compressed length */
  8002. // out_length = s.last_lit*8;
  8003. // in_length = s.strstart - s.block_start;
  8004. //
  8005. // for (dcode = 0; dcode < D_CODES; dcode++) {
  8006. // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
  8007. // }
  8008. // out_length >>>= 3;
  8009. // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
  8010. // // s->last_lit, in_length, out_length,
  8011. // // 100L - out_length*100L/in_length));
  8012. // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
  8013. // return true;
  8014. // }
  8015. // }
  8016. //#endif
  8017. return (s.last_lit === s.lit_bufsize-1);
  8018. /* We avoid equality with lit_bufsize because of wraparound at 64K
  8019. * on 16 bit machines and because stored blocks are restricted to
  8020. * 64K-1 bytes.
  8021. */
  8022. }
  8023. exports._tr_init = _tr_init;
  8024. exports._tr_stored_block = _tr_stored_block;
  8025. exports._tr_flush_block = _tr_flush_block;
  8026. exports._tr_tally = _tr_tally;
  8027. exports._tr_align = _tr_align;
  8028. },{"../utils/common":27}],39:[function(_dereq_,module,exports){
  8029. 'use strict';
  8030. function ZStream() {
  8031. /* next input byte */
  8032. this.input = null; // JS specific, because we have no pointers
  8033. this.next_in = 0;
  8034. /* number of bytes available at input */
  8035. this.avail_in = 0;
  8036. /* total number of input bytes read so far */
  8037. this.total_in = 0;
  8038. /* next output byte should be put there */
  8039. this.output = null; // JS specific, because we have no pointers
  8040. this.next_out = 0;
  8041. /* remaining free space at output */
  8042. this.avail_out = 0;
  8043. /* total number of bytes output so far */
  8044. this.total_out = 0;
  8045. /* last error message, NULL if no error */
  8046. this.msg = ''/*Z_NULL*/;
  8047. /* not visible by applications */
  8048. this.state = null;
  8049. /* best guess about the data type: binary or text */
  8050. this.data_type = 2/*Z_UNKNOWN*/;
  8051. /* adler32 value of the uncompressed data */
  8052. this.adler = 0;
  8053. }
  8054. module.exports = ZStream;
  8055. },{}]},{},[9])
  8056. (9)
  8057. });
  8058. /*! pdfmake v0.1.32, @license MIT, @link http://pdfmake.org */
  8059. (function webpackUniversalModuleDefinition(root, factory) {
  8060. if(typeof exports === 'object' && typeof module === 'object')
  8061. module.exports = factory();
  8062. else if(typeof define === 'function' && define.amd)
  8063. define([], factory);
  8064. else {
  8065. var a = factory();
  8066. for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
  8067. }
  8068. })(this, function() {
  8069. return /******/ (function(modules) { // webpackBootstrap
  8070. /******/ // The module cache
  8071. /******/ var installedModules = {};
  8072. /******/ // The require function
  8073. /******/ function __webpack_require__(moduleId) {
  8074. /******/ // Check if module is in cache
  8075. /******/ if(installedModules[moduleId])
  8076. /******/ return installedModules[moduleId].exports;
  8077. /******/ // Create a new module (and put it into the cache)
  8078. /******/ var module = installedModules[moduleId] = {
  8079. /******/ exports: {},
  8080. /******/ id: moduleId,
  8081. /******/ loaded: false
  8082. /******/ };
  8083. /******/ // Execute the module function
  8084. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  8085. /******/ // Flag the module as loaded
  8086. /******/ module.loaded = true;
  8087. /******/ // Return the exports of the module
  8088. /******/ return module.exports;
  8089. /******/ }
  8090. /******/ // expose the modules object (__webpack_modules__)
  8091. /******/ __webpack_require__.m = modules;
  8092. /******/ // expose the module cache
  8093. /******/ __webpack_require__.c = installedModules;
  8094. /******/ // __webpack_public_path__
  8095. /******/ __webpack_require__.p = "";
  8096. /******/ // Load entry module and return exports
  8097. /******/ return __webpack_require__(0);
  8098. /******/ })
  8099. /************************************************************************/
  8100. /******/ ([
  8101. /* 0 */
  8102. /***/ (function(module, exports, __webpack_require__) {
  8103. /* WEBPACK VAR INJECTION */(function(global) {module.exports = global["pdfMake"] = __webpack_require__(1);
  8104. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  8105. /***/ }),
  8106. /* 1 */
  8107. /***/ (function(module, exports, __webpack_require__) {
  8108. /* WEBPACK VAR INJECTION */(function(Buffer, global) {/* jslint node: true */
  8109. /* jslint browser: true */
  8110. 'use strict';
  8111. var PdfPrinter = __webpack_require__(6);
  8112. var FileSaver = __webpack_require__(300);
  8113. var saveAs = FileSaver.saveAs;
  8114. var defaultClientFonts = {
  8115. Roboto: {
  8116. normal: 'Roboto-Regular.ttf',
  8117. bold: 'Roboto-Medium.ttf',
  8118. italics: 'Roboto-Italic.ttf',
  8119. bolditalics: 'Roboto-MediumItalic.ttf'
  8120. }
  8121. };
  8122. function Document(docDefinition, tableLayouts, fonts, vfs) {
  8123. this.docDefinition = docDefinition;
  8124. this.tableLayouts = tableLayouts || null;
  8125. this.fonts = fonts || defaultClientFonts;
  8126. this.vfs = vfs;
  8127. }
  8128. function canCreatePdf() {
  8129. // Ensure the browser provides the level of support needed
  8130. if (!Object.keys) {
  8131. return false;
  8132. }
  8133. return true;
  8134. }
  8135. Document.prototype._createDoc = function (options, callback) {
  8136. options = options || {};
  8137. if (this.tableLayouts) {
  8138. options.tableLayouts = this.tableLayouts;
  8139. }
  8140. var printer = new PdfPrinter(this.fonts);
  8141. printer.fs.bindFS(this.vfs);
  8142. var doc = printer.createPdfKitDocument(this.docDefinition, options);
  8143. var chunks = [];
  8144. var result;
  8145. doc.on('readable', function () {
  8146. var chunk;
  8147. while ((chunk = doc.read(9007199254740991)) !== null) {
  8148. chunks.push(chunk);
  8149. }
  8150. });
  8151. doc.on('end', function () {
  8152. result = Buffer.concat(chunks);
  8153. callback(result, doc._pdfMakePages);
  8154. });
  8155. doc.end();
  8156. };
  8157. Document.prototype._getPages = function (options, cb) {
  8158. if (!cb) {
  8159. throw '_getPages is an async method and needs a callback argument';
  8160. }
  8161. this._createDoc(options, function (ignoreBuffer, pages) {
  8162. cb(pages);
  8163. });
  8164. };
  8165. Document.prototype._bufferToBlob = function (buffer) {
  8166. var blob;
  8167. try {
  8168. blob = new Blob([buffer], {type: 'application/pdf'});
  8169. } catch (e) {
  8170. // Old browser which can't handle it without making it an byte array (ie10)
  8171. if (e.name === 'InvalidStateError') {
  8172. var byteArray = new Uint8Array(buffer);
  8173. blob = new Blob([byteArray.buffer], {type: 'application/pdf'});
  8174. }
  8175. }
  8176. if (!blob) {
  8177. throw 'Could not generate blob';
  8178. }
  8179. return blob;
  8180. };
  8181. Document.prototype._openWindow = function () {
  8182. // we have to open the window immediately and store the reference
  8183. // otherwise popup blockers will stop us
  8184. var win = global.open('', '_blank');
  8185. if (win === null) {
  8186. throw 'Open PDF in new window blocked by browser';
  8187. }
  8188. return win;
  8189. };
  8190. Document.prototype._openPdf = function (options, win) {
  8191. if (!win) {
  8192. win = this._openWindow();
  8193. }
  8194. try {
  8195. this.getBlob(function (result) {
  8196. var urlCreator = global.URL || global.webkitURL;
  8197. var pdfUrl = urlCreator.createObjectURL(result);
  8198. win.location.href = pdfUrl;
  8199. }, options);
  8200. } catch (e) {
  8201. win.close();
  8202. throw e;
  8203. }
  8204. };
  8205. Document.prototype.open = function (options, win) {
  8206. options = options || {};
  8207. options.autoPrint = false;
  8208. win = win || null;
  8209. this._openPdf(options, win);
  8210. };
  8211. Document.prototype.print = function (options, win) {
  8212. options = options || {};
  8213. options.autoPrint = true;
  8214. win = win || null;
  8215. this._openPdf(options, win);
  8216. };
  8217. Document.prototype.download = function (defaultFileName, cb, options) {
  8218. if (typeof defaultFileName === 'function') {
  8219. cb = defaultFileName;
  8220. defaultFileName = null;
  8221. }
  8222. defaultFileName = defaultFileName || 'file.pdf';
  8223. this.getBlob(function (result) {
  8224. saveAs(result, defaultFileName);
  8225. if (typeof cb === 'function') {
  8226. cb();
  8227. }
  8228. }, options);
  8229. };
  8230. Document.prototype.getBase64 = function (cb, options) {
  8231. if (!cb) {
  8232. throw 'getBase64 is an async method and needs a callback argument';
  8233. }
  8234. this.getBuffer(function (buffer) {
  8235. cb(buffer.toString('base64'));
  8236. }, options);
  8237. };
  8238. Document.prototype.getDataUrl = function (cb, options) {
  8239. if (!cb) {
  8240. throw 'getDataUrl is an async method and needs a callback argument';
  8241. }
  8242. this.getBuffer(function (buffer) {
  8243. cb('data:application/pdf;base64,' + buffer.toString('base64'));
  8244. }, options);
  8245. };
  8246. Document.prototype.getBlob = function (cb, options) {
  8247. if (!cb) {
  8248. throw 'getBlob is an async method and needs a callback argument';
  8249. }
  8250. var that = this;
  8251. this.getBuffer(function (result) {
  8252. var blob = that._bufferToBlob(result);
  8253. cb(blob);
  8254. }, options);
  8255. };
  8256. Document.prototype.getBuffer = function (cb, options) {
  8257. if (!cb) {
  8258. throw 'getBuffer is an async method and needs a callback argument';
  8259. }
  8260. this._createDoc(options, function (buffer) {
  8261. cb(buffer);
  8262. });
  8263. };
  8264. module.exports = {
  8265. createPdf: function (docDefinition) {
  8266. if (!canCreatePdf()) {
  8267. throw 'Your browser does not provide the level of support needed';
  8268. }
  8269. return new Document(docDefinition, global.pdfMake.tableLayouts, global.pdfMake.fonts, global.pdfMake.vfs);
  8270. }
  8271. };
  8272. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer, (function() { return this; }())))
  8273. /***/ }),
  8274. /* 2 */
  8275. /***/ (function(module, exports, __webpack_require__) {
  8276. /* WEBPACK VAR INJECTION */(function(global) {/*!
  8277. * The buffer module from node.js, for the browser.
  8278. *
  8279. * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
  8280. * @license MIT
  8281. */
  8282. /* eslint-disable no-proto */
  8283. 'use strict'
  8284. var base64 = __webpack_require__(3)
  8285. var ieee754 = __webpack_require__(4)
  8286. var isArray = __webpack_require__(5)
  8287. exports.Buffer = Buffer
  8288. exports.SlowBuffer = SlowBuffer
  8289. exports.INSPECT_MAX_BYTES = 50
  8290. /**
  8291. * If `Buffer.TYPED_ARRAY_SUPPORT`:
  8292. * === true Use Uint8Array implementation (fastest)
  8293. * === false Use Object implementation (most compatible, even IE6)
  8294. *
  8295. * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
  8296. * Opera 11.6+, iOS 4.2+.
  8297. *
  8298. * Due to various browser bugs, sometimes the Object implementation will be used even
  8299. * when the browser supports typed arrays.
  8300. *
  8301. * Note:
  8302. *
  8303. * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
  8304. * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
  8305. *
  8306. * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
  8307. *
  8308. * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
  8309. * incorrect length in some situations.
  8310. * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
  8311. * get the Object implementation, which is slower but behaves correctly.
  8312. */
  8313. Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
  8314. ? global.TYPED_ARRAY_SUPPORT
  8315. : typedArraySupport()
  8316. /*
  8317. * Export kMaxLength after typed array support is determined.
  8318. */
  8319. exports.kMaxLength = kMaxLength()
  8320. function typedArraySupport () {
  8321. try {
  8322. var arr = new Uint8Array(1)
  8323. arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
  8324. return arr.foo() === 42 && // typed array instances can be augmented
  8325. typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
  8326. arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
  8327. } catch (e) {
  8328. return false
  8329. }
  8330. }
  8331. function kMaxLength () {
  8332. return Buffer.TYPED_ARRAY_SUPPORT
  8333. ? 0x7fffffff
  8334. : 0x3fffffff
  8335. }
  8336. function createBuffer (that, length) {
  8337. if (kMaxLength() < length) {
  8338. throw new RangeError('Invalid typed array length')
  8339. }
  8340. if (Buffer.TYPED_ARRAY_SUPPORT) {
  8341. // Return an augmented `Uint8Array` instance, for best performance
  8342. that = new Uint8Array(length)
  8343. that.__proto__ = Buffer.prototype
  8344. } else {
  8345. // Fallback: Return an object instance of the Buffer class
  8346. if (that === null) {
  8347. that = new Buffer(length)
  8348. }
  8349. that.length = length
  8350. }
  8351. return that
  8352. }
  8353. /**
  8354. * The Buffer constructor returns instances of `Uint8Array` that have their
  8355. * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
  8356. * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
  8357. * and the `Uint8Array` methods. Square bracket notation works as expected -- it
  8358. * returns a single octet.
  8359. *
  8360. * The `Uint8Array` prototype remains unmodified.
  8361. */
  8362. function Buffer (arg, encodingOrOffset, length) {
  8363. if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
  8364. return new Buffer(arg, encodingOrOffset, length)
  8365. }
  8366. // Common case.
  8367. if (typeof arg === 'number') {
  8368. if (typeof encodingOrOffset === 'string') {
  8369. throw new Error(
  8370. 'If encoding is specified then the first argument must be a string'
  8371. )
  8372. }
  8373. return allocUnsafe(this, arg)
  8374. }
  8375. return from(this, arg, encodingOrOffset, length)
  8376. }
  8377. Buffer.poolSize = 8192 // not used by this implementation
  8378. // TODO: Legacy, not needed anymore. Remove in next major version.
  8379. Buffer._augment = function (arr) {
  8380. arr.__proto__ = Buffer.prototype
  8381. return arr
  8382. }
  8383. function from (that, value, encodingOrOffset, length) {
  8384. if (typeof value === 'number') {
  8385. throw new TypeError('"value" argument must not be a number')
  8386. }
  8387. if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
  8388. return fromArrayBuffer(that, value, encodingOrOffset, length)
  8389. }
  8390. if (typeof value === 'string') {
  8391. return fromString(that, value, encodingOrOffset)
  8392. }
  8393. return fromObject(that, value)
  8394. }
  8395. /**
  8396. * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
  8397. * if value is a number.
  8398. * Buffer.from(str[, encoding])
  8399. * Buffer.from(array)
  8400. * Buffer.from(buffer)
  8401. * Buffer.from(arrayBuffer[, byteOffset[, length]])
  8402. **/
  8403. Buffer.from = function (value, encodingOrOffset, length) {
  8404. return from(null, value, encodingOrOffset, length)
  8405. }
  8406. if (Buffer.TYPED_ARRAY_SUPPORT) {
  8407. Buffer.prototype.__proto__ = Uint8Array.prototype
  8408. Buffer.__proto__ = Uint8Array
  8409. if (typeof Symbol !== 'undefined' && Symbol.species &&
  8410. Buffer[Symbol.species] === Buffer) {
  8411. // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
  8412. Object.defineProperty(Buffer, Symbol.species, {
  8413. value: null,
  8414. configurable: true
  8415. })
  8416. }
  8417. }
  8418. function assertSize (size) {
  8419. if (typeof size !== 'number') {
  8420. throw new TypeError('"size" argument must be a number')
  8421. } else if (size < 0) {
  8422. throw new RangeError('"size" argument must not be negative')
  8423. }
  8424. }
  8425. function alloc (that, size, fill, encoding) {
  8426. assertSize(size)
  8427. if (size <= 0) {
  8428. return createBuffer(that, size)
  8429. }
  8430. if (fill !== undefined) {
  8431. // Only pay attention to encoding if it's a string. This
  8432. // prevents accidentally sending in a number that would
  8433. // be interpretted as a start offset.
  8434. return typeof encoding === 'string'
  8435. ? createBuffer(that, size).fill(fill, encoding)
  8436. : createBuffer(that, size).fill(fill)
  8437. }
  8438. return createBuffer(that, size)
  8439. }
  8440. /**
  8441. * Creates a new filled Buffer instance.
  8442. * alloc(size[, fill[, encoding]])
  8443. **/
  8444. Buffer.alloc = function (size, fill, encoding) {
  8445. return alloc(null, size, fill, encoding)
  8446. }
  8447. function allocUnsafe (that, size) {
  8448. assertSize(size)
  8449. that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
  8450. if (!Buffer.TYPED_ARRAY_SUPPORT) {
  8451. for (var i = 0; i < size; ++i) {
  8452. that[i] = 0
  8453. }
  8454. }
  8455. return that
  8456. }
  8457. /**
  8458. * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
  8459. * */
  8460. Buffer.allocUnsafe = function (size) {
  8461. return allocUnsafe(null, size)
  8462. }
  8463. /**
  8464. * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
  8465. */
  8466. Buffer.allocUnsafeSlow = function (size) {
  8467. return allocUnsafe(null, size)
  8468. }
  8469. function fromString (that, string, encoding) {
  8470. if (typeof encoding !== 'string' || encoding === '') {
  8471. encoding = 'utf8'
  8472. }
  8473. if (!Buffer.isEncoding(encoding)) {
  8474. throw new TypeError('"encoding" must be a valid string encoding')
  8475. }
  8476. var length = byteLength(string, encoding) | 0
  8477. that = createBuffer(that, length)
  8478. var actual = that.write(string, encoding)
  8479. if (actual !== length) {
  8480. // Writing a hex string, for example, that contains invalid characters will
  8481. // cause everything after the first invalid character to be ignored. (e.g.
  8482. // 'abxxcd' will be treated as 'ab')
  8483. that = that.slice(0, actual)
  8484. }
  8485. return that
  8486. }
  8487. function fromArrayLike (that, array) {
  8488. var length = array.length < 0 ? 0 : checked(array.length) | 0
  8489. that = createBuffer(that, length)
  8490. for (var i = 0; i < length; i += 1) {
  8491. that[i] = array[i] & 255
  8492. }
  8493. return that
  8494. }
  8495. function fromArrayBuffer (that, array, byteOffset, length) {
  8496. array.byteLength // this throws if `array` is not a valid ArrayBuffer
  8497. if (byteOffset < 0 || array.byteLength < byteOffset) {
  8498. throw new RangeError('\'offset\' is out of bounds')
  8499. }
  8500. if (array.byteLength < byteOffset + (length || 0)) {
  8501. throw new RangeError('\'length\' is out of bounds')
  8502. }
  8503. if (byteOffset === undefined && length === undefined) {
  8504. array = new Uint8Array(array)
  8505. } else if (length === undefined) {
  8506. array = new Uint8Array(array, byteOffset)
  8507. } else {
  8508. array = new Uint8Array(array, byteOffset, length)
  8509. }
  8510. if (Buffer.TYPED_ARRAY_SUPPORT) {
  8511. // Return an augmented `Uint8Array` instance, for best performance
  8512. that = array
  8513. that.__proto__ = Buffer.prototype
  8514. } else {
  8515. // Fallback: Return an object instance of the Buffer class
  8516. that = fromArrayLike(that, array)
  8517. }
  8518. return that
  8519. }
  8520. function fromObject (that, obj) {
  8521. if (Buffer.isBuffer(obj)) {
  8522. var len = checked(obj.length) | 0
  8523. that = createBuffer(that, len)
  8524. if (that.length === 0) {
  8525. return that
  8526. }
  8527. obj.copy(that, 0, 0, len)
  8528. return that
  8529. }
  8530. if (obj) {
  8531. if ((typeof ArrayBuffer !== 'undefined' &&
  8532. obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
  8533. if (typeof obj.length !== 'number' || isnan(obj.length)) {
  8534. return createBuffer(that, 0)
  8535. }
  8536. return fromArrayLike(that, obj)
  8537. }
  8538. if (obj.type === 'Buffer' && isArray(obj.data)) {
  8539. return fromArrayLike(that, obj.data)
  8540. }
  8541. }
  8542. throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
  8543. }
  8544. function checked (length) {
  8545. // Note: cannot use `length < kMaxLength()` here because that fails when
  8546. // length is NaN (which is otherwise coerced to zero.)
  8547. if (length >= kMaxLength()) {
  8548. throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
  8549. 'size: 0x' + kMaxLength().toString(16) + ' bytes')
  8550. }
  8551. return length | 0
  8552. }
  8553. function SlowBuffer (length) {
  8554. if (+length != length) { // eslint-disable-line eqeqeq
  8555. length = 0
  8556. }
  8557. return Buffer.alloc(+length)
  8558. }
  8559. Buffer.isBuffer = function isBuffer (b) {
  8560. return !!(b != null && b._isBuffer)
  8561. }
  8562. Buffer.compare = function compare (a, b) {
  8563. if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
  8564. throw new TypeError('Arguments must be Buffers')
  8565. }
  8566. if (a === b) return 0
  8567. var x = a.length
  8568. var y = b.length
  8569. for (var i = 0, len = Math.min(x, y); i < len; ++i) {
  8570. if (a[i] !== b[i]) {
  8571. x = a[i]
  8572. y = b[i]
  8573. break
  8574. }
  8575. }
  8576. if (x < y) return -1
  8577. if (y < x) return 1
  8578. return 0
  8579. }
  8580. Buffer.isEncoding = function isEncoding (encoding) {
  8581. switch (String(encoding).toLowerCase()) {
  8582. case 'hex':
  8583. case 'utf8':
  8584. case 'utf-8':
  8585. case 'ascii':
  8586. case 'latin1':
  8587. case 'binary':
  8588. case 'base64':
  8589. case 'ucs2':
  8590. case 'ucs-2':
  8591. case 'utf16le':
  8592. case 'utf-16le':
  8593. return true
  8594. default:
  8595. return false
  8596. }
  8597. }
  8598. Buffer.concat = function concat (list, length) {
  8599. if (!isArray(list)) {
  8600. throw new TypeError('"list" argument must be an Array of Buffers')
  8601. }
  8602. if (list.length === 0) {
  8603. return Buffer.alloc(0)
  8604. }
  8605. var i
  8606. if (length === undefined) {
  8607. length = 0
  8608. for (i = 0; i < list.length; ++i) {
  8609. length += list[i].length
  8610. }
  8611. }
  8612. var buffer = Buffer.allocUnsafe(length)
  8613. var pos = 0
  8614. for (i = 0; i < list.length; ++i) {
  8615. var buf = list[i]
  8616. if (!Buffer.isBuffer(buf)) {
  8617. throw new TypeError('"list" argument must be an Array of Buffers')
  8618. }
  8619. buf.copy(buffer, pos)
  8620. pos += buf.length
  8621. }
  8622. return buffer
  8623. }
  8624. function byteLength (string, encoding) {
  8625. if (Buffer.isBuffer(string)) {
  8626. return string.length
  8627. }
  8628. if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
  8629. (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
  8630. return string.byteLength
  8631. }
  8632. if (typeof string !== 'string') {
  8633. string = '' + string
  8634. }
  8635. var len = string.length
  8636. if (len === 0) return 0
  8637. // Use a for loop to avoid recursion
  8638. var loweredCase = false
  8639. for (;;) {
  8640. switch (encoding) {
  8641. case 'ascii':
  8642. case 'latin1':
  8643. case 'binary':
  8644. return len
  8645. case 'utf8':
  8646. case 'utf-8':
  8647. case undefined:
  8648. return utf8ToBytes(string).length
  8649. case 'ucs2':
  8650. case 'ucs-2':
  8651. case 'utf16le':
  8652. case 'utf-16le':
  8653. return len * 2
  8654. case 'hex':
  8655. return len >>> 1
  8656. case 'base64':
  8657. return base64ToBytes(string).length
  8658. default:
  8659. if (loweredCase) return utf8ToBytes(string).length // assume utf8
  8660. encoding = ('' + encoding).toLowerCase()
  8661. loweredCase = true
  8662. }
  8663. }
  8664. }
  8665. Buffer.byteLength = byteLength
  8666. function slowToString (encoding, start, end) {
  8667. var loweredCase = false
  8668. // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
  8669. // property of a typed array.
  8670. // This behaves neither like String nor Uint8Array in that we set start/end
  8671. // to their upper/lower bounds if the value passed is out of range.
  8672. // undefined is handled specially as per ECMA-262 6th Edition,
  8673. // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
  8674. if (start === undefined || start < 0) {
  8675. start = 0
  8676. }
  8677. // Return early if start > this.length. Done here to prevent potential uint32
  8678. // coercion fail below.
  8679. if (start > this.length) {
  8680. return ''
  8681. }
  8682. if (end === undefined || end > this.length) {
  8683. end = this.length
  8684. }
  8685. if (end <= 0) {
  8686. return ''
  8687. }
  8688. // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
  8689. end >>>= 0
  8690. start >>>= 0
  8691. if (end <= start) {
  8692. return ''
  8693. }
  8694. if (!encoding) encoding = 'utf8'
  8695. while (true) {
  8696. switch (encoding) {
  8697. case 'hex':
  8698. return hexSlice(this, start, end)
  8699. case 'utf8':
  8700. case 'utf-8':
  8701. return utf8Slice(this, start, end)
  8702. case 'ascii':
  8703. return asciiSlice(this, start, end)
  8704. case 'latin1':
  8705. case 'binary':
  8706. return latin1Slice(this, start, end)
  8707. case 'base64':
  8708. return base64Slice(this, start, end)
  8709. case 'ucs2':
  8710. case 'ucs-2':
  8711. case 'utf16le':
  8712. case 'utf-16le':
  8713. return utf16leSlice(this, start, end)
  8714. default:
  8715. if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
  8716. encoding = (encoding + '').toLowerCase()
  8717. loweredCase = true
  8718. }
  8719. }
  8720. }
  8721. // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
  8722. // Buffer instances.
  8723. Buffer.prototype._isBuffer = true
  8724. function swap (b, n, m) {
  8725. var i = b[n]
  8726. b[n] = b[m]
  8727. b[m] = i
  8728. }
  8729. Buffer.prototype.swap16 = function swap16 () {
  8730. var len = this.length
  8731. if (len % 2 !== 0) {
  8732. throw new RangeError('Buffer size must be a multiple of 16-bits')
  8733. }
  8734. for (var i = 0; i < len; i += 2) {
  8735. swap(this, i, i + 1)
  8736. }
  8737. return this
  8738. }
  8739. Buffer.prototype.swap32 = function swap32 () {
  8740. var len = this.length
  8741. if (len % 4 !== 0) {
  8742. throw new RangeError('Buffer size must be a multiple of 32-bits')
  8743. }
  8744. for (var i = 0; i < len; i += 4) {
  8745. swap(this, i, i + 3)
  8746. swap(this, i + 1, i + 2)
  8747. }
  8748. return this
  8749. }
  8750. Buffer.prototype.swap64 = function swap64 () {
  8751. var len = this.length
  8752. if (len % 8 !== 0) {
  8753. throw new RangeError('Buffer size must be a multiple of 64-bits')
  8754. }
  8755. for (var i = 0; i < len; i += 8) {
  8756. swap(this, i, i + 7)
  8757. swap(this, i + 1, i + 6)
  8758. swap(this, i + 2, i + 5)
  8759. swap(this, i + 3, i + 4)
  8760. }
  8761. return this
  8762. }
  8763. Buffer.prototype.toString = function toString () {
  8764. var length = this.length | 0
  8765. if (length === 0) return ''
  8766. if (arguments.length === 0) return utf8Slice(this, 0, length)
  8767. return slowToString.apply(this, arguments)
  8768. }
  8769. Buffer.prototype.equals = function equals (b) {
  8770. if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
  8771. if (this === b) return true
  8772. return Buffer.compare(this, b) === 0
  8773. }
  8774. Buffer.prototype.inspect = function inspect () {
  8775. var str = ''
  8776. var max = exports.INSPECT_MAX_BYTES
  8777. if (this.length > 0) {
  8778. str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
  8779. if (this.length > max) str += ' ... '
  8780. }
  8781. return '<Buffer ' + str + '>'
  8782. }
  8783. Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
  8784. if (!Buffer.isBuffer(target)) {
  8785. throw new TypeError('Argument must be a Buffer')
  8786. }
  8787. if (start === undefined) {
  8788. start = 0
  8789. }
  8790. if (end === undefined) {
  8791. end = target ? target.length : 0
  8792. }
  8793. if (thisStart === undefined) {
  8794. thisStart = 0
  8795. }
  8796. if (thisEnd === undefined) {
  8797. thisEnd = this.length
  8798. }
  8799. if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
  8800. throw new RangeError('out of range index')
  8801. }
  8802. if (thisStart >= thisEnd && start >= end) {
  8803. return 0
  8804. }
  8805. if (thisStart >= thisEnd) {
  8806. return -1
  8807. }
  8808. if (start >= end) {
  8809. return 1
  8810. }
  8811. start >>>= 0
  8812. end >>>= 0
  8813. thisStart >>>= 0
  8814. thisEnd >>>= 0
  8815. if (this === target) return 0
  8816. var x = thisEnd - thisStart
  8817. var y = end - start
  8818. var len = Math.min(x, y)
  8819. var thisCopy = this.slice(thisStart, thisEnd)
  8820. var targetCopy = target.slice(start, end)
  8821. for (var i = 0; i < len; ++i) {
  8822. if (thisCopy[i] !== targetCopy[i]) {
  8823. x = thisCopy[i]
  8824. y = targetCopy[i]
  8825. break
  8826. }
  8827. }
  8828. if (x < y) return -1
  8829. if (y < x) return 1
  8830. return 0
  8831. }
  8832. // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
  8833. // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
  8834. //
  8835. // Arguments:
  8836. // - buffer - a Buffer to search
  8837. // - val - a string, Buffer, or number
  8838. // - byteOffset - an index into `buffer`; will be clamped to an int32
  8839. // - encoding - an optional encoding, relevant is val is a string
  8840. // - dir - true for indexOf, false for lastIndexOf
  8841. function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  8842. // Empty buffer means no match
  8843. if (buffer.length === 0) return -1
  8844. // Normalize byteOffset
  8845. if (typeof byteOffset === 'string') {
  8846. encoding = byteOffset
  8847. byteOffset = 0
  8848. } else if (byteOffset > 0x7fffffff) {
  8849. byteOffset = 0x7fffffff
  8850. } else if (byteOffset < -0x80000000) {
  8851. byteOffset = -0x80000000
  8852. }
  8853. byteOffset = +byteOffset // Coerce to Number.
  8854. if (isNaN(byteOffset)) {
  8855. // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
  8856. byteOffset = dir ? 0 : (buffer.length - 1)
  8857. }
  8858. // Normalize byteOffset: negative offsets start from the end of the buffer
  8859. if (byteOffset < 0) byteOffset = buffer.length + byteOffset
  8860. if (byteOffset >= buffer.length) {
  8861. if (dir) return -1
  8862. else byteOffset = buffer.length - 1
  8863. } else if (byteOffset < 0) {
  8864. if (dir) byteOffset = 0
  8865. else return -1
  8866. }
  8867. // Normalize val
  8868. if (typeof val === 'string') {
  8869. val = Buffer.from(val, encoding)
  8870. }
  8871. // Finally, search either indexOf (if dir is true) or lastIndexOf
  8872. if (Buffer.isBuffer(val)) {
  8873. // Special case: looking for empty string/buffer always fails
  8874. if (val.length === 0) {
  8875. return -1
  8876. }
  8877. return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
  8878. } else if (typeof val === 'number') {
  8879. val = val & 0xFF // Search for a byte value [0-255]
  8880. if (Buffer.TYPED_ARRAY_SUPPORT &&
  8881. typeof Uint8Array.prototype.indexOf === 'function') {
  8882. if (dir) {
  8883. return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
  8884. } else {
  8885. return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
  8886. }
  8887. }
  8888. return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
  8889. }
  8890. throw new TypeError('val must be string, number or Buffer')
  8891. }
  8892. function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  8893. var indexSize = 1
  8894. var arrLength = arr.length
  8895. var valLength = val.length
  8896. if (encoding !== undefined) {
  8897. encoding = String(encoding).toLowerCase()
  8898. if (encoding === 'ucs2' || encoding === 'ucs-2' ||
  8899. encoding === 'utf16le' || encoding === 'utf-16le') {
  8900. if (arr.length < 2 || val.length < 2) {
  8901. return -1
  8902. }
  8903. indexSize = 2
  8904. arrLength /= 2
  8905. valLength /= 2
  8906. byteOffset /= 2
  8907. }
  8908. }
  8909. function read (buf, i) {
  8910. if (indexSize === 1) {
  8911. return buf[i]
  8912. } else {
  8913. return buf.readUInt16BE(i * indexSize)
  8914. }
  8915. }
  8916. var i
  8917. if (dir) {
  8918. var foundIndex = -1
  8919. for (i = byteOffset; i < arrLength; i++) {
  8920. if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
  8921. if (foundIndex === -1) foundIndex = i
  8922. if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
  8923. } else {
  8924. if (foundIndex !== -1) i -= i - foundIndex
  8925. foundIndex = -1
  8926. }
  8927. }
  8928. } else {
  8929. if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
  8930. for (i = byteOffset; i >= 0; i--) {
  8931. var found = true
  8932. for (var j = 0; j < valLength; j++) {
  8933. if (read(arr, i + j) !== read(val, j)) {
  8934. found = false
  8935. break
  8936. }
  8937. }
  8938. if (found) return i
  8939. }
  8940. }
  8941. return -1
  8942. }
  8943. Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
  8944. return this.indexOf(val, byteOffset, encoding) !== -1
  8945. }
  8946. Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
  8947. return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
  8948. }
  8949. Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
  8950. return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
  8951. }
  8952. function hexWrite (buf, string, offset, length) {
  8953. offset = Number(offset) || 0
  8954. var remaining = buf.length - offset
  8955. if (!length) {
  8956. length = remaining
  8957. } else {
  8958. length = Number(length)
  8959. if (length > remaining) {
  8960. length = remaining
  8961. }
  8962. }
  8963. // must be an even number of digits
  8964. var strLen = string.length
  8965. if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
  8966. if (length > strLen / 2) {
  8967. length = strLen / 2
  8968. }
  8969. for (var i = 0; i < length; ++i) {
  8970. var parsed = parseInt(string.substr(i * 2, 2), 16)
  8971. if (isNaN(parsed)) return i
  8972. buf[offset + i] = parsed
  8973. }
  8974. return i
  8975. }
  8976. function utf8Write (buf, string, offset, length) {
  8977. return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
  8978. }
  8979. function asciiWrite (buf, string, offset, length) {
  8980. return blitBuffer(asciiToBytes(string), buf, offset, length)
  8981. }
  8982. function latin1Write (buf, string, offset, length) {
  8983. return asciiWrite(buf, string, offset, length)
  8984. }
  8985. function base64Write (buf, string, offset, length) {
  8986. return blitBuffer(base64ToBytes(string), buf, offset, length)
  8987. }
  8988. function ucs2Write (buf, string, offset, length) {
  8989. return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
  8990. }
  8991. Buffer.prototype.write = function write (string, offset, length, encoding) {
  8992. // Buffer#write(string)
  8993. if (offset === undefined) {
  8994. encoding = 'utf8'
  8995. length = this.length
  8996. offset = 0
  8997. // Buffer#write(string, encoding)
  8998. } else if (length === undefined && typeof offset === 'string') {
  8999. encoding = offset
  9000. length = this.length
  9001. offset = 0
  9002. // Buffer#write(string, offset[, length][, encoding])
  9003. } else if (isFinite(offset)) {
  9004. offset = offset | 0
  9005. if (isFinite(length)) {
  9006. length = length | 0
  9007. if (encoding === undefined) encoding = 'utf8'
  9008. } else {
  9009. encoding = length
  9010. length = undefined
  9011. }
  9012. // legacy write(string, encoding, offset, length) - remove in v0.13
  9013. } else {
  9014. throw new Error(
  9015. 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
  9016. )
  9017. }
  9018. var remaining = this.length - offset
  9019. if (length === undefined || length > remaining) length = remaining
  9020. if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
  9021. throw new RangeError('Attempt to write outside buffer bounds')
  9022. }
  9023. if (!encoding) encoding = 'utf8'
  9024. var loweredCase = false
  9025. for (;;) {
  9026. switch (encoding) {
  9027. case 'hex':
  9028. return hexWrite(this, string, offset, length)
  9029. case 'utf8':
  9030. case 'utf-8':
  9031. return utf8Write(this, string, offset, length)
  9032. case 'ascii':
  9033. return asciiWrite(this, string, offset, length)
  9034. case 'latin1':
  9035. case 'binary':
  9036. return latin1Write(this, string, offset, length)
  9037. case 'base64':
  9038. // Warning: maxLength not taken into account in base64Write
  9039. return base64Write(this, string, offset, length)
  9040. case 'ucs2':
  9041. case 'ucs-2':
  9042. case 'utf16le':
  9043. case 'utf-16le':
  9044. return ucs2Write(this, string, offset, length)
  9045. default:
  9046. if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
  9047. encoding = ('' + encoding).toLowerCase()
  9048. loweredCase = true
  9049. }
  9050. }
  9051. }
  9052. Buffer.prototype.toJSON = function toJSON () {
  9053. return {
  9054. type: 'Buffer',
  9055. data: Array.prototype.slice.call(this._arr || this, 0)
  9056. }
  9057. }
  9058. function base64Slice (buf, start, end) {
  9059. if (start === 0 && end === buf.length) {
  9060. return base64.fromByteArray(buf)
  9061. } else {
  9062. return base64.fromByteArray(buf.slice(start, end))
  9063. }
  9064. }
  9065. function utf8Slice (buf, start, end) {
  9066. end = Math.min(buf.length, end)
  9067. var res = []
  9068. var i = start
  9069. while (i < end) {
  9070. var firstByte = buf[i]
  9071. var codePoint = null
  9072. var bytesPerSequence = (firstByte > 0xEF) ? 4
  9073. : (firstByte > 0xDF) ? 3
  9074. : (firstByte > 0xBF) ? 2
  9075. : 1
  9076. if (i + bytesPerSequence <= end) {
  9077. var secondByte, thirdByte, fourthByte, tempCodePoint
  9078. switch (bytesPerSequence) {
  9079. case 1:
  9080. if (firstByte < 0x80) {
  9081. codePoint = firstByte
  9082. }
  9083. break
  9084. case 2:
  9085. secondByte = buf[i + 1]
  9086. if ((secondByte & 0xC0) === 0x80) {
  9087. tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
  9088. if (tempCodePoint > 0x7F) {
  9089. codePoint = tempCodePoint
  9090. }
  9091. }
  9092. break
  9093. case 3:
  9094. secondByte = buf[i + 1]
  9095. thirdByte = buf[i + 2]
  9096. if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
  9097. tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
  9098. if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
  9099. codePoint = tempCodePoint
  9100. }
  9101. }
  9102. break
  9103. case 4:
  9104. secondByte = buf[i + 1]
  9105. thirdByte = buf[i + 2]
  9106. fourthByte = buf[i + 3]
  9107. if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
  9108. tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
  9109. if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
  9110. codePoint = tempCodePoint
  9111. }
  9112. }
  9113. }
  9114. }
  9115. if (codePoint === null) {
  9116. // we did not generate a valid codePoint so insert a
  9117. // replacement char (U+FFFD) and advance only 1 byte
  9118. codePoint = 0xFFFD
  9119. bytesPerSequence = 1
  9120. } else if (codePoint > 0xFFFF) {
  9121. // encode to utf16 (surrogate pair dance)
  9122. codePoint -= 0x10000
  9123. res.push(codePoint >>> 10 & 0x3FF | 0xD800)
  9124. codePoint = 0xDC00 | codePoint & 0x3FF
  9125. }
  9126. res.push(codePoint)
  9127. i += bytesPerSequence
  9128. }
  9129. return decodeCodePointsArray(res)
  9130. }
  9131. // Based on http://stackoverflow.com/a/22747272/680742, the browser with
  9132. // the lowest limit is Chrome, with 0x10000 args.
  9133. // We go 1 magnitude less, for safety
  9134. var MAX_ARGUMENTS_LENGTH = 0x1000
  9135. function decodeCodePointsArray (codePoints) {
  9136. var len = codePoints.length
  9137. if (len <= MAX_ARGUMENTS_LENGTH) {
  9138. return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
  9139. }
  9140. // Decode in chunks to avoid "call stack size exceeded".
  9141. var res = ''
  9142. var i = 0
  9143. while (i < len) {
  9144. res += String.fromCharCode.apply(
  9145. String,
  9146. codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
  9147. )
  9148. }
  9149. return res
  9150. }
  9151. function asciiSlice (buf, start, end) {
  9152. var ret = ''
  9153. end = Math.min(buf.length, end)
  9154. for (var i = start; i < end; ++i) {
  9155. ret += String.fromCharCode(buf[i] & 0x7F)
  9156. }
  9157. return ret
  9158. }
  9159. function latin1Slice (buf, start, end) {
  9160. var ret = ''
  9161. end = Math.min(buf.length, end)
  9162. for (var i = start; i < end; ++i) {
  9163. ret += String.fromCharCode(buf[i])
  9164. }
  9165. return ret
  9166. }
  9167. function hexSlice (buf, start, end) {
  9168. var len = buf.length
  9169. if (!start || start < 0) start = 0
  9170. if (!end || end < 0 || end > len) end = len
  9171. var out = ''
  9172. for (var i = start; i < end; ++i) {
  9173. out += toHex(buf[i])
  9174. }
  9175. return out
  9176. }
  9177. function utf16leSlice (buf, start, end) {
  9178. var bytes = buf.slice(start, end)
  9179. var res = ''
  9180. for (var i = 0; i < bytes.length; i += 2) {
  9181. res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
  9182. }
  9183. return res
  9184. }
  9185. Buffer.prototype.slice = function slice (start, end) {
  9186. var len = this.length
  9187. start = ~~start
  9188. end = end === undefined ? len : ~~end
  9189. if (start < 0) {
  9190. start += len
  9191. if (start < 0) start = 0
  9192. } else if (start > len) {
  9193. start = len
  9194. }
  9195. if (end < 0) {
  9196. end += len
  9197. if (end < 0) end = 0
  9198. } else if (end > len) {
  9199. end = len
  9200. }
  9201. if (end < start) end = start
  9202. var newBuf
  9203. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9204. newBuf = this.subarray(start, end)
  9205. newBuf.__proto__ = Buffer.prototype
  9206. } else {
  9207. var sliceLen = end - start
  9208. newBuf = new Buffer(sliceLen, undefined)
  9209. for (var i = 0; i < sliceLen; ++i) {
  9210. newBuf[i] = this[i + start]
  9211. }
  9212. }
  9213. return newBuf
  9214. }
  9215. /*
  9216. * Need to make sure that buffer isn't trying to write out of bounds.
  9217. */
  9218. function checkOffset (offset, ext, length) {
  9219. if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
  9220. if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
  9221. }
  9222. Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
  9223. offset = offset | 0
  9224. byteLength = byteLength | 0
  9225. if (!noAssert) checkOffset(offset, byteLength, this.length)
  9226. var val = this[offset]
  9227. var mul = 1
  9228. var i = 0
  9229. while (++i < byteLength && (mul *= 0x100)) {
  9230. val += this[offset + i] * mul
  9231. }
  9232. return val
  9233. }
  9234. Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
  9235. offset = offset | 0
  9236. byteLength = byteLength | 0
  9237. if (!noAssert) {
  9238. checkOffset(offset, byteLength, this.length)
  9239. }
  9240. var val = this[offset + --byteLength]
  9241. var mul = 1
  9242. while (byteLength > 0 && (mul *= 0x100)) {
  9243. val += this[offset + --byteLength] * mul
  9244. }
  9245. return val
  9246. }
  9247. Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
  9248. if (!noAssert) checkOffset(offset, 1, this.length)
  9249. return this[offset]
  9250. }
  9251. Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
  9252. if (!noAssert) checkOffset(offset, 2, this.length)
  9253. return this[offset] | (this[offset + 1] << 8)
  9254. }
  9255. Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
  9256. if (!noAssert) checkOffset(offset, 2, this.length)
  9257. return (this[offset] << 8) | this[offset + 1]
  9258. }
  9259. Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
  9260. if (!noAssert) checkOffset(offset, 4, this.length)
  9261. return ((this[offset]) |
  9262. (this[offset + 1] << 8) |
  9263. (this[offset + 2] << 16)) +
  9264. (this[offset + 3] * 0x1000000)
  9265. }
  9266. Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
  9267. if (!noAssert) checkOffset(offset, 4, this.length)
  9268. return (this[offset] * 0x1000000) +
  9269. ((this[offset + 1] << 16) |
  9270. (this[offset + 2] << 8) |
  9271. this[offset + 3])
  9272. }
  9273. Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
  9274. offset = offset | 0
  9275. byteLength = byteLength | 0
  9276. if (!noAssert) checkOffset(offset, byteLength, this.length)
  9277. var val = this[offset]
  9278. var mul = 1
  9279. var i = 0
  9280. while (++i < byteLength && (mul *= 0x100)) {
  9281. val += this[offset + i] * mul
  9282. }
  9283. mul *= 0x80
  9284. if (val >= mul) val -= Math.pow(2, 8 * byteLength)
  9285. return val
  9286. }
  9287. Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
  9288. offset = offset | 0
  9289. byteLength = byteLength | 0
  9290. if (!noAssert) checkOffset(offset, byteLength, this.length)
  9291. var i = byteLength
  9292. var mul = 1
  9293. var val = this[offset + --i]
  9294. while (i > 0 && (mul *= 0x100)) {
  9295. val += this[offset + --i] * mul
  9296. }
  9297. mul *= 0x80
  9298. if (val >= mul) val -= Math.pow(2, 8 * byteLength)
  9299. return val
  9300. }
  9301. Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
  9302. if (!noAssert) checkOffset(offset, 1, this.length)
  9303. if (!(this[offset] & 0x80)) return (this[offset])
  9304. return ((0xff - this[offset] + 1) * -1)
  9305. }
  9306. Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
  9307. if (!noAssert) checkOffset(offset, 2, this.length)
  9308. var val = this[offset] | (this[offset + 1] << 8)
  9309. return (val & 0x8000) ? val | 0xFFFF0000 : val
  9310. }
  9311. Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
  9312. if (!noAssert) checkOffset(offset, 2, this.length)
  9313. var val = this[offset + 1] | (this[offset] << 8)
  9314. return (val & 0x8000) ? val | 0xFFFF0000 : val
  9315. }
  9316. Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
  9317. if (!noAssert) checkOffset(offset, 4, this.length)
  9318. return (this[offset]) |
  9319. (this[offset + 1] << 8) |
  9320. (this[offset + 2] << 16) |
  9321. (this[offset + 3] << 24)
  9322. }
  9323. Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
  9324. if (!noAssert) checkOffset(offset, 4, this.length)
  9325. return (this[offset] << 24) |
  9326. (this[offset + 1] << 16) |
  9327. (this[offset + 2] << 8) |
  9328. (this[offset + 3])
  9329. }
  9330. Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
  9331. if (!noAssert) checkOffset(offset, 4, this.length)
  9332. return ieee754.read(this, offset, true, 23, 4)
  9333. }
  9334. Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
  9335. if (!noAssert) checkOffset(offset, 4, this.length)
  9336. return ieee754.read(this, offset, false, 23, 4)
  9337. }
  9338. Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
  9339. if (!noAssert) checkOffset(offset, 8, this.length)
  9340. return ieee754.read(this, offset, true, 52, 8)
  9341. }
  9342. Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
  9343. if (!noAssert) checkOffset(offset, 8, this.length)
  9344. return ieee754.read(this, offset, false, 52, 8)
  9345. }
  9346. function checkInt (buf, value, offset, ext, max, min) {
  9347. if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
  9348. if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
  9349. if (offset + ext > buf.length) throw new RangeError('Index out of range')
  9350. }
  9351. Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
  9352. value = +value
  9353. offset = offset | 0
  9354. byteLength = byteLength | 0
  9355. if (!noAssert) {
  9356. var maxBytes = Math.pow(2, 8 * byteLength) - 1
  9357. checkInt(this, value, offset, byteLength, maxBytes, 0)
  9358. }
  9359. var mul = 1
  9360. var i = 0
  9361. this[offset] = value & 0xFF
  9362. while (++i < byteLength && (mul *= 0x100)) {
  9363. this[offset + i] = (value / mul) & 0xFF
  9364. }
  9365. return offset + byteLength
  9366. }
  9367. Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
  9368. value = +value
  9369. offset = offset | 0
  9370. byteLength = byteLength | 0
  9371. if (!noAssert) {
  9372. var maxBytes = Math.pow(2, 8 * byteLength) - 1
  9373. checkInt(this, value, offset, byteLength, maxBytes, 0)
  9374. }
  9375. var i = byteLength - 1
  9376. var mul = 1
  9377. this[offset + i] = value & 0xFF
  9378. while (--i >= 0 && (mul *= 0x100)) {
  9379. this[offset + i] = (value / mul) & 0xFF
  9380. }
  9381. return offset + byteLength
  9382. }
  9383. Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
  9384. value = +value
  9385. offset = offset | 0
  9386. if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
  9387. if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  9388. this[offset] = (value & 0xff)
  9389. return offset + 1
  9390. }
  9391. function objectWriteUInt16 (buf, value, offset, littleEndian) {
  9392. if (value < 0) value = 0xffff + value + 1
  9393. for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
  9394. buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
  9395. (littleEndian ? i : 1 - i) * 8
  9396. }
  9397. }
  9398. Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
  9399. value = +value
  9400. offset = offset | 0
  9401. if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  9402. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9403. this[offset] = (value & 0xff)
  9404. this[offset + 1] = (value >>> 8)
  9405. } else {
  9406. objectWriteUInt16(this, value, offset, true)
  9407. }
  9408. return offset + 2
  9409. }
  9410. Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
  9411. value = +value
  9412. offset = offset | 0
  9413. if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
  9414. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9415. this[offset] = (value >>> 8)
  9416. this[offset + 1] = (value & 0xff)
  9417. } else {
  9418. objectWriteUInt16(this, value, offset, false)
  9419. }
  9420. return offset + 2
  9421. }
  9422. function objectWriteUInt32 (buf, value, offset, littleEndian) {
  9423. if (value < 0) value = 0xffffffff + value + 1
  9424. for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
  9425. buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
  9426. }
  9427. }
  9428. Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
  9429. value = +value
  9430. offset = offset | 0
  9431. if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  9432. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9433. this[offset + 3] = (value >>> 24)
  9434. this[offset + 2] = (value >>> 16)
  9435. this[offset + 1] = (value >>> 8)
  9436. this[offset] = (value & 0xff)
  9437. } else {
  9438. objectWriteUInt32(this, value, offset, true)
  9439. }
  9440. return offset + 4
  9441. }
  9442. Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
  9443. value = +value
  9444. offset = offset | 0
  9445. if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
  9446. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9447. this[offset] = (value >>> 24)
  9448. this[offset + 1] = (value >>> 16)
  9449. this[offset + 2] = (value >>> 8)
  9450. this[offset + 3] = (value & 0xff)
  9451. } else {
  9452. objectWriteUInt32(this, value, offset, false)
  9453. }
  9454. return offset + 4
  9455. }
  9456. Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
  9457. value = +value
  9458. offset = offset | 0
  9459. if (!noAssert) {
  9460. var limit = Math.pow(2, 8 * byteLength - 1)
  9461. checkInt(this, value, offset, byteLength, limit - 1, -limit)
  9462. }
  9463. var i = 0
  9464. var mul = 1
  9465. var sub = 0
  9466. this[offset] = value & 0xFF
  9467. while (++i < byteLength && (mul *= 0x100)) {
  9468. if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
  9469. sub = 1
  9470. }
  9471. this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  9472. }
  9473. return offset + byteLength
  9474. }
  9475. Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
  9476. value = +value
  9477. offset = offset | 0
  9478. if (!noAssert) {
  9479. var limit = Math.pow(2, 8 * byteLength - 1)
  9480. checkInt(this, value, offset, byteLength, limit - 1, -limit)
  9481. }
  9482. var i = byteLength - 1
  9483. var mul = 1
  9484. var sub = 0
  9485. this[offset + i] = value & 0xFF
  9486. while (--i >= 0 && (mul *= 0x100)) {
  9487. if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
  9488. sub = 1
  9489. }
  9490. this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
  9491. }
  9492. return offset + byteLength
  9493. }
  9494. Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
  9495. value = +value
  9496. offset = offset | 0
  9497. if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
  9498. if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
  9499. if (value < 0) value = 0xff + value + 1
  9500. this[offset] = (value & 0xff)
  9501. return offset + 1
  9502. }
  9503. Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
  9504. value = +value
  9505. offset = offset | 0
  9506. if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  9507. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9508. this[offset] = (value & 0xff)
  9509. this[offset + 1] = (value >>> 8)
  9510. } else {
  9511. objectWriteUInt16(this, value, offset, true)
  9512. }
  9513. return offset + 2
  9514. }
  9515. Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
  9516. value = +value
  9517. offset = offset | 0
  9518. if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
  9519. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9520. this[offset] = (value >>> 8)
  9521. this[offset + 1] = (value & 0xff)
  9522. } else {
  9523. objectWriteUInt16(this, value, offset, false)
  9524. }
  9525. return offset + 2
  9526. }
  9527. Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
  9528. value = +value
  9529. offset = offset | 0
  9530. if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  9531. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9532. this[offset] = (value & 0xff)
  9533. this[offset + 1] = (value >>> 8)
  9534. this[offset + 2] = (value >>> 16)
  9535. this[offset + 3] = (value >>> 24)
  9536. } else {
  9537. objectWriteUInt32(this, value, offset, true)
  9538. }
  9539. return offset + 4
  9540. }
  9541. Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
  9542. value = +value
  9543. offset = offset | 0
  9544. if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
  9545. if (value < 0) value = 0xffffffff + value + 1
  9546. if (Buffer.TYPED_ARRAY_SUPPORT) {
  9547. this[offset] = (value >>> 24)
  9548. this[offset + 1] = (value >>> 16)
  9549. this[offset + 2] = (value >>> 8)
  9550. this[offset + 3] = (value & 0xff)
  9551. } else {
  9552. objectWriteUInt32(this, value, offset, false)
  9553. }
  9554. return offset + 4
  9555. }
  9556. function checkIEEE754 (buf, value, offset, ext, max, min) {
  9557. if (offset + ext > buf.length) throw new RangeError('Index out of range')
  9558. if (offset < 0) throw new RangeError('Index out of range')
  9559. }
  9560. function writeFloat (buf, value, offset, littleEndian, noAssert) {
  9561. if (!noAssert) {
  9562. checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
  9563. }
  9564. ieee754.write(buf, value, offset, littleEndian, 23, 4)
  9565. return offset + 4
  9566. }
  9567. Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
  9568. return writeFloat(this, value, offset, true, noAssert)
  9569. }
  9570. Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
  9571. return writeFloat(this, value, offset, false, noAssert)
  9572. }
  9573. function writeDouble (buf, value, offset, littleEndian, noAssert) {
  9574. if (!noAssert) {
  9575. checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
  9576. }
  9577. ieee754.write(buf, value, offset, littleEndian, 52, 8)
  9578. return offset + 8
  9579. }
  9580. Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
  9581. return writeDouble(this, value, offset, true, noAssert)
  9582. }
  9583. Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
  9584. return writeDouble(this, value, offset, false, noAssert)
  9585. }
  9586. // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
  9587. Buffer.prototype.copy = function copy (target, targetStart, start, end) {
  9588. if (!start) start = 0
  9589. if (!end && end !== 0) end = this.length
  9590. if (targetStart >= target.length) targetStart = target.length
  9591. if (!targetStart) targetStart = 0
  9592. if (end > 0 && end < start) end = start
  9593. // Copy 0 bytes; we're done
  9594. if (end === start) return 0
  9595. if (target.length === 0 || this.length === 0) return 0
  9596. // Fatal error conditions
  9597. if (targetStart < 0) {
  9598. throw new RangeError('targetStart out of bounds')
  9599. }
  9600. if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
  9601. if (end < 0) throw new RangeError('sourceEnd out of bounds')
  9602. // Are we oob?
  9603. if (end > this.length) end = this.length
  9604. if (target.length - targetStart < end - start) {
  9605. end = target.length - targetStart + start
  9606. }
  9607. var len = end - start
  9608. var i
  9609. if (this === target && start < targetStart && targetStart < end) {
  9610. // descending copy from end
  9611. for (i = len - 1; i >= 0; --i) {
  9612. target[i + targetStart] = this[i + start]
  9613. }
  9614. } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
  9615. // ascending copy from start
  9616. for (i = 0; i < len; ++i) {
  9617. target[i + targetStart] = this[i + start]
  9618. }
  9619. } else {
  9620. Uint8Array.prototype.set.call(
  9621. target,
  9622. this.subarray(start, start + len),
  9623. targetStart
  9624. )
  9625. }
  9626. return len
  9627. }
  9628. // Usage:
  9629. // buffer.fill(number[, offset[, end]])
  9630. // buffer.fill(buffer[, offset[, end]])
  9631. // buffer.fill(string[, offset[, end]][, encoding])
  9632. Buffer.prototype.fill = function fill (val, start, end, encoding) {
  9633. // Handle string cases:
  9634. if (typeof val === 'string') {
  9635. if (typeof start === 'string') {
  9636. encoding = start
  9637. start = 0
  9638. end = this.length
  9639. } else if (typeof end === 'string') {
  9640. encoding = end
  9641. end = this.length
  9642. }
  9643. if (val.length === 1) {
  9644. var code = val.charCodeAt(0)
  9645. if (code < 256) {
  9646. val = code
  9647. }
  9648. }
  9649. if (encoding !== undefined && typeof encoding !== 'string') {
  9650. throw new TypeError('encoding must be a string')
  9651. }
  9652. if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
  9653. throw new TypeError('Unknown encoding: ' + encoding)
  9654. }
  9655. } else if (typeof val === 'number') {
  9656. val = val & 255
  9657. }
  9658. // Invalid ranges are not set to a default, so can range check early.
  9659. if (start < 0 || this.length < start || this.length < end) {
  9660. throw new RangeError('Out of range index')
  9661. }
  9662. if (end <= start) {
  9663. return this
  9664. }
  9665. start = start >>> 0
  9666. end = end === undefined ? this.length : end >>> 0
  9667. if (!val) val = 0
  9668. var i
  9669. if (typeof val === 'number') {
  9670. for (i = start; i < end; ++i) {
  9671. this[i] = val
  9672. }
  9673. } else {
  9674. var bytes = Buffer.isBuffer(val)
  9675. ? val
  9676. : utf8ToBytes(new Buffer(val, encoding).toString())
  9677. var len = bytes.length
  9678. for (i = 0; i < end - start; ++i) {
  9679. this[i + start] = bytes[i % len]
  9680. }
  9681. }
  9682. return this
  9683. }
  9684. // HELPER FUNCTIONS
  9685. // ================
  9686. var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
  9687. function base64clean (str) {
  9688. // Node strips out invalid characters like \n and \t from the string, base64-js does not
  9689. str = stringtrim(str).replace(INVALID_BASE64_RE, '')
  9690. // Node converts strings with length < 2 to ''
  9691. if (str.length < 2) return ''
  9692. // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
  9693. while (str.length % 4 !== 0) {
  9694. str = str + '='
  9695. }
  9696. return str
  9697. }
  9698. function stringtrim (str) {
  9699. if (str.trim) return str.trim()
  9700. return str.replace(/^\s+|\s+$/g, '')
  9701. }
  9702. function toHex (n) {
  9703. if (n < 16) return '0' + n.toString(16)
  9704. return n.toString(16)
  9705. }
  9706. function utf8ToBytes (string, units) {
  9707. units = units || Infinity
  9708. var codePoint
  9709. var length = string.length
  9710. var leadSurrogate = null
  9711. var bytes = []
  9712. for (var i = 0; i < length; ++i) {
  9713. codePoint = string.charCodeAt(i)
  9714. // is surrogate component
  9715. if (codePoint > 0xD7FF && codePoint < 0xE000) {
  9716. // last char was a lead
  9717. if (!leadSurrogate) {
  9718. // no lead yet
  9719. if (codePoint > 0xDBFF) {
  9720. // unexpected trail
  9721. if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
  9722. continue
  9723. } else if (i + 1 === length) {
  9724. // unpaired lead
  9725. if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
  9726. continue
  9727. }
  9728. // valid lead
  9729. leadSurrogate = codePoint
  9730. continue
  9731. }
  9732. // 2 leads in a row
  9733. if (codePoint < 0xDC00) {
  9734. if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
  9735. leadSurrogate = codePoint
  9736. continue
  9737. }
  9738. // valid surrogate pair
  9739. codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
  9740. } else if (leadSurrogate) {
  9741. // valid bmp char, but last char was a lead
  9742. if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
  9743. }
  9744. leadSurrogate = null
  9745. // encode utf8
  9746. if (codePoint < 0x80) {
  9747. if ((units -= 1) < 0) break
  9748. bytes.push(codePoint)
  9749. } else if (codePoint < 0x800) {
  9750. if ((units -= 2) < 0) break
  9751. bytes.push(
  9752. codePoint >> 0x6 | 0xC0,
  9753. codePoint & 0x3F | 0x80
  9754. )
  9755. } else if (codePoint < 0x10000) {
  9756. if ((units -= 3) < 0) break
  9757. bytes.push(
  9758. codePoint >> 0xC | 0xE0,
  9759. codePoint >> 0x6 & 0x3F | 0x80,
  9760. codePoint & 0x3F | 0x80
  9761. )
  9762. } else if (codePoint < 0x110000) {
  9763. if ((units -= 4) < 0) break
  9764. bytes.push(
  9765. codePoint >> 0x12 | 0xF0,
  9766. codePoint >> 0xC & 0x3F | 0x80,
  9767. codePoint >> 0x6 & 0x3F | 0x80,
  9768. codePoint & 0x3F | 0x80
  9769. )
  9770. } else {
  9771. throw new Error('Invalid code point')
  9772. }
  9773. }
  9774. return bytes
  9775. }
  9776. function asciiToBytes (str) {
  9777. var byteArray = []
  9778. for (var i = 0; i < str.length; ++i) {
  9779. // Node's code seems to be doing this and not & 0x7F..
  9780. byteArray.push(str.charCodeAt(i) & 0xFF)
  9781. }
  9782. return byteArray
  9783. }
  9784. function utf16leToBytes (str, units) {
  9785. var c, hi, lo
  9786. var byteArray = []
  9787. for (var i = 0; i < str.length; ++i) {
  9788. if ((units -= 2) < 0) break
  9789. c = str.charCodeAt(i)
  9790. hi = c >> 8
  9791. lo = c % 256
  9792. byteArray.push(lo)
  9793. byteArray.push(hi)
  9794. }
  9795. return byteArray
  9796. }
  9797. function base64ToBytes (str) {
  9798. return base64.toByteArray(base64clean(str))
  9799. }
  9800. function blitBuffer (src, dst, offset, length) {
  9801. for (var i = 0; i < length; ++i) {
  9802. if ((i + offset >= dst.length) || (i >= src.length)) break
  9803. dst[i + offset] = src[i]
  9804. }
  9805. return i
  9806. }
  9807. function isnan (val) {
  9808. return val !== val // eslint-disable-line no-self-compare
  9809. }
  9810. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  9811. /***/ }),
  9812. /* 3 */
  9813. /***/ (function(module, exports) {
  9814. 'use strict'
  9815. exports.byteLength = byteLength
  9816. exports.toByteArray = toByteArray
  9817. exports.fromByteArray = fromByteArray
  9818. var lookup = []
  9819. var revLookup = []
  9820. var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
  9821. var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  9822. for (var i = 0, len = code.length; i < len; ++i) {
  9823. lookup[i] = code[i]
  9824. revLookup[code.charCodeAt(i)] = i
  9825. }
  9826. revLookup['-'.charCodeAt(0)] = 62
  9827. revLookup['_'.charCodeAt(0)] = 63
  9828. function placeHoldersCount (b64) {
  9829. var len = b64.length
  9830. if (len % 4 > 0) {
  9831. throw new Error('Invalid string. Length must be a multiple of 4')
  9832. }
  9833. // the number of equal signs (place holders)
  9834. // if there are two placeholders, than the two characters before it
  9835. // represent one byte
  9836. // if there is only one, then the three characters before it represent 2 bytes
  9837. // this is just a cheap hack to not do indexOf twice
  9838. return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
  9839. }
  9840. function byteLength (b64) {
  9841. // base64 is 4/3 + up to two characters of the original data
  9842. return (b64.length * 3 / 4) - placeHoldersCount(b64)
  9843. }
  9844. function toByteArray (b64) {
  9845. var i, l, tmp, placeHolders, arr
  9846. var len = b64.length
  9847. placeHolders = placeHoldersCount(b64)
  9848. arr = new Arr((len * 3 / 4) - placeHolders)
  9849. // if there are placeholders, only get up to the last complete 4 chars
  9850. l = placeHolders > 0 ? len - 4 : len
  9851. var L = 0
  9852. for (i = 0; i < l; i += 4) {
  9853. tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
  9854. arr[L++] = (tmp >> 16) & 0xFF
  9855. arr[L++] = (tmp >> 8) & 0xFF
  9856. arr[L++] = tmp & 0xFF
  9857. }
  9858. if (placeHolders === 2) {
  9859. tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
  9860. arr[L++] = tmp & 0xFF
  9861. } else if (placeHolders === 1) {
  9862. tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
  9863. arr[L++] = (tmp >> 8) & 0xFF
  9864. arr[L++] = tmp & 0xFF
  9865. }
  9866. return arr
  9867. }
  9868. function tripletToBase64 (num) {
  9869. return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
  9870. }
  9871. function encodeChunk (uint8, start, end) {
  9872. var tmp
  9873. var output = []
  9874. for (var i = start; i < end; i += 3) {
  9875. tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
  9876. output.push(tripletToBase64(tmp))
  9877. }
  9878. return output.join('')
  9879. }
  9880. function fromByteArray (uint8) {
  9881. var tmp
  9882. var len = uint8.length
  9883. var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  9884. var output = ''
  9885. var parts = []
  9886. var maxChunkLength = 16383 // must be multiple of 3
  9887. // go through the array every three bytes, we'll deal with trailing stuff later
  9888. for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
  9889. parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  9890. }
  9891. // pad the end with zeros, but make sure to not forget the extra bytes
  9892. if (extraBytes === 1) {
  9893. tmp = uint8[len - 1]
  9894. output += lookup[tmp >> 2]
  9895. output += lookup[(tmp << 4) & 0x3F]
  9896. output += '=='
  9897. } else if (extraBytes === 2) {
  9898. tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
  9899. output += lookup[tmp >> 10]
  9900. output += lookup[(tmp >> 4) & 0x3F]
  9901. output += lookup[(tmp << 2) & 0x3F]
  9902. output += '='
  9903. }
  9904. parts.push(output)
  9905. return parts.join('')
  9906. }
  9907. /***/ }),
  9908. /* 4 */
  9909. /***/ (function(module, exports) {
  9910. exports.read = function (buffer, offset, isLE, mLen, nBytes) {
  9911. var e, m
  9912. var eLen = nBytes * 8 - mLen - 1
  9913. var eMax = (1 << eLen) - 1
  9914. var eBias = eMax >> 1
  9915. var nBits = -7
  9916. var i = isLE ? (nBytes - 1) : 0
  9917. var d = isLE ? -1 : 1
  9918. var s = buffer[offset + i]
  9919. i += d
  9920. e = s & ((1 << (-nBits)) - 1)
  9921. s >>= (-nBits)
  9922. nBits += eLen
  9923. for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
  9924. m = e & ((1 << (-nBits)) - 1)
  9925. e >>= (-nBits)
  9926. nBits += mLen
  9927. for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
  9928. if (e === 0) {
  9929. e = 1 - eBias
  9930. } else if (e === eMax) {
  9931. return m ? NaN : ((s ? -1 : 1) * Infinity)
  9932. } else {
  9933. m = m + Math.pow(2, mLen)
  9934. e = e - eBias
  9935. }
  9936. return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
  9937. }
  9938. exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
  9939. var e, m, c
  9940. var eLen = nBytes * 8 - mLen - 1
  9941. var eMax = (1 << eLen) - 1
  9942. var eBias = eMax >> 1
  9943. var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
  9944. var i = isLE ? 0 : (nBytes - 1)
  9945. var d = isLE ? 1 : -1
  9946. var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
  9947. value = Math.abs(value)
  9948. if (isNaN(value) || value === Infinity) {
  9949. m = isNaN(value) ? 1 : 0
  9950. e = eMax
  9951. } else {
  9952. e = Math.floor(Math.log(value) / Math.LN2)
  9953. if (value * (c = Math.pow(2, -e)) < 1) {
  9954. e--
  9955. c *= 2
  9956. }
  9957. if (e + eBias >= 1) {
  9958. value += rt / c
  9959. } else {
  9960. value += rt * Math.pow(2, 1 - eBias)
  9961. }
  9962. if (value * c >= 2) {
  9963. e++
  9964. c /= 2
  9965. }
  9966. if (e + eBias >= eMax) {
  9967. m = 0
  9968. e = eMax
  9969. } else if (e + eBias >= 1) {
  9970. m = (value * c - 1) * Math.pow(2, mLen)
  9971. e = e + eBias
  9972. } else {
  9973. m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
  9974. e = 0
  9975. }
  9976. }
  9977. for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
  9978. e = (e << mLen) | m
  9979. eLen += mLen
  9980. for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
  9981. buffer[offset + i - d] |= s * 128
  9982. }
  9983. /***/ }),
  9984. /* 5 */
  9985. /***/ (function(module, exports) {
  9986. var toString = {}.toString;
  9987. module.exports = Array.isArray || function (arr) {
  9988. return toString.call(arr) == '[object Array]';
  9989. };
  9990. /***/ }),
  9991. /* 6 */
  9992. /***/ (function(module, exports, __webpack_require__) {
  9993. /* jslint node: true */
  9994. 'use strict';
  9995. var _ = __webpack_require__(7);
  9996. var FontProvider = __webpack_require__(9);
  9997. var LayoutBuilder = __webpack_require__(10);
  9998. var PdfKit = __webpack_require__(30);
  9999. var sizes = __webpack_require__(297);
  10000. var ImageMeasure = __webpack_require__(298);
  10001. var textDecorator = __webpack_require__(299);
  10002. var TextTools = __webpack_require__(15);
  10003. _.noConflict();
  10004. ////////////////////////////////////////
  10005. // PdfPrinter
  10006. /**
  10007. * @class Creates an instance of a PdfPrinter which turns document definition into a pdf
  10008. *
  10009. * @param {Object} fontDescriptors font definition dictionary
  10010. *
  10011. * @example
  10012. * var fontDescriptors = {
  10013. * Roboto: {
  10014. * normal: 'fonts/Roboto-Regular.ttf',
  10015. * bold: 'fonts/Roboto-Medium.ttf',
  10016. * italics: 'fonts/Roboto-Italic.ttf',
  10017. * bolditalics: 'fonts/Roboto-MediumItalic.ttf'
  10018. * }
  10019. * };
  10020. *
  10021. * var printer = new PdfPrinter(fontDescriptors);
  10022. */
  10023. function PdfPrinter(fontDescriptors) {
  10024. this.fontDescriptors = fontDescriptors;
  10025. }
  10026. /**
  10027. * Executes layout engine for the specified document and renders it into a pdfkit document
  10028. * ready to be saved.
  10029. *
  10030. * @param {Object} docDefinition document definition
  10031. * @param {Object} docDefinition.content an array describing the pdf structure (for more information take a look at the examples in the /examples folder)
  10032. * @param {Object} [docDefinition.defaultStyle] default (implicit) style definition
  10033. * @param {Object} [docDefinition.styles] dictionary defining all styles which can be used in the document
  10034. * @param {Object} [docDefinition.pageSize] page size (pdfkit units, A4 dimensions by default)
  10035. * @param {Number} docDefinition.pageSize.width width
  10036. * @param {Number} docDefinition.pageSize.height height
  10037. * @param {Object} [docDefinition.pageMargins] page margins (pdfkit units)
  10038. * @param {Number} docDefinition.maxPagesNumber maximum number of pages to render
  10039. *
  10040. * @example
  10041. *
  10042. * var docDefinition = {
  10043. * info: {
  10044. * title: 'awesome Document',
  10045. * author: 'john doe',
  10046. * subject: 'subject of document',
  10047. * keywords: 'keywords for document',
  10048. * },
  10049. * content: [
  10050. * 'First paragraph',
  10051. * 'Second paragraph, this time a little bit longer',
  10052. * { text: 'Third paragraph, slightly bigger font size', fontSize: 20 },
  10053. * { text: 'Another paragraph using a named style', style: 'header' },
  10054. * { text: ['playing with ', 'inlines' ] },
  10055. * { text: ['and ', { text: 'restyling ', bold: true }, 'them'] },
  10056. * ],
  10057. * styles: {
  10058. * header: { fontSize: 30, bold: true }
  10059. * }
  10060. * }
  10061. *
  10062. * var pdfKitDoc = printer.createPdfKitDocument(docDefinition);
  10063. *
  10064. * pdfKitDoc.pipe(fs.createWriteStream('sample.pdf'));
  10065. * pdfKitDoc.end();
  10066. *
  10067. * @return {Object} a pdfKit document object which can be saved or encode to data-url
  10068. */
  10069. PdfPrinter.prototype.createPdfKitDocument = function (docDefinition, options) {
  10070. options = options || {};
  10071. var pageSize = fixPageSize(docDefinition.pageSize, docDefinition.pageOrientation);
  10072. this.pdfKitDoc = new PdfKit({size: [pageSize.width, pageSize.height], autoFirstPage: false, compress: docDefinition.compress || true});
  10073. setMetadata(docDefinition, this.pdfKitDoc);
  10074. this.fontProvider = new FontProvider(this.fontDescriptors, this.pdfKitDoc);
  10075. docDefinition.images = docDefinition.images || {};
  10076. var builder = new LayoutBuilder(pageSize, fixPageMargins(docDefinition.pageMargins || 40), new ImageMeasure(this.pdfKitDoc, docDefinition.images));
  10077. registerDefaultTableLayouts(builder);
  10078. if (options.tableLayouts) {
  10079. builder.registerTableLayouts(options.tableLayouts);
  10080. }
  10081. var pages = builder.layoutDocument(docDefinition.content, this.fontProvider, docDefinition.styles || {}, docDefinition.defaultStyle || {fontSize: 12, font: 'Roboto'}, docDefinition.background, docDefinition.header, docDefinition.footer, docDefinition.images, docDefinition.watermark, docDefinition.pageBreakBefore);
  10082. var maxNumberPages = docDefinition.maxPagesNumber || -1;
  10083. if (typeof maxNumberPages === 'number' && maxNumberPages > -1) {
  10084. pages = pages.slice(0, maxNumberPages);
  10085. }
  10086. // if pageSize.height is set to Infinity, calculate the actual height of the page that
  10087. // was laid out using the height of each of the items in the page.
  10088. if (pageSize.height === Infinity) {
  10089. var pageHeight = calculatePageHeight(pages, docDefinition.pageMargins);
  10090. this.pdfKitDoc.options.size = [pageSize.width, pageHeight];
  10091. }
  10092. renderPages(pages, this.fontProvider, this.pdfKitDoc, options.progressCallback);
  10093. if (options.autoPrint) {
  10094. var printActionRef = this.pdfKitDoc.ref({
  10095. Type: 'Action',
  10096. S: 'Named',
  10097. N: 'Print'
  10098. });
  10099. this.pdfKitDoc._root.data.OpenAction = printActionRef;
  10100. printActionRef.end();
  10101. }
  10102. return this.pdfKitDoc;
  10103. };
  10104. function setMetadata(docDefinition, pdfKitDoc) {
  10105. // PDF standard has these properties reserved: Title, Author, Subject, Keywords,
  10106. // Creator, Producer, CreationDate, ModDate, Trapped.
  10107. // To keep the pdfmake api consistent, the info field are defined lowercase.
  10108. // Custom properties don't contain a space.
  10109. function standardizePropertyKey(key) {
  10110. var standardProperties = ['Title', 'Author', 'Subject', 'Keywords',
  10111. 'Creator', 'Producer', 'CreationDate', 'ModDate', 'Trapped'];
  10112. var standardizedKey = key.charAt(0).toUpperCase() + key.slice(1);
  10113. if (standardProperties.indexOf(standardizedKey) !== -1) {
  10114. return standardizedKey;
  10115. }
  10116. return key.replace(/\s+/g, '');
  10117. }
  10118. pdfKitDoc.info.Producer = 'pdfmake';
  10119. pdfKitDoc.info.Creator = 'pdfmake';
  10120. if (docDefinition.info) {
  10121. for (var key in docDefinition.info) {
  10122. var value = docDefinition.info[key];
  10123. if (value) {
  10124. key = standardizePropertyKey(key);
  10125. pdfKitDoc.info[key] = value;
  10126. }
  10127. }
  10128. }
  10129. }
  10130. function calculatePageHeight(pages, margins) {
  10131. function getItemHeight(item) {
  10132. if (typeof item.item.getHeight === 'function') {
  10133. return item.item.getHeight();
  10134. } else if (item.item._height) {
  10135. return item.item._height;
  10136. } else {
  10137. // TODO: add support for next item types
  10138. return 0;
  10139. }
  10140. }
  10141. var fixedMargins = fixPageMargins(margins || 40);
  10142. var height = fixedMargins.top + fixedMargins.bottom;
  10143. pages.forEach(function (page) {
  10144. page.items.forEach(function (item) {
  10145. height += getItemHeight(item);
  10146. });
  10147. });
  10148. return height;
  10149. }
  10150. function fixPageSize(pageSize, pageOrientation) {
  10151. function isNeedSwapPageSizes(pageOrientation) {
  10152. if (typeof pageOrientation === 'string' || pageOrientation instanceof String) {
  10153. pageOrientation = pageOrientation.toLowerCase();
  10154. return ((pageOrientation === 'portrait') && (size.width > size.height)) ||
  10155. ((pageOrientation === 'landscape') && (size.width < size.height));
  10156. }
  10157. return false;
  10158. }
  10159. // if pageSize.height is set to auto, set the height to infinity so there are no page breaks.
  10160. if (pageSize && pageSize.height === 'auto') {
  10161. pageSize.height = Infinity;
  10162. }
  10163. var size = pageSize2widthAndHeight(pageSize || 'A4');
  10164. if (isNeedSwapPageSizes(pageOrientation)) { // swap page sizes
  10165. size = {width: size.height, height: size.width};
  10166. }
  10167. size.orientation = size.width > size.height ? 'landscape' : 'portrait';
  10168. return size;
  10169. }
  10170. function fixPageMargins(margin) {
  10171. if (!margin) {
  10172. return null;
  10173. }
  10174. if (typeof margin === 'number' || margin instanceof Number) {
  10175. margin = {left: margin, right: margin, top: margin, bottom: margin};
  10176. } else if (Array.isArray(margin)) {
  10177. if (margin.length === 2) {
  10178. margin = {left: margin[0], top: margin[1], right: margin[0], bottom: margin[1]};
  10179. } else if (margin.length === 4) {
  10180. margin = {left: margin[0], top: margin[1], right: margin[2], bottom: margin[3]};
  10181. } else {
  10182. throw 'Invalid pageMargins definition';
  10183. }
  10184. }
  10185. return margin;
  10186. }
  10187. function registerDefaultTableLayouts(layoutBuilder) {
  10188. /*jshint unused: false */
  10189. layoutBuilder.registerTableLayouts({
  10190. noBorders: {
  10191. hLineWidth: function (i) {
  10192. return 0;
  10193. },
  10194. vLineWidth: function (i) {
  10195. return 0;
  10196. },
  10197. paddingLeft: function (i) {
  10198. return i && 4 || 0;
  10199. },
  10200. paddingRight: function (i, node) {
  10201. return (i < node.table.widths.length - 1) ? 4 : 0;
  10202. }
  10203. },
  10204. headerLineOnly: {
  10205. hLineWidth: function (i, node) {
  10206. if (i === 0 || i === node.table.body.length) {
  10207. return 0;
  10208. }
  10209. return (i === node.table.headerRows) ? 2 : 0;
  10210. },
  10211. vLineWidth: function (i) {
  10212. return 0;
  10213. },
  10214. paddingLeft: function (i) {
  10215. return i === 0 ? 0 : 8;
  10216. },
  10217. paddingRight: function (i, node) {
  10218. return (i === node.table.widths.length - 1) ? 0 : 8;
  10219. }
  10220. },
  10221. lightHorizontalLines: {
  10222. hLineWidth: function (i, node) {
  10223. if (i === 0 || i === node.table.body.length) {
  10224. return 0;
  10225. }
  10226. return (i === node.table.headerRows) ? 2 : 1;
  10227. },
  10228. vLineWidth: function (i) {
  10229. return 0;
  10230. },
  10231. hLineColor: function (i) {
  10232. return i === 1 ? 'black' : '#aaa';
  10233. },
  10234. paddingLeft: function (i) {
  10235. return i === 0 ? 0 : 8;
  10236. },
  10237. paddingRight: function (i, node) {
  10238. return (i === node.table.widths.length - 1) ? 0 : 8;
  10239. }
  10240. }
  10241. });
  10242. }
  10243. function pageSize2widthAndHeight(pageSize) {
  10244. if (typeof pageSize === 'string' || pageSize instanceof String) {
  10245. var size = sizes[pageSize.toUpperCase()];
  10246. if (!size) {
  10247. throw 'Page size ' + pageSize + ' not recognized';
  10248. }
  10249. return {width: size[0], height: size[1]};
  10250. }
  10251. return pageSize;
  10252. }
  10253. function updatePageOrientationInOptions(currentPage, pdfKitDoc) {
  10254. var previousPageOrientation = pdfKitDoc.options.size[0] > pdfKitDoc.options.size[1] ? 'landscape' : 'portrait';
  10255. if (currentPage.pageSize.orientation !== previousPageOrientation) {
  10256. var width = pdfKitDoc.options.size[0];
  10257. var height = pdfKitDoc.options.size[1];
  10258. pdfKitDoc.options.size = [height, width];
  10259. }
  10260. }
  10261. function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) {
  10262. pdfKitDoc._pdfMakePages = pages;
  10263. pdfKitDoc.addPage();
  10264. var totalItems = progressCallback && _.sumBy(pages, function (page) {
  10265. return page.items.length;
  10266. });
  10267. var renderedItems = 0;
  10268. progressCallback = progressCallback || function () {};
  10269. for (var i = 0; i < pages.length; i++) {
  10270. if (i > 0) {
  10271. updatePageOrientationInOptions(pages[i], pdfKitDoc);
  10272. pdfKitDoc.addPage(pdfKitDoc.options);
  10273. }
  10274. var page = pages[i];
  10275. for (var ii = 0, il = page.items.length; ii < il; ii++) {
  10276. var item = page.items[ii];
  10277. switch (item.type) {
  10278. case 'vector':
  10279. renderVector(item.item, pdfKitDoc);
  10280. break;
  10281. case 'line':
  10282. renderLine(item.item, item.item.x, item.item.y, pdfKitDoc);
  10283. break;
  10284. case 'image':
  10285. renderImage(item.item, item.item.x, item.item.y, pdfKitDoc);
  10286. break;
  10287. }
  10288. renderedItems++;
  10289. progressCallback(renderedItems / totalItems);
  10290. }
  10291. if (page.watermark) {
  10292. renderWatermark(page, pdfKitDoc);
  10293. }
  10294. }
  10295. }
  10296. function renderLine(line, x, y, pdfKitDoc) {
  10297. if (line._tocItemNode) {
  10298. var newWidth;
  10299. var diffWidth;
  10300. var textTools = new TextTools(null);
  10301. line.inlines[0].text = line._tocItemNode.positions[0].pageNumber.toString();
  10302. newWidth = textTools.widthOfString(line.inlines[0].text, line.inlines[0].font, line.inlines[0].fontSize, line.inlines[0].characterSpacing);
  10303. diffWidth = line.inlines[0].width - newWidth;
  10304. line.inlines[0].width = newWidth;
  10305. switch (line.inlines[0].alignment) {
  10306. case 'right':
  10307. line.inlines[0].x += diffWidth;
  10308. break;
  10309. case 'center':
  10310. line.inlines[0].x += diffWidth / 2;
  10311. break;
  10312. }
  10313. }
  10314. x = x || 0;
  10315. y = y || 0;
  10316. var lineHeight = line.getHeight();
  10317. var ascenderHeight = line.getAscenderHeight();
  10318. var descent = lineHeight - ascenderHeight;
  10319. textDecorator.drawBackground(line, x, y, pdfKitDoc);
  10320. //TODO: line.optimizeInlines();
  10321. for (var i = 0, l = line.inlines.length; i < l; i++) {
  10322. var inline = line.inlines[i];
  10323. var shiftToBaseline = lineHeight - ((inline.font.ascender / 1000) * inline.fontSize) - descent;
  10324. pdfKitDoc.fill(inline.color || 'black');
  10325. pdfKitDoc._font = inline.font;
  10326. pdfKitDoc.fontSize(inline.fontSize);
  10327. pdfKitDoc.text(inline.text, x + inline.x, y + shiftToBaseline, {
  10328. lineBreak: false,
  10329. textWidth: inline.width,
  10330. characterSpacing: inline.characterSpacing,
  10331. wordCount: 1,
  10332. link: inline.link
  10333. });
  10334. if (inline.linkToPage) {
  10335. var _ref = pdfKitDoc.ref({Type: 'Action', S: 'GoTo', D: [inline.linkToPage, 0, 0]}).end();
  10336. pdfKitDoc.annotate(x + inline.x, y + shiftToBaseline, inline.width, inline.height, {Subtype: 'Link', Dest: [inline.linkToPage - 1, 'XYZ', null, null, null]});
  10337. }
  10338. }
  10339. textDecorator.drawDecorations(line, x, y, pdfKitDoc);
  10340. }
  10341. function renderWatermark(page, pdfKitDoc) {
  10342. var watermark = page.watermark;
  10343. pdfKitDoc.fill(watermark.color);
  10344. pdfKitDoc.opacity(watermark.opacity);
  10345. pdfKitDoc.save();
  10346. var angle = Math.atan2(pdfKitDoc.page.height, pdfKitDoc.page.width) * -180 / Math.PI;
  10347. pdfKitDoc.rotate(angle, {origin: [pdfKitDoc.page.width / 2, pdfKitDoc.page.height / 2]});
  10348. var x = pdfKitDoc.page.width / 2 - watermark.size.size.width / 2;
  10349. var y = pdfKitDoc.page.height / 2 - watermark.size.size.height / 4;
  10350. pdfKitDoc._font = watermark.font;
  10351. pdfKitDoc.fontSize(watermark.size.fontSize);
  10352. pdfKitDoc.text(watermark.text, x, y, {lineBreak: false});
  10353. pdfKitDoc.restore();
  10354. }
  10355. function renderVector(vector, pdfKitDoc) {
  10356. //TODO: pdf optimization (there's no need to write all properties everytime)
  10357. pdfKitDoc.lineWidth(vector.lineWidth || 1);
  10358. if (vector.dash) {
  10359. pdfKitDoc.dash(vector.dash.length, {space: vector.dash.space || vector.dash.length, phase: vector.dash.phase || 0});
  10360. } else {
  10361. pdfKitDoc.undash();
  10362. }
  10363. pdfKitDoc.lineJoin(vector.lineJoin || 'miter');
  10364. //TODO: clipping
  10365. switch (vector.type) {
  10366. case 'ellipse':
  10367. pdfKitDoc.ellipse(vector.x, vector.y, vector.r1, vector.r2);
  10368. break;
  10369. case 'rect':
  10370. if (vector.r) {
  10371. pdfKitDoc.roundedRect(vector.x, vector.y, vector.w, vector.h, vector.r);
  10372. } else {
  10373. pdfKitDoc.rect(vector.x, vector.y, vector.w, vector.h);
  10374. }
  10375. if (vector.linearGradient) {
  10376. var gradient = pdfKitDoc.linearGradient(vector.x, vector.y, vector.x + vector.w, vector.y);
  10377. var step = 1 / (vector.linearGradient.length - 1);
  10378. for (var i = 0; i < vector.linearGradient.length; i++) {
  10379. gradient.stop(i * step, vector.linearGradient[i]);
  10380. }
  10381. vector.color = gradient;
  10382. }
  10383. break;
  10384. case 'line':
  10385. pdfKitDoc.moveTo(vector.x1, vector.y1);
  10386. pdfKitDoc.lineTo(vector.x2, vector.y2);
  10387. break;
  10388. case 'polyline':
  10389. if (vector.points.length === 0) {
  10390. break;
  10391. }
  10392. pdfKitDoc.moveTo(vector.points[0].x, vector.points[0].y);
  10393. for (var i = 1, l = vector.points.length; i < l; i++) {
  10394. pdfKitDoc.lineTo(vector.points[i].x, vector.points[i].y);
  10395. }
  10396. if (vector.points.length > 1) {
  10397. var p1 = vector.points[0];
  10398. var pn = vector.points[vector.points.length - 1];
  10399. if (vector.closePath || p1.x === pn.x && p1.y === pn.y) {
  10400. pdfKitDoc.closePath();
  10401. }
  10402. }
  10403. break;
  10404. case 'path':
  10405. pdfKitDoc.path(vector.d);
  10406. break;
  10407. }
  10408. if (vector.color && vector.lineColor) {
  10409. pdfKitDoc.fillColor(vector.color, vector.fillOpacity || 1);
  10410. pdfKitDoc.strokeColor(vector.lineColor, vector.strokeOpacity || 1);
  10411. pdfKitDoc.fillAndStroke();
  10412. } else if (vector.color) {
  10413. pdfKitDoc.fillColor(vector.color, vector.fillOpacity || 1);
  10414. pdfKitDoc.fill();
  10415. } else {
  10416. pdfKitDoc.strokeColor(vector.lineColor || 'black', vector.strokeOpacity || 1);
  10417. pdfKitDoc.stroke();
  10418. }
  10419. }
  10420. function renderImage(image, x, y, pdfKitDoc) {
  10421. pdfKitDoc.image(image.image, image.x, image.y, {width: image._width, height: image._height});
  10422. if (image.link) {
  10423. pdfKitDoc.link(image.x, image.y, image._width, image._height, image.link);
  10424. }
  10425. }
  10426. module.exports = PdfPrinter;
  10427. /* temporary browser extension */
  10428. PdfPrinter.prototype.fs = __webpack_require__(56);
  10429. /***/ }),
  10430. /* 7 */
  10431. /***/ (function(module, exports, __webpack_require__) {
  10432. var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(global, module) {/**
  10433. * @license
  10434. * Lodash <https://lodash.com/>
  10435. * Copyright JS Foundation and other contributors <https://js.foundation/>
  10436. * Released under MIT license <https://lodash.com/license>
  10437. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  10438. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  10439. */
  10440. ;(function() {
  10441. /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  10442. var undefined;
  10443. /** Used as the semantic version number. */
  10444. var VERSION = '4.17.4';
  10445. /** Used as the size to enable large array optimizations. */
  10446. var LARGE_ARRAY_SIZE = 200;
  10447. /** Error message constants. */
  10448. var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
  10449. FUNC_ERROR_TEXT = 'Expected a function';
  10450. /** Used to stand-in for `undefined` hash values. */
  10451. var HASH_UNDEFINED = '__lodash_hash_undefined__';
  10452. /** Used as the maximum memoize cache size. */
  10453. var MAX_MEMOIZE_SIZE = 500;
  10454. /** Used as the internal argument placeholder. */
  10455. var PLACEHOLDER = '__lodash_placeholder__';
  10456. /** Used to compose bitmasks for cloning. */
  10457. var CLONE_DEEP_FLAG = 1,
  10458. CLONE_FLAT_FLAG = 2,
  10459. CLONE_SYMBOLS_FLAG = 4;
  10460. /** Used to compose bitmasks for value comparisons. */
  10461. var COMPARE_PARTIAL_FLAG = 1,
  10462. COMPARE_UNORDERED_FLAG = 2;
  10463. /** Used to compose bitmasks for function metadata. */
  10464. var WRAP_BIND_FLAG = 1,
  10465. WRAP_BIND_KEY_FLAG = 2,
  10466. WRAP_CURRY_BOUND_FLAG = 4,
  10467. WRAP_CURRY_FLAG = 8,
  10468. WRAP_CURRY_RIGHT_FLAG = 16,
  10469. WRAP_PARTIAL_FLAG = 32,
  10470. WRAP_PARTIAL_RIGHT_FLAG = 64,
  10471. WRAP_ARY_FLAG = 128,
  10472. WRAP_REARG_FLAG = 256,
  10473. WRAP_FLIP_FLAG = 512;
  10474. /** Used as default options for `_.truncate`. */
  10475. var DEFAULT_TRUNC_LENGTH = 30,
  10476. DEFAULT_TRUNC_OMISSION = '...';
  10477. /** Used to detect hot functions by number of calls within a span of milliseconds. */
  10478. var HOT_COUNT = 800,
  10479. HOT_SPAN = 16;
  10480. /** Used to indicate the type of lazy iteratees. */
  10481. var LAZY_FILTER_FLAG = 1,
  10482. LAZY_MAP_FLAG = 2,
  10483. LAZY_WHILE_FLAG = 3;
  10484. /** Used as references for various `Number` constants. */
  10485. var INFINITY = 1 / 0,
  10486. MAX_SAFE_INTEGER = 9007199254740991,
  10487. MAX_INTEGER = 1.7976931348623157e+308,
  10488. NAN = 0 / 0;
  10489. /** Used as references for the maximum length and index of an array. */
  10490. var MAX_ARRAY_LENGTH = 4294967295,
  10491. MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
  10492. HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
  10493. /** Used to associate wrap methods with their bit flags. */
  10494. var wrapFlags = [
  10495. ['ary', WRAP_ARY_FLAG],
  10496. ['bind', WRAP_BIND_FLAG],
  10497. ['bindKey', WRAP_BIND_KEY_FLAG],
  10498. ['curry', WRAP_CURRY_FLAG],
  10499. ['curryRight', WRAP_CURRY_RIGHT_FLAG],
  10500. ['flip', WRAP_FLIP_FLAG],
  10501. ['partial', WRAP_PARTIAL_FLAG],
  10502. ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
  10503. ['rearg', WRAP_REARG_FLAG]
  10504. ];
  10505. /** `Object#toString` result references. */
  10506. var argsTag = '[object Arguments]',
  10507. arrayTag = '[object Array]',
  10508. asyncTag = '[object AsyncFunction]',
  10509. boolTag = '[object Boolean]',
  10510. dateTag = '[object Date]',
  10511. domExcTag = '[object DOMException]',
  10512. errorTag = '[object Error]',
  10513. funcTag = '[object Function]',
  10514. genTag = '[object GeneratorFunction]',
  10515. mapTag = '[object Map]',
  10516. numberTag = '[object Number]',
  10517. nullTag = '[object Null]',
  10518. objectTag = '[object Object]',
  10519. promiseTag = '[object Promise]',
  10520. proxyTag = '[object Proxy]',
  10521. regexpTag = '[object RegExp]',
  10522. setTag = '[object Set]',
  10523. stringTag = '[object String]',
  10524. symbolTag = '[object Symbol]',
  10525. undefinedTag = '[object Undefined]',
  10526. weakMapTag = '[object WeakMap]',
  10527. weakSetTag = '[object WeakSet]';
  10528. var arrayBufferTag = '[object ArrayBuffer]',
  10529. dataViewTag = '[object DataView]',
  10530. float32Tag = '[object Float32Array]',
  10531. float64Tag = '[object Float64Array]',
  10532. int8Tag = '[object Int8Array]',
  10533. int16Tag = '[object Int16Array]',
  10534. int32Tag = '[object Int32Array]',
  10535. uint8Tag = '[object Uint8Array]',
  10536. uint8ClampedTag = '[object Uint8ClampedArray]',
  10537. uint16Tag = '[object Uint16Array]',
  10538. uint32Tag = '[object Uint32Array]';
  10539. /** Used to match empty string literals in compiled template source. */
  10540. var reEmptyStringLeading = /\b__p \+= '';/g,
  10541. reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
  10542. reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
  10543. /** Used to match HTML entities and HTML characters. */
  10544. var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
  10545. reUnescapedHtml = /[&<>"']/g,
  10546. reHasEscapedHtml = RegExp(reEscapedHtml.source),
  10547. reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
  10548. /** Used to match template delimiters. */
  10549. var reEscape = /<%-([\s\S]+?)%>/g,
  10550. reEvaluate = /<%([\s\S]+?)%>/g,
  10551. reInterpolate = /<%=([\s\S]+?)%>/g;
  10552. /** Used to match property names within property paths. */
  10553. var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
  10554. reIsPlainProp = /^\w*$/,
  10555. reLeadingDot = /^\./,
  10556. rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
  10557. /**
  10558. * Used to match `RegExp`
  10559. * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
  10560. */
  10561. var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
  10562. reHasRegExpChar = RegExp(reRegExpChar.source);
  10563. /** Used to match leading and trailing whitespace. */
  10564. var reTrim = /^\s+|\s+$/g,
  10565. reTrimStart = /^\s+/,
  10566. reTrimEnd = /\s+$/;
  10567. /** Used to match wrap detail comments. */
  10568. var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
  10569. reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
  10570. reSplitDetails = /,? & /;
  10571. /** Used to match words composed of alphanumeric characters. */
  10572. var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
  10573. /** Used to match backslashes in property paths. */
  10574. var reEscapeChar = /\\(\\)?/g;
  10575. /**
  10576. * Used to match
  10577. * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
  10578. */
  10579. var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
  10580. /** Used to match `RegExp` flags from their coerced string values. */
  10581. var reFlags = /\w*$/;
  10582. /** Used to detect bad signed hexadecimal string values. */
  10583. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  10584. /** Used to detect binary string values. */
  10585. var reIsBinary = /^0b[01]+$/i;
  10586. /** Used to detect host constructors (Safari). */
  10587. var reIsHostCtor = /^\[object .+?Constructor\]$/;
  10588. /** Used to detect octal string values. */
  10589. var reIsOctal = /^0o[0-7]+$/i;
  10590. /** Used to detect unsigned integer values. */
  10591. var reIsUint = /^(?:0|[1-9]\d*)$/;
  10592. /** Used to match Latin Unicode letters (excluding mathematical operators). */
  10593. var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
  10594. /** Used to ensure capturing order of template delimiters. */
  10595. var reNoMatch = /($^)/;
  10596. /** Used to match unescaped characters in compiled string literals. */
  10597. var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
  10598. /** Used to compose unicode character classes. */
  10599. var rsAstralRange = '\\ud800-\\udfff',
  10600. rsComboMarksRange = '\\u0300-\\u036f',
  10601. reComboHalfMarksRange = '\\ufe20-\\ufe2f',
  10602. rsComboSymbolsRange = '\\u20d0-\\u20ff',
  10603. rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
  10604. rsDingbatRange = '\\u2700-\\u27bf',
  10605. rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
  10606. rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
  10607. rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
  10608. rsPunctuationRange = '\\u2000-\\u206f',
  10609. rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
  10610. rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
  10611. rsVarRange = '\\ufe0e\\ufe0f',
  10612. rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
  10613. /** Used to compose unicode capture groups. */
  10614. var rsApos = "['\u2019]",
  10615. rsAstral = '[' + rsAstralRange + ']',
  10616. rsBreak = '[' + rsBreakRange + ']',
  10617. rsCombo = '[' + rsComboRange + ']',
  10618. rsDigits = '\\d+',
  10619. rsDingbat = '[' + rsDingbatRange + ']',
  10620. rsLower = '[' + rsLowerRange + ']',
  10621. rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
  10622. rsFitz = '\\ud83c[\\udffb-\\udfff]',
  10623. rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
  10624. rsNonAstral = '[^' + rsAstralRange + ']',
  10625. rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
  10626. rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
  10627. rsUpper = '[' + rsUpperRange + ']',
  10628. rsZWJ = '\\u200d';
  10629. /** Used to compose unicode regexes. */
  10630. var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
  10631. rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
  10632. rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
  10633. rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
  10634. reOptMod = rsModifier + '?',
  10635. rsOptVar = '[' + rsVarRange + ']?',
  10636. rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
  10637. rsOrdLower = '\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)',
  10638. rsOrdUpper = '\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)',
  10639. rsSeq = rsOptVar + reOptMod + rsOptJoin,
  10640. rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
  10641. rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
  10642. /** Used to match apostrophes. */
  10643. var reApos = RegExp(rsApos, 'g');
  10644. /**
  10645. * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
  10646. * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
  10647. */
  10648. var reComboMark = RegExp(rsCombo, 'g');
  10649. /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
  10650. var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
  10651. /** Used to match complex or compound words. */
  10652. var reUnicodeWord = RegExp([
  10653. rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
  10654. rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
  10655. rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
  10656. rsUpper + '+' + rsOptContrUpper,
  10657. rsOrdUpper,
  10658. rsOrdLower,
  10659. rsDigits,
  10660. rsEmoji
  10661. ].join('|'), 'g');
  10662. /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
  10663. var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
  10664. /** Used to detect strings that need a more robust regexp to match words. */
  10665. var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
  10666. /** Used to assign default `context` object properties. */
  10667. var contextProps = [
  10668. 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
  10669. 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
  10670. 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
  10671. 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
  10672. '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
  10673. ];
  10674. /** Used to make template sourceURLs easier to identify. */
  10675. var templateCounter = -1;
  10676. /** Used to identify `toStringTag` values of typed arrays. */
  10677. var typedArrayTags = {};
  10678. typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
  10679. typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
  10680. typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
  10681. typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
  10682. typedArrayTags[uint32Tag] = true;
  10683. typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
  10684. typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
  10685. typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
  10686. typedArrayTags[errorTag] = typedArrayTags[funcTag] =
  10687. typedArrayTags[mapTag] = typedArrayTags[numberTag] =
  10688. typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
  10689. typedArrayTags[setTag] = typedArrayTags[stringTag] =
  10690. typedArrayTags[weakMapTag] = false;
  10691. /** Used to identify `toStringTag` values supported by `_.clone`. */
  10692. var cloneableTags = {};
  10693. cloneableTags[argsTag] = cloneableTags[arrayTag] =
  10694. cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
  10695. cloneableTags[boolTag] = cloneableTags[dateTag] =
  10696. cloneableTags[float32Tag] = cloneableTags[float64Tag] =
  10697. cloneableTags[int8Tag] = cloneableTags[int16Tag] =
  10698. cloneableTags[int32Tag] = cloneableTags[mapTag] =
  10699. cloneableTags[numberTag] = cloneableTags[objectTag] =
  10700. cloneableTags[regexpTag] = cloneableTags[setTag] =
  10701. cloneableTags[stringTag] = cloneableTags[symbolTag] =
  10702. cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
  10703. cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
  10704. cloneableTags[errorTag] = cloneableTags[funcTag] =
  10705. cloneableTags[weakMapTag] = false;
  10706. /** Used to map Latin Unicode letters to basic Latin letters. */
  10707. var deburredLetters = {
  10708. // Latin-1 Supplement block.
  10709. '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
  10710. '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
  10711. '\xc7': 'C', '\xe7': 'c',
  10712. '\xd0': 'D', '\xf0': 'd',
  10713. '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
  10714. '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
  10715. '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
  10716. '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
  10717. '\xd1': 'N', '\xf1': 'n',
  10718. '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
  10719. '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
  10720. '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
  10721. '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
  10722. '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
  10723. '\xc6': 'Ae', '\xe6': 'ae',
  10724. '\xde': 'Th', '\xfe': 'th',
  10725. '\xdf': 'ss',
  10726. // Latin Extended-A block.
  10727. '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
  10728. '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
  10729. '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
  10730. '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
  10731. '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
  10732. '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
  10733. '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
  10734. '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
  10735. '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
  10736. '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
  10737. '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
  10738. '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
  10739. '\u0134': 'J', '\u0135': 'j',
  10740. '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
  10741. '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
  10742. '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
  10743. '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
  10744. '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
  10745. '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
  10746. '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
  10747. '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
  10748. '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
  10749. '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
  10750. '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
  10751. '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
  10752. '\u0163': 't', '\u0165': 't', '\u0167': 't',
  10753. '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
  10754. '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
  10755. '\u0174': 'W', '\u0175': 'w',
  10756. '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
  10757. '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
  10758. '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
  10759. '\u0132': 'IJ', '\u0133': 'ij',
  10760. '\u0152': 'Oe', '\u0153': 'oe',
  10761. '\u0149': "'n", '\u017f': 's'
  10762. };
  10763. /** Used to map characters to HTML entities. */
  10764. var htmlEscapes = {
  10765. '&': '&amp;',
  10766. '<': '&lt;',
  10767. '>': '&gt;',
  10768. '"': '&quot;',
  10769. "'": '&#39;'
  10770. };
  10771. /** Used to map HTML entities to characters. */
  10772. var htmlUnescapes = {
  10773. '&amp;': '&',
  10774. '&lt;': '<',
  10775. '&gt;': '>',
  10776. '&quot;': '"',
  10777. '&#39;': "'"
  10778. };
  10779. /** Used to escape characters for inclusion in compiled string literals. */
  10780. var stringEscapes = {
  10781. '\\': '\\',
  10782. "'": "'",
  10783. '\n': 'n',
  10784. '\r': 'r',
  10785. '\u2028': 'u2028',
  10786. '\u2029': 'u2029'
  10787. };
  10788. /** Built-in method references without a dependency on `root`. */
  10789. var freeParseFloat = parseFloat,
  10790. freeParseInt = parseInt;
  10791. /** Detect free variable `global` from Node.js. */
  10792. var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
  10793. /** Detect free variable `self`. */
  10794. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  10795. /** Used as a reference to the global object. */
  10796. var root = freeGlobal || freeSelf || Function('return this')();
  10797. /** Detect free variable `exports`. */
  10798. var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
  10799. /** Detect free variable `module`. */
  10800. var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
  10801. /** Detect the popular CommonJS extension `module.exports`. */
  10802. var moduleExports = freeModule && freeModule.exports === freeExports;
  10803. /** Detect free variable `process` from Node.js. */
  10804. var freeProcess = moduleExports && freeGlobal.process;
  10805. /** Used to access faster Node.js helpers. */
  10806. var nodeUtil = (function() {
  10807. try {
  10808. return freeProcess && freeProcess.binding && freeProcess.binding('util');
  10809. } catch (e) {}
  10810. }());
  10811. /* Node.js helper references. */
  10812. var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
  10813. nodeIsDate = nodeUtil && nodeUtil.isDate,
  10814. nodeIsMap = nodeUtil && nodeUtil.isMap,
  10815. nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
  10816. nodeIsSet = nodeUtil && nodeUtil.isSet,
  10817. nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
  10818. /*--------------------------------------------------------------------------*/
  10819. /**
  10820. * Adds the key-value `pair` to `map`.
  10821. *
  10822. * @private
  10823. * @param {Object} map The map to modify.
  10824. * @param {Array} pair The key-value pair to add.
  10825. * @returns {Object} Returns `map`.
  10826. */
  10827. function addMapEntry(map, pair) {
  10828. // Don't return `map.set` because it's not chainable in IE 11.
  10829. map.set(pair[0], pair[1]);
  10830. return map;
  10831. }
  10832. /**
  10833. * Adds `value` to `set`.
  10834. *
  10835. * @private
  10836. * @param {Object} set The set to modify.
  10837. * @param {*} value The value to add.
  10838. * @returns {Object} Returns `set`.
  10839. */
  10840. function addSetEntry(set, value) {
  10841. // Don't return `set.add` because it's not chainable in IE 11.
  10842. set.add(value);
  10843. return set;
  10844. }
  10845. /**
  10846. * A faster alternative to `Function#apply`, this function invokes `func`
  10847. * with the `this` binding of `thisArg` and the arguments of `args`.
  10848. *
  10849. * @private
  10850. * @param {Function} func The function to invoke.
  10851. * @param {*} thisArg The `this` binding of `func`.
  10852. * @param {Array} args The arguments to invoke `func` with.
  10853. * @returns {*} Returns the result of `func`.
  10854. */
  10855. function apply(func, thisArg, args) {
  10856. switch (args.length) {
  10857. case 0: return func.call(thisArg);
  10858. case 1: return func.call(thisArg, args[0]);
  10859. case 2: return func.call(thisArg, args[0], args[1]);
  10860. case 3: return func.call(thisArg, args[0], args[1], args[2]);
  10861. }
  10862. return func.apply(thisArg, args);
  10863. }
  10864. /**
  10865. * A specialized version of `baseAggregator` for arrays.
  10866. *
  10867. * @private
  10868. * @param {Array} [array] The array to iterate over.
  10869. * @param {Function} setter The function to set `accumulator` values.
  10870. * @param {Function} iteratee The iteratee to transform keys.
  10871. * @param {Object} accumulator The initial aggregated object.
  10872. * @returns {Function} Returns `accumulator`.
  10873. */
  10874. function arrayAggregator(array, setter, iteratee, accumulator) {
  10875. var index = -1,
  10876. length = array == null ? 0 : array.length;
  10877. while (++index < length) {
  10878. var value = array[index];
  10879. setter(accumulator, value, iteratee(value), array);
  10880. }
  10881. return accumulator;
  10882. }
  10883. /**
  10884. * A specialized version of `_.forEach` for arrays without support for
  10885. * iteratee shorthands.
  10886. *
  10887. * @private
  10888. * @param {Array} [array] The array to iterate over.
  10889. * @param {Function} iteratee The function invoked per iteration.
  10890. * @returns {Array} Returns `array`.
  10891. */
  10892. function arrayEach(array, iteratee) {
  10893. var index = -1,
  10894. length = array == null ? 0 : array.length;
  10895. while (++index < length) {
  10896. if (iteratee(array[index], index, array) === false) {
  10897. break;
  10898. }
  10899. }
  10900. return array;
  10901. }
  10902. /**
  10903. * A specialized version of `_.forEachRight` for arrays without support for
  10904. * iteratee shorthands.
  10905. *
  10906. * @private
  10907. * @param {Array} [array] The array to iterate over.
  10908. * @param {Function} iteratee The function invoked per iteration.
  10909. * @returns {Array} Returns `array`.
  10910. */
  10911. function arrayEachRight(array, iteratee) {
  10912. var length = array == null ? 0 : array.length;
  10913. while (length--) {
  10914. if (iteratee(array[length], length, array) === false) {
  10915. break;
  10916. }
  10917. }
  10918. return array;
  10919. }
  10920. /**
  10921. * A specialized version of `_.every` for arrays without support for
  10922. * iteratee shorthands.
  10923. *
  10924. * @private
  10925. * @param {Array} [array] The array to iterate over.
  10926. * @param {Function} predicate The function invoked per iteration.
  10927. * @returns {boolean} Returns `true` if all elements pass the predicate check,
  10928. * else `false`.
  10929. */
  10930. function arrayEvery(array, predicate) {
  10931. var index = -1,
  10932. length = array == null ? 0 : array.length;
  10933. while (++index < length) {
  10934. if (!predicate(array[index], index, array)) {
  10935. return false;
  10936. }
  10937. }
  10938. return true;
  10939. }
  10940. /**
  10941. * A specialized version of `_.filter` for arrays without support for
  10942. * iteratee shorthands.
  10943. *
  10944. * @private
  10945. * @param {Array} [array] The array to iterate over.
  10946. * @param {Function} predicate The function invoked per iteration.
  10947. * @returns {Array} Returns the new filtered array.
  10948. */
  10949. function arrayFilter(array, predicate) {
  10950. var index = -1,
  10951. length = array == null ? 0 : array.length,
  10952. resIndex = 0,
  10953. result = [];
  10954. while (++index < length) {
  10955. var value = array[index];
  10956. if (predicate(value, index, array)) {
  10957. result[resIndex++] = value;
  10958. }
  10959. }
  10960. return result;
  10961. }
  10962. /**
  10963. * A specialized version of `_.includes` for arrays without support for
  10964. * specifying an index to search from.
  10965. *
  10966. * @private
  10967. * @param {Array} [array] The array to inspect.
  10968. * @param {*} target The value to search for.
  10969. * @returns {boolean} Returns `true` if `target` is found, else `false`.
  10970. */
  10971. function arrayIncludes(array, value) {
  10972. var length = array == null ? 0 : array.length;
  10973. return !!length && baseIndexOf(array, value, 0) > -1;
  10974. }
  10975. /**
  10976. * This function is like `arrayIncludes` except that it accepts a comparator.
  10977. *
  10978. * @private
  10979. * @param {Array} [array] The array to inspect.
  10980. * @param {*} target The value to search for.
  10981. * @param {Function} comparator The comparator invoked per element.
  10982. * @returns {boolean} Returns `true` if `target` is found, else `false`.
  10983. */
  10984. function arrayIncludesWith(array, value, comparator) {
  10985. var index = -1,
  10986. length = array == null ? 0 : array.length;
  10987. while (++index < length) {
  10988. if (comparator(value, array[index])) {
  10989. return true;
  10990. }
  10991. }
  10992. return false;
  10993. }
  10994. /**
  10995. * A specialized version of `_.map` for arrays without support for iteratee
  10996. * shorthands.
  10997. *
  10998. * @private
  10999. * @param {Array} [array] The array to iterate over.
  11000. * @param {Function} iteratee The function invoked per iteration.
  11001. * @returns {Array} Returns the new mapped array.
  11002. */
  11003. function arrayMap(array, iteratee) {
  11004. var index = -1,
  11005. length = array == null ? 0 : array.length,
  11006. result = Array(length);
  11007. while (++index < length) {
  11008. result[index] = iteratee(array[index], index, array);
  11009. }
  11010. return result;
  11011. }
  11012. /**
  11013. * Appends the elements of `values` to `array`.
  11014. *
  11015. * @private
  11016. * @param {Array} array The array to modify.
  11017. * @param {Array} values The values to append.
  11018. * @returns {Array} Returns `array`.
  11019. */
  11020. function arrayPush(array, values) {
  11021. var index = -1,
  11022. length = values.length,
  11023. offset = array.length;
  11024. while (++index < length) {
  11025. array[offset + index] = values[index];
  11026. }
  11027. return array;
  11028. }
  11029. /**
  11030. * A specialized version of `_.reduce` for arrays without support for
  11031. * iteratee shorthands.
  11032. *
  11033. * @private
  11034. * @param {Array} [array] The array to iterate over.
  11035. * @param {Function} iteratee The function invoked per iteration.
  11036. * @param {*} [accumulator] The initial value.
  11037. * @param {boolean} [initAccum] Specify using the first element of `array` as
  11038. * the initial value.
  11039. * @returns {*} Returns the accumulated value.
  11040. */
  11041. function arrayReduce(array, iteratee, accumulator, initAccum) {
  11042. var index = -1,
  11043. length = array == null ? 0 : array.length;
  11044. if (initAccum && length) {
  11045. accumulator = array[++index];
  11046. }
  11047. while (++index < length) {
  11048. accumulator = iteratee(accumulator, array[index], index, array);
  11049. }
  11050. return accumulator;
  11051. }
  11052. /**
  11053. * A specialized version of `_.reduceRight` for arrays without support for
  11054. * iteratee shorthands.
  11055. *
  11056. * @private
  11057. * @param {Array} [array] The array to iterate over.
  11058. * @param {Function} iteratee The function invoked per iteration.
  11059. * @param {*} [accumulator] The initial value.
  11060. * @param {boolean} [initAccum] Specify using the last element of `array` as
  11061. * the initial value.
  11062. * @returns {*} Returns the accumulated value.
  11063. */
  11064. function arrayReduceRight(array, iteratee, accumulator, initAccum) {
  11065. var length = array == null ? 0 : array.length;
  11066. if (initAccum && length) {
  11067. accumulator = array[--length];
  11068. }
  11069. while (length--) {
  11070. accumulator = iteratee(accumulator, array[length], length, array);
  11071. }
  11072. return accumulator;
  11073. }
  11074. /**
  11075. * A specialized version of `_.some` for arrays without support for iteratee
  11076. * shorthands.
  11077. *
  11078. * @private
  11079. * @param {Array} [array] The array to iterate over.
  11080. * @param {Function} predicate The function invoked per iteration.
  11081. * @returns {boolean} Returns `true` if any element passes the predicate check,
  11082. * else `false`.
  11083. */
  11084. function arraySome(array, predicate) {
  11085. var index = -1,
  11086. length = array == null ? 0 : array.length;
  11087. while (++index < length) {
  11088. if (predicate(array[index], index, array)) {
  11089. return true;
  11090. }
  11091. }
  11092. return false;
  11093. }
  11094. /**
  11095. * Gets the size of an ASCII `string`.
  11096. *
  11097. * @private
  11098. * @param {string} string The string inspect.
  11099. * @returns {number} Returns the string size.
  11100. */
  11101. var asciiSize = baseProperty('length');
  11102. /**
  11103. * Converts an ASCII `string` to an array.
  11104. *
  11105. * @private
  11106. * @param {string} string The string to convert.
  11107. * @returns {Array} Returns the converted array.
  11108. */
  11109. function asciiToArray(string) {
  11110. return string.split('');
  11111. }
  11112. /**
  11113. * Splits an ASCII `string` into an array of its words.
  11114. *
  11115. * @private
  11116. * @param {string} The string to inspect.
  11117. * @returns {Array} Returns the words of `string`.
  11118. */
  11119. function asciiWords(string) {
  11120. return string.match(reAsciiWord) || [];
  11121. }
  11122. /**
  11123. * The base implementation of methods like `_.findKey` and `_.findLastKey`,
  11124. * without support for iteratee shorthands, which iterates over `collection`
  11125. * using `eachFunc`.
  11126. *
  11127. * @private
  11128. * @param {Array|Object} collection The collection to inspect.
  11129. * @param {Function} predicate The function invoked per iteration.
  11130. * @param {Function} eachFunc The function to iterate over `collection`.
  11131. * @returns {*} Returns the found element or its key, else `undefined`.
  11132. */
  11133. function baseFindKey(collection, predicate, eachFunc) {
  11134. var result;
  11135. eachFunc(collection, function(value, key, collection) {
  11136. if (predicate(value, key, collection)) {
  11137. result = key;
  11138. return false;
  11139. }
  11140. });
  11141. return result;
  11142. }
  11143. /**
  11144. * The base implementation of `_.findIndex` and `_.findLastIndex` without
  11145. * support for iteratee shorthands.
  11146. *
  11147. * @private
  11148. * @param {Array} array The array to inspect.
  11149. * @param {Function} predicate The function invoked per iteration.
  11150. * @param {number} fromIndex The index to search from.
  11151. * @param {boolean} [fromRight] Specify iterating from right to left.
  11152. * @returns {number} Returns the index of the matched value, else `-1`.
  11153. */
  11154. function baseFindIndex(array, predicate, fromIndex, fromRight) {
  11155. var length = array.length,
  11156. index = fromIndex + (fromRight ? 1 : -1);
  11157. while ((fromRight ? index-- : ++index < length)) {
  11158. if (predicate(array[index], index, array)) {
  11159. return index;
  11160. }
  11161. }
  11162. return -1;
  11163. }
  11164. /**
  11165. * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
  11166. *
  11167. * @private
  11168. * @param {Array} array The array to inspect.
  11169. * @param {*} value The value to search for.
  11170. * @param {number} fromIndex The index to search from.
  11171. * @returns {number} Returns the index of the matched value, else `-1`.
  11172. */
  11173. function baseIndexOf(array, value, fromIndex) {
  11174. return value === value
  11175. ? strictIndexOf(array, value, fromIndex)
  11176. : baseFindIndex(array, baseIsNaN, fromIndex);
  11177. }
  11178. /**
  11179. * This function is like `baseIndexOf` except that it accepts a comparator.
  11180. *
  11181. * @private
  11182. * @param {Array} array The array to inspect.
  11183. * @param {*} value The value to search for.
  11184. * @param {number} fromIndex The index to search from.
  11185. * @param {Function} comparator The comparator invoked per element.
  11186. * @returns {number} Returns the index of the matched value, else `-1`.
  11187. */
  11188. function baseIndexOfWith(array, value, fromIndex, comparator) {
  11189. var index = fromIndex - 1,
  11190. length = array.length;
  11191. while (++index < length) {
  11192. if (comparator(array[index], value)) {
  11193. return index;
  11194. }
  11195. }
  11196. return -1;
  11197. }
  11198. /**
  11199. * The base implementation of `_.isNaN` without support for number objects.
  11200. *
  11201. * @private
  11202. * @param {*} value The value to check.
  11203. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
  11204. */
  11205. function baseIsNaN(value) {
  11206. return value !== value;
  11207. }
  11208. /**
  11209. * The base implementation of `_.mean` and `_.meanBy` without support for
  11210. * iteratee shorthands.
  11211. *
  11212. * @private
  11213. * @param {Array} array The array to iterate over.
  11214. * @param {Function} iteratee The function invoked per iteration.
  11215. * @returns {number} Returns the mean.
  11216. */
  11217. function baseMean(array, iteratee) {
  11218. var length = array == null ? 0 : array.length;
  11219. return length ? (baseSum(array, iteratee) / length) : NAN;
  11220. }
  11221. /**
  11222. * The base implementation of `_.property` without support for deep paths.
  11223. *
  11224. * @private
  11225. * @param {string} key The key of the property to get.
  11226. * @returns {Function} Returns the new accessor function.
  11227. */
  11228. function baseProperty(key) {
  11229. return function(object) {
  11230. return object == null ? undefined : object[key];
  11231. };
  11232. }
  11233. /**
  11234. * The base implementation of `_.propertyOf` without support for deep paths.
  11235. *
  11236. * @private
  11237. * @param {Object} object The object to query.
  11238. * @returns {Function} Returns the new accessor function.
  11239. */
  11240. function basePropertyOf(object) {
  11241. return function(key) {
  11242. return object == null ? undefined : object[key];
  11243. };
  11244. }
  11245. /**
  11246. * The base implementation of `_.reduce` and `_.reduceRight`, without support
  11247. * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
  11248. *
  11249. * @private
  11250. * @param {Array|Object} collection The collection to iterate over.
  11251. * @param {Function} iteratee The function invoked per iteration.
  11252. * @param {*} accumulator The initial value.
  11253. * @param {boolean} initAccum Specify using the first or last element of
  11254. * `collection` as the initial value.
  11255. * @param {Function} eachFunc The function to iterate over `collection`.
  11256. * @returns {*} Returns the accumulated value.
  11257. */
  11258. function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
  11259. eachFunc(collection, function(value, index, collection) {
  11260. accumulator = initAccum
  11261. ? (initAccum = false, value)
  11262. : iteratee(accumulator, value, index, collection);
  11263. });
  11264. return accumulator;
  11265. }
  11266. /**
  11267. * The base implementation of `_.sortBy` which uses `comparer` to define the
  11268. * sort order of `array` and replaces criteria objects with their corresponding
  11269. * values.
  11270. *
  11271. * @private
  11272. * @param {Array} array The array to sort.
  11273. * @param {Function} comparer The function to define sort order.
  11274. * @returns {Array} Returns `array`.
  11275. */
  11276. function baseSortBy(array, comparer) {
  11277. var length = array.length;
  11278. array.sort(comparer);
  11279. while (length--) {
  11280. array[length] = array[length].value;
  11281. }
  11282. return array;
  11283. }
  11284. /**
  11285. * The base implementation of `_.sum` and `_.sumBy` without support for
  11286. * iteratee shorthands.
  11287. *
  11288. * @private
  11289. * @param {Array} array The array to iterate over.
  11290. * @param {Function} iteratee The function invoked per iteration.
  11291. * @returns {number} Returns the sum.
  11292. */
  11293. function baseSum(array, iteratee) {
  11294. var result,
  11295. index = -1,
  11296. length = array.length;
  11297. while (++index < length) {
  11298. var current = iteratee(array[index]);
  11299. if (current !== undefined) {
  11300. result = result === undefined ? current : (result + current);
  11301. }
  11302. }
  11303. return result;
  11304. }
  11305. /**
  11306. * The base implementation of `_.times` without support for iteratee shorthands
  11307. * or max array length checks.
  11308. *
  11309. * @private
  11310. * @param {number} n The number of times to invoke `iteratee`.
  11311. * @param {Function} iteratee The function invoked per iteration.
  11312. * @returns {Array} Returns the array of results.
  11313. */
  11314. function baseTimes(n, iteratee) {
  11315. var index = -1,
  11316. result = Array(n);
  11317. while (++index < n) {
  11318. result[index] = iteratee(index);
  11319. }
  11320. return result;
  11321. }
  11322. /**
  11323. * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
  11324. * of key-value pairs for `object` corresponding to the property names of `props`.
  11325. *
  11326. * @private
  11327. * @param {Object} object The object to query.
  11328. * @param {Array} props The property names to get values for.
  11329. * @returns {Object} Returns the key-value pairs.
  11330. */
  11331. function baseToPairs(object, props) {
  11332. return arrayMap(props, function(key) {
  11333. return [key, object[key]];
  11334. });
  11335. }
  11336. /**
  11337. * The base implementation of `_.unary` without support for storing metadata.
  11338. *
  11339. * @private
  11340. * @param {Function} func The function to cap arguments for.
  11341. * @returns {Function} Returns the new capped function.
  11342. */
  11343. function baseUnary(func) {
  11344. return function(value) {
  11345. return func(value);
  11346. };
  11347. }
  11348. /**
  11349. * The base implementation of `_.values` and `_.valuesIn` which creates an
  11350. * array of `object` property values corresponding to the property names
  11351. * of `props`.
  11352. *
  11353. * @private
  11354. * @param {Object} object The object to query.
  11355. * @param {Array} props The property names to get values for.
  11356. * @returns {Object} Returns the array of property values.
  11357. */
  11358. function baseValues(object, props) {
  11359. return arrayMap(props, function(key) {
  11360. return object[key];
  11361. });
  11362. }
  11363. /**
  11364. * Checks if a `cache` value for `key` exists.
  11365. *
  11366. * @private
  11367. * @param {Object} cache The cache to query.
  11368. * @param {string} key The key of the entry to check.
  11369. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  11370. */
  11371. function cacheHas(cache, key) {
  11372. return cache.has(key);
  11373. }
  11374. /**
  11375. * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
  11376. * that is not found in the character symbols.
  11377. *
  11378. * @private
  11379. * @param {Array} strSymbols The string symbols to inspect.
  11380. * @param {Array} chrSymbols The character symbols to find.
  11381. * @returns {number} Returns the index of the first unmatched string symbol.
  11382. */
  11383. function charsStartIndex(strSymbols, chrSymbols) {
  11384. var index = -1,
  11385. length = strSymbols.length;
  11386. while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
  11387. return index;
  11388. }
  11389. /**
  11390. * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
  11391. * that is not found in the character symbols.
  11392. *
  11393. * @private
  11394. * @param {Array} strSymbols The string symbols to inspect.
  11395. * @param {Array} chrSymbols The character symbols to find.
  11396. * @returns {number} Returns the index of the last unmatched string symbol.
  11397. */
  11398. function charsEndIndex(strSymbols, chrSymbols) {
  11399. var index = strSymbols.length;
  11400. while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
  11401. return index;
  11402. }
  11403. /**
  11404. * Gets the number of `placeholder` occurrences in `array`.
  11405. *
  11406. * @private
  11407. * @param {Array} array The array to inspect.
  11408. * @param {*} placeholder The placeholder to search for.
  11409. * @returns {number} Returns the placeholder count.
  11410. */
  11411. function countHolders(array, placeholder) {
  11412. var length = array.length,
  11413. result = 0;
  11414. while (length--) {
  11415. if (array[length] === placeholder) {
  11416. ++result;
  11417. }
  11418. }
  11419. return result;
  11420. }
  11421. /**
  11422. * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
  11423. * letters to basic Latin letters.
  11424. *
  11425. * @private
  11426. * @param {string} letter The matched letter to deburr.
  11427. * @returns {string} Returns the deburred letter.
  11428. */
  11429. var deburrLetter = basePropertyOf(deburredLetters);
  11430. /**
  11431. * Used by `_.escape` to convert characters to HTML entities.
  11432. *
  11433. * @private
  11434. * @param {string} chr The matched character to escape.
  11435. * @returns {string} Returns the escaped character.
  11436. */
  11437. var escapeHtmlChar = basePropertyOf(htmlEscapes);
  11438. /**
  11439. * Used by `_.template` to escape characters for inclusion in compiled string literals.
  11440. *
  11441. * @private
  11442. * @param {string} chr The matched character to escape.
  11443. * @returns {string} Returns the escaped character.
  11444. */
  11445. function escapeStringChar(chr) {
  11446. return '\\' + stringEscapes[chr];
  11447. }
  11448. /**
  11449. * Gets the value at `key` of `object`.
  11450. *
  11451. * @private
  11452. * @param {Object} [object] The object to query.
  11453. * @param {string} key The key of the property to get.
  11454. * @returns {*} Returns the property value.
  11455. */
  11456. function getValue(object, key) {
  11457. return object == null ? undefined : object[key];
  11458. }
  11459. /**
  11460. * Checks if `string` contains Unicode symbols.
  11461. *
  11462. * @private
  11463. * @param {string} string The string to inspect.
  11464. * @returns {boolean} Returns `true` if a symbol is found, else `false`.
  11465. */
  11466. function hasUnicode(string) {
  11467. return reHasUnicode.test(string);
  11468. }
  11469. /**
  11470. * Checks if `string` contains a word composed of Unicode symbols.
  11471. *
  11472. * @private
  11473. * @param {string} string The string to inspect.
  11474. * @returns {boolean} Returns `true` if a word is found, else `false`.
  11475. */
  11476. function hasUnicodeWord(string) {
  11477. return reHasUnicodeWord.test(string);
  11478. }
  11479. /**
  11480. * Converts `iterator` to an array.
  11481. *
  11482. * @private
  11483. * @param {Object} iterator The iterator to convert.
  11484. * @returns {Array} Returns the converted array.
  11485. */
  11486. function iteratorToArray(iterator) {
  11487. var data,
  11488. result = [];
  11489. while (!(data = iterator.next()).done) {
  11490. result.push(data.value);
  11491. }
  11492. return result;
  11493. }
  11494. /**
  11495. * Converts `map` to its key-value pairs.
  11496. *
  11497. * @private
  11498. * @param {Object} map The map to convert.
  11499. * @returns {Array} Returns the key-value pairs.
  11500. */
  11501. function mapToArray(map) {
  11502. var index = -1,
  11503. result = Array(map.size);
  11504. map.forEach(function(value, key) {
  11505. result[++index] = [key, value];
  11506. });
  11507. return result;
  11508. }
  11509. /**
  11510. * Creates a unary function that invokes `func` with its argument transformed.
  11511. *
  11512. * @private
  11513. * @param {Function} func The function to wrap.
  11514. * @param {Function} transform The argument transform.
  11515. * @returns {Function} Returns the new function.
  11516. */
  11517. function overArg(func, transform) {
  11518. return function(arg) {
  11519. return func(transform(arg));
  11520. };
  11521. }
  11522. /**
  11523. * Replaces all `placeholder` elements in `array` with an internal placeholder
  11524. * and returns an array of their indexes.
  11525. *
  11526. * @private
  11527. * @param {Array} array The array to modify.
  11528. * @param {*} placeholder The placeholder to replace.
  11529. * @returns {Array} Returns the new array of placeholder indexes.
  11530. */
  11531. function replaceHolders(array, placeholder) {
  11532. var index = -1,
  11533. length = array.length,
  11534. resIndex = 0,
  11535. result = [];
  11536. while (++index < length) {
  11537. var value = array[index];
  11538. if (value === placeholder || value === PLACEHOLDER) {
  11539. array[index] = PLACEHOLDER;
  11540. result[resIndex++] = index;
  11541. }
  11542. }
  11543. return result;
  11544. }
  11545. /**
  11546. * Converts `set` to an array of its values.
  11547. *
  11548. * @private
  11549. * @param {Object} set The set to convert.
  11550. * @returns {Array} Returns the values.
  11551. */
  11552. function setToArray(set) {
  11553. var index = -1,
  11554. result = Array(set.size);
  11555. set.forEach(function(value) {
  11556. result[++index] = value;
  11557. });
  11558. return result;
  11559. }
  11560. /**
  11561. * Converts `set` to its value-value pairs.
  11562. *
  11563. * @private
  11564. * @param {Object} set The set to convert.
  11565. * @returns {Array} Returns the value-value pairs.
  11566. */
  11567. function setToPairs(set) {
  11568. var index = -1,
  11569. result = Array(set.size);
  11570. set.forEach(function(value) {
  11571. result[++index] = [value, value];
  11572. });
  11573. return result;
  11574. }
  11575. /**
  11576. * A specialized version of `_.indexOf` which performs strict equality
  11577. * comparisons of values, i.e. `===`.
  11578. *
  11579. * @private
  11580. * @param {Array} array The array to inspect.
  11581. * @param {*} value The value to search for.
  11582. * @param {number} fromIndex The index to search from.
  11583. * @returns {number} Returns the index of the matched value, else `-1`.
  11584. */
  11585. function strictIndexOf(array, value, fromIndex) {
  11586. var index = fromIndex - 1,
  11587. length = array.length;
  11588. while (++index < length) {
  11589. if (array[index] === value) {
  11590. return index;
  11591. }
  11592. }
  11593. return -1;
  11594. }
  11595. /**
  11596. * A specialized version of `_.lastIndexOf` which performs strict equality
  11597. * comparisons of values, i.e. `===`.
  11598. *
  11599. * @private
  11600. * @param {Array} array The array to inspect.
  11601. * @param {*} value The value to search for.
  11602. * @param {number} fromIndex The index to search from.
  11603. * @returns {number} Returns the index of the matched value, else `-1`.
  11604. */
  11605. function strictLastIndexOf(array, value, fromIndex) {
  11606. var index = fromIndex + 1;
  11607. while (index--) {
  11608. if (array[index] === value) {
  11609. return index;
  11610. }
  11611. }
  11612. return index;
  11613. }
  11614. /**
  11615. * Gets the number of symbols in `string`.
  11616. *
  11617. * @private
  11618. * @param {string} string The string to inspect.
  11619. * @returns {number} Returns the string size.
  11620. */
  11621. function stringSize(string) {
  11622. return hasUnicode(string)
  11623. ? unicodeSize(string)
  11624. : asciiSize(string);
  11625. }
  11626. /**
  11627. * Converts `string` to an array.
  11628. *
  11629. * @private
  11630. * @param {string} string The string to convert.
  11631. * @returns {Array} Returns the converted array.
  11632. */
  11633. function stringToArray(string) {
  11634. return hasUnicode(string)
  11635. ? unicodeToArray(string)
  11636. : asciiToArray(string);
  11637. }
  11638. /**
  11639. * Used by `_.unescape` to convert HTML entities to characters.
  11640. *
  11641. * @private
  11642. * @param {string} chr The matched character to unescape.
  11643. * @returns {string} Returns the unescaped character.
  11644. */
  11645. var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
  11646. /**
  11647. * Gets the size of a Unicode `string`.
  11648. *
  11649. * @private
  11650. * @param {string} string The string inspect.
  11651. * @returns {number} Returns the string size.
  11652. */
  11653. function unicodeSize(string) {
  11654. var result = reUnicode.lastIndex = 0;
  11655. while (reUnicode.test(string)) {
  11656. ++result;
  11657. }
  11658. return result;
  11659. }
  11660. /**
  11661. * Converts a Unicode `string` to an array.
  11662. *
  11663. * @private
  11664. * @param {string} string The string to convert.
  11665. * @returns {Array} Returns the converted array.
  11666. */
  11667. function unicodeToArray(string) {
  11668. return string.match(reUnicode) || [];
  11669. }
  11670. /**
  11671. * Splits a Unicode `string` into an array of its words.
  11672. *
  11673. * @private
  11674. * @param {string} The string to inspect.
  11675. * @returns {Array} Returns the words of `string`.
  11676. */
  11677. function unicodeWords(string) {
  11678. return string.match(reUnicodeWord) || [];
  11679. }
  11680. /*--------------------------------------------------------------------------*/
  11681. /**
  11682. * Create a new pristine `lodash` function using the `context` object.
  11683. *
  11684. * @static
  11685. * @memberOf _
  11686. * @since 1.1.0
  11687. * @category Util
  11688. * @param {Object} [context=root] The context object.
  11689. * @returns {Function} Returns a new `lodash` function.
  11690. * @example
  11691. *
  11692. * _.mixin({ 'foo': _.constant('foo') });
  11693. *
  11694. * var lodash = _.runInContext();
  11695. * lodash.mixin({ 'bar': lodash.constant('bar') });
  11696. *
  11697. * _.isFunction(_.foo);
  11698. * // => true
  11699. * _.isFunction(_.bar);
  11700. * // => false
  11701. *
  11702. * lodash.isFunction(lodash.foo);
  11703. * // => false
  11704. * lodash.isFunction(lodash.bar);
  11705. * // => true
  11706. *
  11707. * // Create a suped-up `defer` in Node.js.
  11708. * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
  11709. */
  11710. var runInContext = (function runInContext(context) {
  11711. context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
  11712. /** Built-in constructor references. */
  11713. var Array = context.Array,
  11714. Date = context.Date,
  11715. Error = context.Error,
  11716. Function = context.Function,
  11717. Math = context.Math,
  11718. Object = context.Object,
  11719. RegExp = context.RegExp,
  11720. String = context.String,
  11721. TypeError = context.TypeError;
  11722. /** Used for built-in method references. */
  11723. var arrayProto = Array.prototype,
  11724. funcProto = Function.prototype,
  11725. objectProto = Object.prototype;
  11726. /** Used to detect overreaching core-js shims. */
  11727. var coreJsData = context['__core-js_shared__'];
  11728. /** Used to resolve the decompiled source of functions. */
  11729. var funcToString = funcProto.toString;
  11730. /** Used to check objects for own properties. */
  11731. var hasOwnProperty = objectProto.hasOwnProperty;
  11732. /** Used to generate unique IDs. */
  11733. var idCounter = 0;
  11734. /** Used to detect methods masquerading as native. */
  11735. var maskSrcKey = (function() {
  11736. var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  11737. return uid ? ('Symbol(src)_1.' + uid) : '';
  11738. }());
  11739. /**
  11740. * Used to resolve the
  11741. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  11742. * of values.
  11743. */
  11744. var nativeObjectToString = objectProto.toString;
  11745. /** Used to infer the `Object` constructor. */
  11746. var objectCtorString = funcToString.call(Object);
  11747. /** Used to restore the original `_` reference in `_.noConflict`. */
  11748. var oldDash = root._;
  11749. /** Used to detect if a method is native. */
  11750. var reIsNative = RegExp('^' +
  11751. funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  11752. .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  11753. );
  11754. /** Built-in value references. */
  11755. var Buffer = moduleExports ? context.Buffer : undefined,
  11756. Symbol = context.Symbol,
  11757. Uint8Array = context.Uint8Array,
  11758. allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
  11759. getPrototype = overArg(Object.getPrototypeOf, Object),
  11760. objectCreate = Object.create,
  11761. propertyIsEnumerable = objectProto.propertyIsEnumerable,
  11762. splice = arrayProto.splice,
  11763. spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
  11764. symIterator = Symbol ? Symbol.iterator : undefined,
  11765. symToStringTag = Symbol ? Symbol.toStringTag : undefined;
  11766. var defineProperty = (function() {
  11767. try {
  11768. var func = getNative(Object, 'defineProperty');
  11769. func({}, '', {});
  11770. return func;
  11771. } catch (e) {}
  11772. }());
  11773. /** Mocked built-ins. */
  11774. var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
  11775. ctxNow = Date && Date.now !== root.Date.now && Date.now,
  11776. ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
  11777. /* Built-in method references for those with the same name as other `lodash` methods. */
  11778. var nativeCeil = Math.ceil,
  11779. nativeFloor = Math.floor,
  11780. nativeGetSymbols = Object.getOwnPropertySymbols,
  11781. nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
  11782. nativeIsFinite = context.isFinite,
  11783. nativeJoin = arrayProto.join,
  11784. nativeKeys = overArg(Object.keys, Object),
  11785. nativeMax = Math.max,
  11786. nativeMin = Math.min,
  11787. nativeNow = Date.now,
  11788. nativeParseInt = context.parseInt,
  11789. nativeRandom = Math.random,
  11790. nativeReverse = arrayProto.reverse;
  11791. /* Built-in method references that are verified to be native. */
  11792. var DataView = getNative(context, 'DataView'),
  11793. Map = getNative(context, 'Map'),
  11794. Promise = getNative(context, 'Promise'),
  11795. Set = getNative(context, 'Set'),
  11796. WeakMap = getNative(context, 'WeakMap'),
  11797. nativeCreate = getNative(Object, 'create');
  11798. /** Used to store function metadata. */
  11799. var metaMap = WeakMap && new WeakMap;
  11800. /** Used to lookup unminified function names. */
  11801. var realNames = {};
  11802. /** Used to detect maps, sets, and weakmaps. */
  11803. var dataViewCtorString = toSource(DataView),
  11804. mapCtorString = toSource(Map),
  11805. promiseCtorString = toSource(Promise),
  11806. setCtorString = toSource(Set),
  11807. weakMapCtorString = toSource(WeakMap);
  11808. /** Used to convert symbols to primitives and strings. */
  11809. var symbolProto = Symbol ? Symbol.prototype : undefined,
  11810. symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
  11811. symbolToString = symbolProto ? symbolProto.toString : undefined;
  11812. /*------------------------------------------------------------------------*/
  11813. /**
  11814. * Creates a `lodash` object which wraps `value` to enable implicit method
  11815. * chain sequences. Methods that operate on and return arrays, collections,
  11816. * and functions can be chained together. Methods that retrieve a single value
  11817. * or may return a primitive value will automatically end the chain sequence
  11818. * and return the unwrapped value. Otherwise, the value must be unwrapped
  11819. * with `_#value`.
  11820. *
  11821. * Explicit chain sequences, which must be unwrapped with `_#value`, may be
  11822. * enabled using `_.chain`.
  11823. *
  11824. * The execution of chained methods is lazy, that is, it's deferred until
  11825. * `_#value` is implicitly or explicitly called.
  11826. *
  11827. * Lazy evaluation allows several methods to support shortcut fusion.
  11828. * Shortcut fusion is an optimization to merge iteratee calls; this avoids
  11829. * the creation of intermediate arrays and can greatly reduce the number of
  11830. * iteratee executions. Sections of a chain sequence qualify for shortcut
  11831. * fusion if the section is applied to an array and iteratees accept only
  11832. * one argument. The heuristic for whether a section qualifies for shortcut
  11833. * fusion is subject to change.
  11834. *
  11835. * Chaining is supported in custom builds as long as the `_#value` method is
  11836. * directly or indirectly included in the build.
  11837. *
  11838. * In addition to lodash methods, wrappers have `Array` and `String` methods.
  11839. *
  11840. * The wrapper `Array` methods are:
  11841. * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
  11842. *
  11843. * The wrapper `String` methods are:
  11844. * `replace` and `split`
  11845. *
  11846. * The wrapper methods that support shortcut fusion are:
  11847. * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
  11848. * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
  11849. * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
  11850. *
  11851. * The chainable wrapper methods are:
  11852. * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
  11853. * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
  11854. * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
  11855. * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
  11856. * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
  11857. * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
  11858. * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
  11859. * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
  11860. * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
  11861. * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
  11862. * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
  11863. * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
  11864. * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
  11865. * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
  11866. * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
  11867. * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
  11868. * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
  11869. * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
  11870. * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
  11871. * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
  11872. * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
  11873. * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
  11874. * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
  11875. * `zipObject`, `zipObjectDeep`, and `zipWith`
  11876. *
  11877. * The wrapper methods that are **not** chainable by default are:
  11878. * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
  11879. * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
  11880. * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
  11881. * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
  11882. * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
  11883. * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
  11884. * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
  11885. * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
  11886. * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
  11887. * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
  11888. * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
  11889. * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
  11890. * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
  11891. * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
  11892. * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
  11893. * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
  11894. * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
  11895. * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
  11896. * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
  11897. * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
  11898. * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
  11899. * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
  11900. * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
  11901. * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
  11902. * `upperFirst`, `value`, and `words`
  11903. *
  11904. * @name _
  11905. * @constructor
  11906. * @category Seq
  11907. * @param {*} value The value to wrap in a `lodash` instance.
  11908. * @returns {Object} Returns the new `lodash` wrapper instance.
  11909. * @example
  11910. *
  11911. * function square(n) {
  11912. * return n * n;
  11913. * }
  11914. *
  11915. * var wrapped = _([1, 2, 3]);
  11916. *
  11917. * // Returns an unwrapped value.
  11918. * wrapped.reduce(_.add);
  11919. * // => 6
  11920. *
  11921. * // Returns a wrapped value.
  11922. * var squares = wrapped.map(square);
  11923. *
  11924. * _.isArray(squares);
  11925. * // => false
  11926. *
  11927. * _.isArray(squares.value());
  11928. * // => true
  11929. */
  11930. function lodash(value) {
  11931. if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
  11932. if (value instanceof LodashWrapper) {
  11933. return value;
  11934. }
  11935. if (hasOwnProperty.call(value, '__wrapped__')) {
  11936. return wrapperClone(value);
  11937. }
  11938. }
  11939. return new LodashWrapper(value);
  11940. }
  11941. /**
  11942. * The base implementation of `_.create` without support for assigning
  11943. * properties to the created object.
  11944. *
  11945. * @private
  11946. * @param {Object} proto The object to inherit from.
  11947. * @returns {Object} Returns the new object.
  11948. */
  11949. var baseCreate = (function() {
  11950. function object() {}
  11951. return function(proto) {
  11952. if (!isObject(proto)) {
  11953. return {};
  11954. }
  11955. if (objectCreate) {
  11956. return objectCreate(proto);
  11957. }
  11958. object.prototype = proto;
  11959. var result = new object;
  11960. object.prototype = undefined;
  11961. return result;
  11962. };
  11963. }());
  11964. /**
  11965. * The function whose prototype chain sequence wrappers inherit from.
  11966. *
  11967. * @private
  11968. */
  11969. function baseLodash() {
  11970. // No operation performed.
  11971. }
  11972. /**
  11973. * The base constructor for creating `lodash` wrapper objects.
  11974. *
  11975. * @private
  11976. * @param {*} value The value to wrap.
  11977. * @param {boolean} [chainAll] Enable explicit method chain sequences.
  11978. */
  11979. function LodashWrapper(value, chainAll) {
  11980. this.__wrapped__ = value;
  11981. this.__actions__ = [];
  11982. this.__chain__ = !!chainAll;
  11983. this.__index__ = 0;
  11984. this.__values__ = undefined;
  11985. }
  11986. /**
  11987. * By default, the template delimiters used by lodash are like those in
  11988. * embedded Ruby (ERB) as well as ES2015 template strings. Change the
  11989. * following template settings to use alternative delimiters.
  11990. *
  11991. * @static
  11992. * @memberOf _
  11993. * @type {Object}
  11994. */
  11995. lodash.templateSettings = {
  11996. /**
  11997. * Used to detect `data` property values to be HTML-escaped.
  11998. *
  11999. * @memberOf _.templateSettings
  12000. * @type {RegExp}
  12001. */
  12002. 'escape': reEscape,
  12003. /**
  12004. * Used to detect code to be evaluated.
  12005. *
  12006. * @memberOf _.templateSettings
  12007. * @type {RegExp}
  12008. */
  12009. 'evaluate': reEvaluate,
  12010. /**
  12011. * Used to detect `data` property values to inject.
  12012. *
  12013. * @memberOf _.templateSettings
  12014. * @type {RegExp}
  12015. */
  12016. 'interpolate': reInterpolate,
  12017. /**
  12018. * Used to reference the data object in the template text.
  12019. *
  12020. * @memberOf _.templateSettings
  12021. * @type {string}
  12022. */
  12023. 'variable': '',
  12024. /**
  12025. * Used to import variables into the compiled template.
  12026. *
  12027. * @memberOf _.templateSettings
  12028. * @type {Object}
  12029. */
  12030. 'imports': {
  12031. /**
  12032. * A reference to the `lodash` function.
  12033. *
  12034. * @memberOf _.templateSettings.imports
  12035. * @type {Function}
  12036. */
  12037. '_': lodash
  12038. }
  12039. };
  12040. // Ensure wrappers are instances of `baseLodash`.
  12041. lodash.prototype = baseLodash.prototype;
  12042. lodash.prototype.constructor = lodash;
  12043. LodashWrapper.prototype = baseCreate(baseLodash.prototype);
  12044. LodashWrapper.prototype.constructor = LodashWrapper;
  12045. /*------------------------------------------------------------------------*/
  12046. /**
  12047. * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
  12048. *
  12049. * @private
  12050. * @constructor
  12051. * @param {*} value The value to wrap.
  12052. */
  12053. function LazyWrapper(value) {
  12054. this.__wrapped__ = value;
  12055. this.__actions__ = [];
  12056. this.__dir__ = 1;
  12057. this.__filtered__ = false;
  12058. this.__iteratees__ = [];
  12059. this.__takeCount__ = MAX_ARRAY_LENGTH;
  12060. this.__views__ = [];
  12061. }
  12062. /**
  12063. * Creates a clone of the lazy wrapper object.
  12064. *
  12065. * @private
  12066. * @name clone
  12067. * @memberOf LazyWrapper
  12068. * @returns {Object} Returns the cloned `LazyWrapper` object.
  12069. */
  12070. function lazyClone() {
  12071. var result = new LazyWrapper(this.__wrapped__);
  12072. result.__actions__ = copyArray(this.__actions__);
  12073. result.__dir__ = this.__dir__;
  12074. result.__filtered__ = this.__filtered__;
  12075. result.__iteratees__ = copyArray(this.__iteratees__);
  12076. result.__takeCount__ = this.__takeCount__;
  12077. result.__views__ = copyArray(this.__views__);
  12078. return result;
  12079. }
  12080. /**
  12081. * Reverses the direction of lazy iteration.
  12082. *
  12083. * @private
  12084. * @name reverse
  12085. * @memberOf LazyWrapper
  12086. * @returns {Object} Returns the new reversed `LazyWrapper` object.
  12087. */
  12088. function lazyReverse() {
  12089. if (this.__filtered__) {
  12090. var result = new LazyWrapper(this);
  12091. result.__dir__ = -1;
  12092. result.__filtered__ = true;
  12093. } else {
  12094. result = this.clone();
  12095. result.__dir__ *= -1;
  12096. }
  12097. return result;
  12098. }
  12099. /**
  12100. * Extracts the unwrapped value from its lazy wrapper.
  12101. *
  12102. * @private
  12103. * @name value
  12104. * @memberOf LazyWrapper
  12105. * @returns {*} Returns the unwrapped value.
  12106. */
  12107. function lazyValue() {
  12108. var array = this.__wrapped__.value(),
  12109. dir = this.__dir__,
  12110. isArr = isArray(array),
  12111. isRight = dir < 0,
  12112. arrLength = isArr ? array.length : 0,
  12113. view = getView(0, arrLength, this.__views__),
  12114. start = view.start,
  12115. end = view.end,
  12116. length = end - start,
  12117. index = isRight ? end : (start - 1),
  12118. iteratees = this.__iteratees__,
  12119. iterLength = iteratees.length,
  12120. resIndex = 0,
  12121. takeCount = nativeMin(length, this.__takeCount__);
  12122. if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
  12123. return baseWrapperValue(array, this.__actions__);
  12124. }
  12125. var result = [];
  12126. outer:
  12127. while (length-- && resIndex < takeCount) {
  12128. index += dir;
  12129. var iterIndex = -1,
  12130. value = array[index];
  12131. while (++iterIndex < iterLength) {
  12132. var data = iteratees[iterIndex],
  12133. iteratee = data.iteratee,
  12134. type = data.type,
  12135. computed = iteratee(value);
  12136. if (type == LAZY_MAP_FLAG) {
  12137. value = computed;
  12138. } else if (!computed) {
  12139. if (type == LAZY_FILTER_FLAG) {
  12140. continue outer;
  12141. } else {
  12142. break outer;
  12143. }
  12144. }
  12145. }
  12146. result[resIndex++] = value;
  12147. }
  12148. return result;
  12149. }
  12150. // Ensure `LazyWrapper` is an instance of `baseLodash`.
  12151. LazyWrapper.prototype = baseCreate(baseLodash.prototype);
  12152. LazyWrapper.prototype.constructor = LazyWrapper;
  12153. /*------------------------------------------------------------------------*/
  12154. /**
  12155. * Creates a hash object.
  12156. *
  12157. * @private
  12158. * @constructor
  12159. * @param {Array} [entries] The key-value pairs to cache.
  12160. */
  12161. function Hash(entries) {
  12162. var index = -1,
  12163. length = entries == null ? 0 : entries.length;
  12164. this.clear();
  12165. while (++index < length) {
  12166. var entry = entries[index];
  12167. this.set(entry[0], entry[1]);
  12168. }
  12169. }
  12170. /**
  12171. * Removes all key-value entries from the hash.
  12172. *
  12173. * @private
  12174. * @name clear
  12175. * @memberOf Hash
  12176. */
  12177. function hashClear() {
  12178. this.__data__ = nativeCreate ? nativeCreate(null) : {};
  12179. this.size = 0;
  12180. }
  12181. /**
  12182. * Removes `key` and its value from the hash.
  12183. *
  12184. * @private
  12185. * @name delete
  12186. * @memberOf Hash
  12187. * @param {Object} hash The hash to modify.
  12188. * @param {string} key The key of the value to remove.
  12189. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  12190. */
  12191. function hashDelete(key) {
  12192. var result = this.has(key) && delete this.__data__[key];
  12193. this.size -= result ? 1 : 0;
  12194. return result;
  12195. }
  12196. /**
  12197. * Gets the hash value for `key`.
  12198. *
  12199. * @private
  12200. * @name get
  12201. * @memberOf Hash
  12202. * @param {string} key The key of the value to get.
  12203. * @returns {*} Returns the entry value.
  12204. */
  12205. function hashGet(key) {
  12206. var data = this.__data__;
  12207. if (nativeCreate) {
  12208. var result = data[key];
  12209. return result === HASH_UNDEFINED ? undefined : result;
  12210. }
  12211. return hasOwnProperty.call(data, key) ? data[key] : undefined;
  12212. }
  12213. /**
  12214. * Checks if a hash value for `key` exists.
  12215. *
  12216. * @private
  12217. * @name has
  12218. * @memberOf Hash
  12219. * @param {string} key The key of the entry to check.
  12220. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  12221. */
  12222. function hashHas(key) {
  12223. var data = this.__data__;
  12224. return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
  12225. }
  12226. /**
  12227. * Sets the hash `key` to `value`.
  12228. *
  12229. * @private
  12230. * @name set
  12231. * @memberOf Hash
  12232. * @param {string} key The key of the value to set.
  12233. * @param {*} value The value to set.
  12234. * @returns {Object} Returns the hash instance.
  12235. */
  12236. function hashSet(key, value) {
  12237. var data = this.__data__;
  12238. this.size += this.has(key) ? 0 : 1;
  12239. data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  12240. return this;
  12241. }
  12242. // Add methods to `Hash`.
  12243. Hash.prototype.clear = hashClear;
  12244. Hash.prototype['delete'] = hashDelete;
  12245. Hash.prototype.get = hashGet;
  12246. Hash.prototype.has = hashHas;
  12247. Hash.prototype.set = hashSet;
  12248. /*------------------------------------------------------------------------*/
  12249. /**
  12250. * Creates an list cache object.
  12251. *
  12252. * @private
  12253. * @constructor
  12254. * @param {Array} [entries] The key-value pairs to cache.
  12255. */
  12256. function ListCache(entries) {
  12257. var index = -1,
  12258. length = entries == null ? 0 : entries.length;
  12259. this.clear();
  12260. while (++index < length) {
  12261. var entry = entries[index];
  12262. this.set(entry[0], entry[1]);
  12263. }
  12264. }
  12265. /**
  12266. * Removes all key-value entries from the list cache.
  12267. *
  12268. * @private
  12269. * @name clear
  12270. * @memberOf ListCache
  12271. */
  12272. function listCacheClear() {
  12273. this.__data__ = [];
  12274. this.size = 0;
  12275. }
  12276. /**
  12277. * Removes `key` and its value from the list cache.
  12278. *
  12279. * @private
  12280. * @name delete
  12281. * @memberOf ListCache
  12282. * @param {string} key The key of the value to remove.
  12283. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  12284. */
  12285. function listCacheDelete(key) {
  12286. var data = this.__data__,
  12287. index = assocIndexOf(data, key);
  12288. if (index < 0) {
  12289. return false;
  12290. }
  12291. var lastIndex = data.length - 1;
  12292. if (index == lastIndex) {
  12293. data.pop();
  12294. } else {
  12295. splice.call(data, index, 1);
  12296. }
  12297. --this.size;
  12298. return true;
  12299. }
  12300. /**
  12301. * Gets the list cache value for `key`.
  12302. *
  12303. * @private
  12304. * @name get
  12305. * @memberOf ListCache
  12306. * @param {string} key The key of the value to get.
  12307. * @returns {*} Returns the entry value.
  12308. */
  12309. function listCacheGet(key) {
  12310. var data = this.__data__,
  12311. index = assocIndexOf(data, key);
  12312. return index < 0 ? undefined : data[index][1];
  12313. }
  12314. /**
  12315. * Checks if a list cache value for `key` exists.
  12316. *
  12317. * @private
  12318. * @name has
  12319. * @memberOf ListCache
  12320. * @param {string} key The key of the entry to check.
  12321. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  12322. */
  12323. function listCacheHas(key) {
  12324. return assocIndexOf(this.__data__, key) > -1;
  12325. }
  12326. /**
  12327. * Sets the list cache `key` to `value`.
  12328. *
  12329. * @private
  12330. * @name set
  12331. * @memberOf ListCache
  12332. * @param {string} key The key of the value to set.
  12333. * @param {*} value The value to set.
  12334. * @returns {Object} Returns the list cache instance.
  12335. */
  12336. function listCacheSet(key, value) {
  12337. var data = this.__data__,
  12338. index = assocIndexOf(data, key);
  12339. if (index < 0) {
  12340. ++this.size;
  12341. data.push([key, value]);
  12342. } else {
  12343. data[index][1] = value;
  12344. }
  12345. return this;
  12346. }
  12347. // Add methods to `ListCache`.
  12348. ListCache.prototype.clear = listCacheClear;
  12349. ListCache.prototype['delete'] = listCacheDelete;
  12350. ListCache.prototype.get = listCacheGet;
  12351. ListCache.prototype.has = listCacheHas;
  12352. ListCache.prototype.set = listCacheSet;
  12353. /*------------------------------------------------------------------------*/
  12354. /**
  12355. * Creates a map cache object to store key-value pairs.
  12356. *
  12357. * @private
  12358. * @constructor
  12359. * @param {Array} [entries] The key-value pairs to cache.
  12360. */
  12361. function MapCache(entries) {
  12362. var index = -1,
  12363. length = entries == null ? 0 : entries.length;
  12364. this.clear();
  12365. while (++index < length) {
  12366. var entry = entries[index];
  12367. this.set(entry[0], entry[1]);
  12368. }
  12369. }
  12370. /**
  12371. * Removes all key-value entries from the map.
  12372. *
  12373. * @private
  12374. * @name clear
  12375. * @memberOf MapCache
  12376. */
  12377. function mapCacheClear() {
  12378. this.size = 0;
  12379. this.__data__ = {
  12380. 'hash': new Hash,
  12381. 'map': new (Map || ListCache),
  12382. 'string': new Hash
  12383. };
  12384. }
  12385. /**
  12386. * Removes `key` and its value from the map.
  12387. *
  12388. * @private
  12389. * @name delete
  12390. * @memberOf MapCache
  12391. * @param {string} key The key of the value to remove.
  12392. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  12393. */
  12394. function mapCacheDelete(key) {
  12395. var result = getMapData(this, key)['delete'](key);
  12396. this.size -= result ? 1 : 0;
  12397. return result;
  12398. }
  12399. /**
  12400. * Gets the map value for `key`.
  12401. *
  12402. * @private
  12403. * @name get
  12404. * @memberOf MapCache
  12405. * @param {string} key The key of the value to get.
  12406. * @returns {*} Returns the entry value.
  12407. */
  12408. function mapCacheGet(key) {
  12409. return getMapData(this, key).get(key);
  12410. }
  12411. /**
  12412. * Checks if a map value for `key` exists.
  12413. *
  12414. * @private
  12415. * @name has
  12416. * @memberOf MapCache
  12417. * @param {string} key The key of the entry to check.
  12418. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  12419. */
  12420. function mapCacheHas(key) {
  12421. return getMapData(this, key).has(key);
  12422. }
  12423. /**
  12424. * Sets the map `key` to `value`.
  12425. *
  12426. * @private
  12427. * @name set
  12428. * @memberOf MapCache
  12429. * @param {string} key The key of the value to set.
  12430. * @param {*} value The value to set.
  12431. * @returns {Object} Returns the map cache instance.
  12432. */
  12433. function mapCacheSet(key, value) {
  12434. var data = getMapData(this, key),
  12435. size = data.size;
  12436. data.set(key, value);
  12437. this.size += data.size == size ? 0 : 1;
  12438. return this;
  12439. }
  12440. // Add methods to `MapCache`.
  12441. MapCache.prototype.clear = mapCacheClear;
  12442. MapCache.prototype['delete'] = mapCacheDelete;
  12443. MapCache.prototype.get = mapCacheGet;
  12444. MapCache.prototype.has = mapCacheHas;
  12445. MapCache.prototype.set = mapCacheSet;
  12446. /*------------------------------------------------------------------------*/
  12447. /**
  12448. *
  12449. * Creates an array cache object to store unique values.
  12450. *
  12451. * @private
  12452. * @constructor
  12453. * @param {Array} [values] The values to cache.
  12454. */
  12455. function SetCache(values) {
  12456. var index = -1,
  12457. length = values == null ? 0 : values.length;
  12458. this.__data__ = new MapCache;
  12459. while (++index < length) {
  12460. this.add(values[index]);
  12461. }
  12462. }
  12463. /**
  12464. * Adds `value` to the array cache.
  12465. *
  12466. * @private
  12467. * @name add
  12468. * @memberOf SetCache
  12469. * @alias push
  12470. * @param {*} value The value to cache.
  12471. * @returns {Object} Returns the cache instance.
  12472. */
  12473. function setCacheAdd(value) {
  12474. this.__data__.set(value, HASH_UNDEFINED);
  12475. return this;
  12476. }
  12477. /**
  12478. * Checks if `value` is in the array cache.
  12479. *
  12480. * @private
  12481. * @name has
  12482. * @memberOf SetCache
  12483. * @param {*} value The value to search for.
  12484. * @returns {number} Returns `true` if `value` is found, else `false`.
  12485. */
  12486. function setCacheHas(value) {
  12487. return this.__data__.has(value);
  12488. }
  12489. // Add methods to `SetCache`.
  12490. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
  12491. SetCache.prototype.has = setCacheHas;
  12492. /*------------------------------------------------------------------------*/
  12493. /**
  12494. * Creates a stack cache object to store key-value pairs.
  12495. *
  12496. * @private
  12497. * @constructor
  12498. * @param {Array} [entries] The key-value pairs to cache.
  12499. */
  12500. function Stack(entries) {
  12501. var data = this.__data__ = new ListCache(entries);
  12502. this.size = data.size;
  12503. }
  12504. /**
  12505. * Removes all key-value entries from the stack.
  12506. *
  12507. * @private
  12508. * @name clear
  12509. * @memberOf Stack
  12510. */
  12511. function stackClear() {
  12512. this.__data__ = new ListCache;
  12513. this.size = 0;
  12514. }
  12515. /**
  12516. * Removes `key` and its value from the stack.
  12517. *
  12518. * @private
  12519. * @name delete
  12520. * @memberOf Stack
  12521. * @param {string} key The key of the value to remove.
  12522. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  12523. */
  12524. function stackDelete(key) {
  12525. var data = this.__data__,
  12526. result = data['delete'](key);
  12527. this.size = data.size;
  12528. return result;
  12529. }
  12530. /**
  12531. * Gets the stack value for `key`.
  12532. *
  12533. * @private
  12534. * @name get
  12535. * @memberOf Stack
  12536. * @param {string} key The key of the value to get.
  12537. * @returns {*} Returns the entry value.
  12538. */
  12539. function stackGet(key) {
  12540. return this.__data__.get(key);
  12541. }
  12542. /**
  12543. * Checks if a stack value for `key` exists.
  12544. *
  12545. * @private
  12546. * @name has
  12547. * @memberOf Stack
  12548. * @param {string} key The key of the entry to check.
  12549. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  12550. */
  12551. function stackHas(key) {
  12552. return this.__data__.has(key);
  12553. }
  12554. /**
  12555. * Sets the stack `key` to `value`.
  12556. *
  12557. * @private
  12558. * @name set
  12559. * @memberOf Stack
  12560. * @param {string} key The key of the value to set.
  12561. * @param {*} value The value to set.
  12562. * @returns {Object} Returns the stack cache instance.
  12563. */
  12564. function stackSet(key, value) {
  12565. var data = this.__data__;
  12566. if (data instanceof ListCache) {
  12567. var pairs = data.__data__;
  12568. if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
  12569. pairs.push([key, value]);
  12570. this.size = ++data.size;
  12571. return this;
  12572. }
  12573. data = this.__data__ = new MapCache(pairs);
  12574. }
  12575. data.set(key, value);
  12576. this.size = data.size;
  12577. return this;
  12578. }
  12579. // Add methods to `Stack`.
  12580. Stack.prototype.clear = stackClear;
  12581. Stack.prototype['delete'] = stackDelete;
  12582. Stack.prototype.get = stackGet;
  12583. Stack.prototype.has = stackHas;
  12584. Stack.prototype.set = stackSet;
  12585. /*------------------------------------------------------------------------*/
  12586. /**
  12587. * Creates an array of the enumerable property names of the array-like `value`.
  12588. *
  12589. * @private
  12590. * @param {*} value The value to query.
  12591. * @param {boolean} inherited Specify returning inherited property names.
  12592. * @returns {Array} Returns the array of property names.
  12593. */
  12594. function arrayLikeKeys(value, inherited) {
  12595. var isArr = isArray(value),
  12596. isArg = !isArr && isArguments(value),
  12597. isBuff = !isArr && !isArg && isBuffer(value),
  12598. isType = !isArr && !isArg && !isBuff && isTypedArray(value),
  12599. skipIndexes = isArr || isArg || isBuff || isType,
  12600. result = skipIndexes ? baseTimes(value.length, String) : [],
  12601. length = result.length;
  12602. for (var key in value) {
  12603. if ((inherited || hasOwnProperty.call(value, key)) &&
  12604. !(skipIndexes && (
  12605. // Safari 9 has enumerable `arguments.length` in strict mode.
  12606. key == 'length' ||
  12607. // Node.js 0.10 has enumerable non-index properties on buffers.
  12608. (isBuff && (key == 'offset' || key == 'parent')) ||
  12609. // PhantomJS 2 has enumerable non-index properties on typed arrays.
  12610. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
  12611. // Skip index properties.
  12612. isIndex(key, length)
  12613. ))) {
  12614. result.push(key);
  12615. }
  12616. }
  12617. return result;
  12618. }
  12619. /**
  12620. * A specialized version of `_.sample` for arrays.
  12621. *
  12622. * @private
  12623. * @param {Array} array The array to sample.
  12624. * @returns {*} Returns the random element.
  12625. */
  12626. function arraySample(array) {
  12627. var length = array.length;
  12628. return length ? array[baseRandom(0, length - 1)] : undefined;
  12629. }
  12630. /**
  12631. * A specialized version of `_.sampleSize` for arrays.
  12632. *
  12633. * @private
  12634. * @param {Array} array The array to sample.
  12635. * @param {number} n The number of elements to sample.
  12636. * @returns {Array} Returns the random elements.
  12637. */
  12638. function arraySampleSize(array, n) {
  12639. return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
  12640. }
  12641. /**
  12642. * A specialized version of `_.shuffle` for arrays.
  12643. *
  12644. * @private
  12645. * @param {Array} array The array to shuffle.
  12646. * @returns {Array} Returns the new shuffled array.
  12647. */
  12648. function arrayShuffle(array) {
  12649. return shuffleSelf(copyArray(array));
  12650. }
  12651. /**
  12652. * This function is like `assignValue` except that it doesn't assign
  12653. * `undefined` values.
  12654. *
  12655. * @private
  12656. * @param {Object} object The object to modify.
  12657. * @param {string} key The key of the property to assign.
  12658. * @param {*} value The value to assign.
  12659. */
  12660. function assignMergeValue(object, key, value) {
  12661. if ((value !== undefined && !eq(object[key], value)) ||
  12662. (value === undefined && !(key in object))) {
  12663. baseAssignValue(object, key, value);
  12664. }
  12665. }
  12666. /**
  12667. * Assigns `value` to `key` of `object` if the existing value is not equivalent
  12668. * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  12669. * for equality comparisons.
  12670. *
  12671. * @private
  12672. * @param {Object} object The object to modify.
  12673. * @param {string} key The key of the property to assign.
  12674. * @param {*} value The value to assign.
  12675. */
  12676. function assignValue(object, key, value) {
  12677. var objValue = object[key];
  12678. if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
  12679. (value === undefined && !(key in object))) {
  12680. baseAssignValue(object, key, value);
  12681. }
  12682. }
  12683. /**
  12684. * Gets the index at which the `key` is found in `array` of key-value pairs.
  12685. *
  12686. * @private
  12687. * @param {Array} array The array to inspect.
  12688. * @param {*} key The key to search for.
  12689. * @returns {number} Returns the index of the matched value, else `-1`.
  12690. */
  12691. function assocIndexOf(array, key) {
  12692. var length = array.length;
  12693. while (length--) {
  12694. if (eq(array[length][0], key)) {
  12695. return length;
  12696. }
  12697. }
  12698. return -1;
  12699. }
  12700. /**
  12701. * Aggregates elements of `collection` on `accumulator` with keys transformed
  12702. * by `iteratee` and values set by `setter`.
  12703. *
  12704. * @private
  12705. * @param {Array|Object} collection The collection to iterate over.
  12706. * @param {Function} setter The function to set `accumulator` values.
  12707. * @param {Function} iteratee The iteratee to transform keys.
  12708. * @param {Object} accumulator The initial aggregated object.
  12709. * @returns {Function} Returns `accumulator`.
  12710. */
  12711. function baseAggregator(collection, setter, iteratee, accumulator) {
  12712. baseEach(collection, function(value, key, collection) {
  12713. setter(accumulator, value, iteratee(value), collection);
  12714. });
  12715. return accumulator;
  12716. }
  12717. /**
  12718. * The base implementation of `_.assign` without support for multiple sources
  12719. * or `customizer` functions.
  12720. *
  12721. * @private
  12722. * @param {Object} object The destination object.
  12723. * @param {Object} source The source object.
  12724. * @returns {Object} Returns `object`.
  12725. */
  12726. function baseAssign(object, source) {
  12727. return object && copyObject(source, keys(source), object);
  12728. }
  12729. /**
  12730. * The base implementation of `_.assignIn` without support for multiple sources
  12731. * or `customizer` functions.
  12732. *
  12733. * @private
  12734. * @param {Object} object The destination object.
  12735. * @param {Object} source The source object.
  12736. * @returns {Object} Returns `object`.
  12737. */
  12738. function baseAssignIn(object, source) {
  12739. return object && copyObject(source, keysIn(source), object);
  12740. }
  12741. /**
  12742. * The base implementation of `assignValue` and `assignMergeValue` without
  12743. * value checks.
  12744. *
  12745. * @private
  12746. * @param {Object} object The object to modify.
  12747. * @param {string} key The key of the property to assign.
  12748. * @param {*} value The value to assign.
  12749. */
  12750. function baseAssignValue(object, key, value) {
  12751. if (key == '__proto__' && defineProperty) {
  12752. defineProperty(object, key, {
  12753. 'configurable': true,
  12754. 'enumerable': true,
  12755. 'value': value,
  12756. 'writable': true
  12757. });
  12758. } else {
  12759. object[key] = value;
  12760. }
  12761. }
  12762. /**
  12763. * The base implementation of `_.at` without support for individual paths.
  12764. *
  12765. * @private
  12766. * @param {Object} object The object to iterate over.
  12767. * @param {string[]} paths The property paths to pick.
  12768. * @returns {Array} Returns the picked elements.
  12769. */
  12770. function baseAt(object, paths) {
  12771. var index = -1,
  12772. length = paths.length,
  12773. result = Array(length),
  12774. skip = object == null;
  12775. while (++index < length) {
  12776. result[index] = skip ? undefined : get(object, paths[index]);
  12777. }
  12778. return result;
  12779. }
  12780. /**
  12781. * The base implementation of `_.clamp` which doesn't coerce arguments.
  12782. *
  12783. * @private
  12784. * @param {number} number The number to clamp.
  12785. * @param {number} [lower] The lower bound.
  12786. * @param {number} upper The upper bound.
  12787. * @returns {number} Returns the clamped number.
  12788. */
  12789. function baseClamp(number, lower, upper) {
  12790. if (number === number) {
  12791. if (upper !== undefined) {
  12792. number = number <= upper ? number : upper;
  12793. }
  12794. if (lower !== undefined) {
  12795. number = number >= lower ? number : lower;
  12796. }
  12797. }
  12798. return number;
  12799. }
  12800. /**
  12801. * The base implementation of `_.clone` and `_.cloneDeep` which tracks
  12802. * traversed objects.
  12803. *
  12804. * @private
  12805. * @param {*} value The value to clone.
  12806. * @param {boolean} bitmask The bitmask flags.
  12807. * 1 - Deep clone
  12808. * 2 - Flatten inherited properties
  12809. * 4 - Clone symbols
  12810. * @param {Function} [customizer] The function to customize cloning.
  12811. * @param {string} [key] The key of `value`.
  12812. * @param {Object} [object] The parent object of `value`.
  12813. * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
  12814. * @returns {*} Returns the cloned value.
  12815. */
  12816. function baseClone(value, bitmask, customizer, key, object, stack) {
  12817. var result,
  12818. isDeep = bitmask & CLONE_DEEP_FLAG,
  12819. isFlat = bitmask & CLONE_FLAT_FLAG,
  12820. isFull = bitmask & CLONE_SYMBOLS_FLAG;
  12821. if (customizer) {
  12822. result = object ? customizer(value, key, object, stack) : customizer(value);
  12823. }
  12824. if (result !== undefined) {
  12825. return result;
  12826. }
  12827. if (!isObject(value)) {
  12828. return value;
  12829. }
  12830. var isArr = isArray(value);
  12831. if (isArr) {
  12832. result = initCloneArray(value);
  12833. if (!isDeep) {
  12834. return copyArray(value, result);
  12835. }
  12836. } else {
  12837. var tag = getTag(value),
  12838. isFunc = tag == funcTag || tag == genTag;
  12839. if (isBuffer(value)) {
  12840. return cloneBuffer(value, isDeep);
  12841. }
  12842. if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
  12843. result = (isFlat || isFunc) ? {} : initCloneObject(value);
  12844. if (!isDeep) {
  12845. return isFlat
  12846. ? copySymbolsIn(value, baseAssignIn(result, value))
  12847. : copySymbols(value, baseAssign(result, value));
  12848. }
  12849. } else {
  12850. if (!cloneableTags[tag]) {
  12851. return object ? value : {};
  12852. }
  12853. result = initCloneByTag(value, tag, baseClone, isDeep);
  12854. }
  12855. }
  12856. // Check for circular references and return its corresponding clone.
  12857. stack || (stack = new Stack);
  12858. var stacked = stack.get(value);
  12859. if (stacked) {
  12860. return stacked;
  12861. }
  12862. stack.set(value, result);
  12863. var keysFunc = isFull
  12864. ? (isFlat ? getAllKeysIn : getAllKeys)
  12865. : (isFlat ? keysIn : keys);
  12866. var props = isArr ? undefined : keysFunc(value);
  12867. arrayEach(props || value, function(subValue, key) {
  12868. if (props) {
  12869. key = subValue;
  12870. subValue = value[key];
  12871. }
  12872. // Recursively populate clone (susceptible to call stack limits).
  12873. assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
  12874. });
  12875. return result;
  12876. }
  12877. /**
  12878. * The base implementation of `_.conforms` which doesn't clone `source`.
  12879. *
  12880. * @private
  12881. * @param {Object} source The object of property predicates to conform to.
  12882. * @returns {Function} Returns the new spec function.
  12883. */
  12884. function baseConforms(source) {
  12885. var props = keys(source);
  12886. return function(object) {
  12887. return baseConformsTo(object, source, props);
  12888. };
  12889. }
  12890. /**
  12891. * The base implementation of `_.conformsTo` which accepts `props` to check.
  12892. *
  12893. * @private
  12894. * @param {Object} object The object to inspect.
  12895. * @param {Object} source The object of property predicates to conform to.
  12896. * @returns {boolean} Returns `true` if `object` conforms, else `false`.
  12897. */
  12898. function baseConformsTo(object, source, props) {
  12899. var length = props.length;
  12900. if (object == null) {
  12901. return !length;
  12902. }
  12903. object = Object(object);
  12904. while (length--) {
  12905. var key = props[length],
  12906. predicate = source[key],
  12907. value = object[key];
  12908. if ((value === undefined && !(key in object)) || !predicate(value)) {
  12909. return false;
  12910. }
  12911. }
  12912. return true;
  12913. }
  12914. /**
  12915. * The base implementation of `_.delay` and `_.defer` which accepts `args`
  12916. * to provide to `func`.
  12917. *
  12918. * @private
  12919. * @param {Function} func The function to delay.
  12920. * @param {number} wait The number of milliseconds to delay invocation.
  12921. * @param {Array} args The arguments to provide to `func`.
  12922. * @returns {number|Object} Returns the timer id or timeout object.
  12923. */
  12924. function baseDelay(func, wait, args) {
  12925. if (typeof func != 'function') {
  12926. throw new TypeError(FUNC_ERROR_TEXT);
  12927. }
  12928. return setTimeout(function() { func.apply(undefined, args); }, wait);
  12929. }
  12930. /**
  12931. * The base implementation of methods like `_.difference` without support
  12932. * for excluding multiple arrays or iteratee shorthands.
  12933. *
  12934. * @private
  12935. * @param {Array} array The array to inspect.
  12936. * @param {Array} values The values to exclude.
  12937. * @param {Function} [iteratee] The iteratee invoked per element.
  12938. * @param {Function} [comparator] The comparator invoked per element.
  12939. * @returns {Array} Returns the new array of filtered values.
  12940. */
  12941. function baseDifference(array, values, iteratee, comparator) {
  12942. var index = -1,
  12943. includes = arrayIncludes,
  12944. isCommon = true,
  12945. length = array.length,
  12946. result = [],
  12947. valuesLength = values.length;
  12948. if (!length) {
  12949. return result;
  12950. }
  12951. if (iteratee) {
  12952. values = arrayMap(values, baseUnary(iteratee));
  12953. }
  12954. if (comparator) {
  12955. includes = arrayIncludesWith;
  12956. isCommon = false;
  12957. }
  12958. else if (values.length >= LARGE_ARRAY_SIZE) {
  12959. includes = cacheHas;
  12960. isCommon = false;
  12961. values = new SetCache(values);
  12962. }
  12963. outer:
  12964. while (++index < length) {
  12965. var value = array[index],
  12966. computed = iteratee == null ? value : iteratee(value);
  12967. value = (comparator || value !== 0) ? value : 0;
  12968. if (isCommon && computed === computed) {
  12969. var valuesIndex = valuesLength;
  12970. while (valuesIndex--) {
  12971. if (values[valuesIndex] === computed) {
  12972. continue outer;
  12973. }
  12974. }
  12975. result.push(value);
  12976. }
  12977. else if (!includes(values, computed, comparator)) {
  12978. result.push(value);
  12979. }
  12980. }
  12981. return result;
  12982. }
  12983. /**
  12984. * The base implementation of `_.forEach` without support for iteratee shorthands.
  12985. *
  12986. * @private
  12987. * @param {Array|Object} collection The collection to iterate over.
  12988. * @param {Function} iteratee The function invoked per iteration.
  12989. * @returns {Array|Object} Returns `collection`.
  12990. */
  12991. var baseEach = createBaseEach(baseForOwn);
  12992. /**
  12993. * The base implementation of `_.forEachRight` without support for iteratee shorthands.
  12994. *
  12995. * @private
  12996. * @param {Array|Object} collection The collection to iterate over.
  12997. * @param {Function} iteratee The function invoked per iteration.
  12998. * @returns {Array|Object} Returns `collection`.
  12999. */
  13000. var baseEachRight = createBaseEach(baseForOwnRight, true);
  13001. /**
  13002. * The base implementation of `_.every` without support for iteratee shorthands.
  13003. *
  13004. * @private
  13005. * @param {Array|Object} collection The collection to iterate over.
  13006. * @param {Function} predicate The function invoked per iteration.
  13007. * @returns {boolean} Returns `true` if all elements pass the predicate check,
  13008. * else `false`
  13009. */
  13010. function baseEvery(collection, predicate) {
  13011. var result = true;
  13012. baseEach(collection, function(value, index, collection) {
  13013. result = !!predicate(value, index, collection);
  13014. return result;
  13015. });
  13016. return result;
  13017. }
  13018. /**
  13019. * The base implementation of methods like `_.max` and `_.min` which accepts a
  13020. * `comparator` to determine the extremum value.
  13021. *
  13022. * @private
  13023. * @param {Array} array The array to iterate over.
  13024. * @param {Function} iteratee The iteratee invoked per iteration.
  13025. * @param {Function} comparator The comparator used to compare values.
  13026. * @returns {*} Returns the extremum value.
  13027. */
  13028. function baseExtremum(array, iteratee, comparator) {
  13029. var index = -1,
  13030. length = array.length;
  13031. while (++index < length) {
  13032. var value = array[index],
  13033. current = iteratee(value);
  13034. if (current != null && (computed === undefined
  13035. ? (current === current && !isSymbol(current))
  13036. : comparator(current, computed)
  13037. )) {
  13038. var computed = current,
  13039. result = value;
  13040. }
  13041. }
  13042. return result;
  13043. }
  13044. /**
  13045. * The base implementation of `_.fill` without an iteratee call guard.
  13046. *
  13047. * @private
  13048. * @param {Array} array The array to fill.
  13049. * @param {*} value The value to fill `array` with.
  13050. * @param {number} [start=0] The start position.
  13051. * @param {number} [end=array.length] The end position.
  13052. * @returns {Array} Returns `array`.
  13053. */
  13054. function baseFill(array, value, start, end) {
  13055. var length = array.length;
  13056. start = toInteger(start);
  13057. if (start < 0) {
  13058. start = -start > length ? 0 : (length + start);
  13059. }
  13060. end = (end === undefined || end > length) ? length : toInteger(end);
  13061. if (end < 0) {
  13062. end += length;
  13063. }
  13064. end = start > end ? 0 : toLength(end);
  13065. while (start < end) {
  13066. array[start++] = value;
  13067. }
  13068. return array;
  13069. }
  13070. /**
  13071. * The base implementation of `_.filter` without support for iteratee shorthands.
  13072. *
  13073. * @private
  13074. * @param {Array|Object} collection The collection to iterate over.
  13075. * @param {Function} predicate The function invoked per iteration.
  13076. * @returns {Array} Returns the new filtered array.
  13077. */
  13078. function baseFilter(collection, predicate) {
  13079. var result = [];
  13080. baseEach(collection, function(value, index, collection) {
  13081. if (predicate(value, index, collection)) {
  13082. result.push(value);
  13083. }
  13084. });
  13085. return result;
  13086. }
  13087. /**
  13088. * The base implementation of `_.flatten` with support for restricting flattening.
  13089. *
  13090. * @private
  13091. * @param {Array} array The array to flatten.
  13092. * @param {number} depth The maximum recursion depth.
  13093. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
  13094. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
  13095. * @param {Array} [result=[]] The initial result value.
  13096. * @returns {Array} Returns the new flattened array.
  13097. */
  13098. function baseFlatten(array, depth, predicate, isStrict, result) {
  13099. var index = -1,
  13100. length = array.length;
  13101. predicate || (predicate = isFlattenable);
  13102. result || (result = []);
  13103. while (++index < length) {
  13104. var value = array[index];
  13105. if (depth > 0 && predicate(value)) {
  13106. if (depth > 1) {
  13107. // Recursively flatten arrays (susceptible to call stack limits).
  13108. baseFlatten(value, depth - 1, predicate, isStrict, result);
  13109. } else {
  13110. arrayPush(result, value);
  13111. }
  13112. } else if (!isStrict) {
  13113. result[result.length] = value;
  13114. }
  13115. }
  13116. return result;
  13117. }
  13118. /**
  13119. * The base implementation of `baseForOwn` which iterates over `object`
  13120. * properties returned by `keysFunc` and invokes `iteratee` for each property.
  13121. * Iteratee functions may exit iteration early by explicitly returning `false`.
  13122. *
  13123. * @private
  13124. * @param {Object} object The object to iterate over.
  13125. * @param {Function} iteratee The function invoked per iteration.
  13126. * @param {Function} keysFunc The function to get the keys of `object`.
  13127. * @returns {Object} Returns `object`.
  13128. */
  13129. var baseFor = createBaseFor();
  13130. /**
  13131. * This function is like `baseFor` except that it iterates over properties
  13132. * in the opposite order.
  13133. *
  13134. * @private
  13135. * @param {Object} object The object to iterate over.
  13136. * @param {Function} iteratee The function invoked per iteration.
  13137. * @param {Function} keysFunc The function to get the keys of `object`.
  13138. * @returns {Object} Returns `object`.
  13139. */
  13140. var baseForRight = createBaseFor(true);
  13141. /**
  13142. * The base implementation of `_.forOwn` without support for iteratee shorthands.
  13143. *
  13144. * @private
  13145. * @param {Object} object The object to iterate over.
  13146. * @param {Function} iteratee The function invoked per iteration.
  13147. * @returns {Object} Returns `object`.
  13148. */
  13149. function baseForOwn(object, iteratee) {
  13150. return object && baseFor(object, iteratee, keys);
  13151. }
  13152. /**
  13153. * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
  13154. *
  13155. * @private
  13156. * @param {Object} object The object to iterate over.
  13157. * @param {Function} iteratee The function invoked per iteration.
  13158. * @returns {Object} Returns `object`.
  13159. */
  13160. function baseForOwnRight(object, iteratee) {
  13161. return object && baseForRight(object, iteratee, keys);
  13162. }
  13163. /**
  13164. * The base implementation of `_.functions` which creates an array of
  13165. * `object` function property names filtered from `props`.
  13166. *
  13167. * @private
  13168. * @param {Object} object The object to inspect.
  13169. * @param {Array} props The property names to filter.
  13170. * @returns {Array} Returns the function names.
  13171. */
  13172. function baseFunctions(object, props) {
  13173. return arrayFilter(props, function(key) {
  13174. return isFunction(object[key]);
  13175. });
  13176. }
  13177. /**
  13178. * The base implementation of `_.get` without support for default values.
  13179. *
  13180. * @private
  13181. * @param {Object} object The object to query.
  13182. * @param {Array|string} path The path of the property to get.
  13183. * @returns {*} Returns the resolved value.
  13184. */
  13185. function baseGet(object, path) {
  13186. path = castPath(path, object);
  13187. var index = 0,
  13188. length = path.length;
  13189. while (object != null && index < length) {
  13190. object = object[toKey(path[index++])];
  13191. }
  13192. return (index && index == length) ? object : undefined;
  13193. }
  13194. /**
  13195. * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
  13196. * `keysFunc` and `symbolsFunc` to get the enumerable property names and
  13197. * symbols of `object`.
  13198. *
  13199. * @private
  13200. * @param {Object} object The object to query.
  13201. * @param {Function} keysFunc The function to get the keys of `object`.
  13202. * @param {Function} symbolsFunc The function to get the symbols of `object`.
  13203. * @returns {Array} Returns the array of property names and symbols.
  13204. */
  13205. function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  13206. var result = keysFunc(object);
  13207. return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
  13208. }
  13209. /**
  13210. * The base implementation of `getTag` without fallbacks for buggy environments.
  13211. *
  13212. * @private
  13213. * @param {*} value The value to query.
  13214. * @returns {string} Returns the `toStringTag`.
  13215. */
  13216. function baseGetTag(value) {
  13217. if (value == null) {
  13218. return value === undefined ? undefinedTag : nullTag;
  13219. }
  13220. return (symToStringTag && symToStringTag in Object(value))
  13221. ? getRawTag(value)
  13222. : objectToString(value);
  13223. }
  13224. /**
  13225. * The base implementation of `_.gt` which doesn't coerce arguments.
  13226. *
  13227. * @private
  13228. * @param {*} value The value to compare.
  13229. * @param {*} other The other value to compare.
  13230. * @returns {boolean} Returns `true` if `value` is greater than `other`,
  13231. * else `false`.
  13232. */
  13233. function baseGt(value, other) {
  13234. return value > other;
  13235. }
  13236. /**
  13237. * The base implementation of `_.has` without support for deep paths.
  13238. *
  13239. * @private
  13240. * @param {Object} [object] The object to query.
  13241. * @param {Array|string} key The key to check.
  13242. * @returns {boolean} Returns `true` if `key` exists, else `false`.
  13243. */
  13244. function baseHas(object, key) {
  13245. return object != null && hasOwnProperty.call(object, key);
  13246. }
  13247. /**
  13248. * The base implementation of `_.hasIn` without support for deep paths.
  13249. *
  13250. * @private
  13251. * @param {Object} [object] The object to query.
  13252. * @param {Array|string} key The key to check.
  13253. * @returns {boolean} Returns `true` if `key` exists, else `false`.
  13254. */
  13255. function baseHasIn(object, key) {
  13256. return object != null && key in Object(object);
  13257. }
  13258. /**
  13259. * The base implementation of `_.inRange` which doesn't coerce arguments.
  13260. *
  13261. * @private
  13262. * @param {number} number The number to check.
  13263. * @param {number} start The start of the range.
  13264. * @param {number} end The end of the range.
  13265. * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
  13266. */
  13267. function baseInRange(number, start, end) {
  13268. return number >= nativeMin(start, end) && number < nativeMax(start, end);
  13269. }
  13270. /**
  13271. * The base implementation of methods like `_.intersection`, without support
  13272. * for iteratee shorthands, that accepts an array of arrays to inspect.
  13273. *
  13274. * @private
  13275. * @param {Array} arrays The arrays to inspect.
  13276. * @param {Function} [iteratee] The iteratee invoked per element.
  13277. * @param {Function} [comparator] The comparator invoked per element.
  13278. * @returns {Array} Returns the new array of shared values.
  13279. */
  13280. function baseIntersection(arrays, iteratee, comparator) {
  13281. var includes = comparator ? arrayIncludesWith : arrayIncludes,
  13282. length = arrays[0].length,
  13283. othLength = arrays.length,
  13284. othIndex = othLength,
  13285. caches = Array(othLength),
  13286. maxLength = Infinity,
  13287. result = [];
  13288. while (othIndex--) {
  13289. var array = arrays[othIndex];
  13290. if (othIndex && iteratee) {
  13291. array = arrayMap(array, baseUnary(iteratee));
  13292. }
  13293. maxLength = nativeMin(array.length, maxLength);
  13294. caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
  13295. ? new SetCache(othIndex && array)
  13296. : undefined;
  13297. }
  13298. array = arrays[0];
  13299. var index = -1,
  13300. seen = caches[0];
  13301. outer:
  13302. while (++index < length && result.length < maxLength) {
  13303. var value = array[index],
  13304. computed = iteratee ? iteratee(value) : value;
  13305. value = (comparator || value !== 0) ? value : 0;
  13306. if (!(seen
  13307. ? cacheHas(seen, computed)
  13308. : includes(result, computed, comparator)
  13309. )) {
  13310. othIndex = othLength;
  13311. while (--othIndex) {
  13312. var cache = caches[othIndex];
  13313. if (!(cache
  13314. ? cacheHas(cache, computed)
  13315. : includes(arrays[othIndex], computed, comparator))
  13316. ) {
  13317. continue outer;
  13318. }
  13319. }
  13320. if (seen) {
  13321. seen.push(computed);
  13322. }
  13323. result.push(value);
  13324. }
  13325. }
  13326. return result;
  13327. }
  13328. /**
  13329. * The base implementation of `_.invert` and `_.invertBy` which inverts
  13330. * `object` with values transformed by `iteratee` and set by `setter`.
  13331. *
  13332. * @private
  13333. * @param {Object} object The object to iterate over.
  13334. * @param {Function} setter The function to set `accumulator` values.
  13335. * @param {Function} iteratee The iteratee to transform values.
  13336. * @param {Object} accumulator The initial inverted object.
  13337. * @returns {Function} Returns `accumulator`.
  13338. */
  13339. function baseInverter(object, setter, iteratee, accumulator) {
  13340. baseForOwn(object, function(value, key, object) {
  13341. setter(accumulator, iteratee(value), key, object);
  13342. });
  13343. return accumulator;
  13344. }
  13345. /**
  13346. * The base implementation of `_.invoke` without support for individual
  13347. * method arguments.
  13348. *
  13349. * @private
  13350. * @param {Object} object The object to query.
  13351. * @param {Array|string} path The path of the method to invoke.
  13352. * @param {Array} args The arguments to invoke the method with.
  13353. * @returns {*} Returns the result of the invoked method.
  13354. */
  13355. function baseInvoke(object, path, args) {
  13356. path = castPath(path, object);
  13357. object = parent(object, path);
  13358. var func = object == null ? object : object[toKey(last(path))];
  13359. return func == null ? undefined : apply(func, object, args);
  13360. }
  13361. /**
  13362. * The base implementation of `_.isArguments`.
  13363. *
  13364. * @private
  13365. * @param {*} value The value to check.
  13366. * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  13367. */
  13368. function baseIsArguments(value) {
  13369. return isObjectLike(value) && baseGetTag(value) == argsTag;
  13370. }
  13371. /**
  13372. * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
  13373. *
  13374. * @private
  13375. * @param {*} value The value to check.
  13376. * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
  13377. */
  13378. function baseIsArrayBuffer(value) {
  13379. return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
  13380. }
  13381. /**
  13382. * The base implementation of `_.isDate` without Node.js optimizations.
  13383. *
  13384. * @private
  13385. * @param {*} value The value to check.
  13386. * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
  13387. */
  13388. function baseIsDate(value) {
  13389. return isObjectLike(value) && baseGetTag(value) == dateTag;
  13390. }
  13391. /**
  13392. * The base implementation of `_.isEqual` which supports partial comparisons
  13393. * and tracks traversed objects.
  13394. *
  13395. * @private
  13396. * @param {*} value The value to compare.
  13397. * @param {*} other The other value to compare.
  13398. * @param {boolean} bitmask The bitmask flags.
  13399. * 1 - Unordered comparison
  13400. * 2 - Partial comparison
  13401. * @param {Function} [customizer] The function to customize comparisons.
  13402. * @param {Object} [stack] Tracks traversed `value` and `other` objects.
  13403. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  13404. */
  13405. function baseIsEqual(value, other, bitmask, customizer, stack) {
  13406. if (value === other) {
  13407. return true;
  13408. }
  13409. if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
  13410. return value !== value && other !== other;
  13411. }
  13412. return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
  13413. }
  13414. /**
  13415. * A specialized version of `baseIsEqual` for arrays and objects which performs
  13416. * deep comparisons and tracks traversed objects enabling objects with circular
  13417. * references to be compared.
  13418. *
  13419. * @private
  13420. * @param {Object} object The object to compare.
  13421. * @param {Object} other The other object to compare.
  13422. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  13423. * @param {Function} customizer The function to customize comparisons.
  13424. * @param {Function} equalFunc The function to determine equivalents of values.
  13425. * @param {Object} [stack] Tracks traversed `object` and `other` objects.
  13426. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  13427. */
  13428. function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  13429. var objIsArr = isArray(object),
  13430. othIsArr = isArray(other),
  13431. objTag = objIsArr ? arrayTag : getTag(object),
  13432. othTag = othIsArr ? arrayTag : getTag(other);
  13433. objTag = objTag == argsTag ? objectTag : objTag;
  13434. othTag = othTag == argsTag ? objectTag : othTag;
  13435. var objIsObj = objTag == objectTag,
  13436. othIsObj = othTag == objectTag,
  13437. isSameTag = objTag == othTag;
  13438. if (isSameTag && isBuffer(object)) {
  13439. if (!isBuffer(other)) {
  13440. return false;
  13441. }
  13442. objIsArr = true;
  13443. objIsObj = false;
  13444. }
  13445. if (isSameTag && !objIsObj) {
  13446. stack || (stack = new Stack);
  13447. return (objIsArr || isTypedArray(object))
  13448. ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
  13449. : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
  13450. }
  13451. if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
  13452. var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
  13453. othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
  13454. if (objIsWrapped || othIsWrapped) {
  13455. var objUnwrapped = objIsWrapped ? object.value() : object,
  13456. othUnwrapped = othIsWrapped ? other.value() : other;
  13457. stack || (stack = new Stack);
  13458. return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
  13459. }
  13460. }
  13461. if (!isSameTag) {
  13462. return false;
  13463. }
  13464. stack || (stack = new Stack);
  13465. return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
  13466. }
  13467. /**
  13468. * The base implementation of `_.isMap` without Node.js optimizations.
  13469. *
  13470. * @private
  13471. * @param {*} value The value to check.
  13472. * @returns {boolean} Returns `true` if `value` is a map, else `false`.
  13473. */
  13474. function baseIsMap(value) {
  13475. return isObjectLike(value) && getTag(value) == mapTag;
  13476. }
  13477. /**
  13478. * The base implementation of `_.isMatch` without support for iteratee shorthands.
  13479. *
  13480. * @private
  13481. * @param {Object} object The object to inspect.
  13482. * @param {Object} source The object of property values to match.
  13483. * @param {Array} matchData The property names, values, and compare flags to match.
  13484. * @param {Function} [customizer] The function to customize comparisons.
  13485. * @returns {boolean} Returns `true` if `object` is a match, else `false`.
  13486. */
  13487. function baseIsMatch(object, source, matchData, customizer) {
  13488. var index = matchData.length,
  13489. length = index,
  13490. noCustomizer = !customizer;
  13491. if (object == null) {
  13492. return !length;
  13493. }
  13494. object = Object(object);
  13495. while (index--) {
  13496. var data = matchData[index];
  13497. if ((noCustomizer && data[2])
  13498. ? data[1] !== object[data[0]]
  13499. : !(data[0] in object)
  13500. ) {
  13501. return false;
  13502. }
  13503. }
  13504. while (++index < length) {
  13505. data = matchData[index];
  13506. var key = data[0],
  13507. objValue = object[key],
  13508. srcValue = data[1];
  13509. if (noCustomizer && data[2]) {
  13510. if (objValue === undefined && !(key in object)) {
  13511. return false;
  13512. }
  13513. } else {
  13514. var stack = new Stack;
  13515. if (customizer) {
  13516. var result = customizer(objValue, srcValue, key, object, source, stack);
  13517. }
  13518. if (!(result === undefined
  13519. ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
  13520. : result
  13521. )) {
  13522. return false;
  13523. }
  13524. }
  13525. }
  13526. return true;
  13527. }
  13528. /**
  13529. * The base implementation of `_.isNative` without bad shim checks.
  13530. *
  13531. * @private
  13532. * @param {*} value The value to check.
  13533. * @returns {boolean} Returns `true` if `value` is a native function,
  13534. * else `false`.
  13535. */
  13536. function baseIsNative(value) {
  13537. if (!isObject(value) || isMasked(value)) {
  13538. return false;
  13539. }
  13540. var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  13541. return pattern.test(toSource(value));
  13542. }
  13543. /**
  13544. * The base implementation of `_.isRegExp` without Node.js optimizations.
  13545. *
  13546. * @private
  13547. * @param {*} value The value to check.
  13548. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
  13549. */
  13550. function baseIsRegExp(value) {
  13551. return isObjectLike(value) && baseGetTag(value) == regexpTag;
  13552. }
  13553. /**
  13554. * The base implementation of `_.isSet` without Node.js optimizations.
  13555. *
  13556. * @private
  13557. * @param {*} value The value to check.
  13558. * @returns {boolean} Returns `true` if `value` is a set, else `false`.
  13559. */
  13560. function baseIsSet(value) {
  13561. return isObjectLike(value) && getTag(value) == setTag;
  13562. }
  13563. /**
  13564. * The base implementation of `_.isTypedArray` without Node.js optimizations.
  13565. *
  13566. * @private
  13567. * @param {*} value The value to check.
  13568. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
  13569. */
  13570. function baseIsTypedArray(value) {
  13571. return isObjectLike(value) &&
  13572. isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
  13573. }
  13574. /**
  13575. * The base implementation of `_.iteratee`.
  13576. *
  13577. * @private
  13578. * @param {*} [value=_.identity] The value to convert to an iteratee.
  13579. * @returns {Function} Returns the iteratee.
  13580. */
  13581. function baseIteratee(value) {
  13582. // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
  13583. // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
  13584. if (typeof value == 'function') {
  13585. return value;
  13586. }
  13587. if (value == null) {
  13588. return identity;
  13589. }
  13590. if (typeof value == 'object') {
  13591. return isArray(value)
  13592. ? baseMatchesProperty(value[0], value[1])
  13593. : baseMatches(value);
  13594. }
  13595. return property(value);
  13596. }
  13597. /**
  13598. * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
  13599. *
  13600. * @private
  13601. * @param {Object} object The object to query.
  13602. * @returns {Array} Returns the array of property names.
  13603. */
  13604. function baseKeys(object) {
  13605. if (!isPrototype(object)) {
  13606. return nativeKeys(object);
  13607. }
  13608. var result = [];
  13609. for (var key in Object(object)) {
  13610. if (hasOwnProperty.call(object, key) && key != 'constructor') {
  13611. result.push(key);
  13612. }
  13613. }
  13614. return result;
  13615. }
  13616. /**
  13617. * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
  13618. *
  13619. * @private
  13620. * @param {Object} object The object to query.
  13621. * @returns {Array} Returns the array of property names.
  13622. */
  13623. function baseKeysIn(object) {
  13624. if (!isObject(object)) {
  13625. return nativeKeysIn(object);
  13626. }
  13627. var isProto = isPrototype(object),
  13628. result = [];
  13629. for (var key in object) {
  13630. if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
  13631. result.push(key);
  13632. }
  13633. }
  13634. return result;
  13635. }
  13636. /**
  13637. * The base implementation of `_.lt` which doesn't coerce arguments.
  13638. *
  13639. * @private
  13640. * @param {*} value The value to compare.
  13641. * @param {*} other The other value to compare.
  13642. * @returns {boolean} Returns `true` if `value` is less than `other`,
  13643. * else `false`.
  13644. */
  13645. function baseLt(value, other) {
  13646. return value < other;
  13647. }
  13648. /**
  13649. * The base implementation of `_.map` without support for iteratee shorthands.
  13650. *
  13651. * @private
  13652. * @param {Array|Object} collection The collection to iterate over.
  13653. * @param {Function} iteratee The function invoked per iteration.
  13654. * @returns {Array} Returns the new mapped array.
  13655. */
  13656. function baseMap(collection, iteratee) {
  13657. var index = -1,
  13658. result = isArrayLike(collection) ? Array(collection.length) : [];
  13659. baseEach(collection, function(value, key, collection) {
  13660. result[++index] = iteratee(value, key, collection);
  13661. });
  13662. return result;
  13663. }
  13664. /**
  13665. * The base implementation of `_.matches` which doesn't clone `source`.
  13666. *
  13667. * @private
  13668. * @param {Object} source The object of property values to match.
  13669. * @returns {Function} Returns the new spec function.
  13670. */
  13671. function baseMatches(source) {
  13672. var matchData = getMatchData(source);
  13673. if (matchData.length == 1 && matchData[0][2]) {
  13674. return matchesStrictComparable(matchData[0][0], matchData[0][1]);
  13675. }
  13676. return function(object) {
  13677. return object === source || baseIsMatch(object, source, matchData);
  13678. };
  13679. }
  13680. /**
  13681. * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
  13682. *
  13683. * @private
  13684. * @param {string} path The path of the property to get.
  13685. * @param {*} srcValue The value to match.
  13686. * @returns {Function} Returns the new spec function.
  13687. */
  13688. function baseMatchesProperty(path, srcValue) {
  13689. if (isKey(path) && isStrictComparable(srcValue)) {
  13690. return matchesStrictComparable(toKey(path), srcValue);
  13691. }
  13692. return function(object) {
  13693. var objValue = get(object, path);
  13694. return (objValue === undefined && objValue === srcValue)
  13695. ? hasIn(object, path)
  13696. : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
  13697. };
  13698. }
  13699. /**
  13700. * The base implementation of `_.merge` without support for multiple sources.
  13701. *
  13702. * @private
  13703. * @param {Object} object The destination object.
  13704. * @param {Object} source The source object.
  13705. * @param {number} srcIndex The index of `source`.
  13706. * @param {Function} [customizer] The function to customize merged values.
  13707. * @param {Object} [stack] Tracks traversed source values and their merged
  13708. * counterparts.
  13709. */
  13710. function baseMerge(object, source, srcIndex, customizer, stack) {
  13711. if (object === source) {
  13712. return;
  13713. }
  13714. baseFor(source, function(srcValue, key) {
  13715. if (isObject(srcValue)) {
  13716. stack || (stack = new Stack);
  13717. baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
  13718. }
  13719. else {
  13720. var newValue = customizer
  13721. ? customizer(object[key], srcValue, (key + ''), object, source, stack)
  13722. : undefined;
  13723. if (newValue === undefined) {
  13724. newValue = srcValue;
  13725. }
  13726. assignMergeValue(object, key, newValue);
  13727. }
  13728. }, keysIn);
  13729. }
  13730. /**
  13731. * A specialized version of `baseMerge` for arrays and objects which performs
  13732. * deep merges and tracks traversed objects enabling objects with circular
  13733. * references to be merged.
  13734. *
  13735. * @private
  13736. * @param {Object} object The destination object.
  13737. * @param {Object} source The source object.
  13738. * @param {string} key The key of the value to merge.
  13739. * @param {number} srcIndex The index of `source`.
  13740. * @param {Function} mergeFunc The function to merge values.
  13741. * @param {Function} [customizer] The function to customize assigned values.
  13742. * @param {Object} [stack] Tracks traversed source values and their merged
  13743. * counterparts.
  13744. */
  13745. function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
  13746. var objValue = object[key],
  13747. srcValue = source[key],
  13748. stacked = stack.get(srcValue);
  13749. if (stacked) {
  13750. assignMergeValue(object, key, stacked);
  13751. return;
  13752. }
  13753. var newValue = customizer
  13754. ? customizer(objValue, srcValue, (key + ''), object, source, stack)
  13755. : undefined;
  13756. var isCommon = newValue === undefined;
  13757. if (isCommon) {
  13758. var isArr = isArray(srcValue),
  13759. isBuff = !isArr && isBuffer(srcValue),
  13760. isTyped = !isArr && !isBuff && isTypedArray(srcValue);
  13761. newValue = srcValue;
  13762. if (isArr || isBuff || isTyped) {
  13763. if (isArray(objValue)) {
  13764. newValue = objValue;
  13765. }
  13766. else if (isArrayLikeObject(objValue)) {
  13767. newValue = copyArray(objValue);
  13768. }
  13769. else if (isBuff) {
  13770. isCommon = false;
  13771. newValue = cloneBuffer(srcValue, true);
  13772. }
  13773. else if (isTyped) {
  13774. isCommon = false;
  13775. newValue = cloneTypedArray(srcValue, true);
  13776. }
  13777. else {
  13778. newValue = [];
  13779. }
  13780. }
  13781. else if (isPlainObject(srcValue) || isArguments(srcValue)) {
  13782. newValue = objValue;
  13783. if (isArguments(objValue)) {
  13784. newValue = toPlainObject(objValue);
  13785. }
  13786. else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
  13787. newValue = initCloneObject(srcValue);
  13788. }
  13789. }
  13790. else {
  13791. isCommon = false;
  13792. }
  13793. }
  13794. if (isCommon) {
  13795. // Recursively merge objects and arrays (susceptible to call stack limits).
  13796. stack.set(srcValue, newValue);
  13797. mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
  13798. stack['delete'](srcValue);
  13799. }
  13800. assignMergeValue(object, key, newValue);
  13801. }
  13802. /**
  13803. * The base implementation of `_.nth` which doesn't coerce arguments.
  13804. *
  13805. * @private
  13806. * @param {Array} array The array to query.
  13807. * @param {number} n The index of the element to return.
  13808. * @returns {*} Returns the nth element of `array`.
  13809. */
  13810. function baseNth(array, n) {
  13811. var length = array.length;
  13812. if (!length) {
  13813. return;
  13814. }
  13815. n += n < 0 ? length : 0;
  13816. return isIndex(n, length) ? array[n] : undefined;
  13817. }
  13818. /**
  13819. * The base implementation of `_.orderBy` without param guards.
  13820. *
  13821. * @private
  13822. * @param {Array|Object} collection The collection to iterate over.
  13823. * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
  13824. * @param {string[]} orders The sort orders of `iteratees`.
  13825. * @returns {Array} Returns the new sorted array.
  13826. */
  13827. function baseOrderBy(collection, iteratees, orders) {
  13828. var index = -1;
  13829. iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
  13830. var result = baseMap(collection, function(value, key, collection) {
  13831. var criteria = arrayMap(iteratees, function(iteratee) {
  13832. return iteratee(value);
  13833. });
  13834. return { 'criteria': criteria, 'index': ++index, 'value': value };
  13835. });
  13836. return baseSortBy(result, function(object, other) {
  13837. return compareMultiple(object, other, orders);
  13838. });
  13839. }
  13840. /**
  13841. * The base implementation of `_.pick` without support for individual
  13842. * property identifiers.
  13843. *
  13844. * @private
  13845. * @param {Object} object The source object.
  13846. * @param {string[]} paths The property paths to pick.
  13847. * @returns {Object} Returns the new object.
  13848. */
  13849. function basePick(object, paths) {
  13850. return basePickBy(object, paths, function(value, path) {
  13851. return hasIn(object, path);
  13852. });
  13853. }
  13854. /**
  13855. * The base implementation of `_.pickBy` without support for iteratee shorthands.
  13856. *
  13857. * @private
  13858. * @param {Object} object The source object.
  13859. * @param {string[]} paths The property paths to pick.
  13860. * @param {Function} predicate The function invoked per property.
  13861. * @returns {Object} Returns the new object.
  13862. */
  13863. function basePickBy(object, paths, predicate) {
  13864. var index = -1,
  13865. length = paths.length,
  13866. result = {};
  13867. while (++index < length) {
  13868. var path = paths[index],
  13869. value = baseGet(object, path);
  13870. if (predicate(value, path)) {
  13871. baseSet(result, castPath(path, object), value);
  13872. }
  13873. }
  13874. return result;
  13875. }
  13876. /**
  13877. * A specialized version of `baseProperty` which supports deep paths.
  13878. *
  13879. * @private
  13880. * @param {Array|string} path The path of the property to get.
  13881. * @returns {Function} Returns the new accessor function.
  13882. */
  13883. function basePropertyDeep(path) {
  13884. return function(object) {
  13885. return baseGet(object, path);
  13886. };
  13887. }
  13888. /**
  13889. * The base implementation of `_.pullAllBy` without support for iteratee
  13890. * shorthands.
  13891. *
  13892. * @private
  13893. * @param {Array} array The array to modify.
  13894. * @param {Array} values The values to remove.
  13895. * @param {Function} [iteratee] The iteratee invoked per element.
  13896. * @param {Function} [comparator] The comparator invoked per element.
  13897. * @returns {Array} Returns `array`.
  13898. */
  13899. function basePullAll(array, values, iteratee, comparator) {
  13900. var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
  13901. index = -1,
  13902. length = values.length,
  13903. seen = array;
  13904. if (array === values) {
  13905. values = copyArray(values);
  13906. }
  13907. if (iteratee) {
  13908. seen = arrayMap(array, baseUnary(iteratee));
  13909. }
  13910. while (++index < length) {
  13911. var fromIndex = 0,
  13912. value = values[index],
  13913. computed = iteratee ? iteratee(value) : value;
  13914. while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
  13915. if (seen !== array) {
  13916. splice.call(seen, fromIndex, 1);
  13917. }
  13918. splice.call(array, fromIndex, 1);
  13919. }
  13920. }
  13921. return array;
  13922. }
  13923. /**
  13924. * The base implementation of `_.pullAt` without support for individual
  13925. * indexes or capturing the removed elements.
  13926. *
  13927. * @private
  13928. * @param {Array} array The array to modify.
  13929. * @param {number[]} indexes The indexes of elements to remove.
  13930. * @returns {Array} Returns `array`.
  13931. */
  13932. function basePullAt(array, indexes) {
  13933. var length = array ? indexes.length : 0,
  13934. lastIndex = length - 1;
  13935. while (length--) {
  13936. var index = indexes[length];
  13937. if (length == lastIndex || index !== previous) {
  13938. var previous = index;
  13939. if (isIndex(index)) {
  13940. splice.call(array, index, 1);
  13941. } else {
  13942. baseUnset(array, index);
  13943. }
  13944. }
  13945. }
  13946. return array;
  13947. }
  13948. /**
  13949. * The base implementation of `_.random` without support for returning
  13950. * floating-point numbers.
  13951. *
  13952. * @private
  13953. * @param {number} lower The lower bound.
  13954. * @param {number} upper The upper bound.
  13955. * @returns {number} Returns the random number.
  13956. */
  13957. function baseRandom(lower, upper) {
  13958. return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
  13959. }
  13960. /**
  13961. * The base implementation of `_.range` and `_.rangeRight` which doesn't
  13962. * coerce arguments.
  13963. *
  13964. * @private
  13965. * @param {number} start The start of the range.
  13966. * @param {number} end The end of the range.
  13967. * @param {number} step The value to increment or decrement by.
  13968. * @param {boolean} [fromRight] Specify iterating from right to left.
  13969. * @returns {Array} Returns the range of numbers.
  13970. */
  13971. function baseRange(start, end, step, fromRight) {
  13972. var index = -1,
  13973. length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
  13974. result = Array(length);
  13975. while (length--) {
  13976. result[fromRight ? length : ++index] = start;
  13977. start += step;
  13978. }
  13979. return result;
  13980. }
  13981. /**
  13982. * The base implementation of `_.repeat` which doesn't coerce arguments.
  13983. *
  13984. * @private
  13985. * @param {string} string The string to repeat.
  13986. * @param {number} n The number of times to repeat the string.
  13987. * @returns {string} Returns the repeated string.
  13988. */
  13989. function baseRepeat(string, n) {
  13990. var result = '';
  13991. if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
  13992. return result;
  13993. }
  13994. // Leverage the exponentiation by squaring algorithm for a faster repeat.
  13995. // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
  13996. do {
  13997. if (n % 2) {
  13998. result += string;
  13999. }
  14000. n = nativeFloor(n / 2);
  14001. if (n) {
  14002. string += string;
  14003. }
  14004. } while (n);
  14005. return result;
  14006. }
  14007. /**
  14008. * The base implementation of `_.rest` which doesn't validate or coerce arguments.
  14009. *
  14010. * @private
  14011. * @param {Function} func The function to apply a rest parameter to.
  14012. * @param {number} [start=func.length-1] The start position of the rest parameter.
  14013. * @returns {Function} Returns the new function.
  14014. */
  14015. function baseRest(func, start) {
  14016. return setToString(overRest(func, start, identity), func + '');
  14017. }
  14018. /**
  14019. * The base implementation of `_.sample`.
  14020. *
  14021. * @private
  14022. * @param {Array|Object} collection The collection to sample.
  14023. * @returns {*} Returns the random element.
  14024. */
  14025. function baseSample(collection) {
  14026. return arraySample(values(collection));
  14027. }
  14028. /**
  14029. * The base implementation of `_.sampleSize` without param guards.
  14030. *
  14031. * @private
  14032. * @param {Array|Object} collection The collection to sample.
  14033. * @param {number} n The number of elements to sample.
  14034. * @returns {Array} Returns the random elements.
  14035. */
  14036. function baseSampleSize(collection, n) {
  14037. var array = values(collection);
  14038. return shuffleSelf(array, baseClamp(n, 0, array.length));
  14039. }
  14040. /**
  14041. * The base implementation of `_.set`.
  14042. *
  14043. * @private
  14044. * @param {Object} object The object to modify.
  14045. * @param {Array|string} path The path of the property to set.
  14046. * @param {*} value The value to set.
  14047. * @param {Function} [customizer] The function to customize path creation.
  14048. * @returns {Object} Returns `object`.
  14049. */
  14050. function baseSet(object, path, value, customizer) {
  14051. if (!isObject(object)) {
  14052. return object;
  14053. }
  14054. path = castPath(path, object);
  14055. var index = -1,
  14056. length = path.length,
  14057. lastIndex = length - 1,
  14058. nested = object;
  14059. while (nested != null && ++index < length) {
  14060. var key = toKey(path[index]),
  14061. newValue = value;
  14062. if (index != lastIndex) {
  14063. var objValue = nested[key];
  14064. newValue = customizer ? customizer(objValue, key, nested) : undefined;
  14065. if (newValue === undefined) {
  14066. newValue = isObject(objValue)
  14067. ? objValue
  14068. : (isIndex(path[index + 1]) ? [] : {});
  14069. }
  14070. }
  14071. assignValue(nested, key, newValue);
  14072. nested = nested[key];
  14073. }
  14074. return object;
  14075. }
  14076. /**
  14077. * The base implementation of `setData` without support for hot loop shorting.
  14078. *
  14079. * @private
  14080. * @param {Function} func The function to associate metadata with.
  14081. * @param {*} data The metadata.
  14082. * @returns {Function} Returns `func`.
  14083. */
  14084. var baseSetData = !metaMap ? identity : function(func, data) {
  14085. metaMap.set(func, data);
  14086. return func;
  14087. };
  14088. /**
  14089. * The base implementation of `setToString` without support for hot loop shorting.
  14090. *
  14091. * @private
  14092. * @param {Function} func The function to modify.
  14093. * @param {Function} string The `toString` result.
  14094. * @returns {Function} Returns `func`.
  14095. */
  14096. var baseSetToString = !defineProperty ? identity : function(func, string) {
  14097. return defineProperty(func, 'toString', {
  14098. 'configurable': true,
  14099. 'enumerable': false,
  14100. 'value': constant(string),
  14101. 'writable': true
  14102. });
  14103. };
  14104. /**
  14105. * The base implementation of `_.shuffle`.
  14106. *
  14107. * @private
  14108. * @param {Array|Object} collection The collection to shuffle.
  14109. * @returns {Array} Returns the new shuffled array.
  14110. */
  14111. function baseShuffle(collection) {
  14112. return shuffleSelf(values(collection));
  14113. }
  14114. /**
  14115. * The base implementation of `_.slice` without an iteratee call guard.
  14116. *
  14117. * @private
  14118. * @param {Array} array The array to slice.
  14119. * @param {number} [start=0] The start position.
  14120. * @param {number} [end=array.length] The end position.
  14121. * @returns {Array} Returns the slice of `array`.
  14122. */
  14123. function baseSlice(array, start, end) {
  14124. var index = -1,
  14125. length = array.length;
  14126. if (start < 0) {
  14127. start = -start > length ? 0 : (length + start);
  14128. }
  14129. end = end > length ? length : end;
  14130. if (end < 0) {
  14131. end += length;
  14132. }
  14133. length = start > end ? 0 : ((end - start) >>> 0);
  14134. start >>>= 0;
  14135. var result = Array(length);
  14136. while (++index < length) {
  14137. result[index] = array[index + start];
  14138. }
  14139. return result;
  14140. }
  14141. /**
  14142. * The base implementation of `_.some` without support for iteratee shorthands.
  14143. *
  14144. * @private
  14145. * @param {Array|Object} collection The collection to iterate over.
  14146. * @param {Function} predicate The function invoked per iteration.
  14147. * @returns {boolean} Returns `true` if any element passes the predicate check,
  14148. * else `false`.
  14149. */
  14150. function baseSome(collection, predicate) {
  14151. var result;
  14152. baseEach(collection, function(value, index, collection) {
  14153. result = predicate(value, index, collection);
  14154. return !result;
  14155. });
  14156. return !!result;
  14157. }
  14158. /**
  14159. * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
  14160. * performs a binary search of `array` to determine the index at which `value`
  14161. * should be inserted into `array` in order to maintain its sort order.
  14162. *
  14163. * @private
  14164. * @param {Array} array The sorted array to inspect.
  14165. * @param {*} value The value to evaluate.
  14166. * @param {boolean} [retHighest] Specify returning the highest qualified index.
  14167. * @returns {number} Returns the index at which `value` should be inserted
  14168. * into `array`.
  14169. */
  14170. function baseSortedIndex(array, value, retHighest) {
  14171. var low = 0,
  14172. high = array == null ? low : array.length;
  14173. if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
  14174. while (low < high) {
  14175. var mid = (low + high) >>> 1,
  14176. computed = array[mid];
  14177. if (computed !== null && !isSymbol(computed) &&
  14178. (retHighest ? (computed <= value) : (computed < value))) {
  14179. low = mid + 1;
  14180. } else {
  14181. high = mid;
  14182. }
  14183. }
  14184. return high;
  14185. }
  14186. return baseSortedIndexBy(array, value, identity, retHighest);
  14187. }
  14188. /**
  14189. * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
  14190. * which invokes `iteratee` for `value` and each element of `array` to compute
  14191. * their sort ranking. The iteratee is invoked with one argument; (value).
  14192. *
  14193. * @private
  14194. * @param {Array} array The sorted array to inspect.
  14195. * @param {*} value The value to evaluate.
  14196. * @param {Function} iteratee The iteratee invoked per element.
  14197. * @param {boolean} [retHighest] Specify returning the highest qualified index.
  14198. * @returns {number} Returns the index at which `value` should be inserted
  14199. * into `array`.
  14200. */
  14201. function baseSortedIndexBy(array, value, iteratee, retHighest) {
  14202. value = iteratee(value);
  14203. var low = 0,
  14204. high = array == null ? 0 : array.length,
  14205. valIsNaN = value !== value,
  14206. valIsNull = value === null,
  14207. valIsSymbol = isSymbol(value),
  14208. valIsUndefined = value === undefined;
  14209. while (low < high) {
  14210. var mid = nativeFloor((low + high) / 2),
  14211. computed = iteratee(array[mid]),
  14212. othIsDefined = computed !== undefined,
  14213. othIsNull = computed === null,
  14214. othIsReflexive = computed === computed,
  14215. othIsSymbol = isSymbol(computed);
  14216. if (valIsNaN) {
  14217. var setLow = retHighest || othIsReflexive;
  14218. } else if (valIsUndefined) {
  14219. setLow = othIsReflexive && (retHighest || othIsDefined);
  14220. } else if (valIsNull) {
  14221. setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
  14222. } else if (valIsSymbol) {
  14223. setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
  14224. } else if (othIsNull || othIsSymbol) {
  14225. setLow = false;
  14226. } else {
  14227. setLow = retHighest ? (computed <= value) : (computed < value);
  14228. }
  14229. if (setLow) {
  14230. low = mid + 1;
  14231. } else {
  14232. high = mid;
  14233. }
  14234. }
  14235. return nativeMin(high, MAX_ARRAY_INDEX);
  14236. }
  14237. /**
  14238. * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
  14239. * support for iteratee shorthands.
  14240. *
  14241. * @private
  14242. * @param {Array} array The array to inspect.
  14243. * @param {Function} [iteratee] The iteratee invoked per element.
  14244. * @returns {Array} Returns the new duplicate free array.
  14245. */
  14246. function baseSortedUniq(array, iteratee) {
  14247. var index = -1,
  14248. length = array.length,
  14249. resIndex = 0,
  14250. result = [];
  14251. while (++index < length) {
  14252. var value = array[index],
  14253. computed = iteratee ? iteratee(value) : value;
  14254. if (!index || !eq(computed, seen)) {
  14255. var seen = computed;
  14256. result[resIndex++] = value === 0 ? 0 : value;
  14257. }
  14258. }
  14259. return result;
  14260. }
  14261. /**
  14262. * The base implementation of `_.toNumber` which doesn't ensure correct
  14263. * conversions of binary, hexadecimal, or octal string values.
  14264. *
  14265. * @private
  14266. * @param {*} value The value to process.
  14267. * @returns {number} Returns the number.
  14268. */
  14269. function baseToNumber(value) {
  14270. if (typeof value == 'number') {
  14271. return value;
  14272. }
  14273. if (isSymbol(value)) {
  14274. return NAN;
  14275. }
  14276. return +value;
  14277. }
  14278. /**
  14279. * The base implementation of `_.toString` which doesn't convert nullish
  14280. * values to empty strings.
  14281. *
  14282. * @private
  14283. * @param {*} value The value to process.
  14284. * @returns {string} Returns the string.
  14285. */
  14286. function baseToString(value) {
  14287. // Exit early for strings to avoid a performance hit in some environments.
  14288. if (typeof value == 'string') {
  14289. return value;
  14290. }
  14291. if (isArray(value)) {
  14292. // Recursively convert values (susceptible to call stack limits).
  14293. return arrayMap(value, baseToString) + '';
  14294. }
  14295. if (isSymbol(value)) {
  14296. return symbolToString ? symbolToString.call(value) : '';
  14297. }
  14298. var result = (value + '');
  14299. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  14300. }
  14301. /**
  14302. * The base implementation of `_.uniqBy` without support for iteratee shorthands.
  14303. *
  14304. * @private
  14305. * @param {Array} array The array to inspect.
  14306. * @param {Function} [iteratee] The iteratee invoked per element.
  14307. * @param {Function} [comparator] The comparator invoked per element.
  14308. * @returns {Array} Returns the new duplicate free array.
  14309. */
  14310. function baseUniq(array, iteratee, comparator) {
  14311. var index = -1,
  14312. includes = arrayIncludes,
  14313. length = array.length,
  14314. isCommon = true,
  14315. result = [],
  14316. seen = result;
  14317. if (comparator) {
  14318. isCommon = false;
  14319. includes = arrayIncludesWith;
  14320. }
  14321. else if (length >= LARGE_ARRAY_SIZE) {
  14322. var set = iteratee ? null : createSet(array);
  14323. if (set) {
  14324. return setToArray(set);
  14325. }
  14326. isCommon = false;
  14327. includes = cacheHas;
  14328. seen = new SetCache;
  14329. }
  14330. else {
  14331. seen = iteratee ? [] : result;
  14332. }
  14333. outer:
  14334. while (++index < length) {
  14335. var value = array[index],
  14336. computed = iteratee ? iteratee(value) : value;
  14337. value = (comparator || value !== 0) ? value : 0;
  14338. if (isCommon && computed === computed) {
  14339. var seenIndex = seen.length;
  14340. while (seenIndex--) {
  14341. if (seen[seenIndex] === computed) {
  14342. continue outer;
  14343. }
  14344. }
  14345. if (iteratee) {
  14346. seen.push(computed);
  14347. }
  14348. result.push(value);
  14349. }
  14350. else if (!includes(seen, computed, comparator)) {
  14351. if (seen !== result) {
  14352. seen.push(computed);
  14353. }
  14354. result.push(value);
  14355. }
  14356. }
  14357. return result;
  14358. }
  14359. /**
  14360. * The base implementation of `_.unset`.
  14361. *
  14362. * @private
  14363. * @param {Object} object The object to modify.
  14364. * @param {Array|string} path The property path to unset.
  14365. * @returns {boolean} Returns `true` if the property is deleted, else `false`.
  14366. */
  14367. function baseUnset(object, path) {
  14368. path = castPath(path, object);
  14369. object = parent(object, path);
  14370. return object == null || delete object[toKey(last(path))];
  14371. }
  14372. /**
  14373. * The base implementation of `_.update`.
  14374. *
  14375. * @private
  14376. * @param {Object} object The object to modify.
  14377. * @param {Array|string} path The path of the property to update.
  14378. * @param {Function} updater The function to produce the updated value.
  14379. * @param {Function} [customizer] The function to customize path creation.
  14380. * @returns {Object} Returns `object`.
  14381. */
  14382. function baseUpdate(object, path, updater, customizer) {
  14383. return baseSet(object, path, updater(baseGet(object, path)), customizer);
  14384. }
  14385. /**
  14386. * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
  14387. * without support for iteratee shorthands.
  14388. *
  14389. * @private
  14390. * @param {Array} array The array to query.
  14391. * @param {Function} predicate The function invoked per iteration.
  14392. * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
  14393. * @param {boolean} [fromRight] Specify iterating from right to left.
  14394. * @returns {Array} Returns the slice of `array`.
  14395. */
  14396. function baseWhile(array, predicate, isDrop, fromRight) {
  14397. var length = array.length,
  14398. index = fromRight ? length : -1;
  14399. while ((fromRight ? index-- : ++index < length) &&
  14400. predicate(array[index], index, array)) {}
  14401. return isDrop
  14402. ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
  14403. : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
  14404. }
  14405. /**
  14406. * The base implementation of `wrapperValue` which returns the result of
  14407. * performing a sequence of actions on the unwrapped `value`, where each
  14408. * successive action is supplied the return value of the previous.
  14409. *
  14410. * @private
  14411. * @param {*} value The unwrapped value.
  14412. * @param {Array} actions Actions to perform to resolve the unwrapped value.
  14413. * @returns {*} Returns the resolved value.
  14414. */
  14415. function baseWrapperValue(value, actions) {
  14416. var result = value;
  14417. if (result instanceof LazyWrapper) {
  14418. result = result.value();
  14419. }
  14420. return arrayReduce(actions, function(result, action) {
  14421. return action.func.apply(action.thisArg, arrayPush([result], action.args));
  14422. }, result);
  14423. }
  14424. /**
  14425. * The base implementation of methods like `_.xor`, without support for
  14426. * iteratee shorthands, that accepts an array of arrays to inspect.
  14427. *
  14428. * @private
  14429. * @param {Array} arrays The arrays to inspect.
  14430. * @param {Function} [iteratee] The iteratee invoked per element.
  14431. * @param {Function} [comparator] The comparator invoked per element.
  14432. * @returns {Array} Returns the new array of values.
  14433. */
  14434. function baseXor(arrays, iteratee, comparator) {
  14435. var length = arrays.length;
  14436. if (length < 2) {
  14437. return length ? baseUniq(arrays[0]) : [];
  14438. }
  14439. var index = -1,
  14440. result = Array(length);
  14441. while (++index < length) {
  14442. var array = arrays[index],
  14443. othIndex = -1;
  14444. while (++othIndex < length) {
  14445. if (othIndex != index) {
  14446. result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
  14447. }
  14448. }
  14449. }
  14450. return baseUniq(baseFlatten(result, 1), iteratee, comparator);
  14451. }
  14452. /**
  14453. * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
  14454. *
  14455. * @private
  14456. * @param {Array} props The property identifiers.
  14457. * @param {Array} values The property values.
  14458. * @param {Function} assignFunc The function to assign values.
  14459. * @returns {Object} Returns the new object.
  14460. */
  14461. function baseZipObject(props, values, assignFunc) {
  14462. var index = -1,
  14463. length = props.length,
  14464. valsLength = values.length,
  14465. result = {};
  14466. while (++index < length) {
  14467. var value = index < valsLength ? values[index] : undefined;
  14468. assignFunc(result, props[index], value);
  14469. }
  14470. return result;
  14471. }
  14472. /**
  14473. * Casts `value` to an empty array if it's not an array like object.
  14474. *
  14475. * @private
  14476. * @param {*} value The value to inspect.
  14477. * @returns {Array|Object} Returns the cast array-like object.
  14478. */
  14479. function castArrayLikeObject(value) {
  14480. return isArrayLikeObject(value) ? value : [];
  14481. }
  14482. /**
  14483. * Casts `value` to `identity` if it's not a function.
  14484. *
  14485. * @private
  14486. * @param {*} value The value to inspect.
  14487. * @returns {Function} Returns cast function.
  14488. */
  14489. function castFunction(value) {
  14490. return typeof value == 'function' ? value : identity;
  14491. }
  14492. /**
  14493. * Casts `value` to a path array if it's not one.
  14494. *
  14495. * @private
  14496. * @param {*} value The value to inspect.
  14497. * @param {Object} [object] The object to query keys on.
  14498. * @returns {Array} Returns the cast property path array.
  14499. */
  14500. function castPath(value, object) {
  14501. if (isArray(value)) {
  14502. return value;
  14503. }
  14504. return isKey(value, object) ? [value] : stringToPath(toString(value));
  14505. }
  14506. /**
  14507. * A `baseRest` alias which can be replaced with `identity` by module
  14508. * replacement plugins.
  14509. *
  14510. * @private
  14511. * @type {Function}
  14512. * @param {Function} func The function to apply a rest parameter to.
  14513. * @returns {Function} Returns the new function.
  14514. */
  14515. var castRest = baseRest;
  14516. /**
  14517. * Casts `array` to a slice if it's needed.
  14518. *
  14519. * @private
  14520. * @param {Array} array The array to inspect.
  14521. * @param {number} start The start position.
  14522. * @param {number} [end=array.length] The end position.
  14523. * @returns {Array} Returns the cast slice.
  14524. */
  14525. function castSlice(array, start, end) {
  14526. var length = array.length;
  14527. end = end === undefined ? length : end;
  14528. return (!start && end >= length) ? array : baseSlice(array, start, end);
  14529. }
  14530. /**
  14531. * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
  14532. *
  14533. * @private
  14534. * @param {number|Object} id The timer id or timeout object of the timer to clear.
  14535. */
  14536. var clearTimeout = ctxClearTimeout || function(id) {
  14537. return root.clearTimeout(id);
  14538. };
  14539. /**
  14540. * Creates a clone of `buffer`.
  14541. *
  14542. * @private
  14543. * @param {Buffer} buffer The buffer to clone.
  14544. * @param {boolean} [isDeep] Specify a deep clone.
  14545. * @returns {Buffer} Returns the cloned buffer.
  14546. */
  14547. function cloneBuffer(buffer, isDeep) {
  14548. if (isDeep) {
  14549. return buffer.slice();
  14550. }
  14551. var length = buffer.length,
  14552. result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
  14553. buffer.copy(result);
  14554. return result;
  14555. }
  14556. /**
  14557. * Creates a clone of `arrayBuffer`.
  14558. *
  14559. * @private
  14560. * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
  14561. * @returns {ArrayBuffer} Returns the cloned array buffer.
  14562. */
  14563. function cloneArrayBuffer(arrayBuffer) {
  14564. var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
  14565. new Uint8Array(result).set(new Uint8Array(arrayBuffer));
  14566. return result;
  14567. }
  14568. /**
  14569. * Creates a clone of `dataView`.
  14570. *
  14571. * @private
  14572. * @param {Object} dataView The data view to clone.
  14573. * @param {boolean} [isDeep] Specify a deep clone.
  14574. * @returns {Object} Returns the cloned data view.
  14575. */
  14576. function cloneDataView(dataView, isDeep) {
  14577. var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
  14578. return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
  14579. }
  14580. /**
  14581. * Creates a clone of `map`.
  14582. *
  14583. * @private
  14584. * @param {Object} map The map to clone.
  14585. * @param {Function} cloneFunc The function to clone values.
  14586. * @param {boolean} [isDeep] Specify a deep clone.
  14587. * @returns {Object} Returns the cloned map.
  14588. */
  14589. function cloneMap(map, isDeep, cloneFunc) {
  14590. var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);
  14591. return arrayReduce(array, addMapEntry, new map.constructor);
  14592. }
  14593. /**
  14594. * Creates a clone of `regexp`.
  14595. *
  14596. * @private
  14597. * @param {Object} regexp The regexp to clone.
  14598. * @returns {Object} Returns the cloned regexp.
  14599. */
  14600. function cloneRegExp(regexp) {
  14601. var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
  14602. result.lastIndex = regexp.lastIndex;
  14603. return result;
  14604. }
  14605. /**
  14606. * Creates a clone of `set`.
  14607. *
  14608. * @private
  14609. * @param {Object} set The set to clone.
  14610. * @param {Function} cloneFunc The function to clone values.
  14611. * @param {boolean} [isDeep] Specify a deep clone.
  14612. * @returns {Object} Returns the cloned set.
  14613. */
  14614. function cloneSet(set, isDeep, cloneFunc) {
  14615. var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);
  14616. return arrayReduce(array, addSetEntry, new set.constructor);
  14617. }
  14618. /**
  14619. * Creates a clone of the `symbol` object.
  14620. *
  14621. * @private
  14622. * @param {Object} symbol The symbol object to clone.
  14623. * @returns {Object} Returns the cloned symbol object.
  14624. */
  14625. function cloneSymbol(symbol) {
  14626. return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
  14627. }
  14628. /**
  14629. * Creates a clone of `typedArray`.
  14630. *
  14631. * @private
  14632. * @param {Object} typedArray The typed array to clone.
  14633. * @param {boolean} [isDeep] Specify a deep clone.
  14634. * @returns {Object} Returns the cloned typed array.
  14635. */
  14636. function cloneTypedArray(typedArray, isDeep) {
  14637. var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
  14638. return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
  14639. }
  14640. /**
  14641. * Compares values to sort them in ascending order.
  14642. *
  14643. * @private
  14644. * @param {*} value The value to compare.
  14645. * @param {*} other The other value to compare.
  14646. * @returns {number} Returns the sort order indicator for `value`.
  14647. */
  14648. function compareAscending(value, other) {
  14649. if (value !== other) {
  14650. var valIsDefined = value !== undefined,
  14651. valIsNull = value === null,
  14652. valIsReflexive = value === value,
  14653. valIsSymbol = isSymbol(value);
  14654. var othIsDefined = other !== undefined,
  14655. othIsNull = other === null,
  14656. othIsReflexive = other === other,
  14657. othIsSymbol = isSymbol(other);
  14658. if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
  14659. (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
  14660. (valIsNull && othIsDefined && othIsReflexive) ||
  14661. (!valIsDefined && othIsReflexive) ||
  14662. !valIsReflexive) {
  14663. return 1;
  14664. }
  14665. if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
  14666. (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
  14667. (othIsNull && valIsDefined && valIsReflexive) ||
  14668. (!othIsDefined && valIsReflexive) ||
  14669. !othIsReflexive) {
  14670. return -1;
  14671. }
  14672. }
  14673. return 0;
  14674. }
  14675. /**
  14676. * Used by `_.orderBy` to compare multiple properties of a value to another
  14677. * and stable sort them.
  14678. *
  14679. * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
  14680. * specify an order of "desc" for descending or "asc" for ascending sort order
  14681. * of corresponding values.
  14682. *
  14683. * @private
  14684. * @param {Object} object The object to compare.
  14685. * @param {Object} other The other object to compare.
  14686. * @param {boolean[]|string[]} orders The order to sort by for each property.
  14687. * @returns {number} Returns the sort order indicator for `object`.
  14688. */
  14689. function compareMultiple(object, other, orders) {
  14690. var index = -1,
  14691. objCriteria = object.criteria,
  14692. othCriteria = other.criteria,
  14693. length = objCriteria.length,
  14694. ordersLength = orders.length;
  14695. while (++index < length) {
  14696. var result = compareAscending(objCriteria[index], othCriteria[index]);
  14697. if (result) {
  14698. if (index >= ordersLength) {
  14699. return result;
  14700. }
  14701. var order = orders[index];
  14702. return result * (order == 'desc' ? -1 : 1);
  14703. }
  14704. }
  14705. // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
  14706. // that causes it, under certain circumstances, to provide the same value for
  14707. // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
  14708. // for more details.
  14709. //
  14710. // This also ensures a stable sort in V8 and other engines.
  14711. // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
  14712. return object.index - other.index;
  14713. }
  14714. /**
  14715. * Creates an array that is the composition of partially applied arguments,
  14716. * placeholders, and provided arguments into a single array of arguments.
  14717. *
  14718. * @private
  14719. * @param {Array} args The provided arguments.
  14720. * @param {Array} partials The arguments to prepend to those provided.
  14721. * @param {Array} holders The `partials` placeholder indexes.
  14722. * @params {boolean} [isCurried] Specify composing for a curried function.
  14723. * @returns {Array} Returns the new array of composed arguments.
  14724. */
  14725. function composeArgs(args, partials, holders, isCurried) {
  14726. var argsIndex = -1,
  14727. argsLength = args.length,
  14728. holdersLength = holders.length,
  14729. leftIndex = -1,
  14730. leftLength = partials.length,
  14731. rangeLength = nativeMax(argsLength - holdersLength, 0),
  14732. result = Array(leftLength + rangeLength),
  14733. isUncurried = !isCurried;
  14734. while (++leftIndex < leftLength) {
  14735. result[leftIndex] = partials[leftIndex];
  14736. }
  14737. while (++argsIndex < holdersLength) {
  14738. if (isUncurried || argsIndex < argsLength) {
  14739. result[holders[argsIndex]] = args[argsIndex];
  14740. }
  14741. }
  14742. while (rangeLength--) {
  14743. result[leftIndex++] = args[argsIndex++];
  14744. }
  14745. return result;
  14746. }
  14747. /**
  14748. * This function is like `composeArgs` except that the arguments composition
  14749. * is tailored for `_.partialRight`.
  14750. *
  14751. * @private
  14752. * @param {Array} args The provided arguments.
  14753. * @param {Array} partials The arguments to append to those provided.
  14754. * @param {Array} holders The `partials` placeholder indexes.
  14755. * @params {boolean} [isCurried] Specify composing for a curried function.
  14756. * @returns {Array} Returns the new array of composed arguments.
  14757. */
  14758. function composeArgsRight(args, partials, holders, isCurried) {
  14759. var argsIndex = -1,
  14760. argsLength = args.length,
  14761. holdersIndex = -1,
  14762. holdersLength = holders.length,
  14763. rightIndex = -1,
  14764. rightLength = partials.length,
  14765. rangeLength = nativeMax(argsLength - holdersLength, 0),
  14766. result = Array(rangeLength + rightLength),
  14767. isUncurried = !isCurried;
  14768. while (++argsIndex < rangeLength) {
  14769. result[argsIndex] = args[argsIndex];
  14770. }
  14771. var offset = argsIndex;
  14772. while (++rightIndex < rightLength) {
  14773. result[offset + rightIndex] = partials[rightIndex];
  14774. }
  14775. while (++holdersIndex < holdersLength) {
  14776. if (isUncurried || argsIndex < argsLength) {
  14777. result[offset + holders[holdersIndex]] = args[argsIndex++];
  14778. }
  14779. }
  14780. return result;
  14781. }
  14782. /**
  14783. * Copies the values of `source` to `array`.
  14784. *
  14785. * @private
  14786. * @param {Array} source The array to copy values from.
  14787. * @param {Array} [array=[]] The array to copy values to.
  14788. * @returns {Array} Returns `array`.
  14789. */
  14790. function copyArray(source, array) {
  14791. var index = -1,
  14792. length = source.length;
  14793. array || (array = Array(length));
  14794. while (++index < length) {
  14795. array[index] = source[index];
  14796. }
  14797. return array;
  14798. }
  14799. /**
  14800. * Copies properties of `source` to `object`.
  14801. *
  14802. * @private
  14803. * @param {Object} source The object to copy properties from.
  14804. * @param {Array} props The property identifiers to copy.
  14805. * @param {Object} [object={}] The object to copy properties to.
  14806. * @param {Function} [customizer] The function to customize copied values.
  14807. * @returns {Object} Returns `object`.
  14808. */
  14809. function copyObject(source, props, object, customizer) {
  14810. var isNew = !object;
  14811. object || (object = {});
  14812. var index = -1,
  14813. length = props.length;
  14814. while (++index < length) {
  14815. var key = props[index];
  14816. var newValue = customizer
  14817. ? customizer(object[key], source[key], key, object, source)
  14818. : undefined;
  14819. if (newValue === undefined) {
  14820. newValue = source[key];
  14821. }
  14822. if (isNew) {
  14823. baseAssignValue(object, key, newValue);
  14824. } else {
  14825. assignValue(object, key, newValue);
  14826. }
  14827. }
  14828. return object;
  14829. }
  14830. /**
  14831. * Copies own symbols of `source` to `object`.
  14832. *
  14833. * @private
  14834. * @param {Object} source The object to copy symbols from.
  14835. * @param {Object} [object={}] The object to copy symbols to.
  14836. * @returns {Object} Returns `object`.
  14837. */
  14838. function copySymbols(source, object) {
  14839. return copyObject(source, getSymbols(source), object);
  14840. }
  14841. /**
  14842. * Copies own and inherited symbols of `source` to `object`.
  14843. *
  14844. * @private
  14845. * @param {Object} source The object to copy symbols from.
  14846. * @param {Object} [object={}] The object to copy symbols to.
  14847. * @returns {Object} Returns `object`.
  14848. */
  14849. function copySymbolsIn(source, object) {
  14850. return copyObject(source, getSymbolsIn(source), object);
  14851. }
  14852. /**
  14853. * Creates a function like `_.groupBy`.
  14854. *
  14855. * @private
  14856. * @param {Function} setter The function to set accumulator values.
  14857. * @param {Function} [initializer] The accumulator object initializer.
  14858. * @returns {Function} Returns the new aggregator function.
  14859. */
  14860. function createAggregator(setter, initializer) {
  14861. return function(collection, iteratee) {
  14862. var func = isArray(collection) ? arrayAggregator : baseAggregator,
  14863. accumulator = initializer ? initializer() : {};
  14864. return func(collection, setter, getIteratee(iteratee, 2), accumulator);
  14865. };
  14866. }
  14867. /**
  14868. * Creates a function like `_.assign`.
  14869. *
  14870. * @private
  14871. * @param {Function} assigner The function to assign values.
  14872. * @returns {Function} Returns the new assigner function.
  14873. */
  14874. function createAssigner(assigner) {
  14875. return baseRest(function(object, sources) {
  14876. var index = -1,
  14877. length = sources.length,
  14878. customizer = length > 1 ? sources[length - 1] : undefined,
  14879. guard = length > 2 ? sources[2] : undefined;
  14880. customizer = (assigner.length > 3 && typeof customizer == 'function')
  14881. ? (length--, customizer)
  14882. : undefined;
  14883. if (guard && isIterateeCall(sources[0], sources[1], guard)) {
  14884. customizer = length < 3 ? undefined : customizer;
  14885. length = 1;
  14886. }
  14887. object = Object(object);
  14888. while (++index < length) {
  14889. var source = sources[index];
  14890. if (source) {
  14891. assigner(object, source, index, customizer);
  14892. }
  14893. }
  14894. return object;
  14895. });
  14896. }
  14897. /**
  14898. * Creates a `baseEach` or `baseEachRight` function.
  14899. *
  14900. * @private
  14901. * @param {Function} eachFunc The function to iterate over a collection.
  14902. * @param {boolean} [fromRight] Specify iterating from right to left.
  14903. * @returns {Function} Returns the new base function.
  14904. */
  14905. function createBaseEach(eachFunc, fromRight) {
  14906. return function(collection, iteratee) {
  14907. if (collection == null) {
  14908. return collection;
  14909. }
  14910. if (!isArrayLike(collection)) {
  14911. return eachFunc(collection, iteratee);
  14912. }
  14913. var length = collection.length,
  14914. index = fromRight ? length : -1,
  14915. iterable = Object(collection);
  14916. while ((fromRight ? index-- : ++index < length)) {
  14917. if (iteratee(iterable[index], index, iterable) === false) {
  14918. break;
  14919. }
  14920. }
  14921. return collection;
  14922. };
  14923. }
  14924. /**
  14925. * Creates a base function for methods like `_.forIn` and `_.forOwn`.
  14926. *
  14927. * @private
  14928. * @param {boolean} [fromRight] Specify iterating from right to left.
  14929. * @returns {Function} Returns the new base function.
  14930. */
  14931. function createBaseFor(fromRight) {
  14932. return function(object, iteratee, keysFunc) {
  14933. var index = -1,
  14934. iterable = Object(object),
  14935. props = keysFunc(object),
  14936. length = props.length;
  14937. while (length--) {
  14938. var key = props[fromRight ? length : ++index];
  14939. if (iteratee(iterable[key], key, iterable) === false) {
  14940. break;
  14941. }
  14942. }
  14943. return object;
  14944. };
  14945. }
  14946. /**
  14947. * Creates a function that wraps `func` to invoke it with the optional `this`
  14948. * binding of `thisArg`.
  14949. *
  14950. * @private
  14951. * @param {Function} func The function to wrap.
  14952. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  14953. * @param {*} [thisArg] The `this` binding of `func`.
  14954. * @returns {Function} Returns the new wrapped function.
  14955. */
  14956. function createBind(func, bitmask, thisArg) {
  14957. var isBind = bitmask & WRAP_BIND_FLAG,
  14958. Ctor = createCtor(func);
  14959. function wrapper() {
  14960. var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
  14961. return fn.apply(isBind ? thisArg : this, arguments);
  14962. }
  14963. return wrapper;
  14964. }
  14965. /**
  14966. * Creates a function like `_.lowerFirst`.
  14967. *
  14968. * @private
  14969. * @param {string} methodName The name of the `String` case method to use.
  14970. * @returns {Function} Returns the new case function.
  14971. */
  14972. function createCaseFirst(methodName) {
  14973. return function(string) {
  14974. string = toString(string);
  14975. var strSymbols = hasUnicode(string)
  14976. ? stringToArray(string)
  14977. : undefined;
  14978. var chr = strSymbols
  14979. ? strSymbols[0]
  14980. : string.charAt(0);
  14981. var trailing = strSymbols
  14982. ? castSlice(strSymbols, 1).join('')
  14983. : string.slice(1);
  14984. return chr[methodName]() + trailing;
  14985. };
  14986. }
  14987. /**
  14988. * Creates a function like `_.camelCase`.
  14989. *
  14990. * @private
  14991. * @param {Function} callback The function to combine each word.
  14992. * @returns {Function} Returns the new compounder function.
  14993. */
  14994. function createCompounder(callback) {
  14995. return function(string) {
  14996. return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
  14997. };
  14998. }
  14999. /**
  15000. * Creates a function that produces an instance of `Ctor` regardless of
  15001. * whether it was invoked as part of a `new` expression or by `call` or `apply`.
  15002. *
  15003. * @private
  15004. * @param {Function} Ctor The constructor to wrap.
  15005. * @returns {Function} Returns the new wrapped function.
  15006. */
  15007. function createCtor(Ctor) {
  15008. return function() {
  15009. // Use a `switch` statement to work with class constructors. See
  15010. // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
  15011. // for more details.
  15012. var args = arguments;
  15013. switch (args.length) {
  15014. case 0: return new Ctor;
  15015. case 1: return new Ctor(args[0]);
  15016. case 2: return new Ctor(args[0], args[1]);
  15017. case 3: return new Ctor(args[0], args[1], args[2]);
  15018. case 4: return new Ctor(args[0], args[1], args[2], args[3]);
  15019. case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
  15020. case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
  15021. case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
  15022. }
  15023. var thisBinding = baseCreate(Ctor.prototype),
  15024. result = Ctor.apply(thisBinding, args);
  15025. // Mimic the constructor's `return` behavior.
  15026. // See https://es5.github.io/#x13.2.2 for more details.
  15027. return isObject(result) ? result : thisBinding;
  15028. };
  15029. }
  15030. /**
  15031. * Creates a function that wraps `func` to enable currying.
  15032. *
  15033. * @private
  15034. * @param {Function} func The function to wrap.
  15035. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  15036. * @param {number} arity The arity of `func`.
  15037. * @returns {Function} Returns the new wrapped function.
  15038. */
  15039. function createCurry(func, bitmask, arity) {
  15040. var Ctor = createCtor(func);
  15041. function wrapper() {
  15042. var length = arguments.length,
  15043. args = Array(length),
  15044. index = length,
  15045. placeholder = getHolder(wrapper);
  15046. while (index--) {
  15047. args[index] = arguments[index];
  15048. }
  15049. var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
  15050. ? []
  15051. : replaceHolders(args, placeholder);
  15052. length -= holders.length;
  15053. if (length < arity) {
  15054. return createRecurry(
  15055. func, bitmask, createHybrid, wrapper.placeholder, undefined,
  15056. args, holders, undefined, undefined, arity - length);
  15057. }
  15058. var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
  15059. return apply(fn, this, args);
  15060. }
  15061. return wrapper;
  15062. }
  15063. /**
  15064. * Creates a `_.find` or `_.findLast` function.
  15065. *
  15066. * @private
  15067. * @param {Function} findIndexFunc The function to find the collection index.
  15068. * @returns {Function} Returns the new find function.
  15069. */
  15070. function createFind(findIndexFunc) {
  15071. return function(collection, predicate, fromIndex) {
  15072. var iterable = Object(collection);
  15073. if (!isArrayLike(collection)) {
  15074. var iteratee = getIteratee(predicate, 3);
  15075. collection = keys(collection);
  15076. predicate = function(key) { return iteratee(iterable[key], key, iterable); };
  15077. }
  15078. var index = findIndexFunc(collection, predicate, fromIndex);
  15079. return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
  15080. };
  15081. }
  15082. /**
  15083. * Creates a `_.flow` or `_.flowRight` function.
  15084. *
  15085. * @private
  15086. * @param {boolean} [fromRight] Specify iterating from right to left.
  15087. * @returns {Function} Returns the new flow function.
  15088. */
  15089. function createFlow(fromRight) {
  15090. return flatRest(function(funcs) {
  15091. var length = funcs.length,
  15092. index = length,
  15093. prereq = LodashWrapper.prototype.thru;
  15094. if (fromRight) {
  15095. funcs.reverse();
  15096. }
  15097. while (index--) {
  15098. var func = funcs[index];
  15099. if (typeof func != 'function') {
  15100. throw new TypeError(FUNC_ERROR_TEXT);
  15101. }
  15102. if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
  15103. var wrapper = new LodashWrapper([], true);
  15104. }
  15105. }
  15106. index = wrapper ? index : length;
  15107. while (++index < length) {
  15108. func = funcs[index];
  15109. var funcName = getFuncName(func),
  15110. data = funcName == 'wrapper' ? getData(func) : undefined;
  15111. if (data && isLaziable(data[0]) &&
  15112. data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
  15113. !data[4].length && data[9] == 1
  15114. ) {
  15115. wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
  15116. } else {
  15117. wrapper = (func.length == 1 && isLaziable(func))
  15118. ? wrapper[funcName]()
  15119. : wrapper.thru(func);
  15120. }
  15121. }
  15122. return function() {
  15123. var args = arguments,
  15124. value = args[0];
  15125. if (wrapper && args.length == 1 && isArray(value)) {
  15126. return wrapper.plant(value).value();
  15127. }
  15128. var index = 0,
  15129. result = length ? funcs[index].apply(this, args) : value;
  15130. while (++index < length) {
  15131. result = funcs[index].call(this, result);
  15132. }
  15133. return result;
  15134. };
  15135. });
  15136. }
  15137. /**
  15138. * Creates a function that wraps `func` to invoke it with optional `this`
  15139. * binding of `thisArg`, partial application, and currying.
  15140. *
  15141. * @private
  15142. * @param {Function|string} func The function or method name to wrap.
  15143. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  15144. * @param {*} [thisArg] The `this` binding of `func`.
  15145. * @param {Array} [partials] The arguments to prepend to those provided to
  15146. * the new function.
  15147. * @param {Array} [holders] The `partials` placeholder indexes.
  15148. * @param {Array} [partialsRight] The arguments to append to those provided
  15149. * to the new function.
  15150. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
  15151. * @param {Array} [argPos] The argument positions of the new function.
  15152. * @param {number} [ary] The arity cap of `func`.
  15153. * @param {number} [arity] The arity of `func`.
  15154. * @returns {Function} Returns the new wrapped function.
  15155. */
  15156. function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
  15157. var isAry = bitmask & WRAP_ARY_FLAG,
  15158. isBind = bitmask & WRAP_BIND_FLAG,
  15159. isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
  15160. isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
  15161. isFlip = bitmask & WRAP_FLIP_FLAG,
  15162. Ctor = isBindKey ? undefined : createCtor(func);
  15163. function wrapper() {
  15164. var length = arguments.length,
  15165. args = Array(length),
  15166. index = length;
  15167. while (index--) {
  15168. args[index] = arguments[index];
  15169. }
  15170. if (isCurried) {
  15171. var placeholder = getHolder(wrapper),
  15172. holdersCount = countHolders(args, placeholder);
  15173. }
  15174. if (partials) {
  15175. args = composeArgs(args, partials, holders, isCurried);
  15176. }
  15177. if (partialsRight) {
  15178. args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
  15179. }
  15180. length -= holdersCount;
  15181. if (isCurried && length < arity) {
  15182. var newHolders = replaceHolders(args, placeholder);
  15183. return createRecurry(
  15184. func, bitmask, createHybrid, wrapper.placeholder, thisArg,
  15185. args, newHolders, argPos, ary, arity - length
  15186. );
  15187. }
  15188. var thisBinding = isBind ? thisArg : this,
  15189. fn = isBindKey ? thisBinding[func] : func;
  15190. length = args.length;
  15191. if (argPos) {
  15192. args = reorder(args, argPos);
  15193. } else if (isFlip && length > 1) {
  15194. args.reverse();
  15195. }
  15196. if (isAry && ary < length) {
  15197. args.length = ary;
  15198. }
  15199. if (this && this !== root && this instanceof wrapper) {
  15200. fn = Ctor || createCtor(fn);
  15201. }
  15202. return fn.apply(thisBinding, args);
  15203. }
  15204. return wrapper;
  15205. }
  15206. /**
  15207. * Creates a function like `_.invertBy`.
  15208. *
  15209. * @private
  15210. * @param {Function} setter The function to set accumulator values.
  15211. * @param {Function} toIteratee The function to resolve iteratees.
  15212. * @returns {Function} Returns the new inverter function.
  15213. */
  15214. function createInverter(setter, toIteratee) {
  15215. return function(object, iteratee) {
  15216. return baseInverter(object, setter, toIteratee(iteratee), {});
  15217. };
  15218. }
  15219. /**
  15220. * Creates a function that performs a mathematical operation on two values.
  15221. *
  15222. * @private
  15223. * @param {Function} operator The function to perform the operation.
  15224. * @param {number} [defaultValue] The value used for `undefined` arguments.
  15225. * @returns {Function} Returns the new mathematical operation function.
  15226. */
  15227. function createMathOperation(operator, defaultValue) {
  15228. return function(value, other) {
  15229. var result;
  15230. if (value === undefined && other === undefined) {
  15231. return defaultValue;
  15232. }
  15233. if (value !== undefined) {
  15234. result = value;
  15235. }
  15236. if (other !== undefined) {
  15237. if (result === undefined) {
  15238. return other;
  15239. }
  15240. if (typeof value == 'string' || typeof other == 'string') {
  15241. value = baseToString(value);
  15242. other = baseToString(other);
  15243. } else {
  15244. value = baseToNumber(value);
  15245. other = baseToNumber(other);
  15246. }
  15247. result = operator(value, other);
  15248. }
  15249. return result;
  15250. };
  15251. }
  15252. /**
  15253. * Creates a function like `_.over`.
  15254. *
  15255. * @private
  15256. * @param {Function} arrayFunc The function to iterate over iteratees.
  15257. * @returns {Function} Returns the new over function.
  15258. */
  15259. function createOver(arrayFunc) {
  15260. return flatRest(function(iteratees) {
  15261. iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
  15262. return baseRest(function(args) {
  15263. var thisArg = this;
  15264. return arrayFunc(iteratees, function(iteratee) {
  15265. return apply(iteratee, thisArg, args);
  15266. });
  15267. });
  15268. });
  15269. }
  15270. /**
  15271. * Creates the padding for `string` based on `length`. The `chars` string
  15272. * is truncated if the number of characters exceeds `length`.
  15273. *
  15274. * @private
  15275. * @param {number} length The padding length.
  15276. * @param {string} [chars=' '] The string used as padding.
  15277. * @returns {string} Returns the padding for `string`.
  15278. */
  15279. function createPadding(length, chars) {
  15280. chars = chars === undefined ? ' ' : baseToString(chars);
  15281. var charsLength = chars.length;
  15282. if (charsLength < 2) {
  15283. return charsLength ? baseRepeat(chars, length) : chars;
  15284. }
  15285. var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
  15286. return hasUnicode(chars)
  15287. ? castSlice(stringToArray(result), 0, length).join('')
  15288. : result.slice(0, length);
  15289. }
  15290. /**
  15291. * Creates a function that wraps `func` to invoke it with the `this` binding
  15292. * of `thisArg` and `partials` prepended to the arguments it receives.
  15293. *
  15294. * @private
  15295. * @param {Function} func The function to wrap.
  15296. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  15297. * @param {*} thisArg The `this` binding of `func`.
  15298. * @param {Array} partials The arguments to prepend to those provided to
  15299. * the new function.
  15300. * @returns {Function} Returns the new wrapped function.
  15301. */
  15302. function createPartial(func, bitmask, thisArg, partials) {
  15303. var isBind = bitmask & WRAP_BIND_FLAG,
  15304. Ctor = createCtor(func);
  15305. function wrapper() {
  15306. var argsIndex = -1,
  15307. argsLength = arguments.length,
  15308. leftIndex = -1,
  15309. leftLength = partials.length,
  15310. args = Array(leftLength + argsLength),
  15311. fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
  15312. while (++leftIndex < leftLength) {
  15313. args[leftIndex] = partials[leftIndex];
  15314. }
  15315. while (argsLength--) {
  15316. args[leftIndex++] = arguments[++argsIndex];
  15317. }
  15318. return apply(fn, isBind ? thisArg : this, args);
  15319. }
  15320. return wrapper;
  15321. }
  15322. /**
  15323. * Creates a `_.range` or `_.rangeRight` function.
  15324. *
  15325. * @private
  15326. * @param {boolean} [fromRight] Specify iterating from right to left.
  15327. * @returns {Function} Returns the new range function.
  15328. */
  15329. function createRange(fromRight) {
  15330. return function(start, end, step) {
  15331. if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
  15332. end = step = undefined;
  15333. }
  15334. // Ensure the sign of `-0` is preserved.
  15335. start = toFinite(start);
  15336. if (end === undefined) {
  15337. end = start;
  15338. start = 0;
  15339. } else {
  15340. end = toFinite(end);
  15341. }
  15342. step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
  15343. return baseRange(start, end, step, fromRight);
  15344. };
  15345. }
  15346. /**
  15347. * Creates a function that performs a relational operation on two values.
  15348. *
  15349. * @private
  15350. * @param {Function} operator The function to perform the operation.
  15351. * @returns {Function} Returns the new relational operation function.
  15352. */
  15353. function createRelationalOperation(operator) {
  15354. return function(value, other) {
  15355. if (!(typeof value == 'string' && typeof other == 'string')) {
  15356. value = toNumber(value);
  15357. other = toNumber(other);
  15358. }
  15359. return operator(value, other);
  15360. };
  15361. }
  15362. /**
  15363. * Creates a function that wraps `func` to continue currying.
  15364. *
  15365. * @private
  15366. * @param {Function} func The function to wrap.
  15367. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  15368. * @param {Function} wrapFunc The function to create the `func` wrapper.
  15369. * @param {*} placeholder The placeholder value.
  15370. * @param {*} [thisArg] The `this` binding of `func`.
  15371. * @param {Array} [partials] The arguments to prepend to those provided to
  15372. * the new function.
  15373. * @param {Array} [holders] The `partials` placeholder indexes.
  15374. * @param {Array} [argPos] The argument positions of the new function.
  15375. * @param {number} [ary] The arity cap of `func`.
  15376. * @param {number} [arity] The arity of `func`.
  15377. * @returns {Function} Returns the new wrapped function.
  15378. */
  15379. function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
  15380. var isCurry = bitmask & WRAP_CURRY_FLAG,
  15381. newHolders = isCurry ? holders : undefined,
  15382. newHoldersRight = isCurry ? undefined : holders,
  15383. newPartials = isCurry ? partials : undefined,
  15384. newPartialsRight = isCurry ? undefined : partials;
  15385. bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
  15386. bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
  15387. if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
  15388. bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
  15389. }
  15390. var newData = [
  15391. func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
  15392. newHoldersRight, argPos, ary, arity
  15393. ];
  15394. var result = wrapFunc.apply(undefined, newData);
  15395. if (isLaziable(func)) {
  15396. setData(result, newData);
  15397. }
  15398. result.placeholder = placeholder;
  15399. return setWrapToString(result, func, bitmask);
  15400. }
  15401. /**
  15402. * Creates a function like `_.round`.
  15403. *
  15404. * @private
  15405. * @param {string} methodName The name of the `Math` method to use when rounding.
  15406. * @returns {Function} Returns the new round function.
  15407. */
  15408. function createRound(methodName) {
  15409. var func = Math[methodName];
  15410. return function(number, precision) {
  15411. number = toNumber(number);
  15412. precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
  15413. if (precision) {
  15414. // Shift with exponential notation to avoid floating-point issues.
  15415. // See [MDN](https://mdn.io/round#Examples) for more details.
  15416. var pair = (toString(number) + 'e').split('e'),
  15417. value = func(pair[0] + 'e' + (+pair[1] + precision));
  15418. pair = (toString(value) + 'e').split('e');
  15419. return +(pair[0] + 'e' + (+pair[1] - precision));
  15420. }
  15421. return func(number);
  15422. };
  15423. }
  15424. /**
  15425. * Creates a set object of `values`.
  15426. *
  15427. * @private
  15428. * @param {Array} values The values to add to the set.
  15429. * @returns {Object} Returns the new set.
  15430. */
  15431. var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
  15432. return new Set(values);
  15433. };
  15434. /**
  15435. * Creates a `_.toPairs` or `_.toPairsIn` function.
  15436. *
  15437. * @private
  15438. * @param {Function} keysFunc The function to get the keys of a given object.
  15439. * @returns {Function} Returns the new pairs function.
  15440. */
  15441. function createToPairs(keysFunc) {
  15442. return function(object) {
  15443. var tag = getTag(object);
  15444. if (tag == mapTag) {
  15445. return mapToArray(object);
  15446. }
  15447. if (tag == setTag) {
  15448. return setToPairs(object);
  15449. }
  15450. return baseToPairs(object, keysFunc(object));
  15451. };
  15452. }
  15453. /**
  15454. * Creates a function that either curries or invokes `func` with optional
  15455. * `this` binding and partially applied arguments.
  15456. *
  15457. * @private
  15458. * @param {Function|string} func The function or method name to wrap.
  15459. * @param {number} bitmask The bitmask flags.
  15460. * 1 - `_.bind`
  15461. * 2 - `_.bindKey`
  15462. * 4 - `_.curry` or `_.curryRight` of a bound function
  15463. * 8 - `_.curry`
  15464. * 16 - `_.curryRight`
  15465. * 32 - `_.partial`
  15466. * 64 - `_.partialRight`
  15467. * 128 - `_.rearg`
  15468. * 256 - `_.ary`
  15469. * 512 - `_.flip`
  15470. * @param {*} [thisArg] The `this` binding of `func`.
  15471. * @param {Array} [partials] The arguments to be partially applied.
  15472. * @param {Array} [holders] The `partials` placeholder indexes.
  15473. * @param {Array} [argPos] The argument positions of the new function.
  15474. * @param {number} [ary] The arity cap of `func`.
  15475. * @param {number} [arity] The arity of `func`.
  15476. * @returns {Function} Returns the new wrapped function.
  15477. */
  15478. function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
  15479. var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
  15480. if (!isBindKey && typeof func != 'function') {
  15481. throw new TypeError(FUNC_ERROR_TEXT);
  15482. }
  15483. var length = partials ? partials.length : 0;
  15484. if (!length) {
  15485. bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
  15486. partials = holders = undefined;
  15487. }
  15488. ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
  15489. arity = arity === undefined ? arity : toInteger(arity);
  15490. length -= holders ? holders.length : 0;
  15491. if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
  15492. var partialsRight = partials,
  15493. holdersRight = holders;
  15494. partials = holders = undefined;
  15495. }
  15496. var data = isBindKey ? undefined : getData(func);
  15497. var newData = [
  15498. func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
  15499. argPos, ary, arity
  15500. ];
  15501. if (data) {
  15502. mergeData(newData, data);
  15503. }
  15504. func = newData[0];
  15505. bitmask = newData[1];
  15506. thisArg = newData[2];
  15507. partials = newData[3];
  15508. holders = newData[4];
  15509. arity = newData[9] = newData[9] === undefined
  15510. ? (isBindKey ? 0 : func.length)
  15511. : nativeMax(newData[9] - length, 0);
  15512. if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
  15513. bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
  15514. }
  15515. if (!bitmask || bitmask == WRAP_BIND_FLAG) {
  15516. var result = createBind(func, bitmask, thisArg);
  15517. } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
  15518. result = createCurry(func, bitmask, arity);
  15519. } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
  15520. result = createPartial(func, bitmask, thisArg, partials);
  15521. } else {
  15522. result = createHybrid.apply(undefined, newData);
  15523. }
  15524. var setter = data ? baseSetData : setData;
  15525. return setWrapToString(setter(result, newData), func, bitmask);
  15526. }
  15527. /**
  15528. * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
  15529. * of source objects to the destination object for all destination properties
  15530. * that resolve to `undefined`.
  15531. *
  15532. * @private
  15533. * @param {*} objValue The destination value.
  15534. * @param {*} srcValue The source value.
  15535. * @param {string} key The key of the property to assign.
  15536. * @param {Object} object The parent object of `objValue`.
  15537. * @returns {*} Returns the value to assign.
  15538. */
  15539. function customDefaultsAssignIn(objValue, srcValue, key, object) {
  15540. if (objValue === undefined ||
  15541. (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
  15542. return srcValue;
  15543. }
  15544. return objValue;
  15545. }
  15546. /**
  15547. * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
  15548. * objects into destination objects that are passed thru.
  15549. *
  15550. * @private
  15551. * @param {*} objValue The destination value.
  15552. * @param {*} srcValue The source value.
  15553. * @param {string} key The key of the property to merge.
  15554. * @param {Object} object The parent object of `objValue`.
  15555. * @param {Object} source The parent object of `srcValue`.
  15556. * @param {Object} [stack] Tracks traversed source values and their merged
  15557. * counterparts.
  15558. * @returns {*} Returns the value to assign.
  15559. */
  15560. function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
  15561. if (isObject(objValue) && isObject(srcValue)) {
  15562. // Recursively merge objects and arrays (susceptible to call stack limits).
  15563. stack.set(srcValue, objValue);
  15564. baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
  15565. stack['delete'](srcValue);
  15566. }
  15567. return objValue;
  15568. }
  15569. /**
  15570. * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
  15571. * objects.
  15572. *
  15573. * @private
  15574. * @param {*} value The value to inspect.
  15575. * @param {string} key The key of the property to inspect.
  15576. * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
  15577. */
  15578. function customOmitClone(value) {
  15579. return isPlainObject(value) ? undefined : value;
  15580. }
  15581. /**
  15582. * A specialized version of `baseIsEqualDeep` for arrays with support for
  15583. * partial deep comparisons.
  15584. *
  15585. * @private
  15586. * @param {Array} array The array to compare.
  15587. * @param {Array} other The other array to compare.
  15588. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  15589. * @param {Function} customizer The function to customize comparisons.
  15590. * @param {Function} equalFunc The function to determine equivalents of values.
  15591. * @param {Object} stack Tracks traversed `array` and `other` objects.
  15592. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
  15593. */
  15594. function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  15595. var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
  15596. arrLength = array.length,
  15597. othLength = other.length;
  15598. if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
  15599. return false;
  15600. }
  15601. // Assume cyclic values are equal.
  15602. var stacked = stack.get(array);
  15603. if (stacked && stack.get(other)) {
  15604. return stacked == other;
  15605. }
  15606. var index = -1,
  15607. result = true,
  15608. seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
  15609. stack.set(array, other);
  15610. stack.set(other, array);
  15611. // Ignore non-index properties.
  15612. while (++index < arrLength) {
  15613. var arrValue = array[index],
  15614. othValue = other[index];
  15615. if (customizer) {
  15616. var compared = isPartial
  15617. ? customizer(othValue, arrValue, index, other, array, stack)
  15618. : customizer(arrValue, othValue, index, array, other, stack);
  15619. }
  15620. if (compared !== undefined) {
  15621. if (compared) {
  15622. continue;
  15623. }
  15624. result = false;
  15625. break;
  15626. }
  15627. // Recursively compare arrays (susceptible to call stack limits).
  15628. if (seen) {
  15629. if (!arraySome(other, function(othValue, othIndex) {
  15630. if (!cacheHas(seen, othIndex) &&
  15631. (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
  15632. return seen.push(othIndex);
  15633. }
  15634. })) {
  15635. result = false;
  15636. break;
  15637. }
  15638. } else if (!(
  15639. arrValue === othValue ||
  15640. equalFunc(arrValue, othValue, bitmask, customizer, stack)
  15641. )) {
  15642. result = false;
  15643. break;
  15644. }
  15645. }
  15646. stack['delete'](array);
  15647. stack['delete'](other);
  15648. return result;
  15649. }
  15650. /**
  15651. * A specialized version of `baseIsEqualDeep` for comparing objects of
  15652. * the same `toStringTag`.
  15653. *
  15654. * **Note:** This function only supports comparing values with tags of
  15655. * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  15656. *
  15657. * @private
  15658. * @param {Object} object The object to compare.
  15659. * @param {Object} other The other object to compare.
  15660. * @param {string} tag The `toStringTag` of the objects to compare.
  15661. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  15662. * @param {Function} customizer The function to customize comparisons.
  15663. * @param {Function} equalFunc The function to determine equivalents of values.
  15664. * @param {Object} stack Tracks traversed `object` and `other` objects.
  15665. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  15666. */
  15667. function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  15668. switch (tag) {
  15669. case dataViewTag:
  15670. if ((object.byteLength != other.byteLength) ||
  15671. (object.byteOffset != other.byteOffset)) {
  15672. return false;
  15673. }
  15674. object = object.buffer;
  15675. other = other.buffer;
  15676. case arrayBufferTag:
  15677. if ((object.byteLength != other.byteLength) ||
  15678. !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
  15679. return false;
  15680. }
  15681. return true;
  15682. case boolTag:
  15683. case dateTag:
  15684. case numberTag:
  15685. // Coerce booleans to `1` or `0` and dates to milliseconds.
  15686. // Invalid dates are coerced to `NaN`.
  15687. return eq(+object, +other);
  15688. case errorTag:
  15689. return object.name == other.name && object.message == other.message;
  15690. case regexpTag:
  15691. case stringTag:
  15692. // Coerce regexes to strings and treat strings, primitives and objects,
  15693. // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
  15694. // for more details.
  15695. return object == (other + '');
  15696. case mapTag:
  15697. var convert = mapToArray;
  15698. case setTag:
  15699. var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
  15700. convert || (convert = setToArray);
  15701. if (object.size != other.size && !isPartial) {
  15702. return false;
  15703. }
  15704. // Assume cyclic values are equal.
  15705. var stacked = stack.get(object);
  15706. if (stacked) {
  15707. return stacked == other;
  15708. }
  15709. bitmask |= COMPARE_UNORDERED_FLAG;
  15710. // Recursively compare objects (susceptible to call stack limits).
  15711. stack.set(object, other);
  15712. var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
  15713. stack['delete'](object);
  15714. return result;
  15715. case symbolTag:
  15716. if (symbolValueOf) {
  15717. return symbolValueOf.call(object) == symbolValueOf.call(other);
  15718. }
  15719. }
  15720. return false;
  15721. }
  15722. /**
  15723. * A specialized version of `baseIsEqualDeep` for objects with support for
  15724. * partial deep comparisons.
  15725. *
  15726. * @private
  15727. * @param {Object} object The object to compare.
  15728. * @param {Object} other The other object to compare.
  15729. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  15730. * @param {Function} customizer The function to customize comparisons.
  15731. * @param {Function} equalFunc The function to determine equivalents of values.
  15732. * @param {Object} stack Tracks traversed `object` and `other` objects.
  15733. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  15734. */
  15735. function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  15736. var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
  15737. objProps = getAllKeys(object),
  15738. objLength = objProps.length,
  15739. othProps = getAllKeys(other),
  15740. othLength = othProps.length;
  15741. if (objLength != othLength && !isPartial) {
  15742. return false;
  15743. }
  15744. var index = objLength;
  15745. while (index--) {
  15746. var key = objProps[index];
  15747. if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
  15748. return false;
  15749. }
  15750. }
  15751. // Assume cyclic values are equal.
  15752. var stacked = stack.get(object);
  15753. if (stacked && stack.get(other)) {
  15754. return stacked == other;
  15755. }
  15756. var result = true;
  15757. stack.set(object, other);
  15758. stack.set(other, object);
  15759. var skipCtor = isPartial;
  15760. while (++index < objLength) {
  15761. key = objProps[index];
  15762. var objValue = object[key],
  15763. othValue = other[key];
  15764. if (customizer) {
  15765. var compared = isPartial
  15766. ? customizer(othValue, objValue, key, other, object, stack)
  15767. : customizer(objValue, othValue, key, object, other, stack);
  15768. }
  15769. // Recursively compare objects (susceptible to call stack limits).
  15770. if (!(compared === undefined
  15771. ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
  15772. : compared
  15773. )) {
  15774. result = false;
  15775. break;
  15776. }
  15777. skipCtor || (skipCtor = key == 'constructor');
  15778. }
  15779. if (result && !skipCtor) {
  15780. var objCtor = object.constructor,
  15781. othCtor = other.constructor;
  15782. // Non `Object` object instances with different constructors are not equal.
  15783. if (objCtor != othCtor &&
  15784. ('constructor' in object && 'constructor' in other) &&
  15785. !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
  15786. typeof othCtor == 'function' && othCtor instanceof othCtor)) {
  15787. result = false;
  15788. }
  15789. }
  15790. stack['delete'](object);
  15791. stack['delete'](other);
  15792. return result;
  15793. }
  15794. /**
  15795. * A specialized version of `baseRest` which flattens the rest array.
  15796. *
  15797. * @private
  15798. * @param {Function} func The function to apply a rest parameter to.
  15799. * @returns {Function} Returns the new function.
  15800. */
  15801. function flatRest(func) {
  15802. return setToString(overRest(func, undefined, flatten), func + '');
  15803. }
  15804. /**
  15805. * Creates an array of own enumerable property names and symbols of `object`.
  15806. *
  15807. * @private
  15808. * @param {Object} object The object to query.
  15809. * @returns {Array} Returns the array of property names and symbols.
  15810. */
  15811. function getAllKeys(object) {
  15812. return baseGetAllKeys(object, keys, getSymbols);
  15813. }
  15814. /**
  15815. * Creates an array of own and inherited enumerable property names and
  15816. * symbols of `object`.
  15817. *
  15818. * @private
  15819. * @param {Object} object The object to query.
  15820. * @returns {Array} Returns the array of property names and symbols.
  15821. */
  15822. function getAllKeysIn(object) {
  15823. return baseGetAllKeys(object, keysIn, getSymbolsIn);
  15824. }
  15825. /**
  15826. * Gets metadata for `func`.
  15827. *
  15828. * @private
  15829. * @param {Function} func The function to query.
  15830. * @returns {*} Returns the metadata for `func`.
  15831. */
  15832. var getData = !metaMap ? noop : function(func) {
  15833. return metaMap.get(func);
  15834. };
  15835. /**
  15836. * Gets the name of `func`.
  15837. *
  15838. * @private
  15839. * @param {Function} func The function to query.
  15840. * @returns {string} Returns the function name.
  15841. */
  15842. function getFuncName(func) {
  15843. var result = (func.name + ''),
  15844. array = realNames[result],
  15845. length = hasOwnProperty.call(realNames, result) ? array.length : 0;
  15846. while (length--) {
  15847. var data = array[length],
  15848. otherFunc = data.func;
  15849. if (otherFunc == null || otherFunc == func) {
  15850. return data.name;
  15851. }
  15852. }
  15853. return result;
  15854. }
  15855. /**
  15856. * Gets the argument placeholder value for `func`.
  15857. *
  15858. * @private
  15859. * @param {Function} func The function to inspect.
  15860. * @returns {*} Returns the placeholder value.
  15861. */
  15862. function getHolder(func) {
  15863. var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
  15864. return object.placeholder;
  15865. }
  15866. /**
  15867. * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
  15868. * this function returns the custom method, otherwise it returns `baseIteratee`.
  15869. * If arguments are provided, the chosen function is invoked with them and
  15870. * its result is returned.
  15871. *
  15872. * @private
  15873. * @param {*} [value] The value to convert to an iteratee.
  15874. * @param {number} [arity] The arity of the created iteratee.
  15875. * @returns {Function} Returns the chosen function or its result.
  15876. */
  15877. function getIteratee() {
  15878. var result = lodash.iteratee || iteratee;
  15879. result = result === iteratee ? baseIteratee : result;
  15880. return arguments.length ? result(arguments[0], arguments[1]) : result;
  15881. }
  15882. /**
  15883. * Gets the data for `map`.
  15884. *
  15885. * @private
  15886. * @param {Object} map The map to query.
  15887. * @param {string} key The reference key.
  15888. * @returns {*} Returns the map data.
  15889. */
  15890. function getMapData(map, key) {
  15891. var data = map.__data__;
  15892. return isKeyable(key)
  15893. ? data[typeof key == 'string' ? 'string' : 'hash']
  15894. : data.map;
  15895. }
  15896. /**
  15897. * Gets the property names, values, and compare flags of `object`.
  15898. *
  15899. * @private
  15900. * @param {Object} object The object to query.
  15901. * @returns {Array} Returns the match data of `object`.
  15902. */
  15903. function getMatchData(object) {
  15904. var result = keys(object),
  15905. length = result.length;
  15906. while (length--) {
  15907. var key = result[length],
  15908. value = object[key];
  15909. result[length] = [key, value, isStrictComparable(value)];
  15910. }
  15911. return result;
  15912. }
  15913. /**
  15914. * Gets the native function at `key` of `object`.
  15915. *
  15916. * @private
  15917. * @param {Object} object The object to query.
  15918. * @param {string} key The key of the method to get.
  15919. * @returns {*} Returns the function if it's native, else `undefined`.
  15920. */
  15921. function getNative(object, key) {
  15922. var value = getValue(object, key);
  15923. return baseIsNative(value) ? value : undefined;
  15924. }
  15925. /**
  15926. * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
  15927. *
  15928. * @private
  15929. * @param {*} value The value to query.
  15930. * @returns {string} Returns the raw `toStringTag`.
  15931. */
  15932. function getRawTag(value) {
  15933. var isOwn = hasOwnProperty.call(value, symToStringTag),
  15934. tag = value[symToStringTag];
  15935. try {
  15936. value[symToStringTag] = undefined;
  15937. var unmasked = true;
  15938. } catch (e) {}
  15939. var result = nativeObjectToString.call(value);
  15940. if (unmasked) {
  15941. if (isOwn) {
  15942. value[symToStringTag] = tag;
  15943. } else {
  15944. delete value[symToStringTag];
  15945. }
  15946. }
  15947. return result;
  15948. }
  15949. /**
  15950. * Creates an array of the own enumerable symbols of `object`.
  15951. *
  15952. * @private
  15953. * @param {Object} object The object to query.
  15954. * @returns {Array} Returns the array of symbols.
  15955. */
  15956. var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
  15957. if (object == null) {
  15958. return [];
  15959. }
  15960. object = Object(object);
  15961. return arrayFilter(nativeGetSymbols(object), function(symbol) {
  15962. return propertyIsEnumerable.call(object, symbol);
  15963. });
  15964. };
  15965. /**
  15966. * Creates an array of the own and inherited enumerable symbols of `object`.
  15967. *
  15968. * @private
  15969. * @param {Object} object The object to query.
  15970. * @returns {Array} Returns the array of symbols.
  15971. */
  15972. var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
  15973. var result = [];
  15974. while (object) {
  15975. arrayPush(result, getSymbols(object));
  15976. object = getPrototype(object);
  15977. }
  15978. return result;
  15979. };
  15980. /**
  15981. * Gets the `toStringTag` of `value`.
  15982. *
  15983. * @private
  15984. * @param {*} value The value to query.
  15985. * @returns {string} Returns the `toStringTag`.
  15986. */
  15987. var getTag = baseGetTag;
  15988. // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
  15989. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
  15990. (Map && getTag(new Map) != mapTag) ||
  15991. (Promise && getTag(Promise.resolve()) != promiseTag) ||
  15992. (Set && getTag(new Set) != setTag) ||
  15993. (WeakMap && getTag(new WeakMap) != weakMapTag)) {
  15994. getTag = function(value) {
  15995. var result = baseGetTag(value),
  15996. Ctor = result == objectTag ? value.constructor : undefined,
  15997. ctorString = Ctor ? toSource(Ctor) : '';
  15998. if (ctorString) {
  15999. switch (ctorString) {
  16000. case dataViewCtorString: return dataViewTag;
  16001. case mapCtorString: return mapTag;
  16002. case promiseCtorString: return promiseTag;
  16003. case setCtorString: return setTag;
  16004. case weakMapCtorString: return weakMapTag;
  16005. }
  16006. }
  16007. return result;
  16008. };
  16009. }
  16010. /**
  16011. * Gets the view, applying any `transforms` to the `start` and `end` positions.
  16012. *
  16013. * @private
  16014. * @param {number} start The start of the view.
  16015. * @param {number} end The end of the view.
  16016. * @param {Array} transforms The transformations to apply to the view.
  16017. * @returns {Object} Returns an object containing the `start` and `end`
  16018. * positions of the view.
  16019. */
  16020. function getView(start, end, transforms) {
  16021. var index = -1,
  16022. length = transforms.length;
  16023. while (++index < length) {
  16024. var data = transforms[index],
  16025. size = data.size;
  16026. switch (data.type) {
  16027. case 'drop': start += size; break;
  16028. case 'dropRight': end -= size; break;
  16029. case 'take': end = nativeMin(end, start + size); break;
  16030. case 'takeRight': start = nativeMax(start, end - size); break;
  16031. }
  16032. }
  16033. return { 'start': start, 'end': end };
  16034. }
  16035. /**
  16036. * Extracts wrapper details from the `source` body comment.
  16037. *
  16038. * @private
  16039. * @param {string} source The source to inspect.
  16040. * @returns {Array} Returns the wrapper details.
  16041. */
  16042. function getWrapDetails(source) {
  16043. var match = source.match(reWrapDetails);
  16044. return match ? match[1].split(reSplitDetails) : [];
  16045. }
  16046. /**
  16047. * Checks if `path` exists on `object`.
  16048. *
  16049. * @private
  16050. * @param {Object} object The object to query.
  16051. * @param {Array|string} path The path to check.
  16052. * @param {Function} hasFunc The function to check properties.
  16053. * @returns {boolean} Returns `true` if `path` exists, else `false`.
  16054. */
  16055. function hasPath(object, path, hasFunc) {
  16056. path = castPath(path, object);
  16057. var index = -1,
  16058. length = path.length,
  16059. result = false;
  16060. while (++index < length) {
  16061. var key = toKey(path[index]);
  16062. if (!(result = object != null && hasFunc(object, key))) {
  16063. break;
  16064. }
  16065. object = object[key];
  16066. }
  16067. if (result || ++index != length) {
  16068. return result;
  16069. }
  16070. length = object == null ? 0 : object.length;
  16071. return !!length && isLength(length) && isIndex(key, length) &&
  16072. (isArray(object) || isArguments(object));
  16073. }
  16074. /**
  16075. * Initializes an array clone.
  16076. *
  16077. * @private
  16078. * @param {Array} array The array to clone.
  16079. * @returns {Array} Returns the initialized clone.
  16080. */
  16081. function initCloneArray(array) {
  16082. var length = array.length,
  16083. result = array.constructor(length);
  16084. // Add properties assigned by `RegExp#exec`.
  16085. if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
  16086. result.index = array.index;
  16087. result.input = array.input;
  16088. }
  16089. return result;
  16090. }
  16091. /**
  16092. * Initializes an object clone.
  16093. *
  16094. * @private
  16095. * @param {Object} object The object to clone.
  16096. * @returns {Object} Returns the initialized clone.
  16097. */
  16098. function initCloneObject(object) {
  16099. return (typeof object.constructor == 'function' && !isPrototype(object))
  16100. ? baseCreate(getPrototype(object))
  16101. : {};
  16102. }
  16103. /**
  16104. * Initializes an object clone based on its `toStringTag`.
  16105. *
  16106. * **Note:** This function only supports cloning values with tags of
  16107. * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  16108. *
  16109. * @private
  16110. * @param {Object} object The object to clone.
  16111. * @param {string} tag The `toStringTag` of the object to clone.
  16112. * @param {Function} cloneFunc The function to clone values.
  16113. * @param {boolean} [isDeep] Specify a deep clone.
  16114. * @returns {Object} Returns the initialized clone.
  16115. */
  16116. function initCloneByTag(object, tag, cloneFunc, isDeep) {
  16117. var Ctor = object.constructor;
  16118. switch (tag) {
  16119. case arrayBufferTag:
  16120. return cloneArrayBuffer(object);
  16121. case boolTag:
  16122. case dateTag:
  16123. return new Ctor(+object);
  16124. case dataViewTag:
  16125. return cloneDataView(object, isDeep);
  16126. case float32Tag: case float64Tag:
  16127. case int8Tag: case int16Tag: case int32Tag:
  16128. case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
  16129. return cloneTypedArray(object, isDeep);
  16130. case mapTag:
  16131. return cloneMap(object, isDeep, cloneFunc);
  16132. case numberTag:
  16133. case stringTag:
  16134. return new Ctor(object);
  16135. case regexpTag:
  16136. return cloneRegExp(object);
  16137. case setTag:
  16138. return cloneSet(object, isDeep, cloneFunc);
  16139. case symbolTag:
  16140. return cloneSymbol(object);
  16141. }
  16142. }
  16143. /**
  16144. * Inserts wrapper `details` in a comment at the top of the `source` body.
  16145. *
  16146. * @private
  16147. * @param {string} source The source to modify.
  16148. * @returns {Array} details The details to insert.
  16149. * @returns {string} Returns the modified source.
  16150. */
  16151. function insertWrapDetails(source, details) {
  16152. var length = details.length;
  16153. if (!length) {
  16154. return source;
  16155. }
  16156. var lastIndex = length - 1;
  16157. details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
  16158. details = details.join(length > 2 ? ', ' : ' ');
  16159. return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
  16160. }
  16161. /**
  16162. * Checks if `value` is a flattenable `arguments` object or array.
  16163. *
  16164. * @private
  16165. * @param {*} value The value to check.
  16166. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
  16167. */
  16168. function isFlattenable(value) {
  16169. return isArray(value) || isArguments(value) ||
  16170. !!(spreadableSymbol && value && value[spreadableSymbol]);
  16171. }
  16172. /**
  16173. * Checks if `value` is a valid array-like index.
  16174. *
  16175. * @private
  16176. * @param {*} value The value to check.
  16177. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
  16178. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
  16179. */
  16180. function isIndex(value, length) {
  16181. length = length == null ? MAX_SAFE_INTEGER : length;
  16182. return !!length &&
  16183. (typeof value == 'number' || reIsUint.test(value)) &&
  16184. (value > -1 && value % 1 == 0 && value < length);
  16185. }
  16186. /**
  16187. * Checks if the given arguments are from an iteratee call.
  16188. *
  16189. * @private
  16190. * @param {*} value The potential iteratee value argument.
  16191. * @param {*} index The potential iteratee index or key argument.
  16192. * @param {*} object The potential iteratee object argument.
  16193. * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
  16194. * else `false`.
  16195. */
  16196. function isIterateeCall(value, index, object) {
  16197. if (!isObject(object)) {
  16198. return false;
  16199. }
  16200. var type = typeof index;
  16201. if (type == 'number'
  16202. ? (isArrayLike(object) && isIndex(index, object.length))
  16203. : (type == 'string' && index in object)
  16204. ) {
  16205. return eq(object[index], value);
  16206. }
  16207. return false;
  16208. }
  16209. /**
  16210. * Checks if `value` is a property name and not a property path.
  16211. *
  16212. * @private
  16213. * @param {*} value The value to check.
  16214. * @param {Object} [object] The object to query keys on.
  16215. * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
  16216. */
  16217. function isKey(value, object) {
  16218. if (isArray(value)) {
  16219. return false;
  16220. }
  16221. var type = typeof value;
  16222. if (type == 'number' || type == 'symbol' || type == 'boolean' ||
  16223. value == null || isSymbol(value)) {
  16224. return true;
  16225. }
  16226. return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
  16227. (object != null && value in Object(object));
  16228. }
  16229. /**
  16230. * Checks if `value` is suitable for use as unique object key.
  16231. *
  16232. * @private
  16233. * @param {*} value The value to check.
  16234. * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
  16235. */
  16236. function isKeyable(value) {
  16237. var type = typeof value;
  16238. return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
  16239. ? (value !== '__proto__')
  16240. : (value === null);
  16241. }
  16242. /**
  16243. * Checks if `func` has a lazy counterpart.
  16244. *
  16245. * @private
  16246. * @param {Function} func The function to check.
  16247. * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
  16248. * else `false`.
  16249. */
  16250. function isLaziable(func) {
  16251. var funcName = getFuncName(func),
  16252. other = lodash[funcName];
  16253. if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
  16254. return false;
  16255. }
  16256. if (func === other) {
  16257. return true;
  16258. }
  16259. var data = getData(other);
  16260. return !!data && func === data[0];
  16261. }
  16262. /**
  16263. * Checks if `func` has its source masked.
  16264. *
  16265. * @private
  16266. * @param {Function} func The function to check.
  16267. * @returns {boolean} Returns `true` if `func` is masked, else `false`.
  16268. */
  16269. function isMasked(func) {
  16270. return !!maskSrcKey && (maskSrcKey in func);
  16271. }
  16272. /**
  16273. * Checks if `func` is capable of being masked.
  16274. *
  16275. * @private
  16276. * @param {*} value The value to check.
  16277. * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
  16278. */
  16279. var isMaskable = coreJsData ? isFunction : stubFalse;
  16280. /**
  16281. * Checks if `value` is likely a prototype object.
  16282. *
  16283. * @private
  16284. * @param {*} value The value to check.
  16285. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
  16286. */
  16287. function isPrototype(value) {
  16288. var Ctor = value && value.constructor,
  16289. proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
  16290. return value === proto;
  16291. }
  16292. /**
  16293. * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
  16294. *
  16295. * @private
  16296. * @param {*} value The value to check.
  16297. * @returns {boolean} Returns `true` if `value` if suitable for strict
  16298. * equality comparisons, else `false`.
  16299. */
  16300. function isStrictComparable(value) {
  16301. return value === value && !isObject(value);
  16302. }
  16303. /**
  16304. * A specialized version of `matchesProperty` for source values suitable
  16305. * for strict equality comparisons, i.e. `===`.
  16306. *
  16307. * @private
  16308. * @param {string} key The key of the property to get.
  16309. * @param {*} srcValue The value to match.
  16310. * @returns {Function} Returns the new spec function.
  16311. */
  16312. function matchesStrictComparable(key, srcValue) {
  16313. return function(object) {
  16314. if (object == null) {
  16315. return false;
  16316. }
  16317. return object[key] === srcValue &&
  16318. (srcValue !== undefined || (key in Object(object)));
  16319. };
  16320. }
  16321. /**
  16322. * A specialized version of `_.memoize` which clears the memoized function's
  16323. * cache when it exceeds `MAX_MEMOIZE_SIZE`.
  16324. *
  16325. * @private
  16326. * @param {Function} func The function to have its output memoized.
  16327. * @returns {Function} Returns the new memoized function.
  16328. */
  16329. function memoizeCapped(func) {
  16330. var result = memoize(func, function(key) {
  16331. if (cache.size === MAX_MEMOIZE_SIZE) {
  16332. cache.clear();
  16333. }
  16334. return key;
  16335. });
  16336. var cache = result.cache;
  16337. return result;
  16338. }
  16339. /**
  16340. * Merges the function metadata of `source` into `data`.
  16341. *
  16342. * Merging metadata reduces the number of wrappers used to invoke a function.
  16343. * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
  16344. * may be applied regardless of execution order. Methods like `_.ary` and
  16345. * `_.rearg` modify function arguments, making the order in which they are
  16346. * executed important, preventing the merging of metadata. However, we make
  16347. * an exception for a safe combined case where curried functions have `_.ary`
  16348. * and or `_.rearg` applied.
  16349. *
  16350. * @private
  16351. * @param {Array} data The destination metadata.
  16352. * @param {Array} source The source metadata.
  16353. * @returns {Array} Returns `data`.
  16354. */
  16355. function mergeData(data, source) {
  16356. var bitmask = data[1],
  16357. srcBitmask = source[1],
  16358. newBitmask = bitmask | srcBitmask,
  16359. isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
  16360. var isCombo =
  16361. ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
  16362. ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
  16363. ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
  16364. // Exit early if metadata can't be merged.
  16365. if (!(isCommon || isCombo)) {
  16366. return data;
  16367. }
  16368. // Use source `thisArg` if available.
  16369. if (srcBitmask & WRAP_BIND_FLAG) {
  16370. data[2] = source[2];
  16371. // Set when currying a bound function.
  16372. newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
  16373. }
  16374. // Compose partial arguments.
  16375. var value = source[3];
  16376. if (value) {
  16377. var partials = data[3];
  16378. data[3] = partials ? composeArgs(partials, value, source[4]) : value;
  16379. data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
  16380. }
  16381. // Compose partial right arguments.
  16382. value = source[5];
  16383. if (value) {
  16384. partials = data[5];
  16385. data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
  16386. data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
  16387. }
  16388. // Use source `argPos` if available.
  16389. value = source[7];
  16390. if (value) {
  16391. data[7] = value;
  16392. }
  16393. // Use source `ary` if it's smaller.
  16394. if (srcBitmask & WRAP_ARY_FLAG) {
  16395. data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
  16396. }
  16397. // Use source `arity` if one is not provided.
  16398. if (data[9] == null) {
  16399. data[9] = source[9];
  16400. }
  16401. // Use source `func` and merge bitmasks.
  16402. data[0] = source[0];
  16403. data[1] = newBitmask;
  16404. return data;
  16405. }
  16406. /**
  16407. * This function is like
  16408. * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
  16409. * except that it includes inherited enumerable properties.
  16410. *
  16411. * @private
  16412. * @param {Object} object The object to query.
  16413. * @returns {Array} Returns the array of property names.
  16414. */
  16415. function nativeKeysIn(object) {
  16416. var result = [];
  16417. if (object != null) {
  16418. for (var key in Object(object)) {
  16419. result.push(key);
  16420. }
  16421. }
  16422. return result;
  16423. }
  16424. /**
  16425. * Converts `value` to a string using `Object.prototype.toString`.
  16426. *
  16427. * @private
  16428. * @param {*} value The value to convert.
  16429. * @returns {string} Returns the converted string.
  16430. */
  16431. function objectToString(value) {
  16432. return nativeObjectToString.call(value);
  16433. }
  16434. /**
  16435. * A specialized version of `baseRest` which transforms the rest array.
  16436. *
  16437. * @private
  16438. * @param {Function} func The function to apply a rest parameter to.
  16439. * @param {number} [start=func.length-1] The start position of the rest parameter.
  16440. * @param {Function} transform The rest array transform.
  16441. * @returns {Function} Returns the new function.
  16442. */
  16443. function overRest(func, start, transform) {
  16444. start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
  16445. return function() {
  16446. var args = arguments,
  16447. index = -1,
  16448. length = nativeMax(args.length - start, 0),
  16449. array = Array(length);
  16450. while (++index < length) {
  16451. array[index] = args[start + index];
  16452. }
  16453. index = -1;
  16454. var otherArgs = Array(start + 1);
  16455. while (++index < start) {
  16456. otherArgs[index] = args[index];
  16457. }
  16458. otherArgs[start] = transform(array);
  16459. return apply(func, this, otherArgs);
  16460. };
  16461. }
  16462. /**
  16463. * Gets the parent value at `path` of `object`.
  16464. *
  16465. * @private
  16466. * @param {Object} object The object to query.
  16467. * @param {Array} path The path to get the parent value of.
  16468. * @returns {*} Returns the parent value.
  16469. */
  16470. function parent(object, path) {
  16471. return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
  16472. }
  16473. /**
  16474. * Reorder `array` according to the specified indexes where the element at
  16475. * the first index is assigned as the first element, the element at
  16476. * the second index is assigned as the second element, and so on.
  16477. *
  16478. * @private
  16479. * @param {Array} array The array to reorder.
  16480. * @param {Array} indexes The arranged array indexes.
  16481. * @returns {Array} Returns `array`.
  16482. */
  16483. function reorder(array, indexes) {
  16484. var arrLength = array.length,
  16485. length = nativeMin(indexes.length, arrLength),
  16486. oldArray = copyArray(array);
  16487. while (length--) {
  16488. var index = indexes[length];
  16489. array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
  16490. }
  16491. return array;
  16492. }
  16493. /**
  16494. * Sets metadata for `func`.
  16495. *
  16496. * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
  16497. * period of time, it will trip its breaker and transition to an identity
  16498. * function to avoid garbage collection pauses in V8. See
  16499. * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
  16500. * for more details.
  16501. *
  16502. * @private
  16503. * @param {Function} func The function to associate metadata with.
  16504. * @param {*} data The metadata.
  16505. * @returns {Function} Returns `func`.
  16506. */
  16507. var setData = shortOut(baseSetData);
  16508. /**
  16509. * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
  16510. *
  16511. * @private
  16512. * @param {Function} func The function to delay.
  16513. * @param {number} wait The number of milliseconds to delay invocation.
  16514. * @returns {number|Object} Returns the timer id or timeout object.
  16515. */
  16516. var setTimeout = ctxSetTimeout || function(func, wait) {
  16517. return root.setTimeout(func, wait);
  16518. };
  16519. /**
  16520. * Sets the `toString` method of `func` to return `string`.
  16521. *
  16522. * @private
  16523. * @param {Function} func The function to modify.
  16524. * @param {Function} string The `toString` result.
  16525. * @returns {Function} Returns `func`.
  16526. */
  16527. var setToString = shortOut(baseSetToString);
  16528. /**
  16529. * Sets the `toString` method of `wrapper` to mimic the source of `reference`
  16530. * with wrapper details in a comment at the top of the source body.
  16531. *
  16532. * @private
  16533. * @param {Function} wrapper The function to modify.
  16534. * @param {Function} reference The reference function.
  16535. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  16536. * @returns {Function} Returns `wrapper`.
  16537. */
  16538. function setWrapToString(wrapper, reference, bitmask) {
  16539. var source = (reference + '');
  16540. return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
  16541. }
  16542. /**
  16543. * Creates a function that'll short out and invoke `identity` instead
  16544. * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
  16545. * milliseconds.
  16546. *
  16547. * @private
  16548. * @param {Function} func The function to restrict.
  16549. * @returns {Function} Returns the new shortable function.
  16550. */
  16551. function shortOut(func) {
  16552. var count = 0,
  16553. lastCalled = 0;
  16554. return function() {
  16555. var stamp = nativeNow(),
  16556. remaining = HOT_SPAN - (stamp - lastCalled);
  16557. lastCalled = stamp;
  16558. if (remaining > 0) {
  16559. if (++count >= HOT_COUNT) {
  16560. return arguments[0];
  16561. }
  16562. } else {
  16563. count = 0;
  16564. }
  16565. return func.apply(undefined, arguments);
  16566. };
  16567. }
  16568. /**
  16569. * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
  16570. *
  16571. * @private
  16572. * @param {Array} array The array to shuffle.
  16573. * @param {number} [size=array.length] The size of `array`.
  16574. * @returns {Array} Returns `array`.
  16575. */
  16576. function shuffleSelf(array, size) {
  16577. var index = -1,
  16578. length = array.length,
  16579. lastIndex = length - 1;
  16580. size = size === undefined ? length : size;
  16581. while (++index < size) {
  16582. var rand = baseRandom(index, lastIndex),
  16583. value = array[rand];
  16584. array[rand] = array[index];
  16585. array[index] = value;
  16586. }
  16587. array.length = size;
  16588. return array;
  16589. }
  16590. /**
  16591. * Converts `string` to a property path array.
  16592. *
  16593. * @private
  16594. * @param {string} string The string to convert.
  16595. * @returns {Array} Returns the property path array.
  16596. */
  16597. var stringToPath = memoizeCapped(function(string) {
  16598. var result = [];
  16599. if (reLeadingDot.test(string)) {
  16600. result.push('');
  16601. }
  16602. string.replace(rePropName, function(match, number, quote, string) {
  16603. result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
  16604. });
  16605. return result;
  16606. });
  16607. /**
  16608. * Converts `value` to a string key if it's not a string or symbol.
  16609. *
  16610. * @private
  16611. * @param {*} value The value to inspect.
  16612. * @returns {string|symbol} Returns the key.
  16613. */
  16614. function toKey(value) {
  16615. if (typeof value == 'string' || isSymbol(value)) {
  16616. return value;
  16617. }
  16618. var result = (value + '');
  16619. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  16620. }
  16621. /**
  16622. * Converts `func` to its source code.
  16623. *
  16624. * @private
  16625. * @param {Function} func The function to convert.
  16626. * @returns {string} Returns the source code.
  16627. */
  16628. function toSource(func) {
  16629. if (func != null) {
  16630. try {
  16631. return funcToString.call(func);
  16632. } catch (e) {}
  16633. try {
  16634. return (func + '');
  16635. } catch (e) {}
  16636. }
  16637. return '';
  16638. }
  16639. /**
  16640. * Updates wrapper `details` based on `bitmask` flags.
  16641. *
  16642. * @private
  16643. * @returns {Array} details The details to modify.
  16644. * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
  16645. * @returns {Array} Returns `details`.
  16646. */
  16647. function updateWrapDetails(details, bitmask) {
  16648. arrayEach(wrapFlags, function(pair) {
  16649. var value = '_.' + pair[0];
  16650. if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
  16651. details.push(value);
  16652. }
  16653. });
  16654. return details.sort();
  16655. }
  16656. /**
  16657. * Creates a clone of `wrapper`.
  16658. *
  16659. * @private
  16660. * @param {Object} wrapper The wrapper to clone.
  16661. * @returns {Object} Returns the cloned wrapper.
  16662. */
  16663. function wrapperClone(wrapper) {
  16664. if (wrapper instanceof LazyWrapper) {
  16665. return wrapper.clone();
  16666. }
  16667. var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
  16668. result.__actions__ = copyArray(wrapper.__actions__);
  16669. result.__index__ = wrapper.__index__;
  16670. result.__values__ = wrapper.__values__;
  16671. return result;
  16672. }
  16673. /*------------------------------------------------------------------------*/
  16674. /**
  16675. * Creates an array of elements split into groups the length of `size`.
  16676. * If `array` can't be split evenly, the final chunk will be the remaining
  16677. * elements.
  16678. *
  16679. * @static
  16680. * @memberOf _
  16681. * @since 3.0.0
  16682. * @category Array
  16683. * @param {Array} array The array to process.
  16684. * @param {number} [size=1] The length of each chunk
  16685. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  16686. * @returns {Array} Returns the new array of chunks.
  16687. * @example
  16688. *
  16689. * _.chunk(['a', 'b', 'c', 'd'], 2);
  16690. * // => [['a', 'b'], ['c', 'd']]
  16691. *
  16692. * _.chunk(['a', 'b', 'c', 'd'], 3);
  16693. * // => [['a', 'b', 'c'], ['d']]
  16694. */
  16695. function chunk(array, size, guard) {
  16696. if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
  16697. size = 1;
  16698. } else {
  16699. size = nativeMax(toInteger(size), 0);
  16700. }
  16701. var length = array == null ? 0 : array.length;
  16702. if (!length || size < 1) {
  16703. return [];
  16704. }
  16705. var index = 0,
  16706. resIndex = 0,
  16707. result = Array(nativeCeil(length / size));
  16708. while (index < length) {
  16709. result[resIndex++] = baseSlice(array, index, (index += size));
  16710. }
  16711. return result;
  16712. }
  16713. /**
  16714. * Creates an array with all falsey values removed. The values `false`, `null`,
  16715. * `0`, `""`, `undefined`, and `NaN` are falsey.
  16716. *
  16717. * @static
  16718. * @memberOf _
  16719. * @since 0.1.0
  16720. * @category Array
  16721. * @param {Array} array The array to compact.
  16722. * @returns {Array} Returns the new array of filtered values.
  16723. * @example
  16724. *
  16725. * _.compact([0, 1, false, 2, '', 3]);
  16726. * // => [1, 2, 3]
  16727. */
  16728. function compact(array) {
  16729. var index = -1,
  16730. length = array == null ? 0 : array.length,
  16731. resIndex = 0,
  16732. result = [];
  16733. while (++index < length) {
  16734. var value = array[index];
  16735. if (value) {
  16736. result[resIndex++] = value;
  16737. }
  16738. }
  16739. return result;
  16740. }
  16741. /**
  16742. * Creates a new array concatenating `array` with any additional arrays
  16743. * and/or values.
  16744. *
  16745. * @static
  16746. * @memberOf _
  16747. * @since 4.0.0
  16748. * @category Array
  16749. * @param {Array} array The array to concatenate.
  16750. * @param {...*} [values] The values to concatenate.
  16751. * @returns {Array} Returns the new concatenated array.
  16752. * @example
  16753. *
  16754. * var array = [1];
  16755. * var other = _.concat(array, 2, [3], [[4]]);
  16756. *
  16757. * console.log(other);
  16758. * // => [1, 2, 3, [4]]
  16759. *
  16760. * console.log(array);
  16761. * // => [1]
  16762. */
  16763. function concat() {
  16764. var length = arguments.length;
  16765. if (!length) {
  16766. return [];
  16767. }
  16768. var args = Array(length - 1),
  16769. array = arguments[0],
  16770. index = length;
  16771. while (index--) {
  16772. args[index - 1] = arguments[index];
  16773. }
  16774. return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
  16775. }
  16776. /**
  16777. * Creates an array of `array` values not included in the other given arrays
  16778. * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  16779. * for equality comparisons. The order and references of result values are
  16780. * determined by the first array.
  16781. *
  16782. * **Note:** Unlike `_.pullAll`, this method returns a new array.
  16783. *
  16784. * @static
  16785. * @memberOf _
  16786. * @since 0.1.0
  16787. * @category Array
  16788. * @param {Array} array The array to inspect.
  16789. * @param {...Array} [values] The values to exclude.
  16790. * @returns {Array} Returns the new array of filtered values.
  16791. * @see _.without, _.xor
  16792. * @example
  16793. *
  16794. * _.difference([2, 1], [2, 3]);
  16795. * // => [1]
  16796. */
  16797. var difference = baseRest(function(array, values) {
  16798. return isArrayLikeObject(array)
  16799. ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
  16800. : [];
  16801. });
  16802. /**
  16803. * This method is like `_.difference` except that it accepts `iteratee` which
  16804. * is invoked for each element of `array` and `values` to generate the criterion
  16805. * by which they're compared. The order and references of result values are
  16806. * determined by the first array. The iteratee is invoked with one argument:
  16807. * (value).
  16808. *
  16809. * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
  16810. *
  16811. * @static
  16812. * @memberOf _
  16813. * @since 4.0.0
  16814. * @category Array
  16815. * @param {Array} array The array to inspect.
  16816. * @param {...Array} [values] The values to exclude.
  16817. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  16818. * @returns {Array} Returns the new array of filtered values.
  16819. * @example
  16820. *
  16821. * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
  16822. * // => [1.2]
  16823. *
  16824. * // The `_.property` iteratee shorthand.
  16825. * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
  16826. * // => [{ 'x': 2 }]
  16827. */
  16828. var differenceBy = baseRest(function(array, values) {
  16829. var iteratee = last(values);
  16830. if (isArrayLikeObject(iteratee)) {
  16831. iteratee = undefined;
  16832. }
  16833. return isArrayLikeObject(array)
  16834. ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
  16835. : [];
  16836. });
  16837. /**
  16838. * This method is like `_.difference` except that it accepts `comparator`
  16839. * which is invoked to compare elements of `array` to `values`. The order and
  16840. * references of result values are determined by the first array. The comparator
  16841. * is invoked with two arguments: (arrVal, othVal).
  16842. *
  16843. * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
  16844. *
  16845. * @static
  16846. * @memberOf _
  16847. * @since 4.0.0
  16848. * @category Array
  16849. * @param {Array} array The array to inspect.
  16850. * @param {...Array} [values] The values to exclude.
  16851. * @param {Function} [comparator] The comparator invoked per element.
  16852. * @returns {Array} Returns the new array of filtered values.
  16853. * @example
  16854. *
  16855. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
  16856. *
  16857. * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
  16858. * // => [{ 'x': 2, 'y': 1 }]
  16859. */
  16860. var differenceWith = baseRest(function(array, values) {
  16861. var comparator = last(values);
  16862. if (isArrayLikeObject(comparator)) {
  16863. comparator = undefined;
  16864. }
  16865. return isArrayLikeObject(array)
  16866. ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
  16867. : [];
  16868. });
  16869. /**
  16870. * Creates a slice of `array` with `n` elements dropped from the beginning.
  16871. *
  16872. * @static
  16873. * @memberOf _
  16874. * @since 0.5.0
  16875. * @category Array
  16876. * @param {Array} array The array to query.
  16877. * @param {number} [n=1] The number of elements to drop.
  16878. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  16879. * @returns {Array} Returns the slice of `array`.
  16880. * @example
  16881. *
  16882. * _.drop([1, 2, 3]);
  16883. * // => [2, 3]
  16884. *
  16885. * _.drop([1, 2, 3], 2);
  16886. * // => [3]
  16887. *
  16888. * _.drop([1, 2, 3], 5);
  16889. * // => []
  16890. *
  16891. * _.drop([1, 2, 3], 0);
  16892. * // => [1, 2, 3]
  16893. */
  16894. function drop(array, n, guard) {
  16895. var length = array == null ? 0 : array.length;
  16896. if (!length) {
  16897. return [];
  16898. }
  16899. n = (guard || n === undefined) ? 1 : toInteger(n);
  16900. return baseSlice(array, n < 0 ? 0 : n, length);
  16901. }
  16902. /**
  16903. * Creates a slice of `array` with `n` elements dropped from the end.
  16904. *
  16905. * @static
  16906. * @memberOf _
  16907. * @since 3.0.0
  16908. * @category Array
  16909. * @param {Array} array The array to query.
  16910. * @param {number} [n=1] The number of elements to drop.
  16911. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  16912. * @returns {Array} Returns the slice of `array`.
  16913. * @example
  16914. *
  16915. * _.dropRight([1, 2, 3]);
  16916. * // => [1, 2]
  16917. *
  16918. * _.dropRight([1, 2, 3], 2);
  16919. * // => [1]
  16920. *
  16921. * _.dropRight([1, 2, 3], 5);
  16922. * // => []
  16923. *
  16924. * _.dropRight([1, 2, 3], 0);
  16925. * // => [1, 2, 3]
  16926. */
  16927. function dropRight(array, n, guard) {
  16928. var length = array == null ? 0 : array.length;
  16929. if (!length) {
  16930. return [];
  16931. }
  16932. n = (guard || n === undefined) ? 1 : toInteger(n);
  16933. n = length - n;
  16934. return baseSlice(array, 0, n < 0 ? 0 : n);
  16935. }
  16936. /**
  16937. * Creates a slice of `array` excluding elements dropped from the end.
  16938. * Elements are dropped until `predicate` returns falsey. The predicate is
  16939. * invoked with three arguments: (value, index, array).
  16940. *
  16941. * @static
  16942. * @memberOf _
  16943. * @since 3.0.0
  16944. * @category Array
  16945. * @param {Array} array The array to query.
  16946. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  16947. * @returns {Array} Returns the slice of `array`.
  16948. * @example
  16949. *
  16950. * var users = [
  16951. * { 'user': 'barney', 'active': true },
  16952. * { 'user': 'fred', 'active': false },
  16953. * { 'user': 'pebbles', 'active': false }
  16954. * ];
  16955. *
  16956. * _.dropRightWhile(users, function(o) { return !o.active; });
  16957. * // => objects for ['barney']
  16958. *
  16959. * // The `_.matches` iteratee shorthand.
  16960. * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
  16961. * // => objects for ['barney', 'fred']
  16962. *
  16963. * // The `_.matchesProperty` iteratee shorthand.
  16964. * _.dropRightWhile(users, ['active', false]);
  16965. * // => objects for ['barney']
  16966. *
  16967. * // The `_.property` iteratee shorthand.
  16968. * _.dropRightWhile(users, 'active');
  16969. * // => objects for ['barney', 'fred', 'pebbles']
  16970. */
  16971. function dropRightWhile(array, predicate) {
  16972. return (array && array.length)
  16973. ? baseWhile(array, getIteratee(predicate, 3), true, true)
  16974. : [];
  16975. }
  16976. /**
  16977. * Creates a slice of `array` excluding elements dropped from the beginning.
  16978. * Elements are dropped until `predicate` returns falsey. The predicate is
  16979. * invoked with three arguments: (value, index, array).
  16980. *
  16981. * @static
  16982. * @memberOf _
  16983. * @since 3.0.0
  16984. * @category Array
  16985. * @param {Array} array The array to query.
  16986. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  16987. * @returns {Array} Returns the slice of `array`.
  16988. * @example
  16989. *
  16990. * var users = [
  16991. * { 'user': 'barney', 'active': false },
  16992. * { 'user': 'fred', 'active': false },
  16993. * { 'user': 'pebbles', 'active': true }
  16994. * ];
  16995. *
  16996. * _.dropWhile(users, function(o) { return !o.active; });
  16997. * // => objects for ['pebbles']
  16998. *
  16999. * // The `_.matches` iteratee shorthand.
  17000. * _.dropWhile(users, { 'user': 'barney', 'active': false });
  17001. * // => objects for ['fred', 'pebbles']
  17002. *
  17003. * // The `_.matchesProperty` iteratee shorthand.
  17004. * _.dropWhile(users, ['active', false]);
  17005. * // => objects for ['pebbles']
  17006. *
  17007. * // The `_.property` iteratee shorthand.
  17008. * _.dropWhile(users, 'active');
  17009. * // => objects for ['barney', 'fred', 'pebbles']
  17010. */
  17011. function dropWhile(array, predicate) {
  17012. return (array && array.length)
  17013. ? baseWhile(array, getIteratee(predicate, 3), true)
  17014. : [];
  17015. }
  17016. /**
  17017. * Fills elements of `array` with `value` from `start` up to, but not
  17018. * including, `end`.
  17019. *
  17020. * **Note:** This method mutates `array`.
  17021. *
  17022. * @static
  17023. * @memberOf _
  17024. * @since 3.2.0
  17025. * @category Array
  17026. * @param {Array} array The array to fill.
  17027. * @param {*} value The value to fill `array` with.
  17028. * @param {number} [start=0] The start position.
  17029. * @param {number} [end=array.length] The end position.
  17030. * @returns {Array} Returns `array`.
  17031. * @example
  17032. *
  17033. * var array = [1, 2, 3];
  17034. *
  17035. * _.fill(array, 'a');
  17036. * console.log(array);
  17037. * // => ['a', 'a', 'a']
  17038. *
  17039. * _.fill(Array(3), 2);
  17040. * // => [2, 2, 2]
  17041. *
  17042. * _.fill([4, 6, 8, 10], '*', 1, 3);
  17043. * // => [4, '*', '*', 10]
  17044. */
  17045. function fill(array, value, start, end) {
  17046. var length = array == null ? 0 : array.length;
  17047. if (!length) {
  17048. return [];
  17049. }
  17050. if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
  17051. start = 0;
  17052. end = length;
  17053. }
  17054. return baseFill(array, value, start, end);
  17055. }
  17056. /**
  17057. * This method is like `_.find` except that it returns the index of the first
  17058. * element `predicate` returns truthy for instead of the element itself.
  17059. *
  17060. * @static
  17061. * @memberOf _
  17062. * @since 1.1.0
  17063. * @category Array
  17064. * @param {Array} array The array to inspect.
  17065. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  17066. * @param {number} [fromIndex=0] The index to search from.
  17067. * @returns {number} Returns the index of the found element, else `-1`.
  17068. * @example
  17069. *
  17070. * var users = [
  17071. * { 'user': 'barney', 'active': false },
  17072. * { 'user': 'fred', 'active': false },
  17073. * { 'user': 'pebbles', 'active': true }
  17074. * ];
  17075. *
  17076. * _.findIndex(users, function(o) { return o.user == 'barney'; });
  17077. * // => 0
  17078. *
  17079. * // The `_.matches` iteratee shorthand.
  17080. * _.findIndex(users, { 'user': 'fred', 'active': false });
  17081. * // => 1
  17082. *
  17083. * // The `_.matchesProperty` iteratee shorthand.
  17084. * _.findIndex(users, ['active', false]);
  17085. * // => 0
  17086. *
  17087. * // The `_.property` iteratee shorthand.
  17088. * _.findIndex(users, 'active');
  17089. * // => 2
  17090. */
  17091. function findIndex(array, predicate, fromIndex) {
  17092. var length = array == null ? 0 : array.length;
  17093. if (!length) {
  17094. return -1;
  17095. }
  17096. var index = fromIndex == null ? 0 : toInteger(fromIndex);
  17097. if (index < 0) {
  17098. index = nativeMax(length + index, 0);
  17099. }
  17100. return baseFindIndex(array, getIteratee(predicate, 3), index);
  17101. }
  17102. /**
  17103. * This method is like `_.findIndex` except that it iterates over elements
  17104. * of `collection` from right to left.
  17105. *
  17106. * @static
  17107. * @memberOf _
  17108. * @since 2.0.0
  17109. * @category Array
  17110. * @param {Array} array The array to inspect.
  17111. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  17112. * @param {number} [fromIndex=array.length-1] The index to search from.
  17113. * @returns {number} Returns the index of the found element, else `-1`.
  17114. * @example
  17115. *
  17116. * var users = [
  17117. * { 'user': 'barney', 'active': true },
  17118. * { 'user': 'fred', 'active': false },
  17119. * { 'user': 'pebbles', 'active': false }
  17120. * ];
  17121. *
  17122. * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
  17123. * // => 2
  17124. *
  17125. * // The `_.matches` iteratee shorthand.
  17126. * _.findLastIndex(users, { 'user': 'barney', 'active': true });
  17127. * // => 0
  17128. *
  17129. * // The `_.matchesProperty` iteratee shorthand.
  17130. * _.findLastIndex(users, ['active', false]);
  17131. * // => 2
  17132. *
  17133. * // The `_.property` iteratee shorthand.
  17134. * _.findLastIndex(users, 'active');
  17135. * // => 0
  17136. */
  17137. function findLastIndex(array, predicate, fromIndex) {
  17138. var length = array == null ? 0 : array.length;
  17139. if (!length) {
  17140. return -1;
  17141. }
  17142. var index = length - 1;
  17143. if (fromIndex !== undefined) {
  17144. index = toInteger(fromIndex);
  17145. index = fromIndex < 0
  17146. ? nativeMax(length + index, 0)
  17147. : nativeMin(index, length - 1);
  17148. }
  17149. return baseFindIndex(array, getIteratee(predicate, 3), index, true);
  17150. }
  17151. /**
  17152. * Flattens `array` a single level deep.
  17153. *
  17154. * @static
  17155. * @memberOf _
  17156. * @since 0.1.0
  17157. * @category Array
  17158. * @param {Array} array The array to flatten.
  17159. * @returns {Array} Returns the new flattened array.
  17160. * @example
  17161. *
  17162. * _.flatten([1, [2, [3, [4]], 5]]);
  17163. * // => [1, 2, [3, [4]], 5]
  17164. */
  17165. function flatten(array) {
  17166. var length = array == null ? 0 : array.length;
  17167. return length ? baseFlatten(array, 1) : [];
  17168. }
  17169. /**
  17170. * Recursively flattens `array`.
  17171. *
  17172. * @static
  17173. * @memberOf _
  17174. * @since 3.0.0
  17175. * @category Array
  17176. * @param {Array} array The array to flatten.
  17177. * @returns {Array} Returns the new flattened array.
  17178. * @example
  17179. *
  17180. * _.flattenDeep([1, [2, [3, [4]], 5]]);
  17181. * // => [1, 2, 3, 4, 5]
  17182. */
  17183. function flattenDeep(array) {
  17184. var length = array == null ? 0 : array.length;
  17185. return length ? baseFlatten(array, INFINITY) : [];
  17186. }
  17187. /**
  17188. * Recursively flatten `array` up to `depth` times.
  17189. *
  17190. * @static
  17191. * @memberOf _
  17192. * @since 4.4.0
  17193. * @category Array
  17194. * @param {Array} array The array to flatten.
  17195. * @param {number} [depth=1] The maximum recursion depth.
  17196. * @returns {Array} Returns the new flattened array.
  17197. * @example
  17198. *
  17199. * var array = [1, [2, [3, [4]], 5]];
  17200. *
  17201. * _.flattenDepth(array, 1);
  17202. * // => [1, 2, [3, [4]], 5]
  17203. *
  17204. * _.flattenDepth(array, 2);
  17205. * // => [1, 2, 3, [4], 5]
  17206. */
  17207. function flattenDepth(array, depth) {
  17208. var length = array == null ? 0 : array.length;
  17209. if (!length) {
  17210. return [];
  17211. }
  17212. depth = depth === undefined ? 1 : toInteger(depth);
  17213. return baseFlatten(array, depth);
  17214. }
  17215. /**
  17216. * The inverse of `_.toPairs`; this method returns an object composed
  17217. * from key-value `pairs`.
  17218. *
  17219. * @static
  17220. * @memberOf _
  17221. * @since 4.0.0
  17222. * @category Array
  17223. * @param {Array} pairs The key-value pairs.
  17224. * @returns {Object} Returns the new object.
  17225. * @example
  17226. *
  17227. * _.fromPairs([['a', 1], ['b', 2]]);
  17228. * // => { 'a': 1, 'b': 2 }
  17229. */
  17230. function fromPairs(pairs) {
  17231. var index = -1,
  17232. length = pairs == null ? 0 : pairs.length,
  17233. result = {};
  17234. while (++index < length) {
  17235. var pair = pairs[index];
  17236. result[pair[0]] = pair[1];
  17237. }
  17238. return result;
  17239. }
  17240. /**
  17241. * Gets the first element of `array`.
  17242. *
  17243. * @static
  17244. * @memberOf _
  17245. * @since 0.1.0
  17246. * @alias first
  17247. * @category Array
  17248. * @param {Array} array The array to query.
  17249. * @returns {*} Returns the first element of `array`.
  17250. * @example
  17251. *
  17252. * _.head([1, 2, 3]);
  17253. * // => 1
  17254. *
  17255. * _.head([]);
  17256. * // => undefined
  17257. */
  17258. function head(array) {
  17259. return (array && array.length) ? array[0] : undefined;
  17260. }
  17261. /**
  17262. * Gets the index at which the first occurrence of `value` is found in `array`
  17263. * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  17264. * for equality comparisons. If `fromIndex` is negative, it's used as the
  17265. * offset from the end of `array`.
  17266. *
  17267. * @static
  17268. * @memberOf _
  17269. * @since 0.1.0
  17270. * @category Array
  17271. * @param {Array} array The array to inspect.
  17272. * @param {*} value The value to search for.
  17273. * @param {number} [fromIndex=0] The index to search from.
  17274. * @returns {number} Returns the index of the matched value, else `-1`.
  17275. * @example
  17276. *
  17277. * _.indexOf([1, 2, 1, 2], 2);
  17278. * // => 1
  17279. *
  17280. * // Search from the `fromIndex`.
  17281. * _.indexOf([1, 2, 1, 2], 2, 2);
  17282. * // => 3
  17283. */
  17284. function indexOf(array, value, fromIndex) {
  17285. var length = array == null ? 0 : array.length;
  17286. if (!length) {
  17287. return -1;
  17288. }
  17289. var index = fromIndex == null ? 0 : toInteger(fromIndex);
  17290. if (index < 0) {
  17291. index = nativeMax(length + index, 0);
  17292. }
  17293. return baseIndexOf(array, value, index);
  17294. }
  17295. /**
  17296. * Gets all but the last element of `array`.
  17297. *
  17298. * @static
  17299. * @memberOf _
  17300. * @since 0.1.0
  17301. * @category Array
  17302. * @param {Array} array The array to query.
  17303. * @returns {Array} Returns the slice of `array`.
  17304. * @example
  17305. *
  17306. * _.initial([1, 2, 3]);
  17307. * // => [1, 2]
  17308. */
  17309. function initial(array) {
  17310. var length = array == null ? 0 : array.length;
  17311. return length ? baseSlice(array, 0, -1) : [];
  17312. }
  17313. /**
  17314. * Creates an array of unique values that are included in all given arrays
  17315. * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  17316. * for equality comparisons. The order and references of result values are
  17317. * determined by the first array.
  17318. *
  17319. * @static
  17320. * @memberOf _
  17321. * @since 0.1.0
  17322. * @category Array
  17323. * @param {...Array} [arrays] The arrays to inspect.
  17324. * @returns {Array} Returns the new array of intersecting values.
  17325. * @example
  17326. *
  17327. * _.intersection([2, 1], [2, 3]);
  17328. * // => [2]
  17329. */
  17330. var intersection = baseRest(function(arrays) {
  17331. var mapped = arrayMap(arrays, castArrayLikeObject);
  17332. return (mapped.length && mapped[0] === arrays[0])
  17333. ? baseIntersection(mapped)
  17334. : [];
  17335. });
  17336. /**
  17337. * This method is like `_.intersection` except that it accepts `iteratee`
  17338. * which is invoked for each element of each `arrays` to generate the criterion
  17339. * by which they're compared. The order and references of result values are
  17340. * determined by the first array. The iteratee is invoked with one argument:
  17341. * (value).
  17342. *
  17343. * @static
  17344. * @memberOf _
  17345. * @since 4.0.0
  17346. * @category Array
  17347. * @param {...Array} [arrays] The arrays to inspect.
  17348. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  17349. * @returns {Array} Returns the new array of intersecting values.
  17350. * @example
  17351. *
  17352. * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
  17353. * // => [2.1]
  17354. *
  17355. * // The `_.property` iteratee shorthand.
  17356. * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
  17357. * // => [{ 'x': 1 }]
  17358. */
  17359. var intersectionBy = baseRest(function(arrays) {
  17360. var iteratee = last(arrays),
  17361. mapped = arrayMap(arrays, castArrayLikeObject);
  17362. if (iteratee === last(mapped)) {
  17363. iteratee = undefined;
  17364. } else {
  17365. mapped.pop();
  17366. }
  17367. return (mapped.length && mapped[0] === arrays[0])
  17368. ? baseIntersection(mapped, getIteratee(iteratee, 2))
  17369. : [];
  17370. });
  17371. /**
  17372. * This method is like `_.intersection` except that it accepts `comparator`
  17373. * which is invoked to compare elements of `arrays`. The order and references
  17374. * of result values are determined by the first array. The comparator is
  17375. * invoked with two arguments: (arrVal, othVal).
  17376. *
  17377. * @static
  17378. * @memberOf _
  17379. * @since 4.0.0
  17380. * @category Array
  17381. * @param {...Array} [arrays] The arrays to inspect.
  17382. * @param {Function} [comparator] The comparator invoked per element.
  17383. * @returns {Array} Returns the new array of intersecting values.
  17384. * @example
  17385. *
  17386. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
  17387. * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
  17388. *
  17389. * _.intersectionWith(objects, others, _.isEqual);
  17390. * // => [{ 'x': 1, 'y': 2 }]
  17391. */
  17392. var intersectionWith = baseRest(function(arrays) {
  17393. var comparator = last(arrays),
  17394. mapped = arrayMap(arrays, castArrayLikeObject);
  17395. comparator = typeof comparator == 'function' ? comparator : undefined;
  17396. if (comparator) {
  17397. mapped.pop();
  17398. }
  17399. return (mapped.length && mapped[0] === arrays[0])
  17400. ? baseIntersection(mapped, undefined, comparator)
  17401. : [];
  17402. });
  17403. /**
  17404. * Converts all elements in `array` into a string separated by `separator`.
  17405. *
  17406. * @static
  17407. * @memberOf _
  17408. * @since 4.0.0
  17409. * @category Array
  17410. * @param {Array} array The array to convert.
  17411. * @param {string} [separator=','] The element separator.
  17412. * @returns {string} Returns the joined string.
  17413. * @example
  17414. *
  17415. * _.join(['a', 'b', 'c'], '~');
  17416. * // => 'a~b~c'
  17417. */
  17418. function join(array, separator) {
  17419. return array == null ? '' : nativeJoin.call(array, separator);
  17420. }
  17421. /**
  17422. * Gets the last element of `array`.
  17423. *
  17424. * @static
  17425. * @memberOf _
  17426. * @since 0.1.0
  17427. * @category Array
  17428. * @param {Array} array The array to query.
  17429. * @returns {*} Returns the last element of `array`.
  17430. * @example
  17431. *
  17432. * _.last([1, 2, 3]);
  17433. * // => 3
  17434. */
  17435. function last(array) {
  17436. var length = array == null ? 0 : array.length;
  17437. return length ? array[length - 1] : undefined;
  17438. }
  17439. /**
  17440. * This method is like `_.indexOf` except that it iterates over elements of
  17441. * `array` from right to left.
  17442. *
  17443. * @static
  17444. * @memberOf _
  17445. * @since 0.1.0
  17446. * @category Array
  17447. * @param {Array} array The array to inspect.
  17448. * @param {*} value The value to search for.
  17449. * @param {number} [fromIndex=array.length-1] The index to search from.
  17450. * @returns {number} Returns the index of the matched value, else `-1`.
  17451. * @example
  17452. *
  17453. * _.lastIndexOf([1, 2, 1, 2], 2);
  17454. * // => 3
  17455. *
  17456. * // Search from the `fromIndex`.
  17457. * _.lastIndexOf([1, 2, 1, 2], 2, 2);
  17458. * // => 1
  17459. */
  17460. function lastIndexOf(array, value, fromIndex) {
  17461. var length = array == null ? 0 : array.length;
  17462. if (!length) {
  17463. return -1;
  17464. }
  17465. var index = length;
  17466. if (fromIndex !== undefined) {
  17467. index = toInteger(fromIndex);
  17468. index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
  17469. }
  17470. return value === value
  17471. ? strictLastIndexOf(array, value, index)
  17472. : baseFindIndex(array, baseIsNaN, index, true);
  17473. }
  17474. /**
  17475. * Gets the element at index `n` of `array`. If `n` is negative, the nth
  17476. * element from the end is returned.
  17477. *
  17478. * @static
  17479. * @memberOf _
  17480. * @since 4.11.0
  17481. * @category Array
  17482. * @param {Array} array The array to query.
  17483. * @param {number} [n=0] The index of the element to return.
  17484. * @returns {*} Returns the nth element of `array`.
  17485. * @example
  17486. *
  17487. * var array = ['a', 'b', 'c', 'd'];
  17488. *
  17489. * _.nth(array, 1);
  17490. * // => 'b'
  17491. *
  17492. * _.nth(array, -2);
  17493. * // => 'c';
  17494. */
  17495. function nth(array, n) {
  17496. return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
  17497. }
  17498. /**
  17499. * Removes all given values from `array` using
  17500. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  17501. * for equality comparisons.
  17502. *
  17503. * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
  17504. * to remove elements from an array by predicate.
  17505. *
  17506. * @static
  17507. * @memberOf _
  17508. * @since 2.0.0
  17509. * @category Array
  17510. * @param {Array} array The array to modify.
  17511. * @param {...*} [values] The values to remove.
  17512. * @returns {Array} Returns `array`.
  17513. * @example
  17514. *
  17515. * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
  17516. *
  17517. * _.pull(array, 'a', 'c');
  17518. * console.log(array);
  17519. * // => ['b', 'b']
  17520. */
  17521. var pull = baseRest(pullAll);
  17522. /**
  17523. * This method is like `_.pull` except that it accepts an array of values to remove.
  17524. *
  17525. * **Note:** Unlike `_.difference`, this method mutates `array`.
  17526. *
  17527. * @static
  17528. * @memberOf _
  17529. * @since 4.0.0
  17530. * @category Array
  17531. * @param {Array} array The array to modify.
  17532. * @param {Array} values The values to remove.
  17533. * @returns {Array} Returns `array`.
  17534. * @example
  17535. *
  17536. * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
  17537. *
  17538. * _.pullAll(array, ['a', 'c']);
  17539. * console.log(array);
  17540. * // => ['b', 'b']
  17541. */
  17542. function pullAll(array, values) {
  17543. return (array && array.length && values && values.length)
  17544. ? basePullAll(array, values)
  17545. : array;
  17546. }
  17547. /**
  17548. * This method is like `_.pullAll` except that it accepts `iteratee` which is
  17549. * invoked for each element of `array` and `values` to generate the criterion
  17550. * by which they're compared. The iteratee is invoked with one argument: (value).
  17551. *
  17552. * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
  17553. *
  17554. * @static
  17555. * @memberOf _
  17556. * @since 4.0.0
  17557. * @category Array
  17558. * @param {Array} array The array to modify.
  17559. * @param {Array} values The values to remove.
  17560. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  17561. * @returns {Array} Returns `array`.
  17562. * @example
  17563. *
  17564. * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
  17565. *
  17566. * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
  17567. * console.log(array);
  17568. * // => [{ 'x': 2 }]
  17569. */
  17570. function pullAllBy(array, values, iteratee) {
  17571. return (array && array.length && values && values.length)
  17572. ? basePullAll(array, values, getIteratee(iteratee, 2))
  17573. : array;
  17574. }
  17575. /**
  17576. * This method is like `_.pullAll` except that it accepts `comparator` which
  17577. * is invoked to compare elements of `array` to `values`. The comparator is
  17578. * invoked with two arguments: (arrVal, othVal).
  17579. *
  17580. * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
  17581. *
  17582. * @static
  17583. * @memberOf _
  17584. * @since 4.6.0
  17585. * @category Array
  17586. * @param {Array} array The array to modify.
  17587. * @param {Array} values The values to remove.
  17588. * @param {Function} [comparator] The comparator invoked per element.
  17589. * @returns {Array} Returns `array`.
  17590. * @example
  17591. *
  17592. * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
  17593. *
  17594. * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
  17595. * console.log(array);
  17596. * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
  17597. */
  17598. function pullAllWith(array, values, comparator) {
  17599. return (array && array.length && values && values.length)
  17600. ? basePullAll(array, values, undefined, comparator)
  17601. : array;
  17602. }
  17603. /**
  17604. * Removes elements from `array` corresponding to `indexes` and returns an
  17605. * array of removed elements.
  17606. *
  17607. * **Note:** Unlike `_.at`, this method mutates `array`.
  17608. *
  17609. * @static
  17610. * @memberOf _
  17611. * @since 3.0.0
  17612. * @category Array
  17613. * @param {Array} array The array to modify.
  17614. * @param {...(number|number[])} [indexes] The indexes of elements to remove.
  17615. * @returns {Array} Returns the new array of removed elements.
  17616. * @example
  17617. *
  17618. * var array = ['a', 'b', 'c', 'd'];
  17619. * var pulled = _.pullAt(array, [1, 3]);
  17620. *
  17621. * console.log(array);
  17622. * // => ['a', 'c']
  17623. *
  17624. * console.log(pulled);
  17625. * // => ['b', 'd']
  17626. */
  17627. var pullAt = flatRest(function(array, indexes) {
  17628. var length = array == null ? 0 : array.length,
  17629. result = baseAt(array, indexes);
  17630. basePullAt(array, arrayMap(indexes, function(index) {
  17631. return isIndex(index, length) ? +index : index;
  17632. }).sort(compareAscending));
  17633. return result;
  17634. });
  17635. /**
  17636. * Removes all elements from `array` that `predicate` returns truthy for
  17637. * and returns an array of the removed elements. The predicate is invoked
  17638. * with three arguments: (value, index, array).
  17639. *
  17640. * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
  17641. * to pull elements from an array by value.
  17642. *
  17643. * @static
  17644. * @memberOf _
  17645. * @since 2.0.0
  17646. * @category Array
  17647. * @param {Array} array The array to modify.
  17648. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  17649. * @returns {Array} Returns the new array of removed elements.
  17650. * @example
  17651. *
  17652. * var array = [1, 2, 3, 4];
  17653. * var evens = _.remove(array, function(n) {
  17654. * return n % 2 == 0;
  17655. * });
  17656. *
  17657. * console.log(array);
  17658. * // => [1, 3]
  17659. *
  17660. * console.log(evens);
  17661. * // => [2, 4]
  17662. */
  17663. function remove(array, predicate) {
  17664. var result = [];
  17665. if (!(array && array.length)) {
  17666. return result;
  17667. }
  17668. var index = -1,
  17669. indexes = [],
  17670. length = array.length;
  17671. predicate = getIteratee(predicate, 3);
  17672. while (++index < length) {
  17673. var value = array[index];
  17674. if (predicate(value, index, array)) {
  17675. result.push(value);
  17676. indexes.push(index);
  17677. }
  17678. }
  17679. basePullAt(array, indexes);
  17680. return result;
  17681. }
  17682. /**
  17683. * Reverses `array` so that the first element becomes the last, the second
  17684. * element becomes the second to last, and so on.
  17685. *
  17686. * **Note:** This method mutates `array` and is based on
  17687. * [`Array#reverse`](https://mdn.io/Array/reverse).
  17688. *
  17689. * @static
  17690. * @memberOf _
  17691. * @since 4.0.0
  17692. * @category Array
  17693. * @param {Array} array The array to modify.
  17694. * @returns {Array} Returns `array`.
  17695. * @example
  17696. *
  17697. * var array = [1, 2, 3];
  17698. *
  17699. * _.reverse(array);
  17700. * // => [3, 2, 1]
  17701. *
  17702. * console.log(array);
  17703. * // => [3, 2, 1]
  17704. */
  17705. function reverse(array) {
  17706. return array == null ? array : nativeReverse.call(array);
  17707. }
  17708. /**
  17709. * Creates a slice of `array` from `start` up to, but not including, `end`.
  17710. *
  17711. * **Note:** This method is used instead of
  17712. * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
  17713. * returned.
  17714. *
  17715. * @static
  17716. * @memberOf _
  17717. * @since 3.0.0
  17718. * @category Array
  17719. * @param {Array} array The array to slice.
  17720. * @param {number} [start=0] The start position.
  17721. * @param {number} [end=array.length] The end position.
  17722. * @returns {Array} Returns the slice of `array`.
  17723. */
  17724. function slice(array, start, end) {
  17725. var length = array == null ? 0 : array.length;
  17726. if (!length) {
  17727. return [];
  17728. }
  17729. if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
  17730. start = 0;
  17731. end = length;
  17732. }
  17733. else {
  17734. start = start == null ? 0 : toInteger(start);
  17735. end = end === undefined ? length : toInteger(end);
  17736. }
  17737. return baseSlice(array, start, end);
  17738. }
  17739. /**
  17740. * Uses a binary search to determine the lowest index at which `value`
  17741. * should be inserted into `array` in order to maintain its sort order.
  17742. *
  17743. * @static
  17744. * @memberOf _
  17745. * @since 0.1.0
  17746. * @category Array
  17747. * @param {Array} array The sorted array to inspect.
  17748. * @param {*} value The value to evaluate.
  17749. * @returns {number} Returns the index at which `value` should be inserted
  17750. * into `array`.
  17751. * @example
  17752. *
  17753. * _.sortedIndex([30, 50], 40);
  17754. * // => 1
  17755. */
  17756. function sortedIndex(array, value) {
  17757. return baseSortedIndex(array, value);
  17758. }
  17759. /**
  17760. * This method is like `_.sortedIndex` except that it accepts `iteratee`
  17761. * which is invoked for `value` and each element of `array` to compute their
  17762. * sort ranking. The iteratee is invoked with one argument: (value).
  17763. *
  17764. * @static
  17765. * @memberOf _
  17766. * @since 4.0.0
  17767. * @category Array
  17768. * @param {Array} array The sorted array to inspect.
  17769. * @param {*} value The value to evaluate.
  17770. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  17771. * @returns {number} Returns the index at which `value` should be inserted
  17772. * into `array`.
  17773. * @example
  17774. *
  17775. * var objects = [{ 'x': 4 }, { 'x': 5 }];
  17776. *
  17777. * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
  17778. * // => 0
  17779. *
  17780. * // The `_.property` iteratee shorthand.
  17781. * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
  17782. * // => 0
  17783. */
  17784. function sortedIndexBy(array, value, iteratee) {
  17785. return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
  17786. }
  17787. /**
  17788. * This method is like `_.indexOf` except that it performs a binary
  17789. * search on a sorted `array`.
  17790. *
  17791. * @static
  17792. * @memberOf _
  17793. * @since 4.0.0
  17794. * @category Array
  17795. * @param {Array} array The array to inspect.
  17796. * @param {*} value The value to search for.
  17797. * @returns {number} Returns the index of the matched value, else `-1`.
  17798. * @example
  17799. *
  17800. * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
  17801. * // => 1
  17802. */
  17803. function sortedIndexOf(array, value) {
  17804. var length = array == null ? 0 : array.length;
  17805. if (length) {
  17806. var index = baseSortedIndex(array, value);
  17807. if (index < length && eq(array[index], value)) {
  17808. return index;
  17809. }
  17810. }
  17811. return -1;
  17812. }
  17813. /**
  17814. * This method is like `_.sortedIndex` except that it returns the highest
  17815. * index at which `value` should be inserted into `array` in order to
  17816. * maintain its sort order.
  17817. *
  17818. * @static
  17819. * @memberOf _
  17820. * @since 3.0.0
  17821. * @category Array
  17822. * @param {Array} array The sorted array to inspect.
  17823. * @param {*} value The value to evaluate.
  17824. * @returns {number} Returns the index at which `value` should be inserted
  17825. * into `array`.
  17826. * @example
  17827. *
  17828. * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
  17829. * // => 4
  17830. */
  17831. function sortedLastIndex(array, value) {
  17832. return baseSortedIndex(array, value, true);
  17833. }
  17834. /**
  17835. * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
  17836. * which is invoked for `value` and each element of `array` to compute their
  17837. * sort ranking. The iteratee is invoked with one argument: (value).
  17838. *
  17839. * @static
  17840. * @memberOf _
  17841. * @since 4.0.0
  17842. * @category Array
  17843. * @param {Array} array The sorted array to inspect.
  17844. * @param {*} value The value to evaluate.
  17845. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  17846. * @returns {number} Returns the index at which `value` should be inserted
  17847. * into `array`.
  17848. * @example
  17849. *
  17850. * var objects = [{ 'x': 4 }, { 'x': 5 }];
  17851. *
  17852. * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
  17853. * // => 1
  17854. *
  17855. * // The `_.property` iteratee shorthand.
  17856. * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
  17857. * // => 1
  17858. */
  17859. function sortedLastIndexBy(array, value, iteratee) {
  17860. return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
  17861. }
  17862. /**
  17863. * This method is like `_.lastIndexOf` except that it performs a binary
  17864. * search on a sorted `array`.
  17865. *
  17866. * @static
  17867. * @memberOf _
  17868. * @since 4.0.0
  17869. * @category Array
  17870. * @param {Array} array The array to inspect.
  17871. * @param {*} value The value to search for.
  17872. * @returns {number} Returns the index of the matched value, else `-1`.
  17873. * @example
  17874. *
  17875. * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
  17876. * // => 3
  17877. */
  17878. function sortedLastIndexOf(array, value) {
  17879. var length = array == null ? 0 : array.length;
  17880. if (length) {
  17881. var index = baseSortedIndex(array, value, true) - 1;
  17882. if (eq(array[index], value)) {
  17883. return index;
  17884. }
  17885. }
  17886. return -1;
  17887. }
  17888. /**
  17889. * This method is like `_.uniq` except that it's designed and optimized
  17890. * for sorted arrays.
  17891. *
  17892. * @static
  17893. * @memberOf _
  17894. * @since 4.0.0
  17895. * @category Array
  17896. * @param {Array} array The array to inspect.
  17897. * @returns {Array} Returns the new duplicate free array.
  17898. * @example
  17899. *
  17900. * _.sortedUniq([1, 1, 2]);
  17901. * // => [1, 2]
  17902. */
  17903. function sortedUniq(array) {
  17904. return (array && array.length)
  17905. ? baseSortedUniq(array)
  17906. : [];
  17907. }
  17908. /**
  17909. * This method is like `_.uniqBy` except that it's designed and optimized
  17910. * for sorted arrays.
  17911. *
  17912. * @static
  17913. * @memberOf _
  17914. * @since 4.0.0
  17915. * @category Array
  17916. * @param {Array} array The array to inspect.
  17917. * @param {Function} [iteratee] The iteratee invoked per element.
  17918. * @returns {Array} Returns the new duplicate free array.
  17919. * @example
  17920. *
  17921. * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
  17922. * // => [1.1, 2.3]
  17923. */
  17924. function sortedUniqBy(array, iteratee) {
  17925. return (array && array.length)
  17926. ? baseSortedUniq(array, getIteratee(iteratee, 2))
  17927. : [];
  17928. }
  17929. /**
  17930. * Gets all but the first element of `array`.
  17931. *
  17932. * @static
  17933. * @memberOf _
  17934. * @since 4.0.0
  17935. * @category Array
  17936. * @param {Array} array The array to query.
  17937. * @returns {Array} Returns the slice of `array`.
  17938. * @example
  17939. *
  17940. * _.tail([1, 2, 3]);
  17941. * // => [2, 3]
  17942. */
  17943. function tail(array) {
  17944. var length = array == null ? 0 : array.length;
  17945. return length ? baseSlice(array, 1, length) : [];
  17946. }
  17947. /**
  17948. * Creates a slice of `array` with `n` elements taken from the beginning.
  17949. *
  17950. * @static
  17951. * @memberOf _
  17952. * @since 0.1.0
  17953. * @category Array
  17954. * @param {Array} array The array to query.
  17955. * @param {number} [n=1] The number of elements to take.
  17956. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  17957. * @returns {Array} Returns the slice of `array`.
  17958. * @example
  17959. *
  17960. * _.take([1, 2, 3]);
  17961. * // => [1]
  17962. *
  17963. * _.take([1, 2, 3], 2);
  17964. * // => [1, 2]
  17965. *
  17966. * _.take([1, 2, 3], 5);
  17967. * // => [1, 2, 3]
  17968. *
  17969. * _.take([1, 2, 3], 0);
  17970. * // => []
  17971. */
  17972. function take(array, n, guard) {
  17973. if (!(array && array.length)) {
  17974. return [];
  17975. }
  17976. n = (guard || n === undefined) ? 1 : toInteger(n);
  17977. return baseSlice(array, 0, n < 0 ? 0 : n);
  17978. }
  17979. /**
  17980. * Creates a slice of `array` with `n` elements taken from the end.
  17981. *
  17982. * @static
  17983. * @memberOf _
  17984. * @since 3.0.0
  17985. * @category Array
  17986. * @param {Array} array The array to query.
  17987. * @param {number} [n=1] The number of elements to take.
  17988. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  17989. * @returns {Array} Returns the slice of `array`.
  17990. * @example
  17991. *
  17992. * _.takeRight([1, 2, 3]);
  17993. * // => [3]
  17994. *
  17995. * _.takeRight([1, 2, 3], 2);
  17996. * // => [2, 3]
  17997. *
  17998. * _.takeRight([1, 2, 3], 5);
  17999. * // => [1, 2, 3]
  18000. *
  18001. * _.takeRight([1, 2, 3], 0);
  18002. * // => []
  18003. */
  18004. function takeRight(array, n, guard) {
  18005. var length = array == null ? 0 : array.length;
  18006. if (!length) {
  18007. return [];
  18008. }
  18009. n = (guard || n === undefined) ? 1 : toInteger(n);
  18010. n = length - n;
  18011. return baseSlice(array, n < 0 ? 0 : n, length);
  18012. }
  18013. /**
  18014. * Creates a slice of `array` with elements taken from the end. Elements are
  18015. * taken until `predicate` returns falsey. The predicate is invoked with
  18016. * three arguments: (value, index, array).
  18017. *
  18018. * @static
  18019. * @memberOf _
  18020. * @since 3.0.0
  18021. * @category Array
  18022. * @param {Array} array The array to query.
  18023. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18024. * @returns {Array} Returns the slice of `array`.
  18025. * @example
  18026. *
  18027. * var users = [
  18028. * { 'user': 'barney', 'active': true },
  18029. * { 'user': 'fred', 'active': false },
  18030. * { 'user': 'pebbles', 'active': false }
  18031. * ];
  18032. *
  18033. * _.takeRightWhile(users, function(o) { return !o.active; });
  18034. * // => objects for ['fred', 'pebbles']
  18035. *
  18036. * // The `_.matches` iteratee shorthand.
  18037. * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
  18038. * // => objects for ['pebbles']
  18039. *
  18040. * // The `_.matchesProperty` iteratee shorthand.
  18041. * _.takeRightWhile(users, ['active', false]);
  18042. * // => objects for ['fred', 'pebbles']
  18043. *
  18044. * // The `_.property` iteratee shorthand.
  18045. * _.takeRightWhile(users, 'active');
  18046. * // => []
  18047. */
  18048. function takeRightWhile(array, predicate) {
  18049. return (array && array.length)
  18050. ? baseWhile(array, getIteratee(predicate, 3), false, true)
  18051. : [];
  18052. }
  18053. /**
  18054. * Creates a slice of `array` with elements taken from the beginning. Elements
  18055. * are taken until `predicate` returns falsey. The predicate is invoked with
  18056. * three arguments: (value, index, array).
  18057. *
  18058. * @static
  18059. * @memberOf _
  18060. * @since 3.0.0
  18061. * @category Array
  18062. * @param {Array} array The array to query.
  18063. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18064. * @returns {Array} Returns the slice of `array`.
  18065. * @example
  18066. *
  18067. * var users = [
  18068. * { 'user': 'barney', 'active': false },
  18069. * { 'user': 'fred', 'active': false },
  18070. * { 'user': 'pebbles', 'active': true }
  18071. * ];
  18072. *
  18073. * _.takeWhile(users, function(o) { return !o.active; });
  18074. * // => objects for ['barney', 'fred']
  18075. *
  18076. * // The `_.matches` iteratee shorthand.
  18077. * _.takeWhile(users, { 'user': 'barney', 'active': false });
  18078. * // => objects for ['barney']
  18079. *
  18080. * // The `_.matchesProperty` iteratee shorthand.
  18081. * _.takeWhile(users, ['active', false]);
  18082. * // => objects for ['barney', 'fred']
  18083. *
  18084. * // The `_.property` iteratee shorthand.
  18085. * _.takeWhile(users, 'active');
  18086. * // => []
  18087. */
  18088. function takeWhile(array, predicate) {
  18089. return (array && array.length)
  18090. ? baseWhile(array, getIteratee(predicate, 3))
  18091. : [];
  18092. }
  18093. /**
  18094. * Creates an array of unique values, in order, from all given arrays using
  18095. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  18096. * for equality comparisons.
  18097. *
  18098. * @static
  18099. * @memberOf _
  18100. * @since 0.1.0
  18101. * @category Array
  18102. * @param {...Array} [arrays] The arrays to inspect.
  18103. * @returns {Array} Returns the new array of combined values.
  18104. * @example
  18105. *
  18106. * _.union([2], [1, 2]);
  18107. * // => [2, 1]
  18108. */
  18109. var union = baseRest(function(arrays) {
  18110. return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
  18111. });
  18112. /**
  18113. * This method is like `_.union` except that it accepts `iteratee` which is
  18114. * invoked for each element of each `arrays` to generate the criterion by
  18115. * which uniqueness is computed. Result values are chosen from the first
  18116. * array in which the value occurs. The iteratee is invoked with one argument:
  18117. * (value).
  18118. *
  18119. * @static
  18120. * @memberOf _
  18121. * @since 4.0.0
  18122. * @category Array
  18123. * @param {...Array} [arrays] The arrays to inspect.
  18124. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  18125. * @returns {Array} Returns the new array of combined values.
  18126. * @example
  18127. *
  18128. * _.unionBy([2.1], [1.2, 2.3], Math.floor);
  18129. * // => [2.1, 1.2]
  18130. *
  18131. * // The `_.property` iteratee shorthand.
  18132. * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
  18133. * // => [{ 'x': 1 }, { 'x': 2 }]
  18134. */
  18135. var unionBy = baseRest(function(arrays) {
  18136. var iteratee = last(arrays);
  18137. if (isArrayLikeObject(iteratee)) {
  18138. iteratee = undefined;
  18139. }
  18140. return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
  18141. });
  18142. /**
  18143. * This method is like `_.union` except that it accepts `comparator` which
  18144. * is invoked to compare elements of `arrays`. Result values are chosen from
  18145. * the first array in which the value occurs. The comparator is invoked
  18146. * with two arguments: (arrVal, othVal).
  18147. *
  18148. * @static
  18149. * @memberOf _
  18150. * @since 4.0.0
  18151. * @category Array
  18152. * @param {...Array} [arrays] The arrays to inspect.
  18153. * @param {Function} [comparator] The comparator invoked per element.
  18154. * @returns {Array} Returns the new array of combined values.
  18155. * @example
  18156. *
  18157. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
  18158. * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
  18159. *
  18160. * _.unionWith(objects, others, _.isEqual);
  18161. * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
  18162. */
  18163. var unionWith = baseRest(function(arrays) {
  18164. var comparator = last(arrays);
  18165. comparator = typeof comparator == 'function' ? comparator : undefined;
  18166. return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
  18167. });
  18168. /**
  18169. * Creates a duplicate-free version of an array, using
  18170. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  18171. * for equality comparisons, in which only the first occurrence of each element
  18172. * is kept. The order of result values is determined by the order they occur
  18173. * in the array.
  18174. *
  18175. * @static
  18176. * @memberOf _
  18177. * @since 0.1.0
  18178. * @category Array
  18179. * @param {Array} array The array to inspect.
  18180. * @returns {Array} Returns the new duplicate free array.
  18181. * @example
  18182. *
  18183. * _.uniq([2, 1, 2]);
  18184. * // => [2, 1]
  18185. */
  18186. function uniq(array) {
  18187. return (array && array.length) ? baseUniq(array) : [];
  18188. }
  18189. /**
  18190. * This method is like `_.uniq` except that it accepts `iteratee` which is
  18191. * invoked for each element in `array` to generate the criterion by which
  18192. * uniqueness is computed. The order of result values is determined by the
  18193. * order they occur in the array. The iteratee is invoked with one argument:
  18194. * (value).
  18195. *
  18196. * @static
  18197. * @memberOf _
  18198. * @since 4.0.0
  18199. * @category Array
  18200. * @param {Array} array The array to inspect.
  18201. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  18202. * @returns {Array} Returns the new duplicate free array.
  18203. * @example
  18204. *
  18205. * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
  18206. * // => [2.1, 1.2]
  18207. *
  18208. * // The `_.property` iteratee shorthand.
  18209. * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
  18210. * // => [{ 'x': 1 }, { 'x': 2 }]
  18211. */
  18212. function uniqBy(array, iteratee) {
  18213. return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
  18214. }
  18215. /**
  18216. * This method is like `_.uniq` except that it accepts `comparator` which
  18217. * is invoked to compare elements of `array`. The order of result values is
  18218. * determined by the order they occur in the array.The comparator is invoked
  18219. * with two arguments: (arrVal, othVal).
  18220. *
  18221. * @static
  18222. * @memberOf _
  18223. * @since 4.0.0
  18224. * @category Array
  18225. * @param {Array} array The array to inspect.
  18226. * @param {Function} [comparator] The comparator invoked per element.
  18227. * @returns {Array} Returns the new duplicate free array.
  18228. * @example
  18229. *
  18230. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
  18231. *
  18232. * _.uniqWith(objects, _.isEqual);
  18233. * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
  18234. */
  18235. function uniqWith(array, comparator) {
  18236. comparator = typeof comparator == 'function' ? comparator : undefined;
  18237. return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
  18238. }
  18239. /**
  18240. * This method is like `_.zip` except that it accepts an array of grouped
  18241. * elements and creates an array regrouping the elements to their pre-zip
  18242. * configuration.
  18243. *
  18244. * @static
  18245. * @memberOf _
  18246. * @since 1.2.0
  18247. * @category Array
  18248. * @param {Array} array The array of grouped elements to process.
  18249. * @returns {Array} Returns the new array of regrouped elements.
  18250. * @example
  18251. *
  18252. * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
  18253. * // => [['a', 1, true], ['b', 2, false]]
  18254. *
  18255. * _.unzip(zipped);
  18256. * // => [['a', 'b'], [1, 2], [true, false]]
  18257. */
  18258. function unzip(array) {
  18259. if (!(array && array.length)) {
  18260. return [];
  18261. }
  18262. var length = 0;
  18263. array = arrayFilter(array, function(group) {
  18264. if (isArrayLikeObject(group)) {
  18265. length = nativeMax(group.length, length);
  18266. return true;
  18267. }
  18268. });
  18269. return baseTimes(length, function(index) {
  18270. return arrayMap(array, baseProperty(index));
  18271. });
  18272. }
  18273. /**
  18274. * This method is like `_.unzip` except that it accepts `iteratee` to specify
  18275. * how regrouped values should be combined. The iteratee is invoked with the
  18276. * elements of each group: (...group).
  18277. *
  18278. * @static
  18279. * @memberOf _
  18280. * @since 3.8.0
  18281. * @category Array
  18282. * @param {Array} array The array of grouped elements to process.
  18283. * @param {Function} [iteratee=_.identity] The function to combine
  18284. * regrouped values.
  18285. * @returns {Array} Returns the new array of regrouped elements.
  18286. * @example
  18287. *
  18288. * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
  18289. * // => [[1, 10, 100], [2, 20, 200]]
  18290. *
  18291. * _.unzipWith(zipped, _.add);
  18292. * // => [3, 30, 300]
  18293. */
  18294. function unzipWith(array, iteratee) {
  18295. if (!(array && array.length)) {
  18296. return [];
  18297. }
  18298. var result = unzip(array);
  18299. if (iteratee == null) {
  18300. return result;
  18301. }
  18302. return arrayMap(result, function(group) {
  18303. return apply(iteratee, undefined, group);
  18304. });
  18305. }
  18306. /**
  18307. * Creates an array excluding all given values using
  18308. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  18309. * for equality comparisons.
  18310. *
  18311. * **Note:** Unlike `_.pull`, this method returns a new array.
  18312. *
  18313. * @static
  18314. * @memberOf _
  18315. * @since 0.1.0
  18316. * @category Array
  18317. * @param {Array} array The array to inspect.
  18318. * @param {...*} [values] The values to exclude.
  18319. * @returns {Array} Returns the new array of filtered values.
  18320. * @see _.difference, _.xor
  18321. * @example
  18322. *
  18323. * _.without([2, 1, 2, 3], 1, 2);
  18324. * // => [3]
  18325. */
  18326. var without = baseRest(function(array, values) {
  18327. return isArrayLikeObject(array)
  18328. ? baseDifference(array, values)
  18329. : [];
  18330. });
  18331. /**
  18332. * Creates an array of unique values that is the
  18333. * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
  18334. * of the given arrays. The order of result values is determined by the order
  18335. * they occur in the arrays.
  18336. *
  18337. * @static
  18338. * @memberOf _
  18339. * @since 2.4.0
  18340. * @category Array
  18341. * @param {...Array} [arrays] The arrays to inspect.
  18342. * @returns {Array} Returns the new array of filtered values.
  18343. * @see _.difference, _.without
  18344. * @example
  18345. *
  18346. * _.xor([2, 1], [2, 3]);
  18347. * // => [1, 3]
  18348. */
  18349. var xor = baseRest(function(arrays) {
  18350. return baseXor(arrayFilter(arrays, isArrayLikeObject));
  18351. });
  18352. /**
  18353. * This method is like `_.xor` except that it accepts `iteratee` which is
  18354. * invoked for each element of each `arrays` to generate the criterion by
  18355. * which by which they're compared. The order of result values is determined
  18356. * by the order they occur in the arrays. The iteratee is invoked with one
  18357. * argument: (value).
  18358. *
  18359. * @static
  18360. * @memberOf _
  18361. * @since 4.0.0
  18362. * @category Array
  18363. * @param {...Array} [arrays] The arrays to inspect.
  18364. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  18365. * @returns {Array} Returns the new array of filtered values.
  18366. * @example
  18367. *
  18368. * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
  18369. * // => [1.2, 3.4]
  18370. *
  18371. * // The `_.property` iteratee shorthand.
  18372. * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
  18373. * // => [{ 'x': 2 }]
  18374. */
  18375. var xorBy = baseRest(function(arrays) {
  18376. var iteratee = last(arrays);
  18377. if (isArrayLikeObject(iteratee)) {
  18378. iteratee = undefined;
  18379. }
  18380. return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
  18381. });
  18382. /**
  18383. * This method is like `_.xor` except that it accepts `comparator` which is
  18384. * invoked to compare elements of `arrays`. The order of result values is
  18385. * determined by the order they occur in the arrays. The comparator is invoked
  18386. * with two arguments: (arrVal, othVal).
  18387. *
  18388. * @static
  18389. * @memberOf _
  18390. * @since 4.0.0
  18391. * @category Array
  18392. * @param {...Array} [arrays] The arrays to inspect.
  18393. * @param {Function} [comparator] The comparator invoked per element.
  18394. * @returns {Array} Returns the new array of filtered values.
  18395. * @example
  18396. *
  18397. * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
  18398. * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
  18399. *
  18400. * _.xorWith(objects, others, _.isEqual);
  18401. * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
  18402. */
  18403. var xorWith = baseRest(function(arrays) {
  18404. var comparator = last(arrays);
  18405. comparator = typeof comparator == 'function' ? comparator : undefined;
  18406. return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
  18407. });
  18408. /**
  18409. * Creates an array of grouped elements, the first of which contains the
  18410. * first elements of the given arrays, the second of which contains the
  18411. * second elements of the given arrays, and so on.
  18412. *
  18413. * @static
  18414. * @memberOf _
  18415. * @since 0.1.0
  18416. * @category Array
  18417. * @param {...Array} [arrays] The arrays to process.
  18418. * @returns {Array} Returns the new array of grouped elements.
  18419. * @example
  18420. *
  18421. * _.zip(['a', 'b'], [1, 2], [true, false]);
  18422. * // => [['a', 1, true], ['b', 2, false]]
  18423. */
  18424. var zip = baseRest(unzip);
  18425. /**
  18426. * This method is like `_.fromPairs` except that it accepts two arrays,
  18427. * one of property identifiers and one of corresponding values.
  18428. *
  18429. * @static
  18430. * @memberOf _
  18431. * @since 0.4.0
  18432. * @category Array
  18433. * @param {Array} [props=[]] The property identifiers.
  18434. * @param {Array} [values=[]] The property values.
  18435. * @returns {Object} Returns the new object.
  18436. * @example
  18437. *
  18438. * _.zipObject(['a', 'b'], [1, 2]);
  18439. * // => { 'a': 1, 'b': 2 }
  18440. */
  18441. function zipObject(props, values) {
  18442. return baseZipObject(props || [], values || [], assignValue);
  18443. }
  18444. /**
  18445. * This method is like `_.zipObject` except that it supports property paths.
  18446. *
  18447. * @static
  18448. * @memberOf _
  18449. * @since 4.1.0
  18450. * @category Array
  18451. * @param {Array} [props=[]] The property identifiers.
  18452. * @param {Array} [values=[]] The property values.
  18453. * @returns {Object} Returns the new object.
  18454. * @example
  18455. *
  18456. * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
  18457. * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
  18458. */
  18459. function zipObjectDeep(props, values) {
  18460. return baseZipObject(props || [], values || [], baseSet);
  18461. }
  18462. /**
  18463. * This method is like `_.zip` except that it accepts `iteratee` to specify
  18464. * how grouped values should be combined. The iteratee is invoked with the
  18465. * elements of each group: (...group).
  18466. *
  18467. * @static
  18468. * @memberOf _
  18469. * @since 3.8.0
  18470. * @category Array
  18471. * @param {...Array} [arrays] The arrays to process.
  18472. * @param {Function} [iteratee=_.identity] The function to combine
  18473. * grouped values.
  18474. * @returns {Array} Returns the new array of grouped elements.
  18475. * @example
  18476. *
  18477. * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
  18478. * return a + b + c;
  18479. * });
  18480. * // => [111, 222]
  18481. */
  18482. var zipWith = baseRest(function(arrays) {
  18483. var length = arrays.length,
  18484. iteratee = length > 1 ? arrays[length - 1] : undefined;
  18485. iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
  18486. return unzipWith(arrays, iteratee);
  18487. });
  18488. /*------------------------------------------------------------------------*/
  18489. /**
  18490. * Creates a `lodash` wrapper instance that wraps `value` with explicit method
  18491. * chain sequences enabled. The result of such sequences must be unwrapped
  18492. * with `_#value`.
  18493. *
  18494. * @static
  18495. * @memberOf _
  18496. * @since 1.3.0
  18497. * @category Seq
  18498. * @param {*} value The value to wrap.
  18499. * @returns {Object} Returns the new `lodash` wrapper instance.
  18500. * @example
  18501. *
  18502. * var users = [
  18503. * { 'user': 'barney', 'age': 36 },
  18504. * { 'user': 'fred', 'age': 40 },
  18505. * { 'user': 'pebbles', 'age': 1 }
  18506. * ];
  18507. *
  18508. * var youngest = _
  18509. * .chain(users)
  18510. * .sortBy('age')
  18511. * .map(function(o) {
  18512. * return o.user + ' is ' + o.age;
  18513. * })
  18514. * .head()
  18515. * .value();
  18516. * // => 'pebbles is 1'
  18517. */
  18518. function chain(value) {
  18519. var result = lodash(value);
  18520. result.__chain__ = true;
  18521. return result;
  18522. }
  18523. /**
  18524. * This method invokes `interceptor` and returns `value`. The interceptor
  18525. * is invoked with one argument; (value). The purpose of this method is to
  18526. * "tap into" a method chain sequence in order to modify intermediate results.
  18527. *
  18528. * @static
  18529. * @memberOf _
  18530. * @since 0.1.0
  18531. * @category Seq
  18532. * @param {*} value The value to provide to `interceptor`.
  18533. * @param {Function} interceptor The function to invoke.
  18534. * @returns {*} Returns `value`.
  18535. * @example
  18536. *
  18537. * _([1, 2, 3])
  18538. * .tap(function(array) {
  18539. * // Mutate input array.
  18540. * array.pop();
  18541. * })
  18542. * .reverse()
  18543. * .value();
  18544. * // => [2, 1]
  18545. */
  18546. function tap(value, interceptor) {
  18547. interceptor(value);
  18548. return value;
  18549. }
  18550. /**
  18551. * This method is like `_.tap` except that it returns the result of `interceptor`.
  18552. * The purpose of this method is to "pass thru" values replacing intermediate
  18553. * results in a method chain sequence.
  18554. *
  18555. * @static
  18556. * @memberOf _
  18557. * @since 3.0.0
  18558. * @category Seq
  18559. * @param {*} value The value to provide to `interceptor`.
  18560. * @param {Function} interceptor The function to invoke.
  18561. * @returns {*} Returns the result of `interceptor`.
  18562. * @example
  18563. *
  18564. * _(' abc ')
  18565. * .chain()
  18566. * .trim()
  18567. * .thru(function(value) {
  18568. * return [value];
  18569. * })
  18570. * .value();
  18571. * // => ['abc']
  18572. */
  18573. function thru(value, interceptor) {
  18574. return interceptor(value);
  18575. }
  18576. /**
  18577. * This method is the wrapper version of `_.at`.
  18578. *
  18579. * @name at
  18580. * @memberOf _
  18581. * @since 1.0.0
  18582. * @category Seq
  18583. * @param {...(string|string[])} [paths] The property paths to pick.
  18584. * @returns {Object} Returns the new `lodash` wrapper instance.
  18585. * @example
  18586. *
  18587. * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
  18588. *
  18589. * _(object).at(['a[0].b.c', 'a[1]']).value();
  18590. * // => [3, 4]
  18591. */
  18592. var wrapperAt = flatRest(function(paths) {
  18593. var length = paths.length,
  18594. start = length ? paths[0] : 0,
  18595. value = this.__wrapped__,
  18596. interceptor = function(object) { return baseAt(object, paths); };
  18597. if (length > 1 || this.__actions__.length ||
  18598. !(value instanceof LazyWrapper) || !isIndex(start)) {
  18599. return this.thru(interceptor);
  18600. }
  18601. value = value.slice(start, +start + (length ? 1 : 0));
  18602. value.__actions__.push({
  18603. 'func': thru,
  18604. 'args': [interceptor],
  18605. 'thisArg': undefined
  18606. });
  18607. return new LodashWrapper(value, this.__chain__).thru(function(array) {
  18608. if (length && !array.length) {
  18609. array.push(undefined);
  18610. }
  18611. return array;
  18612. });
  18613. });
  18614. /**
  18615. * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
  18616. *
  18617. * @name chain
  18618. * @memberOf _
  18619. * @since 0.1.0
  18620. * @category Seq
  18621. * @returns {Object} Returns the new `lodash` wrapper instance.
  18622. * @example
  18623. *
  18624. * var users = [
  18625. * { 'user': 'barney', 'age': 36 },
  18626. * { 'user': 'fred', 'age': 40 }
  18627. * ];
  18628. *
  18629. * // A sequence without explicit chaining.
  18630. * _(users).head();
  18631. * // => { 'user': 'barney', 'age': 36 }
  18632. *
  18633. * // A sequence with explicit chaining.
  18634. * _(users)
  18635. * .chain()
  18636. * .head()
  18637. * .pick('user')
  18638. * .value();
  18639. * // => { 'user': 'barney' }
  18640. */
  18641. function wrapperChain() {
  18642. return chain(this);
  18643. }
  18644. /**
  18645. * Executes the chain sequence and returns the wrapped result.
  18646. *
  18647. * @name commit
  18648. * @memberOf _
  18649. * @since 3.2.0
  18650. * @category Seq
  18651. * @returns {Object} Returns the new `lodash` wrapper instance.
  18652. * @example
  18653. *
  18654. * var array = [1, 2];
  18655. * var wrapped = _(array).push(3);
  18656. *
  18657. * console.log(array);
  18658. * // => [1, 2]
  18659. *
  18660. * wrapped = wrapped.commit();
  18661. * console.log(array);
  18662. * // => [1, 2, 3]
  18663. *
  18664. * wrapped.last();
  18665. * // => 3
  18666. *
  18667. * console.log(array);
  18668. * // => [1, 2, 3]
  18669. */
  18670. function wrapperCommit() {
  18671. return new LodashWrapper(this.value(), this.__chain__);
  18672. }
  18673. /**
  18674. * Gets the next value on a wrapped object following the
  18675. * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
  18676. *
  18677. * @name next
  18678. * @memberOf _
  18679. * @since 4.0.0
  18680. * @category Seq
  18681. * @returns {Object} Returns the next iterator value.
  18682. * @example
  18683. *
  18684. * var wrapped = _([1, 2]);
  18685. *
  18686. * wrapped.next();
  18687. * // => { 'done': false, 'value': 1 }
  18688. *
  18689. * wrapped.next();
  18690. * // => { 'done': false, 'value': 2 }
  18691. *
  18692. * wrapped.next();
  18693. * // => { 'done': true, 'value': undefined }
  18694. */
  18695. function wrapperNext() {
  18696. if (this.__values__ === undefined) {
  18697. this.__values__ = toArray(this.value());
  18698. }
  18699. var done = this.__index__ >= this.__values__.length,
  18700. value = done ? undefined : this.__values__[this.__index__++];
  18701. return { 'done': done, 'value': value };
  18702. }
  18703. /**
  18704. * Enables the wrapper to be iterable.
  18705. *
  18706. * @name Symbol.iterator
  18707. * @memberOf _
  18708. * @since 4.0.0
  18709. * @category Seq
  18710. * @returns {Object} Returns the wrapper object.
  18711. * @example
  18712. *
  18713. * var wrapped = _([1, 2]);
  18714. *
  18715. * wrapped[Symbol.iterator]() === wrapped;
  18716. * // => true
  18717. *
  18718. * Array.from(wrapped);
  18719. * // => [1, 2]
  18720. */
  18721. function wrapperToIterator() {
  18722. return this;
  18723. }
  18724. /**
  18725. * Creates a clone of the chain sequence planting `value` as the wrapped value.
  18726. *
  18727. * @name plant
  18728. * @memberOf _
  18729. * @since 3.2.0
  18730. * @category Seq
  18731. * @param {*} value The value to plant.
  18732. * @returns {Object} Returns the new `lodash` wrapper instance.
  18733. * @example
  18734. *
  18735. * function square(n) {
  18736. * return n * n;
  18737. * }
  18738. *
  18739. * var wrapped = _([1, 2]).map(square);
  18740. * var other = wrapped.plant([3, 4]);
  18741. *
  18742. * other.value();
  18743. * // => [9, 16]
  18744. *
  18745. * wrapped.value();
  18746. * // => [1, 4]
  18747. */
  18748. function wrapperPlant(value) {
  18749. var result,
  18750. parent = this;
  18751. while (parent instanceof baseLodash) {
  18752. var clone = wrapperClone(parent);
  18753. clone.__index__ = 0;
  18754. clone.__values__ = undefined;
  18755. if (result) {
  18756. previous.__wrapped__ = clone;
  18757. } else {
  18758. result = clone;
  18759. }
  18760. var previous = clone;
  18761. parent = parent.__wrapped__;
  18762. }
  18763. previous.__wrapped__ = value;
  18764. return result;
  18765. }
  18766. /**
  18767. * This method is the wrapper version of `_.reverse`.
  18768. *
  18769. * **Note:** This method mutates the wrapped array.
  18770. *
  18771. * @name reverse
  18772. * @memberOf _
  18773. * @since 0.1.0
  18774. * @category Seq
  18775. * @returns {Object} Returns the new `lodash` wrapper instance.
  18776. * @example
  18777. *
  18778. * var array = [1, 2, 3];
  18779. *
  18780. * _(array).reverse().value()
  18781. * // => [3, 2, 1]
  18782. *
  18783. * console.log(array);
  18784. * // => [3, 2, 1]
  18785. */
  18786. function wrapperReverse() {
  18787. var value = this.__wrapped__;
  18788. if (value instanceof LazyWrapper) {
  18789. var wrapped = value;
  18790. if (this.__actions__.length) {
  18791. wrapped = new LazyWrapper(this);
  18792. }
  18793. wrapped = wrapped.reverse();
  18794. wrapped.__actions__.push({
  18795. 'func': thru,
  18796. 'args': [reverse],
  18797. 'thisArg': undefined
  18798. });
  18799. return new LodashWrapper(wrapped, this.__chain__);
  18800. }
  18801. return this.thru(reverse);
  18802. }
  18803. /**
  18804. * Executes the chain sequence to resolve the unwrapped value.
  18805. *
  18806. * @name value
  18807. * @memberOf _
  18808. * @since 0.1.0
  18809. * @alias toJSON, valueOf
  18810. * @category Seq
  18811. * @returns {*} Returns the resolved unwrapped value.
  18812. * @example
  18813. *
  18814. * _([1, 2, 3]).value();
  18815. * // => [1, 2, 3]
  18816. */
  18817. function wrapperValue() {
  18818. return baseWrapperValue(this.__wrapped__, this.__actions__);
  18819. }
  18820. /*------------------------------------------------------------------------*/
  18821. /**
  18822. * Creates an object composed of keys generated from the results of running
  18823. * each element of `collection` thru `iteratee`. The corresponding value of
  18824. * each key is the number of times the key was returned by `iteratee`. The
  18825. * iteratee is invoked with one argument: (value).
  18826. *
  18827. * @static
  18828. * @memberOf _
  18829. * @since 0.5.0
  18830. * @category Collection
  18831. * @param {Array|Object} collection The collection to iterate over.
  18832. * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
  18833. * @returns {Object} Returns the composed aggregate object.
  18834. * @example
  18835. *
  18836. * _.countBy([6.1, 4.2, 6.3], Math.floor);
  18837. * // => { '4': 1, '6': 2 }
  18838. *
  18839. * // The `_.property` iteratee shorthand.
  18840. * _.countBy(['one', 'two', 'three'], 'length');
  18841. * // => { '3': 2, '5': 1 }
  18842. */
  18843. var countBy = createAggregator(function(result, value, key) {
  18844. if (hasOwnProperty.call(result, key)) {
  18845. ++result[key];
  18846. } else {
  18847. baseAssignValue(result, key, 1);
  18848. }
  18849. });
  18850. /**
  18851. * Checks if `predicate` returns truthy for **all** elements of `collection`.
  18852. * Iteration is stopped once `predicate` returns falsey. The predicate is
  18853. * invoked with three arguments: (value, index|key, collection).
  18854. *
  18855. * **Note:** This method returns `true` for
  18856. * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
  18857. * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
  18858. * elements of empty collections.
  18859. *
  18860. * @static
  18861. * @memberOf _
  18862. * @since 0.1.0
  18863. * @category Collection
  18864. * @param {Array|Object} collection The collection to iterate over.
  18865. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18866. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  18867. * @returns {boolean} Returns `true` if all elements pass the predicate check,
  18868. * else `false`.
  18869. * @example
  18870. *
  18871. * _.every([true, 1, null, 'yes'], Boolean);
  18872. * // => false
  18873. *
  18874. * var users = [
  18875. * { 'user': 'barney', 'age': 36, 'active': false },
  18876. * { 'user': 'fred', 'age': 40, 'active': false }
  18877. * ];
  18878. *
  18879. * // The `_.matches` iteratee shorthand.
  18880. * _.every(users, { 'user': 'barney', 'active': false });
  18881. * // => false
  18882. *
  18883. * // The `_.matchesProperty` iteratee shorthand.
  18884. * _.every(users, ['active', false]);
  18885. * // => true
  18886. *
  18887. * // The `_.property` iteratee shorthand.
  18888. * _.every(users, 'active');
  18889. * // => false
  18890. */
  18891. function every(collection, predicate, guard) {
  18892. var func = isArray(collection) ? arrayEvery : baseEvery;
  18893. if (guard && isIterateeCall(collection, predicate, guard)) {
  18894. predicate = undefined;
  18895. }
  18896. return func(collection, getIteratee(predicate, 3));
  18897. }
  18898. /**
  18899. * Iterates over elements of `collection`, returning an array of all elements
  18900. * `predicate` returns truthy for. The predicate is invoked with three
  18901. * arguments: (value, index|key, collection).
  18902. *
  18903. * **Note:** Unlike `_.remove`, this method returns a new array.
  18904. *
  18905. * @static
  18906. * @memberOf _
  18907. * @since 0.1.0
  18908. * @category Collection
  18909. * @param {Array|Object} collection The collection to iterate over.
  18910. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18911. * @returns {Array} Returns the new filtered array.
  18912. * @see _.reject
  18913. * @example
  18914. *
  18915. * var users = [
  18916. * { 'user': 'barney', 'age': 36, 'active': true },
  18917. * { 'user': 'fred', 'age': 40, 'active': false }
  18918. * ];
  18919. *
  18920. * _.filter(users, function(o) { return !o.active; });
  18921. * // => objects for ['fred']
  18922. *
  18923. * // The `_.matches` iteratee shorthand.
  18924. * _.filter(users, { 'age': 36, 'active': true });
  18925. * // => objects for ['barney']
  18926. *
  18927. * // The `_.matchesProperty` iteratee shorthand.
  18928. * _.filter(users, ['active', false]);
  18929. * // => objects for ['fred']
  18930. *
  18931. * // The `_.property` iteratee shorthand.
  18932. * _.filter(users, 'active');
  18933. * // => objects for ['barney']
  18934. */
  18935. function filter(collection, predicate) {
  18936. var func = isArray(collection) ? arrayFilter : baseFilter;
  18937. return func(collection, getIteratee(predicate, 3));
  18938. }
  18939. /**
  18940. * Iterates over elements of `collection`, returning the first element
  18941. * `predicate` returns truthy for. The predicate is invoked with three
  18942. * arguments: (value, index|key, collection).
  18943. *
  18944. * @static
  18945. * @memberOf _
  18946. * @since 0.1.0
  18947. * @category Collection
  18948. * @param {Array|Object} collection The collection to inspect.
  18949. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18950. * @param {number} [fromIndex=0] The index to search from.
  18951. * @returns {*} Returns the matched element, else `undefined`.
  18952. * @example
  18953. *
  18954. * var users = [
  18955. * { 'user': 'barney', 'age': 36, 'active': true },
  18956. * { 'user': 'fred', 'age': 40, 'active': false },
  18957. * { 'user': 'pebbles', 'age': 1, 'active': true }
  18958. * ];
  18959. *
  18960. * _.find(users, function(o) { return o.age < 40; });
  18961. * // => object for 'barney'
  18962. *
  18963. * // The `_.matches` iteratee shorthand.
  18964. * _.find(users, { 'age': 1, 'active': true });
  18965. * // => object for 'pebbles'
  18966. *
  18967. * // The `_.matchesProperty` iteratee shorthand.
  18968. * _.find(users, ['active', false]);
  18969. * // => object for 'fred'
  18970. *
  18971. * // The `_.property` iteratee shorthand.
  18972. * _.find(users, 'active');
  18973. * // => object for 'barney'
  18974. */
  18975. var find = createFind(findIndex);
  18976. /**
  18977. * This method is like `_.find` except that it iterates over elements of
  18978. * `collection` from right to left.
  18979. *
  18980. * @static
  18981. * @memberOf _
  18982. * @since 2.0.0
  18983. * @category Collection
  18984. * @param {Array|Object} collection The collection to inspect.
  18985. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  18986. * @param {number} [fromIndex=collection.length-1] The index to search from.
  18987. * @returns {*} Returns the matched element, else `undefined`.
  18988. * @example
  18989. *
  18990. * _.findLast([1, 2, 3, 4], function(n) {
  18991. * return n % 2 == 1;
  18992. * });
  18993. * // => 3
  18994. */
  18995. var findLast = createFind(findLastIndex);
  18996. /**
  18997. * Creates a flattened array of values by running each element in `collection`
  18998. * thru `iteratee` and flattening the mapped results. The iteratee is invoked
  18999. * with three arguments: (value, index|key, collection).
  19000. *
  19001. * @static
  19002. * @memberOf _
  19003. * @since 4.0.0
  19004. * @category Collection
  19005. * @param {Array|Object} collection The collection to iterate over.
  19006. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19007. * @returns {Array} Returns the new flattened array.
  19008. * @example
  19009. *
  19010. * function duplicate(n) {
  19011. * return [n, n];
  19012. * }
  19013. *
  19014. * _.flatMap([1, 2], duplicate);
  19015. * // => [1, 1, 2, 2]
  19016. */
  19017. function flatMap(collection, iteratee) {
  19018. return baseFlatten(map(collection, iteratee), 1);
  19019. }
  19020. /**
  19021. * This method is like `_.flatMap` except that it recursively flattens the
  19022. * mapped results.
  19023. *
  19024. * @static
  19025. * @memberOf _
  19026. * @since 4.7.0
  19027. * @category Collection
  19028. * @param {Array|Object} collection The collection to iterate over.
  19029. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19030. * @returns {Array} Returns the new flattened array.
  19031. * @example
  19032. *
  19033. * function duplicate(n) {
  19034. * return [[[n, n]]];
  19035. * }
  19036. *
  19037. * _.flatMapDeep([1, 2], duplicate);
  19038. * // => [1, 1, 2, 2]
  19039. */
  19040. function flatMapDeep(collection, iteratee) {
  19041. return baseFlatten(map(collection, iteratee), INFINITY);
  19042. }
  19043. /**
  19044. * This method is like `_.flatMap` except that it recursively flattens the
  19045. * mapped results up to `depth` times.
  19046. *
  19047. * @static
  19048. * @memberOf _
  19049. * @since 4.7.0
  19050. * @category Collection
  19051. * @param {Array|Object} collection The collection to iterate over.
  19052. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19053. * @param {number} [depth=1] The maximum recursion depth.
  19054. * @returns {Array} Returns the new flattened array.
  19055. * @example
  19056. *
  19057. * function duplicate(n) {
  19058. * return [[[n, n]]];
  19059. * }
  19060. *
  19061. * _.flatMapDepth([1, 2], duplicate, 2);
  19062. * // => [[1, 1], [2, 2]]
  19063. */
  19064. function flatMapDepth(collection, iteratee, depth) {
  19065. depth = depth === undefined ? 1 : toInteger(depth);
  19066. return baseFlatten(map(collection, iteratee), depth);
  19067. }
  19068. /**
  19069. * Iterates over elements of `collection` and invokes `iteratee` for each element.
  19070. * The iteratee is invoked with three arguments: (value, index|key, collection).
  19071. * Iteratee functions may exit iteration early by explicitly returning `false`.
  19072. *
  19073. * **Note:** As with other "Collections" methods, objects with a "length"
  19074. * property are iterated like arrays. To avoid this behavior use `_.forIn`
  19075. * or `_.forOwn` for object iteration.
  19076. *
  19077. * @static
  19078. * @memberOf _
  19079. * @since 0.1.0
  19080. * @alias each
  19081. * @category Collection
  19082. * @param {Array|Object} collection The collection to iterate over.
  19083. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19084. * @returns {Array|Object} Returns `collection`.
  19085. * @see _.forEachRight
  19086. * @example
  19087. *
  19088. * _.forEach([1, 2], function(value) {
  19089. * console.log(value);
  19090. * });
  19091. * // => Logs `1` then `2`.
  19092. *
  19093. * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  19094. * console.log(key);
  19095. * });
  19096. * // => Logs 'a' then 'b' (iteration order is not guaranteed).
  19097. */
  19098. function forEach(collection, iteratee) {
  19099. var func = isArray(collection) ? arrayEach : baseEach;
  19100. return func(collection, getIteratee(iteratee, 3));
  19101. }
  19102. /**
  19103. * This method is like `_.forEach` except that it iterates over elements of
  19104. * `collection` from right to left.
  19105. *
  19106. * @static
  19107. * @memberOf _
  19108. * @since 2.0.0
  19109. * @alias eachRight
  19110. * @category Collection
  19111. * @param {Array|Object} collection The collection to iterate over.
  19112. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19113. * @returns {Array|Object} Returns `collection`.
  19114. * @see _.forEach
  19115. * @example
  19116. *
  19117. * _.forEachRight([1, 2], function(value) {
  19118. * console.log(value);
  19119. * });
  19120. * // => Logs `2` then `1`.
  19121. */
  19122. function forEachRight(collection, iteratee) {
  19123. var func = isArray(collection) ? arrayEachRight : baseEachRight;
  19124. return func(collection, getIteratee(iteratee, 3));
  19125. }
  19126. /**
  19127. * Creates an object composed of keys generated from the results of running
  19128. * each element of `collection` thru `iteratee`. The order of grouped values
  19129. * is determined by the order they occur in `collection`. The corresponding
  19130. * value of each key is an array of elements responsible for generating the
  19131. * key. The iteratee is invoked with one argument: (value).
  19132. *
  19133. * @static
  19134. * @memberOf _
  19135. * @since 0.1.0
  19136. * @category Collection
  19137. * @param {Array|Object} collection The collection to iterate over.
  19138. * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
  19139. * @returns {Object} Returns the composed aggregate object.
  19140. * @example
  19141. *
  19142. * _.groupBy([6.1, 4.2, 6.3], Math.floor);
  19143. * // => { '4': [4.2], '6': [6.1, 6.3] }
  19144. *
  19145. * // The `_.property` iteratee shorthand.
  19146. * _.groupBy(['one', 'two', 'three'], 'length');
  19147. * // => { '3': ['one', 'two'], '5': ['three'] }
  19148. */
  19149. var groupBy = createAggregator(function(result, value, key) {
  19150. if (hasOwnProperty.call(result, key)) {
  19151. result[key].push(value);
  19152. } else {
  19153. baseAssignValue(result, key, [value]);
  19154. }
  19155. });
  19156. /**
  19157. * Checks if `value` is in `collection`. If `collection` is a string, it's
  19158. * checked for a substring of `value`, otherwise
  19159. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  19160. * is used for equality comparisons. If `fromIndex` is negative, it's used as
  19161. * the offset from the end of `collection`.
  19162. *
  19163. * @static
  19164. * @memberOf _
  19165. * @since 0.1.0
  19166. * @category Collection
  19167. * @param {Array|Object|string} collection The collection to inspect.
  19168. * @param {*} value The value to search for.
  19169. * @param {number} [fromIndex=0] The index to search from.
  19170. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
  19171. * @returns {boolean} Returns `true` if `value` is found, else `false`.
  19172. * @example
  19173. *
  19174. * _.includes([1, 2, 3], 1);
  19175. * // => true
  19176. *
  19177. * _.includes([1, 2, 3], 1, 2);
  19178. * // => false
  19179. *
  19180. * _.includes({ 'a': 1, 'b': 2 }, 1);
  19181. * // => true
  19182. *
  19183. * _.includes('abcd', 'bc');
  19184. * // => true
  19185. */
  19186. function includes(collection, value, fromIndex, guard) {
  19187. collection = isArrayLike(collection) ? collection : values(collection);
  19188. fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
  19189. var length = collection.length;
  19190. if (fromIndex < 0) {
  19191. fromIndex = nativeMax(length + fromIndex, 0);
  19192. }
  19193. return isString(collection)
  19194. ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
  19195. : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
  19196. }
  19197. /**
  19198. * Invokes the method at `path` of each element in `collection`, returning
  19199. * an array of the results of each invoked method. Any additional arguments
  19200. * are provided to each invoked method. If `path` is a function, it's invoked
  19201. * for, and `this` bound to, each element in `collection`.
  19202. *
  19203. * @static
  19204. * @memberOf _
  19205. * @since 4.0.0
  19206. * @category Collection
  19207. * @param {Array|Object} collection The collection to iterate over.
  19208. * @param {Array|Function|string} path The path of the method to invoke or
  19209. * the function invoked per iteration.
  19210. * @param {...*} [args] The arguments to invoke each method with.
  19211. * @returns {Array} Returns the array of results.
  19212. * @example
  19213. *
  19214. * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
  19215. * // => [[1, 5, 7], [1, 2, 3]]
  19216. *
  19217. * _.invokeMap([123, 456], String.prototype.split, '');
  19218. * // => [['1', '2', '3'], ['4', '5', '6']]
  19219. */
  19220. var invokeMap = baseRest(function(collection, path, args) {
  19221. var index = -1,
  19222. isFunc = typeof path == 'function',
  19223. result = isArrayLike(collection) ? Array(collection.length) : [];
  19224. baseEach(collection, function(value) {
  19225. result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
  19226. });
  19227. return result;
  19228. });
  19229. /**
  19230. * Creates an object composed of keys generated from the results of running
  19231. * each element of `collection` thru `iteratee`. The corresponding value of
  19232. * each key is the last element responsible for generating the key. The
  19233. * iteratee is invoked with one argument: (value).
  19234. *
  19235. * @static
  19236. * @memberOf _
  19237. * @since 4.0.0
  19238. * @category Collection
  19239. * @param {Array|Object} collection The collection to iterate over.
  19240. * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
  19241. * @returns {Object} Returns the composed aggregate object.
  19242. * @example
  19243. *
  19244. * var array = [
  19245. * { 'dir': 'left', 'code': 97 },
  19246. * { 'dir': 'right', 'code': 100 }
  19247. * ];
  19248. *
  19249. * _.keyBy(array, function(o) {
  19250. * return String.fromCharCode(o.code);
  19251. * });
  19252. * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
  19253. *
  19254. * _.keyBy(array, 'dir');
  19255. * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
  19256. */
  19257. var keyBy = createAggregator(function(result, value, key) {
  19258. baseAssignValue(result, key, value);
  19259. });
  19260. /**
  19261. * Creates an array of values by running each element in `collection` thru
  19262. * `iteratee`. The iteratee is invoked with three arguments:
  19263. * (value, index|key, collection).
  19264. *
  19265. * Many lodash methods are guarded to work as iteratees for methods like
  19266. * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
  19267. *
  19268. * The guarded methods are:
  19269. * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
  19270. * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
  19271. * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
  19272. * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
  19273. *
  19274. * @static
  19275. * @memberOf _
  19276. * @since 0.1.0
  19277. * @category Collection
  19278. * @param {Array|Object} collection The collection to iterate over.
  19279. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19280. * @returns {Array} Returns the new mapped array.
  19281. * @example
  19282. *
  19283. * function square(n) {
  19284. * return n * n;
  19285. * }
  19286. *
  19287. * _.map([4, 8], square);
  19288. * // => [16, 64]
  19289. *
  19290. * _.map({ 'a': 4, 'b': 8 }, square);
  19291. * // => [16, 64] (iteration order is not guaranteed)
  19292. *
  19293. * var users = [
  19294. * { 'user': 'barney' },
  19295. * { 'user': 'fred' }
  19296. * ];
  19297. *
  19298. * // The `_.property` iteratee shorthand.
  19299. * _.map(users, 'user');
  19300. * // => ['barney', 'fred']
  19301. */
  19302. function map(collection, iteratee) {
  19303. var func = isArray(collection) ? arrayMap : baseMap;
  19304. return func(collection, getIteratee(iteratee, 3));
  19305. }
  19306. /**
  19307. * This method is like `_.sortBy` except that it allows specifying the sort
  19308. * orders of the iteratees to sort by. If `orders` is unspecified, all values
  19309. * are sorted in ascending order. Otherwise, specify an order of "desc" for
  19310. * descending or "asc" for ascending sort order of corresponding values.
  19311. *
  19312. * @static
  19313. * @memberOf _
  19314. * @since 4.0.0
  19315. * @category Collection
  19316. * @param {Array|Object} collection The collection to iterate over.
  19317. * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
  19318. * The iteratees to sort by.
  19319. * @param {string[]} [orders] The sort orders of `iteratees`.
  19320. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
  19321. * @returns {Array} Returns the new sorted array.
  19322. * @example
  19323. *
  19324. * var users = [
  19325. * { 'user': 'fred', 'age': 48 },
  19326. * { 'user': 'barney', 'age': 34 },
  19327. * { 'user': 'fred', 'age': 40 },
  19328. * { 'user': 'barney', 'age': 36 }
  19329. * ];
  19330. *
  19331. * // Sort by `user` in ascending order and by `age` in descending order.
  19332. * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
  19333. * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
  19334. */
  19335. function orderBy(collection, iteratees, orders, guard) {
  19336. if (collection == null) {
  19337. return [];
  19338. }
  19339. if (!isArray(iteratees)) {
  19340. iteratees = iteratees == null ? [] : [iteratees];
  19341. }
  19342. orders = guard ? undefined : orders;
  19343. if (!isArray(orders)) {
  19344. orders = orders == null ? [] : [orders];
  19345. }
  19346. return baseOrderBy(collection, iteratees, orders);
  19347. }
  19348. /**
  19349. * Creates an array of elements split into two groups, the first of which
  19350. * contains elements `predicate` returns truthy for, the second of which
  19351. * contains elements `predicate` returns falsey for. The predicate is
  19352. * invoked with one argument: (value).
  19353. *
  19354. * @static
  19355. * @memberOf _
  19356. * @since 3.0.0
  19357. * @category Collection
  19358. * @param {Array|Object} collection The collection to iterate over.
  19359. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  19360. * @returns {Array} Returns the array of grouped elements.
  19361. * @example
  19362. *
  19363. * var users = [
  19364. * { 'user': 'barney', 'age': 36, 'active': false },
  19365. * { 'user': 'fred', 'age': 40, 'active': true },
  19366. * { 'user': 'pebbles', 'age': 1, 'active': false }
  19367. * ];
  19368. *
  19369. * _.partition(users, function(o) { return o.active; });
  19370. * // => objects for [['fred'], ['barney', 'pebbles']]
  19371. *
  19372. * // The `_.matches` iteratee shorthand.
  19373. * _.partition(users, { 'age': 1, 'active': false });
  19374. * // => objects for [['pebbles'], ['barney', 'fred']]
  19375. *
  19376. * // The `_.matchesProperty` iteratee shorthand.
  19377. * _.partition(users, ['active', false]);
  19378. * // => objects for [['barney', 'pebbles'], ['fred']]
  19379. *
  19380. * // The `_.property` iteratee shorthand.
  19381. * _.partition(users, 'active');
  19382. * // => objects for [['fred'], ['barney', 'pebbles']]
  19383. */
  19384. var partition = createAggregator(function(result, value, key) {
  19385. result[key ? 0 : 1].push(value);
  19386. }, function() { return [[], []]; });
  19387. /**
  19388. * Reduces `collection` to a value which is the accumulated result of running
  19389. * each element in `collection` thru `iteratee`, where each successive
  19390. * invocation is supplied the return value of the previous. If `accumulator`
  19391. * is not given, the first element of `collection` is used as the initial
  19392. * value. The iteratee is invoked with four arguments:
  19393. * (accumulator, value, index|key, collection).
  19394. *
  19395. * Many lodash methods are guarded to work as iteratees for methods like
  19396. * `_.reduce`, `_.reduceRight`, and `_.transform`.
  19397. *
  19398. * The guarded methods are:
  19399. * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
  19400. * and `sortBy`
  19401. *
  19402. * @static
  19403. * @memberOf _
  19404. * @since 0.1.0
  19405. * @category Collection
  19406. * @param {Array|Object} collection The collection to iterate over.
  19407. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19408. * @param {*} [accumulator] The initial value.
  19409. * @returns {*} Returns the accumulated value.
  19410. * @see _.reduceRight
  19411. * @example
  19412. *
  19413. * _.reduce([1, 2], function(sum, n) {
  19414. * return sum + n;
  19415. * }, 0);
  19416. * // => 3
  19417. *
  19418. * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
  19419. * (result[value] || (result[value] = [])).push(key);
  19420. * return result;
  19421. * }, {});
  19422. * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
  19423. */
  19424. function reduce(collection, iteratee, accumulator) {
  19425. var func = isArray(collection) ? arrayReduce : baseReduce,
  19426. initAccum = arguments.length < 3;
  19427. return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
  19428. }
  19429. /**
  19430. * This method is like `_.reduce` except that it iterates over elements of
  19431. * `collection` from right to left.
  19432. *
  19433. * @static
  19434. * @memberOf _
  19435. * @since 0.1.0
  19436. * @category Collection
  19437. * @param {Array|Object} collection The collection to iterate over.
  19438. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  19439. * @param {*} [accumulator] The initial value.
  19440. * @returns {*} Returns the accumulated value.
  19441. * @see _.reduce
  19442. * @example
  19443. *
  19444. * var array = [[0, 1], [2, 3], [4, 5]];
  19445. *
  19446. * _.reduceRight(array, function(flattened, other) {
  19447. * return flattened.concat(other);
  19448. * }, []);
  19449. * // => [4, 5, 2, 3, 0, 1]
  19450. */
  19451. function reduceRight(collection, iteratee, accumulator) {
  19452. var func = isArray(collection) ? arrayReduceRight : baseReduce,
  19453. initAccum = arguments.length < 3;
  19454. return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
  19455. }
  19456. /**
  19457. * The opposite of `_.filter`; this method returns the elements of `collection`
  19458. * that `predicate` does **not** return truthy for.
  19459. *
  19460. * @static
  19461. * @memberOf _
  19462. * @since 0.1.0
  19463. * @category Collection
  19464. * @param {Array|Object} collection The collection to iterate over.
  19465. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  19466. * @returns {Array} Returns the new filtered array.
  19467. * @see _.filter
  19468. * @example
  19469. *
  19470. * var users = [
  19471. * { 'user': 'barney', 'age': 36, 'active': false },
  19472. * { 'user': 'fred', 'age': 40, 'active': true }
  19473. * ];
  19474. *
  19475. * _.reject(users, function(o) { return !o.active; });
  19476. * // => objects for ['fred']
  19477. *
  19478. * // The `_.matches` iteratee shorthand.
  19479. * _.reject(users, { 'age': 40, 'active': true });
  19480. * // => objects for ['barney']
  19481. *
  19482. * // The `_.matchesProperty` iteratee shorthand.
  19483. * _.reject(users, ['active', false]);
  19484. * // => objects for ['fred']
  19485. *
  19486. * // The `_.property` iteratee shorthand.
  19487. * _.reject(users, 'active');
  19488. * // => objects for ['barney']
  19489. */
  19490. function reject(collection, predicate) {
  19491. var func = isArray(collection) ? arrayFilter : baseFilter;
  19492. return func(collection, negate(getIteratee(predicate, 3)));
  19493. }
  19494. /**
  19495. * Gets a random element from `collection`.
  19496. *
  19497. * @static
  19498. * @memberOf _
  19499. * @since 2.0.0
  19500. * @category Collection
  19501. * @param {Array|Object} collection The collection to sample.
  19502. * @returns {*} Returns the random element.
  19503. * @example
  19504. *
  19505. * _.sample([1, 2, 3, 4]);
  19506. * // => 2
  19507. */
  19508. function sample(collection) {
  19509. var func = isArray(collection) ? arraySample : baseSample;
  19510. return func(collection);
  19511. }
  19512. /**
  19513. * Gets `n` random elements at unique keys from `collection` up to the
  19514. * size of `collection`.
  19515. *
  19516. * @static
  19517. * @memberOf _
  19518. * @since 4.0.0
  19519. * @category Collection
  19520. * @param {Array|Object} collection The collection to sample.
  19521. * @param {number} [n=1] The number of elements to sample.
  19522. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  19523. * @returns {Array} Returns the random elements.
  19524. * @example
  19525. *
  19526. * _.sampleSize([1, 2, 3], 2);
  19527. * // => [3, 1]
  19528. *
  19529. * _.sampleSize([1, 2, 3], 4);
  19530. * // => [2, 3, 1]
  19531. */
  19532. function sampleSize(collection, n, guard) {
  19533. if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
  19534. n = 1;
  19535. } else {
  19536. n = toInteger(n);
  19537. }
  19538. var func = isArray(collection) ? arraySampleSize : baseSampleSize;
  19539. return func(collection, n);
  19540. }
  19541. /**
  19542. * Creates an array of shuffled values, using a version of the
  19543. * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
  19544. *
  19545. * @static
  19546. * @memberOf _
  19547. * @since 0.1.0
  19548. * @category Collection
  19549. * @param {Array|Object} collection The collection to shuffle.
  19550. * @returns {Array} Returns the new shuffled array.
  19551. * @example
  19552. *
  19553. * _.shuffle([1, 2, 3, 4]);
  19554. * // => [4, 1, 3, 2]
  19555. */
  19556. function shuffle(collection) {
  19557. var func = isArray(collection) ? arrayShuffle : baseShuffle;
  19558. return func(collection);
  19559. }
  19560. /**
  19561. * Gets the size of `collection` by returning its length for array-like
  19562. * values or the number of own enumerable string keyed properties for objects.
  19563. *
  19564. * @static
  19565. * @memberOf _
  19566. * @since 0.1.0
  19567. * @category Collection
  19568. * @param {Array|Object|string} collection The collection to inspect.
  19569. * @returns {number} Returns the collection size.
  19570. * @example
  19571. *
  19572. * _.size([1, 2, 3]);
  19573. * // => 3
  19574. *
  19575. * _.size({ 'a': 1, 'b': 2 });
  19576. * // => 2
  19577. *
  19578. * _.size('pebbles');
  19579. * // => 7
  19580. */
  19581. function size(collection) {
  19582. if (collection == null) {
  19583. return 0;
  19584. }
  19585. if (isArrayLike(collection)) {
  19586. return isString(collection) ? stringSize(collection) : collection.length;
  19587. }
  19588. var tag = getTag(collection);
  19589. if (tag == mapTag || tag == setTag) {
  19590. return collection.size;
  19591. }
  19592. return baseKeys(collection).length;
  19593. }
  19594. /**
  19595. * Checks if `predicate` returns truthy for **any** element of `collection`.
  19596. * Iteration is stopped once `predicate` returns truthy. The predicate is
  19597. * invoked with three arguments: (value, index|key, collection).
  19598. *
  19599. * @static
  19600. * @memberOf _
  19601. * @since 0.1.0
  19602. * @category Collection
  19603. * @param {Array|Object} collection The collection to iterate over.
  19604. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  19605. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  19606. * @returns {boolean} Returns `true` if any element passes the predicate check,
  19607. * else `false`.
  19608. * @example
  19609. *
  19610. * _.some([null, 0, 'yes', false], Boolean);
  19611. * // => true
  19612. *
  19613. * var users = [
  19614. * { 'user': 'barney', 'active': true },
  19615. * { 'user': 'fred', 'active': false }
  19616. * ];
  19617. *
  19618. * // The `_.matches` iteratee shorthand.
  19619. * _.some(users, { 'user': 'barney', 'active': false });
  19620. * // => false
  19621. *
  19622. * // The `_.matchesProperty` iteratee shorthand.
  19623. * _.some(users, ['active', false]);
  19624. * // => true
  19625. *
  19626. * // The `_.property` iteratee shorthand.
  19627. * _.some(users, 'active');
  19628. * // => true
  19629. */
  19630. function some(collection, predicate, guard) {
  19631. var func = isArray(collection) ? arraySome : baseSome;
  19632. if (guard && isIterateeCall(collection, predicate, guard)) {
  19633. predicate = undefined;
  19634. }
  19635. return func(collection, getIteratee(predicate, 3));
  19636. }
  19637. /**
  19638. * Creates an array of elements, sorted in ascending order by the results of
  19639. * running each element in a collection thru each iteratee. This method
  19640. * performs a stable sort, that is, it preserves the original sort order of
  19641. * equal elements. The iteratees are invoked with one argument: (value).
  19642. *
  19643. * @static
  19644. * @memberOf _
  19645. * @since 0.1.0
  19646. * @category Collection
  19647. * @param {Array|Object} collection The collection to iterate over.
  19648. * @param {...(Function|Function[])} [iteratees=[_.identity]]
  19649. * The iteratees to sort by.
  19650. * @returns {Array} Returns the new sorted array.
  19651. * @example
  19652. *
  19653. * var users = [
  19654. * { 'user': 'fred', 'age': 48 },
  19655. * { 'user': 'barney', 'age': 36 },
  19656. * { 'user': 'fred', 'age': 40 },
  19657. * { 'user': 'barney', 'age': 34 }
  19658. * ];
  19659. *
  19660. * _.sortBy(users, [function(o) { return o.user; }]);
  19661. * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
  19662. *
  19663. * _.sortBy(users, ['user', 'age']);
  19664. * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
  19665. */
  19666. var sortBy = baseRest(function(collection, iteratees) {
  19667. if (collection == null) {
  19668. return [];
  19669. }
  19670. var length = iteratees.length;
  19671. if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
  19672. iteratees = [];
  19673. } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
  19674. iteratees = [iteratees[0]];
  19675. }
  19676. return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
  19677. });
  19678. /*------------------------------------------------------------------------*/
  19679. /**
  19680. * Gets the timestamp of the number of milliseconds that have elapsed since
  19681. * the Unix epoch (1 January 1970 00:00:00 UTC).
  19682. *
  19683. * @static
  19684. * @memberOf _
  19685. * @since 2.4.0
  19686. * @category Date
  19687. * @returns {number} Returns the timestamp.
  19688. * @example
  19689. *
  19690. * _.defer(function(stamp) {
  19691. * console.log(_.now() - stamp);
  19692. * }, _.now());
  19693. * // => Logs the number of milliseconds it took for the deferred invocation.
  19694. */
  19695. var now = ctxNow || function() {
  19696. return root.Date.now();
  19697. };
  19698. /*------------------------------------------------------------------------*/
  19699. /**
  19700. * The opposite of `_.before`; this method creates a function that invokes
  19701. * `func` once it's called `n` or more times.
  19702. *
  19703. * @static
  19704. * @memberOf _
  19705. * @since 0.1.0
  19706. * @category Function
  19707. * @param {number} n The number of calls before `func` is invoked.
  19708. * @param {Function} func The function to restrict.
  19709. * @returns {Function} Returns the new restricted function.
  19710. * @example
  19711. *
  19712. * var saves = ['profile', 'settings'];
  19713. *
  19714. * var done = _.after(saves.length, function() {
  19715. * console.log('done saving!');
  19716. * });
  19717. *
  19718. * _.forEach(saves, function(type) {
  19719. * asyncSave({ 'type': type, 'complete': done });
  19720. * });
  19721. * // => Logs 'done saving!' after the two async saves have completed.
  19722. */
  19723. function after(n, func) {
  19724. if (typeof func != 'function') {
  19725. throw new TypeError(FUNC_ERROR_TEXT);
  19726. }
  19727. n = toInteger(n);
  19728. return function() {
  19729. if (--n < 1) {
  19730. return func.apply(this, arguments);
  19731. }
  19732. };
  19733. }
  19734. /**
  19735. * Creates a function that invokes `func`, with up to `n` arguments,
  19736. * ignoring any additional arguments.
  19737. *
  19738. * @static
  19739. * @memberOf _
  19740. * @since 3.0.0
  19741. * @category Function
  19742. * @param {Function} func The function to cap arguments for.
  19743. * @param {number} [n=func.length] The arity cap.
  19744. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  19745. * @returns {Function} Returns the new capped function.
  19746. * @example
  19747. *
  19748. * _.map(['6', '8', '10'], _.ary(parseInt, 1));
  19749. * // => [6, 8, 10]
  19750. */
  19751. function ary(func, n, guard) {
  19752. n = guard ? undefined : n;
  19753. n = (func && n == null) ? func.length : n;
  19754. return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
  19755. }
  19756. /**
  19757. * Creates a function that invokes `func`, with the `this` binding and arguments
  19758. * of the created function, while it's called less than `n` times. Subsequent
  19759. * calls to the created function return the result of the last `func` invocation.
  19760. *
  19761. * @static
  19762. * @memberOf _
  19763. * @since 3.0.0
  19764. * @category Function
  19765. * @param {number} n The number of calls at which `func` is no longer invoked.
  19766. * @param {Function} func The function to restrict.
  19767. * @returns {Function} Returns the new restricted function.
  19768. * @example
  19769. *
  19770. * jQuery(element).on('click', _.before(5, addContactToList));
  19771. * // => Allows adding up to 4 contacts to the list.
  19772. */
  19773. function before(n, func) {
  19774. var result;
  19775. if (typeof func != 'function') {
  19776. throw new TypeError(FUNC_ERROR_TEXT);
  19777. }
  19778. n = toInteger(n);
  19779. return function() {
  19780. if (--n > 0) {
  19781. result = func.apply(this, arguments);
  19782. }
  19783. if (n <= 1) {
  19784. func = undefined;
  19785. }
  19786. return result;
  19787. };
  19788. }
  19789. /**
  19790. * Creates a function that invokes `func` with the `this` binding of `thisArg`
  19791. * and `partials` prepended to the arguments it receives.
  19792. *
  19793. * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
  19794. * may be used as a placeholder for partially applied arguments.
  19795. *
  19796. * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
  19797. * property of bound functions.
  19798. *
  19799. * @static
  19800. * @memberOf _
  19801. * @since 0.1.0
  19802. * @category Function
  19803. * @param {Function} func The function to bind.
  19804. * @param {*} thisArg The `this` binding of `func`.
  19805. * @param {...*} [partials] The arguments to be partially applied.
  19806. * @returns {Function} Returns the new bound function.
  19807. * @example
  19808. *
  19809. * function greet(greeting, punctuation) {
  19810. * return greeting + ' ' + this.user + punctuation;
  19811. * }
  19812. *
  19813. * var object = { 'user': 'fred' };
  19814. *
  19815. * var bound = _.bind(greet, object, 'hi');
  19816. * bound('!');
  19817. * // => 'hi fred!'
  19818. *
  19819. * // Bound with placeholders.
  19820. * var bound = _.bind(greet, object, _, '!');
  19821. * bound('hi');
  19822. * // => 'hi fred!'
  19823. */
  19824. var bind = baseRest(function(func, thisArg, partials) {
  19825. var bitmask = WRAP_BIND_FLAG;
  19826. if (partials.length) {
  19827. var holders = replaceHolders(partials, getHolder(bind));
  19828. bitmask |= WRAP_PARTIAL_FLAG;
  19829. }
  19830. return createWrap(func, bitmask, thisArg, partials, holders);
  19831. });
  19832. /**
  19833. * Creates a function that invokes the method at `object[key]` with `partials`
  19834. * prepended to the arguments it receives.
  19835. *
  19836. * This method differs from `_.bind` by allowing bound functions to reference
  19837. * methods that may be redefined or don't yet exist. See
  19838. * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
  19839. * for more details.
  19840. *
  19841. * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
  19842. * builds, may be used as a placeholder for partially applied arguments.
  19843. *
  19844. * @static
  19845. * @memberOf _
  19846. * @since 0.10.0
  19847. * @category Function
  19848. * @param {Object} object The object to invoke the method on.
  19849. * @param {string} key The key of the method.
  19850. * @param {...*} [partials] The arguments to be partially applied.
  19851. * @returns {Function} Returns the new bound function.
  19852. * @example
  19853. *
  19854. * var object = {
  19855. * 'user': 'fred',
  19856. * 'greet': function(greeting, punctuation) {
  19857. * return greeting + ' ' + this.user + punctuation;
  19858. * }
  19859. * };
  19860. *
  19861. * var bound = _.bindKey(object, 'greet', 'hi');
  19862. * bound('!');
  19863. * // => 'hi fred!'
  19864. *
  19865. * object.greet = function(greeting, punctuation) {
  19866. * return greeting + 'ya ' + this.user + punctuation;
  19867. * };
  19868. *
  19869. * bound('!');
  19870. * // => 'hiya fred!'
  19871. *
  19872. * // Bound with placeholders.
  19873. * var bound = _.bindKey(object, 'greet', _, '!');
  19874. * bound('hi');
  19875. * // => 'hiya fred!'
  19876. */
  19877. var bindKey = baseRest(function(object, key, partials) {
  19878. var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
  19879. if (partials.length) {
  19880. var holders = replaceHolders(partials, getHolder(bindKey));
  19881. bitmask |= WRAP_PARTIAL_FLAG;
  19882. }
  19883. return createWrap(key, bitmask, object, partials, holders);
  19884. });
  19885. /**
  19886. * Creates a function that accepts arguments of `func` and either invokes
  19887. * `func` returning its result, if at least `arity` number of arguments have
  19888. * been provided, or returns a function that accepts the remaining `func`
  19889. * arguments, and so on. The arity of `func` may be specified if `func.length`
  19890. * is not sufficient.
  19891. *
  19892. * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
  19893. * may be used as a placeholder for provided arguments.
  19894. *
  19895. * **Note:** This method doesn't set the "length" property of curried functions.
  19896. *
  19897. * @static
  19898. * @memberOf _
  19899. * @since 2.0.0
  19900. * @category Function
  19901. * @param {Function} func The function to curry.
  19902. * @param {number} [arity=func.length] The arity of `func`.
  19903. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  19904. * @returns {Function} Returns the new curried function.
  19905. * @example
  19906. *
  19907. * var abc = function(a, b, c) {
  19908. * return [a, b, c];
  19909. * };
  19910. *
  19911. * var curried = _.curry(abc);
  19912. *
  19913. * curried(1)(2)(3);
  19914. * // => [1, 2, 3]
  19915. *
  19916. * curried(1, 2)(3);
  19917. * // => [1, 2, 3]
  19918. *
  19919. * curried(1, 2, 3);
  19920. * // => [1, 2, 3]
  19921. *
  19922. * // Curried with placeholders.
  19923. * curried(1)(_, 3)(2);
  19924. * // => [1, 2, 3]
  19925. */
  19926. function curry(func, arity, guard) {
  19927. arity = guard ? undefined : arity;
  19928. var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
  19929. result.placeholder = curry.placeholder;
  19930. return result;
  19931. }
  19932. /**
  19933. * This method is like `_.curry` except that arguments are applied to `func`
  19934. * in the manner of `_.partialRight` instead of `_.partial`.
  19935. *
  19936. * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
  19937. * builds, may be used as a placeholder for provided arguments.
  19938. *
  19939. * **Note:** This method doesn't set the "length" property of curried functions.
  19940. *
  19941. * @static
  19942. * @memberOf _
  19943. * @since 3.0.0
  19944. * @category Function
  19945. * @param {Function} func The function to curry.
  19946. * @param {number} [arity=func.length] The arity of `func`.
  19947. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  19948. * @returns {Function} Returns the new curried function.
  19949. * @example
  19950. *
  19951. * var abc = function(a, b, c) {
  19952. * return [a, b, c];
  19953. * };
  19954. *
  19955. * var curried = _.curryRight(abc);
  19956. *
  19957. * curried(3)(2)(1);
  19958. * // => [1, 2, 3]
  19959. *
  19960. * curried(2, 3)(1);
  19961. * // => [1, 2, 3]
  19962. *
  19963. * curried(1, 2, 3);
  19964. * // => [1, 2, 3]
  19965. *
  19966. * // Curried with placeholders.
  19967. * curried(3)(1, _)(2);
  19968. * // => [1, 2, 3]
  19969. */
  19970. function curryRight(func, arity, guard) {
  19971. arity = guard ? undefined : arity;
  19972. var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
  19973. result.placeholder = curryRight.placeholder;
  19974. return result;
  19975. }
  19976. /**
  19977. * Creates a debounced function that delays invoking `func` until after `wait`
  19978. * milliseconds have elapsed since the last time the debounced function was
  19979. * invoked. The debounced function comes with a `cancel` method to cancel
  19980. * delayed `func` invocations and a `flush` method to immediately invoke them.
  19981. * Provide `options` to indicate whether `func` should be invoked on the
  19982. * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
  19983. * with the last arguments provided to the debounced function. Subsequent
  19984. * calls to the debounced function return the result of the last `func`
  19985. * invocation.
  19986. *
  19987. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  19988. * invoked on the trailing edge of the timeout only if the debounced function
  19989. * is invoked more than once during the `wait` timeout.
  19990. *
  19991. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  19992. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  19993. *
  19994. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  19995. * for details over the differences between `_.debounce` and `_.throttle`.
  19996. *
  19997. * @static
  19998. * @memberOf _
  19999. * @since 0.1.0
  20000. * @category Function
  20001. * @param {Function} func The function to debounce.
  20002. * @param {number} [wait=0] The number of milliseconds to delay.
  20003. * @param {Object} [options={}] The options object.
  20004. * @param {boolean} [options.leading=false]
  20005. * Specify invoking on the leading edge of the timeout.
  20006. * @param {number} [options.maxWait]
  20007. * The maximum time `func` is allowed to be delayed before it's invoked.
  20008. * @param {boolean} [options.trailing=true]
  20009. * Specify invoking on the trailing edge of the timeout.
  20010. * @returns {Function} Returns the new debounced function.
  20011. * @example
  20012. *
  20013. * // Avoid costly calculations while the window size is in flux.
  20014. * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
  20015. *
  20016. * // Invoke `sendMail` when clicked, debouncing subsequent calls.
  20017. * jQuery(element).on('click', _.debounce(sendMail, 300, {
  20018. * 'leading': true,
  20019. * 'trailing': false
  20020. * }));
  20021. *
  20022. * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
  20023. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
  20024. * var source = new EventSource('/stream');
  20025. * jQuery(source).on('message', debounced);
  20026. *
  20027. * // Cancel the trailing debounced invocation.
  20028. * jQuery(window).on('popstate', debounced.cancel);
  20029. */
  20030. function debounce(func, wait, options) {
  20031. var lastArgs,
  20032. lastThis,
  20033. maxWait,
  20034. result,
  20035. timerId,
  20036. lastCallTime,
  20037. lastInvokeTime = 0,
  20038. leading = false,
  20039. maxing = false,
  20040. trailing = true;
  20041. if (typeof func != 'function') {
  20042. throw new TypeError(FUNC_ERROR_TEXT);
  20043. }
  20044. wait = toNumber(wait) || 0;
  20045. if (isObject(options)) {
  20046. leading = !!options.leading;
  20047. maxing = 'maxWait' in options;
  20048. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  20049. trailing = 'trailing' in options ? !!options.trailing : trailing;
  20050. }
  20051. function invokeFunc(time) {
  20052. var args = lastArgs,
  20053. thisArg = lastThis;
  20054. lastArgs = lastThis = undefined;
  20055. lastInvokeTime = time;
  20056. result = func.apply(thisArg, args);
  20057. return result;
  20058. }
  20059. function leadingEdge(time) {
  20060. // Reset any `maxWait` timer.
  20061. lastInvokeTime = time;
  20062. // Start the timer for the trailing edge.
  20063. timerId = setTimeout(timerExpired, wait);
  20064. // Invoke the leading edge.
  20065. return leading ? invokeFunc(time) : result;
  20066. }
  20067. function remainingWait(time) {
  20068. var timeSinceLastCall = time - lastCallTime,
  20069. timeSinceLastInvoke = time - lastInvokeTime,
  20070. result = wait - timeSinceLastCall;
  20071. return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
  20072. }
  20073. function shouldInvoke(time) {
  20074. var timeSinceLastCall = time - lastCallTime,
  20075. timeSinceLastInvoke = time - lastInvokeTime;
  20076. // Either this is the first call, activity has stopped and we're at the
  20077. // trailing edge, the system time has gone backwards and we're treating
  20078. // it as the trailing edge, or we've hit the `maxWait` limit.
  20079. return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
  20080. (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
  20081. }
  20082. function timerExpired() {
  20083. var time = now();
  20084. if (shouldInvoke(time)) {
  20085. return trailingEdge(time);
  20086. }
  20087. // Restart the timer.
  20088. timerId = setTimeout(timerExpired, remainingWait(time));
  20089. }
  20090. function trailingEdge(time) {
  20091. timerId = undefined;
  20092. // Only invoke if we have `lastArgs` which means `func` has been
  20093. // debounced at least once.
  20094. if (trailing && lastArgs) {
  20095. return invokeFunc(time);
  20096. }
  20097. lastArgs = lastThis = undefined;
  20098. return result;
  20099. }
  20100. function cancel() {
  20101. if (timerId !== undefined) {
  20102. clearTimeout(timerId);
  20103. }
  20104. lastInvokeTime = 0;
  20105. lastArgs = lastCallTime = lastThis = timerId = undefined;
  20106. }
  20107. function flush() {
  20108. return timerId === undefined ? result : trailingEdge(now());
  20109. }
  20110. function debounced() {
  20111. var time = now(),
  20112. isInvoking = shouldInvoke(time);
  20113. lastArgs = arguments;
  20114. lastThis = this;
  20115. lastCallTime = time;
  20116. if (isInvoking) {
  20117. if (timerId === undefined) {
  20118. return leadingEdge(lastCallTime);
  20119. }
  20120. if (maxing) {
  20121. // Handle invocations in a tight loop.
  20122. timerId = setTimeout(timerExpired, wait);
  20123. return invokeFunc(lastCallTime);
  20124. }
  20125. }
  20126. if (timerId === undefined) {
  20127. timerId = setTimeout(timerExpired, wait);
  20128. }
  20129. return result;
  20130. }
  20131. debounced.cancel = cancel;
  20132. debounced.flush = flush;
  20133. return debounced;
  20134. }
  20135. /**
  20136. * Defers invoking the `func` until the current call stack has cleared. Any
  20137. * additional arguments are provided to `func` when it's invoked.
  20138. *
  20139. * @static
  20140. * @memberOf _
  20141. * @since 0.1.0
  20142. * @category Function
  20143. * @param {Function} func The function to defer.
  20144. * @param {...*} [args] The arguments to invoke `func` with.
  20145. * @returns {number} Returns the timer id.
  20146. * @example
  20147. *
  20148. * _.defer(function(text) {
  20149. * console.log(text);
  20150. * }, 'deferred');
  20151. * // => Logs 'deferred' after one millisecond.
  20152. */
  20153. var defer = baseRest(function(func, args) {
  20154. return baseDelay(func, 1, args);
  20155. });
  20156. /**
  20157. * Invokes `func` after `wait` milliseconds. Any additional arguments are
  20158. * provided to `func` when it's invoked.
  20159. *
  20160. * @static
  20161. * @memberOf _
  20162. * @since 0.1.0
  20163. * @category Function
  20164. * @param {Function} func The function to delay.
  20165. * @param {number} wait The number of milliseconds to delay invocation.
  20166. * @param {...*} [args] The arguments to invoke `func` with.
  20167. * @returns {number} Returns the timer id.
  20168. * @example
  20169. *
  20170. * _.delay(function(text) {
  20171. * console.log(text);
  20172. * }, 1000, 'later');
  20173. * // => Logs 'later' after one second.
  20174. */
  20175. var delay = baseRest(function(func, wait, args) {
  20176. return baseDelay(func, toNumber(wait) || 0, args);
  20177. });
  20178. /**
  20179. * Creates a function that invokes `func` with arguments reversed.
  20180. *
  20181. * @static
  20182. * @memberOf _
  20183. * @since 4.0.0
  20184. * @category Function
  20185. * @param {Function} func The function to flip arguments for.
  20186. * @returns {Function} Returns the new flipped function.
  20187. * @example
  20188. *
  20189. * var flipped = _.flip(function() {
  20190. * return _.toArray(arguments);
  20191. * });
  20192. *
  20193. * flipped('a', 'b', 'c', 'd');
  20194. * // => ['d', 'c', 'b', 'a']
  20195. */
  20196. function flip(func) {
  20197. return createWrap(func, WRAP_FLIP_FLAG);
  20198. }
  20199. /**
  20200. * Creates a function that memoizes the result of `func`. If `resolver` is
  20201. * provided, it determines the cache key for storing the result based on the
  20202. * arguments provided to the memoized function. By default, the first argument
  20203. * provided to the memoized function is used as the map cache key. The `func`
  20204. * is invoked with the `this` binding of the memoized function.
  20205. *
  20206. * **Note:** The cache is exposed as the `cache` property on the memoized
  20207. * function. Its creation may be customized by replacing the `_.memoize.Cache`
  20208. * constructor with one whose instances implement the
  20209. * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
  20210. * method interface of `clear`, `delete`, `get`, `has`, and `set`.
  20211. *
  20212. * @static
  20213. * @memberOf _
  20214. * @since 0.1.0
  20215. * @category Function
  20216. * @param {Function} func The function to have its output memoized.
  20217. * @param {Function} [resolver] The function to resolve the cache key.
  20218. * @returns {Function} Returns the new memoized function.
  20219. * @example
  20220. *
  20221. * var object = { 'a': 1, 'b': 2 };
  20222. * var other = { 'c': 3, 'd': 4 };
  20223. *
  20224. * var values = _.memoize(_.values);
  20225. * values(object);
  20226. * // => [1, 2]
  20227. *
  20228. * values(other);
  20229. * // => [3, 4]
  20230. *
  20231. * object.a = 2;
  20232. * values(object);
  20233. * // => [1, 2]
  20234. *
  20235. * // Modify the result cache.
  20236. * values.cache.set(object, ['a', 'b']);
  20237. * values(object);
  20238. * // => ['a', 'b']
  20239. *
  20240. * // Replace `_.memoize.Cache`.
  20241. * _.memoize.Cache = WeakMap;
  20242. */
  20243. function memoize(func, resolver) {
  20244. if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
  20245. throw new TypeError(FUNC_ERROR_TEXT);
  20246. }
  20247. var memoized = function() {
  20248. var args = arguments,
  20249. key = resolver ? resolver.apply(this, args) : args[0],
  20250. cache = memoized.cache;
  20251. if (cache.has(key)) {
  20252. return cache.get(key);
  20253. }
  20254. var result = func.apply(this, args);
  20255. memoized.cache = cache.set(key, result) || cache;
  20256. return result;
  20257. };
  20258. memoized.cache = new (memoize.Cache || MapCache);
  20259. return memoized;
  20260. }
  20261. // Expose `MapCache`.
  20262. memoize.Cache = MapCache;
  20263. /**
  20264. * Creates a function that negates the result of the predicate `func`. The
  20265. * `func` predicate is invoked with the `this` binding and arguments of the
  20266. * created function.
  20267. *
  20268. * @static
  20269. * @memberOf _
  20270. * @since 3.0.0
  20271. * @category Function
  20272. * @param {Function} predicate The predicate to negate.
  20273. * @returns {Function} Returns the new negated function.
  20274. * @example
  20275. *
  20276. * function isEven(n) {
  20277. * return n % 2 == 0;
  20278. * }
  20279. *
  20280. * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
  20281. * // => [1, 3, 5]
  20282. */
  20283. function negate(predicate) {
  20284. if (typeof predicate != 'function') {
  20285. throw new TypeError(FUNC_ERROR_TEXT);
  20286. }
  20287. return function() {
  20288. var args = arguments;
  20289. switch (args.length) {
  20290. case 0: return !predicate.call(this);
  20291. case 1: return !predicate.call(this, args[0]);
  20292. case 2: return !predicate.call(this, args[0], args[1]);
  20293. case 3: return !predicate.call(this, args[0], args[1], args[2]);
  20294. }
  20295. return !predicate.apply(this, args);
  20296. };
  20297. }
  20298. /**
  20299. * Creates a function that is restricted to invoking `func` once. Repeat calls
  20300. * to the function return the value of the first invocation. The `func` is
  20301. * invoked with the `this` binding and arguments of the created function.
  20302. *
  20303. * @static
  20304. * @memberOf _
  20305. * @since 0.1.0
  20306. * @category Function
  20307. * @param {Function} func The function to restrict.
  20308. * @returns {Function} Returns the new restricted function.
  20309. * @example
  20310. *
  20311. * var initialize = _.once(createApplication);
  20312. * initialize();
  20313. * initialize();
  20314. * // => `createApplication` is invoked once
  20315. */
  20316. function once(func) {
  20317. return before(2, func);
  20318. }
  20319. /**
  20320. * Creates a function that invokes `func` with its arguments transformed.
  20321. *
  20322. * @static
  20323. * @since 4.0.0
  20324. * @memberOf _
  20325. * @category Function
  20326. * @param {Function} func The function to wrap.
  20327. * @param {...(Function|Function[])} [transforms=[_.identity]]
  20328. * The argument transforms.
  20329. * @returns {Function} Returns the new function.
  20330. * @example
  20331. *
  20332. * function doubled(n) {
  20333. * return n * 2;
  20334. * }
  20335. *
  20336. * function square(n) {
  20337. * return n * n;
  20338. * }
  20339. *
  20340. * var func = _.overArgs(function(x, y) {
  20341. * return [x, y];
  20342. * }, [square, doubled]);
  20343. *
  20344. * func(9, 3);
  20345. * // => [81, 6]
  20346. *
  20347. * func(10, 5);
  20348. * // => [100, 10]
  20349. */
  20350. var overArgs = castRest(function(func, transforms) {
  20351. transforms = (transforms.length == 1 && isArray(transforms[0]))
  20352. ? arrayMap(transforms[0], baseUnary(getIteratee()))
  20353. : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
  20354. var funcsLength = transforms.length;
  20355. return baseRest(function(args) {
  20356. var index = -1,
  20357. length = nativeMin(args.length, funcsLength);
  20358. while (++index < length) {
  20359. args[index] = transforms[index].call(this, args[index]);
  20360. }
  20361. return apply(func, this, args);
  20362. });
  20363. });
  20364. /**
  20365. * Creates a function that invokes `func` with `partials` prepended to the
  20366. * arguments it receives. This method is like `_.bind` except it does **not**
  20367. * alter the `this` binding.
  20368. *
  20369. * The `_.partial.placeholder` value, which defaults to `_` in monolithic
  20370. * builds, may be used as a placeholder for partially applied arguments.
  20371. *
  20372. * **Note:** This method doesn't set the "length" property of partially
  20373. * applied functions.
  20374. *
  20375. * @static
  20376. * @memberOf _
  20377. * @since 0.2.0
  20378. * @category Function
  20379. * @param {Function} func The function to partially apply arguments to.
  20380. * @param {...*} [partials] The arguments to be partially applied.
  20381. * @returns {Function} Returns the new partially applied function.
  20382. * @example
  20383. *
  20384. * function greet(greeting, name) {
  20385. * return greeting + ' ' + name;
  20386. * }
  20387. *
  20388. * var sayHelloTo = _.partial(greet, 'hello');
  20389. * sayHelloTo('fred');
  20390. * // => 'hello fred'
  20391. *
  20392. * // Partially applied with placeholders.
  20393. * var greetFred = _.partial(greet, _, 'fred');
  20394. * greetFred('hi');
  20395. * // => 'hi fred'
  20396. */
  20397. var partial = baseRest(function(func, partials) {
  20398. var holders = replaceHolders(partials, getHolder(partial));
  20399. return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
  20400. });
  20401. /**
  20402. * This method is like `_.partial` except that partially applied arguments
  20403. * are appended to the arguments it receives.
  20404. *
  20405. * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
  20406. * builds, may be used as a placeholder for partially applied arguments.
  20407. *
  20408. * **Note:** This method doesn't set the "length" property of partially
  20409. * applied functions.
  20410. *
  20411. * @static
  20412. * @memberOf _
  20413. * @since 1.0.0
  20414. * @category Function
  20415. * @param {Function} func The function to partially apply arguments to.
  20416. * @param {...*} [partials] The arguments to be partially applied.
  20417. * @returns {Function} Returns the new partially applied function.
  20418. * @example
  20419. *
  20420. * function greet(greeting, name) {
  20421. * return greeting + ' ' + name;
  20422. * }
  20423. *
  20424. * var greetFred = _.partialRight(greet, 'fred');
  20425. * greetFred('hi');
  20426. * // => 'hi fred'
  20427. *
  20428. * // Partially applied with placeholders.
  20429. * var sayHelloTo = _.partialRight(greet, 'hello', _);
  20430. * sayHelloTo('fred');
  20431. * // => 'hello fred'
  20432. */
  20433. var partialRight = baseRest(function(func, partials) {
  20434. var holders = replaceHolders(partials, getHolder(partialRight));
  20435. return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
  20436. });
  20437. /**
  20438. * Creates a function that invokes `func` with arguments arranged according
  20439. * to the specified `indexes` where the argument value at the first index is
  20440. * provided as the first argument, the argument value at the second index is
  20441. * provided as the second argument, and so on.
  20442. *
  20443. * @static
  20444. * @memberOf _
  20445. * @since 3.0.0
  20446. * @category Function
  20447. * @param {Function} func The function to rearrange arguments for.
  20448. * @param {...(number|number[])} indexes The arranged argument indexes.
  20449. * @returns {Function} Returns the new function.
  20450. * @example
  20451. *
  20452. * var rearged = _.rearg(function(a, b, c) {
  20453. * return [a, b, c];
  20454. * }, [2, 0, 1]);
  20455. *
  20456. * rearged('b', 'c', 'a')
  20457. * // => ['a', 'b', 'c']
  20458. */
  20459. var rearg = flatRest(function(func, indexes) {
  20460. return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
  20461. });
  20462. /**
  20463. * Creates a function that invokes `func` with the `this` binding of the
  20464. * created function and arguments from `start` and beyond provided as
  20465. * an array.
  20466. *
  20467. * **Note:** This method is based on the
  20468. * [rest parameter](https://mdn.io/rest_parameters).
  20469. *
  20470. * @static
  20471. * @memberOf _
  20472. * @since 4.0.0
  20473. * @category Function
  20474. * @param {Function} func The function to apply a rest parameter to.
  20475. * @param {number} [start=func.length-1] The start position of the rest parameter.
  20476. * @returns {Function} Returns the new function.
  20477. * @example
  20478. *
  20479. * var say = _.rest(function(what, names) {
  20480. * return what + ' ' + _.initial(names).join(', ') +
  20481. * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
  20482. * });
  20483. *
  20484. * say('hello', 'fred', 'barney', 'pebbles');
  20485. * // => 'hello fred, barney, & pebbles'
  20486. */
  20487. function rest(func, start) {
  20488. if (typeof func != 'function') {
  20489. throw new TypeError(FUNC_ERROR_TEXT);
  20490. }
  20491. start = start === undefined ? start : toInteger(start);
  20492. return baseRest(func, start);
  20493. }
  20494. /**
  20495. * Creates a function that invokes `func` with the `this` binding of the
  20496. * create function and an array of arguments much like
  20497. * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
  20498. *
  20499. * **Note:** This method is based on the
  20500. * [spread operator](https://mdn.io/spread_operator).
  20501. *
  20502. * @static
  20503. * @memberOf _
  20504. * @since 3.2.0
  20505. * @category Function
  20506. * @param {Function} func The function to spread arguments over.
  20507. * @param {number} [start=0] The start position of the spread.
  20508. * @returns {Function} Returns the new function.
  20509. * @example
  20510. *
  20511. * var say = _.spread(function(who, what) {
  20512. * return who + ' says ' + what;
  20513. * });
  20514. *
  20515. * say(['fred', 'hello']);
  20516. * // => 'fred says hello'
  20517. *
  20518. * var numbers = Promise.all([
  20519. * Promise.resolve(40),
  20520. * Promise.resolve(36)
  20521. * ]);
  20522. *
  20523. * numbers.then(_.spread(function(x, y) {
  20524. * return x + y;
  20525. * }));
  20526. * // => a Promise of 76
  20527. */
  20528. function spread(func, start) {
  20529. if (typeof func != 'function') {
  20530. throw new TypeError(FUNC_ERROR_TEXT);
  20531. }
  20532. start = start == null ? 0 : nativeMax(toInteger(start), 0);
  20533. return baseRest(function(args) {
  20534. var array = args[start],
  20535. otherArgs = castSlice(args, 0, start);
  20536. if (array) {
  20537. arrayPush(otherArgs, array);
  20538. }
  20539. return apply(func, this, otherArgs);
  20540. });
  20541. }
  20542. /**
  20543. * Creates a throttled function that only invokes `func` at most once per
  20544. * every `wait` milliseconds. The throttled function comes with a `cancel`
  20545. * method to cancel delayed `func` invocations and a `flush` method to
  20546. * immediately invoke them. Provide `options` to indicate whether `func`
  20547. * should be invoked on the leading and/or trailing edge of the `wait`
  20548. * timeout. The `func` is invoked with the last arguments provided to the
  20549. * throttled function. Subsequent calls to the throttled function return the
  20550. * result of the last `func` invocation.
  20551. *
  20552. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  20553. * invoked on the trailing edge of the timeout only if the throttled function
  20554. * is invoked more than once during the `wait` timeout.
  20555. *
  20556. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  20557. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  20558. *
  20559. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  20560. * for details over the differences between `_.throttle` and `_.debounce`.
  20561. *
  20562. * @static
  20563. * @memberOf _
  20564. * @since 0.1.0
  20565. * @category Function
  20566. * @param {Function} func The function to throttle.
  20567. * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
  20568. * @param {Object} [options={}] The options object.
  20569. * @param {boolean} [options.leading=true]
  20570. * Specify invoking on the leading edge of the timeout.
  20571. * @param {boolean} [options.trailing=true]
  20572. * Specify invoking on the trailing edge of the timeout.
  20573. * @returns {Function} Returns the new throttled function.
  20574. * @example
  20575. *
  20576. * // Avoid excessively updating the position while scrolling.
  20577. * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
  20578. *
  20579. * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
  20580. * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
  20581. * jQuery(element).on('click', throttled);
  20582. *
  20583. * // Cancel the trailing throttled invocation.
  20584. * jQuery(window).on('popstate', throttled.cancel);
  20585. */
  20586. function throttle(func, wait, options) {
  20587. var leading = true,
  20588. trailing = true;
  20589. if (typeof func != 'function') {
  20590. throw new TypeError(FUNC_ERROR_TEXT);
  20591. }
  20592. if (isObject(options)) {
  20593. leading = 'leading' in options ? !!options.leading : leading;
  20594. trailing = 'trailing' in options ? !!options.trailing : trailing;
  20595. }
  20596. return debounce(func, wait, {
  20597. 'leading': leading,
  20598. 'maxWait': wait,
  20599. 'trailing': trailing
  20600. });
  20601. }
  20602. /**
  20603. * Creates a function that accepts up to one argument, ignoring any
  20604. * additional arguments.
  20605. *
  20606. * @static
  20607. * @memberOf _
  20608. * @since 4.0.0
  20609. * @category Function
  20610. * @param {Function} func The function to cap arguments for.
  20611. * @returns {Function} Returns the new capped function.
  20612. * @example
  20613. *
  20614. * _.map(['6', '8', '10'], _.unary(parseInt));
  20615. * // => [6, 8, 10]
  20616. */
  20617. function unary(func) {
  20618. return ary(func, 1);
  20619. }
  20620. /**
  20621. * Creates a function that provides `value` to `wrapper` as its first
  20622. * argument. Any additional arguments provided to the function are appended
  20623. * to those provided to the `wrapper`. The wrapper is invoked with the `this`
  20624. * binding of the created function.
  20625. *
  20626. * @static
  20627. * @memberOf _
  20628. * @since 0.1.0
  20629. * @category Function
  20630. * @param {*} value The value to wrap.
  20631. * @param {Function} [wrapper=identity] The wrapper function.
  20632. * @returns {Function} Returns the new function.
  20633. * @example
  20634. *
  20635. * var p = _.wrap(_.escape, function(func, text) {
  20636. * return '<p>' + func(text) + '</p>';
  20637. * });
  20638. *
  20639. * p('fred, barney, & pebbles');
  20640. * // => '<p>fred, barney, &amp; pebbles</p>'
  20641. */
  20642. function wrap(value, wrapper) {
  20643. return partial(castFunction(wrapper), value);
  20644. }
  20645. /*------------------------------------------------------------------------*/
  20646. /**
  20647. * Casts `value` as an array if it's not one.
  20648. *
  20649. * @static
  20650. * @memberOf _
  20651. * @since 4.4.0
  20652. * @category Lang
  20653. * @param {*} value The value to inspect.
  20654. * @returns {Array} Returns the cast array.
  20655. * @example
  20656. *
  20657. * _.castArray(1);
  20658. * // => [1]
  20659. *
  20660. * _.castArray({ 'a': 1 });
  20661. * // => [{ 'a': 1 }]
  20662. *
  20663. * _.castArray('abc');
  20664. * // => ['abc']
  20665. *
  20666. * _.castArray(null);
  20667. * // => [null]
  20668. *
  20669. * _.castArray(undefined);
  20670. * // => [undefined]
  20671. *
  20672. * _.castArray();
  20673. * // => []
  20674. *
  20675. * var array = [1, 2, 3];
  20676. * console.log(_.castArray(array) === array);
  20677. * // => true
  20678. */
  20679. function castArray() {
  20680. if (!arguments.length) {
  20681. return [];
  20682. }
  20683. var value = arguments[0];
  20684. return isArray(value) ? value : [value];
  20685. }
  20686. /**
  20687. * Creates a shallow clone of `value`.
  20688. *
  20689. * **Note:** This method is loosely based on the
  20690. * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
  20691. * and supports cloning arrays, array buffers, booleans, date objects, maps,
  20692. * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
  20693. * arrays. The own enumerable properties of `arguments` objects are cloned
  20694. * as plain objects. An empty object is returned for uncloneable values such
  20695. * as error objects, functions, DOM nodes, and WeakMaps.
  20696. *
  20697. * @static
  20698. * @memberOf _
  20699. * @since 0.1.0
  20700. * @category Lang
  20701. * @param {*} value The value to clone.
  20702. * @returns {*} Returns the cloned value.
  20703. * @see _.cloneDeep
  20704. * @example
  20705. *
  20706. * var objects = [{ 'a': 1 }, { 'b': 2 }];
  20707. *
  20708. * var shallow = _.clone(objects);
  20709. * console.log(shallow[0] === objects[0]);
  20710. * // => true
  20711. */
  20712. function clone(value) {
  20713. return baseClone(value, CLONE_SYMBOLS_FLAG);
  20714. }
  20715. /**
  20716. * This method is like `_.clone` except that it accepts `customizer` which
  20717. * is invoked to produce the cloned value. If `customizer` returns `undefined`,
  20718. * cloning is handled by the method instead. The `customizer` is invoked with
  20719. * up to four arguments; (value [, index|key, object, stack]).
  20720. *
  20721. * @static
  20722. * @memberOf _
  20723. * @since 4.0.0
  20724. * @category Lang
  20725. * @param {*} value The value to clone.
  20726. * @param {Function} [customizer] The function to customize cloning.
  20727. * @returns {*} Returns the cloned value.
  20728. * @see _.cloneDeepWith
  20729. * @example
  20730. *
  20731. * function customizer(value) {
  20732. * if (_.isElement(value)) {
  20733. * return value.cloneNode(false);
  20734. * }
  20735. * }
  20736. *
  20737. * var el = _.cloneWith(document.body, customizer);
  20738. *
  20739. * console.log(el === document.body);
  20740. * // => false
  20741. * console.log(el.nodeName);
  20742. * // => 'BODY'
  20743. * console.log(el.childNodes.length);
  20744. * // => 0
  20745. */
  20746. function cloneWith(value, customizer) {
  20747. customizer = typeof customizer == 'function' ? customizer : undefined;
  20748. return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
  20749. }
  20750. /**
  20751. * This method is like `_.clone` except that it recursively clones `value`.
  20752. *
  20753. * @static
  20754. * @memberOf _
  20755. * @since 1.0.0
  20756. * @category Lang
  20757. * @param {*} value The value to recursively clone.
  20758. * @returns {*} Returns the deep cloned value.
  20759. * @see _.clone
  20760. * @example
  20761. *
  20762. * var objects = [{ 'a': 1 }, { 'b': 2 }];
  20763. *
  20764. * var deep = _.cloneDeep(objects);
  20765. * console.log(deep[0] === objects[0]);
  20766. * // => false
  20767. */
  20768. function cloneDeep(value) {
  20769. return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
  20770. }
  20771. /**
  20772. * This method is like `_.cloneWith` except that it recursively clones `value`.
  20773. *
  20774. * @static
  20775. * @memberOf _
  20776. * @since 4.0.0
  20777. * @category Lang
  20778. * @param {*} value The value to recursively clone.
  20779. * @param {Function} [customizer] The function to customize cloning.
  20780. * @returns {*} Returns the deep cloned value.
  20781. * @see _.cloneWith
  20782. * @example
  20783. *
  20784. * function customizer(value) {
  20785. * if (_.isElement(value)) {
  20786. * return value.cloneNode(true);
  20787. * }
  20788. * }
  20789. *
  20790. * var el = _.cloneDeepWith(document.body, customizer);
  20791. *
  20792. * console.log(el === document.body);
  20793. * // => false
  20794. * console.log(el.nodeName);
  20795. * // => 'BODY'
  20796. * console.log(el.childNodes.length);
  20797. * // => 20
  20798. */
  20799. function cloneDeepWith(value, customizer) {
  20800. customizer = typeof customizer == 'function' ? customizer : undefined;
  20801. return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
  20802. }
  20803. /**
  20804. * Checks if `object` conforms to `source` by invoking the predicate
  20805. * properties of `source` with the corresponding property values of `object`.
  20806. *
  20807. * **Note:** This method is equivalent to `_.conforms` when `source` is
  20808. * partially applied.
  20809. *
  20810. * @static
  20811. * @memberOf _
  20812. * @since 4.14.0
  20813. * @category Lang
  20814. * @param {Object} object The object to inspect.
  20815. * @param {Object} source The object of property predicates to conform to.
  20816. * @returns {boolean} Returns `true` if `object` conforms, else `false`.
  20817. * @example
  20818. *
  20819. * var object = { 'a': 1, 'b': 2 };
  20820. *
  20821. * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
  20822. * // => true
  20823. *
  20824. * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
  20825. * // => false
  20826. */
  20827. function conformsTo(object, source) {
  20828. return source == null || baseConformsTo(object, source, keys(source));
  20829. }
  20830. /**
  20831. * Performs a
  20832. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  20833. * comparison between two values to determine if they are equivalent.
  20834. *
  20835. * @static
  20836. * @memberOf _
  20837. * @since 4.0.0
  20838. * @category Lang
  20839. * @param {*} value The value to compare.
  20840. * @param {*} other The other value to compare.
  20841. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  20842. * @example
  20843. *
  20844. * var object = { 'a': 1 };
  20845. * var other = { 'a': 1 };
  20846. *
  20847. * _.eq(object, object);
  20848. * // => true
  20849. *
  20850. * _.eq(object, other);
  20851. * // => false
  20852. *
  20853. * _.eq('a', 'a');
  20854. * // => true
  20855. *
  20856. * _.eq('a', Object('a'));
  20857. * // => false
  20858. *
  20859. * _.eq(NaN, NaN);
  20860. * // => true
  20861. */
  20862. function eq(value, other) {
  20863. return value === other || (value !== value && other !== other);
  20864. }
  20865. /**
  20866. * Checks if `value` is greater than `other`.
  20867. *
  20868. * @static
  20869. * @memberOf _
  20870. * @since 3.9.0
  20871. * @category Lang
  20872. * @param {*} value The value to compare.
  20873. * @param {*} other The other value to compare.
  20874. * @returns {boolean} Returns `true` if `value` is greater than `other`,
  20875. * else `false`.
  20876. * @see _.lt
  20877. * @example
  20878. *
  20879. * _.gt(3, 1);
  20880. * // => true
  20881. *
  20882. * _.gt(3, 3);
  20883. * // => false
  20884. *
  20885. * _.gt(1, 3);
  20886. * // => false
  20887. */
  20888. var gt = createRelationalOperation(baseGt);
  20889. /**
  20890. * Checks if `value` is greater than or equal to `other`.
  20891. *
  20892. * @static
  20893. * @memberOf _
  20894. * @since 3.9.0
  20895. * @category Lang
  20896. * @param {*} value The value to compare.
  20897. * @param {*} other The other value to compare.
  20898. * @returns {boolean} Returns `true` if `value` is greater than or equal to
  20899. * `other`, else `false`.
  20900. * @see _.lte
  20901. * @example
  20902. *
  20903. * _.gte(3, 1);
  20904. * // => true
  20905. *
  20906. * _.gte(3, 3);
  20907. * // => true
  20908. *
  20909. * _.gte(1, 3);
  20910. * // => false
  20911. */
  20912. var gte = createRelationalOperation(function(value, other) {
  20913. return value >= other;
  20914. });
  20915. /**
  20916. * Checks if `value` is likely an `arguments` object.
  20917. *
  20918. * @static
  20919. * @memberOf _
  20920. * @since 0.1.0
  20921. * @category Lang
  20922. * @param {*} value The value to check.
  20923. * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  20924. * else `false`.
  20925. * @example
  20926. *
  20927. * _.isArguments(function() { return arguments; }());
  20928. * // => true
  20929. *
  20930. * _.isArguments([1, 2, 3]);
  20931. * // => false
  20932. */
  20933. var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
  20934. return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
  20935. !propertyIsEnumerable.call(value, 'callee');
  20936. };
  20937. /**
  20938. * Checks if `value` is classified as an `Array` object.
  20939. *
  20940. * @static
  20941. * @memberOf _
  20942. * @since 0.1.0
  20943. * @category Lang
  20944. * @param {*} value The value to check.
  20945. * @returns {boolean} Returns `true` if `value` is an array, else `false`.
  20946. * @example
  20947. *
  20948. * _.isArray([1, 2, 3]);
  20949. * // => true
  20950. *
  20951. * _.isArray(document.body.children);
  20952. * // => false
  20953. *
  20954. * _.isArray('abc');
  20955. * // => false
  20956. *
  20957. * _.isArray(_.noop);
  20958. * // => false
  20959. */
  20960. var isArray = Array.isArray;
  20961. /**
  20962. * Checks if `value` is classified as an `ArrayBuffer` object.
  20963. *
  20964. * @static
  20965. * @memberOf _
  20966. * @since 4.3.0
  20967. * @category Lang
  20968. * @param {*} value The value to check.
  20969. * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
  20970. * @example
  20971. *
  20972. * _.isArrayBuffer(new ArrayBuffer(2));
  20973. * // => true
  20974. *
  20975. * _.isArrayBuffer(new Array(2));
  20976. * // => false
  20977. */
  20978. var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
  20979. /**
  20980. * Checks if `value` is array-like. A value is considered array-like if it's
  20981. * not a function and has a `value.length` that's an integer greater than or
  20982. * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
  20983. *
  20984. * @static
  20985. * @memberOf _
  20986. * @since 4.0.0
  20987. * @category Lang
  20988. * @param {*} value The value to check.
  20989. * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
  20990. * @example
  20991. *
  20992. * _.isArrayLike([1, 2, 3]);
  20993. * // => true
  20994. *
  20995. * _.isArrayLike(document.body.children);
  20996. * // => true
  20997. *
  20998. * _.isArrayLike('abc');
  20999. * // => true
  21000. *
  21001. * _.isArrayLike(_.noop);
  21002. * // => false
  21003. */
  21004. function isArrayLike(value) {
  21005. return value != null && isLength(value.length) && !isFunction(value);
  21006. }
  21007. /**
  21008. * This method is like `_.isArrayLike` except that it also checks if `value`
  21009. * is an object.
  21010. *
  21011. * @static
  21012. * @memberOf _
  21013. * @since 4.0.0
  21014. * @category Lang
  21015. * @param {*} value The value to check.
  21016. * @returns {boolean} Returns `true` if `value` is an array-like object,
  21017. * else `false`.
  21018. * @example
  21019. *
  21020. * _.isArrayLikeObject([1, 2, 3]);
  21021. * // => true
  21022. *
  21023. * _.isArrayLikeObject(document.body.children);
  21024. * // => true
  21025. *
  21026. * _.isArrayLikeObject('abc');
  21027. * // => false
  21028. *
  21029. * _.isArrayLikeObject(_.noop);
  21030. * // => false
  21031. */
  21032. function isArrayLikeObject(value) {
  21033. return isObjectLike(value) && isArrayLike(value);
  21034. }
  21035. /**
  21036. * Checks if `value` is classified as a boolean primitive or object.
  21037. *
  21038. * @static
  21039. * @memberOf _
  21040. * @since 0.1.0
  21041. * @category Lang
  21042. * @param {*} value The value to check.
  21043. * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
  21044. * @example
  21045. *
  21046. * _.isBoolean(false);
  21047. * // => true
  21048. *
  21049. * _.isBoolean(null);
  21050. * // => false
  21051. */
  21052. function isBoolean(value) {
  21053. return value === true || value === false ||
  21054. (isObjectLike(value) && baseGetTag(value) == boolTag);
  21055. }
  21056. /**
  21057. * Checks if `value` is a buffer.
  21058. *
  21059. * @static
  21060. * @memberOf _
  21061. * @since 4.3.0
  21062. * @category Lang
  21063. * @param {*} value The value to check.
  21064. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
  21065. * @example
  21066. *
  21067. * _.isBuffer(new Buffer(2));
  21068. * // => true
  21069. *
  21070. * _.isBuffer(new Uint8Array(2));
  21071. * // => false
  21072. */
  21073. var isBuffer = nativeIsBuffer || stubFalse;
  21074. /**
  21075. * Checks if `value` is classified as a `Date` object.
  21076. *
  21077. * @static
  21078. * @memberOf _
  21079. * @since 0.1.0
  21080. * @category Lang
  21081. * @param {*} value The value to check.
  21082. * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
  21083. * @example
  21084. *
  21085. * _.isDate(new Date);
  21086. * // => true
  21087. *
  21088. * _.isDate('Mon April 23 2012');
  21089. * // => false
  21090. */
  21091. var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
  21092. /**
  21093. * Checks if `value` is likely a DOM element.
  21094. *
  21095. * @static
  21096. * @memberOf _
  21097. * @since 0.1.0
  21098. * @category Lang
  21099. * @param {*} value The value to check.
  21100. * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
  21101. * @example
  21102. *
  21103. * _.isElement(document.body);
  21104. * // => true
  21105. *
  21106. * _.isElement('<body>');
  21107. * // => false
  21108. */
  21109. function isElement(value) {
  21110. return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
  21111. }
  21112. /**
  21113. * Checks if `value` is an empty object, collection, map, or set.
  21114. *
  21115. * Objects are considered empty if they have no own enumerable string keyed
  21116. * properties.
  21117. *
  21118. * Array-like values such as `arguments` objects, arrays, buffers, strings, or
  21119. * jQuery-like collections are considered empty if they have a `length` of `0`.
  21120. * Similarly, maps and sets are considered empty if they have a `size` of `0`.
  21121. *
  21122. * @static
  21123. * @memberOf _
  21124. * @since 0.1.0
  21125. * @category Lang
  21126. * @param {*} value The value to check.
  21127. * @returns {boolean} Returns `true` if `value` is empty, else `false`.
  21128. * @example
  21129. *
  21130. * _.isEmpty(null);
  21131. * // => true
  21132. *
  21133. * _.isEmpty(true);
  21134. * // => true
  21135. *
  21136. * _.isEmpty(1);
  21137. * // => true
  21138. *
  21139. * _.isEmpty([1, 2, 3]);
  21140. * // => false
  21141. *
  21142. * _.isEmpty({ 'a': 1 });
  21143. * // => false
  21144. */
  21145. function isEmpty(value) {
  21146. if (value == null) {
  21147. return true;
  21148. }
  21149. if (isArrayLike(value) &&
  21150. (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
  21151. isBuffer(value) || isTypedArray(value) || isArguments(value))) {
  21152. return !value.length;
  21153. }
  21154. var tag = getTag(value);
  21155. if (tag == mapTag || tag == setTag) {
  21156. return !value.size;
  21157. }
  21158. if (isPrototype(value)) {
  21159. return !baseKeys(value).length;
  21160. }
  21161. for (var key in value) {
  21162. if (hasOwnProperty.call(value, key)) {
  21163. return false;
  21164. }
  21165. }
  21166. return true;
  21167. }
  21168. /**
  21169. * Performs a deep comparison between two values to determine if they are
  21170. * equivalent.
  21171. *
  21172. * **Note:** This method supports comparing arrays, array buffers, booleans,
  21173. * date objects, error objects, maps, numbers, `Object` objects, regexes,
  21174. * sets, strings, symbols, and typed arrays. `Object` objects are compared
  21175. * by their own, not inherited, enumerable properties. Functions and DOM
  21176. * nodes are compared by strict equality, i.e. `===`.
  21177. *
  21178. * @static
  21179. * @memberOf _
  21180. * @since 0.1.0
  21181. * @category Lang
  21182. * @param {*} value The value to compare.
  21183. * @param {*} other The other value to compare.
  21184. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  21185. * @example
  21186. *
  21187. * var object = { 'a': 1 };
  21188. * var other = { 'a': 1 };
  21189. *
  21190. * _.isEqual(object, other);
  21191. * // => true
  21192. *
  21193. * object === other;
  21194. * // => false
  21195. */
  21196. function isEqual(value, other) {
  21197. return baseIsEqual(value, other);
  21198. }
  21199. /**
  21200. * This method is like `_.isEqual` except that it accepts `customizer` which
  21201. * is invoked to compare values. If `customizer` returns `undefined`, comparisons
  21202. * are handled by the method instead. The `customizer` is invoked with up to
  21203. * six arguments: (objValue, othValue [, index|key, object, other, stack]).
  21204. *
  21205. * @static
  21206. * @memberOf _
  21207. * @since 4.0.0
  21208. * @category Lang
  21209. * @param {*} value The value to compare.
  21210. * @param {*} other The other value to compare.
  21211. * @param {Function} [customizer] The function to customize comparisons.
  21212. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  21213. * @example
  21214. *
  21215. * function isGreeting(value) {
  21216. * return /^h(?:i|ello)$/.test(value);
  21217. * }
  21218. *
  21219. * function customizer(objValue, othValue) {
  21220. * if (isGreeting(objValue) && isGreeting(othValue)) {
  21221. * return true;
  21222. * }
  21223. * }
  21224. *
  21225. * var array = ['hello', 'goodbye'];
  21226. * var other = ['hi', 'goodbye'];
  21227. *
  21228. * _.isEqualWith(array, other, customizer);
  21229. * // => true
  21230. */
  21231. function isEqualWith(value, other, customizer) {
  21232. customizer = typeof customizer == 'function' ? customizer : undefined;
  21233. var result = customizer ? customizer(value, other) : undefined;
  21234. return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
  21235. }
  21236. /**
  21237. * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
  21238. * `SyntaxError`, `TypeError`, or `URIError` object.
  21239. *
  21240. * @static
  21241. * @memberOf _
  21242. * @since 3.0.0
  21243. * @category Lang
  21244. * @param {*} value The value to check.
  21245. * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
  21246. * @example
  21247. *
  21248. * _.isError(new Error);
  21249. * // => true
  21250. *
  21251. * _.isError(Error);
  21252. * // => false
  21253. */
  21254. function isError(value) {
  21255. if (!isObjectLike(value)) {
  21256. return false;
  21257. }
  21258. var tag = baseGetTag(value);
  21259. return tag == errorTag || tag == domExcTag ||
  21260. (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
  21261. }
  21262. /**
  21263. * Checks if `value` is a finite primitive number.
  21264. *
  21265. * **Note:** This method is based on
  21266. * [`Number.isFinite`](https://mdn.io/Number/isFinite).
  21267. *
  21268. * @static
  21269. * @memberOf _
  21270. * @since 0.1.0
  21271. * @category Lang
  21272. * @param {*} value The value to check.
  21273. * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
  21274. * @example
  21275. *
  21276. * _.isFinite(3);
  21277. * // => true
  21278. *
  21279. * _.isFinite(Number.MIN_VALUE);
  21280. * // => true
  21281. *
  21282. * _.isFinite(Infinity);
  21283. * // => false
  21284. *
  21285. * _.isFinite('3');
  21286. * // => false
  21287. */
  21288. function isFinite(value) {
  21289. return typeof value == 'number' && nativeIsFinite(value);
  21290. }
  21291. /**
  21292. * Checks if `value` is classified as a `Function` object.
  21293. *
  21294. * @static
  21295. * @memberOf _
  21296. * @since 0.1.0
  21297. * @category Lang
  21298. * @param {*} value The value to check.
  21299. * @returns {boolean} Returns `true` if `value` is a function, else `false`.
  21300. * @example
  21301. *
  21302. * _.isFunction(_);
  21303. * // => true
  21304. *
  21305. * _.isFunction(/abc/);
  21306. * // => false
  21307. */
  21308. function isFunction(value) {
  21309. if (!isObject(value)) {
  21310. return false;
  21311. }
  21312. // The use of `Object#toString` avoids issues with the `typeof` operator
  21313. // in Safari 9 which returns 'object' for typed arrays and other constructors.
  21314. var tag = baseGetTag(value);
  21315. return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
  21316. }
  21317. /**
  21318. * Checks if `value` is an integer.
  21319. *
  21320. * **Note:** This method is based on
  21321. * [`Number.isInteger`](https://mdn.io/Number/isInteger).
  21322. *
  21323. * @static
  21324. * @memberOf _
  21325. * @since 4.0.0
  21326. * @category Lang
  21327. * @param {*} value The value to check.
  21328. * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
  21329. * @example
  21330. *
  21331. * _.isInteger(3);
  21332. * // => true
  21333. *
  21334. * _.isInteger(Number.MIN_VALUE);
  21335. * // => false
  21336. *
  21337. * _.isInteger(Infinity);
  21338. * // => false
  21339. *
  21340. * _.isInteger('3');
  21341. * // => false
  21342. */
  21343. function isInteger(value) {
  21344. return typeof value == 'number' && value == toInteger(value);
  21345. }
  21346. /**
  21347. * Checks if `value` is a valid array-like length.
  21348. *
  21349. * **Note:** This method is loosely based on
  21350. * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
  21351. *
  21352. * @static
  21353. * @memberOf _
  21354. * @since 4.0.0
  21355. * @category Lang
  21356. * @param {*} value The value to check.
  21357. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
  21358. * @example
  21359. *
  21360. * _.isLength(3);
  21361. * // => true
  21362. *
  21363. * _.isLength(Number.MIN_VALUE);
  21364. * // => false
  21365. *
  21366. * _.isLength(Infinity);
  21367. * // => false
  21368. *
  21369. * _.isLength('3');
  21370. * // => false
  21371. */
  21372. function isLength(value) {
  21373. return typeof value == 'number' &&
  21374. value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
  21375. }
  21376. /**
  21377. * Checks if `value` is the
  21378. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  21379. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  21380. *
  21381. * @static
  21382. * @memberOf _
  21383. * @since 0.1.0
  21384. * @category Lang
  21385. * @param {*} value The value to check.
  21386. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  21387. * @example
  21388. *
  21389. * _.isObject({});
  21390. * // => true
  21391. *
  21392. * _.isObject([1, 2, 3]);
  21393. * // => true
  21394. *
  21395. * _.isObject(_.noop);
  21396. * // => true
  21397. *
  21398. * _.isObject(null);
  21399. * // => false
  21400. */
  21401. function isObject(value) {
  21402. var type = typeof value;
  21403. return value != null && (type == 'object' || type == 'function');
  21404. }
  21405. /**
  21406. * Checks if `value` is object-like. A value is object-like if it's not `null`
  21407. * and has a `typeof` result of "object".
  21408. *
  21409. * @static
  21410. * @memberOf _
  21411. * @since 4.0.0
  21412. * @category Lang
  21413. * @param {*} value The value to check.
  21414. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  21415. * @example
  21416. *
  21417. * _.isObjectLike({});
  21418. * // => true
  21419. *
  21420. * _.isObjectLike([1, 2, 3]);
  21421. * // => true
  21422. *
  21423. * _.isObjectLike(_.noop);
  21424. * // => false
  21425. *
  21426. * _.isObjectLike(null);
  21427. * // => false
  21428. */
  21429. function isObjectLike(value) {
  21430. return value != null && typeof value == 'object';
  21431. }
  21432. /**
  21433. * Checks if `value` is classified as a `Map` object.
  21434. *
  21435. * @static
  21436. * @memberOf _
  21437. * @since 4.3.0
  21438. * @category Lang
  21439. * @param {*} value The value to check.
  21440. * @returns {boolean} Returns `true` if `value` is a map, else `false`.
  21441. * @example
  21442. *
  21443. * _.isMap(new Map);
  21444. * // => true
  21445. *
  21446. * _.isMap(new WeakMap);
  21447. * // => false
  21448. */
  21449. var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
  21450. /**
  21451. * Performs a partial deep comparison between `object` and `source` to
  21452. * determine if `object` contains equivalent property values.
  21453. *
  21454. * **Note:** This method is equivalent to `_.matches` when `source` is
  21455. * partially applied.
  21456. *
  21457. * Partial comparisons will match empty array and empty object `source`
  21458. * values against any array or object value, respectively. See `_.isEqual`
  21459. * for a list of supported value comparisons.
  21460. *
  21461. * @static
  21462. * @memberOf _
  21463. * @since 3.0.0
  21464. * @category Lang
  21465. * @param {Object} object The object to inspect.
  21466. * @param {Object} source The object of property values to match.
  21467. * @returns {boolean} Returns `true` if `object` is a match, else `false`.
  21468. * @example
  21469. *
  21470. * var object = { 'a': 1, 'b': 2 };
  21471. *
  21472. * _.isMatch(object, { 'b': 2 });
  21473. * // => true
  21474. *
  21475. * _.isMatch(object, { 'b': 1 });
  21476. * // => false
  21477. */
  21478. function isMatch(object, source) {
  21479. return object === source || baseIsMatch(object, source, getMatchData(source));
  21480. }
  21481. /**
  21482. * This method is like `_.isMatch` except that it accepts `customizer` which
  21483. * is invoked to compare values. If `customizer` returns `undefined`, comparisons
  21484. * are handled by the method instead. The `customizer` is invoked with five
  21485. * arguments: (objValue, srcValue, index|key, object, source).
  21486. *
  21487. * @static
  21488. * @memberOf _
  21489. * @since 4.0.0
  21490. * @category Lang
  21491. * @param {Object} object The object to inspect.
  21492. * @param {Object} source The object of property values to match.
  21493. * @param {Function} [customizer] The function to customize comparisons.
  21494. * @returns {boolean} Returns `true` if `object` is a match, else `false`.
  21495. * @example
  21496. *
  21497. * function isGreeting(value) {
  21498. * return /^h(?:i|ello)$/.test(value);
  21499. * }
  21500. *
  21501. * function customizer(objValue, srcValue) {
  21502. * if (isGreeting(objValue) && isGreeting(srcValue)) {
  21503. * return true;
  21504. * }
  21505. * }
  21506. *
  21507. * var object = { 'greeting': 'hello' };
  21508. * var source = { 'greeting': 'hi' };
  21509. *
  21510. * _.isMatchWith(object, source, customizer);
  21511. * // => true
  21512. */
  21513. function isMatchWith(object, source, customizer) {
  21514. customizer = typeof customizer == 'function' ? customizer : undefined;
  21515. return baseIsMatch(object, source, getMatchData(source), customizer);
  21516. }
  21517. /**
  21518. * Checks if `value` is `NaN`.
  21519. *
  21520. * **Note:** This method is based on
  21521. * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
  21522. * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
  21523. * `undefined` and other non-number values.
  21524. *
  21525. * @static
  21526. * @memberOf _
  21527. * @since 0.1.0
  21528. * @category Lang
  21529. * @param {*} value The value to check.
  21530. * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
  21531. * @example
  21532. *
  21533. * _.isNaN(NaN);
  21534. * // => true
  21535. *
  21536. * _.isNaN(new Number(NaN));
  21537. * // => true
  21538. *
  21539. * isNaN(undefined);
  21540. * // => true
  21541. *
  21542. * _.isNaN(undefined);
  21543. * // => false
  21544. */
  21545. function isNaN(value) {
  21546. // An `NaN` primitive is the only value that is not equal to itself.
  21547. // Perform the `toStringTag` check first to avoid errors with some
  21548. // ActiveX objects in IE.
  21549. return isNumber(value) && value != +value;
  21550. }
  21551. /**
  21552. * Checks if `value` is a pristine native function.
  21553. *
  21554. * **Note:** This method can't reliably detect native functions in the presence
  21555. * of the core-js package because core-js circumvents this kind of detection.
  21556. * Despite multiple requests, the core-js maintainer has made it clear: any
  21557. * attempt to fix the detection will be obstructed. As a result, we're left
  21558. * with little choice but to throw an error. Unfortunately, this also affects
  21559. * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
  21560. * which rely on core-js.
  21561. *
  21562. * @static
  21563. * @memberOf _
  21564. * @since 3.0.0
  21565. * @category Lang
  21566. * @param {*} value The value to check.
  21567. * @returns {boolean} Returns `true` if `value` is a native function,
  21568. * else `false`.
  21569. * @example
  21570. *
  21571. * _.isNative(Array.prototype.push);
  21572. * // => true
  21573. *
  21574. * _.isNative(_);
  21575. * // => false
  21576. */
  21577. function isNative(value) {
  21578. if (isMaskable(value)) {
  21579. throw new Error(CORE_ERROR_TEXT);
  21580. }
  21581. return baseIsNative(value);
  21582. }
  21583. /**
  21584. * Checks if `value` is `null`.
  21585. *
  21586. * @static
  21587. * @memberOf _
  21588. * @since 0.1.0
  21589. * @category Lang
  21590. * @param {*} value The value to check.
  21591. * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
  21592. * @example
  21593. *
  21594. * _.isNull(null);
  21595. * // => true
  21596. *
  21597. * _.isNull(void 0);
  21598. * // => false
  21599. */
  21600. function isNull(value) {
  21601. return value === null;
  21602. }
  21603. /**
  21604. * Checks if `value` is `null` or `undefined`.
  21605. *
  21606. * @static
  21607. * @memberOf _
  21608. * @since 4.0.0
  21609. * @category Lang
  21610. * @param {*} value The value to check.
  21611. * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
  21612. * @example
  21613. *
  21614. * _.isNil(null);
  21615. * // => true
  21616. *
  21617. * _.isNil(void 0);
  21618. * // => true
  21619. *
  21620. * _.isNil(NaN);
  21621. * // => false
  21622. */
  21623. function isNil(value) {
  21624. return value == null;
  21625. }
  21626. /**
  21627. * Checks if `value` is classified as a `Number` primitive or object.
  21628. *
  21629. * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
  21630. * classified as numbers, use the `_.isFinite` method.
  21631. *
  21632. * @static
  21633. * @memberOf _
  21634. * @since 0.1.0
  21635. * @category Lang
  21636. * @param {*} value The value to check.
  21637. * @returns {boolean} Returns `true` if `value` is a number, else `false`.
  21638. * @example
  21639. *
  21640. * _.isNumber(3);
  21641. * // => true
  21642. *
  21643. * _.isNumber(Number.MIN_VALUE);
  21644. * // => true
  21645. *
  21646. * _.isNumber(Infinity);
  21647. * // => true
  21648. *
  21649. * _.isNumber('3');
  21650. * // => false
  21651. */
  21652. function isNumber(value) {
  21653. return typeof value == 'number' ||
  21654. (isObjectLike(value) && baseGetTag(value) == numberTag);
  21655. }
  21656. /**
  21657. * Checks if `value` is a plain object, that is, an object created by the
  21658. * `Object` constructor or one with a `[[Prototype]]` of `null`.
  21659. *
  21660. * @static
  21661. * @memberOf _
  21662. * @since 0.8.0
  21663. * @category Lang
  21664. * @param {*} value The value to check.
  21665. * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
  21666. * @example
  21667. *
  21668. * function Foo() {
  21669. * this.a = 1;
  21670. * }
  21671. *
  21672. * _.isPlainObject(new Foo);
  21673. * // => false
  21674. *
  21675. * _.isPlainObject([1, 2, 3]);
  21676. * // => false
  21677. *
  21678. * _.isPlainObject({ 'x': 0, 'y': 0 });
  21679. * // => true
  21680. *
  21681. * _.isPlainObject(Object.create(null));
  21682. * // => true
  21683. */
  21684. function isPlainObject(value) {
  21685. if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
  21686. return false;
  21687. }
  21688. var proto = getPrototype(value);
  21689. if (proto === null) {
  21690. return true;
  21691. }
  21692. var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
  21693. return typeof Ctor == 'function' && Ctor instanceof Ctor &&
  21694. funcToString.call(Ctor) == objectCtorString;
  21695. }
  21696. /**
  21697. * Checks if `value` is classified as a `RegExp` object.
  21698. *
  21699. * @static
  21700. * @memberOf _
  21701. * @since 0.1.0
  21702. * @category Lang
  21703. * @param {*} value The value to check.
  21704. * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
  21705. * @example
  21706. *
  21707. * _.isRegExp(/abc/);
  21708. * // => true
  21709. *
  21710. * _.isRegExp('/abc/');
  21711. * // => false
  21712. */
  21713. var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
  21714. /**
  21715. * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
  21716. * double precision number which isn't the result of a rounded unsafe integer.
  21717. *
  21718. * **Note:** This method is based on
  21719. * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
  21720. *
  21721. * @static
  21722. * @memberOf _
  21723. * @since 4.0.0
  21724. * @category Lang
  21725. * @param {*} value The value to check.
  21726. * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
  21727. * @example
  21728. *
  21729. * _.isSafeInteger(3);
  21730. * // => true
  21731. *
  21732. * _.isSafeInteger(Number.MIN_VALUE);
  21733. * // => false
  21734. *
  21735. * _.isSafeInteger(Infinity);
  21736. * // => false
  21737. *
  21738. * _.isSafeInteger('3');
  21739. * // => false
  21740. */
  21741. function isSafeInteger(value) {
  21742. return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
  21743. }
  21744. /**
  21745. * Checks if `value` is classified as a `Set` object.
  21746. *
  21747. * @static
  21748. * @memberOf _
  21749. * @since 4.3.0
  21750. * @category Lang
  21751. * @param {*} value The value to check.
  21752. * @returns {boolean} Returns `true` if `value` is a set, else `false`.
  21753. * @example
  21754. *
  21755. * _.isSet(new Set);
  21756. * // => true
  21757. *
  21758. * _.isSet(new WeakSet);
  21759. * // => false
  21760. */
  21761. var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
  21762. /**
  21763. * Checks if `value` is classified as a `String` primitive or object.
  21764. *
  21765. * @static
  21766. * @since 0.1.0
  21767. * @memberOf _
  21768. * @category Lang
  21769. * @param {*} value The value to check.
  21770. * @returns {boolean} Returns `true` if `value` is a string, else `false`.
  21771. * @example
  21772. *
  21773. * _.isString('abc');
  21774. * // => true
  21775. *
  21776. * _.isString(1);
  21777. * // => false
  21778. */
  21779. function isString(value) {
  21780. return typeof value == 'string' ||
  21781. (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
  21782. }
  21783. /**
  21784. * Checks if `value` is classified as a `Symbol` primitive or object.
  21785. *
  21786. * @static
  21787. * @memberOf _
  21788. * @since 4.0.0
  21789. * @category Lang
  21790. * @param {*} value The value to check.
  21791. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  21792. * @example
  21793. *
  21794. * _.isSymbol(Symbol.iterator);
  21795. * // => true
  21796. *
  21797. * _.isSymbol('abc');
  21798. * // => false
  21799. */
  21800. function isSymbol(value) {
  21801. return typeof value == 'symbol' ||
  21802. (isObjectLike(value) && baseGetTag(value) == symbolTag);
  21803. }
  21804. /**
  21805. * Checks if `value` is classified as a typed array.
  21806. *
  21807. * @static
  21808. * @memberOf _
  21809. * @since 3.0.0
  21810. * @category Lang
  21811. * @param {*} value The value to check.
  21812. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
  21813. * @example
  21814. *
  21815. * _.isTypedArray(new Uint8Array);
  21816. * // => true
  21817. *
  21818. * _.isTypedArray([]);
  21819. * // => false
  21820. */
  21821. var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
  21822. /**
  21823. * Checks if `value` is `undefined`.
  21824. *
  21825. * @static
  21826. * @since 0.1.0
  21827. * @memberOf _
  21828. * @category Lang
  21829. * @param {*} value The value to check.
  21830. * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
  21831. * @example
  21832. *
  21833. * _.isUndefined(void 0);
  21834. * // => true
  21835. *
  21836. * _.isUndefined(null);
  21837. * // => false
  21838. */
  21839. function isUndefined(value) {
  21840. return value === undefined;
  21841. }
  21842. /**
  21843. * Checks if `value` is classified as a `WeakMap` object.
  21844. *
  21845. * @static
  21846. * @memberOf _
  21847. * @since 4.3.0
  21848. * @category Lang
  21849. * @param {*} value The value to check.
  21850. * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
  21851. * @example
  21852. *
  21853. * _.isWeakMap(new WeakMap);
  21854. * // => true
  21855. *
  21856. * _.isWeakMap(new Map);
  21857. * // => false
  21858. */
  21859. function isWeakMap(value) {
  21860. return isObjectLike(value) && getTag(value) == weakMapTag;
  21861. }
  21862. /**
  21863. * Checks if `value` is classified as a `WeakSet` object.
  21864. *
  21865. * @static
  21866. * @memberOf _
  21867. * @since 4.3.0
  21868. * @category Lang
  21869. * @param {*} value The value to check.
  21870. * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
  21871. * @example
  21872. *
  21873. * _.isWeakSet(new WeakSet);
  21874. * // => true
  21875. *
  21876. * _.isWeakSet(new Set);
  21877. * // => false
  21878. */
  21879. function isWeakSet(value) {
  21880. return isObjectLike(value) && baseGetTag(value) == weakSetTag;
  21881. }
  21882. /**
  21883. * Checks if `value` is less than `other`.
  21884. *
  21885. * @static
  21886. * @memberOf _
  21887. * @since 3.9.0
  21888. * @category Lang
  21889. * @param {*} value The value to compare.
  21890. * @param {*} other The other value to compare.
  21891. * @returns {boolean} Returns `true` if `value` is less than `other`,
  21892. * else `false`.
  21893. * @see _.gt
  21894. * @example
  21895. *
  21896. * _.lt(1, 3);
  21897. * // => true
  21898. *
  21899. * _.lt(3, 3);
  21900. * // => false
  21901. *
  21902. * _.lt(3, 1);
  21903. * // => false
  21904. */
  21905. var lt = createRelationalOperation(baseLt);
  21906. /**
  21907. * Checks if `value` is less than or equal to `other`.
  21908. *
  21909. * @static
  21910. * @memberOf _
  21911. * @since 3.9.0
  21912. * @category Lang
  21913. * @param {*} value The value to compare.
  21914. * @param {*} other The other value to compare.
  21915. * @returns {boolean} Returns `true` if `value` is less than or equal to
  21916. * `other`, else `false`.
  21917. * @see _.gte
  21918. * @example
  21919. *
  21920. * _.lte(1, 3);
  21921. * // => true
  21922. *
  21923. * _.lte(3, 3);
  21924. * // => true
  21925. *
  21926. * _.lte(3, 1);
  21927. * // => false
  21928. */
  21929. var lte = createRelationalOperation(function(value, other) {
  21930. return value <= other;
  21931. });
  21932. /**
  21933. * Converts `value` to an array.
  21934. *
  21935. * @static
  21936. * @since 0.1.0
  21937. * @memberOf _
  21938. * @category Lang
  21939. * @param {*} value The value to convert.
  21940. * @returns {Array} Returns the converted array.
  21941. * @example
  21942. *
  21943. * _.toArray({ 'a': 1, 'b': 2 });
  21944. * // => [1, 2]
  21945. *
  21946. * _.toArray('abc');
  21947. * // => ['a', 'b', 'c']
  21948. *
  21949. * _.toArray(1);
  21950. * // => []
  21951. *
  21952. * _.toArray(null);
  21953. * // => []
  21954. */
  21955. function toArray(value) {
  21956. if (!value) {
  21957. return [];
  21958. }
  21959. if (isArrayLike(value)) {
  21960. return isString(value) ? stringToArray(value) : copyArray(value);
  21961. }
  21962. if (symIterator && value[symIterator]) {
  21963. return iteratorToArray(value[symIterator]());
  21964. }
  21965. var tag = getTag(value),
  21966. func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
  21967. return func(value);
  21968. }
  21969. /**
  21970. * Converts `value` to a finite number.
  21971. *
  21972. * @static
  21973. * @memberOf _
  21974. * @since 4.12.0
  21975. * @category Lang
  21976. * @param {*} value The value to convert.
  21977. * @returns {number} Returns the converted number.
  21978. * @example
  21979. *
  21980. * _.toFinite(3.2);
  21981. * // => 3.2
  21982. *
  21983. * _.toFinite(Number.MIN_VALUE);
  21984. * // => 5e-324
  21985. *
  21986. * _.toFinite(Infinity);
  21987. * // => 1.7976931348623157e+308
  21988. *
  21989. * _.toFinite('3.2');
  21990. * // => 3.2
  21991. */
  21992. function toFinite(value) {
  21993. if (!value) {
  21994. return value === 0 ? value : 0;
  21995. }
  21996. value = toNumber(value);
  21997. if (value === INFINITY || value === -INFINITY) {
  21998. var sign = (value < 0 ? -1 : 1);
  21999. return sign * MAX_INTEGER;
  22000. }
  22001. return value === value ? value : 0;
  22002. }
  22003. /**
  22004. * Converts `value` to an integer.
  22005. *
  22006. * **Note:** This method is loosely based on
  22007. * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
  22008. *
  22009. * @static
  22010. * @memberOf _
  22011. * @since 4.0.0
  22012. * @category Lang
  22013. * @param {*} value The value to convert.
  22014. * @returns {number} Returns the converted integer.
  22015. * @example
  22016. *
  22017. * _.toInteger(3.2);
  22018. * // => 3
  22019. *
  22020. * _.toInteger(Number.MIN_VALUE);
  22021. * // => 0
  22022. *
  22023. * _.toInteger(Infinity);
  22024. * // => 1.7976931348623157e+308
  22025. *
  22026. * _.toInteger('3.2');
  22027. * // => 3
  22028. */
  22029. function toInteger(value) {
  22030. var result = toFinite(value),
  22031. remainder = result % 1;
  22032. return result === result ? (remainder ? result - remainder : result) : 0;
  22033. }
  22034. /**
  22035. * Converts `value` to an integer suitable for use as the length of an
  22036. * array-like object.
  22037. *
  22038. * **Note:** This method is based on
  22039. * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
  22040. *
  22041. * @static
  22042. * @memberOf _
  22043. * @since 4.0.0
  22044. * @category Lang
  22045. * @param {*} value The value to convert.
  22046. * @returns {number} Returns the converted integer.
  22047. * @example
  22048. *
  22049. * _.toLength(3.2);
  22050. * // => 3
  22051. *
  22052. * _.toLength(Number.MIN_VALUE);
  22053. * // => 0
  22054. *
  22055. * _.toLength(Infinity);
  22056. * // => 4294967295
  22057. *
  22058. * _.toLength('3.2');
  22059. * // => 3
  22060. */
  22061. function toLength(value) {
  22062. return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
  22063. }
  22064. /**
  22065. * Converts `value` to a number.
  22066. *
  22067. * @static
  22068. * @memberOf _
  22069. * @since 4.0.0
  22070. * @category Lang
  22071. * @param {*} value The value to process.
  22072. * @returns {number} Returns the number.
  22073. * @example
  22074. *
  22075. * _.toNumber(3.2);
  22076. * // => 3.2
  22077. *
  22078. * _.toNumber(Number.MIN_VALUE);
  22079. * // => 5e-324
  22080. *
  22081. * _.toNumber(Infinity);
  22082. * // => Infinity
  22083. *
  22084. * _.toNumber('3.2');
  22085. * // => 3.2
  22086. */
  22087. function toNumber(value) {
  22088. if (typeof value == 'number') {
  22089. return value;
  22090. }
  22091. if (isSymbol(value)) {
  22092. return NAN;
  22093. }
  22094. if (isObject(value)) {
  22095. var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
  22096. value = isObject(other) ? (other + '') : other;
  22097. }
  22098. if (typeof value != 'string') {
  22099. return value === 0 ? value : +value;
  22100. }
  22101. value = value.replace(reTrim, '');
  22102. var isBinary = reIsBinary.test(value);
  22103. return (isBinary || reIsOctal.test(value))
  22104. ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  22105. : (reIsBadHex.test(value) ? NAN : +value);
  22106. }
  22107. /**
  22108. * Converts `value` to a plain object flattening inherited enumerable string
  22109. * keyed properties of `value` to own properties of the plain object.
  22110. *
  22111. * @static
  22112. * @memberOf _
  22113. * @since 3.0.0
  22114. * @category Lang
  22115. * @param {*} value The value to convert.
  22116. * @returns {Object} Returns the converted plain object.
  22117. * @example
  22118. *
  22119. * function Foo() {
  22120. * this.b = 2;
  22121. * }
  22122. *
  22123. * Foo.prototype.c = 3;
  22124. *
  22125. * _.assign({ 'a': 1 }, new Foo);
  22126. * // => { 'a': 1, 'b': 2 }
  22127. *
  22128. * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
  22129. * // => { 'a': 1, 'b': 2, 'c': 3 }
  22130. */
  22131. function toPlainObject(value) {
  22132. return copyObject(value, keysIn(value));
  22133. }
  22134. /**
  22135. * Converts `value` to a safe integer. A safe integer can be compared and
  22136. * represented correctly.
  22137. *
  22138. * @static
  22139. * @memberOf _
  22140. * @since 4.0.0
  22141. * @category Lang
  22142. * @param {*} value The value to convert.
  22143. * @returns {number} Returns the converted integer.
  22144. * @example
  22145. *
  22146. * _.toSafeInteger(3.2);
  22147. * // => 3
  22148. *
  22149. * _.toSafeInteger(Number.MIN_VALUE);
  22150. * // => 0
  22151. *
  22152. * _.toSafeInteger(Infinity);
  22153. * // => 9007199254740991
  22154. *
  22155. * _.toSafeInteger('3.2');
  22156. * // => 3
  22157. */
  22158. function toSafeInteger(value) {
  22159. return value
  22160. ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
  22161. : (value === 0 ? value : 0);
  22162. }
  22163. /**
  22164. * Converts `value` to a string. An empty string is returned for `null`
  22165. * and `undefined` values. The sign of `-0` is preserved.
  22166. *
  22167. * @static
  22168. * @memberOf _
  22169. * @since 4.0.0
  22170. * @category Lang
  22171. * @param {*} value The value to convert.
  22172. * @returns {string} Returns the converted string.
  22173. * @example
  22174. *
  22175. * _.toString(null);
  22176. * // => ''
  22177. *
  22178. * _.toString(-0);
  22179. * // => '-0'
  22180. *
  22181. * _.toString([1, 2, 3]);
  22182. * // => '1,2,3'
  22183. */
  22184. function toString(value) {
  22185. return value == null ? '' : baseToString(value);
  22186. }
  22187. /*------------------------------------------------------------------------*/
  22188. /**
  22189. * Assigns own enumerable string keyed properties of source objects to the
  22190. * destination object. Source objects are applied from left to right.
  22191. * Subsequent sources overwrite property assignments of previous sources.
  22192. *
  22193. * **Note:** This method mutates `object` and is loosely based on
  22194. * [`Object.assign`](https://mdn.io/Object/assign).
  22195. *
  22196. * @static
  22197. * @memberOf _
  22198. * @since 0.10.0
  22199. * @category Object
  22200. * @param {Object} object The destination object.
  22201. * @param {...Object} [sources] The source objects.
  22202. * @returns {Object} Returns `object`.
  22203. * @see _.assignIn
  22204. * @example
  22205. *
  22206. * function Foo() {
  22207. * this.a = 1;
  22208. * }
  22209. *
  22210. * function Bar() {
  22211. * this.c = 3;
  22212. * }
  22213. *
  22214. * Foo.prototype.b = 2;
  22215. * Bar.prototype.d = 4;
  22216. *
  22217. * _.assign({ 'a': 0 }, new Foo, new Bar);
  22218. * // => { 'a': 1, 'c': 3 }
  22219. */
  22220. var assign = createAssigner(function(object, source) {
  22221. if (isPrototype(source) || isArrayLike(source)) {
  22222. copyObject(source, keys(source), object);
  22223. return;
  22224. }
  22225. for (var key in source) {
  22226. if (hasOwnProperty.call(source, key)) {
  22227. assignValue(object, key, source[key]);
  22228. }
  22229. }
  22230. });
  22231. /**
  22232. * This method is like `_.assign` except that it iterates over own and
  22233. * inherited source properties.
  22234. *
  22235. * **Note:** This method mutates `object`.
  22236. *
  22237. * @static
  22238. * @memberOf _
  22239. * @since 4.0.0
  22240. * @alias extend
  22241. * @category Object
  22242. * @param {Object} object The destination object.
  22243. * @param {...Object} [sources] The source objects.
  22244. * @returns {Object} Returns `object`.
  22245. * @see _.assign
  22246. * @example
  22247. *
  22248. * function Foo() {
  22249. * this.a = 1;
  22250. * }
  22251. *
  22252. * function Bar() {
  22253. * this.c = 3;
  22254. * }
  22255. *
  22256. * Foo.prototype.b = 2;
  22257. * Bar.prototype.d = 4;
  22258. *
  22259. * _.assignIn({ 'a': 0 }, new Foo, new Bar);
  22260. * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
  22261. */
  22262. var assignIn = createAssigner(function(object, source) {
  22263. copyObject(source, keysIn(source), object);
  22264. });
  22265. /**
  22266. * This method is like `_.assignIn` except that it accepts `customizer`
  22267. * which is invoked to produce the assigned values. If `customizer` returns
  22268. * `undefined`, assignment is handled by the method instead. The `customizer`
  22269. * is invoked with five arguments: (objValue, srcValue, key, object, source).
  22270. *
  22271. * **Note:** This method mutates `object`.
  22272. *
  22273. * @static
  22274. * @memberOf _
  22275. * @since 4.0.0
  22276. * @alias extendWith
  22277. * @category Object
  22278. * @param {Object} object The destination object.
  22279. * @param {...Object} sources The source objects.
  22280. * @param {Function} [customizer] The function to customize assigned values.
  22281. * @returns {Object} Returns `object`.
  22282. * @see _.assignWith
  22283. * @example
  22284. *
  22285. * function customizer(objValue, srcValue) {
  22286. * return _.isUndefined(objValue) ? srcValue : objValue;
  22287. * }
  22288. *
  22289. * var defaults = _.partialRight(_.assignInWith, customizer);
  22290. *
  22291. * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
  22292. * // => { 'a': 1, 'b': 2 }
  22293. */
  22294. var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
  22295. copyObject(source, keysIn(source), object, customizer);
  22296. });
  22297. /**
  22298. * This method is like `_.assign` except that it accepts `customizer`
  22299. * which is invoked to produce the assigned values. If `customizer` returns
  22300. * `undefined`, assignment is handled by the method instead. The `customizer`
  22301. * is invoked with five arguments: (objValue, srcValue, key, object, source).
  22302. *
  22303. * **Note:** This method mutates `object`.
  22304. *
  22305. * @static
  22306. * @memberOf _
  22307. * @since 4.0.0
  22308. * @category Object
  22309. * @param {Object} object The destination object.
  22310. * @param {...Object} sources The source objects.
  22311. * @param {Function} [customizer] The function to customize assigned values.
  22312. * @returns {Object} Returns `object`.
  22313. * @see _.assignInWith
  22314. * @example
  22315. *
  22316. * function customizer(objValue, srcValue) {
  22317. * return _.isUndefined(objValue) ? srcValue : objValue;
  22318. * }
  22319. *
  22320. * var defaults = _.partialRight(_.assignWith, customizer);
  22321. *
  22322. * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
  22323. * // => { 'a': 1, 'b': 2 }
  22324. */
  22325. var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
  22326. copyObject(source, keys(source), object, customizer);
  22327. });
  22328. /**
  22329. * Creates an array of values corresponding to `paths` of `object`.
  22330. *
  22331. * @static
  22332. * @memberOf _
  22333. * @since 1.0.0
  22334. * @category Object
  22335. * @param {Object} object The object to iterate over.
  22336. * @param {...(string|string[])} [paths] The property paths to pick.
  22337. * @returns {Array} Returns the picked values.
  22338. * @example
  22339. *
  22340. * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
  22341. *
  22342. * _.at(object, ['a[0].b.c', 'a[1]']);
  22343. * // => [3, 4]
  22344. */
  22345. var at = flatRest(baseAt);
  22346. /**
  22347. * Creates an object that inherits from the `prototype` object. If a
  22348. * `properties` object is given, its own enumerable string keyed properties
  22349. * are assigned to the created object.
  22350. *
  22351. * @static
  22352. * @memberOf _
  22353. * @since 2.3.0
  22354. * @category Object
  22355. * @param {Object} prototype The object to inherit from.
  22356. * @param {Object} [properties] The properties to assign to the object.
  22357. * @returns {Object} Returns the new object.
  22358. * @example
  22359. *
  22360. * function Shape() {
  22361. * this.x = 0;
  22362. * this.y = 0;
  22363. * }
  22364. *
  22365. * function Circle() {
  22366. * Shape.call(this);
  22367. * }
  22368. *
  22369. * Circle.prototype = _.create(Shape.prototype, {
  22370. * 'constructor': Circle
  22371. * });
  22372. *
  22373. * var circle = new Circle;
  22374. * circle instanceof Circle;
  22375. * // => true
  22376. *
  22377. * circle instanceof Shape;
  22378. * // => true
  22379. */
  22380. function create(prototype, properties) {
  22381. var result = baseCreate(prototype);
  22382. return properties == null ? result : baseAssign(result, properties);
  22383. }
  22384. /**
  22385. * Assigns own and inherited enumerable string keyed properties of source
  22386. * objects to the destination object for all destination properties that
  22387. * resolve to `undefined`. Source objects are applied from left to right.
  22388. * Once a property is set, additional values of the same property are ignored.
  22389. *
  22390. * **Note:** This method mutates `object`.
  22391. *
  22392. * @static
  22393. * @since 0.1.0
  22394. * @memberOf _
  22395. * @category Object
  22396. * @param {Object} object The destination object.
  22397. * @param {...Object} [sources] The source objects.
  22398. * @returns {Object} Returns `object`.
  22399. * @see _.defaultsDeep
  22400. * @example
  22401. *
  22402. * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
  22403. * // => { 'a': 1, 'b': 2 }
  22404. */
  22405. var defaults = baseRest(function(args) {
  22406. args.push(undefined, customDefaultsAssignIn);
  22407. return apply(assignInWith, undefined, args);
  22408. });
  22409. /**
  22410. * This method is like `_.defaults` except that it recursively assigns
  22411. * default properties.
  22412. *
  22413. * **Note:** This method mutates `object`.
  22414. *
  22415. * @static
  22416. * @memberOf _
  22417. * @since 3.10.0
  22418. * @category Object
  22419. * @param {Object} object The destination object.
  22420. * @param {...Object} [sources] The source objects.
  22421. * @returns {Object} Returns `object`.
  22422. * @see _.defaults
  22423. * @example
  22424. *
  22425. * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
  22426. * // => { 'a': { 'b': 2, 'c': 3 } }
  22427. */
  22428. var defaultsDeep = baseRest(function(args) {
  22429. args.push(undefined, customDefaultsMerge);
  22430. return apply(mergeWith, undefined, args);
  22431. });
  22432. /**
  22433. * This method is like `_.find` except that it returns the key of the first
  22434. * element `predicate` returns truthy for instead of the element itself.
  22435. *
  22436. * @static
  22437. * @memberOf _
  22438. * @since 1.1.0
  22439. * @category Object
  22440. * @param {Object} object The object to inspect.
  22441. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  22442. * @returns {string|undefined} Returns the key of the matched element,
  22443. * else `undefined`.
  22444. * @example
  22445. *
  22446. * var users = {
  22447. * 'barney': { 'age': 36, 'active': true },
  22448. * 'fred': { 'age': 40, 'active': false },
  22449. * 'pebbles': { 'age': 1, 'active': true }
  22450. * };
  22451. *
  22452. * _.findKey(users, function(o) { return o.age < 40; });
  22453. * // => 'barney' (iteration order is not guaranteed)
  22454. *
  22455. * // The `_.matches` iteratee shorthand.
  22456. * _.findKey(users, { 'age': 1, 'active': true });
  22457. * // => 'pebbles'
  22458. *
  22459. * // The `_.matchesProperty` iteratee shorthand.
  22460. * _.findKey(users, ['active', false]);
  22461. * // => 'fred'
  22462. *
  22463. * // The `_.property` iteratee shorthand.
  22464. * _.findKey(users, 'active');
  22465. * // => 'barney'
  22466. */
  22467. function findKey(object, predicate) {
  22468. return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
  22469. }
  22470. /**
  22471. * This method is like `_.findKey` except that it iterates over elements of
  22472. * a collection in the opposite order.
  22473. *
  22474. * @static
  22475. * @memberOf _
  22476. * @since 2.0.0
  22477. * @category Object
  22478. * @param {Object} object The object to inspect.
  22479. * @param {Function} [predicate=_.identity] The function invoked per iteration.
  22480. * @returns {string|undefined} Returns the key of the matched element,
  22481. * else `undefined`.
  22482. * @example
  22483. *
  22484. * var users = {
  22485. * 'barney': { 'age': 36, 'active': true },
  22486. * 'fred': { 'age': 40, 'active': false },
  22487. * 'pebbles': { 'age': 1, 'active': true }
  22488. * };
  22489. *
  22490. * _.findLastKey(users, function(o) { return o.age < 40; });
  22491. * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
  22492. *
  22493. * // The `_.matches` iteratee shorthand.
  22494. * _.findLastKey(users, { 'age': 36, 'active': true });
  22495. * // => 'barney'
  22496. *
  22497. * // The `_.matchesProperty` iteratee shorthand.
  22498. * _.findLastKey(users, ['active', false]);
  22499. * // => 'fred'
  22500. *
  22501. * // The `_.property` iteratee shorthand.
  22502. * _.findLastKey(users, 'active');
  22503. * // => 'pebbles'
  22504. */
  22505. function findLastKey(object, predicate) {
  22506. return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
  22507. }
  22508. /**
  22509. * Iterates over own and inherited enumerable string keyed properties of an
  22510. * object and invokes `iteratee` for each property. The iteratee is invoked
  22511. * with three arguments: (value, key, object). Iteratee functions may exit
  22512. * iteration early by explicitly returning `false`.
  22513. *
  22514. * @static
  22515. * @memberOf _
  22516. * @since 0.3.0
  22517. * @category Object
  22518. * @param {Object} object The object to iterate over.
  22519. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22520. * @returns {Object} Returns `object`.
  22521. * @see _.forInRight
  22522. * @example
  22523. *
  22524. * function Foo() {
  22525. * this.a = 1;
  22526. * this.b = 2;
  22527. * }
  22528. *
  22529. * Foo.prototype.c = 3;
  22530. *
  22531. * _.forIn(new Foo, function(value, key) {
  22532. * console.log(key);
  22533. * });
  22534. * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
  22535. */
  22536. function forIn(object, iteratee) {
  22537. return object == null
  22538. ? object
  22539. : baseFor(object, getIteratee(iteratee, 3), keysIn);
  22540. }
  22541. /**
  22542. * This method is like `_.forIn` except that it iterates over properties of
  22543. * `object` in the opposite order.
  22544. *
  22545. * @static
  22546. * @memberOf _
  22547. * @since 2.0.0
  22548. * @category Object
  22549. * @param {Object} object The object to iterate over.
  22550. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22551. * @returns {Object} Returns `object`.
  22552. * @see _.forIn
  22553. * @example
  22554. *
  22555. * function Foo() {
  22556. * this.a = 1;
  22557. * this.b = 2;
  22558. * }
  22559. *
  22560. * Foo.prototype.c = 3;
  22561. *
  22562. * _.forInRight(new Foo, function(value, key) {
  22563. * console.log(key);
  22564. * });
  22565. * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
  22566. */
  22567. function forInRight(object, iteratee) {
  22568. return object == null
  22569. ? object
  22570. : baseForRight(object, getIteratee(iteratee, 3), keysIn);
  22571. }
  22572. /**
  22573. * Iterates over own enumerable string keyed properties of an object and
  22574. * invokes `iteratee` for each property. The iteratee is invoked with three
  22575. * arguments: (value, key, object). Iteratee functions may exit iteration
  22576. * early by explicitly returning `false`.
  22577. *
  22578. * @static
  22579. * @memberOf _
  22580. * @since 0.3.0
  22581. * @category Object
  22582. * @param {Object} object The object to iterate over.
  22583. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22584. * @returns {Object} Returns `object`.
  22585. * @see _.forOwnRight
  22586. * @example
  22587. *
  22588. * function Foo() {
  22589. * this.a = 1;
  22590. * this.b = 2;
  22591. * }
  22592. *
  22593. * Foo.prototype.c = 3;
  22594. *
  22595. * _.forOwn(new Foo, function(value, key) {
  22596. * console.log(key);
  22597. * });
  22598. * // => Logs 'a' then 'b' (iteration order is not guaranteed).
  22599. */
  22600. function forOwn(object, iteratee) {
  22601. return object && baseForOwn(object, getIteratee(iteratee, 3));
  22602. }
  22603. /**
  22604. * This method is like `_.forOwn` except that it iterates over properties of
  22605. * `object` in the opposite order.
  22606. *
  22607. * @static
  22608. * @memberOf _
  22609. * @since 2.0.0
  22610. * @category Object
  22611. * @param {Object} object The object to iterate over.
  22612. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22613. * @returns {Object} Returns `object`.
  22614. * @see _.forOwn
  22615. * @example
  22616. *
  22617. * function Foo() {
  22618. * this.a = 1;
  22619. * this.b = 2;
  22620. * }
  22621. *
  22622. * Foo.prototype.c = 3;
  22623. *
  22624. * _.forOwnRight(new Foo, function(value, key) {
  22625. * console.log(key);
  22626. * });
  22627. * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
  22628. */
  22629. function forOwnRight(object, iteratee) {
  22630. return object && baseForOwnRight(object, getIteratee(iteratee, 3));
  22631. }
  22632. /**
  22633. * Creates an array of function property names from own enumerable properties
  22634. * of `object`.
  22635. *
  22636. * @static
  22637. * @since 0.1.0
  22638. * @memberOf _
  22639. * @category Object
  22640. * @param {Object} object The object to inspect.
  22641. * @returns {Array} Returns the function names.
  22642. * @see _.functionsIn
  22643. * @example
  22644. *
  22645. * function Foo() {
  22646. * this.a = _.constant('a');
  22647. * this.b = _.constant('b');
  22648. * }
  22649. *
  22650. * Foo.prototype.c = _.constant('c');
  22651. *
  22652. * _.functions(new Foo);
  22653. * // => ['a', 'b']
  22654. */
  22655. function functions(object) {
  22656. return object == null ? [] : baseFunctions(object, keys(object));
  22657. }
  22658. /**
  22659. * Creates an array of function property names from own and inherited
  22660. * enumerable properties of `object`.
  22661. *
  22662. * @static
  22663. * @memberOf _
  22664. * @since 4.0.0
  22665. * @category Object
  22666. * @param {Object} object The object to inspect.
  22667. * @returns {Array} Returns the function names.
  22668. * @see _.functions
  22669. * @example
  22670. *
  22671. * function Foo() {
  22672. * this.a = _.constant('a');
  22673. * this.b = _.constant('b');
  22674. * }
  22675. *
  22676. * Foo.prototype.c = _.constant('c');
  22677. *
  22678. * _.functionsIn(new Foo);
  22679. * // => ['a', 'b', 'c']
  22680. */
  22681. function functionsIn(object) {
  22682. return object == null ? [] : baseFunctions(object, keysIn(object));
  22683. }
  22684. /**
  22685. * Gets the value at `path` of `object`. If the resolved value is
  22686. * `undefined`, the `defaultValue` is returned in its place.
  22687. *
  22688. * @static
  22689. * @memberOf _
  22690. * @since 3.7.0
  22691. * @category Object
  22692. * @param {Object} object The object to query.
  22693. * @param {Array|string} path The path of the property to get.
  22694. * @param {*} [defaultValue] The value returned for `undefined` resolved values.
  22695. * @returns {*} Returns the resolved value.
  22696. * @example
  22697. *
  22698. * var object = { 'a': [{ 'b': { 'c': 3 } }] };
  22699. *
  22700. * _.get(object, 'a[0].b.c');
  22701. * // => 3
  22702. *
  22703. * _.get(object, ['a', '0', 'b', 'c']);
  22704. * // => 3
  22705. *
  22706. * _.get(object, 'a.b.c', 'default');
  22707. * // => 'default'
  22708. */
  22709. function get(object, path, defaultValue) {
  22710. var result = object == null ? undefined : baseGet(object, path);
  22711. return result === undefined ? defaultValue : result;
  22712. }
  22713. /**
  22714. * Checks if `path` is a direct property of `object`.
  22715. *
  22716. * @static
  22717. * @since 0.1.0
  22718. * @memberOf _
  22719. * @category Object
  22720. * @param {Object} object The object to query.
  22721. * @param {Array|string} path The path to check.
  22722. * @returns {boolean} Returns `true` if `path` exists, else `false`.
  22723. * @example
  22724. *
  22725. * var object = { 'a': { 'b': 2 } };
  22726. * var other = _.create({ 'a': _.create({ 'b': 2 }) });
  22727. *
  22728. * _.has(object, 'a');
  22729. * // => true
  22730. *
  22731. * _.has(object, 'a.b');
  22732. * // => true
  22733. *
  22734. * _.has(object, ['a', 'b']);
  22735. * // => true
  22736. *
  22737. * _.has(other, 'a');
  22738. * // => false
  22739. */
  22740. function has(object, path) {
  22741. return object != null && hasPath(object, path, baseHas);
  22742. }
  22743. /**
  22744. * Checks if `path` is a direct or inherited property of `object`.
  22745. *
  22746. * @static
  22747. * @memberOf _
  22748. * @since 4.0.0
  22749. * @category Object
  22750. * @param {Object} object The object to query.
  22751. * @param {Array|string} path The path to check.
  22752. * @returns {boolean} Returns `true` if `path` exists, else `false`.
  22753. * @example
  22754. *
  22755. * var object = _.create({ 'a': _.create({ 'b': 2 }) });
  22756. *
  22757. * _.hasIn(object, 'a');
  22758. * // => true
  22759. *
  22760. * _.hasIn(object, 'a.b');
  22761. * // => true
  22762. *
  22763. * _.hasIn(object, ['a', 'b']);
  22764. * // => true
  22765. *
  22766. * _.hasIn(object, 'b');
  22767. * // => false
  22768. */
  22769. function hasIn(object, path) {
  22770. return object != null && hasPath(object, path, baseHasIn);
  22771. }
  22772. /**
  22773. * Creates an object composed of the inverted keys and values of `object`.
  22774. * If `object` contains duplicate values, subsequent values overwrite
  22775. * property assignments of previous values.
  22776. *
  22777. * @static
  22778. * @memberOf _
  22779. * @since 0.7.0
  22780. * @category Object
  22781. * @param {Object} object The object to invert.
  22782. * @returns {Object} Returns the new inverted object.
  22783. * @example
  22784. *
  22785. * var object = { 'a': 1, 'b': 2, 'c': 1 };
  22786. *
  22787. * _.invert(object);
  22788. * // => { '1': 'c', '2': 'b' }
  22789. */
  22790. var invert = createInverter(function(result, value, key) {
  22791. result[value] = key;
  22792. }, constant(identity));
  22793. /**
  22794. * This method is like `_.invert` except that the inverted object is generated
  22795. * from the results of running each element of `object` thru `iteratee`. The
  22796. * corresponding inverted value of each inverted key is an array of keys
  22797. * responsible for generating the inverted value. The iteratee is invoked
  22798. * with one argument: (value).
  22799. *
  22800. * @static
  22801. * @memberOf _
  22802. * @since 4.1.0
  22803. * @category Object
  22804. * @param {Object} object The object to invert.
  22805. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  22806. * @returns {Object} Returns the new inverted object.
  22807. * @example
  22808. *
  22809. * var object = { 'a': 1, 'b': 2, 'c': 1 };
  22810. *
  22811. * _.invertBy(object);
  22812. * // => { '1': ['a', 'c'], '2': ['b'] }
  22813. *
  22814. * _.invertBy(object, function(value) {
  22815. * return 'group' + value;
  22816. * });
  22817. * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
  22818. */
  22819. var invertBy = createInverter(function(result, value, key) {
  22820. if (hasOwnProperty.call(result, value)) {
  22821. result[value].push(key);
  22822. } else {
  22823. result[value] = [key];
  22824. }
  22825. }, getIteratee);
  22826. /**
  22827. * Invokes the method at `path` of `object`.
  22828. *
  22829. * @static
  22830. * @memberOf _
  22831. * @since 4.0.0
  22832. * @category Object
  22833. * @param {Object} object The object to query.
  22834. * @param {Array|string} path The path of the method to invoke.
  22835. * @param {...*} [args] The arguments to invoke the method with.
  22836. * @returns {*} Returns the result of the invoked method.
  22837. * @example
  22838. *
  22839. * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
  22840. *
  22841. * _.invoke(object, 'a[0].b.c.slice', 1, 3);
  22842. * // => [2, 3]
  22843. */
  22844. var invoke = baseRest(baseInvoke);
  22845. /**
  22846. * Creates an array of the own enumerable property names of `object`.
  22847. *
  22848. * **Note:** Non-object values are coerced to objects. See the
  22849. * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
  22850. * for more details.
  22851. *
  22852. * @static
  22853. * @since 0.1.0
  22854. * @memberOf _
  22855. * @category Object
  22856. * @param {Object} object The object to query.
  22857. * @returns {Array} Returns the array of property names.
  22858. * @example
  22859. *
  22860. * function Foo() {
  22861. * this.a = 1;
  22862. * this.b = 2;
  22863. * }
  22864. *
  22865. * Foo.prototype.c = 3;
  22866. *
  22867. * _.keys(new Foo);
  22868. * // => ['a', 'b'] (iteration order is not guaranteed)
  22869. *
  22870. * _.keys('hi');
  22871. * // => ['0', '1']
  22872. */
  22873. function keys(object) {
  22874. return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
  22875. }
  22876. /**
  22877. * Creates an array of the own and inherited enumerable property names of `object`.
  22878. *
  22879. * **Note:** Non-object values are coerced to objects.
  22880. *
  22881. * @static
  22882. * @memberOf _
  22883. * @since 3.0.0
  22884. * @category Object
  22885. * @param {Object} object The object to query.
  22886. * @returns {Array} Returns the array of property names.
  22887. * @example
  22888. *
  22889. * function Foo() {
  22890. * this.a = 1;
  22891. * this.b = 2;
  22892. * }
  22893. *
  22894. * Foo.prototype.c = 3;
  22895. *
  22896. * _.keysIn(new Foo);
  22897. * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
  22898. */
  22899. function keysIn(object) {
  22900. return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
  22901. }
  22902. /**
  22903. * The opposite of `_.mapValues`; this method creates an object with the
  22904. * same values as `object` and keys generated by running each own enumerable
  22905. * string keyed property of `object` thru `iteratee`. The iteratee is invoked
  22906. * with three arguments: (value, key, object).
  22907. *
  22908. * @static
  22909. * @memberOf _
  22910. * @since 3.8.0
  22911. * @category Object
  22912. * @param {Object} object The object to iterate over.
  22913. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22914. * @returns {Object} Returns the new mapped object.
  22915. * @see _.mapValues
  22916. * @example
  22917. *
  22918. * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
  22919. * return key + value;
  22920. * });
  22921. * // => { 'a1': 1, 'b2': 2 }
  22922. */
  22923. function mapKeys(object, iteratee) {
  22924. var result = {};
  22925. iteratee = getIteratee(iteratee, 3);
  22926. baseForOwn(object, function(value, key, object) {
  22927. baseAssignValue(result, iteratee(value, key, object), value);
  22928. });
  22929. return result;
  22930. }
  22931. /**
  22932. * Creates an object with the same keys as `object` and values generated
  22933. * by running each own enumerable string keyed property of `object` thru
  22934. * `iteratee`. The iteratee is invoked with three arguments:
  22935. * (value, key, object).
  22936. *
  22937. * @static
  22938. * @memberOf _
  22939. * @since 2.4.0
  22940. * @category Object
  22941. * @param {Object} object The object to iterate over.
  22942. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  22943. * @returns {Object} Returns the new mapped object.
  22944. * @see _.mapKeys
  22945. * @example
  22946. *
  22947. * var users = {
  22948. * 'fred': { 'user': 'fred', 'age': 40 },
  22949. * 'pebbles': { 'user': 'pebbles', 'age': 1 }
  22950. * };
  22951. *
  22952. * _.mapValues(users, function(o) { return o.age; });
  22953. * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
  22954. *
  22955. * // The `_.property` iteratee shorthand.
  22956. * _.mapValues(users, 'age');
  22957. * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
  22958. */
  22959. function mapValues(object, iteratee) {
  22960. var result = {};
  22961. iteratee = getIteratee(iteratee, 3);
  22962. baseForOwn(object, function(value, key, object) {
  22963. baseAssignValue(result, key, iteratee(value, key, object));
  22964. });
  22965. return result;
  22966. }
  22967. /**
  22968. * This method is like `_.assign` except that it recursively merges own and
  22969. * inherited enumerable string keyed properties of source objects into the
  22970. * destination object. Source properties that resolve to `undefined` are
  22971. * skipped if a destination value exists. Array and plain object properties
  22972. * are merged recursively. Other objects and value types are overridden by
  22973. * assignment. Source objects are applied from left to right. Subsequent
  22974. * sources overwrite property assignments of previous sources.
  22975. *
  22976. * **Note:** This method mutates `object`.
  22977. *
  22978. * @static
  22979. * @memberOf _
  22980. * @since 0.5.0
  22981. * @category Object
  22982. * @param {Object} object The destination object.
  22983. * @param {...Object} [sources] The source objects.
  22984. * @returns {Object} Returns `object`.
  22985. * @example
  22986. *
  22987. * var object = {
  22988. * 'a': [{ 'b': 2 }, { 'd': 4 }]
  22989. * };
  22990. *
  22991. * var other = {
  22992. * 'a': [{ 'c': 3 }, { 'e': 5 }]
  22993. * };
  22994. *
  22995. * _.merge(object, other);
  22996. * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
  22997. */
  22998. var merge = createAssigner(function(object, source, srcIndex) {
  22999. baseMerge(object, source, srcIndex);
  23000. });
  23001. /**
  23002. * This method is like `_.merge` except that it accepts `customizer` which
  23003. * is invoked to produce the merged values of the destination and source
  23004. * properties. If `customizer` returns `undefined`, merging is handled by the
  23005. * method instead. The `customizer` is invoked with six arguments:
  23006. * (objValue, srcValue, key, object, source, stack).
  23007. *
  23008. * **Note:** This method mutates `object`.
  23009. *
  23010. * @static
  23011. * @memberOf _
  23012. * @since 4.0.0
  23013. * @category Object
  23014. * @param {Object} object The destination object.
  23015. * @param {...Object} sources The source objects.
  23016. * @param {Function} customizer The function to customize assigned values.
  23017. * @returns {Object} Returns `object`.
  23018. * @example
  23019. *
  23020. * function customizer(objValue, srcValue) {
  23021. * if (_.isArray(objValue)) {
  23022. * return objValue.concat(srcValue);
  23023. * }
  23024. * }
  23025. *
  23026. * var object = { 'a': [1], 'b': [2] };
  23027. * var other = { 'a': [3], 'b': [4] };
  23028. *
  23029. * _.mergeWith(object, other, customizer);
  23030. * // => { 'a': [1, 3], 'b': [2, 4] }
  23031. */
  23032. var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
  23033. baseMerge(object, source, srcIndex, customizer);
  23034. });
  23035. /**
  23036. * The opposite of `_.pick`; this method creates an object composed of the
  23037. * own and inherited enumerable property paths of `object` that are not omitted.
  23038. *
  23039. * **Note:** This method is considerably slower than `_.pick`.
  23040. *
  23041. * @static
  23042. * @since 0.1.0
  23043. * @memberOf _
  23044. * @category Object
  23045. * @param {Object} object The source object.
  23046. * @param {...(string|string[])} [paths] The property paths to omit.
  23047. * @returns {Object} Returns the new object.
  23048. * @example
  23049. *
  23050. * var object = { 'a': 1, 'b': '2', 'c': 3 };
  23051. *
  23052. * _.omit(object, ['a', 'c']);
  23053. * // => { 'b': '2' }
  23054. */
  23055. var omit = flatRest(function(object, paths) {
  23056. var result = {};
  23057. if (object == null) {
  23058. return result;
  23059. }
  23060. var isDeep = false;
  23061. paths = arrayMap(paths, function(path) {
  23062. path = castPath(path, object);
  23063. isDeep || (isDeep = path.length > 1);
  23064. return path;
  23065. });
  23066. copyObject(object, getAllKeysIn(object), result);
  23067. if (isDeep) {
  23068. result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
  23069. }
  23070. var length = paths.length;
  23071. while (length--) {
  23072. baseUnset(result, paths[length]);
  23073. }
  23074. return result;
  23075. });
  23076. /**
  23077. * The opposite of `_.pickBy`; this method creates an object composed of
  23078. * the own and inherited enumerable string keyed properties of `object` that
  23079. * `predicate` doesn't return truthy for. The predicate is invoked with two
  23080. * arguments: (value, key).
  23081. *
  23082. * @static
  23083. * @memberOf _
  23084. * @since 4.0.0
  23085. * @category Object
  23086. * @param {Object} object The source object.
  23087. * @param {Function} [predicate=_.identity] The function invoked per property.
  23088. * @returns {Object} Returns the new object.
  23089. * @example
  23090. *
  23091. * var object = { 'a': 1, 'b': '2', 'c': 3 };
  23092. *
  23093. * _.omitBy(object, _.isNumber);
  23094. * // => { 'b': '2' }
  23095. */
  23096. function omitBy(object, predicate) {
  23097. return pickBy(object, negate(getIteratee(predicate)));
  23098. }
  23099. /**
  23100. * Creates an object composed of the picked `object` properties.
  23101. *
  23102. * @static
  23103. * @since 0.1.0
  23104. * @memberOf _
  23105. * @category Object
  23106. * @param {Object} object The source object.
  23107. * @param {...(string|string[])} [paths] The property paths to pick.
  23108. * @returns {Object} Returns the new object.
  23109. * @example
  23110. *
  23111. * var object = { 'a': 1, 'b': '2', 'c': 3 };
  23112. *
  23113. * _.pick(object, ['a', 'c']);
  23114. * // => { 'a': 1, 'c': 3 }
  23115. */
  23116. var pick = flatRest(function(object, paths) {
  23117. return object == null ? {} : basePick(object, paths);
  23118. });
  23119. /**
  23120. * Creates an object composed of the `object` properties `predicate` returns
  23121. * truthy for. The predicate is invoked with two arguments: (value, key).
  23122. *
  23123. * @static
  23124. * @memberOf _
  23125. * @since 4.0.0
  23126. * @category Object
  23127. * @param {Object} object The source object.
  23128. * @param {Function} [predicate=_.identity] The function invoked per property.
  23129. * @returns {Object} Returns the new object.
  23130. * @example
  23131. *
  23132. * var object = { 'a': 1, 'b': '2', 'c': 3 };
  23133. *
  23134. * _.pickBy(object, _.isNumber);
  23135. * // => { 'a': 1, 'c': 3 }
  23136. */
  23137. function pickBy(object, predicate) {
  23138. if (object == null) {
  23139. return {};
  23140. }
  23141. var props = arrayMap(getAllKeysIn(object), function(prop) {
  23142. return [prop];
  23143. });
  23144. predicate = getIteratee(predicate);
  23145. return basePickBy(object, props, function(value, path) {
  23146. return predicate(value, path[0]);
  23147. });
  23148. }
  23149. /**
  23150. * This method is like `_.get` except that if the resolved value is a
  23151. * function it's invoked with the `this` binding of its parent object and
  23152. * its result is returned.
  23153. *
  23154. * @static
  23155. * @since 0.1.0
  23156. * @memberOf _
  23157. * @category Object
  23158. * @param {Object} object The object to query.
  23159. * @param {Array|string} path The path of the property to resolve.
  23160. * @param {*} [defaultValue] The value returned for `undefined` resolved values.
  23161. * @returns {*} Returns the resolved value.
  23162. * @example
  23163. *
  23164. * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
  23165. *
  23166. * _.result(object, 'a[0].b.c1');
  23167. * // => 3
  23168. *
  23169. * _.result(object, 'a[0].b.c2');
  23170. * // => 4
  23171. *
  23172. * _.result(object, 'a[0].b.c3', 'default');
  23173. * // => 'default'
  23174. *
  23175. * _.result(object, 'a[0].b.c3', _.constant('default'));
  23176. * // => 'default'
  23177. */
  23178. function result(object, path, defaultValue) {
  23179. path = castPath(path, object);
  23180. var index = -1,
  23181. length = path.length;
  23182. // Ensure the loop is entered when path is empty.
  23183. if (!length) {
  23184. length = 1;
  23185. object = undefined;
  23186. }
  23187. while (++index < length) {
  23188. var value = object == null ? undefined : object[toKey(path[index])];
  23189. if (value === undefined) {
  23190. index = length;
  23191. value = defaultValue;
  23192. }
  23193. object = isFunction(value) ? value.call(object) : value;
  23194. }
  23195. return object;
  23196. }
  23197. /**
  23198. * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
  23199. * it's created. Arrays are created for missing index properties while objects
  23200. * are created for all other missing properties. Use `_.setWith` to customize
  23201. * `path` creation.
  23202. *
  23203. * **Note:** This method mutates `object`.
  23204. *
  23205. * @static
  23206. * @memberOf _
  23207. * @since 3.7.0
  23208. * @category Object
  23209. * @param {Object} object The object to modify.
  23210. * @param {Array|string} path The path of the property to set.
  23211. * @param {*} value The value to set.
  23212. * @returns {Object} Returns `object`.
  23213. * @example
  23214. *
  23215. * var object = { 'a': [{ 'b': { 'c': 3 } }] };
  23216. *
  23217. * _.set(object, 'a[0].b.c', 4);
  23218. * console.log(object.a[0].b.c);
  23219. * // => 4
  23220. *
  23221. * _.set(object, ['x', '0', 'y', 'z'], 5);
  23222. * console.log(object.x[0].y.z);
  23223. * // => 5
  23224. */
  23225. function set(object, path, value) {
  23226. return object == null ? object : baseSet(object, path, value);
  23227. }
  23228. /**
  23229. * This method is like `_.set` except that it accepts `customizer` which is
  23230. * invoked to produce the objects of `path`. If `customizer` returns `undefined`
  23231. * path creation is handled by the method instead. The `customizer` is invoked
  23232. * with three arguments: (nsValue, key, nsObject).
  23233. *
  23234. * **Note:** This method mutates `object`.
  23235. *
  23236. * @static
  23237. * @memberOf _
  23238. * @since 4.0.0
  23239. * @category Object
  23240. * @param {Object} object The object to modify.
  23241. * @param {Array|string} path The path of the property to set.
  23242. * @param {*} value The value to set.
  23243. * @param {Function} [customizer] The function to customize assigned values.
  23244. * @returns {Object} Returns `object`.
  23245. * @example
  23246. *
  23247. * var object = {};
  23248. *
  23249. * _.setWith(object, '[0][1]', 'a', Object);
  23250. * // => { '0': { '1': 'a' } }
  23251. */
  23252. function setWith(object, path, value, customizer) {
  23253. customizer = typeof customizer == 'function' ? customizer : undefined;
  23254. return object == null ? object : baseSet(object, path, value, customizer);
  23255. }
  23256. /**
  23257. * Creates an array of own enumerable string keyed-value pairs for `object`
  23258. * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
  23259. * entries are returned.
  23260. *
  23261. * @static
  23262. * @memberOf _
  23263. * @since 4.0.0
  23264. * @alias entries
  23265. * @category Object
  23266. * @param {Object} object The object to query.
  23267. * @returns {Array} Returns the key-value pairs.
  23268. * @example
  23269. *
  23270. * function Foo() {
  23271. * this.a = 1;
  23272. * this.b = 2;
  23273. * }
  23274. *
  23275. * Foo.prototype.c = 3;
  23276. *
  23277. * _.toPairs(new Foo);
  23278. * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
  23279. */
  23280. var toPairs = createToPairs(keys);
  23281. /**
  23282. * Creates an array of own and inherited enumerable string keyed-value pairs
  23283. * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
  23284. * or set, its entries are returned.
  23285. *
  23286. * @static
  23287. * @memberOf _
  23288. * @since 4.0.0
  23289. * @alias entriesIn
  23290. * @category Object
  23291. * @param {Object} object The object to query.
  23292. * @returns {Array} Returns the key-value pairs.
  23293. * @example
  23294. *
  23295. * function Foo() {
  23296. * this.a = 1;
  23297. * this.b = 2;
  23298. * }
  23299. *
  23300. * Foo.prototype.c = 3;
  23301. *
  23302. * _.toPairsIn(new Foo);
  23303. * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
  23304. */
  23305. var toPairsIn = createToPairs(keysIn);
  23306. /**
  23307. * An alternative to `_.reduce`; this method transforms `object` to a new
  23308. * `accumulator` object which is the result of running each of its own
  23309. * enumerable string keyed properties thru `iteratee`, with each invocation
  23310. * potentially mutating the `accumulator` object. If `accumulator` is not
  23311. * provided, a new object with the same `[[Prototype]]` will be used. The
  23312. * iteratee is invoked with four arguments: (accumulator, value, key, object).
  23313. * Iteratee functions may exit iteration early by explicitly returning `false`.
  23314. *
  23315. * @static
  23316. * @memberOf _
  23317. * @since 1.3.0
  23318. * @category Object
  23319. * @param {Object} object The object to iterate over.
  23320. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  23321. * @param {*} [accumulator] The custom accumulator value.
  23322. * @returns {*} Returns the accumulated value.
  23323. * @example
  23324. *
  23325. * _.transform([2, 3, 4], function(result, n) {
  23326. * result.push(n *= n);
  23327. * return n % 2 == 0;
  23328. * }, []);
  23329. * // => [4, 9]
  23330. *
  23331. * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
  23332. * (result[value] || (result[value] = [])).push(key);
  23333. * }, {});
  23334. * // => { '1': ['a', 'c'], '2': ['b'] }
  23335. */
  23336. function transform(object, iteratee, accumulator) {
  23337. var isArr = isArray(object),
  23338. isArrLike = isArr || isBuffer(object) || isTypedArray(object);
  23339. iteratee = getIteratee(iteratee, 4);
  23340. if (accumulator == null) {
  23341. var Ctor = object && object.constructor;
  23342. if (isArrLike) {
  23343. accumulator = isArr ? new Ctor : [];
  23344. }
  23345. else if (isObject(object)) {
  23346. accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
  23347. }
  23348. else {
  23349. accumulator = {};
  23350. }
  23351. }
  23352. (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
  23353. return iteratee(accumulator, value, index, object);
  23354. });
  23355. return accumulator;
  23356. }
  23357. /**
  23358. * Removes the property at `path` of `object`.
  23359. *
  23360. * **Note:** This method mutates `object`.
  23361. *
  23362. * @static
  23363. * @memberOf _
  23364. * @since 4.0.0
  23365. * @category Object
  23366. * @param {Object} object The object to modify.
  23367. * @param {Array|string} path The path of the property to unset.
  23368. * @returns {boolean} Returns `true` if the property is deleted, else `false`.
  23369. * @example
  23370. *
  23371. * var object = { 'a': [{ 'b': { 'c': 7 } }] };
  23372. * _.unset(object, 'a[0].b.c');
  23373. * // => true
  23374. *
  23375. * console.log(object);
  23376. * // => { 'a': [{ 'b': {} }] };
  23377. *
  23378. * _.unset(object, ['a', '0', 'b', 'c']);
  23379. * // => true
  23380. *
  23381. * console.log(object);
  23382. * // => { 'a': [{ 'b': {} }] };
  23383. */
  23384. function unset(object, path) {
  23385. return object == null ? true : baseUnset(object, path);
  23386. }
  23387. /**
  23388. * This method is like `_.set` except that accepts `updater` to produce the
  23389. * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
  23390. * is invoked with one argument: (value).
  23391. *
  23392. * **Note:** This method mutates `object`.
  23393. *
  23394. * @static
  23395. * @memberOf _
  23396. * @since 4.6.0
  23397. * @category Object
  23398. * @param {Object} object The object to modify.
  23399. * @param {Array|string} path The path of the property to set.
  23400. * @param {Function} updater The function to produce the updated value.
  23401. * @returns {Object} Returns `object`.
  23402. * @example
  23403. *
  23404. * var object = { 'a': [{ 'b': { 'c': 3 } }] };
  23405. *
  23406. * _.update(object, 'a[0].b.c', function(n) { return n * n; });
  23407. * console.log(object.a[0].b.c);
  23408. * // => 9
  23409. *
  23410. * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
  23411. * console.log(object.x[0].y.z);
  23412. * // => 0
  23413. */
  23414. function update(object, path, updater) {
  23415. return object == null ? object : baseUpdate(object, path, castFunction(updater));
  23416. }
  23417. /**
  23418. * This method is like `_.update` except that it accepts `customizer` which is
  23419. * invoked to produce the objects of `path`. If `customizer` returns `undefined`
  23420. * path creation is handled by the method instead. The `customizer` is invoked
  23421. * with three arguments: (nsValue, key, nsObject).
  23422. *
  23423. * **Note:** This method mutates `object`.
  23424. *
  23425. * @static
  23426. * @memberOf _
  23427. * @since 4.6.0
  23428. * @category Object
  23429. * @param {Object} object The object to modify.
  23430. * @param {Array|string} path The path of the property to set.
  23431. * @param {Function} updater The function to produce the updated value.
  23432. * @param {Function} [customizer] The function to customize assigned values.
  23433. * @returns {Object} Returns `object`.
  23434. * @example
  23435. *
  23436. * var object = {};
  23437. *
  23438. * _.updateWith(object, '[0][1]', _.constant('a'), Object);
  23439. * // => { '0': { '1': 'a' } }
  23440. */
  23441. function updateWith(object, path, updater, customizer) {
  23442. customizer = typeof customizer == 'function' ? customizer : undefined;
  23443. return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
  23444. }
  23445. /**
  23446. * Creates an array of the own enumerable string keyed property values of `object`.
  23447. *
  23448. * **Note:** Non-object values are coerced to objects.
  23449. *
  23450. * @static
  23451. * @since 0.1.0
  23452. * @memberOf _
  23453. * @category Object
  23454. * @param {Object} object The object to query.
  23455. * @returns {Array} Returns the array of property values.
  23456. * @example
  23457. *
  23458. * function Foo() {
  23459. * this.a = 1;
  23460. * this.b = 2;
  23461. * }
  23462. *
  23463. * Foo.prototype.c = 3;
  23464. *
  23465. * _.values(new Foo);
  23466. * // => [1, 2] (iteration order is not guaranteed)
  23467. *
  23468. * _.values('hi');
  23469. * // => ['h', 'i']
  23470. */
  23471. function values(object) {
  23472. return object == null ? [] : baseValues(object, keys(object));
  23473. }
  23474. /**
  23475. * Creates an array of the own and inherited enumerable string keyed property
  23476. * values of `object`.
  23477. *
  23478. * **Note:** Non-object values are coerced to objects.
  23479. *
  23480. * @static
  23481. * @memberOf _
  23482. * @since 3.0.0
  23483. * @category Object
  23484. * @param {Object} object The object to query.
  23485. * @returns {Array} Returns the array of property values.
  23486. * @example
  23487. *
  23488. * function Foo() {
  23489. * this.a = 1;
  23490. * this.b = 2;
  23491. * }
  23492. *
  23493. * Foo.prototype.c = 3;
  23494. *
  23495. * _.valuesIn(new Foo);
  23496. * // => [1, 2, 3] (iteration order is not guaranteed)
  23497. */
  23498. function valuesIn(object) {
  23499. return object == null ? [] : baseValues(object, keysIn(object));
  23500. }
  23501. /*------------------------------------------------------------------------*/
  23502. /**
  23503. * Clamps `number` within the inclusive `lower` and `upper` bounds.
  23504. *
  23505. * @static
  23506. * @memberOf _
  23507. * @since 4.0.0
  23508. * @category Number
  23509. * @param {number} number The number to clamp.
  23510. * @param {number} [lower] The lower bound.
  23511. * @param {number} upper The upper bound.
  23512. * @returns {number} Returns the clamped number.
  23513. * @example
  23514. *
  23515. * _.clamp(-10, -5, 5);
  23516. * // => -5
  23517. *
  23518. * _.clamp(10, -5, 5);
  23519. * // => 5
  23520. */
  23521. function clamp(number, lower, upper) {
  23522. if (upper === undefined) {
  23523. upper = lower;
  23524. lower = undefined;
  23525. }
  23526. if (upper !== undefined) {
  23527. upper = toNumber(upper);
  23528. upper = upper === upper ? upper : 0;
  23529. }
  23530. if (lower !== undefined) {
  23531. lower = toNumber(lower);
  23532. lower = lower === lower ? lower : 0;
  23533. }
  23534. return baseClamp(toNumber(number), lower, upper);
  23535. }
  23536. /**
  23537. * Checks if `n` is between `start` and up to, but not including, `end`. If
  23538. * `end` is not specified, it's set to `start` with `start` then set to `0`.
  23539. * If `start` is greater than `end` the params are swapped to support
  23540. * negative ranges.
  23541. *
  23542. * @static
  23543. * @memberOf _
  23544. * @since 3.3.0
  23545. * @category Number
  23546. * @param {number} number The number to check.
  23547. * @param {number} [start=0] The start of the range.
  23548. * @param {number} end The end of the range.
  23549. * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
  23550. * @see _.range, _.rangeRight
  23551. * @example
  23552. *
  23553. * _.inRange(3, 2, 4);
  23554. * // => true
  23555. *
  23556. * _.inRange(4, 8);
  23557. * // => true
  23558. *
  23559. * _.inRange(4, 2);
  23560. * // => false
  23561. *
  23562. * _.inRange(2, 2);
  23563. * // => false
  23564. *
  23565. * _.inRange(1.2, 2);
  23566. * // => true
  23567. *
  23568. * _.inRange(5.2, 4);
  23569. * // => false
  23570. *
  23571. * _.inRange(-3, -2, -6);
  23572. * // => true
  23573. */
  23574. function inRange(number, start, end) {
  23575. start = toFinite(start);
  23576. if (end === undefined) {
  23577. end = start;
  23578. start = 0;
  23579. } else {
  23580. end = toFinite(end);
  23581. }
  23582. number = toNumber(number);
  23583. return baseInRange(number, start, end);
  23584. }
  23585. /**
  23586. * Produces a random number between the inclusive `lower` and `upper` bounds.
  23587. * If only one argument is provided a number between `0` and the given number
  23588. * is returned. If `floating` is `true`, or either `lower` or `upper` are
  23589. * floats, a floating-point number is returned instead of an integer.
  23590. *
  23591. * **Note:** JavaScript follows the IEEE-754 standard for resolving
  23592. * floating-point values which can produce unexpected results.
  23593. *
  23594. * @static
  23595. * @memberOf _
  23596. * @since 0.7.0
  23597. * @category Number
  23598. * @param {number} [lower=0] The lower bound.
  23599. * @param {number} [upper=1] The upper bound.
  23600. * @param {boolean} [floating] Specify returning a floating-point number.
  23601. * @returns {number} Returns the random number.
  23602. * @example
  23603. *
  23604. * _.random(0, 5);
  23605. * // => an integer between 0 and 5
  23606. *
  23607. * _.random(5);
  23608. * // => also an integer between 0 and 5
  23609. *
  23610. * _.random(5, true);
  23611. * // => a floating-point number between 0 and 5
  23612. *
  23613. * _.random(1.2, 5.2);
  23614. * // => a floating-point number between 1.2 and 5.2
  23615. */
  23616. function random(lower, upper, floating) {
  23617. if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
  23618. upper = floating = undefined;
  23619. }
  23620. if (floating === undefined) {
  23621. if (typeof upper == 'boolean') {
  23622. floating = upper;
  23623. upper = undefined;
  23624. }
  23625. else if (typeof lower == 'boolean') {
  23626. floating = lower;
  23627. lower = undefined;
  23628. }
  23629. }
  23630. if (lower === undefined && upper === undefined) {
  23631. lower = 0;
  23632. upper = 1;
  23633. }
  23634. else {
  23635. lower = toFinite(lower);
  23636. if (upper === undefined) {
  23637. upper = lower;
  23638. lower = 0;
  23639. } else {
  23640. upper = toFinite(upper);
  23641. }
  23642. }
  23643. if (lower > upper) {
  23644. var temp = lower;
  23645. lower = upper;
  23646. upper = temp;
  23647. }
  23648. if (floating || lower % 1 || upper % 1) {
  23649. var rand = nativeRandom();
  23650. return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
  23651. }
  23652. return baseRandom(lower, upper);
  23653. }
  23654. /*------------------------------------------------------------------------*/
  23655. /**
  23656. * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
  23657. *
  23658. * @static
  23659. * @memberOf _
  23660. * @since 3.0.0
  23661. * @category String
  23662. * @param {string} [string=''] The string to convert.
  23663. * @returns {string} Returns the camel cased string.
  23664. * @example
  23665. *
  23666. * _.camelCase('Foo Bar');
  23667. * // => 'fooBar'
  23668. *
  23669. * _.camelCase('--foo-bar--');
  23670. * // => 'fooBar'
  23671. *
  23672. * _.camelCase('__FOO_BAR__');
  23673. * // => 'fooBar'
  23674. */
  23675. var camelCase = createCompounder(function(result, word, index) {
  23676. word = word.toLowerCase();
  23677. return result + (index ? capitalize(word) : word);
  23678. });
  23679. /**
  23680. * Converts the first character of `string` to upper case and the remaining
  23681. * to lower case.
  23682. *
  23683. * @static
  23684. * @memberOf _
  23685. * @since 3.0.0
  23686. * @category String
  23687. * @param {string} [string=''] The string to capitalize.
  23688. * @returns {string} Returns the capitalized string.
  23689. * @example
  23690. *
  23691. * _.capitalize('FRED');
  23692. * // => 'Fred'
  23693. */
  23694. function capitalize(string) {
  23695. return upperFirst(toString(string).toLowerCase());
  23696. }
  23697. /**
  23698. * Deburrs `string` by converting
  23699. * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
  23700. * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
  23701. * letters to basic Latin letters and removing
  23702. * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
  23703. *
  23704. * @static
  23705. * @memberOf _
  23706. * @since 3.0.0
  23707. * @category String
  23708. * @param {string} [string=''] The string to deburr.
  23709. * @returns {string} Returns the deburred string.
  23710. * @example
  23711. *
  23712. * _.deburr('déjà vu');
  23713. * // => 'deja vu'
  23714. */
  23715. function deburr(string) {
  23716. string = toString(string);
  23717. return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
  23718. }
  23719. /**
  23720. * Checks if `string` ends with the given target string.
  23721. *
  23722. * @static
  23723. * @memberOf _
  23724. * @since 3.0.0
  23725. * @category String
  23726. * @param {string} [string=''] The string to inspect.
  23727. * @param {string} [target] The string to search for.
  23728. * @param {number} [position=string.length] The position to search up to.
  23729. * @returns {boolean} Returns `true` if `string` ends with `target`,
  23730. * else `false`.
  23731. * @example
  23732. *
  23733. * _.endsWith('abc', 'c');
  23734. * // => true
  23735. *
  23736. * _.endsWith('abc', 'b');
  23737. * // => false
  23738. *
  23739. * _.endsWith('abc', 'b', 2);
  23740. * // => true
  23741. */
  23742. function endsWith(string, target, position) {
  23743. string = toString(string);
  23744. target = baseToString(target);
  23745. var length = string.length;
  23746. position = position === undefined
  23747. ? length
  23748. : baseClamp(toInteger(position), 0, length);
  23749. var end = position;
  23750. position -= target.length;
  23751. return position >= 0 && string.slice(position, end) == target;
  23752. }
  23753. /**
  23754. * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
  23755. * corresponding HTML entities.
  23756. *
  23757. * **Note:** No other characters are escaped. To escape additional
  23758. * characters use a third-party library like [_he_](https://mths.be/he).
  23759. *
  23760. * Though the ">" character is escaped for symmetry, characters like
  23761. * ">" and "/" don't need escaping in HTML and have no special meaning
  23762. * unless they're part of a tag or unquoted attribute value. See
  23763. * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
  23764. * (under "semi-related fun fact") for more details.
  23765. *
  23766. * When working with HTML you should always
  23767. * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
  23768. * XSS vectors.
  23769. *
  23770. * @static
  23771. * @since 0.1.0
  23772. * @memberOf _
  23773. * @category String
  23774. * @param {string} [string=''] The string to escape.
  23775. * @returns {string} Returns the escaped string.
  23776. * @example
  23777. *
  23778. * _.escape('fred, barney, & pebbles');
  23779. * // => 'fred, barney, &amp; pebbles'
  23780. */
  23781. function escape(string) {
  23782. string = toString(string);
  23783. return (string && reHasUnescapedHtml.test(string))
  23784. ? string.replace(reUnescapedHtml, escapeHtmlChar)
  23785. : string;
  23786. }
  23787. /**
  23788. * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
  23789. * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
  23790. *
  23791. * @static
  23792. * @memberOf _
  23793. * @since 3.0.0
  23794. * @category String
  23795. * @param {string} [string=''] The string to escape.
  23796. * @returns {string} Returns the escaped string.
  23797. * @example
  23798. *
  23799. * _.escapeRegExp('[lodash](https://lodash.com/)');
  23800. * // => '\[lodash\]\(https://lodash\.com/\)'
  23801. */
  23802. function escapeRegExp(string) {
  23803. string = toString(string);
  23804. return (string && reHasRegExpChar.test(string))
  23805. ? string.replace(reRegExpChar, '\\$&')
  23806. : string;
  23807. }
  23808. /**
  23809. * Converts `string` to
  23810. * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
  23811. *
  23812. * @static
  23813. * @memberOf _
  23814. * @since 3.0.0
  23815. * @category String
  23816. * @param {string} [string=''] The string to convert.
  23817. * @returns {string} Returns the kebab cased string.
  23818. * @example
  23819. *
  23820. * _.kebabCase('Foo Bar');
  23821. * // => 'foo-bar'
  23822. *
  23823. * _.kebabCase('fooBar');
  23824. * // => 'foo-bar'
  23825. *
  23826. * _.kebabCase('__FOO_BAR__');
  23827. * // => 'foo-bar'
  23828. */
  23829. var kebabCase = createCompounder(function(result, word, index) {
  23830. return result + (index ? '-' : '') + word.toLowerCase();
  23831. });
  23832. /**
  23833. * Converts `string`, as space separated words, to lower case.
  23834. *
  23835. * @static
  23836. * @memberOf _
  23837. * @since 4.0.0
  23838. * @category String
  23839. * @param {string} [string=''] The string to convert.
  23840. * @returns {string} Returns the lower cased string.
  23841. * @example
  23842. *
  23843. * _.lowerCase('--Foo-Bar--');
  23844. * // => 'foo bar'
  23845. *
  23846. * _.lowerCase('fooBar');
  23847. * // => 'foo bar'
  23848. *
  23849. * _.lowerCase('__FOO_BAR__');
  23850. * // => 'foo bar'
  23851. */
  23852. var lowerCase = createCompounder(function(result, word, index) {
  23853. return result + (index ? ' ' : '') + word.toLowerCase();
  23854. });
  23855. /**
  23856. * Converts the first character of `string` to lower case.
  23857. *
  23858. * @static
  23859. * @memberOf _
  23860. * @since 4.0.0
  23861. * @category String
  23862. * @param {string} [string=''] The string to convert.
  23863. * @returns {string} Returns the converted string.
  23864. * @example
  23865. *
  23866. * _.lowerFirst('Fred');
  23867. * // => 'fred'
  23868. *
  23869. * _.lowerFirst('FRED');
  23870. * // => 'fRED'
  23871. */
  23872. var lowerFirst = createCaseFirst('toLowerCase');
  23873. /**
  23874. * Pads `string` on the left and right sides if it's shorter than `length`.
  23875. * Padding characters are truncated if they can't be evenly divided by `length`.
  23876. *
  23877. * @static
  23878. * @memberOf _
  23879. * @since 3.0.0
  23880. * @category String
  23881. * @param {string} [string=''] The string to pad.
  23882. * @param {number} [length=0] The padding length.
  23883. * @param {string} [chars=' '] The string used as padding.
  23884. * @returns {string} Returns the padded string.
  23885. * @example
  23886. *
  23887. * _.pad('abc', 8);
  23888. * // => ' abc '
  23889. *
  23890. * _.pad('abc', 8, '_-');
  23891. * // => '_-abc_-_'
  23892. *
  23893. * _.pad('abc', 3);
  23894. * // => 'abc'
  23895. */
  23896. function pad(string, length, chars) {
  23897. string = toString(string);
  23898. length = toInteger(length);
  23899. var strLength = length ? stringSize(string) : 0;
  23900. if (!length || strLength >= length) {
  23901. return string;
  23902. }
  23903. var mid = (length - strLength) / 2;
  23904. return (
  23905. createPadding(nativeFloor(mid), chars) +
  23906. string +
  23907. createPadding(nativeCeil(mid), chars)
  23908. );
  23909. }
  23910. /**
  23911. * Pads `string` on the right side if it's shorter than `length`. Padding
  23912. * characters are truncated if they exceed `length`.
  23913. *
  23914. * @static
  23915. * @memberOf _
  23916. * @since 4.0.0
  23917. * @category String
  23918. * @param {string} [string=''] The string to pad.
  23919. * @param {number} [length=0] The padding length.
  23920. * @param {string} [chars=' '] The string used as padding.
  23921. * @returns {string} Returns the padded string.
  23922. * @example
  23923. *
  23924. * _.padEnd('abc', 6);
  23925. * // => 'abc '
  23926. *
  23927. * _.padEnd('abc', 6, '_-');
  23928. * // => 'abc_-_'
  23929. *
  23930. * _.padEnd('abc', 3);
  23931. * // => 'abc'
  23932. */
  23933. function padEnd(string, length, chars) {
  23934. string = toString(string);
  23935. length = toInteger(length);
  23936. var strLength = length ? stringSize(string) : 0;
  23937. return (length && strLength < length)
  23938. ? (string + createPadding(length - strLength, chars))
  23939. : string;
  23940. }
  23941. /**
  23942. * Pads `string` on the left side if it's shorter than `length`. Padding
  23943. * characters are truncated if they exceed `length`.
  23944. *
  23945. * @static
  23946. * @memberOf _
  23947. * @since 4.0.0
  23948. * @category String
  23949. * @param {string} [string=''] The string to pad.
  23950. * @param {number} [length=0] The padding length.
  23951. * @param {string} [chars=' '] The string used as padding.
  23952. * @returns {string} Returns the padded string.
  23953. * @example
  23954. *
  23955. * _.padStart('abc', 6);
  23956. * // => ' abc'
  23957. *
  23958. * _.padStart('abc', 6, '_-');
  23959. * // => '_-_abc'
  23960. *
  23961. * _.padStart('abc', 3);
  23962. * // => 'abc'
  23963. */
  23964. function padStart(string, length, chars) {
  23965. string = toString(string);
  23966. length = toInteger(length);
  23967. var strLength = length ? stringSize(string) : 0;
  23968. return (length && strLength < length)
  23969. ? (createPadding(length - strLength, chars) + string)
  23970. : string;
  23971. }
  23972. /**
  23973. * Converts `string` to an integer of the specified radix. If `radix` is
  23974. * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
  23975. * hexadecimal, in which case a `radix` of `16` is used.
  23976. *
  23977. * **Note:** This method aligns with the
  23978. * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
  23979. *
  23980. * @static
  23981. * @memberOf _
  23982. * @since 1.1.0
  23983. * @category String
  23984. * @param {string} string The string to convert.
  23985. * @param {number} [radix=10] The radix to interpret `value` by.
  23986. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  23987. * @returns {number} Returns the converted integer.
  23988. * @example
  23989. *
  23990. * _.parseInt('08');
  23991. * // => 8
  23992. *
  23993. * _.map(['6', '08', '10'], _.parseInt);
  23994. * // => [6, 8, 10]
  23995. */
  23996. function parseInt(string, radix, guard) {
  23997. if (guard || radix == null) {
  23998. radix = 0;
  23999. } else if (radix) {
  24000. radix = +radix;
  24001. }
  24002. return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
  24003. }
  24004. /**
  24005. * Repeats the given string `n` times.
  24006. *
  24007. * @static
  24008. * @memberOf _
  24009. * @since 3.0.0
  24010. * @category String
  24011. * @param {string} [string=''] The string to repeat.
  24012. * @param {number} [n=1] The number of times to repeat the string.
  24013. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24014. * @returns {string} Returns the repeated string.
  24015. * @example
  24016. *
  24017. * _.repeat('*', 3);
  24018. * // => '***'
  24019. *
  24020. * _.repeat('abc', 2);
  24021. * // => 'abcabc'
  24022. *
  24023. * _.repeat('abc', 0);
  24024. * // => ''
  24025. */
  24026. function repeat(string, n, guard) {
  24027. if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
  24028. n = 1;
  24029. } else {
  24030. n = toInteger(n);
  24031. }
  24032. return baseRepeat(toString(string), n);
  24033. }
  24034. /**
  24035. * Replaces matches for `pattern` in `string` with `replacement`.
  24036. *
  24037. * **Note:** This method is based on
  24038. * [`String#replace`](https://mdn.io/String/replace).
  24039. *
  24040. * @static
  24041. * @memberOf _
  24042. * @since 4.0.0
  24043. * @category String
  24044. * @param {string} [string=''] The string to modify.
  24045. * @param {RegExp|string} pattern The pattern to replace.
  24046. * @param {Function|string} replacement The match replacement.
  24047. * @returns {string} Returns the modified string.
  24048. * @example
  24049. *
  24050. * _.replace('Hi Fred', 'Fred', 'Barney');
  24051. * // => 'Hi Barney'
  24052. */
  24053. function replace() {
  24054. var args = arguments,
  24055. string = toString(args[0]);
  24056. return args.length < 3 ? string : string.replace(args[1], args[2]);
  24057. }
  24058. /**
  24059. * Converts `string` to
  24060. * [snake case](https://en.wikipedia.org/wiki/Snake_case).
  24061. *
  24062. * @static
  24063. * @memberOf _
  24064. * @since 3.0.0
  24065. * @category String
  24066. * @param {string} [string=''] The string to convert.
  24067. * @returns {string} Returns the snake cased string.
  24068. * @example
  24069. *
  24070. * _.snakeCase('Foo Bar');
  24071. * // => 'foo_bar'
  24072. *
  24073. * _.snakeCase('fooBar');
  24074. * // => 'foo_bar'
  24075. *
  24076. * _.snakeCase('--FOO-BAR--');
  24077. * // => 'foo_bar'
  24078. */
  24079. var snakeCase = createCompounder(function(result, word, index) {
  24080. return result + (index ? '_' : '') + word.toLowerCase();
  24081. });
  24082. /**
  24083. * Splits `string` by `separator`.
  24084. *
  24085. * **Note:** This method is based on
  24086. * [`String#split`](https://mdn.io/String/split).
  24087. *
  24088. * @static
  24089. * @memberOf _
  24090. * @since 4.0.0
  24091. * @category String
  24092. * @param {string} [string=''] The string to split.
  24093. * @param {RegExp|string} separator The separator pattern to split by.
  24094. * @param {number} [limit] The length to truncate results to.
  24095. * @returns {Array} Returns the string segments.
  24096. * @example
  24097. *
  24098. * _.split('a-b-c', '-', 2);
  24099. * // => ['a', 'b']
  24100. */
  24101. function split(string, separator, limit) {
  24102. if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
  24103. separator = limit = undefined;
  24104. }
  24105. limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
  24106. if (!limit) {
  24107. return [];
  24108. }
  24109. string = toString(string);
  24110. if (string && (
  24111. typeof separator == 'string' ||
  24112. (separator != null && !isRegExp(separator))
  24113. )) {
  24114. separator = baseToString(separator);
  24115. if (!separator && hasUnicode(string)) {
  24116. return castSlice(stringToArray(string), 0, limit);
  24117. }
  24118. }
  24119. return string.split(separator, limit);
  24120. }
  24121. /**
  24122. * Converts `string` to
  24123. * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
  24124. *
  24125. * @static
  24126. * @memberOf _
  24127. * @since 3.1.0
  24128. * @category String
  24129. * @param {string} [string=''] The string to convert.
  24130. * @returns {string} Returns the start cased string.
  24131. * @example
  24132. *
  24133. * _.startCase('--foo-bar--');
  24134. * // => 'Foo Bar'
  24135. *
  24136. * _.startCase('fooBar');
  24137. * // => 'Foo Bar'
  24138. *
  24139. * _.startCase('__FOO_BAR__');
  24140. * // => 'FOO BAR'
  24141. */
  24142. var startCase = createCompounder(function(result, word, index) {
  24143. return result + (index ? ' ' : '') + upperFirst(word);
  24144. });
  24145. /**
  24146. * Checks if `string` starts with the given target string.
  24147. *
  24148. * @static
  24149. * @memberOf _
  24150. * @since 3.0.0
  24151. * @category String
  24152. * @param {string} [string=''] The string to inspect.
  24153. * @param {string} [target] The string to search for.
  24154. * @param {number} [position=0] The position to search from.
  24155. * @returns {boolean} Returns `true` if `string` starts with `target`,
  24156. * else `false`.
  24157. * @example
  24158. *
  24159. * _.startsWith('abc', 'a');
  24160. * // => true
  24161. *
  24162. * _.startsWith('abc', 'b');
  24163. * // => false
  24164. *
  24165. * _.startsWith('abc', 'b', 1);
  24166. * // => true
  24167. */
  24168. function startsWith(string, target, position) {
  24169. string = toString(string);
  24170. position = position == null
  24171. ? 0
  24172. : baseClamp(toInteger(position), 0, string.length);
  24173. target = baseToString(target);
  24174. return string.slice(position, position + target.length) == target;
  24175. }
  24176. /**
  24177. * Creates a compiled template function that can interpolate data properties
  24178. * in "interpolate" delimiters, HTML-escape interpolated data properties in
  24179. * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
  24180. * properties may be accessed as free variables in the template. If a setting
  24181. * object is given, it takes precedence over `_.templateSettings` values.
  24182. *
  24183. * **Note:** In the development build `_.template` utilizes
  24184. * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
  24185. * for easier debugging.
  24186. *
  24187. * For more information on precompiling templates see
  24188. * [lodash's custom builds documentation](https://lodash.com/custom-builds).
  24189. *
  24190. * For more information on Chrome extension sandboxes see
  24191. * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
  24192. *
  24193. * @static
  24194. * @since 0.1.0
  24195. * @memberOf _
  24196. * @category String
  24197. * @param {string} [string=''] The template string.
  24198. * @param {Object} [options={}] The options object.
  24199. * @param {RegExp} [options.escape=_.templateSettings.escape]
  24200. * The HTML "escape" delimiter.
  24201. * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
  24202. * The "evaluate" delimiter.
  24203. * @param {Object} [options.imports=_.templateSettings.imports]
  24204. * An object to import into the template as free variables.
  24205. * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
  24206. * The "interpolate" delimiter.
  24207. * @param {string} [options.sourceURL='lodash.templateSources[n]']
  24208. * The sourceURL of the compiled template.
  24209. * @param {string} [options.variable='obj']
  24210. * The data object variable name.
  24211. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24212. * @returns {Function} Returns the compiled template function.
  24213. * @example
  24214. *
  24215. * // Use the "interpolate" delimiter to create a compiled template.
  24216. * var compiled = _.template('hello <%= user %>!');
  24217. * compiled({ 'user': 'fred' });
  24218. * // => 'hello fred!'
  24219. *
  24220. * // Use the HTML "escape" delimiter to escape data property values.
  24221. * var compiled = _.template('<b><%- value %></b>');
  24222. * compiled({ 'value': '<script>' });
  24223. * // => '<b>&lt;script&gt;</b>'
  24224. *
  24225. * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
  24226. * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
  24227. * compiled({ 'users': ['fred', 'barney'] });
  24228. * // => '<li>fred</li><li>barney</li>'
  24229. *
  24230. * // Use the internal `print` function in "evaluate" delimiters.
  24231. * var compiled = _.template('<% print("hello " + user); %>!');
  24232. * compiled({ 'user': 'barney' });
  24233. * // => 'hello barney!'
  24234. *
  24235. * // Use the ES template literal delimiter as an "interpolate" delimiter.
  24236. * // Disable support by replacing the "interpolate" delimiter.
  24237. * var compiled = _.template('hello ${ user }!');
  24238. * compiled({ 'user': 'pebbles' });
  24239. * // => 'hello pebbles!'
  24240. *
  24241. * // Use backslashes to treat delimiters as plain text.
  24242. * var compiled = _.template('<%= "\\<%- value %\\>" %>');
  24243. * compiled({ 'value': 'ignored' });
  24244. * // => '<%- value %>'
  24245. *
  24246. * // Use the `imports` option to import `jQuery` as `jq`.
  24247. * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
  24248. * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
  24249. * compiled({ 'users': ['fred', 'barney'] });
  24250. * // => '<li>fred</li><li>barney</li>'
  24251. *
  24252. * // Use the `sourceURL` option to specify a custom sourceURL for the template.
  24253. * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
  24254. * compiled(data);
  24255. * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
  24256. *
  24257. * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
  24258. * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
  24259. * compiled.source;
  24260. * // => function(data) {
  24261. * // var __t, __p = '';
  24262. * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
  24263. * // return __p;
  24264. * // }
  24265. *
  24266. * // Use custom template delimiters.
  24267. * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
  24268. * var compiled = _.template('hello {{ user }}!');
  24269. * compiled({ 'user': 'mustache' });
  24270. * // => 'hello mustache!'
  24271. *
  24272. * // Use the `source` property to inline compiled templates for meaningful
  24273. * // line numbers in error messages and stack traces.
  24274. * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
  24275. * var JST = {\
  24276. * "main": ' + _.template(mainText).source + '\
  24277. * };\
  24278. * ');
  24279. */
  24280. function template(string, options, guard) {
  24281. // Based on John Resig's `tmpl` implementation
  24282. // (http://ejohn.org/blog/javascript-micro-templating/)
  24283. // and Laura Doktorova's doT.js (https://github.com/olado/doT).
  24284. var settings = lodash.templateSettings;
  24285. if (guard && isIterateeCall(string, options, guard)) {
  24286. options = undefined;
  24287. }
  24288. string = toString(string);
  24289. options = assignInWith({}, options, settings, customDefaultsAssignIn);
  24290. var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
  24291. importsKeys = keys(imports),
  24292. importsValues = baseValues(imports, importsKeys);
  24293. var isEscaping,
  24294. isEvaluating,
  24295. index = 0,
  24296. interpolate = options.interpolate || reNoMatch,
  24297. source = "__p += '";
  24298. // Compile the regexp to match each delimiter.
  24299. var reDelimiters = RegExp(
  24300. (options.escape || reNoMatch).source + '|' +
  24301. interpolate.source + '|' +
  24302. (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
  24303. (options.evaluate || reNoMatch).source + '|$'
  24304. , 'g');
  24305. // Use a sourceURL for easier debugging.
  24306. var sourceURL = '//# sourceURL=' +
  24307. ('sourceURL' in options
  24308. ? options.sourceURL
  24309. : ('lodash.templateSources[' + (++templateCounter) + ']')
  24310. ) + '\n';
  24311. string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
  24312. interpolateValue || (interpolateValue = esTemplateValue);
  24313. // Escape characters that can't be included in string literals.
  24314. source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
  24315. // Replace delimiters with snippets.
  24316. if (escapeValue) {
  24317. isEscaping = true;
  24318. source += "' +\n__e(" + escapeValue + ") +\n'";
  24319. }
  24320. if (evaluateValue) {
  24321. isEvaluating = true;
  24322. source += "';\n" + evaluateValue + ";\n__p += '";
  24323. }
  24324. if (interpolateValue) {
  24325. source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
  24326. }
  24327. index = offset + match.length;
  24328. // The JS engine embedded in Adobe products needs `match` returned in
  24329. // order to produce the correct `offset` value.
  24330. return match;
  24331. });
  24332. source += "';\n";
  24333. // If `variable` is not specified wrap a with-statement around the generated
  24334. // code to add the data object to the top of the scope chain.
  24335. var variable = options.variable;
  24336. if (!variable) {
  24337. source = 'with (obj) {\n' + source + '\n}\n';
  24338. }
  24339. // Cleanup code by stripping empty strings.
  24340. source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
  24341. .replace(reEmptyStringMiddle, '$1')
  24342. .replace(reEmptyStringTrailing, '$1;');
  24343. // Frame code as the function body.
  24344. source = 'function(' + (variable || 'obj') + ') {\n' +
  24345. (variable
  24346. ? ''
  24347. : 'obj || (obj = {});\n'
  24348. ) +
  24349. "var __t, __p = ''" +
  24350. (isEscaping
  24351. ? ', __e = _.escape'
  24352. : ''
  24353. ) +
  24354. (isEvaluating
  24355. ? ', __j = Array.prototype.join;\n' +
  24356. "function print() { __p += __j.call(arguments, '') }\n"
  24357. : ';\n'
  24358. ) +
  24359. source +
  24360. 'return __p\n}';
  24361. var result = attempt(function() {
  24362. return Function(importsKeys, sourceURL + 'return ' + source)
  24363. .apply(undefined, importsValues);
  24364. });
  24365. // Provide the compiled function's source by its `toString` method or
  24366. // the `source` property as a convenience for inlining compiled templates.
  24367. result.source = source;
  24368. if (isError(result)) {
  24369. throw result;
  24370. }
  24371. return result;
  24372. }
  24373. /**
  24374. * Converts `string`, as a whole, to lower case just like
  24375. * [String#toLowerCase](https://mdn.io/toLowerCase).
  24376. *
  24377. * @static
  24378. * @memberOf _
  24379. * @since 4.0.0
  24380. * @category String
  24381. * @param {string} [string=''] The string to convert.
  24382. * @returns {string} Returns the lower cased string.
  24383. * @example
  24384. *
  24385. * _.toLower('--Foo-Bar--');
  24386. * // => '--foo-bar--'
  24387. *
  24388. * _.toLower('fooBar');
  24389. * // => 'foobar'
  24390. *
  24391. * _.toLower('__FOO_BAR__');
  24392. * // => '__foo_bar__'
  24393. */
  24394. function toLower(value) {
  24395. return toString(value).toLowerCase();
  24396. }
  24397. /**
  24398. * Converts `string`, as a whole, to upper case just like
  24399. * [String#toUpperCase](https://mdn.io/toUpperCase).
  24400. *
  24401. * @static
  24402. * @memberOf _
  24403. * @since 4.0.0
  24404. * @category String
  24405. * @param {string} [string=''] The string to convert.
  24406. * @returns {string} Returns the upper cased string.
  24407. * @example
  24408. *
  24409. * _.toUpper('--foo-bar--');
  24410. * // => '--FOO-BAR--'
  24411. *
  24412. * _.toUpper('fooBar');
  24413. * // => 'FOOBAR'
  24414. *
  24415. * _.toUpper('__foo_bar__');
  24416. * // => '__FOO_BAR__'
  24417. */
  24418. function toUpper(value) {
  24419. return toString(value).toUpperCase();
  24420. }
  24421. /**
  24422. * Removes leading and trailing whitespace or specified characters from `string`.
  24423. *
  24424. * @static
  24425. * @memberOf _
  24426. * @since 3.0.0
  24427. * @category String
  24428. * @param {string} [string=''] The string to trim.
  24429. * @param {string} [chars=whitespace] The characters to trim.
  24430. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24431. * @returns {string} Returns the trimmed string.
  24432. * @example
  24433. *
  24434. * _.trim(' abc ');
  24435. * // => 'abc'
  24436. *
  24437. * _.trim('-_-abc-_-', '_-');
  24438. * // => 'abc'
  24439. *
  24440. * _.map([' foo ', ' bar '], _.trim);
  24441. * // => ['foo', 'bar']
  24442. */
  24443. function trim(string, chars, guard) {
  24444. string = toString(string);
  24445. if (string && (guard || chars === undefined)) {
  24446. return string.replace(reTrim, '');
  24447. }
  24448. if (!string || !(chars = baseToString(chars))) {
  24449. return string;
  24450. }
  24451. var strSymbols = stringToArray(string),
  24452. chrSymbols = stringToArray(chars),
  24453. start = charsStartIndex(strSymbols, chrSymbols),
  24454. end = charsEndIndex(strSymbols, chrSymbols) + 1;
  24455. return castSlice(strSymbols, start, end).join('');
  24456. }
  24457. /**
  24458. * Removes trailing whitespace or specified characters from `string`.
  24459. *
  24460. * @static
  24461. * @memberOf _
  24462. * @since 4.0.0
  24463. * @category String
  24464. * @param {string} [string=''] The string to trim.
  24465. * @param {string} [chars=whitespace] The characters to trim.
  24466. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24467. * @returns {string} Returns the trimmed string.
  24468. * @example
  24469. *
  24470. * _.trimEnd(' abc ');
  24471. * // => ' abc'
  24472. *
  24473. * _.trimEnd('-_-abc-_-', '_-');
  24474. * // => '-_-abc'
  24475. */
  24476. function trimEnd(string, chars, guard) {
  24477. string = toString(string);
  24478. if (string && (guard || chars === undefined)) {
  24479. return string.replace(reTrimEnd, '');
  24480. }
  24481. if (!string || !(chars = baseToString(chars))) {
  24482. return string;
  24483. }
  24484. var strSymbols = stringToArray(string),
  24485. end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
  24486. return castSlice(strSymbols, 0, end).join('');
  24487. }
  24488. /**
  24489. * Removes leading whitespace or specified characters from `string`.
  24490. *
  24491. * @static
  24492. * @memberOf _
  24493. * @since 4.0.0
  24494. * @category String
  24495. * @param {string} [string=''] The string to trim.
  24496. * @param {string} [chars=whitespace] The characters to trim.
  24497. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24498. * @returns {string} Returns the trimmed string.
  24499. * @example
  24500. *
  24501. * _.trimStart(' abc ');
  24502. * // => 'abc '
  24503. *
  24504. * _.trimStart('-_-abc-_-', '_-');
  24505. * // => 'abc-_-'
  24506. */
  24507. function trimStart(string, chars, guard) {
  24508. string = toString(string);
  24509. if (string && (guard || chars === undefined)) {
  24510. return string.replace(reTrimStart, '');
  24511. }
  24512. if (!string || !(chars = baseToString(chars))) {
  24513. return string;
  24514. }
  24515. var strSymbols = stringToArray(string),
  24516. start = charsStartIndex(strSymbols, stringToArray(chars));
  24517. return castSlice(strSymbols, start).join('');
  24518. }
  24519. /**
  24520. * Truncates `string` if it's longer than the given maximum string length.
  24521. * The last characters of the truncated string are replaced with the omission
  24522. * string which defaults to "...".
  24523. *
  24524. * @static
  24525. * @memberOf _
  24526. * @since 4.0.0
  24527. * @category String
  24528. * @param {string} [string=''] The string to truncate.
  24529. * @param {Object} [options={}] The options object.
  24530. * @param {number} [options.length=30] The maximum string length.
  24531. * @param {string} [options.omission='...'] The string to indicate text is omitted.
  24532. * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
  24533. * @returns {string} Returns the truncated string.
  24534. * @example
  24535. *
  24536. * _.truncate('hi-diddly-ho there, neighborino');
  24537. * // => 'hi-diddly-ho there, neighbo...'
  24538. *
  24539. * _.truncate('hi-diddly-ho there, neighborino', {
  24540. * 'length': 24,
  24541. * 'separator': ' '
  24542. * });
  24543. * // => 'hi-diddly-ho there,...'
  24544. *
  24545. * _.truncate('hi-diddly-ho there, neighborino', {
  24546. * 'length': 24,
  24547. * 'separator': /,? +/
  24548. * });
  24549. * // => 'hi-diddly-ho there...'
  24550. *
  24551. * _.truncate('hi-diddly-ho there, neighborino', {
  24552. * 'omission': ' [...]'
  24553. * });
  24554. * // => 'hi-diddly-ho there, neig [...]'
  24555. */
  24556. function truncate(string, options) {
  24557. var length = DEFAULT_TRUNC_LENGTH,
  24558. omission = DEFAULT_TRUNC_OMISSION;
  24559. if (isObject(options)) {
  24560. var separator = 'separator' in options ? options.separator : separator;
  24561. length = 'length' in options ? toInteger(options.length) : length;
  24562. omission = 'omission' in options ? baseToString(options.omission) : omission;
  24563. }
  24564. string = toString(string);
  24565. var strLength = string.length;
  24566. if (hasUnicode(string)) {
  24567. var strSymbols = stringToArray(string);
  24568. strLength = strSymbols.length;
  24569. }
  24570. if (length >= strLength) {
  24571. return string;
  24572. }
  24573. var end = length - stringSize(omission);
  24574. if (end < 1) {
  24575. return omission;
  24576. }
  24577. var result = strSymbols
  24578. ? castSlice(strSymbols, 0, end).join('')
  24579. : string.slice(0, end);
  24580. if (separator === undefined) {
  24581. return result + omission;
  24582. }
  24583. if (strSymbols) {
  24584. end += (result.length - end);
  24585. }
  24586. if (isRegExp(separator)) {
  24587. if (string.slice(end).search(separator)) {
  24588. var match,
  24589. substring = result;
  24590. if (!separator.global) {
  24591. separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
  24592. }
  24593. separator.lastIndex = 0;
  24594. while ((match = separator.exec(substring))) {
  24595. var newEnd = match.index;
  24596. }
  24597. result = result.slice(0, newEnd === undefined ? end : newEnd);
  24598. }
  24599. } else if (string.indexOf(baseToString(separator), end) != end) {
  24600. var index = result.lastIndexOf(separator);
  24601. if (index > -1) {
  24602. result = result.slice(0, index);
  24603. }
  24604. }
  24605. return result + omission;
  24606. }
  24607. /**
  24608. * The inverse of `_.escape`; this method converts the HTML entities
  24609. * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
  24610. * their corresponding characters.
  24611. *
  24612. * **Note:** No other HTML entities are unescaped. To unescape additional
  24613. * HTML entities use a third-party library like [_he_](https://mths.be/he).
  24614. *
  24615. * @static
  24616. * @memberOf _
  24617. * @since 0.6.0
  24618. * @category String
  24619. * @param {string} [string=''] The string to unescape.
  24620. * @returns {string} Returns the unescaped string.
  24621. * @example
  24622. *
  24623. * _.unescape('fred, barney, &amp; pebbles');
  24624. * // => 'fred, barney, & pebbles'
  24625. */
  24626. function unescape(string) {
  24627. string = toString(string);
  24628. return (string && reHasEscapedHtml.test(string))
  24629. ? string.replace(reEscapedHtml, unescapeHtmlChar)
  24630. : string;
  24631. }
  24632. /**
  24633. * Converts `string`, as space separated words, to upper case.
  24634. *
  24635. * @static
  24636. * @memberOf _
  24637. * @since 4.0.0
  24638. * @category String
  24639. * @param {string} [string=''] The string to convert.
  24640. * @returns {string} Returns the upper cased string.
  24641. * @example
  24642. *
  24643. * _.upperCase('--foo-bar');
  24644. * // => 'FOO BAR'
  24645. *
  24646. * _.upperCase('fooBar');
  24647. * // => 'FOO BAR'
  24648. *
  24649. * _.upperCase('__foo_bar__');
  24650. * // => 'FOO BAR'
  24651. */
  24652. var upperCase = createCompounder(function(result, word, index) {
  24653. return result + (index ? ' ' : '') + word.toUpperCase();
  24654. });
  24655. /**
  24656. * Converts the first character of `string` to upper case.
  24657. *
  24658. * @static
  24659. * @memberOf _
  24660. * @since 4.0.0
  24661. * @category String
  24662. * @param {string} [string=''] The string to convert.
  24663. * @returns {string} Returns the converted string.
  24664. * @example
  24665. *
  24666. * _.upperFirst('fred');
  24667. * // => 'Fred'
  24668. *
  24669. * _.upperFirst('FRED');
  24670. * // => 'FRED'
  24671. */
  24672. var upperFirst = createCaseFirst('toUpperCase');
  24673. /**
  24674. * Splits `string` into an array of its words.
  24675. *
  24676. * @static
  24677. * @memberOf _
  24678. * @since 3.0.0
  24679. * @category String
  24680. * @param {string} [string=''] The string to inspect.
  24681. * @param {RegExp|string} [pattern] The pattern to match words.
  24682. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  24683. * @returns {Array} Returns the words of `string`.
  24684. * @example
  24685. *
  24686. * _.words('fred, barney, & pebbles');
  24687. * // => ['fred', 'barney', 'pebbles']
  24688. *
  24689. * _.words('fred, barney, & pebbles', /[^, ]+/g);
  24690. * // => ['fred', 'barney', '&', 'pebbles']
  24691. */
  24692. function words(string, pattern, guard) {
  24693. string = toString(string);
  24694. pattern = guard ? undefined : pattern;
  24695. if (pattern === undefined) {
  24696. return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
  24697. }
  24698. return string.match(pattern) || [];
  24699. }
  24700. /*------------------------------------------------------------------------*/
  24701. /**
  24702. * Attempts to invoke `func`, returning either the result or the caught error
  24703. * object. Any additional arguments are provided to `func` when it's invoked.
  24704. *
  24705. * @static
  24706. * @memberOf _
  24707. * @since 3.0.0
  24708. * @category Util
  24709. * @param {Function} func The function to attempt.
  24710. * @param {...*} [args] The arguments to invoke `func` with.
  24711. * @returns {*} Returns the `func` result or error object.
  24712. * @example
  24713. *
  24714. * // Avoid throwing errors for invalid selectors.
  24715. * var elements = _.attempt(function(selector) {
  24716. * return document.querySelectorAll(selector);
  24717. * }, '>_>');
  24718. *
  24719. * if (_.isError(elements)) {
  24720. * elements = [];
  24721. * }
  24722. */
  24723. var attempt = baseRest(function(func, args) {
  24724. try {
  24725. return apply(func, undefined, args);
  24726. } catch (e) {
  24727. return isError(e) ? e : new Error(e);
  24728. }
  24729. });
  24730. /**
  24731. * Binds methods of an object to the object itself, overwriting the existing
  24732. * method.
  24733. *
  24734. * **Note:** This method doesn't set the "length" property of bound functions.
  24735. *
  24736. * @static
  24737. * @since 0.1.0
  24738. * @memberOf _
  24739. * @category Util
  24740. * @param {Object} object The object to bind and assign the bound methods to.
  24741. * @param {...(string|string[])} methodNames The object method names to bind.
  24742. * @returns {Object} Returns `object`.
  24743. * @example
  24744. *
  24745. * var view = {
  24746. * 'label': 'docs',
  24747. * 'click': function() {
  24748. * console.log('clicked ' + this.label);
  24749. * }
  24750. * };
  24751. *
  24752. * _.bindAll(view, ['click']);
  24753. * jQuery(element).on('click', view.click);
  24754. * // => Logs 'clicked docs' when clicked.
  24755. */
  24756. var bindAll = flatRest(function(object, methodNames) {
  24757. arrayEach(methodNames, function(key) {
  24758. key = toKey(key);
  24759. baseAssignValue(object, key, bind(object[key], object));
  24760. });
  24761. return object;
  24762. });
  24763. /**
  24764. * Creates a function that iterates over `pairs` and invokes the corresponding
  24765. * function of the first predicate to return truthy. The predicate-function
  24766. * pairs are invoked with the `this` binding and arguments of the created
  24767. * function.
  24768. *
  24769. * @static
  24770. * @memberOf _
  24771. * @since 4.0.0
  24772. * @category Util
  24773. * @param {Array} pairs The predicate-function pairs.
  24774. * @returns {Function} Returns the new composite function.
  24775. * @example
  24776. *
  24777. * var func = _.cond([
  24778. * [_.matches({ 'a': 1 }), _.constant('matches A')],
  24779. * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
  24780. * [_.stubTrue, _.constant('no match')]
  24781. * ]);
  24782. *
  24783. * func({ 'a': 1, 'b': 2 });
  24784. * // => 'matches A'
  24785. *
  24786. * func({ 'a': 0, 'b': 1 });
  24787. * // => 'matches B'
  24788. *
  24789. * func({ 'a': '1', 'b': '2' });
  24790. * // => 'no match'
  24791. */
  24792. function cond(pairs) {
  24793. var length = pairs == null ? 0 : pairs.length,
  24794. toIteratee = getIteratee();
  24795. pairs = !length ? [] : arrayMap(pairs, function(pair) {
  24796. if (typeof pair[1] != 'function') {
  24797. throw new TypeError(FUNC_ERROR_TEXT);
  24798. }
  24799. return [toIteratee(pair[0]), pair[1]];
  24800. });
  24801. return baseRest(function(args) {
  24802. var index = -1;
  24803. while (++index < length) {
  24804. var pair = pairs[index];
  24805. if (apply(pair[0], this, args)) {
  24806. return apply(pair[1], this, args);
  24807. }
  24808. }
  24809. });
  24810. }
  24811. /**
  24812. * Creates a function that invokes the predicate properties of `source` with
  24813. * the corresponding property values of a given object, returning `true` if
  24814. * all predicates return truthy, else `false`.
  24815. *
  24816. * **Note:** The created function is equivalent to `_.conformsTo` with
  24817. * `source` partially applied.
  24818. *
  24819. * @static
  24820. * @memberOf _
  24821. * @since 4.0.0
  24822. * @category Util
  24823. * @param {Object} source The object of property predicates to conform to.
  24824. * @returns {Function} Returns the new spec function.
  24825. * @example
  24826. *
  24827. * var objects = [
  24828. * { 'a': 2, 'b': 1 },
  24829. * { 'a': 1, 'b': 2 }
  24830. * ];
  24831. *
  24832. * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
  24833. * // => [{ 'a': 1, 'b': 2 }]
  24834. */
  24835. function conforms(source) {
  24836. return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
  24837. }
  24838. /**
  24839. * Creates a function that returns `value`.
  24840. *
  24841. * @static
  24842. * @memberOf _
  24843. * @since 2.4.0
  24844. * @category Util
  24845. * @param {*} value The value to return from the new function.
  24846. * @returns {Function} Returns the new constant function.
  24847. * @example
  24848. *
  24849. * var objects = _.times(2, _.constant({ 'a': 1 }));
  24850. *
  24851. * console.log(objects);
  24852. * // => [{ 'a': 1 }, { 'a': 1 }]
  24853. *
  24854. * console.log(objects[0] === objects[1]);
  24855. * // => true
  24856. */
  24857. function constant(value) {
  24858. return function() {
  24859. return value;
  24860. };
  24861. }
  24862. /**
  24863. * Checks `value` to determine whether a default value should be returned in
  24864. * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
  24865. * or `undefined`.
  24866. *
  24867. * @static
  24868. * @memberOf _
  24869. * @since 4.14.0
  24870. * @category Util
  24871. * @param {*} value The value to check.
  24872. * @param {*} defaultValue The default value.
  24873. * @returns {*} Returns the resolved value.
  24874. * @example
  24875. *
  24876. * _.defaultTo(1, 10);
  24877. * // => 1
  24878. *
  24879. * _.defaultTo(undefined, 10);
  24880. * // => 10
  24881. */
  24882. function defaultTo(value, defaultValue) {
  24883. return (value == null || value !== value) ? defaultValue : value;
  24884. }
  24885. /**
  24886. * Creates a function that returns the result of invoking the given functions
  24887. * with the `this` binding of the created function, where each successive
  24888. * invocation is supplied the return value of the previous.
  24889. *
  24890. * @static
  24891. * @memberOf _
  24892. * @since 3.0.0
  24893. * @category Util
  24894. * @param {...(Function|Function[])} [funcs] The functions to invoke.
  24895. * @returns {Function} Returns the new composite function.
  24896. * @see _.flowRight
  24897. * @example
  24898. *
  24899. * function square(n) {
  24900. * return n * n;
  24901. * }
  24902. *
  24903. * var addSquare = _.flow([_.add, square]);
  24904. * addSquare(1, 2);
  24905. * // => 9
  24906. */
  24907. var flow = createFlow();
  24908. /**
  24909. * This method is like `_.flow` except that it creates a function that
  24910. * invokes the given functions from right to left.
  24911. *
  24912. * @static
  24913. * @since 3.0.0
  24914. * @memberOf _
  24915. * @category Util
  24916. * @param {...(Function|Function[])} [funcs] The functions to invoke.
  24917. * @returns {Function} Returns the new composite function.
  24918. * @see _.flow
  24919. * @example
  24920. *
  24921. * function square(n) {
  24922. * return n * n;
  24923. * }
  24924. *
  24925. * var addSquare = _.flowRight([square, _.add]);
  24926. * addSquare(1, 2);
  24927. * // => 9
  24928. */
  24929. var flowRight = createFlow(true);
  24930. /**
  24931. * This method returns the first argument it receives.
  24932. *
  24933. * @static
  24934. * @since 0.1.0
  24935. * @memberOf _
  24936. * @category Util
  24937. * @param {*} value Any value.
  24938. * @returns {*} Returns `value`.
  24939. * @example
  24940. *
  24941. * var object = { 'a': 1 };
  24942. *
  24943. * console.log(_.identity(object) === object);
  24944. * // => true
  24945. */
  24946. function identity(value) {
  24947. return value;
  24948. }
  24949. /**
  24950. * Creates a function that invokes `func` with the arguments of the created
  24951. * function. If `func` is a property name, the created function returns the
  24952. * property value for a given element. If `func` is an array or object, the
  24953. * created function returns `true` for elements that contain the equivalent
  24954. * source properties, otherwise it returns `false`.
  24955. *
  24956. * @static
  24957. * @since 4.0.0
  24958. * @memberOf _
  24959. * @category Util
  24960. * @param {*} [func=_.identity] The value to convert to a callback.
  24961. * @returns {Function} Returns the callback.
  24962. * @example
  24963. *
  24964. * var users = [
  24965. * { 'user': 'barney', 'age': 36, 'active': true },
  24966. * { 'user': 'fred', 'age': 40, 'active': false }
  24967. * ];
  24968. *
  24969. * // The `_.matches` iteratee shorthand.
  24970. * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
  24971. * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
  24972. *
  24973. * // The `_.matchesProperty` iteratee shorthand.
  24974. * _.filter(users, _.iteratee(['user', 'fred']));
  24975. * // => [{ 'user': 'fred', 'age': 40 }]
  24976. *
  24977. * // The `_.property` iteratee shorthand.
  24978. * _.map(users, _.iteratee('user'));
  24979. * // => ['barney', 'fred']
  24980. *
  24981. * // Create custom iteratee shorthands.
  24982. * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
  24983. * return !_.isRegExp(func) ? iteratee(func) : function(string) {
  24984. * return func.test(string);
  24985. * };
  24986. * });
  24987. *
  24988. * _.filter(['abc', 'def'], /ef/);
  24989. * // => ['def']
  24990. */
  24991. function iteratee(func) {
  24992. return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
  24993. }
  24994. /**
  24995. * Creates a function that performs a partial deep comparison between a given
  24996. * object and `source`, returning `true` if the given object has equivalent
  24997. * property values, else `false`.
  24998. *
  24999. * **Note:** The created function is equivalent to `_.isMatch` with `source`
  25000. * partially applied.
  25001. *
  25002. * Partial comparisons will match empty array and empty object `source`
  25003. * values against any array or object value, respectively. See `_.isEqual`
  25004. * for a list of supported value comparisons.
  25005. *
  25006. * @static
  25007. * @memberOf _
  25008. * @since 3.0.0
  25009. * @category Util
  25010. * @param {Object} source The object of property values to match.
  25011. * @returns {Function} Returns the new spec function.
  25012. * @example
  25013. *
  25014. * var objects = [
  25015. * { 'a': 1, 'b': 2, 'c': 3 },
  25016. * { 'a': 4, 'b': 5, 'c': 6 }
  25017. * ];
  25018. *
  25019. * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
  25020. * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
  25021. */
  25022. function matches(source) {
  25023. return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
  25024. }
  25025. /**
  25026. * Creates a function that performs a partial deep comparison between the
  25027. * value at `path` of a given object to `srcValue`, returning `true` if the
  25028. * object value is equivalent, else `false`.
  25029. *
  25030. * **Note:** Partial comparisons will match empty array and empty object
  25031. * `srcValue` values against any array or object value, respectively. See
  25032. * `_.isEqual` for a list of supported value comparisons.
  25033. *
  25034. * @static
  25035. * @memberOf _
  25036. * @since 3.2.0
  25037. * @category Util
  25038. * @param {Array|string} path The path of the property to get.
  25039. * @param {*} srcValue The value to match.
  25040. * @returns {Function} Returns the new spec function.
  25041. * @example
  25042. *
  25043. * var objects = [
  25044. * { 'a': 1, 'b': 2, 'c': 3 },
  25045. * { 'a': 4, 'b': 5, 'c': 6 }
  25046. * ];
  25047. *
  25048. * _.find(objects, _.matchesProperty('a', 4));
  25049. * // => { 'a': 4, 'b': 5, 'c': 6 }
  25050. */
  25051. function matchesProperty(path, srcValue) {
  25052. return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
  25053. }
  25054. /**
  25055. * Creates a function that invokes the method at `path` of a given object.
  25056. * Any additional arguments are provided to the invoked method.
  25057. *
  25058. * @static
  25059. * @memberOf _
  25060. * @since 3.7.0
  25061. * @category Util
  25062. * @param {Array|string} path The path of the method to invoke.
  25063. * @param {...*} [args] The arguments to invoke the method with.
  25064. * @returns {Function} Returns the new invoker function.
  25065. * @example
  25066. *
  25067. * var objects = [
  25068. * { 'a': { 'b': _.constant(2) } },
  25069. * { 'a': { 'b': _.constant(1) } }
  25070. * ];
  25071. *
  25072. * _.map(objects, _.method('a.b'));
  25073. * // => [2, 1]
  25074. *
  25075. * _.map(objects, _.method(['a', 'b']));
  25076. * // => [2, 1]
  25077. */
  25078. var method = baseRest(function(path, args) {
  25079. return function(object) {
  25080. return baseInvoke(object, path, args);
  25081. };
  25082. });
  25083. /**
  25084. * The opposite of `_.method`; this method creates a function that invokes
  25085. * the method at a given path of `object`. Any additional arguments are
  25086. * provided to the invoked method.
  25087. *
  25088. * @static
  25089. * @memberOf _
  25090. * @since 3.7.0
  25091. * @category Util
  25092. * @param {Object} object The object to query.
  25093. * @param {...*} [args] The arguments to invoke the method with.
  25094. * @returns {Function} Returns the new invoker function.
  25095. * @example
  25096. *
  25097. * var array = _.times(3, _.constant),
  25098. * object = { 'a': array, 'b': array, 'c': array };
  25099. *
  25100. * _.map(['a[2]', 'c[0]'], _.methodOf(object));
  25101. * // => [2, 0]
  25102. *
  25103. * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
  25104. * // => [2, 0]
  25105. */
  25106. var methodOf = baseRest(function(object, args) {
  25107. return function(path) {
  25108. return baseInvoke(object, path, args);
  25109. };
  25110. });
  25111. /**
  25112. * Adds all own enumerable string keyed function properties of a source
  25113. * object to the destination object. If `object` is a function, then methods
  25114. * are added to its prototype as well.
  25115. *
  25116. * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
  25117. * avoid conflicts caused by modifying the original.
  25118. *
  25119. * @static
  25120. * @since 0.1.0
  25121. * @memberOf _
  25122. * @category Util
  25123. * @param {Function|Object} [object=lodash] The destination object.
  25124. * @param {Object} source The object of functions to add.
  25125. * @param {Object} [options={}] The options object.
  25126. * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
  25127. * @returns {Function|Object} Returns `object`.
  25128. * @example
  25129. *
  25130. * function vowels(string) {
  25131. * return _.filter(string, function(v) {
  25132. * return /[aeiou]/i.test(v);
  25133. * });
  25134. * }
  25135. *
  25136. * _.mixin({ 'vowels': vowels });
  25137. * _.vowels('fred');
  25138. * // => ['e']
  25139. *
  25140. * _('fred').vowels().value();
  25141. * // => ['e']
  25142. *
  25143. * _.mixin({ 'vowels': vowels }, { 'chain': false });
  25144. * _('fred').vowels();
  25145. * // => ['e']
  25146. */
  25147. function mixin(object, source, options) {
  25148. var props = keys(source),
  25149. methodNames = baseFunctions(source, props);
  25150. if (options == null &&
  25151. !(isObject(source) && (methodNames.length || !props.length))) {
  25152. options = source;
  25153. source = object;
  25154. object = this;
  25155. methodNames = baseFunctions(source, keys(source));
  25156. }
  25157. var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
  25158. isFunc = isFunction(object);
  25159. arrayEach(methodNames, function(methodName) {
  25160. var func = source[methodName];
  25161. object[methodName] = func;
  25162. if (isFunc) {
  25163. object.prototype[methodName] = function() {
  25164. var chainAll = this.__chain__;
  25165. if (chain || chainAll) {
  25166. var result = object(this.__wrapped__),
  25167. actions = result.__actions__ = copyArray(this.__actions__);
  25168. actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
  25169. result.__chain__ = chainAll;
  25170. return result;
  25171. }
  25172. return func.apply(object, arrayPush([this.value()], arguments));
  25173. };
  25174. }
  25175. });
  25176. return object;
  25177. }
  25178. /**
  25179. * Reverts the `_` variable to its previous value and returns a reference to
  25180. * the `lodash` function.
  25181. *
  25182. * @static
  25183. * @since 0.1.0
  25184. * @memberOf _
  25185. * @category Util
  25186. * @returns {Function} Returns the `lodash` function.
  25187. * @example
  25188. *
  25189. * var lodash = _.noConflict();
  25190. */
  25191. function noConflict() {
  25192. if (root._ === this) {
  25193. root._ = oldDash;
  25194. }
  25195. return this;
  25196. }
  25197. /**
  25198. * This method returns `undefined`.
  25199. *
  25200. * @static
  25201. * @memberOf _
  25202. * @since 2.3.0
  25203. * @category Util
  25204. * @example
  25205. *
  25206. * _.times(2, _.noop);
  25207. * // => [undefined, undefined]
  25208. */
  25209. function noop() {
  25210. // No operation performed.
  25211. }
  25212. /**
  25213. * Creates a function that gets the argument at index `n`. If `n` is negative,
  25214. * the nth argument from the end is returned.
  25215. *
  25216. * @static
  25217. * @memberOf _
  25218. * @since 4.0.0
  25219. * @category Util
  25220. * @param {number} [n=0] The index of the argument to return.
  25221. * @returns {Function} Returns the new pass-thru function.
  25222. * @example
  25223. *
  25224. * var func = _.nthArg(1);
  25225. * func('a', 'b', 'c', 'd');
  25226. * // => 'b'
  25227. *
  25228. * var func = _.nthArg(-2);
  25229. * func('a', 'b', 'c', 'd');
  25230. * // => 'c'
  25231. */
  25232. function nthArg(n) {
  25233. n = toInteger(n);
  25234. return baseRest(function(args) {
  25235. return baseNth(args, n);
  25236. });
  25237. }
  25238. /**
  25239. * Creates a function that invokes `iteratees` with the arguments it receives
  25240. * and returns their results.
  25241. *
  25242. * @static
  25243. * @memberOf _
  25244. * @since 4.0.0
  25245. * @category Util
  25246. * @param {...(Function|Function[])} [iteratees=[_.identity]]
  25247. * The iteratees to invoke.
  25248. * @returns {Function} Returns the new function.
  25249. * @example
  25250. *
  25251. * var func = _.over([Math.max, Math.min]);
  25252. *
  25253. * func(1, 2, 3, 4);
  25254. * // => [4, 1]
  25255. */
  25256. var over = createOver(arrayMap);
  25257. /**
  25258. * Creates a function that checks if **all** of the `predicates` return
  25259. * truthy when invoked with the arguments it receives.
  25260. *
  25261. * @static
  25262. * @memberOf _
  25263. * @since 4.0.0
  25264. * @category Util
  25265. * @param {...(Function|Function[])} [predicates=[_.identity]]
  25266. * The predicates to check.
  25267. * @returns {Function} Returns the new function.
  25268. * @example
  25269. *
  25270. * var func = _.overEvery([Boolean, isFinite]);
  25271. *
  25272. * func('1');
  25273. * // => true
  25274. *
  25275. * func(null);
  25276. * // => false
  25277. *
  25278. * func(NaN);
  25279. * // => false
  25280. */
  25281. var overEvery = createOver(arrayEvery);
  25282. /**
  25283. * Creates a function that checks if **any** of the `predicates` return
  25284. * truthy when invoked with the arguments it receives.
  25285. *
  25286. * @static
  25287. * @memberOf _
  25288. * @since 4.0.0
  25289. * @category Util
  25290. * @param {...(Function|Function[])} [predicates=[_.identity]]
  25291. * The predicates to check.
  25292. * @returns {Function} Returns the new function.
  25293. * @example
  25294. *
  25295. * var func = _.overSome([Boolean, isFinite]);
  25296. *
  25297. * func('1');
  25298. * // => true
  25299. *
  25300. * func(null);
  25301. * // => true
  25302. *
  25303. * func(NaN);
  25304. * // => false
  25305. */
  25306. var overSome = createOver(arraySome);
  25307. /**
  25308. * Creates a function that returns the value at `path` of a given object.
  25309. *
  25310. * @static
  25311. * @memberOf _
  25312. * @since 2.4.0
  25313. * @category Util
  25314. * @param {Array|string} path The path of the property to get.
  25315. * @returns {Function} Returns the new accessor function.
  25316. * @example
  25317. *
  25318. * var objects = [
  25319. * { 'a': { 'b': 2 } },
  25320. * { 'a': { 'b': 1 } }
  25321. * ];
  25322. *
  25323. * _.map(objects, _.property('a.b'));
  25324. * // => [2, 1]
  25325. *
  25326. * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
  25327. * // => [1, 2]
  25328. */
  25329. function property(path) {
  25330. return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
  25331. }
  25332. /**
  25333. * The opposite of `_.property`; this method creates a function that returns
  25334. * the value at a given path of `object`.
  25335. *
  25336. * @static
  25337. * @memberOf _
  25338. * @since 3.0.0
  25339. * @category Util
  25340. * @param {Object} object The object to query.
  25341. * @returns {Function} Returns the new accessor function.
  25342. * @example
  25343. *
  25344. * var array = [0, 1, 2],
  25345. * object = { 'a': array, 'b': array, 'c': array };
  25346. *
  25347. * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
  25348. * // => [2, 0]
  25349. *
  25350. * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
  25351. * // => [2, 0]
  25352. */
  25353. function propertyOf(object) {
  25354. return function(path) {
  25355. return object == null ? undefined : baseGet(object, path);
  25356. };
  25357. }
  25358. /**
  25359. * Creates an array of numbers (positive and/or negative) progressing from
  25360. * `start` up to, but not including, `end`. A step of `-1` is used if a negative
  25361. * `start` is specified without an `end` or `step`. If `end` is not specified,
  25362. * it's set to `start` with `start` then set to `0`.
  25363. *
  25364. * **Note:** JavaScript follows the IEEE-754 standard for resolving
  25365. * floating-point values which can produce unexpected results.
  25366. *
  25367. * @static
  25368. * @since 0.1.0
  25369. * @memberOf _
  25370. * @category Util
  25371. * @param {number} [start=0] The start of the range.
  25372. * @param {number} end The end of the range.
  25373. * @param {number} [step=1] The value to increment or decrement by.
  25374. * @returns {Array} Returns the range of numbers.
  25375. * @see _.inRange, _.rangeRight
  25376. * @example
  25377. *
  25378. * _.range(4);
  25379. * // => [0, 1, 2, 3]
  25380. *
  25381. * _.range(-4);
  25382. * // => [0, -1, -2, -3]
  25383. *
  25384. * _.range(1, 5);
  25385. * // => [1, 2, 3, 4]
  25386. *
  25387. * _.range(0, 20, 5);
  25388. * // => [0, 5, 10, 15]
  25389. *
  25390. * _.range(0, -4, -1);
  25391. * // => [0, -1, -2, -3]
  25392. *
  25393. * _.range(1, 4, 0);
  25394. * // => [1, 1, 1]
  25395. *
  25396. * _.range(0);
  25397. * // => []
  25398. */
  25399. var range = createRange();
  25400. /**
  25401. * This method is like `_.range` except that it populates values in
  25402. * descending order.
  25403. *
  25404. * @static
  25405. * @memberOf _
  25406. * @since 4.0.0
  25407. * @category Util
  25408. * @param {number} [start=0] The start of the range.
  25409. * @param {number} end The end of the range.
  25410. * @param {number} [step=1] The value to increment or decrement by.
  25411. * @returns {Array} Returns the range of numbers.
  25412. * @see _.inRange, _.range
  25413. * @example
  25414. *
  25415. * _.rangeRight(4);
  25416. * // => [3, 2, 1, 0]
  25417. *
  25418. * _.rangeRight(-4);
  25419. * // => [-3, -2, -1, 0]
  25420. *
  25421. * _.rangeRight(1, 5);
  25422. * // => [4, 3, 2, 1]
  25423. *
  25424. * _.rangeRight(0, 20, 5);
  25425. * // => [15, 10, 5, 0]
  25426. *
  25427. * _.rangeRight(0, -4, -1);
  25428. * // => [-3, -2, -1, 0]
  25429. *
  25430. * _.rangeRight(1, 4, 0);
  25431. * // => [1, 1, 1]
  25432. *
  25433. * _.rangeRight(0);
  25434. * // => []
  25435. */
  25436. var rangeRight = createRange(true);
  25437. /**
  25438. * This method returns a new empty array.
  25439. *
  25440. * @static
  25441. * @memberOf _
  25442. * @since 4.13.0
  25443. * @category Util
  25444. * @returns {Array} Returns the new empty array.
  25445. * @example
  25446. *
  25447. * var arrays = _.times(2, _.stubArray);
  25448. *
  25449. * console.log(arrays);
  25450. * // => [[], []]
  25451. *
  25452. * console.log(arrays[0] === arrays[1]);
  25453. * // => false
  25454. */
  25455. function stubArray() {
  25456. return [];
  25457. }
  25458. /**
  25459. * This method returns `false`.
  25460. *
  25461. * @static
  25462. * @memberOf _
  25463. * @since 4.13.0
  25464. * @category Util
  25465. * @returns {boolean} Returns `false`.
  25466. * @example
  25467. *
  25468. * _.times(2, _.stubFalse);
  25469. * // => [false, false]
  25470. */
  25471. function stubFalse() {
  25472. return false;
  25473. }
  25474. /**
  25475. * This method returns a new empty object.
  25476. *
  25477. * @static
  25478. * @memberOf _
  25479. * @since 4.13.0
  25480. * @category Util
  25481. * @returns {Object} Returns the new empty object.
  25482. * @example
  25483. *
  25484. * var objects = _.times(2, _.stubObject);
  25485. *
  25486. * console.log(objects);
  25487. * // => [{}, {}]
  25488. *
  25489. * console.log(objects[0] === objects[1]);
  25490. * // => false
  25491. */
  25492. function stubObject() {
  25493. return {};
  25494. }
  25495. /**
  25496. * This method returns an empty string.
  25497. *
  25498. * @static
  25499. * @memberOf _
  25500. * @since 4.13.0
  25501. * @category Util
  25502. * @returns {string} Returns the empty string.
  25503. * @example
  25504. *
  25505. * _.times(2, _.stubString);
  25506. * // => ['', '']
  25507. */
  25508. function stubString() {
  25509. return '';
  25510. }
  25511. /**
  25512. * This method returns `true`.
  25513. *
  25514. * @static
  25515. * @memberOf _
  25516. * @since 4.13.0
  25517. * @category Util
  25518. * @returns {boolean} Returns `true`.
  25519. * @example
  25520. *
  25521. * _.times(2, _.stubTrue);
  25522. * // => [true, true]
  25523. */
  25524. function stubTrue() {
  25525. return true;
  25526. }
  25527. /**
  25528. * Invokes the iteratee `n` times, returning an array of the results of
  25529. * each invocation. The iteratee is invoked with one argument; (index).
  25530. *
  25531. * @static
  25532. * @since 0.1.0
  25533. * @memberOf _
  25534. * @category Util
  25535. * @param {number} n The number of times to invoke `iteratee`.
  25536. * @param {Function} [iteratee=_.identity] The function invoked per iteration.
  25537. * @returns {Array} Returns the array of results.
  25538. * @example
  25539. *
  25540. * _.times(3, String);
  25541. * // => ['0', '1', '2']
  25542. *
  25543. * _.times(4, _.constant(0));
  25544. * // => [0, 0, 0, 0]
  25545. */
  25546. function times(n, iteratee) {
  25547. n = toInteger(n);
  25548. if (n < 1 || n > MAX_SAFE_INTEGER) {
  25549. return [];
  25550. }
  25551. var index = MAX_ARRAY_LENGTH,
  25552. length = nativeMin(n, MAX_ARRAY_LENGTH);
  25553. iteratee = getIteratee(iteratee);
  25554. n -= MAX_ARRAY_LENGTH;
  25555. var result = baseTimes(length, iteratee);
  25556. while (++index < n) {
  25557. iteratee(index);
  25558. }
  25559. return result;
  25560. }
  25561. /**
  25562. * Converts `value` to a property path array.
  25563. *
  25564. * @static
  25565. * @memberOf _
  25566. * @since 4.0.0
  25567. * @category Util
  25568. * @param {*} value The value to convert.
  25569. * @returns {Array} Returns the new property path array.
  25570. * @example
  25571. *
  25572. * _.toPath('a.b.c');
  25573. * // => ['a', 'b', 'c']
  25574. *
  25575. * _.toPath('a[0].b.c');
  25576. * // => ['a', '0', 'b', 'c']
  25577. */
  25578. function toPath(value) {
  25579. if (isArray(value)) {
  25580. return arrayMap(value, toKey);
  25581. }
  25582. return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
  25583. }
  25584. /**
  25585. * Generates a unique ID. If `prefix` is given, the ID is appended to it.
  25586. *
  25587. * @static
  25588. * @since 0.1.0
  25589. * @memberOf _
  25590. * @category Util
  25591. * @param {string} [prefix=''] The value to prefix the ID with.
  25592. * @returns {string} Returns the unique ID.
  25593. * @example
  25594. *
  25595. * _.uniqueId('contact_');
  25596. * // => 'contact_104'
  25597. *
  25598. * _.uniqueId();
  25599. * // => '105'
  25600. */
  25601. function uniqueId(prefix) {
  25602. var id = ++idCounter;
  25603. return toString(prefix) + id;
  25604. }
  25605. /*------------------------------------------------------------------------*/
  25606. /**
  25607. * Adds two numbers.
  25608. *
  25609. * @static
  25610. * @memberOf _
  25611. * @since 3.4.0
  25612. * @category Math
  25613. * @param {number} augend The first number in an addition.
  25614. * @param {number} addend The second number in an addition.
  25615. * @returns {number} Returns the total.
  25616. * @example
  25617. *
  25618. * _.add(6, 4);
  25619. * // => 10
  25620. */
  25621. var add = createMathOperation(function(augend, addend) {
  25622. return augend + addend;
  25623. }, 0);
  25624. /**
  25625. * Computes `number` rounded up to `precision`.
  25626. *
  25627. * @static
  25628. * @memberOf _
  25629. * @since 3.10.0
  25630. * @category Math
  25631. * @param {number} number The number to round up.
  25632. * @param {number} [precision=0] The precision to round up to.
  25633. * @returns {number} Returns the rounded up number.
  25634. * @example
  25635. *
  25636. * _.ceil(4.006);
  25637. * // => 5
  25638. *
  25639. * _.ceil(6.004, 2);
  25640. * // => 6.01
  25641. *
  25642. * _.ceil(6040, -2);
  25643. * // => 6100
  25644. */
  25645. var ceil = createRound('ceil');
  25646. /**
  25647. * Divide two numbers.
  25648. *
  25649. * @static
  25650. * @memberOf _
  25651. * @since 4.7.0
  25652. * @category Math
  25653. * @param {number} dividend The first number in a division.
  25654. * @param {number} divisor The second number in a division.
  25655. * @returns {number} Returns the quotient.
  25656. * @example
  25657. *
  25658. * _.divide(6, 4);
  25659. * // => 1.5
  25660. */
  25661. var divide = createMathOperation(function(dividend, divisor) {
  25662. return dividend / divisor;
  25663. }, 1);
  25664. /**
  25665. * Computes `number` rounded down to `precision`.
  25666. *
  25667. * @static
  25668. * @memberOf _
  25669. * @since 3.10.0
  25670. * @category Math
  25671. * @param {number} number The number to round down.
  25672. * @param {number} [precision=0] The precision to round down to.
  25673. * @returns {number} Returns the rounded down number.
  25674. * @example
  25675. *
  25676. * _.floor(4.006);
  25677. * // => 4
  25678. *
  25679. * _.floor(0.046, 2);
  25680. * // => 0.04
  25681. *
  25682. * _.floor(4060, -2);
  25683. * // => 4000
  25684. */
  25685. var floor = createRound('floor');
  25686. /**
  25687. * Computes the maximum value of `array`. If `array` is empty or falsey,
  25688. * `undefined` is returned.
  25689. *
  25690. * @static
  25691. * @since 0.1.0
  25692. * @memberOf _
  25693. * @category Math
  25694. * @param {Array} array The array to iterate over.
  25695. * @returns {*} Returns the maximum value.
  25696. * @example
  25697. *
  25698. * _.max([4, 2, 8, 6]);
  25699. * // => 8
  25700. *
  25701. * _.max([]);
  25702. * // => undefined
  25703. */
  25704. function max(array) {
  25705. return (array && array.length)
  25706. ? baseExtremum(array, identity, baseGt)
  25707. : undefined;
  25708. }
  25709. /**
  25710. * This method is like `_.max` except that it accepts `iteratee` which is
  25711. * invoked for each element in `array` to generate the criterion by which
  25712. * the value is ranked. The iteratee is invoked with one argument: (value).
  25713. *
  25714. * @static
  25715. * @memberOf _
  25716. * @since 4.0.0
  25717. * @category Math
  25718. * @param {Array} array The array to iterate over.
  25719. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  25720. * @returns {*} Returns the maximum value.
  25721. * @example
  25722. *
  25723. * var objects = [{ 'n': 1 }, { 'n': 2 }];
  25724. *
  25725. * _.maxBy(objects, function(o) { return o.n; });
  25726. * // => { 'n': 2 }
  25727. *
  25728. * // The `_.property` iteratee shorthand.
  25729. * _.maxBy(objects, 'n');
  25730. * // => { 'n': 2 }
  25731. */
  25732. function maxBy(array, iteratee) {
  25733. return (array && array.length)
  25734. ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
  25735. : undefined;
  25736. }
  25737. /**
  25738. * Computes the mean of the values in `array`.
  25739. *
  25740. * @static
  25741. * @memberOf _
  25742. * @since 4.0.0
  25743. * @category Math
  25744. * @param {Array} array The array to iterate over.
  25745. * @returns {number} Returns the mean.
  25746. * @example
  25747. *
  25748. * _.mean([4, 2, 8, 6]);
  25749. * // => 5
  25750. */
  25751. function mean(array) {
  25752. return baseMean(array, identity);
  25753. }
  25754. /**
  25755. * This method is like `_.mean` except that it accepts `iteratee` which is
  25756. * invoked for each element in `array` to generate the value to be averaged.
  25757. * The iteratee is invoked with one argument: (value).
  25758. *
  25759. * @static
  25760. * @memberOf _
  25761. * @since 4.7.0
  25762. * @category Math
  25763. * @param {Array} array The array to iterate over.
  25764. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  25765. * @returns {number} Returns the mean.
  25766. * @example
  25767. *
  25768. * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
  25769. *
  25770. * _.meanBy(objects, function(o) { return o.n; });
  25771. * // => 5
  25772. *
  25773. * // The `_.property` iteratee shorthand.
  25774. * _.meanBy(objects, 'n');
  25775. * // => 5
  25776. */
  25777. function meanBy(array, iteratee) {
  25778. return baseMean(array, getIteratee(iteratee, 2));
  25779. }
  25780. /**
  25781. * Computes the minimum value of `array`. If `array` is empty or falsey,
  25782. * `undefined` is returned.
  25783. *
  25784. * @static
  25785. * @since 0.1.0
  25786. * @memberOf _
  25787. * @category Math
  25788. * @param {Array} array The array to iterate over.
  25789. * @returns {*} Returns the minimum value.
  25790. * @example
  25791. *
  25792. * _.min([4, 2, 8, 6]);
  25793. * // => 2
  25794. *
  25795. * _.min([]);
  25796. * // => undefined
  25797. */
  25798. function min(array) {
  25799. return (array && array.length)
  25800. ? baseExtremum(array, identity, baseLt)
  25801. : undefined;
  25802. }
  25803. /**
  25804. * This method is like `_.min` except that it accepts `iteratee` which is
  25805. * invoked for each element in `array` to generate the criterion by which
  25806. * the value is ranked. The iteratee is invoked with one argument: (value).
  25807. *
  25808. * @static
  25809. * @memberOf _
  25810. * @since 4.0.0
  25811. * @category Math
  25812. * @param {Array} array The array to iterate over.
  25813. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  25814. * @returns {*} Returns the minimum value.
  25815. * @example
  25816. *
  25817. * var objects = [{ 'n': 1 }, { 'n': 2 }];
  25818. *
  25819. * _.minBy(objects, function(o) { return o.n; });
  25820. * // => { 'n': 1 }
  25821. *
  25822. * // The `_.property` iteratee shorthand.
  25823. * _.minBy(objects, 'n');
  25824. * // => { 'n': 1 }
  25825. */
  25826. function minBy(array, iteratee) {
  25827. return (array && array.length)
  25828. ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
  25829. : undefined;
  25830. }
  25831. /**
  25832. * Multiply two numbers.
  25833. *
  25834. * @static
  25835. * @memberOf _
  25836. * @since 4.7.0
  25837. * @category Math
  25838. * @param {number} multiplier The first number in a multiplication.
  25839. * @param {number} multiplicand The second number in a multiplication.
  25840. * @returns {number} Returns the product.
  25841. * @example
  25842. *
  25843. * _.multiply(6, 4);
  25844. * // => 24
  25845. */
  25846. var multiply = createMathOperation(function(multiplier, multiplicand) {
  25847. return multiplier * multiplicand;
  25848. }, 1);
  25849. /**
  25850. * Computes `number` rounded to `precision`.
  25851. *
  25852. * @static
  25853. * @memberOf _
  25854. * @since 3.10.0
  25855. * @category Math
  25856. * @param {number} number The number to round.
  25857. * @param {number} [precision=0] The precision to round to.
  25858. * @returns {number} Returns the rounded number.
  25859. * @example
  25860. *
  25861. * _.round(4.006);
  25862. * // => 4
  25863. *
  25864. * _.round(4.006, 2);
  25865. * // => 4.01
  25866. *
  25867. * _.round(4060, -2);
  25868. * // => 4100
  25869. */
  25870. var round = createRound('round');
  25871. /**
  25872. * Subtract two numbers.
  25873. *
  25874. * @static
  25875. * @memberOf _
  25876. * @since 4.0.0
  25877. * @category Math
  25878. * @param {number} minuend The first number in a subtraction.
  25879. * @param {number} subtrahend The second number in a subtraction.
  25880. * @returns {number} Returns the difference.
  25881. * @example
  25882. *
  25883. * _.subtract(6, 4);
  25884. * // => 2
  25885. */
  25886. var subtract = createMathOperation(function(minuend, subtrahend) {
  25887. return minuend - subtrahend;
  25888. }, 0);
  25889. /**
  25890. * Computes the sum of the values in `array`.
  25891. *
  25892. * @static
  25893. * @memberOf _
  25894. * @since 3.4.0
  25895. * @category Math
  25896. * @param {Array} array The array to iterate over.
  25897. * @returns {number} Returns the sum.
  25898. * @example
  25899. *
  25900. * _.sum([4, 2, 8, 6]);
  25901. * // => 20
  25902. */
  25903. function sum(array) {
  25904. return (array && array.length)
  25905. ? baseSum(array, identity)
  25906. : 0;
  25907. }
  25908. /**
  25909. * This method is like `_.sum` except that it accepts `iteratee` which is
  25910. * invoked for each element in `array` to generate the value to be summed.
  25911. * The iteratee is invoked with one argument: (value).
  25912. *
  25913. * @static
  25914. * @memberOf _
  25915. * @since 4.0.0
  25916. * @category Math
  25917. * @param {Array} array The array to iterate over.
  25918. * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
  25919. * @returns {number} Returns the sum.
  25920. * @example
  25921. *
  25922. * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
  25923. *
  25924. * _.sumBy(objects, function(o) { return o.n; });
  25925. * // => 20
  25926. *
  25927. * // The `_.property` iteratee shorthand.
  25928. * _.sumBy(objects, 'n');
  25929. * // => 20
  25930. */
  25931. function sumBy(array, iteratee) {
  25932. return (array && array.length)
  25933. ? baseSum(array, getIteratee(iteratee, 2))
  25934. : 0;
  25935. }
  25936. /*------------------------------------------------------------------------*/
  25937. // Add methods that return wrapped values in chain sequences.
  25938. lodash.after = after;
  25939. lodash.ary = ary;
  25940. lodash.assign = assign;
  25941. lodash.assignIn = assignIn;
  25942. lodash.assignInWith = assignInWith;
  25943. lodash.assignWith = assignWith;
  25944. lodash.at = at;
  25945. lodash.before = before;
  25946. lodash.bind = bind;
  25947. lodash.bindAll = bindAll;
  25948. lodash.bindKey = bindKey;
  25949. lodash.castArray = castArray;
  25950. lodash.chain = chain;
  25951. lodash.chunk = chunk;
  25952. lodash.compact = compact;
  25953. lodash.concat = concat;
  25954. lodash.cond = cond;
  25955. lodash.conforms = conforms;
  25956. lodash.constant = constant;
  25957. lodash.countBy = countBy;
  25958. lodash.create = create;
  25959. lodash.curry = curry;
  25960. lodash.curryRight = curryRight;
  25961. lodash.debounce = debounce;
  25962. lodash.defaults = defaults;
  25963. lodash.defaultsDeep = defaultsDeep;
  25964. lodash.defer = defer;
  25965. lodash.delay = delay;
  25966. lodash.difference = difference;
  25967. lodash.differenceBy = differenceBy;
  25968. lodash.differenceWith = differenceWith;
  25969. lodash.drop = drop;
  25970. lodash.dropRight = dropRight;
  25971. lodash.dropRightWhile = dropRightWhile;
  25972. lodash.dropWhile = dropWhile;
  25973. lodash.fill = fill;
  25974. lodash.filter = filter;
  25975. lodash.flatMap = flatMap;
  25976. lodash.flatMapDeep = flatMapDeep;
  25977. lodash.flatMapDepth = flatMapDepth;
  25978. lodash.flatten = flatten;
  25979. lodash.flattenDeep = flattenDeep;
  25980. lodash.flattenDepth = flattenDepth;
  25981. lodash.flip = flip;
  25982. lodash.flow = flow;
  25983. lodash.flowRight = flowRight;
  25984. lodash.fromPairs = fromPairs;
  25985. lodash.functions = functions;
  25986. lodash.functionsIn = functionsIn;
  25987. lodash.groupBy = groupBy;
  25988. lodash.initial = initial;
  25989. lodash.intersection = intersection;
  25990. lodash.intersectionBy = intersectionBy;
  25991. lodash.intersectionWith = intersectionWith;
  25992. lodash.invert = invert;
  25993. lodash.invertBy = invertBy;
  25994. lodash.invokeMap = invokeMap;
  25995. lodash.iteratee = iteratee;
  25996. lodash.keyBy = keyBy;
  25997. lodash.keys = keys;
  25998. lodash.keysIn = keysIn;
  25999. lodash.map = map;
  26000. lodash.mapKeys = mapKeys;
  26001. lodash.mapValues = mapValues;
  26002. lodash.matches = matches;
  26003. lodash.matchesProperty = matchesProperty;
  26004. lodash.memoize = memoize;
  26005. lodash.merge = merge;
  26006. lodash.mergeWith = mergeWith;
  26007. lodash.method = method;
  26008. lodash.methodOf = methodOf;
  26009. lodash.mixin = mixin;
  26010. lodash.negate = negate;
  26011. lodash.nthArg = nthArg;
  26012. lodash.omit = omit;
  26013. lodash.omitBy = omitBy;
  26014. lodash.once = once;
  26015. lodash.orderBy = orderBy;
  26016. lodash.over = over;
  26017. lodash.overArgs = overArgs;
  26018. lodash.overEvery = overEvery;
  26019. lodash.overSome = overSome;
  26020. lodash.partial = partial;
  26021. lodash.partialRight = partialRight;
  26022. lodash.partition = partition;
  26023. lodash.pick = pick;
  26024. lodash.pickBy = pickBy;
  26025. lodash.property = property;
  26026. lodash.propertyOf = propertyOf;
  26027. lodash.pull = pull;
  26028. lodash.pullAll = pullAll;
  26029. lodash.pullAllBy = pullAllBy;
  26030. lodash.pullAllWith = pullAllWith;
  26031. lodash.pullAt = pullAt;
  26032. lodash.range = range;
  26033. lodash.rangeRight = rangeRight;
  26034. lodash.rearg = rearg;
  26035. lodash.reject = reject;
  26036. lodash.remove = remove;
  26037. lodash.rest = rest;
  26038. lodash.reverse = reverse;
  26039. lodash.sampleSize = sampleSize;
  26040. lodash.set = set;
  26041. lodash.setWith = setWith;
  26042. lodash.shuffle = shuffle;
  26043. lodash.slice = slice;
  26044. lodash.sortBy = sortBy;
  26045. lodash.sortedUniq = sortedUniq;
  26046. lodash.sortedUniqBy = sortedUniqBy;
  26047. lodash.split = split;
  26048. lodash.spread = spread;
  26049. lodash.tail = tail;
  26050. lodash.take = take;
  26051. lodash.takeRight = takeRight;
  26052. lodash.takeRightWhile = takeRightWhile;
  26053. lodash.takeWhile = takeWhile;
  26054. lodash.tap = tap;
  26055. lodash.throttle = throttle;
  26056. lodash.thru = thru;
  26057. lodash.toArray = toArray;
  26058. lodash.toPairs = toPairs;
  26059. lodash.toPairsIn = toPairsIn;
  26060. lodash.toPath = toPath;
  26061. lodash.toPlainObject = toPlainObject;
  26062. lodash.transform = transform;
  26063. lodash.unary = unary;
  26064. lodash.union = union;
  26065. lodash.unionBy = unionBy;
  26066. lodash.unionWith = unionWith;
  26067. lodash.uniq = uniq;
  26068. lodash.uniqBy = uniqBy;
  26069. lodash.uniqWith = uniqWith;
  26070. lodash.unset = unset;
  26071. lodash.unzip = unzip;
  26072. lodash.unzipWith = unzipWith;
  26073. lodash.update = update;
  26074. lodash.updateWith = updateWith;
  26075. lodash.values = values;
  26076. lodash.valuesIn = valuesIn;
  26077. lodash.without = without;
  26078. lodash.words = words;
  26079. lodash.wrap = wrap;
  26080. lodash.xor = xor;
  26081. lodash.xorBy = xorBy;
  26082. lodash.xorWith = xorWith;
  26083. lodash.zip = zip;
  26084. lodash.zipObject = zipObject;
  26085. lodash.zipObjectDeep = zipObjectDeep;
  26086. lodash.zipWith = zipWith;
  26087. // Add aliases.
  26088. lodash.entries = toPairs;
  26089. lodash.entriesIn = toPairsIn;
  26090. lodash.extend = assignIn;
  26091. lodash.extendWith = assignInWith;
  26092. // Add methods to `lodash.prototype`.
  26093. mixin(lodash, lodash);
  26094. /*------------------------------------------------------------------------*/
  26095. // Add methods that return unwrapped values in chain sequences.
  26096. lodash.add = add;
  26097. lodash.attempt = attempt;
  26098. lodash.camelCase = camelCase;
  26099. lodash.capitalize = capitalize;
  26100. lodash.ceil = ceil;
  26101. lodash.clamp = clamp;
  26102. lodash.clone = clone;
  26103. lodash.cloneDeep = cloneDeep;
  26104. lodash.cloneDeepWith = cloneDeepWith;
  26105. lodash.cloneWith = cloneWith;
  26106. lodash.conformsTo = conformsTo;
  26107. lodash.deburr = deburr;
  26108. lodash.defaultTo = defaultTo;
  26109. lodash.divide = divide;
  26110. lodash.endsWith = endsWith;
  26111. lodash.eq = eq;
  26112. lodash.escape = escape;
  26113. lodash.escapeRegExp = escapeRegExp;
  26114. lodash.every = every;
  26115. lodash.find = find;
  26116. lodash.findIndex = findIndex;
  26117. lodash.findKey = findKey;
  26118. lodash.findLast = findLast;
  26119. lodash.findLastIndex = findLastIndex;
  26120. lodash.findLastKey = findLastKey;
  26121. lodash.floor = floor;
  26122. lodash.forEach = forEach;
  26123. lodash.forEachRight = forEachRight;
  26124. lodash.forIn = forIn;
  26125. lodash.forInRight = forInRight;
  26126. lodash.forOwn = forOwn;
  26127. lodash.forOwnRight = forOwnRight;
  26128. lodash.get = get;
  26129. lodash.gt = gt;
  26130. lodash.gte = gte;
  26131. lodash.has = has;
  26132. lodash.hasIn = hasIn;
  26133. lodash.head = head;
  26134. lodash.identity = identity;
  26135. lodash.includes = includes;
  26136. lodash.indexOf = indexOf;
  26137. lodash.inRange = inRange;
  26138. lodash.invoke = invoke;
  26139. lodash.isArguments = isArguments;
  26140. lodash.isArray = isArray;
  26141. lodash.isArrayBuffer = isArrayBuffer;
  26142. lodash.isArrayLike = isArrayLike;
  26143. lodash.isArrayLikeObject = isArrayLikeObject;
  26144. lodash.isBoolean = isBoolean;
  26145. lodash.isBuffer = isBuffer;
  26146. lodash.isDate = isDate;
  26147. lodash.isElement = isElement;
  26148. lodash.isEmpty = isEmpty;
  26149. lodash.isEqual = isEqual;
  26150. lodash.isEqualWith = isEqualWith;
  26151. lodash.isError = isError;
  26152. lodash.isFinite = isFinite;
  26153. lodash.isFunction = isFunction;
  26154. lodash.isInteger = isInteger;
  26155. lodash.isLength = isLength;
  26156. lodash.isMap = isMap;
  26157. lodash.isMatch = isMatch;
  26158. lodash.isMatchWith = isMatchWith;
  26159. lodash.isNaN = isNaN;
  26160. lodash.isNative = isNative;
  26161. lodash.isNil = isNil;
  26162. lodash.isNull = isNull;
  26163. lodash.isNumber = isNumber;
  26164. lodash.isObject = isObject;
  26165. lodash.isObjectLike = isObjectLike;
  26166. lodash.isPlainObject = isPlainObject;
  26167. lodash.isRegExp = isRegExp;
  26168. lodash.isSafeInteger = isSafeInteger;
  26169. lodash.isSet = isSet;
  26170. lodash.isString = isString;
  26171. lodash.isSymbol = isSymbol;
  26172. lodash.isTypedArray = isTypedArray;
  26173. lodash.isUndefined = isUndefined;
  26174. lodash.isWeakMap = isWeakMap;
  26175. lodash.isWeakSet = isWeakSet;
  26176. lodash.join = join;
  26177. lodash.kebabCase = kebabCase;
  26178. lodash.last = last;
  26179. lodash.lastIndexOf = lastIndexOf;
  26180. lodash.lowerCase = lowerCase;
  26181. lodash.lowerFirst = lowerFirst;
  26182. lodash.lt = lt;
  26183. lodash.lte = lte;
  26184. lodash.max = max;
  26185. lodash.maxBy = maxBy;
  26186. lodash.mean = mean;
  26187. lodash.meanBy = meanBy;
  26188. lodash.min = min;
  26189. lodash.minBy = minBy;
  26190. lodash.stubArray = stubArray;
  26191. lodash.stubFalse = stubFalse;
  26192. lodash.stubObject = stubObject;
  26193. lodash.stubString = stubString;
  26194. lodash.stubTrue = stubTrue;
  26195. lodash.multiply = multiply;
  26196. lodash.nth = nth;
  26197. lodash.noConflict = noConflict;
  26198. lodash.noop = noop;
  26199. lodash.now = now;
  26200. lodash.pad = pad;
  26201. lodash.padEnd = padEnd;
  26202. lodash.padStart = padStart;
  26203. lodash.parseInt = parseInt;
  26204. lodash.random = random;
  26205. lodash.reduce = reduce;
  26206. lodash.reduceRight = reduceRight;
  26207. lodash.repeat = repeat;
  26208. lodash.replace = replace;
  26209. lodash.result = result;
  26210. lodash.round = round;
  26211. lodash.runInContext = runInContext;
  26212. lodash.sample = sample;
  26213. lodash.size = size;
  26214. lodash.snakeCase = snakeCase;
  26215. lodash.some = some;
  26216. lodash.sortedIndex = sortedIndex;
  26217. lodash.sortedIndexBy = sortedIndexBy;
  26218. lodash.sortedIndexOf = sortedIndexOf;
  26219. lodash.sortedLastIndex = sortedLastIndex;
  26220. lodash.sortedLastIndexBy = sortedLastIndexBy;
  26221. lodash.sortedLastIndexOf = sortedLastIndexOf;
  26222. lodash.startCase = startCase;
  26223. lodash.startsWith = startsWith;
  26224. lodash.subtract = subtract;
  26225. lodash.sum = sum;
  26226. lodash.sumBy = sumBy;
  26227. lodash.template = template;
  26228. lodash.times = times;
  26229. lodash.toFinite = toFinite;
  26230. lodash.toInteger = toInteger;
  26231. lodash.toLength = toLength;
  26232. lodash.toLower = toLower;
  26233. lodash.toNumber = toNumber;
  26234. lodash.toSafeInteger = toSafeInteger;
  26235. lodash.toString = toString;
  26236. lodash.toUpper = toUpper;
  26237. lodash.trim = trim;
  26238. lodash.trimEnd = trimEnd;
  26239. lodash.trimStart = trimStart;
  26240. lodash.truncate = truncate;
  26241. lodash.unescape = unescape;
  26242. lodash.uniqueId = uniqueId;
  26243. lodash.upperCase = upperCase;
  26244. lodash.upperFirst = upperFirst;
  26245. // Add aliases.
  26246. lodash.each = forEach;
  26247. lodash.eachRight = forEachRight;
  26248. lodash.first = head;
  26249. mixin(lodash, (function() {
  26250. var source = {};
  26251. baseForOwn(lodash, function(func, methodName) {
  26252. if (!hasOwnProperty.call(lodash.prototype, methodName)) {
  26253. source[methodName] = func;
  26254. }
  26255. });
  26256. return source;
  26257. }()), { 'chain': false });
  26258. /*------------------------------------------------------------------------*/
  26259. /**
  26260. * The semantic version number.
  26261. *
  26262. * @static
  26263. * @memberOf _
  26264. * @type {string}
  26265. */
  26266. lodash.VERSION = VERSION;
  26267. // Assign default placeholders.
  26268. arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
  26269. lodash[methodName].placeholder = lodash;
  26270. });
  26271. // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
  26272. arrayEach(['drop', 'take'], function(methodName, index) {
  26273. LazyWrapper.prototype[methodName] = function(n) {
  26274. n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
  26275. var result = (this.__filtered__ && !index)
  26276. ? new LazyWrapper(this)
  26277. : this.clone();
  26278. if (result.__filtered__) {
  26279. result.__takeCount__ = nativeMin(n, result.__takeCount__);
  26280. } else {
  26281. result.__views__.push({
  26282. 'size': nativeMin(n, MAX_ARRAY_LENGTH),
  26283. 'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
  26284. });
  26285. }
  26286. return result;
  26287. };
  26288. LazyWrapper.prototype[methodName + 'Right'] = function(n) {
  26289. return this.reverse()[methodName](n).reverse();
  26290. };
  26291. });
  26292. // Add `LazyWrapper` methods that accept an `iteratee` value.
  26293. arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
  26294. var type = index + 1,
  26295. isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
  26296. LazyWrapper.prototype[methodName] = function(iteratee) {
  26297. var result = this.clone();
  26298. result.__iteratees__.push({
  26299. 'iteratee': getIteratee(iteratee, 3),
  26300. 'type': type
  26301. });
  26302. result.__filtered__ = result.__filtered__ || isFilter;
  26303. return result;
  26304. };
  26305. });
  26306. // Add `LazyWrapper` methods for `_.head` and `_.last`.
  26307. arrayEach(['head', 'last'], function(methodName, index) {
  26308. var takeName = 'take' + (index ? 'Right' : '');
  26309. LazyWrapper.prototype[methodName] = function() {
  26310. return this[takeName](1).value()[0];
  26311. };
  26312. });
  26313. // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
  26314. arrayEach(['initial', 'tail'], function(methodName, index) {
  26315. var dropName = 'drop' + (index ? '' : 'Right');
  26316. LazyWrapper.prototype[methodName] = function() {
  26317. return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
  26318. };
  26319. });
  26320. LazyWrapper.prototype.compact = function() {
  26321. return this.filter(identity);
  26322. };
  26323. LazyWrapper.prototype.find = function(predicate) {
  26324. return this.filter(predicate).head();
  26325. };
  26326. LazyWrapper.prototype.findLast = function(predicate) {
  26327. return this.reverse().find(predicate);
  26328. };
  26329. LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
  26330. if (typeof path == 'function') {
  26331. return new LazyWrapper(this);
  26332. }
  26333. return this.map(function(value) {
  26334. return baseInvoke(value, path, args);
  26335. });
  26336. });
  26337. LazyWrapper.prototype.reject = function(predicate) {
  26338. return this.filter(negate(getIteratee(predicate)));
  26339. };
  26340. LazyWrapper.prototype.slice = function(start, end) {
  26341. start = toInteger(start);
  26342. var result = this;
  26343. if (result.__filtered__ && (start > 0 || end < 0)) {
  26344. return new LazyWrapper(result);
  26345. }
  26346. if (start < 0) {
  26347. result = result.takeRight(-start);
  26348. } else if (start) {
  26349. result = result.drop(start);
  26350. }
  26351. if (end !== undefined) {
  26352. end = toInteger(end);
  26353. result = end < 0 ? result.dropRight(-end) : result.take(end - start);
  26354. }
  26355. return result;
  26356. };
  26357. LazyWrapper.prototype.takeRightWhile = function(predicate) {
  26358. return this.reverse().takeWhile(predicate).reverse();
  26359. };
  26360. LazyWrapper.prototype.toArray = function() {
  26361. return this.take(MAX_ARRAY_LENGTH);
  26362. };
  26363. // Add `LazyWrapper` methods to `lodash.prototype`.
  26364. baseForOwn(LazyWrapper.prototype, function(func, methodName) {
  26365. var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
  26366. isTaker = /^(?:head|last)$/.test(methodName),
  26367. lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
  26368. retUnwrapped = isTaker || /^find/.test(methodName);
  26369. if (!lodashFunc) {
  26370. return;
  26371. }
  26372. lodash.prototype[methodName] = function() {
  26373. var value = this.__wrapped__,
  26374. args = isTaker ? [1] : arguments,
  26375. isLazy = value instanceof LazyWrapper,
  26376. iteratee = args[0],
  26377. useLazy = isLazy || isArray(value);
  26378. var interceptor = function(value) {
  26379. var result = lodashFunc.apply(lodash, arrayPush([value], args));
  26380. return (isTaker && chainAll) ? result[0] : result;
  26381. };
  26382. if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
  26383. // Avoid lazy use if the iteratee has a "length" value other than `1`.
  26384. isLazy = useLazy = false;
  26385. }
  26386. var chainAll = this.__chain__,
  26387. isHybrid = !!this.__actions__.length,
  26388. isUnwrapped = retUnwrapped && !chainAll,
  26389. onlyLazy = isLazy && !isHybrid;
  26390. if (!retUnwrapped && useLazy) {
  26391. value = onlyLazy ? value : new LazyWrapper(this);
  26392. var result = func.apply(value, args);
  26393. result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
  26394. return new LodashWrapper(result, chainAll);
  26395. }
  26396. if (isUnwrapped && onlyLazy) {
  26397. return func.apply(this, args);
  26398. }
  26399. result = this.thru(interceptor);
  26400. return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
  26401. };
  26402. });
  26403. // Add `Array` methods to `lodash.prototype`.
  26404. arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
  26405. var func = arrayProto[methodName],
  26406. chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
  26407. retUnwrapped = /^(?:pop|shift)$/.test(methodName);
  26408. lodash.prototype[methodName] = function() {
  26409. var args = arguments;
  26410. if (retUnwrapped && !this.__chain__) {
  26411. var value = this.value();
  26412. return func.apply(isArray(value) ? value : [], args);
  26413. }
  26414. return this[chainName](function(value) {
  26415. return func.apply(isArray(value) ? value : [], args);
  26416. });
  26417. };
  26418. });
  26419. // Map minified method names to their real names.
  26420. baseForOwn(LazyWrapper.prototype, function(func, methodName) {
  26421. var lodashFunc = lodash[methodName];
  26422. if (lodashFunc) {
  26423. var key = (lodashFunc.name + ''),
  26424. names = realNames[key] || (realNames[key] = []);
  26425. names.push({ 'name': methodName, 'func': lodashFunc });
  26426. }
  26427. });
  26428. realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
  26429. 'name': 'wrapper',
  26430. 'func': undefined
  26431. }];
  26432. // Add methods to `LazyWrapper`.
  26433. LazyWrapper.prototype.clone = lazyClone;
  26434. LazyWrapper.prototype.reverse = lazyReverse;
  26435. LazyWrapper.prototype.value = lazyValue;
  26436. // Add chain sequence methods to the `lodash` wrapper.
  26437. lodash.prototype.at = wrapperAt;
  26438. lodash.prototype.chain = wrapperChain;
  26439. lodash.prototype.commit = wrapperCommit;
  26440. lodash.prototype.next = wrapperNext;
  26441. lodash.prototype.plant = wrapperPlant;
  26442. lodash.prototype.reverse = wrapperReverse;
  26443. lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
  26444. // Add lazy aliases.
  26445. lodash.prototype.first = lodash.prototype.head;
  26446. if (symIterator) {
  26447. lodash.prototype[symIterator] = wrapperToIterator;
  26448. }
  26449. return lodash;
  26450. });
  26451. /*--------------------------------------------------------------------------*/
  26452. // Export lodash.
  26453. var _ = runInContext();
  26454. // Some AMD build optimizers, like r.js, check for condition patterns like:
  26455. if (true) {
  26456. // Expose Lodash on the global object to prevent errors when Lodash is
  26457. // loaded by a script tag in the presence of an AMD loader.
  26458. // See http://requirejs.org/docs/errors.html#mismatch for more details.
  26459. // Use `_.noConflict` to remove Lodash from the global object.
  26460. root._ = _;
  26461. // Define as an anonymous module so, through path mapping, it can be
  26462. // referenced as the "underscore" module.
  26463. !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {
  26464. return _;
  26465. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  26466. }
  26467. // Check for `exports` after `define` in case a build optimizer adds it.
  26468. else if (freeModule) {
  26469. // Export for Node.js.
  26470. (freeModule.exports = _)._ = _;
  26471. // Export for CommonJS support.
  26472. freeExports._ = _;
  26473. }
  26474. else {
  26475. // Export to the global object.
  26476. root._ = _;
  26477. }
  26478. }.call(this));
  26479. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(8)(module)))
  26480. /***/ }),
  26481. /* 8 */
  26482. /***/ (function(module, exports) {
  26483. module.exports = function(module) {
  26484. if(!module.webpackPolyfill) {
  26485. module.deprecate = function() {};
  26486. module.paths = [];
  26487. // module.parent = undefined by default
  26488. module.children = [];
  26489. module.webpackPolyfill = 1;
  26490. }
  26491. return module;
  26492. }
  26493. /***/ }),
  26494. /* 9 */
  26495. /***/ (function(module, exports, __webpack_require__) {
  26496. /* jslint node: true */
  26497. 'use strict';
  26498. var _ = __webpack_require__(7);
  26499. _.noConflict();
  26500. function typeName(bold, italics) {
  26501. var type = 'normal';
  26502. if (bold && italics) {
  26503. type = 'bolditalics';
  26504. } else if (bold) {
  26505. type = 'bold';
  26506. } else if (italics) {
  26507. type = 'italics';
  26508. }
  26509. return type;
  26510. }
  26511. function FontProvider(fontDescriptors, pdfKitDoc) {
  26512. this.fonts = {};
  26513. this.pdfKitDoc = pdfKitDoc;
  26514. this.fontCache = {};
  26515. for (var font in fontDescriptors) {
  26516. if (fontDescriptors.hasOwnProperty(font)) {
  26517. var fontDef = fontDescriptors[font];
  26518. this.fonts[font] = {
  26519. normal: fontDef.normal,
  26520. bold: fontDef.bold,
  26521. italics: fontDef.italics,
  26522. bolditalics: fontDef.bolditalics
  26523. };
  26524. }
  26525. }
  26526. }
  26527. FontProvider.prototype.provideFont = function (familyName, bold, italics) {
  26528. var type = typeName(bold, italics);
  26529. if (!this.fonts[familyName] || !this.fonts[familyName][type]) {
  26530. throw new Error('Font \'' + familyName + '\' in style \'' + type + '\' is not defined in the font section of the document definition.');
  26531. }
  26532. this.fontCache[familyName] = this.fontCache[familyName] || {};
  26533. if (!this.fontCache[familyName][type]) {
  26534. var def = this.fonts[familyName][type];
  26535. if (!Array.isArray(def)) {
  26536. def = [def];
  26537. }
  26538. this.fontCache[familyName][type] = this.pdfKitDoc.font.apply(this.pdfKitDoc, def)._font;
  26539. }
  26540. return this.fontCache[familyName][type];
  26541. };
  26542. module.exports = FontProvider;
  26543. /***/ }),
  26544. /* 10 */
  26545. /***/ (function(module, exports, __webpack_require__) {
  26546. /* jslint node: true */
  26547. 'use strict';
  26548. var _ = __webpack_require__(7);
  26549. var TraversalTracker = __webpack_require__(11);
  26550. var DocPreprocessor = __webpack_require__(12);
  26551. var DocMeasure = __webpack_require__(14);
  26552. var DocumentContext = __webpack_require__(25);
  26553. var PageElementWriter = __webpack_require__(26);
  26554. var ColumnCalculator = __webpack_require__(23);
  26555. var TableProcessor = __webpack_require__(29);
  26556. var Line = __webpack_require__(28);
  26557. var pack = __webpack_require__(13).pack;
  26558. var offsetVector = __webpack_require__(13).offsetVector;
  26559. var fontStringify = __webpack_require__(13).fontStringify;
  26560. var isFunction = __webpack_require__(13).isFunction;
  26561. var TextTools = __webpack_require__(15);
  26562. var StyleContextStack = __webpack_require__(22);
  26563. function addAll(target, otherArray) {
  26564. _.each(otherArray, function (item) {
  26565. target.push(item);
  26566. });
  26567. }
  26568. /**
  26569. * Creates an instance of LayoutBuilder - layout engine which turns document-definition-object
  26570. * into a set of pages, lines, inlines and vectors ready to be rendered into a PDF
  26571. *
  26572. * @param {Object} pageSize - an object defining page width and height
  26573. * @param {Object} pageMargins - an object defining top, left, right and bottom margins
  26574. */
  26575. function LayoutBuilder(pageSize, pageMargins, imageMeasure) {
  26576. this.pageSize = pageSize;
  26577. this.pageMargins = pageMargins;
  26578. this.tracker = new TraversalTracker();
  26579. this.imageMeasure = imageMeasure;
  26580. this.tableLayouts = {};
  26581. }
  26582. LayoutBuilder.prototype.registerTableLayouts = function (tableLayouts) {
  26583. this.tableLayouts = pack(this.tableLayouts, tableLayouts);
  26584. };
  26585. /**
  26586. * Executes layout engine on document-definition-object and creates an array of pages
  26587. * containing positioned Blocks, Lines and inlines
  26588. *
  26589. * @param {Object} docStructure document-definition-object
  26590. * @param {Object} fontProvider font provider
  26591. * @param {Object} styleDictionary dictionary with style definitions
  26592. * @param {Object} defaultStyle default style definition
  26593. * @return {Array} an array of pages
  26594. */
  26595. LayoutBuilder.prototype.layoutDocument = function (docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark, pageBreakBeforeFct) {
  26596. function addPageBreaksIfNecessary(linearNodeList, pages) {
  26597. if (!isFunction(pageBreakBeforeFct)) {
  26598. return false;
  26599. }
  26600. linearNodeList = _.reject(linearNodeList, function (node) {
  26601. return _.isEmpty(node.positions);
  26602. });
  26603. _.each(linearNodeList, function (node) {
  26604. var nodeInfo = _.pick(node, [
  26605. 'id', 'text', 'ul', 'ol', 'table', 'image', 'qr', 'canvas', 'columns',
  26606. 'headlineLevel', 'style', 'pageBreak', 'pageOrientation',
  26607. 'width', 'height'
  26608. ]);
  26609. nodeInfo.startPosition = _.first(node.positions);
  26610. nodeInfo.pageNumbers = _.chain(node.positions).map('pageNumber').uniq().value();
  26611. nodeInfo.pages = pages.length;
  26612. nodeInfo.stack = _.isArray(node.stack);
  26613. node.nodeInfo = nodeInfo;
  26614. });
  26615. return _.some(linearNodeList, function (node, index, followingNodeList) {
  26616. if (node.pageBreak !== 'before' && !node.pageBreakCalculated) {
  26617. node.pageBreakCalculated = true;
  26618. var pageNumber = _.first(node.nodeInfo.pageNumbers);
  26619. var followingNodesOnPage = _.chain(followingNodeList).drop(index + 1).filter(function (node0) {
  26620. return _.includes(node0.nodeInfo.pageNumbers, pageNumber);
  26621. }).value();
  26622. var nodesOnNextPage = _.chain(followingNodeList).drop(index + 1).filter(function (node0) {
  26623. return _.includes(node0.nodeInfo.pageNumbers, pageNumber + 1);
  26624. }).value();
  26625. var previousNodesOnPage = _.chain(followingNodeList).take(index).filter(function (node0) {
  26626. return _.includes(node0.nodeInfo.pageNumbers, pageNumber);
  26627. }).value();
  26628. if (pageBreakBeforeFct(node.nodeInfo,
  26629. _.map(followingNodesOnPage, 'nodeInfo'),
  26630. _.map(nodesOnNextPage, 'nodeInfo'),
  26631. _.map(previousNodesOnPage, 'nodeInfo'))) {
  26632. node.pageBreak = 'before';
  26633. return true;
  26634. }
  26635. }
  26636. });
  26637. }
  26638. this.docPreprocessor = new DocPreprocessor();
  26639. this.docMeasure = new DocMeasure(fontProvider, styleDictionary, defaultStyle, this.imageMeasure, this.tableLayouts, images);
  26640. function resetXYs(result) {
  26641. _.each(result.linearNodeList, function (node) {
  26642. node.resetXY();
  26643. });
  26644. }
  26645. var result = this.tryLayoutDocument(docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark);
  26646. while (addPageBreaksIfNecessary(result.linearNodeList, result.pages)) {
  26647. resetXYs(result);
  26648. result = this.tryLayoutDocument(docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark);
  26649. }
  26650. return result.pages;
  26651. };
  26652. LayoutBuilder.prototype.tryLayoutDocument = function (docStructure, fontProvider, styleDictionary, defaultStyle, background, header, footer, images, watermark, pageBreakBeforeFct) {
  26653. this.linearNodeList = [];
  26654. docStructure = this.docPreprocessor.preprocessDocument(docStructure);
  26655. docStructure = this.docMeasure.measureDocument(docStructure);
  26656. this.writer = new PageElementWriter(
  26657. new DocumentContext(this.pageSize, this.pageMargins), this.tracker);
  26658. var _this = this;
  26659. this.writer.context().tracker.startTracking('pageAdded', function () {
  26660. _this.addBackground(background);
  26661. });
  26662. this.addBackground(background);
  26663. this.processNode(docStructure);
  26664. this.addHeadersAndFooters(header, footer);
  26665. /* jshint eqnull:true */
  26666. if (watermark != null) {
  26667. this.addWatermark(watermark, fontProvider, defaultStyle);
  26668. }
  26669. return {pages: this.writer.context().pages, linearNodeList: this.linearNodeList};
  26670. };
  26671. LayoutBuilder.prototype.addBackground = function (background) {
  26672. var backgroundGetter = isFunction(background) ? background : function () {
  26673. return background;
  26674. };
  26675. var pageBackground = backgroundGetter(this.writer.context().page + 1);
  26676. if (pageBackground) {
  26677. var pageSize = this.writer.context().getCurrentPage().pageSize;
  26678. this.writer.beginUnbreakableBlock(pageSize.width, pageSize.height);
  26679. pageBackground = this.docPreprocessor.preprocessDocument(pageBackground);
  26680. this.processNode(this.docMeasure.measureDocument(pageBackground));
  26681. this.writer.commitUnbreakableBlock(0, 0);
  26682. }
  26683. };
  26684. LayoutBuilder.prototype.addStaticRepeatable = function (headerOrFooter, sizeFunction) {
  26685. this.addDynamicRepeatable(function () {
  26686. return JSON.parse(JSON.stringify(headerOrFooter)); // copy to new object
  26687. }, sizeFunction);
  26688. };
  26689. LayoutBuilder.prototype.addDynamicRepeatable = function (nodeGetter, sizeFunction) {
  26690. var pages = this.writer.context().pages;
  26691. for (var pageIndex = 0, l = pages.length; pageIndex < l; pageIndex++) {
  26692. this.writer.context().page = pageIndex;
  26693. var node = nodeGetter(pageIndex + 1, l, this.writer.context().pages[pageIndex].pageSize);
  26694. if (node) {
  26695. var sizes = sizeFunction(this.writer.context().getCurrentPage().pageSize, this.pageMargins);
  26696. this.writer.beginUnbreakableBlock(sizes.width, sizes.height);
  26697. node = this.docPreprocessor.preprocessDocument(node);
  26698. this.processNode(this.docMeasure.measureDocument(node));
  26699. this.writer.commitUnbreakableBlock(sizes.x, sizes.y);
  26700. }
  26701. }
  26702. };
  26703. LayoutBuilder.prototype.addHeadersAndFooters = function (header, footer) {
  26704. var headerSizeFct = function (pageSize, pageMargins) {
  26705. return {
  26706. x: 0,
  26707. y: 0,
  26708. width: pageSize.width,
  26709. height: pageMargins.top
  26710. };
  26711. };
  26712. var footerSizeFct = function (pageSize, pageMargins) {
  26713. return {
  26714. x: 0,
  26715. y: pageSize.height - pageMargins.bottom,
  26716. width: pageSize.width,
  26717. height: pageMargins.bottom
  26718. };
  26719. };
  26720. if (isFunction(header)) {
  26721. this.addDynamicRepeatable(header, headerSizeFct);
  26722. } else if (header) {
  26723. this.addStaticRepeatable(header, headerSizeFct);
  26724. }
  26725. if (isFunction(footer)) {
  26726. this.addDynamicRepeatable(footer, footerSizeFct);
  26727. } else if (footer) {
  26728. this.addStaticRepeatable(footer, footerSizeFct);
  26729. }
  26730. };
  26731. LayoutBuilder.prototype.addWatermark = function (watermark, fontProvider, defaultStyle) {
  26732. if (typeof watermark === 'string') {
  26733. watermark = {'text': watermark};
  26734. }
  26735. if (!watermark.text) { // empty watermark text
  26736. return;
  26737. }
  26738. watermark.font = watermark.font || defaultStyle.font || 'Roboto';
  26739. watermark.color = watermark.color || 'black';
  26740. watermark.opacity = watermark.opacity || 0.6;
  26741. watermark.bold = watermark.bold || false;
  26742. watermark.italics = watermark.italics || false;
  26743. var watermarkObject = {
  26744. text: watermark.text,
  26745. font: fontProvider.provideFont(watermark.font, watermark.bold, watermark.italics),
  26746. size: getSize(this.pageSize, watermark, fontProvider),
  26747. color: watermark.color,
  26748. opacity: watermark.opacity
  26749. };
  26750. var pages = this.writer.context().pages;
  26751. for (var i = 0, l = pages.length; i < l; i++) {
  26752. pages[i].watermark = watermarkObject;
  26753. }
  26754. function getSize(pageSize, watermark, fontProvider) {
  26755. var width = pageSize.width;
  26756. var height = pageSize.height;
  26757. var targetWidth = Math.sqrt(width * width + height * height) * 0.8; /* page diagonal * sample factor */
  26758. var textTools = new TextTools(fontProvider);
  26759. var styleContextStack = new StyleContextStack(null, {font: watermark.font, bold: watermark.bold, italics: watermark.italics});
  26760. var size;
  26761. /**
  26762. * Binary search the best font size.
  26763. * Initial bounds [0, 1000]
  26764. * Break when range < 1
  26765. */
  26766. var a = 0;
  26767. var b = 1000;
  26768. var c = (a + b) / 2;
  26769. while (Math.abs(a - b) > 1) {
  26770. styleContextStack.push({
  26771. fontSize: c
  26772. });
  26773. size = textTools.sizeOfString(watermark.text, styleContextStack);
  26774. if (size.width > targetWidth) {
  26775. b = c;
  26776. c = (a + b) / 2;
  26777. } else if (size.width < targetWidth) {
  26778. a = c;
  26779. c = (a + b) / 2;
  26780. }
  26781. styleContextStack.pop();
  26782. }
  26783. /*
  26784. End binary search
  26785. */
  26786. return {size: size, fontSize: c};
  26787. }
  26788. };
  26789. function decorateNode(node) {
  26790. var x = node.x, y = node.y;
  26791. node.positions = [];
  26792. _.each(node.canvas, function (vector) {
  26793. var x = vector.x, y = vector.y, x1 = vector.x1, y1 = vector.y1, x2 = vector.x2, y2 = vector.y2;
  26794. vector.resetXY = function () {
  26795. vector.x = x;
  26796. vector.y = y;
  26797. vector.x1 = x1;
  26798. vector.y1 = y1;
  26799. vector.x2 = x2;
  26800. vector.y2 = y2;
  26801. };
  26802. });
  26803. node.resetXY = function () {
  26804. node.x = x;
  26805. node.y = y;
  26806. _.each(node.canvas, function (vector) {
  26807. vector.resetXY();
  26808. });
  26809. };
  26810. }
  26811. LayoutBuilder.prototype.processNode = function (node) {
  26812. var self = this;
  26813. this.linearNodeList.push(node);
  26814. decorateNode(node);
  26815. applyMargins(function () {
  26816. var unbreakable = node.unbreakable;
  26817. if (unbreakable) {
  26818. self.writer.beginUnbreakableBlock();
  26819. }
  26820. var absPosition = node.absolutePosition;
  26821. if (absPosition) {
  26822. self.writer.context().beginDetachedBlock();
  26823. self.writer.context().moveTo(absPosition.x || 0, absPosition.y || 0);
  26824. }
  26825. var relPosition = node.relativePosition;
  26826. if (relPosition) {
  26827. self.writer.context().beginDetachedBlock();
  26828. self.writer.context().moveTo((relPosition.x || 0) + self.writer.context().x, (relPosition.y || 0) + self.writer.context().y);
  26829. }
  26830. if (node.stack) {
  26831. self.processVerticalContainer(node);
  26832. } else if (node.columns) {
  26833. self.processColumns(node);
  26834. } else if (node.ul) {
  26835. self.processList(false, node);
  26836. } else if (node.ol) {
  26837. self.processList(true, node);
  26838. } else if (node.table) {
  26839. self.processTable(node);
  26840. } else if (node.text !== undefined) {
  26841. self.processLeaf(node);
  26842. } else if (node.toc) {
  26843. self.processToc(node);
  26844. } else if (node.image) {
  26845. self.processImage(node);
  26846. } else if (node.canvas) {
  26847. self.processCanvas(node);
  26848. } else if (node.qr) {
  26849. self.processQr(node);
  26850. } else if (!node._span) {
  26851. throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
  26852. }
  26853. if (absPosition || relPosition) {
  26854. self.writer.context().endDetachedBlock();
  26855. }
  26856. if (unbreakable) {
  26857. self.writer.commitUnbreakableBlock();
  26858. }
  26859. });
  26860. function applyMargins(callback) {
  26861. var margin = node._margin;
  26862. if (node.pageBreak === 'before') {
  26863. self.writer.moveToNextPage(node.pageOrientation);
  26864. }
  26865. if (margin) {
  26866. self.writer.context().moveDown(margin[1]);
  26867. self.writer.context().addMargin(margin[0], margin[2]);
  26868. }
  26869. callback();
  26870. if (margin) {
  26871. self.writer.context().addMargin(-margin[0], -margin[2]);
  26872. self.writer.context().moveDown(margin[3]);
  26873. }
  26874. if (node.pageBreak === 'after') {
  26875. self.writer.moveToNextPage(node.pageOrientation);
  26876. }
  26877. }
  26878. };
  26879. // vertical container
  26880. LayoutBuilder.prototype.processVerticalContainer = function (node) {
  26881. var self = this;
  26882. node.stack.forEach(function (item) {
  26883. self.processNode(item);
  26884. addAll(node.positions, item.positions);
  26885. //TODO: paragraph gap
  26886. });
  26887. };
  26888. // columns
  26889. LayoutBuilder.prototype.processColumns = function (columnNode) {
  26890. var columns = columnNode.columns;
  26891. var availableWidth = this.writer.context().availableWidth;
  26892. var gaps = gapArray(columnNode._gap);
  26893. if (gaps) {
  26894. availableWidth -= (gaps.length - 1) * columnNode._gap;
  26895. }
  26896. ColumnCalculator.buildColumnWidths(columns, availableWidth);
  26897. var result = this.processRow(columns, columns, gaps);
  26898. addAll(columnNode.positions, result.positions);
  26899. function gapArray(gap) {
  26900. if (!gap) {
  26901. return null;
  26902. }
  26903. var gaps = [];
  26904. gaps.push(0);
  26905. for (var i = columns.length - 1; i > 0; i--) {
  26906. gaps.push(gap);
  26907. }
  26908. return gaps;
  26909. }
  26910. };
  26911. LayoutBuilder.prototype.processRow = function (columns, widths, gaps, tableBody, tableRow) {
  26912. var self = this;
  26913. var pageBreaks = [], positions = [];
  26914. this.tracker.auto('pageChanged', storePageBreakData, function () {
  26915. widths = widths || columns;
  26916. self.writer.context().beginColumnGroup();
  26917. for (var i = 0, l = columns.length; i < l; i++) {
  26918. var column = columns[i];
  26919. var width = widths[i]._calcWidth;
  26920. var leftOffset = colLeftOffset(i);
  26921. if (column.colSpan && column.colSpan > 1) {
  26922. for (var j = 1; j < column.colSpan; j++) {
  26923. width += widths[++i]._calcWidth + gaps[i];
  26924. }
  26925. }
  26926. self.writer.context().beginColumn(width, leftOffset, getEndingCell(column, i));
  26927. if (!column._span) {
  26928. self.processNode(column);
  26929. addAll(positions, column.positions);
  26930. } else if (column._columnEndingContext) {
  26931. // row-span ending
  26932. self.writer.context().markEnding(column);
  26933. }
  26934. }
  26935. self.writer.context().completeColumnGroup();
  26936. });
  26937. return {pageBreaks: pageBreaks, positions: positions};
  26938. function storePageBreakData(data) {
  26939. var pageDesc;
  26940. for (var i = 0, l = pageBreaks.length; i < l; i++) {
  26941. var desc = pageBreaks[i];
  26942. if (desc.prevPage === data.prevPage) {
  26943. pageDesc = desc;
  26944. break;
  26945. }
  26946. }
  26947. if (!pageDesc) {
  26948. pageDesc = data;
  26949. pageBreaks.push(pageDesc);
  26950. }
  26951. pageDesc.prevY = Math.max(pageDesc.prevY, data.prevY);
  26952. pageDesc.y = Math.min(pageDesc.y, data.y);
  26953. }
  26954. function colLeftOffset(i) {
  26955. if (gaps && gaps.length > i) {
  26956. return gaps[i];
  26957. }
  26958. return 0;
  26959. }
  26960. function getEndingCell(column, columnIndex) {
  26961. if (column.rowSpan && column.rowSpan > 1) {
  26962. var endingRow = tableRow + column.rowSpan - 1;
  26963. if (endingRow >= tableBody.length) {
  26964. throw 'Row span for column ' + columnIndex + ' (with indexes starting from 0) exceeded row count';
  26965. }
  26966. return tableBody[endingRow][columnIndex];
  26967. }
  26968. return null;
  26969. }
  26970. };
  26971. // lists
  26972. LayoutBuilder.prototype.processList = function (orderedList, node) {
  26973. var self = this,
  26974. items = orderedList ? node.ol : node.ul,
  26975. gapSize = node._gapSize;
  26976. this.writer.context().addMargin(gapSize.width);
  26977. var nextMarker;
  26978. this.tracker.auto('lineAdded', addMarkerToFirstLeaf, function () {
  26979. items.forEach(function (item) {
  26980. nextMarker = item.listMarker;
  26981. self.processNode(item);
  26982. addAll(node.positions, item.positions);
  26983. });
  26984. });
  26985. this.writer.context().addMargin(-gapSize.width);
  26986. function addMarkerToFirstLeaf(line) {
  26987. // I'm not very happy with the way list processing is implemented
  26988. // (both code and algorithm should be rethinked)
  26989. if (nextMarker) {
  26990. var marker = nextMarker;
  26991. nextMarker = null;
  26992. if (marker.canvas) {
  26993. var vector = marker.canvas[0];
  26994. offsetVector(vector, -marker._minWidth, 0);
  26995. self.writer.addVector(vector);
  26996. } else if (marker._inlines) {
  26997. var markerLine = new Line(self.pageSize.width);
  26998. markerLine.addInline(marker._inlines[0]);
  26999. markerLine.x = -marker._minWidth;
  27000. markerLine.y = line.getAscenderHeight() - markerLine.getAscenderHeight();
  27001. self.writer.addLine(markerLine, true);
  27002. }
  27003. }
  27004. }
  27005. };
  27006. // tables
  27007. LayoutBuilder.prototype.processTable = function (tableNode) {
  27008. var processor = new TableProcessor(tableNode);
  27009. processor.beginTable(this.writer);
  27010. for (var i = 0, l = tableNode.table.body.length; i < l; i++) {
  27011. processor.beginRow(i, this.writer);
  27012. var result = this.processRow(tableNode.table.body[i], tableNode.table.widths, tableNode._offsets.offsets, tableNode.table.body, i);
  27013. addAll(tableNode.positions, result.positions);
  27014. processor.endRow(i, this.writer, result.pageBreaks);
  27015. }
  27016. processor.endTable(this.writer);
  27017. };
  27018. // leafs (texts)
  27019. LayoutBuilder.prototype.processLeaf = function (node) {
  27020. var line = this.buildNextLine(node);
  27021. var currentHeight = (line) ? line.getHeight() : 0;
  27022. var maxHeight = node.maxHeight || -1;
  27023. if (node._tocItemRef) {
  27024. line._tocItemNode = node._tocItemRef;
  27025. }
  27026. while (line && (maxHeight === -1 || currentHeight < maxHeight)) {
  27027. var positions = this.writer.addLine(line);
  27028. node.positions.push(positions);
  27029. line = this.buildNextLine(node);
  27030. if (line) {
  27031. currentHeight += line.getHeight();
  27032. }
  27033. }
  27034. };
  27035. LayoutBuilder.prototype.processToc = function (node) {
  27036. if (node.toc.title) {
  27037. this.processNode(node.toc.title);
  27038. }
  27039. this.processNode(node.toc._table);
  27040. };
  27041. LayoutBuilder.prototype.buildNextLine = function (textNode) {
  27042. function cloneInline(inline) {
  27043. var newInline = inline.constructor();
  27044. for (var key in inline) {
  27045. newInline[key] = inline[key];
  27046. }
  27047. return newInline;
  27048. }
  27049. if (!textNode._inlines || textNode._inlines.length === 0) {
  27050. return null;
  27051. }
  27052. var line = new Line(this.writer.context().availableWidth);
  27053. var textTools = new TextTools(null);
  27054. while (textNode._inlines && textNode._inlines.length > 0 && line.hasEnoughSpaceForInline(textNode._inlines[0])) {
  27055. var inline = textNode._inlines.shift();
  27056. if (!inline.noWrap && inline.text.length > 1 && inline.width > line.maxWidth) {
  27057. var widthPerChar = inline.width / inline.text.length;
  27058. var maxChars = Math.floor(line.maxWidth / widthPerChar);
  27059. if (maxChars < 1) {
  27060. maxChars = 1;
  27061. }
  27062. if (maxChars < inline.text.length) {
  27063. var newInline = cloneInline(inline);
  27064. newInline.text = inline.text.substr(maxChars);
  27065. inline.text = inline.text.substr(0, maxChars);
  27066. newInline.width = textTools.widthOfString(newInline.text, newInline.font, newInline.fontSize, newInline.characterSpacing);
  27067. inline.width = textTools.widthOfString(inline.text, inline.font, inline.fontSize, inline.characterSpacing);
  27068. textNode._inlines.unshift(newInline);
  27069. }
  27070. }
  27071. line.addInline(inline);
  27072. }
  27073. line.lastLineInParagraph = textNode._inlines.length === 0;
  27074. return line;
  27075. };
  27076. // images
  27077. LayoutBuilder.prototype.processImage = function (node) {
  27078. var position = this.writer.addImage(node);
  27079. node.positions.push(position);
  27080. };
  27081. LayoutBuilder.prototype.processCanvas = function (node) {
  27082. var height = node._minHeight;
  27083. if (this.writer.context().availableHeight < height) {
  27084. // TODO: support for canvas larger than a page
  27085. // TODO: support for other overflow methods
  27086. this.writer.moveToNextPage();
  27087. }
  27088. node.canvas.forEach(function (vector) {
  27089. var position = this.writer.addVector(vector);
  27090. node.positions.push(position);
  27091. }, this);
  27092. this.writer.context().moveDown(height);
  27093. };
  27094. LayoutBuilder.prototype.processQr = function (node) {
  27095. var position = this.writer.addQr(node);
  27096. node.positions.push(position);
  27097. };
  27098. module.exports = LayoutBuilder;
  27099. /***/ }),
  27100. /* 11 */
  27101. /***/ (function(module, exports) {
  27102. /* jslint node: true */
  27103. 'use strict';
  27104. /**
  27105. * Creates an instance of TraversalTracker
  27106. *
  27107. * @constructor
  27108. */
  27109. function TraversalTracker() {
  27110. this.events = {};
  27111. }
  27112. TraversalTracker.prototype.startTracking = function (event, cb) {
  27113. var callbacks = (this.events[event] || (this.events[event] = []));
  27114. if (callbacks.indexOf(cb) < 0) {
  27115. callbacks.push(cb);
  27116. }
  27117. };
  27118. TraversalTracker.prototype.stopTracking = function (event, cb) {
  27119. var callbacks = this.events[event];
  27120. if (callbacks) {
  27121. var index = callbacks.indexOf(cb);
  27122. if (index >= 0) {
  27123. callbacks.splice(index, 1);
  27124. }
  27125. }
  27126. };
  27127. TraversalTracker.prototype.emit = function (event) {
  27128. var args = Array.prototype.slice.call(arguments, 1);
  27129. var callbacks = this.events[event];
  27130. if (callbacks) {
  27131. callbacks.forEach(function (cb) {
  27132. cb.apply(this, args);
  27133. });
  27134. }
  27135. };
  27136. TraversalTracker.prototype.auto = function (event, cb, innerBlock) {
  27137. this.startTracking(event, cb);
  27138. innerBlock();
  27139. this.stopTracking(event, cb);
  27140. };
  27141. module.exports = TraversalTracker;
  27142. /***/ }),
  27143. /* 12 */
  27144. /***/ (function(module, exports, __webpack_require__) {
  27145. /* jslint node: true */
  27146. 'use strict';
  27147. var fontStringify = __webpack_require__(13).fontStringify;
  27148. function DocPreprocessor() {
  27149. }
  27150. DocPreprocessor.prototype.preprocessDocument = function (docStructure) {
  27151. this.tocs = [];
  27152. return this.preprocessNode(docStructure);
  27153. };
  27154. DocPreprocessor.prototype.preprocessNode = function (node) {
  27155. // expand shortcuts and casting values
  27156. if (Array.isArray(node)) {
  27157. node = {stack: node};
  27158. } else if (typeof node === 'string' || node instanceof String) {
  27159. node = {text: node};
  27160. } else if (typeof node === 'number' || typeof node === 'boolean') {
  27161. node = {text: node.toString()};
  27162. } else if (node === null) {
  27163. node = {text: ''};
  27164. } else if (Object.keys(node).length === 0) { // empty object
  27165. node = {text: ''};
  27166. }
  27167. if (node.columns) {
  27168. return this.preprocessColumns(node);
  27169. } else if (node.stack) {
  27170. return this.preprocessVerticalContainer(node);
  27171. } else if (node.ul) {
  27172. return this.preprocessList(node);
  27173. } else if (node.ol) {
  27174. return this.preprocessList(node);
  27175. } else if (node.table) {
  27176. return this.preprocessTable(node);
  27177. } else if (node.text !== undefined) {
  27178. return this.preprocessText(node);
  27179. } else if (node.toc) {
  27180. return this.preprocessToc(node);
  27181. } else if (node.image) {
  27182. return this.preprocessImage(node);
  27183. } else if (node.canvas) {
  27184. return this.preprocessCanvas(node);
  27185. } else if (node.qr) {
  27186. return this.preprocessQr(node);
  27187. } else {
  27188. throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
  27189. }
  27190. };
  27191. DocPreprocessor.prototype.preprocessColumns = function (node) {
  27192. var columns = node.columns;
  27193. for (var i = 0, l = columns.length; i < l; i++) {
  27194. columns[i] = this.preprocessNode(columns[i]);
  27195. }
  27196. return node;
  27197. };
  27198. DocPreprocessor.prototype.preprocessVerticalContainer = function (node) {
  27199. var items = node.stack;
  27200. for (var i = 0, l = items.length; i < l; i++) {
  27201. items[i] = this.preprocessNode(items[i]);
  27202. }
  27203. return node;
  27204. };
  27205. DocPreprocessor.prototype.preprocessList = function (node) {
  27206. var items = node.ul || node.ol;
  27207. for (var i = 0, l = items.length; i < l; i++) {
  27208. items[i] = this.preprocessNode(items[i]);
  27209. }
  27210. return node;
  27211. };
  27212. DocPreprocessor.prototype.preprocessTable = function (node) {
  27213. var col, row, cols, rows;
  27214. for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
  27215. for (row = 0, rows = node.table.body.length; row < rows; row++) {
  27216. var rowData = node.table.body[row];
  27217. var data = rowData[col];
  27218. if (data !== undefined) {
  27219. if (data === null) { // transform to object
  27220. data = '';
  27221. }
  27222. if (!data._span) {
  27223. rowData[col] = this.preprocessNode(data);
  27224. }
  27225. }
  27226. }
  27227. }
  27228. return node;
  27229. };
  27230. DocPreprocessor.prototype.preprocessText = function (node) {
  27231. if (node.tocItem) {
  27232. if (!Array.isArray(node.tocItem)) {
  27233. node.tocItem = [node.tocItem];
  27234. }
  27235. for (var i = 0, l = node.tocItem.length; i < l; i++) {
  27236. if (!(typeof node.tocItem[i] === 'string' || node.tocItem[i] instanceof String)) {
  27237. node.tocItem[i] = '_default_';
  27238. }
  27239. var tocItemId = node.tocItem[i];
  27240. if (!this.tocs[tocItemId]) {
  27241. this.tocs[tocItemId] = {toc: {_items: [], _pseudo: true}};
  27242. }
  27243. this.tocs[tocItemId].toc._items.push(node);
  27244. }
  27245. }
  27246. return node;
  27247. };
  27248. DocPreprocessor.prototype.preprocessToc = function (node) {
  27249. if (!node.toc.id) {
  27250. node.toc.id = '_default_';
  27251. }
  27252. node.toc.title = node.toc.title ? this.preprocessNode(node.toc.title) : null;
  27253. node.toc._items = [];
  27254. if (this.tocs[node.toc.id]) {
  27255. if (!this.tocs[node.toc.id].toc._pseudo) {
  27256. throw "TOC '" + node.toc.id + "' already exists";
  27257. }
  27258. node.toc._items = this.tocs[node.toc.id].toc._items;
  27259. }
  27260. this.tocs[node.toc.id] = node;
  27261. return node;
  27262. };
  27263. DocPreprocessor.prototype.preprocessImage = function (node) {
  27264. return node;
  27265. };
  27266. DocPreprocessor.prototype.preprocessCanvas = function (node) {
  27267. return node;
  27268. };
  27269. DocPreprocessor.prototype.preprocessQr = function (node) {
  27270. return node;
  27271. };
  27272. module.exports = DocPreprocessor;
  27273. /***/ }),
  27274. /* 13 */
  27275. /***/ (function(module, exports) {
  27276. /* jslint node: true */
  27277. 'use strict';
  27278. function pack() {
  27279. var result = {};
  27280. for (var i = 0, l = arguments.length; i < l; i++) {
  27281. var obj = arguments[i];
  27282. if (obj) {
  27283. for (var key in obj) {
  27284. if (obj.hasOwnProperty(key)) {
  27285. result[key] = obj[key];
  27286. }
  27287. }
  27288. }
  27289. }
  27290. return result;
  27291. }
  27292. function offsetVector(vector, x, y) {
  27293. switch (vector.type) {
  27294. case 'ellipse':
  27295. case 'rect':
  27296. vector.x += x;
  27297. vector.y += y;
  27298. break;
  27299. case 'line':
  27300. vector.x1 += x;
  27301. vector.x2 += x;
  27302. vector.y1 += y;
  27303. vector.y2 += y;
  27304. break;
  27305. case 'polyline':
  27306. for (var i = 0, l = vector.points.length; i < l; i++) {
  27307. vector.points[i].x += x;
  27308. vector.points[i].y += y;
  27309. }
  27310. break;
  27311. }
  27312. }
  27313. function fontStringify(key, val) {
  27314. if (key === 'font') {
  27315. return 'font';
  27316. }
  27317. return val;
  27318. }
  27319. function isFunction(functionToCheck) {
  27320. var getType = {};
  27321. return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
  27322. }
  27323. module.exports = {
  27324. pack: pack,
  27325. fontStringify: fontStringify,
  27326. offsetVector: offsetVector,
  27327. isFunction: isFunction
  27328. };
  27329. /***/ }),
  27330. /* 14 */
  27331. /***/ (function(module, exports, __webpack_require__) {
  27332. /* jslint node: true */
  27333. 'use strict';
  27334. var TextTools = __webpack_require__(15);
  27335. var StyleContextStack = __webpack_require__(22);
  27336. var ColumnCalculator = __webpack_require__(23);
  27337. var fontStringify = __webpack_require__(13).fontStringify;
  27338. var pack = __webpack_require__(13).pack;
  27339. var qrEncoder = __webpack_require__(24);
  27340. /**
  27341. * @private
  27342. */
  27343. function DocMeasure(fontProvider, styleDictionary, defaultStyle, imageMeasure, tableLayouts, images) {
  27344. this.textTools = new TextTools(fontProvider);
  27345. this.styleStack = new StyleContextStack(styleDictionary, defaultStyle);
  27346. this.imageMeasure = imageMeasure;
  27347. this.tableLayouts = tableLayouts;
  27348. this.images = images;
  27349. this.autoImageIndex = 1;
  27350. }
  27351. /**
  27352. * Measures all nodes and sets min/max-width properties required for the second
  27353. * layout-pass.
  27354. * @param {Object} docStructure document-definition-object
  27355. * @return {Object} document-measurement-object
  27356. */
  27357. DocMeasure.prototype.measureDocument = function (docStructure) {
  27358. return this.measureNode(docStructure);
  27359. };
  27360. DocMeasure.prototype.measureNode = function (node) {
  27361. var self = this;
  27362. return this.styleStack.auto(node, function () {
  27363. // TODO: refactor + rethink whether this is the proper way to handle margins
  27364. node._margin = getNodeMargin(node);
  27365. if (node.columns) {
  27366. return extendMargins(self.measureColumns(node));
  27367. } else if (node.stack) {
  27368. return extendMargins(self.measureVerticalContainer(node));
  27369. } else if (node.ul) {
  27370. return extendMargins(self.measureUnorderedList(node));
  27371. } else if (node.ol) {
  27372. return extendMargins(self.measureOrderedList(node));
  27373. } else if (node.table) {
  27374. return extendMargins(self.measureTable(node));
  27375. } else if (node.text !== undefined) {
  27376. return extendMargins(self.measureLeaf(node));
  27377. } else if (node.toc) {
  27378. return extendMargins(self.measureToc(node));
  27379. } else if (node.image) {
  27380. return extendMargins(self.measureImage(node));
  27381. } else if (node.canvas) {
  27382. return extendMargins(self.measureCanvas(node));
  27383. } else if (node.qr) {
  27384. return extendMargins(self.measureQr(node));
  27385. } else {
  27386. throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
  27387. }
  27388. });
  27389. function extendMargins(node) {
  27390. var margin = node._margin;
  27391. if (margin) {
  27392. node._minWidth += margin[0] + margin[2];
  27393. node._maxWidth += margin[0] + margin[2];
  27394. }
  27395. return node;
  27396. }
  27397. function getNodeMargin() {
  27398. function processSingleMargins(node, currentMargin) {
  27399. if (node.marginLeft || node.marginTop || node.marginRight || node.marginBottom) {
  27400. return [
  27401. node.marginLeft || currentMargin[0] || 0,
  27402. node.marginTop || currentMargin[1] || 0,
  27403. node.marginRight || currentMargin[2] || 0,
  27404. node.marginBottom || currentMargin[3] || 0
  27405. ];
  27406. }
  27407. return currentMargin;
  27408. }
  27409. function flattenStyleArray(styleArray) {
  27410. var flattenedStyles = {};
  27411. for (var i = styleArray.length - 1; i >= 0; i--) {
  27412. var styleName = styleArray[i];
  27413. var style = self.styleStack.styleDictionary[styleName];
  27414. for (var key in style) {
  27415. if (style.hasOwnProperty(key)) {
  27416. flattenedStyles[key] = style[key];
  27417. }
  27418. }
  27419. }
  27420. return flattenedStyles;
  27421. }
  27422. function convertMargin(margin) {
  27423. if (typeof margin === 'number' || margin instanceof Number) {
  27424. margin = [margin, margin, margin, margin];
  27425. } else if (Array.isArray(margin)) {
  27426. if (margin.length === 2) {
  27427. margin = [margin[0], margin[1], margin[0], margin[1]];
  27428. }
  27429. }
  27430. return margin;
  27431. }
  27432. var margin = [undefined, undefined, undefined, undefined];
  27433. if (node.style) {
  27434. var styleArray = (Array.isArray(node.style)) ? node.style : [node.style];
  27435. var flattenedStyleArray = flattenStyleArray(styleArray);
  27436. if (flattenedStyleArray) {
  27437. margin = processSingleMargins(flattenedStyleArray, margin);
  27438. }
  27439. if (flattenedStyleArray.margin) {
  27440. margin = convertMargin(flattenedStyleArray.margin);
  27441. }
  27442. }
  27443. margin = processSingleMargins(node, margin);
  27444. if (node.margin) {
  27445. margin = convertMargin(node.margin);
  27446. }
  27447. if (margin[0] === undefined && margin[1] === undefined && margin[2] === undefined && margin[3] === undefined) {
  27448. return null;
  27449. } else {
  27450. return margin;
  27451. }
  27452. }
  27453. };
  27454. DocMeasure.prototype.convertIfBase64Image = function (node) {
  27455. if (/^data:image\/(jpeg|jpg|png);base64,/.test(node.image)) {
  27456. var label = '$$pdfmake$$' + this.autoImageIndex++;
  27457. this.images[label] = node.image;
  27458. node.image = label;
  27459. }
  27460. };
  27461. DocMeasure.prototype.measureImage = function (node) {
  27462. if (this.images) {
  27463. this.convertIfBase64Image(node);
  27464. }
  27465. var imageSize = this.imageMeasure.measureImage(node.image);
  27466. if (node.fit) {
  27467. var factor = (imageSize.width / imageSize.height > node.fit[0] / node.fit[1]) ? node.fit[0] / imageSize.width : node.fit[1] / imageSize.height;
  27468. node._width = node._minWidth = node._maxWidth = imageSize.width * factor;
  27469. node._height = imageSize.height * factor;
  27470. } else {
  27471. node._width = node._minWidth = node._maxWidth = node.width || imageSize.width;
  27472. node._height = node.height || (imageSize.height * node._width / imageSize.width);
  27473. if (typeof node.maxWidth === "number" && node.maxWidth < node._width) {
  27474. node._width = node._minWidth = node._maxWidth = node.maxWidth;
  27475. node._height = node._width * imageSize.height / imageSize.width;
  27476. }
  27477. if (typeof node.maxHeight === "number" && node.maxHeight < node._height) {
  27478. node._height = node.maxHeight;
  27479. node._width = node._minWidth = node._maxWidth = node._height * imageSize.width / imageSize.height;
  27480. }
  27481. if (typeof node.minWidth === "number" && node.minWidth > node._width) {
  27482. node._width = node._minWidth = node._maxWidth = node.minWidth;
  27483. node._height = node._width * imageSize.height / imageSize.width;
  27484. }
  27485. if (typeof node.minHeight === "number" && node.minHeight > node._height) {
  27486. node._height = node.minHeight;
  27487. node._width = node._minWidth = node._maxWidth = node._height * imageSize.width / imageSize.height;
  27488. }
  27489. }
  27490. node._alignment = this.styleStack.getProperty('alignment');
  27491. return node;
  27492. };
  27493. DocMeasure.prototype.measureLeaf = function (node) {
  27494. // Make sure style properties of the node itself are considered when building inlines.
  27495. // We could also just pass [node] to buildInlines, but that fails for bullet points.
  27496. var styleStack = this.styleStack.clone();
  27497. styleStack.push(node);
  27498. var data = this.textTools.buildInlines(node.text, styleStack);
  27499. node._inlines = data.items;
  27500. node._minWidth = data.minWidth;
  27501. node._maxWidth = data.maxWidth;
  27502. return node;
  27503. };
  27504. DocMeasure.prototype.measureToc = function (node) {
  27505. if (node.toc.title) {
  27506. node.toc.title = this.measureNode(node.toc.title);
  27507. }
  27508. var body = [];
  27509. for (var i = 0, l = node.toc._items.length; i < l; i++) {
  27510. var item = node.toc._items[i];
  27511. body.push([
  27512. {text: item.text, alignment: 'left'},
  27513. {text: '00000', alignment: 'right', _tocItemRef: item}
  27514. ]);
  27515. }
  27516. node.toc._table = {
  27517. table: {
  27518. dontBreakRows: true,
  27519. widths: ['*', 'auto'],
  27520. body: body
  27521. },
  27522. layout: 'noBorders'
  27523. };
  27524. node.toc._table = this.measureNode(node.toc._table);
  27525. return node;
  27526. };
  27527. DocMeasure.prototype.measureVerticalContainer = function (node) {
  27528. var items = node.stack;
  27529. node._minWidth = 0;
  27530. node._maxWidth = 0;
  27531. for (var i = 0, l = items.length; i < l; i++) {
  27532. items[i] = this.measureNode(items[i]);
  27533. node._minWidth = Math.max(node._minWidth, items[i]._minWidth);
  27534. node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth);
  27535. }
  27536. return node;
  27537. };
  27538. DocMeasure.prototype.gapSizeForList = function () {
  27539. return this.textTools.sizeOfString('9. ', this.styleStack);
  27540. };
  27541. DocMeasure.prototype.buildUnorderedMarker = function (styleStack, gapSize, type) {
  27542. function buildDisc(gapSize, color) {
  27543. // TODO: ascender-based calculations
  27544. var radius = gapSize.fontSize / 6;
  27545. return {
  27546. canvas: [{
  27547. x: radius,
  27548. y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - gapSize.fontSize / 3,
  27549. r1: radius,
  27550. r2: radius,
  27551. type: 'ellipse',
  27552. color: color
  27553. }]
  27554. };
  27555. }
  27556. function buildSquare(gapSize, color) {
  27557. // TODO: ascender-based calculations
  27558. var size = gapSize.fontSize / 3;
  27559. return {
  27560. canvas: [{
  27561. x: 0,
  27562. y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - (gapSize.fontSize / 3) - (size / 2),
  27563. h: size,
  27564. w: size,
  27565. type: 'rect',
  27566. color: color
  27567. }]
  27568. };
  27569. }
  27570. function buildCircle(gapSize, color) {
  27571. // TODO: ascender-based calculations
  27572. var radius = gapSize.fontSize / 6;
  27573. return {
  27574. canvas: [{
  27575. x: radius,
  27576. y: (gapSize.height / gapSize.lineHeight) + gapSize.descender - gapSize.fontSize / 3,
  27577. r1: radius,
  27578. r2: radius,
  27579. type: 'ellipse',
  27580. lineColor: color
  27581. }]
  27582. };
  27583. }
  27584. var marker;
  27585. var color = styleStack.getProperty('markerColor') || styleStack.getProperty('color') || 'black';
  27586. switch (type) {
  27587. case 'circle':
  27588. marker = buildCircle(gapSize, color);
  27589. break;
  27590. case 'square':
  27591. marker = buildSquare(gapSize, color);
  27592. break;
  27593. case 'none':
  27594. marker = {};
  27595. break;
  27596. case 'disc':
  27597. default:
  27598. marker = buildDisc(gapSize, color);
  27599. break;
  27600. }
  27601. marker._minWidth = marker._maxWidth = gapSize.width;
  27602. marker._minHeight = marker._maxHeight = gapSize.height;
  27603. return marker;
  27604. };
  27605. DocMeasure.prototype.buildOrderedMarker = function (counter, styleStack, type, separator) {
  27606. function prepareAlpha(counter) {
  27607. function toAlpha(num) {
  27608. return (num >= 26 ? toAlpha((num / 26 >> 0) - 1) : '') + 'abcdefghijklmnopqrstuvwxyz'[num % 26 >> 0];
  27609. }
  27610. if (counter < 1) {
  27611. return counter.toString();
  27612. }
  27613. return toAlpha(counter - 1);
  27614. }
  27615. function prepareRoman(counter) {
  27616. if (counter < 1 || counter > 4999) {
  27617. return counter.toString();
  27618. }
  27619. var num = counter;
  27620. var lookup = {M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1}, roman = '', i;
  27621. for (i in lookup) {
  27622. while (num >= lookup[i]) {
  27623. roman += i;
  27624. num -= lookup[i];
  27625. }
  27626. }
  27627. return roman;
  27628. }
  27629. function prepareDecimal(counter) {
  27630. return counter.toString();
  27631. }
  27632. var counterText;
  27633. switch (type) {
  27634. case 'none':
  27635. counterText = null;
  27636. break;
  27637. case 'upper-alpha':
  27638. counterText = prepareAlpha(counter).toUpperCase();
  27639. break;
  27640. case 'lower-alpha':
  27641. counterText = prepareAlpha(counter);
  27642. break;
  27643. case 'upper-roman':
  27644. counterText = prepareRoman(counter);
  27645. break;
  27646. case 'lower-roman':
  27647. counterText = prepareRoman(counter).toLowerCase();
  27648. break;
  27649. case 'decimal':
  27650. default:
  27651. counterText = prepareDecimal(counter);
  27652. break;
  27653. }
  27654. if (counterText === null) {
  27655. return {};
  27656. }
  27657. if (separator) {
  27658. if (Array.isArray(separator)) {
  27659. if (separator[0]) {
  27660. counterText = separator[0] + counterText;
  27661. }
  27662. if (separator[1]) {
  27663. counterText += separator[1];
  27664. }
  27665. counterText += ' ';
  27666. } else {
  27667. counterText += separator + ' ';
  27668. }
  27669. }
  27670. var textArray = {text: counterText};
  27671. var markerColor = styleStack.getProperty('markerColor');
  27672. if (markerColor) {
  27673. textArray.color = markerColor;
  27674. }
  27675. return {_inlines: this.textTools.buildInlines(textArray, styleStack).items};
  27676. };
  27677. DocMeasure.prototype.measureUnorderedList = function (node) {
  27678. var style = this.styleStack.clone();
  27679. var items = node.ul;
  27680. node.type = node.type || 'disc';
  27681. node._gapSize = this.gapSizeForList();
  27682. node._minWidth = 0;
  27683. node._maxWidth = 0;
  27684. for (var i = 0, l = items.length; i < l; i++) {
  27685. var item = items[i] = this.measureNode(items[i]);
  27686. if (!item.ol && !item.ul) {
  27687. item.listMarker = this.buildUnorderedMarker(style, node._gapSize, node.type);
  27688. }
  27689. node._minWidth = Math.max(node._minWidth, items[i]._minWidth + node._gapSize.width);
  27690. node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth + node._gapSize.width);
  27691. }
  27692. return node;
  27693. };
  27694. DocMeasure.prototype.measureOrderedList = function (node) {
  27695. var style = this.styleStack.clone();
  27696. var items = node.ol;
  27697. node.type = node.type || 'decimal';
  27698. node.separator = node.separator || '.';
  27699. node.reversed = node.reversed || false;
  27700. if (!node.start) {
  27701. node.start = node.reversed ? items.length : 1;
  27702. }
  27703. node._gapSize = this.gapSizeForList();
  27704. node._minWidth = 0;
  27705. node._maxWidth = 0;
  27706. var counter = node.start;
  27707. for (var i = 0, l = items.length; i < l; i++) {
  27708. var item = items[i] = this.measureNode(items[i]);
  27709. if (!item.ol && !item.ul) {
  27710. item.listMarker = this.buildOrderedMarker(item.counter || counter, style, node.type, node.separator);
  27711. if (item.listMarker._inlines) {
  27712. node._gapSize.width = Math.max(node._gapSize.width, item.listMarker._inlines[0].width);
  27713. }
  27714. } // TODO: else - nested lists numbering
  27715. node._minWidth = Math.max(node._minWidth, items[i]._minWidth);
  27716. node._maxWidth = Math.max(node._maxWidth, items[i]._maxWidth);
  27717. if (node.reversed) {
  27718. counter--;
  27719. } else {
  27720. counter++;
  27721. }
  27722. }
  27723. node._minWidth += node._gapSize.width;
  27724. node._maxWidth += node._gapSize.width;
  27725. for (var i = 0, l = items.length; i < l; i++) {
  27726. var item = items[i];
  27727. if (!item.ol && !item.ul) {
  27728. item.listMarker._minWidth = item.listMarker._maxWidth = node._gapSize.width;
  27729. }
  27730. }
  27731. return node;
  27732. };
  27733. DocMeasure.prototype.measureColumns = function (node) {
  27734. var columns = node.columns;
  27735. node._gap = this.styleStack.getProperty('columnGap') || 0;
  27736. for (var i = 0, l = columns.length; i < l; i++) {
  27737. columns[i] = this.measureNode(columns[i]);
  27738. }
  27739. var measures = ColumnCalculator.measureMinMax(columns);
  27740. var numGaps = (columns.length > 0) ? (columns.length - 1) : 0;
  27741. node._minWidth = measures.min + node._gap * numGaps;
  27742. node._maxWidth = measures.max + node._gap * numGaps;
  27743. return node;
  27744. };
  27745. DocMeasure.prototype.measureTable = function (node) {
  27746. extendTableWidths(node);
  27747. node._layout = getLayout(this.tableLayouts);
  27748. node._offsets = getOffsets(node._layout);
  27749. var colSpans = [];
  27750. var col, row, cols, rows;
  27751. for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
  27752. var c = node.table.widths[col];
  27753. c._minWidth = 0;
  27754. c._maxWidth = 0;
  27755. for (row = 0, rows = node.table.body.length; row < rows; row++) {
  27756. var rowData = node.table.body[row];
  27757. var data = rowData[col];
  27758. if (data === undefined) {
  27759. console.error('Malformed table row ', rowData, 'in node ', node);
  27760. throw 'Malformed table row, a cell is undefined.';
  27761. }
  27762. if (data === null) { // transform to object
  27763. data = '';
  27764. }
  27765. if (!data._span) {
  27766. data = rowData[col] = this.styleStack.auto(data, measureCb(this, data));
  27767. if (data.colSpan && data.colSpan > 1) {
  27768. markSpans(rowData, col, data.colSpan);
  27769. colSpans.push({col: col, span: data.colSpan, minWidth: data._minWidth, maxWidth: data._maxWidth});
  27770. } else {
  27771. c._minWidth = Math.max(c._minWidth, data._minWidth);
  27772. c._maxWidth = Math.max(c._maxWidth, data._maxWidth);
  27773. }
  27774. }
  27775. if (data.rowSpan && data.rowSpan > 1) {
  27776. markVSpans(node.table, row, col, data.rowSpan);
  27777. }
  27778. }
  27779. }
  27780. extendWidthsForColSpans();
  27781. var measures = ColumnCalculator.measureMinMax(node.table.widths);
  27782. node._minWidth = measures.min + node._offsets.total;
  27783. node._maxWidth = measures.max + node._offsets.total;
  27784. return node;
  27785. function measureCb(_this, data) {
  27786. return function () {
  27787. if (data !== null && typeof data === 'object') {
  27788. data.fillColor = _this.styleStack.getProperty('fillColor');
  27789. }
  27790. return _this.measureNode(data);
  27791. };
  27792. }
  27793. function getLayout(tableLayouts) {
  27794. var layout = node.layout;
  27795. if (typeof node.layout === 'string' || node instanceof String) {
  27796. layout = tableLayouts[layout];
  27797. }
  27798. /*jshint unused: false */
  27799. var defaultLayout = {
  27800. hLineWidth: function (i, node) {
  27801. return 1;
  27802. },
  27803. vLineWidth: function (i, node) {
  27804. return 1;
  27805. },
  27806. hLineColor: function (i, node) {
  27807. return 'black';
  27808. },
  27809. vLineColor: function (i, node) {
  27810. return 'black';
  27811. },
  27812. paddingLeft: function (i, node) {
  27813. return 4;
  27814. },
  27815. paddingRight: function (i, node) {
  27816. return 4;
  27817. },
  27818. paddingTop: function (i, node) {
  27819. return 2;
  27820. },
  27821. paddingBottom: function (i, node) {
  27822. return 2;
  27823. },
  27824. fillColor: function (i, node) {
  27825. return null;
  27826. },
  27827. defaultBorder: true
  27828. };
  27829. return pack(defaultLayout, layout);
  27830. }
  27831. function getOffsets(layout) {
  27832. var offsets = [];
  27833. var totalOffset = 0;
  27834. var prevRightPadding = 0;
  27835. for (var i = 0, l = node.table.widths.length; i < l; i++) {
  27836. var lOffset = prevRightPadding + layout.vLineWidth(i, node) + layout.paddingLeft(i, node);
  27837. offsets.push(lOffset);
  27838. totalOffset += lOffset;
  27839. prevRightPadding = layout.paddingRight(i, node);
  27840. }
  27841. totalOffset += prevRightPadding + layout.vLineWidth(node.table.widths.length, node);
  27842. return {
  27843. total: totalOffset,
  27844. offsets: offsets
  27845. };
  27846. }
  27847. function extendWidthsForColSpans() {
  27848. var q, j;
  27849. for (var i = 0, l = colSpans.length; i < l; i++) {
  27850. var span = colSpans[i];
  27851. var currentMinMax = getMinMax(span.col, span.span, node._offsets);
  27852. var minDifference = span.minWidth - currentMinMax.minWidth;
  27853. var maxDifference = span.maxWidth - currentMinMax.maxWidth;
  27854. if (minDifference > 0) {
  27855. q = minDifference / span.span;
  27856. for (j = 0; j < span.span; j++) {
  27857. node.table.widths[span.col + j]._minWidth += q;
  27858. }
  27859. }
  27860. if (maxDifference > 0) {
  27861. q = maxDifference / span.span;
  27862. for (j = 0; j < span.span; j++) {
  27863. node.table.widths[span.col + j]._maxWidth += q;
  27864. }
  27865. }
  27866. }
  27867. }
  27868. function getMinMax(col, span, offsets) {
  27869. var result = {minWidth: 0, maxWidth: 0};
  27870. for (var i = 0; i < span; i++) {
  27871. result.minWidth += node.table.widths[col + i]._minWidth + (i ? offsets.offsets[col + i] : 0);
  27872. result.maxWidth += node.table.widths[col + i]._maxWidth + (i ? offsets.offsets[col + i] : 0);
  27873. }
  27874. return result;
  27875. }
  27876. function markSpans(rowData, col, span) {
  27877. for (var i = 1; i < span; i++) {
  27878. rowData[col + i] = {
  27879. _span: true,
  27880. _minWidth: 0,
  27881. _maxWidth: 0,
  27882. rowSpan: rowData[col].rowSpan
  27883. };
  27884. }
  27885. }
  27886. function markVSpans(table, row, col, span) {
  27887. for (var i = 1; i < span; i++) {
  27888. table.body[row + i][col] = {
  27889. _span: true,
  27890. _minWidth: 0,
  27891. _maxWidth: 0,
  27892. fillColor: table.body[row][col].fillColor
  27893. };
  27894. }
  27895. }
  27896. function extendTableWidths(node) {
  27897. if (!node.table.widths) {
  27898. node.table.widths = 'auto';
  27899. }
  27900. if (typeof node.table.widths === 'string' || node.table.widths instanceof String) {
  27901. node.table.widths = [node.table.widths];
  27902. while (node.table.widths.length < node.table.body[0].length) {
  27903. node.table.widths.push(node.table.widths[node.table.widths.length - 1]);
  27904. }
  27905. }
  27906. for (var i = 0, l = node.table.widths.length; i < l; i++) {
  27907. var w = node.table.widths[i];
  27908. if (typeof w === 'number' || w instanceof Number || typeof w === 'string' || w instanceof String) {
  27909. node.table.widths[i] = {width: w};
  27910. }
  27911. }
  27912. }
  27913. };
  27914. DocMeasure.prototype.measureCanvas = function (node) {
  27915. var w = 0, h = 0;
  27916. for (var i = 0, l = node.canvas.length; i < l; i++) {
  27917. var vector = node.canvas[i];
  27918. switch (vector.type) {
  27919. case 'ellipse':
  27920. w = Math.max(w, vector.x + vector.r1);
  27921. h = Math.max(h, vector.y + vector.r2);
  27922. break;
  27923. case 'rect':
  27924. w = Math.max(w, vector.x + vector.w);
  27925. h = Math.max(h, vector.y + vector.h);
  27926. break;
  27927. case 'line':
  27928. w = Math.max(w, vector.x1, vector.x2);
  27929. h = Math.max(h, vector.y1, vector.y2);
  27930. break;
  27931. case 'polyline':
  27932. for (var i2 = 0, l2 = vector.points.length; i2 < l2; i2++) {
  27933. w = Math.max(w, vector.points[i2].x);
  27934. h = Math.max(h, vector.points[i2].y);
  27935. }
  27936. break;
  27937. }
  27938. }
  27939. node._minWidth = node._maxWidth = w;
  27940. node._minHeight = node._maxHeight = h;
  27941. return node;
  27942. };
  27943. DocMeasure.prototype.measureQr = function (node) {
  27944. node = qrEncoder.measure(node);
  27945. node._alignment = this.styleStack.getProperty('alignment');
  27946. return node;
  27947. };
  27948. module.exports = DocMeasure;
  27949. /***/ }),
  27950. /* 15 */
  27951. /***/ (function(module, exports, __webpack_require__) {
  27952. /* jslint node: true */
  27953. 'use strict';
  27954. var LineBreaker = __webpack_require__(16);
  27955. var LEADING = /^(\s)+/g;
  27956. var TRAILING = /(\s)+$/g;
  27957. /**
  27958. * Creates an instance of TextTools - text measurement utility
  27959. *
  27960. * @constructor
  27961. * @param {FontProvider} fontProvider
  27962. */
  27963. function TextTools(fontProvider) {
  27964. this.fontProvider = fontProvider;
  27965. }
  27966. /**
  27967. * Converts an array of strings (or inline-definition-objects) into a collection
  27968. * of inlines and calculated minWidth/maxWidth.
  27969. * and their min/max widths
  27970. * @param {Object} textArray - an array of inline-definition-objects (or strings)
  27971. * @param {Object} styleContextStack current style stack
  27972. * @return {Object} collection of inlines, minWidth, maxWidth
  27973. */
  27974. TextTools.prototype.buildInlines = function (textArray, styleContextStack) {
  27975. var measured = measure(this.fontProvider, textArray, styleContextStack);
  27976. var minWidth = 0,
  27977. maxWidth = 0,
  27978. currentLineWidth;
  27979. measured.forEach(function (inline) {
  27980. minWidth = Math.max(minWidth, inline.width - inline.leadingCut - inline.trailingCut);
  27981. if (!currentLineWidth) {
  27982. currentLineWidth = {width: 0, leadingCut: inline.leadingCut, trailingCut: 0};
  27983. }
  27984. currentLineWidth.width += inline.width;
  27985. currentLineWidth.trailingCut = inline.trailingCut;
  27986. maxWidth = Math.max(maxWidth, getTrimmedWidth(currentLineWidth));
  27987. if (inline.lineEnd) {
  27988. currentLineWidth = null;
  27989. }
  27990. });
  27991. if (getStyleProperty({}, styleContextStack, 'noWrap', false)) {
  27992. minWidth = maxWidth;
  27993. }
  27994. return {
  27995. items: measured,
  27996. minWidth: minWidth,
  27997. maxWidth: maxWidth
  27998. };
  27999. function getTrimmedWidth(item) {
  28000. return Math.max(0, item.width - item.leadingCut - item.trailingCut);
  28001. }
  28002. };
  28003. /**
  28004. * Returns size of the specified string (without breaking it) using the current style
  28005. * @param {String} text text to be measured
  28006. * @param {Object} styleContextStack current style stack
  28007. * @return {Object} size of the specified string
  28008. */
  28009. TextTools.prototype.sizeOfString = function (text, styleContextStack) {
  28010. text = text ? text.toString().replace('\t', ' ') : '';
  28011. //TODO: refactor - extract from measure
  28012. var fontName = getStyleProperty({}, styleContextStack, 'font', 'Roboto');
  28013. var fontSize = getStyleProperty({}, styleContextStack, 'fontSize', 12);
  28014. var bold = getStyleProperty({}, styleContextStack, 'bold', false);
  28015. var italics = getStyleProperty({}, styleContextStack, 'italics', false);
  28016. var lineHeight = getStyleProperty({}, styleContextStack, 'lineHeight', 1);
  28017. var characterSpacing = getStyleProperty({}, styleContextStack, 'characterSpacing', 0);
  28018. var font = this.fontProvider.provideFont(fontName, bold, italics);
  28019. return {
  28020. width: widthOfString(text, font, fontSize, characterSpacing),
  28021. height: font.lineHeight(fontSize) * lineHeight,
  28022. fontSize: fontSize,
  28023. lineHeight: lineHeight,
  28024. ascender: font.ascender / 1000 * fontSize,
  28025. descender: font.descender / 1000 * fontSize
  28026. };
  28027. };
  28028. TextTools.prototype.widthOfString = function (text, font, fontSize, characterSpacing) {
  28029. return widthOfString(text, font, fontSize, characterSpacing);
  28030. };
  28031. function splitWords(text, noWrap) {
  28032. var results = [];
  28033. text = text.replace('\t', ' ');
  28034. if (noWrap) {
  28035. results.push({text: text});
  28036. return results;
  28037. }
  28038. var breaker = new LineBreaker(text);
  28039. var last = 0;
  28040. var bk;
  28041. while (bk = breaker.nextBreak()) {
  28042. var word = text.slice(last, bk.position);
  28043. if (bk.required || word.match(/\r?\n$|\r$/)) { // new line
  28044. word = word.replace(/\r?\n$|\r$/, '');
  28045. results.push({text: word, lineEnd: true});
  28046. } else {
  28047. results.push({text: word});
  28048. }
  28049. last = bk.position;
  28050. }
  28051. return results;
  28052. }
  28053. function copyStyle(source, destination) {
  28054. destination = destination || {};
  28055. source = source || {}; //TODO: default style
  28056. for (var key in source) {
  28057. if (key != 'text' && source.hasOwnProperty(key)) {
  28058. destination[key] = source[key];
  28059. }
  28060. }
  28061. return destination;
  28062. }
  28063. function normalizeTextArray(array, styleContextStack) {
  28064. var results = [];
  28065. if (!Array.isArray(array)) {
  28066. array = [array];
  28067. }
  28068. for (var i = 0, l = array.length; i < l; i++) {
  28069. var item = array[i];
  28070. var style = null;
  28071. var words;
  28072. var noWrap = getStyleProperty(item || {}, styleContextStack, 'noWrap', false);
  28073. if (item !== null && (typeof item === 'object' || item instanceof Object)) {
  28074. words = splitWords(normalizeString(item.text), noWrap);
  28075. style = copyStyle(item);
  28076. } else {
  28077. words = splitWords(normalizeString(item), noWrap);
  28078. }
  28079. for (var i2 = 0, l2 = words.length; i2 < l2; i2++) {
  28080. var result = {
  28081. text: words[i2].text
  28082. };
  28083. if (words[i2].lineEnd) {
  28084. result.lineEnd = true;
  28085. }
  28086. copyStyle(style, result);
  28087. results.push(result);
  28088. }
  28089. }
  28090. return results;
  28091. }
  28092. function normalizeString(value) {
  28093. if (value === undefined || value === null) {
  28094. return '';
  28095. } else if (typeof value === 'number') {
  28096. return value.toString();
  28097. } else if (typeof value === 'string' || value instanceof String) {
  28098. return value;
  28099. } else {
  28100. return value.toString();
  28101. }
  28102. }
  28103. function getStyleProperty(item, styleContextStack, property, defaultValue) {
  28104. var value;
  28105. if (item[property] !== undefined && item[property] !== null) {
  28106. // item defines this property
  28107. return item[property];
  28108. }
  28109. if (!styleContextStack) {
  28110. return defaultValue;
  28111. }
  28112. styleContextStack.auto(item, function () {
  28113. value = styleContextStack.getProperty(property);
  28114. });
  28115. if (value !== null && value !== undefined) {
  28116. return value;
  28117. } else {
  28118. return defaultValue;
  28119. }
  28120. }
  28121. function measure(fontProvider, textArray, styleContextStack) {
  28122. var normalized = normalizeTextArray(textArray, styleContextStack);
  28123. if (normalized.length) {
  28124. var leadingIndent = getStyleProperty(normalized[0], styleContextStack, 'leadingIndent', 0);
  28125. if (leadingIndent) {
  28126. normalized[0].leadingCut = -leadingIndent;
  28127. normalized[0].leadingIndent = leadingIndent;
  28128. }
  28129. }
  28130. normalized.forEach(function (item) {
  28131. var fontName = getStyleProperty(item, styleContextStack, 'font', 'Roboto');
  28132. var fontSize = getStyleProperty(item, styleContextStack, 'fontSize', 12);
  28133. var bold = getStyleProperty(item, styleContextStack, 'bold', false);
  28134. var italics = getStyleProperty(item, styleContextStack, 'italics', false);
  28135. var color = getStyleProperty(item, styleContextStack, 'color', 'black');
  28136. var decoration = getStyleProperty(item, styleContextStack, 'decoration', null);
  28137. var decorationColor = getStyleProperty(item, styleContextStack, 'decorationColor', null);
  28138. var decorationStyle = getStyleProperty(item, styleContextStack, 'decorationStyle', null);
  28139. var background = getStyleProperty(item, styleContextStack, 'background', null);
  28140. var lineHeight = getStyleProperty(item, styleContextStack, 'lineHeight', 1);
  28141. var characterSpacing = getStyleProperty(item, styleContextStack, 'characterSpacing', 0);
  28142. var link = getStyleProperty(item, styleContextStack, 'link', null);
  28143. var linkToPage = getStyleProperty(item, styleContextStack, 'linkToPage', null);
  28144. var noWrap = getStyleProperty(item, styleContextStack, 'noWrap', null);
  28145. var preserveLeadingSpaces = getStyleProperty(item, styleContextStack, 'preserveLeadingSpaces', false);
  28146. var font = fontProvider.provideFont(fontName, bold, italics);
  28147. item.width = widthOfString(item.text, font, fontSize, characterSpacing);
  28148. item.height = font.lineHeight(fontSize) * lineHeight;
  28149. var leadingSpaces = item.text.match(LEADING);
  28150. if (!item.leadingCut) {
  28151. item.leadingCut = 0;
  28152. }
  28153. if (leadingSpaces && !preserveLeadingSpaces) {
  28154. item.leadingCut += widthOfString(leadingSpaces[0], font, fontSize, characterSpacing);
  28155. }
  28156. var trailingSpaces = item.text.match(TRAILING);
  28157. if (trailingSpaces) {
  28158. item.trailingCut = widthOfString(trailingSpaces[0], font, fontSize, characterSpacing);
  28159. } else {
  28160. item.trailingCut = 0;
  28161. }
  28162. item.alignment = getStyleProperty(item, styleContextStack, 'alignment', 'left');
  28163. item.font = font;
  28164. item.fontSize = fontSize;
  28165. item.characterSpacing = characterSpacing;
  28166. item.color = color;
  28167. item.decoration = decoration;
  28168. item.decorationColor = decorationColor;
  28169. item.decorationStyle = decorationStyle;
  28170. item.background = background;
  28171. item.link = link;
  28172. item.linkToPage = linkToPage;
  28173. item.noWrap = noWrap;
  28174. });
  28175. return normalized;
  28176. }
  28177. function widthOfString(text, font, fontSize, characterSpacing) {
  28178. return font.widthOfString(text, fontSize) + ((characterSpacing || 0) * (text.length - 1));
  28179. }
  28180. /****TESTS**** (add a leading '/' to uncomment)
  28181. TextTools.prototype.splitWords = splitWords;
  28182. TextTools.prototype.normalizeTextArray = normalizeTextArray;
  28183. TextTools.prototype.measure = measure;
  28184. // */
  28185. module.exports = TextTools;
  28186. /***/ }),
  28187. /* 16 */
  28188. /***/ (function(module, exports, __webpack_require__) {
  28189. // Generated by CoffeeScript 1.7.1
  28190. (function() {
  28191. var AI, AL, BA, BK, CB, CI_BRK, CJ, CP_BRK, CR, DI_BRK, ID, IN_BRK, LF, LineBreaker, NL, NS, PR_BRK, SA, SG, SP, UnicodeTrie, WJ, XX, base64, characterClasses, classTrie, data, fs, pairTable, _ref, _ref1;
  28192. UnicodeTrie = __webpack_require__(17);
  28193. base64 = __webpack_require__(19);
  28194. _ref = __webpack_require__(20), BK = _ref.BK, CR = _ref.CR, LF = _ref.LF, NL = _ref.NL, CB = _ref.CB, BA = _ref.BA, SP = _ref.SP, WJ = _ref.WJ, SP = _ref.SP, BK = _ref.BK, LF = _ref.LF, NL = _ref.NL, AI = _ref.AI, AL = _ref.AL, SA = _ref.SA, SG = _ref.SG, XX = _ref.XX, CJ = _ref.CJ, ID = _ref.ID, NS = _ref.NS, characterClasses = _ref.characterClasses;
  28195. _ref1 = __webpack_require__(21), DI_BRK = _ref1.DI_BRK, IN_BRK = _ref1.IN_BRK, CI_BRK = _ref1.CI_BRK, CP_BRK = _ref1.CP_BRK, PR_BRK = _ref1.PR_BRK, pairTable = _ref1.pairTable;
  28196. data = base64.toByteArray("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");
  28197. classTrie = new UnicodeTrie(data);
  28198. LineBreaker = (function() {
  28199. var Break, mapClass, mapFirst;
  28200. function LineBreaker(string) {
  28201. this.string = string;
  28202. this.pos = 0;
  28203. this.lastPos = 0;
  28204. this.curClass = null;
  28205. this.nextClass = null;
  28206. }
  28207. LineBreaker.prototype.nextCodePoint = function() {
  28208. var code, next;
  28209. code = this.string.charCodeAt(this.pos++);
  28210. next = this.string.charCodeAt(this.pos);
  28211. if ((0xd800 <= code && code <= 0xdbff) && (0xdc00 <= next && next <= 0xdfff)) {
  28212. this.pos++;
  28213. return ((code - 0xd800) * 0x400) + (next - 0xdc00) + 0x10000;
  28214. }
  28215. return code;
  28216. };
  28217. mapClass = function(c) {
  28218. switch (c) {
  28219. case AI:
  28220. return AL;
  28221. case SA:
  28222. case SG:
  28223. case XX:
  28224. return AL;
  28225. case CJ:
  28226. return NS;
  28227. default:
  28228. return c;
  28229. }
  28230. };
  28231. mapFirst = function(c) {
  28232. switch (c) {
  28233. case LF:
  28234. case NL:
  28235. return BK;
  28236. case CB:
  28237. return BA;
  28238. case SP:
  28239. return WJ;
  28240. default:
  28241. return c;
  28242. }
  28243. };
  28244. LineBreaker.prototype.nextCharClass = function(first) {
  28245. if (first == null) {
  28246. first = false;
  28247. }
  28248. return mapClass(classTrie.get(this.nextCodePoint()));
  28249. };
  28250. Break = (function() {
  28251. function Break(position, required) {
  28252. this.position = position;
  28253. this.required = required != null ? required : false;
  28254. }
  28255. return Break;
  28256. })();
  28257. LineBreaker.prototype.nextBreak = function() {
  28258. var cur, lastClass, shouldBreak;
  28259. if (this.curClass == null) {
  28260. this.curClass = mapFirst(this.nextCharClass());
  28261. }
  28262. while (this.pos < this.string.length) {
  28263. this.lastPos = this.pos;
  28264. lastClass = this.nextClass;
  28265. this.nextClass = this.nextCharClass();
  28266. if (this.curClass === BK || (this.curClass === CR && this.nextClass !== LF)) {
  28267. this.curClass = mapFirst(mapClass(this.nextClass));
  28268. return new Break(this.lastPos, true);
  28269. }
  28270. cur = (function() {
  28271. switch (this.nextClass) {
  28272. case SP:
  28273. return this.curClass;
  28274. case BK:
  28275. case LF:
  28276. case NL:
  28277. return BK;
  28278. case CR:
  28279. return CR;
  28280. case CB:
  28281. return BA;
  28282. }
  28283. }).call(this);
  28284. if (cur != null) {
  28285. this.curClass = cur;
  28286. if (this.nextClass === CB) {
  28287. return new Break(this.lastPos);
  28288. }
  28289. continue;
  28290. }
  28291. shouldBreak = false;
  28292. switch (pairTable[this.curClass][this.nextClass]) {
  28293. case DI_BRK:
  28294. shouldBreak = true;
  28295. break;
  28296. case IN_BRK:
  28297. shouldBreak = lastClass === SP;
  28298. break;
  28299. case CI_BRK:
  28300. shouldBreak = lastClass === SP;
  28301. if (!shouldBreak) {
  28302. continue;
  28303. }
  28304. break;
  28305. case CP_BRK:
  28306. if (lastClass !== SP) {
  28307. continue;
  28308. }
  28309. }
  28310. this.curClass = this.nextClass;
  28311. if (shouldBreak) {
  28312. return new Break(this.lastPos);
  28313. }
  28314. }
  28315. if (this.pos >= this.string.length) {
  28316. if (this.lastPos < this.string.length) {
  28317. this.lastPos = this.string.length;
  28318. return new Break(this.string.length);
  28319. } else {
  28320. return null;
  28321. }
  28322. }
  28323. };
  28324. return LineBreaker;
  28325. })();
  28326. module.exports = LineBreaker;
  28327. }).call(this);
  28328. /***/ }),
  28329. /* 17 */
  28330. /***/ (function(module, exports, __webpack_require__) {
  28331. // Generated by CoffeeScript 1.7.1
  28332. var UnicodeTrie, inflate;
  28333. inflate = __webpack_require__(18);
  28334. UnicodeTrie = (function() {
  28335. var DATA_BLOCK_LENGTH, DATA_GRANULARITY, DATA_MASK, INDEX_1_OFFSET, INDEX_2_BLOCK_LENGTH, INDEX_2_BMP_LENGTH, INDEX_2_MASK, INDEX_SHIFT, LSCP_INDEX_2_LENGTH, LSCP_INDEX_2_OFFSET, OMITTED_BMP_INDEX_1_LENGTH, SHIFT_1, SHIFT_1_2, SHIFT_2, UTF8_2B_INDEX_2_LENGTH, UTF8_2B_INDEX_2_OFFSET;
  28336. SHIFT_1 = 6 + 5;
  28337. SHIFT_2 = 5;
  28338. SHIFT_1_2 = SHIFT_1 - SHIFT_2;
  28339. OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;
  28340. INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;
  28341. INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;
  28342. INDEX_SHIFT = 2;
  28343. DATA_BLOCK_LENGTH = 1 << SHIFT_2;
  28344. DATA_MASK = DATA_BLOCK_LENGTH - 1;
  28345. LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;
  28346. LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;
  28347. INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;
  28348. UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;
  28349. UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6;
  28350. INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;
  28351. DATA_GRANULARITY = 1 << INDEX_SHIFT;
  28352. function UnicodeTrie(data) {
  28353. var isBuffer, uncompressedLength, view;
  28354. isBuffer = typeof data.readUInt32BE === 'function' && typeof data.slice === 'function';
  28355. if (isBuffer || data instanceof Uint8Array) {
  28356. if (isBuffer) {
  28357. this.highStart = data.readUInt32BE(0);
  28358. this.errorValue = data.readUInt32BE(4);
  28359. uncompressedLength = data.readUInt32BE(8);
  28360. data = data.slice(12);
  28361. } else {
  28362. view = new DataView(data.buffer);
  28363. this.highStart = view.getUint32(0);
  28364. this.errorValue = view.getUint32(4);
  28365. uncompressedLength = view.getUint32(8);
  28366. data = data.subarray(12);
  28367. }
  28368. data = inflate(data, new Uint8Array(uncompressedLength));
  28369. data = inflate(data, new Uint8Array(uncompressedLength));
  28370. this.data = new Uint32Array(data.buffer);
  28371. } else {
  28372. this.data = data.data, this.highStart = data.highStart, this.errorValue = data.errorValue;
  28373. }
  28374. }
  28375. UnicodeTrie.prototype.get = function(codePoint) {
  28376. var index;
  28377. if (codePoint < 0 || codePoint > 0x10ffff) {
  28378. return this.errorValue;
  28379. }
  28380. if (codePoint < 0xd800 || (codePoint > 0xdbff && codePoint <= 0xffff)) {
  28381. index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);
  28382. return this.data[index];
  28383. }
  28384. if (codePoint <= 0xffff) {
  28385. index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);
  28386. return this.data[index];
  28387. }
  28388. if (codePoint < this.highStart) {
  28389. index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];
  28390. index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];
  28391. index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);
  28392. return this.data[index];
  28393. }
  28394. return this.data[this.data.length - DATA_GRANULARITY];
  28395. };
  28396. return UnicodeTrie;
  28397. })();
  28398. module.exports = UnicodeTrie;
  28399. /***/ }),
  28400. /* 18 */
  28401. /***/ (function(module, exports) {
  28402. var TINF_OK = 0;
  28403. var TINF_DATA_ERROR = -3;
  28404. function Tree() {
  28405. this.table = new Uint16Array(16); /* table of code length counts */
  28406. this.trans = new Uint16Array(288); /* code -> symbol translation table */
  28407. }
  28408. function Data(source, dest) {
  28409. this.source = source;
  28410. this.sourceIndex = 0;
  28411. this.tag = 0;
  28412. this.bitcount = 0;
  28413. this.dest = dest;
  28414. this.destLen = 0;
  28415. this.ltree = new Tree(); /* dynamic length/symbol tree */
  28416. this.dtree = new Tree(); /* dynamic distance tree */
  28417. }
  28418. /* --------------------------------------------------- *
  28419. * -- uninitialized global data (static structures) -- *
  28420. * --------------------------------------------------- */
  28421. var sltree = new Tree();
  28422. var sdtree = new Tree();
  28423. /* extra bits and base tables for length codes */
  28424. var length_bits = new Uint8Array(30);
  28425. var length_base = new Uint16Array(30);
  28426. /* extra bits and base tables for distance codes */
  28427. var dist_bits = new Uint8Array(30);
  28428. var dist_base = new Uint16Array(30);
  28429. /* special ordering of code length codes */
  28430. var clcidx = new Uint8Array([
  28431. 16, 17, 18, 0, 8, 7, 9, 6,
  28432. 10, 5, 11, 4, 12, 3, 13, 2,
  28433. 14, 1, 15
  28434. ]);
  28435. /* used by tinf_decode_trees, avoids allocations every call */
  28436. var code_tree = new Tree();
  28437. var lengths = new Uint8Array(288 + 32);
  28438. /* ----------------------- *
  28439. * -- utility functions -- *
  28440. * ----------------------- */
  28441. /* build extra bits and base tables */
  28442. function tinf_build_bits_base(bits, base, delta, first) {
  28443. var i, sum;
  28444. /* build bits table */
  28445. for (i = 0; i < delta; ++i) bits[i] = 0;
  28446. for (i = 0; i < 30 - delta; ++i) bits[i + delta] = i / delta | 0;
  28447. /* build base table */
  28448. for (sum = first, i = 0; i < 30; ++i) {
  28449. base[i] = sum;
  28450. sum += 1 << bits[i];
  28451. }
  28452. }
  28453. /* build the fixed huffman trees */
  28454. function tinf_build_fixed_trees(lt, dt) {
  28455. var i;
  28456. /* build fixed length tree */
  28457. for (i = 0; i < 7; ++i) lt.table[i] = 0;
  28458. lt.table[7] = 24;
  28459. lt.table[8] = 152;
  28460. lt.table[9] = 112;
  28461. for (i = 0; i < 24; ++i) lt.trans[i] = 256 + i;
  28462. for (i = 0; i < 144; ++i) lt.trans[24 + i] = i;
  28463. for (i = 0; i < 8; ++i) lt.trans[24 + 144 + i] = 280 + i;
  28464. for (i = 0; i < 112; ++i) lt.trans[24 + 144 + 8 + i] = 144 + i;
  28465. /* build fixed distance tree */
  28466. for (i = 0; i < 5; ++i) dt.table[i] = 0;
  28467. dt.table[5] = 32;
  28468. for (i = 0; i < 32; ++i) dt.trans[i] = i;
  28469. }
  28470. /* given an array of code lengths, build a tree */
  28471. var offs = new Uint16Array(16);
  28472. function tinf_build_tree(t, lengths, off, num) {
  28473. var i, sum;
  28474. /* clear code length count table */
  28475. for (i = 0; i < 16; ++i) t.table[i] = 0;
  28476. /* scan symbol lengths, and sum code length counts */
  28477. for (i = 0; i < num; ++i) t.table[lengths[off + i]]++;
  28478. t.table[0] = 0;
  28479. /* compute offset table for distribution sort */
  28480. for (sum = 0, i = 0; i < 16; ++i) {
  28481. offs[i] = sum;
  28482. sum += t.table[i];
  28483. }
  28484. /* create code->symbol translation table (symbols sorted by code) */
  28485. for (i = 0; i < num; ++i) {
  28486. if (lengths[off + i]) t.trans[offs[lengths[off + i]]++] = i;
  28487. }
  28488. }
  28489. /* ---------------------- *
  28490. * -- decode functions -- *
  28491. * ---------------------- */
  28492. /* get one bit from source stream */
  28493. function tinf_getbit(d) {
  28494. /* check if tag is empty */
  28495. if (!d.bitcount--) {
  28496. /* load next tag */
  28497. d.tag = d.source[d.sourceIndex++];
  28498. d.bitcount = 7;
  28499. }
  28500. /* shift bit out of tag */
  28501. var bit = d.tag & 1;
  28502. d.tag >>>= 1;
  28503. return bit;
  28504. }
  28505. /* read a num bit value from a stream and add base */
  28506. function tinf_read_bits(d, num, base) {
  28507. if (!num)
  28508. return base;
  28509. while (d.bitcount < 24) {
  28510. d.tag |= d.source[d.sourceIndex++] << d.bitcount;
  28511. d.bitcount += 8;
  28512. }
  28513. var val = d.tag & (0xffff >>> (16 - num));
  28514. d.tag >>>= num;
  28515. d.bitcount -= num;
  28516. return val + base;
  28517. }
  28518. /* given a data stream and a tree, decode a symbol */
  28519. function tinf_decode_symbol(d, t) {
  28520. while (d.bitcount < 24) {
  28521. d.tag |= d.source[d.sourceIndex++] << d.bitcount;
  28522. d.bitcount += 8;
  28523. }
  28524. var sum = 0, cur = 0, len = 0;
  28525. var tag = d.tag;
  28526. /* get more bits while code value is above sum */
  28527. do {
  28528. cur = 2 * cur + (tag & 1);
  28529. tag >>>= 1;
  28530. ++len;
  28531. sum += t.table[len];
  28532. cur -= t.table[len];
  28533. } while (cur >= 0);
  28534. d.tag = tag;
  28535. d.bitcount -= len;
  28536. return t.trans[sum + cur];
  28537. }
  28538. /* given a data stream, decode dynamic trees from it */
  28539. function tinf_decode_trees(d, lt, dt) {
  28540. var hlit, hdist, hclen;
  28541. var i, num, length;
  28542. /* get 5 bits HLIT (257-286) */
  28543. hlit = tinf_read_bits(d, 5, 257);
  28544. /* get 5 bits HDIST (1-32) */
  28545. hdist = tinf_read_bits(d, 5, 1);
  28546. /* get 4 bits HCLEN (4-19) */
  28547. hclen = tinf_read_bits(d, 4, 4);
  28548. for (i = 0; i < 19; ++i) lengths[i] = 0;
  28549. /* read code lengths for code length alphabet */
  28550. for (i = 0; i < hclen; ++i) {
  28551. /* get 3 bits code length (0-7) */
  28552. var clen = tinf_read_bits(d, 3, 0);
  28553. lengths[clcidx[i]] = clen;
  28554. }
  28555. /* build code length tree */
  28556. tinf_build_tree(code_tree, lengths, 0, 19);
  28557. /* decode code lengths for the dynamic trees */
  28558. for (num = 0; num < hlit + hdist;) {
  28559. var sym = tinf_decode_symbol(d, code_tree);
  28560. switch (sym) {
  28561. case 16:
  28562. /* copy previous code length 3-6 times (read 2 bits) */
  28563. var prev = lengths[num - 1];
  28564. for (length = tinf_read_bits(d, 2, 3); length; --length) {
  28565. lengths[num++] = prev;
  28566. }
  28567. break;
  28568. case 17:
  28569. /* repeat code length 0 for 3-10 times (read 3 bits) */
  28570. for (length = tinf_read_bits(d, 3, 3); length; --length) {
  28571. lengths[num++] = 0;
  28572. }
  28573. break;
  28574. case 18:
  28575. /* repeat code length 0 for 11-138 times (read 7 bits) */
  28576. for (length = tinf_read_bits(d, 7, 11); length; --length) {
  28577. lengths[num++] = 0;
  28578. }
  28579. break;
  28580. default:
  28581. /* values 0-15 represent the actual code lengths */
  28582. lengths[num++] = sym;
  28583. break;
  28584. }
  28585. }
  28586. /* build dynamic trees */
  28587. tinf_build_tree(lt, lengths, 0, hlit);
  28588. tinf_build_tree(dt, lengths, hlit, hdist);
  28589. }
  28590. /* ----------------------------- *
  28591. * -- block inflate functions -- *
  28592. * ----------------------------- */
  28593. /* given a stream and two trees, inflate a block of data */
  28594. function tinf_inflate_block_data(d, lt, dt) {
  28595. while (1) {
  28596. var sym = tinf_decode_symbol(d, lt);
  28597. /* check for end of block */
  28598. if (sym === 256) {
  28599. return TINF_OK;
  28600. }
  28601. if (sym < 256) {
  28602. d.dest[d.destLen++] = sym;
  28603. } else {
  28604. var length, dist, offs;
  28605. var i;
  28606. sym -= 257;
  28607. /* possibly get more bits from length code */
  28608. length = tinf_read_bits(d, length_bits[sym], length_base[sym]);
  28609. dist = tinf_decode_symbol(d, dt);
  28610. /* possibly get more bits from distance code */
  28611. offs = d.destLen - tinf_read_bits(d, dist_bits[dist], dist_base[dist]);
  28612. /* copy match */
  28613. for (i = offs; i < offs + length; ++i) {
  28614. d.dest[d.destLen++] = d.dest[i];
  28615. }
  28616. }
  28617. }
  28618. }
  28619. /* inflate an uncompressed block of data */
  28620. function tinf_inflate_uncompressed_block(d) {
  28621. var length, invlength;
  28622. var i;
  28623. /* unread from bitbuffer */
  28624. while (d.bitcount > 8) {
  28625. d.sourceIndex--;
  28626. d.bitcount -= 8;
  28627. }
  28628. /* get length */
  28629. length = d.source[d.sourceIndex + 1];
  28630. length = 256 * length + d.source[d.sourceIndex];
  28631. /* get one's complement of length */
  28632. invlength = d.source[d.sourceIndex + 3];
  28633. invlength = 256 * invlength + d.source[d.sourceIndex + 2];
  28634. /* check length */
  28635. if (length !== (~invlength & 0x0000ffff))
  28636. return TINF_DATA_ERROR;
  28637. d.sourceIndex += 4;
  28638. /* copy block */
  28639. for (i = length; i; --i)
  28640. d.dest[d.destLen++] = d.source[d.sourceIndex++];
  28641. /* make sure we start next block on a byte boundary */
  28642. d.bitcount = 0;
  28643. return TINF_OK;
  28644. }
  28645. /* inflate stream from source to dest */
  28646. function tinf_uncompress(source, dest) {
  28647. var d = new Data(source, dest);
  28648. var bfinal, btype, res;
  28649. do {
  28650. /* read final block flag */
  28651. bfinal = tinf_getbit(d);
  28652. /* read block type (2 bits) */
  28653. btype = tinf_read_bits(d, 2, 0);
  28654. /* decompress block */
  28655. switch (btype) {
  28656. case 0:
  28657. /* decompress uncompressed block */
  28658. res = tinf_inflate_uncompressed_block(d);
  28659. break;
  28660. case 1:
  28661. /* decompress block with fixed huffman trees */
  28662. res = tinf_inflate_block_data(d, sltree, sdtree);
  28663. break;
  28664. case 2:
  28665. /* decompress block with dynamic huffman trees */
  28666. tinf_decode_trees(d, d.ltree, d.dtree);
  28667. res = tinf_inflate_block_data(d, d.ltree, d.dtree);
  28668. break;
  28669. default:
  28670. res = TINF_DATA_ERROR;
  28671. }
  28672. if (res !== TINF_OK)
  28673. throw new Error('Data error');
  28674. } while (!bfinal);
  28675. if (d.destLen < d.dest.length) {
  28676. if (typeof d.dest.slice === 'function')
  28677. return d.dest.slice(0, d.destLen);
  28678. else
  28679. return d.dest.subarray(0, d.destLen);
  28680. }
  28681. return d.dest;
  28682. }
  28683. /* -------------------- *
  28684. * -- initialization -- *
  28685. * -------------------- */
  28686. /* build fixed huffman trees */
  28687. tinf_build_fixed_trees(sltree, sdtree);
  28688. /* build extra bits and base tables */
  28689. tinf_build_bits_base(length_bits, length_base, 4, 3);
  28690. tinf_build_bits_base(dist_bits, dist_base, 2, 1);
  28691. /* fix a special case */
  28692. length_bits[28] = 0;
  28693. length_base[28] = 258;
  28694. module.exports = tinf_uncompress;
  28695. /***/ }),
  28696. /* 19 */
  28697. /***/ (function(module, exports, __webpack_require__) {
  28698. var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  28699. ;(function (exports) {
  28700. 'use strict';
  28701. var Arr = (typeof Uint8Array !== 'undefined')
  28702. ? Uint8Array
  28703. : Array
  28704. var PLUS = '+'.charCodeAt(0)
  28705. var SLASH = '/'.charCodeAt(0)
  28706. var NUMBER = '0'.charCodeAt(0)
  28707. var LOWER = 'a'.charCodeAt(0)
  28708. var UPPER = 'A'.charCodeAt(0)
  28709. var PLUS_URL_SAFE = '-'.charCodeAt(0)
  28710. var SLASH_URL_SAFE = '_'.charCodeAt(0)
  28711. function decode (elt) {
  28712. var code = elt.charCodeAt(0)
  28713. if (code === PLUS ||
  28714. code === PLUS_URL_SAFE)
  28715. return 62 // '+'
  28716. if (code === SLASH ||
  28717. code === SLASH_URL_SAFE)
  28718. return 63 // '/'
  28719. if (code < NUMBER)
  28720. return -1 //no match
  28721. if (code < NUMBER + 10)
  28722. return code - NUMBER + 26 + 26
  28723. if (code < UPPER + 26)
  28724. return code - UPPER
  28725. if (code < LOWER + 26)
  28726. return code - LOWER + 26
  28727. }
  28728. function b64ToByteArray (b64) {
  28729. var i, j, l, tmp, placeHolders, arr
  28730. if (b64.length % 4 > 0) {
  28731. throw new Error('Invalid string. Length must be a multiple of 4')
  28732. }
  28733. // the number of equal signs (place holders)
  28734. // if there are two placeholders, than the two characters before it
  28735. // represent one byte
  28736. // if there is only one, then the three characters before it represent 2 bytes
  28737. // this is just a cheap hack to not do indexOf twice
  28738. var len = b64.length
  28739. placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
  28740. // base64 is 4/3 + up to two characters of the original data
  28741. arr = new Arr(b64.length * 3 / 4 - placeHolders)
  28742. // if there are placeholders, only get up to the last complete 4 chars
  28743. l = placeHolders > 0 ? b64.length - 4 : b64.length
  28744. var L = 0
  28745. function push (v) {
  28746. arr[L++] = v
  28747. }
  28748. for (i = 0, j = 0; i < l; i += 4, j += 3) {
  28749. tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
  28750. push((tmp & 0xFF0000) >> 16)
  28751. push((tmp & 0xFF00) >> 8)
  28752. push(tmp & 0xFF)
  28753. }
  28754. if (placeHolders === 2) {
  28755. tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
  28756. push(tmp & 0xFF)
  28757. } else if (placeHolders === 1) {
  28758. tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
  28759. push((tmp >> 8) & 0xFF)
  28760. push(tmp & 0xFF)
  28761. }
  28762. return arr
  28763. }
  28764. function uint8ToBase64 (uint8) {
  28765. var i,
  28766. extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
  28767. output = "",
  28768. temp, length
  28769. function encode (num) {
  28770. return lookup.charAt(num)
  28771. }
  28772. function tripletToBase64 (num) {
  28773. return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
  28774. }
  28775. // go through the array every three bytes, we'll deal with trailing stuff later
  28776. for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
  28777. temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
  28778. output += tripletToBase64(temp)
  28779. }
  28780. // pad the end with zeros, but make sure to not forget the extra bytes
  28781. switch (extraBytes) {
  28782. case 1:
  28783. temp = uint8[uint8.length - 1]
  28784. output += encode(temp >> 2)
  28785. output += encode((temp << 4) & 0x3F)
  28786. output += '=='
  28787. break
  28788. case 2:
  28789. temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
  28790. output += encode(temp >> 10)
  28791. output += encode((temp >> 4) & 0x3F)
  28792. output += encode((temp << 2) & 0x3F)
  28793. output += '='
  28794. break
  28795. }
  28796. return output
  28797. }
  28798. exports.toByteArray = b64ToByteArray
  28799. exports.fromByteArray = uint8ToBase64
  28800. }( false ? (this.base64js = {}) : exports))
  28801. /***/ }),
  28802. /* 20 */
  28803. /***/ (function(module, exports) {
  28804. // Generated by CoffeeScript 1.7.1
  28805. (function() {
  28806. var AI, AL, B2, BA, BB, BK, CB, CJ, CL, CM, CP, CR, EX, GL, H2, H3, HL, HY, ID, IN, IS, JL, JT, JV, LF, NL, NS, NU, OP, PO, PR, QU, RI, SA, SG, SP, SY, WJ, XX, ZW;
  28807. exports.OP = OP = 0;
  28808. exports.CL = CL = 1;
  28809. exports.CP = CP = 2;
  28810. exports.QU = QU = 3;
  28811. exports.GL = GL = 4;
  28812. exports.NS = NS = 5;
  28813. exports.EX = EX = 6;
  28814. exports.SY = SY = 7;
  28815. exports.IS = IS = 8;
  28816. exports.PR = PR = 9;
  28817. exports.PO = PO = 10;
  28818. exports.NU = NU = 11;
  28819. exports.AL = AL = 12;
  28820. exports.HL = HL = 13;
  28821. exports.ID = ID = 14;
  28822. exports.IN = IN = 15;
  28823. exports.HY = HY = 16;
  28824. exports.BA = BA = 17;
  28825. exports.BB = BB = 18;
  28826. exports.B2 = B2 = 19;
  28827. exports.ZW = ZW = 20;
  28828. exports.CM = CM = 21;
  28829. exports.WJ = WJ = 22;
  28830. exports.H2 = H2 = 23;
  28831. exports.H3 = H3 = 24;
  28832. exports.JL = JL = 25;
  28833. exports.JV = JV = 26;
  28834. exports.JT = JT = 27;
  28835. exports.RI = RI = 28;
  28836. exports.AI = AI = 29;
  28837. exports.BK = BK = 30;
  28838. exports.CB = CB = 31;
  28839. exports.CJ = CJ = 32;
  28840. exports.CR = CR = 33;
  28841. exports.LF = LF = 34;
  28842. exports.NL = NL = 35;
  28843. exports.SA = SA = 36;
  28844. exports.SG = SG = 37;
  28845. exports.SP = SP = 38;
  28846. exports.XX = XX = 39;
  28847. }).call(this);
  28848. /***/ }),
  28849. /* 21 */
  28850. /***/ (function(module, exports) {
  28851. // Generated by CoffeeScript 1.7.1
  28852. (function() {
  28853. var CI_BRK, CP_BRK, DI_BRK, IN_BRK, PR_BRK;
  28854. exports.DI_BRK = DI_BRK = 0;
  28855. exports.IN_BRK = IN_BRK = 1;
  28856. exports.CI_BRK = CI_BRK = 2;
  28857. exports.CP_BRK = CP_BRK = 3;
  28858. exports.PR_BRK = PR_BRK = 4;
  28859. exports.pairTable = [[PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, CP_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, DI_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, DI_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, PR_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK], [IN_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, IN_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, DI_BRK], [DI_BRK, PR_BRK, PR_BRK, IN_BRK, IN_BRK, IN_BRK, PR_BRK, PR_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK, IN_BRK, DI_BRK, DI_BRK, PR_BRK, CI_BRK, PR_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, DI_BRK, IN_BRK]];
  28860. }).call(this);
  28861. /***/ }),
  28862. /* 22 */
  28863. /***/ (function(module, exports) {
  28864. /* jslint node: true */
  28865. 'use strict';
  28866. /**
  28867. * Creates an instance of StyleContextStack used for style inheritance and style overrides
  28868. *
  28869. * @constructor
  28870. * @this {StyleContextStack}
  28871. * @param {Object} named styles dictionary
  28872. * @param {Object} optional default style definition
  28873. */
  28874. function StyleContextStack(styleDictionary, defaultStyle) {
  28875. this.defaultStyle = defaultStyle || {};
  28876. this.styleDictionary = styleDictionary;
  28877. this.styleOverrides = [];
  28878. }
  28879. /**
  28880. * Creates cloned version of current stack
  28881. * @return {StyleContextStack} current stack snapshot
  28882. */
  28883. StyleContextStack.prototype.clone = function () {
  28884. var stack = new StyleContextStack(this.styleDictionary, this.defaultStyle);
  28885. this.styleOverrides.forEach(function (item) {
  28886. stack.styleOverrides.push(item);
  28887. });
  28888. return stack;
  28889. };
  28890. /**
  28891. * Pushes style-name or style-overrides-object onto the stack for future evaluation
  28892. *
  28893. * @param {String|Object} styleNameOrOverride style-name (referring to styleDictionary) or
  28894. * a new dictionary defining overriding properties
  28895. */
  28896. StyleContextStack.prototype.push = function (styleNameOrOverride) {
  28897. this.styleOverrides.push(styleNameOrOverride);
  28898. };
  28899. /**
  28900. * Removes last style-name or style-overrides-object from the stack
  28901. *
  28902. * @param {Number} howMany - optional number of elements to be popped (if not specified,
  28903. * one element will be removed from the stack)
  28904. */
  28905. StyleContextStack.prototype.pop = function (howMany) {
  28906. howMany = howMany || 1;
  28907. while (howMany-- > 0) {
  28908. this.styleOverrides.pop();
  28909. }
  28910. };
  28911. /**
  28912. * Creates a set of named styles or/and a style-overrides-object based on the item,
  28913. * pushes those elements onto the stack for future evaluation and returns the number
  28914. * of elements pushed, so they can be easily poped then.
  28915. *
  28916. * @param {Object} item - an object with optional style property and/or style overrides
  28917. * @return the number of items pushed onto the stack
  28918. */
  28919. StyleContextStack.prototype.autopush = function (item) {
  28920. if (typeof item === 'string' || item instanceof String) {
  28921. return 0;
  28922. }
  28923. var styleNames = [];
  28924. if (item.style) {
  28925. if (Array.isArray(item.style)) {
  28926. styleNames = item.style;
  28927. } else {
  28928. styleNames = [item.style];
  28929. }
  28930. }
  28931. for (var i = 0, l = styleNames.length; i < l; i++) {
  28932. this.push(styleNames[i]);
  28933. }
  28934. var styleOverrideObject = {};
  28935. var pushSOO = false;
  28936. [
  28937. 'font',
  28938. 'fontSize',
  28939. 'bold',
  28940. 'italics',
  28941. 'alignment',
  28942. 'color',
  28943. 'columnGap',
  28944. 'fillColor',
  28945. 'decoration',
  28946. 'decorationStyle',
  28947. 'decorationColor',
  28948. 'background',
  28949. 'lineHeight',
  28950. 'characterSpacing',
  28951. 'noWrap',
  28952. 'markerColor',
  28953. 'leadingIndent'
  28954. //'tableCellPadding'
  28955. // 'cellBorder',
  28956. // 'headerCellBorder',
  28957. // 'oddRowCellBorder',
  28958. // 'evenRowCellBorder',
  28959. // 'tableBorder'
  28960. ].forEach(function (key) {
  28961. if (item[key] !== undefined && item[key] !== null) {
  28962. styleOverrideObject[key] = item[key];
  28963. pushSOO = true;
  28964. }
  28965. });
  28966. if (pushSOO) {
  28967. this.push(styleOverrideObject);
  28968. }
  28969. return styleNames.length + (pushSOO ? 1 : 0);
  28970. };
  28971. /**
  28972. * Automatically pushes elements onto the stack, using autopush based on item,
  28973. * executes callback and then pops elements back. Returns value returned by callback
  28974. *
  28975. * @param {Object} item - an object with optional style property and/or style overrides
  28976. * @param {Function} function to be called between autopush and pop
  28977. * @return {Object} value returned by callback
  28978. */
  28979. StyleContextStack.prototype.auto = function (item, callback) {
  28980. var pushedItems = this.autopush(item);
  28981. var result = callback();
  28982. if (pushedItems > 0) {
  28983. this.pop(pushedItems);
  28984. }
  28985. return result;
  28986. };
  28987. /**
  28988. * Evaluates stack and returns value of a named property
  28989. *
  28990. * @param {String} property - property name
  28991. * @return property value or null if not found
  28992. */
  28993. StyleContextStack.prototype.getProperty = function (property) {
  28994. if (this.styleOverrides) {
  28995. for (var i = this.styleOverrides.length - 1; i >= 0; i--) {
  28996. var item = this.styleOverrides[i];
  28997. if (typeof item === 'string' || item instanceof String) {
  28998. // named-style-override
  28999. var style = this.styleDictionary[item];
  29000. if (style && style[property] !== null && style[property] !== undefined) {
  29001. return style[property];
  29002. }
  29003. } else {
  29004. // style-overrides-object
  29005. if (item[property] !== undefined && item[property] !== null) {
  29006. return item[property];
  29007. }
  29008. }
  29009. }
  29010. }
  29011. return this.defaultStyle && this.defaultStyle[property];
  29012. };
  29013. module.exports = StyleContextStack;
  29014. /***/ }),
  29015. /* 23 */
  29016. /***/ (function(module, exports) {
  29017. /* jslint node: true */
  29018. 'use strict';
  29019. function buildColumnWidths(columns, availableWidth) {
  29020. var autoColumns = [],
  29021. autoMin = 0, autoMax = 0,
  29022. starColumns = [],
  29023. starMaxMin = 0,
  29024. starMaxMax = 0,
  29025. fixedColumns = [],
  29026. initial_availableWidth = availableWidth;
  29027. columns.forEach(function (column) {
  29028. if (isAutoColumn(column)) {
  29029. autoColumns.push(column);
  29030. autoMin += column._minWidth;
  29031. autoMax += column._maxWidth;
  29032. } else if (isStarColumn(column)) {
  29033. starColumns.push(column);
  29034. starMaxMin = Math.max(starMaxMin, column._minWidth);
  29035. starMaxMax = Math.max(starMaxMax, column._maxWidth);
  29036. } else {
  29037. fixedColumns.push(column);
  29038. }
  29039. });
  29040. fixedColumns.forEach(function (col) {
  29041. // width specified as %
  29042. if (typeof col.width === 'string' && /\d+%/.test(col.width)) {
  29043. col.width = parseFloat(col.width) * initial_availableWidth / 100;
  29044. }
  29045. if (col.width < (col._minWidth) && col.elasticWidth) {
  29046. col._calcWidth = col._minWidth;
  29047. } else {
  29048. col._calcWidth = col.width;
  29049. }
  29050. availableWidth -= col._calcWidth;
  29051. });
  29052. // http://www.freesoft.org/CIE/RFC/1942/18.htm
  29053. // http://www.w3.org/TR/CSS2/tables.html#width-layout
  29054. // http://dev.w3.org/csswg/css3-tables-algorithms/Overview.src.htm
  29055. var minW = autoMin + starMaxMin * starColumns.length;
  29056. var maxW = autoMax + starMaxMax * starColumns.length;
  29057. if (minW >= availableWidth) {
  29058. // case 1 - there's no way to fit all columns within available width
  29059. // that's actually pretty bad situation with PDF as we have no horizontal scroll
  29060. // no easy workaround (unless we decide, in the future, to split single words)
  29061. // currently we simply use minWidths for all columns
  29062. autoColumns.forEach(function (col) {
  29063. col._calcWidth = col._minWidth;
  29064. });
  29065. starColumns.forEach(function (col) {
  29066. col._calcWidth = starMaxMin; // starMaxMin already contains padding
  29067. });
  29068. } else {
  29069. if (maxW < availableWidth) {
  29070. // case 2 - we can fit rest of the table within available space
  29071. autoColumns.forEach(function (col) {
  29072. col._calcWidth = col._maxWidth;
  29073. availableWidth -= col._calcWidth;
  29074. });
  29075. } else {
  29076. // maxW is too large, but minW fits within available width
  29077. var W = availableWidth - minW;
  29078. var D = maxW - minW;
  29079. autoColumns.forEach(function (col) {
  29080. var d = col._maxWidth - col._minWidth;
  29081. col._calcWidth = col._minWidth + d * W / D;
  29082. availableWidth -= col._calcWidth;
  29083. });
  29084. }
  29085. if (starColumns.length > 0) {
  29086. var starSize = availableWidth / starColumns.length;
  29087. starColumns.forEach(function (col) {
  29088. col._calcWidth = starSize;
  29089. });
  29090. }
  29091. }
  29092. }
  29093. function isAutoColumn(column) {
  29094. return column.width === 'auto';
  29095. }
  29096. function isStarColumn(column) {
  29097. return column.width === null || column.width === undefined || column.width === '*' || column.width === 'star';
  29098. }
  29099. //TODO: refactor and reuse in measureTable
  29100. function measureMinMax(columns) {
  29101. var result = {min: 0, max: 0};
  29102. var maxStar = {min: 0, max: 0};
  29103. var starCount = 0;
  29104. for (var i = 0, l = columns.length; i < l; i++) {
  29105. var c = columns[i];
  29106. if (isStarColumn(c)) {
  29107. maxStar.min = Math.max(maxStar.min, c._minWidth);
  29108. maxStar.max = Math.max(maxStar.max, c._maxWidth);
  29109. starCount++;
  29110. } else if (isAutoColumn(c)) {
  29111. result.min += c._minWidth;
  29112. result.max += c._maxWidth;
  29113. } else {
  29114. result.min += ((c.width !== undefined && c.width) || c._minWidth);
  29115. result.max += ((c.width !== undefined && c.width) || c._maxWidth);
  29116. }
  29117. }
  29118. if (starCount) {
  29119. result.min += starCount * maxStar.min;
  29120. result.max += starCount * maxStar.max;
  29121. }
  29122. return result;
  29123. }
  29124. /**
  29125. * Calculates column widths
  29126. * @private
  29127. */
  29128. module.exports = {
  29129. buildColumnWidths: buildColumnWidths,
  29130. measureMinMax: measureMinMax,
  29131. isAutoColumn: isAutoColumn,
  29132. isStarColumn: isStarColumn
  29133. };
  29134. /***/ }),
  29135. /* 24 */
  29136. /***/ (function(module, exports) {
  29137. /* jslint node: true */
  29138. 'use strict';
  29139. /*jshint -W004 */
  29140. /* qr.js -- QR code generator in Javascript (revision 2011-01-19)
  29141. * Written by Kang Seonghoon <public+qrjs@mearie.org>.
  29142. *
  29143. * This source code is in the public domain; if your jurisdiction does not
  29144. * recognize the public domain the terms of Creative Commons CC0 license
  29145. * apply. In the other words, you can always do what you want.
  29146. */
  29147. // per-version information (cf. JIS X 0510:2004 pp. 30--36, 71)
  29148. //
  29149. // [0]: the degree of generator polynomial by ECC levels
  29150. // [1]: # of code blocks by ECC levels
  29151. // [2]: left-top positions of alignment patterns
  29152. //
  29153. // the number in this table (in particular, [0]) does not exactly match with
  29154. // the numbers in the specficiation. see augumenteccs below for the reason.
  29155. var VERSIONS = [
  29156. null,
  29157. [[10, 7, 17, 13], [1, 1, 1, 1], []],
  29158. [[16, 10, 28, 22], [1, 1, 1, 1], [4, 16]],
  29159. [[26, 15, 22, 18], [1, 1, 2, 2], [4, 20]],
  29160. [[18, 20, 16, 26], [2, 1, 4, 2], [4, 24]],
  29161. [[24, 26, 22, 18], [2, 1, 4, 4], [4, 28]],
  29162. [[16, 18, 28, 24], [4, 2, 4, 4], [4, 32]],
  29163. [[18, 20, 26, 18], [4, 2, 5, 6], [4, 20, 36]],
  29164. [[22, 24, 26, 22], [4, 2, 6, 6], [4, 22, 40]],
  29165. [[22, 30, 24, 20], [5, 2, 8, 8], [4, 24, 44]],
  29166. [[26, 18, 28, 24], [5, 4, 8, 8], [4, 26, 48]],
  29167. [[30, 20, 24, 28], [5, 4, 11, 8], [4, 28, 52]],
  29168. [[22, 24, 28, 26], [8, 4, 11, 10], [4, 30, 56]],
  29169. [[22, 26, 22, 24], [9, 4, 16, 12], [4, 32, 60]],
  29170. [[24, 30, 24, 20], [9, 4, 16, 16], [4, 24, 44, 64]],
  29171. [[24, 22, 24, 30], [10, 6, 18, 12], [4, 24, 46, 68]],
  29172. [[28, 24, 30, 24], [10, 6, 16, 17], [4, 24, 48, 72]],
  29173. [[28, 28, 28, 28], [11, 6, 19, 16], [4, 28, 52, 76]],
  29174. [[26, 30, 28, 28], [13, 6, 21, 18], [4, 28, 54, 80]],
  29175. [[26, 28, 26, 26], [14, 7, 25, 21], [4, 28, 56, 84]],
  29176. [[26, 28, 28, 30], [16, 8, 25, 20], [4, 32, 60, 88]],
  29177. [[26, 28, 30, 28], [17, 8, 25, 23], [4, 26, 48, 70, 92]],
  29178. [[28, 28, 24, 30], [17, 9, 34, 23], [4, 24, 48, 72, 96]],
  29179. [[28, 30, 30, 30], [18, 9, 30, 25], [4, 28, 52, 76, 100]],
  29180. [[28, 30, 30, 30], [20, 10, 32, 27], [4, 26, 52, 78, 104]],
  29181. [[28, 26, 30, 30], [21, 12, 35, 29], [4, 30, 56, 82, 108]],
  29182. [[28, 28, 30, 28], [23, 12, 37, 34], [4, 28, 56, 84, 112]],
  29183. [[28, 30, 30, 30], [25, 12, 40, 34], [4, 32, 60, 88, 116]],
  29184. [[28, 30, 30, 30], [26, 13, 42, 35], [4, 24, 48, 72, 96, 120]],
  29185. [[28, 30, 30, 30], [28, 14, 45, 38], [4, 28, 52, 76, 100, 124]],
  29186. [[28, 30, 30, 30], [29, 15, 48, 40], [4, 24, 50, 76, 102, 128]],
  29187. [[28, 30, 30, 30], [31, 16, 51, 43], [4, 28, 54, 80, 106, 132]],
  29188. [[28, 30, 30, 30], [33, 17, 54, 45], [4, 32, 58, 84, 110, 136]],
  29189. [[28, 30, 30, 30], [35, 18, 57, 48], [4, 28, 56, 84, 112, 140]],
  29190. [[28, 30, 30, 30], [37, 19, 60, 51], [4, 32, 60, 88, 116, 144]],
  29191. [[28, 30, 30, 30], [38, 19, 63, 53], [4, 28, 52, 76, 100, 124, 148]],
  29192. [[28, 30, 30, 30], [40, 20, 66, 56], [4, 22, 48, 74, 100, 126, 152]],
  29193. [[28, 30, 30, 30], [43, 21, 70, 59], [4, 26, 52, 78, 104, 130, 156]],
  29194. [[28, 30, 30, 30], [45, 22, 74, 62], [4, 30, 56, 82, 108, 134, 160]],
  29195. [[28, 30, 30, 30], [47, 24, 77, 65], [4, 24, 52, 80, 108, 136, 164]],
  29196. [[28, 30, 30, 30], [49, 25, 81, 68], [4, 28, 56, 84, 112, 140, 168]]];
  29197. // mode constants (cf. Table 2 in JIS X 0510:2004 p. 16)
  29198. var MODE_TERMINATOR = 0;
  29199. var MODE_NUMERIC = 1, MODE_ALPHANUMERIC = 2, MODE_OCTET = 4, MODE_KANJI = 8;
  29200. // validation regexps
  29201. var NUMERIC_REGEXP = /^\d*$/;
  29202. var ALPHANUMERIC_REGEXP = /^[A-Za-z0-9 $%*+\-./:]*$/;
  29203. var ALPHANUMERIC_OUT_REGEXP = /^[A-Z0-9 $%*+\-./:]*$/;
  29204. // ECC levels (cf. Table 22 in JIS X 0510:2004 p. 45)
  29205. var ECCLEVEL_L = 1, ECCLEVEL_M = 0, ECCLEVEL_Q = 3, ECCLEVEL_H = 2;
  29206. // GF(2^8)-to-integer mapping with a reducing polynomial x^8+x^4+x^3+x^2+1
  29207. // invariant: GF256_MAP[GF256_INVMAP[i]] == i for all i in [1,256)
  29208. var GF256_MAP = [], GF256_INVMAP = [-1];
  29209. for (var i = 0, v = 1; i < 255; ++i) {
  29210. GF256_MAP.push(v);
  29211. GF256_INVMAP[v] = i;
  29212. v = (v * 2) ^ (v >= 128 ? 0x11d : 0);
  29213. }
  29214. // generator polynomials up to degree 30
  29215. // (should match with polynomials in JIS X 0510:2004 Appendix A)
  29216. //
  29217. // generator polynomial of degree K is product of (x-\alpha^0), (x-\alpha^1),
  29218. // ..., (x-\alpha^(K-1)). by convention, we omit the K-th coefficient (always 1)
  29219. // from the result; also other coefficients are written in terms of the exponent
  29220. // to \alpha to avoid the redundant calculation. (see also calculateecc below.)
  29221. var GF256_GENPOLY = [[]];
  29222. for (var i = 0; i < 30; ++i) {
  29223. var prevpoly = GF256_GENPOLY[i], poly = [];
  29224. for (var j = 0; j <= i; ++j) {
  29225. var a = (j < i ? GF256_MAP[prevpoly[j]] : 0);
  29226. var b = GF256_MAP[(i + (prevpoly[j - 1] || 0)) % 255];
  29227. poly.push(GF256_INVMAP[a ^ b]);
  29228. }
  29229. GF256_GENPOLY.push(poly);
  29230. }
  29231. // alphanumeric character mapping (cf. Table 5 in JIS X 0510:2004 p. 19)
  29232. var ALPHANUMERIC_MAP = {};
  29233. for (var i = 0; i < 45; ++i) {
  29234. ALPHANUMERIC_MAP['0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'.charAt(i)] = i;
  29235. }
  29236. // mask functions in terms of row # and column #
  29237. // (cf. Table 20 in JIS X 0510:2004 p. 42)
  29238. /*jshint unused: false */
  29239. var MASKFUNCS = [
  29240. function (i, j) {
  29241. return (i + j) % 2 === 0;
  29242. },
  29243. function (i, j) {
  29244. return i % 2 === 0;
  29245. },
  29246. function (i, j) {
  29247. return j % 3 === 0;
  29248. },
  29249. function (i, j) {
  29250. return (i + j) % 3 === 0;
  29251. },
  29252. function (i, j) {
  29253. return (((i / 2) | 0) + ((j / 3) | 0)) % 2 === 0;
  29254. },
  29255. function (i, j) {
  29256. return (i * j) % 2 + (i * j) % 3 === 0;
  29257. },
  29258. function (i, j) {
  29259. return ((i * j) % 2 + (i * j) % 3) % 2 === 0;
  29260. },
  29261. function (i, j) {
  29262. return ((i + j) % 2 + (i * j) % 3) % 2 === 0;
  29263. }];
  29264. // returns true when the version information has to be embeded.
  29265. var needsverinfo = function (ver) {
  29266. return ver > 6;
  29267. };
  29268. // returns the size of entire QR code for given version.
  29269. var getsizebyver = function (ver) {
  29270. return 4 * ver + 17;
  29271. };
  29272. // returns the number of bits available for code words in this version.
  29273. var nfullbits = function (ver) {
  29274. /*
  29275. * |<--------------- n --------------->|
  29276. * | |<----- n-17 ---->| |
  29277. * +-------+ ///+-------+ ----
  29278. * | | ///| | ^
  29279. * | 9x9 | @@@@@ ///| 9x8 | |
  29280. * | | # # # @5x5@ # # # | | |
  29281. * +-------+ @@@@@ +-------+ |
  29282. * # ---|
  29283. * ^ |
  29284. * # |
  29285. * @@@@@ @@@@@ @@@@@ | n
  29286. * @5x5@ @5x5@ @5x5@ n-17
  29287. * @@@@@ @@@@@ @@@@@ | |
  29288. * # | |
  29289. * ////// v |
  29290. * //////# ---|
  29291. * +-------+ @@@@@ @@@@@ |
  29292. * | | @5x5@ @5x5@ |
  29293. * | 8x9 | @@@@@ @@@@@ |
  29294. * | | v
  29295. * +-------+ ----
  29296. *
  29297. * when the entire code has n^2 modules and there are m^2-3 alignment
  29298. * patterns, we have:
  29299. * - 225 (= 9x9 + 9x8 + 8x9) modules for finder patterns and
  29300. * format information;
  29301. * - 2n-34 (= 2(n-17)) modules for timing patterns;
  29302. * - 36 (= 3x6 + 6x3) modules for version information, if any;
  29303. * - 25m^2-75 (= (m^2-3)(5x5)) modules for alignment patterns
  29304. * if any, but 10m-20 (= 2(m-2)x5) of them overlaps with
  29305. * timing patterns.
  29306. */
  29307. var v = VERSIONS[ver];
  29308. var nbits = 16 * ver * ver + 128 * ver + 64; // finder, timing and format info.
  29309. if (needsverinfo(ver))
  29310. nbits -= 36; // version information
  29311. if (v[2].length) { // alignment patterns
  29312. nbits -= 25 * v[2].length * v[2].length - 10 * v[2].length - 55;
  29313. }
  29314. return nbits;
  29315. };
  29316. // returns the number of bits available for data portions (i.e. excludes ECC
  29317. // bits but includes mode and length bits) in this version and ECC level.
  29318. var ndatabits = function (ver, ecclevel) {
  29319. var nbits = nfullbits(ver) & ~7; // no sub-octet code words
  29320. var v = VERSIONS[ver];
  29321. nbits -= 8 * v[0][ecclevel] * v[1][ecclevel]; // ecc bits
  29322. return nbits;
  29323. };
  29324. // returns the number of bits required for the length of data.
  29325. // (cf. Table 3 in JIS X 0510:2004 p. 16)
  29326. var ndatalenbits = function (ver, mode) {
  29327. switch (mode) {
  29328. case MODE_NUMERIC:
  29329. return (ver < 10 ? 10 : ver < 27 ? 12 : 14);
  29330. case MODE_ALPHANUMERIC:
  29331. return (ver < 10 ? 9 : ver < 27 ? 11 : 13);
  29332. case MODE_OCTET:
  29333. return (ver < 10 ? 8 : 16);
  29334. case MODE_KANJI:
  29335. return (ver < 10 ? 8 : ver < 27 ? 10 : 12);
  29336. }
  29337. };
  29338. // returns the maximum length of data possible in given configuration.
  29339. var getmaxdatalen = function (ver, mode, ecclevel) {
  29340. var nbits = ndatabits(ver, ecclevel) - 4 - ndatalenbits(ver, mode); // 4 for mode bits
  29341. switch (mode) {
  29342. case MODE_NUMERIC:
  29343. return ((nbits / 10) | 0) * 3 + (nbits % 10 < 4 ? 0 : nbits % 10 < 7 ? 1 : 2);
  29344. case MODE_ALPHANUMERIC:
  29345. return ((nbits / 11) | 0) * 2 + (nbits % 11 < 6 ? 0 : 1);
  29346. case MODE_OCTET:
  29347. return (nbits / 8) | 0;
  29348. case MODE_KANJI:
  29349. return (nbits / 13) | 0;
  29350. }
  29351. };
  29352. // checks if the given data can be encoded in given mode, and returns
  29353. // the converted data for the further processing if possible. otherwise
  29354. // returns null.
  29355. //
  29356. // this function does not check the length of data; it is a duty of
  29357. // encode function below (as it depends on the version and ECC level too).
  29358. var validatedata = function (mode, data) {
  29359. switch (mode) {
  29360. case MODE_NUMERIC:
  29361. if (!data.match(NUMERIC_REGEXP))
  29362. return null;
  29363. return data;
  29364. case MODE_ALPHANUMERIC:
  29365. if (!data.match(ALPHANUMERIC_REGEXP))
  29366. return null;
  29367. return data.toUpperCase();
  29368. case MODE_OCTET:
  29369. if (typeof data === 'string') { // encode as utf-8 string
  29370. var newdata = [];
  29371. for (var i = 0; i < data.length; ++i) {
  29372. var ch = data.charCodeAt(i);
  29373. if (ch < 0x80) {
  29374. newdata.push(ch);
  29375. } else if (ch < 0x800) {
  29376. newdata.push(0xc0 | (ch >> 6),
  29377. 0x80 | (ch & 0x3f));
  29378. } else if (ch < 0x10000) {
  29379. newdata.push(0xe0 | (ch >> 12),
  29380. 0x80 | ((ch >> 6) & 0x3f),
  29381. 0x80 | (ch & 0x3f));
  29382. } else {
  29383. newdata.push(0xf0 | (ch >> 18),
  29384. 0x80 | ((ch >> 12) & 0x3f),
  29385. 0x80 | ((ch >> 6) & 0x3f),
  29386. 0x80 | (ch & 0x3f));
  29387. }
  29388. }
  29389. return newdata;
  29390. } else {
  29391. return data;
  29392. }
  29393. }
  29394. };
  29395. // returns the code words (sans ECC bits) for given data and configurations.
  29396. // requires data to be preprocessed by validatedata. no length check is
  29397. // performed, and everything has to be checked before calling this function.
  29398. var encode = function (ver, mode, data, maxbuflen) {
  29399. var buf = [];
  29400. var bits = 0, remaining = 8;
  29401. var datalen = data.length;
  29402. // this function is intentionally no-op when n=0.
  29403. var pack = function (x, n) {
  29404. if (n >= remaining) {
  29405. buf.push(bits | (x >> (n -= remaining)));
  29406. while (n >= 8)
  29407. buf.push((x >> (n -= 8)) & 255);
  29408. bits = 0;
  29409. remaining = 8;
  29410. }
  29411. if (n > 0)
  29412. bits |= (x & ((1 << n) - 1)) << (remaining -= n);
  29413. };
  29414. var nlenbits = ndatalenbits(ver, mode);
  29415. pack(mode, 4);
  29416. pack(datalen, nlenbits);
  29417. switch (mode) {
  29418. case MODE_NUMERIC:
  29419. for (var i = 2; i < datalen; i += 3) {
  29420. pack(parseInt(data.substring(i - 2, i + 1), 10), 10);
  29421. }
  29422. pack(parseInt(data.substring(i - 2), 10), [0, 4, 7][datalen % 3]);
  29423. break;
  29424. case MODE_ALPHANUMERIC:
  29425. for (var i = 1; i < datalen; i += 2) {
  29426. pack(ALPHANUMERIC_MAP[data.charAt(i - 1)] * 45 +
  29427. ALPHANUMERIC_MAP[data.charAt(i)], 11);
  29428. }
  29429. if (datalen % 2 == 1) {
  29430. pack(ALPHANUMERIC_MAP[data.charAt(i - 1)], 6);
  29431. }
  29432. break;
  29433. case MODE_OCTET:
  29434. for (var i = 0; i < datalen; ++i) {
  29435. pack(data[i], 8);
  29436. }
  29437. break;
  29438. }
  29439. // final bits. it is possible that adding terminator causes the buffer
  29440. // to overflow, but then the buffer truncated to the maximum size will
  29441. // be valid as the truncated terminator mode bits and padding is
  29442. // identical in appearance (cf. JIS X 0510:2004 sec 8.4.8).
  29443. pack(MODE_TERMINATOR, 4);
  29444. if (remaining < 8)
  29445. buf.push(bits);
  29446. // the padding to fill up the remaining space. we should not add any
  29447. // words when the overflow already occurred.
  29448. while (buf.length + 1 < maxbuflen)
  29449. buf.push(0xec, 0x11);
  29450. if (buf.length < maxbuflen)
  29451. buf.push(0xec);
  29452. return buf;
  29453. };
  29454. // calculates ECC code words for given code words and generator polynomial.
  29455. //
  29456. // this is quite similar to CRC calculation as both Reed-Solomon and CRC use
  29457. // the certain kind of cyclic codes, which is effectively the division of
  29458. // zero-augumented polynomial by the generator polynomial. the only difference
  29459. // is that Reed-Solomon uses GF(2^8), instead of CRC's GF(2), and Reed-Solomon
  29460. // uses the different generator polynomial than CRC's.
  29461. var calculateecc = function (poly, genpoly) {
  29462. var modulus = poly.slice(0);
  29463. var polylen = poly.length, genpolylen = genpoly.length;
  29464. for (var i = 0; i < genpolylen; ++i)
  29465. modulus.push(0);
  29466. for (var i = 0; i < polylen; ) {
  29467. var quotient = GF256_INVMAP[modulus[i++]];
  29468. if (quotient >= 0) {
  29469. for (var j = 0; j < genpolylen; ++j) {
  29470. modulus[i + j] ^= GF256_MAP[(quotient + genpoly[j]) % 255];
  29471. }
  29472. }
  29473. }
  29474. return modulus.slice(polylen);
  29475. };
  29476. // auguments ECC code words to given code words. the resulting words are
  29477. // ready to be encoded in the matrix.
  29478. //
  29479. // the much of actual augumenting procedure follows JIS X 0510:2004 sec 8.7.
  29480. // the code is simplified using the fact that the size of each code & ECC
  29481. // blocks is almost same; for example, when we have 4 blocks and 46 data words
  29482. // the number of code words in those blocks are 11, 11, 12, 12 respectively.
  29483. var augumenteccs = function (poly, nblocks, genpoly) {
  29484. var subsizes = [];
  29485. var subsize = (poly.length / nblocks) | 0, subsize0 = 0;
  29486. var pivot = nblocks - poly.length % nblocks;
  29487. for (var i = 0; i < pivot; ++i) {
  29488. subsizes.push(subsize0);
  29489. subsize0 += subsize;
  29490. }
  29491. for (var i = pivot; i < nblocks; ++i) {
  29492. subsizes.push(subsize0);
  29493. subsize0 += subsize + 1;
  29494. }
  29495. subsizes.push(subsize0);
  29496. var eccs = [];
  29497. for (var i = 0; i < nblocks; ++i) {
  29498. eccs.push(calculateecc(poly.slice(subsizes[i], subsizes[i + 1]), genpoly));
  29499. }
  29500. var result = [];
  29501. var nitemsperblock = (poly.length / nblocks) | 0;
  29502. for (var i = 0; i < nitemsperblock; ++i) {
  29503. for (var j = 0; j < nblocks; ++j) {
  29504. result.push(poly[subsizes[j] + i]);
  29505. }
  29506. }
  29507. for (var j = pivot; j < nblocks; ++j) {
  29508. result.push(poly[subsizes[j + 1] - 1]);
  29509. }
  29510. for (var i = 0; i < genpoly.length; ++i) {
  29511. for (var j = 0; j < nblocks; ++j) {
  29512. result.push(eccs[j][i]);
  29513. }
  29514. }
  29515. return result;
  29516. };
  29517. // auguments BCH(p+q,q) code to the polynomial over GF(2), given the proper
  29518. // genpoly. the both input and output are in binary numbers, and unlike
  29519. // calculateecc genpoly should include the 1 bit for the highest degree.
  29520. //
  29521. // actual polynomials used for this procedure are as follows:
  29522. // - p=10, q=5, genpoly=x^10+x^8+x^5+x^4+x^2+x+1 (JIS X 0510:2004 Appendix C)
  29523. // - p=18, q=6, genpoly=x^12+x^11+x^10+x^9+x^8+x^5+x^2+1 (ibid. Appendix D)
  29524. var augumentbch = function (poly, p, genpoly, q) {
  29525. var modulus = poly << q;
  29526. for (var i = p - 1; i >= 0; --i) {
  29527. if ((modulus >> (q + i)) & 1)
  29528. modulus ^= genpoly << i;
  29529. }
  29530. return (poly << q) | modulus;
  29531. };
  29532. // creates the base matrix for given version. it returns two matrices, one of
  29533. // them is the actual one and the another represents the "reserved" portion
  29534. // (e.g. finder and timing patterns) of the matrix.
  29535. //
  29536. // some entries in the matrix may be undefined, rather than 0 or 1. this is
  29537. // intentional (no initialization needed!), and putdata below will fill
  29538. // the remaining ones.
  29539. var makebasematrix = function (ver) {
  29540. var v = VERSIONS[ver], n = getsizebyver(ver);
  29541. var matrix = [], reserved = [];
  29542. for (var i = 0; i < n; ++i) {
  29543. matrix.push([]);
  29544. reserved.push([]);
  29545. }
  29546. var blit = function (y, x, h, w, bits) {
  29547. for (var i = 0; i < h; ++i) {
  29548. for (var j = 0; j < w; ++j) {
  29549. matrix[y + i][x + j] = (bits[i] >> j) & 1;
  29550. reserved[y + i][x + j] = 1;
  29551. }
  29552. }
  29553. };
  29554. // finder patterns and a part of timing patterns
  29555. // will also mark the format information area (not yet written) as reserved.
  29556. blit(0, 0, 9, 9, [0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x17f, 0x00, 0x40]);
  29557. blit(n - 8, 0, 8, 9, [0x100, 0x7f, 0x41, 0x5d, 0x5d, 0x5d, 0x41, 0x7f]);
  29558. blit(0, n - 8, 9, 8, [0xfe, 0x82, 0xba, 0xba, 0xba, 0x82, 0xfe, 0x00, 0x00]);
  29559. // the rest of timing patterns
  29560. for (var i = 9; i < n - 8; ++i) {
  29561. matrix[6][i] = matrix[i][6] = ~i & 1;
  29562. reserved[6][i] = reserved[i][6] = 1;
  29563. }
  29564. // alignment patterns
  29565. var aligns = v[2], m = aligns.length;
  29566. for (var i = 0; i < m; ++i) {
  29567. var minj = (i === 0 || i === m - 1 ? 1 : 0), maxj = (i === 0 ? m - 1 : m);
  29568. for (var j = minj; j < maxj; ++j) {
  29569. blit(aligns[i], aligns[j], 5, 5, [0x1f, 0x11, 0x15, 0x11, 0x1f]);
  29570. }
  29571. }
  29572. // version information
  29573. if (needsverinfo(ver)) {
  29574. var code = augumentbch(ver, 6, 0x1f25, 12);
  29575. var k = 0;
  29576. for (var i = 0; i < 6; ++i) {
  29577. for (var j = 0; j < 3; ++j) {
  29578. matrix[i][(n - 11) + j] = matrix[(n - 11) + j][i] = (code >> k++) & 1;
  29579. reserved[i][(n - 11) + j] = reserved[(n - 11) + j][i] = 1;
  29580. }
  29581. }
  29582. }
  29583. return {matrix: matrix, reserved: reserved};
  29584. };
  29585. // fills the data portion (i.e. unmarked in reserved) of the matrix with given
  29586. // code words. the size of code words should be no more than available bits,
  29587. // and remaining bits are padded to 0 (cf. JIS X 0510:2004 sec 8.7.3).
  29588. var putdata = function (matrix, reserved, buf) {
  29589. var n = matrix.length;
  29590. var k = 0, dir = -1;
  29591. for (var i = n - 1; i >= 0; i -= 2) {
  29592. if (i == 6)
  29593. --i; // skip the entire timing pattern column
  29594. var jj = (dir < 0 ? n - 1 : 0);
  29595. for (var j = 0; j < n; ++j) {
  29596. for (var ii = i; ii > i - 2; --ii) {
  29597. if (!reserved[jj][ii]) {
  29598. // may overflow, but (undefined >> x)
  29599. // is 0 so it will auto-pad to zero.
  29600. matrix[jj][ii] = (buf[k >> 3] >> (~k & 7)) & 1;
  29601. ++k;
  29602. }
  29603. }
  29604. jj += dir;
  29605. }
  29606. dir = -dir;
  29607. }
  29608. return matrix;
  29609. };
  29610. // XOR-masks the data portion of the matrix. repeating the call with the same
  29611. // arguments will revert the prior call (convenient in the matrix evaluation).
  29612. var maskdata = function (matrix, reserved, mask) {
  29613. var maskf = MASKFUNCS[mask];
  29614. var n = matrix.length;
  29615. for (var i = 0; i < n; ++i) {
  29616. for (var j = 0; j < n; ++j) {
  29617. if (!reserved[i][j])
  29618. matrix[i][j] ^= maskf(i, j);
  29619. }
  29620. }
  29621. return matrix;
  29622. };
  29623. // puts the format information.
  29624. var putformatinfo = function (matrix, reserved, ecclevel, mask) {
  29625. var n = matrix.length;
  29626. var code = augumentbch((ecclevel << 3) | mask, 5, 0x537, 10) ^ 0x5412;
  29627. for (var i = 0; i < 15; ++i) {
  29628. var r = [0, 1, 2, 3, 4, 5, 7, 8, n - 7, n - 6, n - 5, n - 4, n - 3, n - 2, n - 1][i];
  29629. var c = [n - 1, n - 2, n - 3, n - 4, n - 5, n - 6, n - 7, n - 8, 7, 5, 4, 3, 2, 1, 0][i];
  29630. matrix[r][8] = matrix[8][c] = (code >> i) & 1;
  29631. // we don't have to mark those bits reserved; always done
  29632. // in makebasematrix above.
  29633. }
  29634. return matrix;
  29635. };
  29636. // evaluates the resulting matrix and returns the score (lower is better).
  29637. // (cf. JIS X 0510:2004 sec 8.8.2)
  29638. //
  29639. // the evaluation procedure tries to avoid the problematic patterns naturally
  29640. // occuring from the original matrix. for example, it penaltizes the patterns
  29641. // which just look like the finder pattern which will confuse the decoder.
  29642. // we choose the mask which results in the lowest score among 8 possible ones.
  29643. //
  29644. // note: zxing seems to use the same procedure and in many cases its choice
  29645. // agrees to ours, but sometimes it does not. practically it doesn't matter.
  29646. var evaluatematrix = function (matrix) {
  29647. // N1+(k-5) points for each consecutive row of k same-colored modules,
  29648. // where k >= 5. no overlapping row counts.
  29649. var PENALTY_CONSECUTIVE = 3;
  29650. // N2 points for each 2x2 block of same-colored modules.
  29651. // overlapping block does count.
  29652. var PENALTY_TWOBYTWO = 3;
  29653. // N3 points for each pattern with >4W:1B:1W:3B:1W:1B or
  29654. // 1B:1W:3B:1W:1B:>4W, or their multiples (e.g. highly unlikely,
  29655. // but 13W:3B:3W:9B:3W:3B counts).
  29656. var PENALTY_FINDERLIKE = 40;
  29657. // N4*k points for every (5*k)% deviation from 50% black density.
  29658. // i.e. k=1 for 55~60% and 40~45%, k=2 for 60~65% and 35~40%, etc.
  29659. var PENALTY_DENSITY = 10;
  29660. var evaluategroup = function (groups) { // assumes [W,B,W,B,W,...,B,W]
  29661. var score = 0;
  29662. for (var i = 0; i < groups.length; ++i) {
  29663. if (groups[i] >= 5)
  29664. score += PENALTY_CONSECUTIVE + (groups[i] - 5);
  29665. }
  29666. for (var i = 5; i < groups.length; i += 2) {
  29667. var p = groups[i];
  29668. if (groups[i - 1] == p && groups[i - 2] == 3 * p && groups[i - 3] == p &&
  29669. groups[i - 4] == p && (groups[i - 5] >= 4 * p || groups[i + 1] >= 4 * p)) {
  29670. // this part differs from zxing...
  29671. score += PENALTY_FINDERLIKE;
  29672. }
  29673. }
  29674. return score;
  29675. };
  29676. var n = matrix.length;
  29677. var score = 0, nblacks = 0;
  29678. for (var i = 0; i < n; ++i) {
  29679. var row = matrix[i];
  29680. var groups;
  29681. // evaluate the current row
  29682. groups = [0]; // the first empty group of white
  29683. for (var j = 0; j < n; ) {
  29684. var k;
  29685. for (k = 0; j < n && row[j]; ++k)
  29686. ++j;
  29687. groups.push(k);
  29688. for (k = 0; j < n && !row[j]; ++k)
  29689. ++j;
  29690. groups.push(k);
  29691. }
  29692. score += evaluategroup(groups);
  29693. // evaluate the current column
  29694. groups = [0];
  29695. for (var j = 0; j < n; ) {
  29696. var k;
  29697. for (k = 0; j < n && matrix[j][i]; ++k)
  29698. ++j;
  29699. groups.push(k);
  29700. for (k = 0; j < n && !matrix[j][i]; ++k)
  29701. ++j;
  29702. groups.push(k);
  29703. }
  29704. score += evaluategroup(groups);
  29705. // check the 2x2 box and calculate the density
  29706. var nextrow = matrix[i + 1] || [];
  29707. nblacks += row[0];
  29708. for (var j = 1; j < n; ++j) {
  29709. var p = row[j];
  29710. nblacks += p;
  29711. // at least comparison with next row should be strict...
  29712. if (row[j - 1] == p && nextrow[j] === p && nextrow[j - 1] === p) {
  29713. score += PENALTY_TWOBYTWO;
  29714. }
  29715. }
  29716. }
  29717. score += PENALTY_DENSITY * ((Math.abs(nblacks / n / n - 0.5) / 0.05) | 0);
  29718. return score;
  29719. };
  29720. // returns the fully encoded QR code matrix which contains given data.
  29721. // it also chooses the best mask automatically when mask is -1.
  29722. var generate = function (data, ver, mode, ecclevel, mask) {
  29723. var v = VERSIONS[ver];
  29724. var buf = encode(ver, mode, data, ndatabits(ver, ecclevel) >> 3);
  29725. buf = augumenteccs(buf, v[1][ecclevel], GF256_GENPOLY[v[0][ecclevel]]);
  29726. var result = makebasematrix(ver);
  29727. var matrix = result.matrix, reserved = result.reserved;
  29728. putdata(matrix, reserved, buf);
  29729. if (mask < 0) {
  29730. // find the best mask
  29731. maskdata(matrix, reserved, 0);
  29732. putformatinfo(matrix, reserved, ecclevel, 0);
  29733. var bestmask = 0, bestscore = evaluatematrix(matrix);
  29734. maskdata(matrix, reserved, 0);
  29735. for (mask = 1; mask < 8; ++mask) {
  29736. maskdata(matrix, reserved, mask);
  29737. putformatinfo(matrix, reserved, ecclevel, mask);
  29738. var score = evaluatematrix(matrix);
  29739. if (bestscore > score) {
  29740. bestscore = score;
  29741. bestmask = mask;
  29742. }
  29743. maskdata(matrix, reserved, mask);
  29744. }
  29745. mask = bestmask;
  29746. }
  29747. maskdata(matrix, reserved, mask);
  29748. putformatinfo(matrix, reserved, ecclevel, mask);
  29749. return matrix;
  29750. };
  29751. // the public interface is trivial; the options available are as follows:
  29752. //
  29753. // - version: an integer in [1,40]. when omitted (or -1) the smallest possible
  29754. // version is chosen.
  29755. // - mode: one of 'numeric', 'alphanumeric', 'octet'. when omitted the smallest
  29756. // possible mode is chosen.
  29757. // - eccLevel: one of 'L', 'M', 'Q', 'H'. defaults to 'L'.
  29758. // - mask: an integer in [0,7]. when omitted (or -1) the best mask is chosen.
  29759. //
  29760. function generateFrame(data, options) {
  29761. var MODES = {'numeric': MODE_NUMERIC, 'alphanumeric': MODE_ALPHANUMERIC,
  29762. 'octet': MODE_OCTET};
  29763. var ECCLEVELS = {'L': ECCLEVEL_L, 'M': ECCLEVEL_M, 'Q': ECCLEVEL_Q,
  29764. 'H': ECCLEVEL_H};
  29765. options = options || {};
  29766. var ver = options.version || -1;
  29767. var ecclevel = ECCLEVELS[(options.eccLevel || 'L').toUpperCase()];
  29768. var mode = options.mode ? MODES[options.mode.toLowerCase()] : -1;
  29769. var mask = 'mask' in options ? options.mask : -1;
  29770. if (mode < 0) {
  29771. if (typeof data === 'string') {
  29772. if (data.match(NUMERIC_REGEXP)) {
  29773. mode = MODE_NUMERIC;
  29774. } else if (data.match(ALPHANUMERIC_OUT_REGEXP)) {
  29775. // while encode supports case-insensitive encoding, we restrict the data to be uppercased when auto-selecting the mode.
  29776. mode = MODE_ALPHANUMERIC;
  29777. } else {
  29778. mode = MODE_OCTET;
  29779. }
  29780. } else {
  29781. mode = MODE_OCTET;
  29782. }
  29783. } else if (!(mode == MODE_NUMERIC || mode == MODE_ALPHANUMERIC ||
  29784. mode == MODE_OCTET)) {
  29785. throw 'invalid or unsupported mode';
  29786. }
  29787. data = validatedata(mode, data);
  29788. if (data === null)
  29789. throw 'invalid data format';
  29790. if (ecclevel < 0 || ecclevel > 3)
  29791. throw 'invalid ECC level';
  29792. if (ver < 0) {
  29793. for (ver = 1; ver <= 40; ++ver) {
  29794. if (data.length <= getmaxdatalen(ver, mode, ecclevel))
  29795. break;
  29796. }
  29797. if (ver > 40)
  29798. throw 'too large data for the Qr format';
  29799. } else if (ver < 1 || ver > 40) {
  29800. throw 'invalid Qr version! should be between 1 and 40';
  29801. }
  29802. if (mask != -1 && (mask < 0 || mask > 8))
  29803. throw 'invalid mask';
  29804. //console.log('version:', ver, 'mode:', mode, 'ECC:', ecclevel, 'mask:', mask )
  29805. return generate(data, ver, mode, ecclevel, mask);
  29806. }
  29807. // options
  29808. // - modulesize: a number. this is a size of each modules in pixels, and
  29809. // defaults to 5px.
  29810. // - margin: a number. this is a size of margin in *modules*, and defaults to
  29811. // 4 (white modules). the specficiation mandates the margin no less than 4
  29812. // modules, so it is better not to alter this value unless you know what
  29813. // you're doing.
  29814. function buildCanvas(data, options) {
  29815. var canvas = [];
  29816. var background = options.background || '#fff';
  29817. var foreground = options.foreground || '#000';
  29818. //var margin = options.margin || 4;
  29819. var matrix = generateFrame(data, options);
  29820. var n = matrix.length;
  29821. var modSize = Math.floor(options.fit ? options.fit / n : 5);
  29822. var size = n * modSize;
  29823. canvas.push({
  29824. type: 'rect',
  29825. x: 0, y: 0, w: size, h: size, lineWidth: 0, color: background
  29826. });
  29827. for (var i = 0; i < n; ++i) {
  29828. for (var j = 0; j < n; ++j) {
  29829. if (matrix[i][j]) {
  29830. canvas.push({
  29831. type: 'rect',
  29832. x: modSize * j,
  29833. y: modSize * i,
  29834. w: modSize,
  29835. h: modSize,
  29836. lineWidth: 0,
  29837. color: foreground
  29838. });
  29839. }
  29840. }
  29841. }
  29842. return {
  29843. canvas: canvas,
  29844. size: size
  29845. };
  29846. }
  29847. function measure(node) {
  29848. var cd = buildCanvas(node.qr, node);
  29849. node._canvas = cd.canvas;
  29850. node._width = node._height = node._minWidth = node._maxWidth = node._minHeight = node._maxHeight = cd.size;
  29851. return node;
  29852. }
  29853. module.exports = {
  29854. measure: measure
  29855. };
  29856. /***/ }),
  29857. /* 25 */
  29858. /***/ (function(module, exports, __webpack_require__) {
  29859. /* jslint node: true */
  29860. 'use strict';
  29861. var TraversalTracker = __webpack_require__(11);
  29862. /**
  29863. * Creates an instance of DocumentContext - a store for current x, y positions and available width/height.
  29864. * It facilitates column divisions and vertical sync
  29865. */
  29866. function DocumentContext(pageSize, pageMargins) {
  29867. this.pages = [];
  29868. this.pageMargins = pageMargins;
  29869. this.x = pageMargins.left;
  29870. this.availableWidth = pageSize.width - pageMargins.left - pageMargins.right;
  29871. this.availableHeight = 0;
  29872. this.page = -1;
  29873. this.snapshots = [];
  29874. this.endingCell = null;
  29875. this.tracker = new TraversalTracker();
  29876. this.addPage(pageSize);
  29877. }
  29878. DocumentContext.prototype.beginColumnGroup = function () {
  29879. this.snapshots.push({
  29880. x: this.x,
  29881. y: this.y,
  29882. availableHeight: this.availableHeight,
  29883. availableWidth: this.availableWidth,
  29884. page: this.page,
  29885. bottomMost: {
  29886. x: this.x,
  29887. y: this.y,
  29888. availableHeight: this.availableHeight,
  29889. availableWidth: this.availableWidth,
  29890. page: this.page
  29891. },
  29892. endingCell: this.endingCell,
  29893. lastColumnWidth: this.lastColumnWidth
  29894. });
  29895. this.lastColumnWidth = 0;
  29896. };
  29897. DocumentContext.prototype.beginColumn = function (width, offset, endingCell) {
  29898. var saved = this.snapshots[this.snapshots.length - 1];
  29899. this.calculateBottomMost(saved);
  29900. this.endingCell = endingCell;
  29901. this.page = saved.page;
  29902. this.x = this.x + this.lastColumnWidth + (offset || 0);
  29903. this.y = saved.y;
  29904. this.availableWidth = width; //saved.availableWidth - offset;
  29905. this.availableHeight = saved.availableHeight;
  29906. this.lastColumnWidth = width;
  29907. };
  29908. DocumentContext.prototype.calculateBottomMost = function (destContext) {
  29909. if (this.endingCell) {
  29910. this.saveContextInEndingCell(this.endingCell);
  29911. this.endingCell = null;
  29912. } else {
  29913. destContext.bottomMost = bottomMostContext(this, destContext.bottomMost);
  29914. }
  29915. };
  29916. DocumentContext.prototype.markEnding = function (endingCell) {
  29917. this.page = endingCell._columnEndingContext.page;
  29918. this.x = endingCell._columnEndingContext.x;
  29919. this.y = endingCell._columnEndingContext.y;
  29920. this.availableWidth = endingCell._columnEndingContext.availableWidth;
  29921. this.availableHeight = endingCell._columnEndingContext.availableHeight;
  29922. this.lastColumnWidth = endingCell._columnEndingContext.lastColumnWidth;
  29923. };
  29924. DocumentContext.prototype.saveContextInEndingCell = function (endingCell) {
  29925. endingCell._columnEndingContext = {
  29926. page: this.page,
  29927. x: this.x,
  29928. y: this.y,
  29929. availableHeight: this.availableHeight,
  29930. availableWidth: this.availableWidth,
  29931. lastColumnWidth: this.lastColumnWidth
  29932. };
  29933. };
  29934. DocumentContext.prototype.completeColumnGroup = function () {
  29935. var saved = this.snapshots.pop();
  29936. this.calculateBottomMost(saved);
  29937. this.endingCell = null;
  29938. this.x = saved.x;
  29939. this.y = saved.bottomMost.y;
  29940. this.page = saved.bottomMost.page;
  29941. this.availableWidth = saved.availableWidth;
  29942. this.availableHeight = saved.bottomMost.availableHeight;
  29943. this.lastColumnWidth = saved.lastColumnWidth;
  29944. };
  29945. DocumentContext.prototype.addMargin = function (left, right) {
  29946. this.x += left;
  29947. this.availableWidth -= left + (right || 0);
  29948. };
  29949. DocumentContext.prototype.moveDown = function (offset) {
  29950. this.y += offset;
  29951. this.availableHeight -= offset;
  29952. return this.availableHeight > 0;
  29953. };
  29954. DocumentContext.prototype.initializePage = function () {
  29955. this.y = this.pageMargins.top;
  29956. this.availableHeight = this.getCurrentPage().pageSize.height - this.pageMargins.top - this.pageMargins.bottom;
  29957. this.pageSnapshot().availableWidth = this.getCurrentPage().pageSize.width - this.pageMargins.left - this.pageMargins.right;
  29958. };
  29959. DocumentContext.prototype.pageSnapshot = function () {
  29960. if (this.snapshots[0]) {
  29961. return this.snapshots[0];
  29962. } else {
  29963. return this;
  29964. }
  29965. };
  29966. DocumentContext.prototype.moveTo = function (x, y) {
  29967. if (x !== undefined && x !== null) {
  29968. this.x = x;
  29969. this.availableWidth = this.getCurrentPage().pageSize.width - this.x - this.pageMargins.right;
  29970. }
  29971. if (y !== undefined && y !== null) {
  29972. this.y = y;
  29973. this.availableHeight = this.getCurrentPage().pageSize.height - this.y - this.pageMargins.bottom;
  29974. }
  29975. };
  29976. DocumentContext.prototype.beginDetachedBlock = function () {
  29977. this.snapshots.push({
  29978. x: this.x,
  29979. y: this.y,
  29980. availableHeight: this.availableHeight,
  29981. availableWidth: this.availableWidth,
  29982. page: this.page,
  29983. endingCell: this.endingCell,
  29984. lastColumnWidth: this.lastColumnWidth
  29985. });
  29986. };
  29987. DocumentContext.prototype.endDetachedBlock = function () {
  29988. var saved = this.snapshots.pop();
  29989. this.x = saved.x;
  29990. this.y = saved.y;
  29991. this.availableWidth = saved.availableWidth;
  29992. this.availableHeight = saved.availableHeight;
  29993. this.page = saved.page;
  29994. this.endingCell = saved.endingCell;
  29995. this.lastColumnWidth = saved.lastColumnWidth;
  29996. };
  29997. function pageOrientation(pageOrientationString, currentPageOrientation) {
  29998. if (pageOrientationString === undefined) {
  29999. return currentPageOrientation;
  30000. } else if ((typeof pageOrientationString === 'string' || pageOrientationString instanceof String) && (pageOrientationString.toLowerCase() === 'landscape')) {
  30001. return 'landscape';
  30002. } else {
  30003. return 'portrait';
  30004. }
  30005. }
  30006. var getPageSize = function (currentPage, newPageOrientation) {
  30007. newPageOrientation = pageOrientation(newPageOrientation, currentPage.pageSize.orientation);
  30008. if (newPageOrientation !== currentPage.pageSize.orientation) {
  30009. return {
  30010. orientation: newPageOrientation,
  30011. width: currentPage.pageSize.height,
  30012. height: currentPage.pageSize.width
  30013. };
  30014. } else {
  30015. return {
  30016. orientation: currentPage.pageSize.orientation,
  30017. width: currentPage.pageSize.width,
  30018. height: currentPage.pageSize.height
  30019. };
  30020. }
  30021. };
  30022. DocumentContext.prototype.moveToNextPage = function (pageOrientation) {
  30023. var nextPageIndex = this.page + 1;
  30024. var prevPage = this.page;
  30025. var prevY = this.y;
  30026. var createNewPage = nextPageIndex >= this.pages.length;
  30027. if (createNewPage) {
  30028. var currentAvailableWidth = this.availableWidth;
  30029. var currentPageOrientation = this.getCurrentPage().pageSize.orientation;
  30030. var pageSize = getPageSize(this.getCurrentPage(), pageOrientation);
  30031. this.addPage(pageSize);
  30032. if (currentPageOrientation === pageSize.orientation) {
  30033. this.availableWidth = currentAvailableWidth;
  30034. }
  30035. } else {
  30036. this.page = nextPageIndex;
  30037. this.initializePage();
  30038. }
  30039. return {
  30040. newPageCreated: createNewPage,
  30041. prevPage: prevPage,
  30042. prevY: prevY,
  30043. y: this.y
  30044. };
  30045. };
  30046. DocumentContext.prototype.addPage = function (pageSize) {
  30047. var page = {items: [], pageSize: pageSize};
  30048. this.pages.push(page);
  30049. this.page = this.pages.length - 1;
  30050. this.initializePage();
  30051. this.tracker.emit('pageAdded');
  30052. return page;
  30053. };
  30054. DocumentContext.prototype.getCurrentPage = function () {
  30055. if (this.page < 0 || this.page >= this.pages.length) {
  30056. return null;
  30057. }
  30058. return this.pages[this.page];
  30059. };
  30060. DocumentContext.prototype.getCurrentPosition = function () {
  30061. var pageSize = this.getCurrentPage().pageSize;
  30062. var innerHeight = pageSize.height - this.pageMargins.top - this.pageMargins.bottom;
  30063. var innerWidth = pageSize.width - this.pageMargins.left - this.pageMargins.right;
  30064. return {
  30065. pageNumber: this.page + 1,
  30066. pageOrientation: pageSize.orientation,
  30067. pageInnerHeight: innerHeight,
  30068. pageInnerWidth: innerWidth,
  30069. left: this.x,
  30070. top: this.y,
  30071. verticalRatio: ((this.y - this.pageMargins.top) / innerHeight),
  30072. horizontalRatio: ((this.x - this.pageMargins.left) / innerWidth)
  30073. };
  30074. };
  30075. function bottomMostContext(c1, c2) {
  30076. var r;
  30077. if (c1.page > c2.page) {
  30078. r = c1;
  30079. } else if (c2.page > c1.page) {
  30080. r = c2;
  30081. } else {
  30082. r = (c1.y > c2.y) ? c1 : c2;
  30083. }
  30084. return {
  30085. page: r.page,
  30086. x: r.x,
  30087. y: r.y,
  30088. availableHeight: r.availableHeight,
  30089. availableWidth: r.availableWidth
  30090. };
  30091. }
  30092. /****TESTS**** (add a leading '/' to uncomment)
  30093. DocumentContext.bottomMostContext = bottomMostContext;
  30094. // */
  30095. module.exports = DocumentContext;
  30096. /***/ }),
  30097. /* 26 */
  30098. /***/ (function(module, exports, __webpack_require__) {
  30099. /* jslint node: true */
  30100. 'use strict';
  30101. var ElementWriter = __webpack_require__(27);
  30102. /**
  30103. * Creates an instance of PageElementWriter - an extended ElementWriter
  30104. * which can handle:
  30105. * - page-breaks (it adds new pages when there's not enough space left),
  30106. * - repeatable fragments (like table-headers, which are repeated everytime
  30107. * a page-break occurs)
  30108. * - transactions (used for unbreakable-blocks when we want to make sure
  30109. * whole block will be rendered on the same page)
  30110. */
  30111. function PageElementWriter(context, tracker) {
  30112. this.transactionLevel = 0;
  30113. this.repeatables = [];
  30114. this.tracker = tracker;
  30115. this.writer = new ElementWriter(context, tracker);
  30116. }
  30117. function fitOnPage(self, addFct) {
  30118. var position = addFct(self);
  30119. if (!position) {
  30120. self.moveToNextPage();
  30121. position = addFct(self);
  30122. }
  30123. return position;
  30124. }
  30125. PageElementWriter.prototype.addLine = function (line, dontUpdateContextPosition, index) {
  30126. return fitOnPage(this, function (self) {
  30127. return self.writer.addLine(line, dontUpdateContextPosition, index);
  30128. });
  30129. };
  30130. PageElementWriter.prototype.addImage = function (image, index) {
  30131. return fitOnPage(this, function (self) {
  30132. return self.writer.addImage(image, index);
  30133. });
  30134. };
  30135. PageElementWriter.prototype.addQr = function (qr, index) {
  30136. return fitOnPage(this, function (self) {
  30137. return self.writer.addQr(qr, index);
  30138. });
  30139. };
  30140. PageElementWriter.prototype.addVector = function (vector, ignoreContextX, ignoreContextY, index) {
  30141. return this.writer.addVector(vector, ignoreContextX, ignoreContextY, index);
  30142. };
  30143. PageElementWriter.prototype.addFragment = function (fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
  30144. if (!this.writer.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition)) {
  30145. this.moveToNextPage();
  30146. this.writer.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition);
  30147. }
  30148. };
  30149. PageElementWriter.prototype.moveToNextPage = function (pageOrientation) {
  30150. var nextPage = this.writer.context.moveToNextPage(pageOrientation);
  30151. if (nextPage.newPageCreated) {
  30152. this.repeatables.forEach(function (rep) {
  30153. this.writer.addFragment(rep, true);
  30154. }, this);
  30155. } else {
  30156. this.repeatables.forEach(function (rep) {
  30157. this.writer.context.moveDown(rep.height);
  30158. }, this);
  30159. }
  30160. this.writer.tracker.emit('pageChanged', {
  30161. prevPage: nextPage.prevPage,
  30162. prevY: nextPage.prevY,
  30163. y: nextPage.y
  30164. });
  30165. };
  30166. PageElementWriter.prototype.beginUnbreakableBlock = function (width, height) {
  30167. if (this.transactionLevel++ === 0) {
  30168. this.originalX = this.writer.context.x;
  30169. this.writer.pushContext(width, height);
  30170. }
  30171. };
  30172. PageElementWriter.prototype.commitUnbreakableBlock = function (forcedX, forcedY) {
  30173. if (--this.transactionLevel === 0) {
  30174. var unbreakableContext = this.writer.context;
  30175. this.writer.popContext();
  30176. var nbPages = unbreakableContext.pages.length;
  30177. if (nbPages > 0) {
  30178. // no support for multi-page unbreakableBlocks
  30179. var fragment = unbreakableContext.pages[0];
  30180. fragment.xOffset = forcedX;
  30181. fragment.yOffset = forcedY;
  30182. //TODO: vectors can influence height in some situations
  30183. if (nbPages > 1) {
  30184. // on out-of-context blocs (headers, footers, background) height should be the whole DocumentContext height
  30185. if (forcedX !== undefined || forcedY !== undefined) {
  30186. fragment.height = unbreakableContext.getCurrentPage().pageSize.height - unbreakableContext.pageMargins.top - unbreakableContext.pageMargins.bottom;
  30187. } else {
  30188. fragment.height = this.writer.context.getCurrentPage().pageSize.height - this.writer.context.pageMargins.top - this.writer.context.pageMargins.bottom;
  30189. for (var i = 0, l = this.repeatables.length; i < l; i++) {
  30190. fragment.height -= this.repeatables[i].height;
  30191. }
  30192. }
  30193. } else {
  30194. fragment.height = unbreakableContext.y;
  30195. }
  30196. if (forcedX !== undefined || forcedY !== undefined) {
  30197. this.writer.addFragment(fragment, true, true, true);
  30198. } else {
  30199. this.addFragment(fragment);
  30200. }
  30201. }
  30202. }
  30203. };
  30204. PageElementWriter.prototype.currentBlockToRepeatable = function () {
  30205. var unbreakableContext = this.writer.context;
  30206. var rep = {items: []};
  30207. unbreakableContext.pages[0].items.forEach(function (item) {
  30208. rep.items.push(item);
  30209. });
  30210. rep.xOffset = this.originalX;
  30211. //TODO: vectors can influence height in some situations
  30212. rep.height = unbreakableContext.y;
  30213. return rep;
  30214. };
  30215. PageElementWriter.prototype.pushToRepeatables = function (rep) {
  30216. this.repeatables.push(rep);
  30217. };
  30218. PageElementWriter.prototype.popFromRepeatables = function () {
  30219. this.repeatables.pop();
  30220. };
  30221. PageElementWriter.prototype.context = function () {
  30222. return this.writer.context;
  30223. };
  30224. module.exports = PageElementWriter;
  30225. /***/ }),
  30226. /* 27 */
  30227. /***/ (function(module, exports, __webpack_require__) {
  30228. /* jslint node: true */
  30229. 'use strict';
  30230. var Line = __webpack_require__(28);
  30231. var pack = __webpack_require__(13).pack;
  30232. var offsetVector = __webpack_require__(13).offsetVector;
  30233. var DocumentContext = __webpack_require__(25);
  30234. /**
  30235. * Creates an instance of ElementWriter - a line/vector writer, which adds
  30236. * elements to current page and sets their positions based on the context
  30237. */
  30238. function ElementWriter(context, tracker) {
  30239. this.context = context;
  30240. this.contextStack = [];
  30241. this.tracker = tracker;
  30242. }
  30243. function addPageItem(page, item, index) {
  30244. if (index === null || index === undefined || index < 0 || index > page.items.length) {
  30245. page.items.push(item);
  30246. } else {
  30247. page.items.splice(index, 0, item);
  30248. }
  30249. }
  30250. ElementWriter.prototype.addLine = function (line, dontUpdateContextPosition, index) {
  30251. var height = line.getHeight();
  30252. var context = this.context;
  30253. var page = context.getCurrentPage(),
  30254. position = this.getCurrentPositionOnPage();
  30255. if (context.availableHeight < height || !page) {
  30256. return false;
  30257. }
  30258. line.x = context.x + (line.x || 0);
  30259. line.y = context.y + (line.y || 0);
  30260. this.alignLine(line);
  30261. addPageItem(page, {
  30262. type: 'line',
  30263. item: line
  30264. }, index);
  30265. this.tracker.emit('lineAdded', line);
  30266. if (!dontUpdateContextPosition) {
  30267. context.moveDown(height);
  30268. }
  30269. return position;
  30270. };
  30271. ElementWriter.prototype.alignLine = function (line) {
  30272. var width = this.context.availableWidth;
  30273. var lineWidth = line.getWidth();
  30274. var alignment = line.inlines && line.inlines.length > 0 && line.inlines[0].alignment;
  30275. var offset = 0;
  30276. switch (alignment) {
  30277. case 'right':
  30278. offset = width - lineWidth;
  30279. break;
  30280. case 'center':
  30281. offset = (width - lineWidth) / 2;
  30282. break;
  30283. }
  30284. if (offset) {
  30285. line.x = (line.x || 0) + offset;
  30286. }
  30287. if (alignment === 'justify' &&
  30288. !line.newLineForced &&
  30289. !line.lastLineInParagraph &&
  30290. line.inlines.length > 1) {
  30291. var additionalSpacing = (width - lineWidth) / (line.inlines.length - 1);
  30292. for (var i = 1, l = line.inlines.length; i < l; i++) {
  30293. offset = i * additionalSpacing;
  30294. line.inlines[i].x += offset;
  30295. line.inlines[i].justifyShift = additionalSpacing;
  30296. }
  30297. }
  30298. };
  30299. ElementWriter.prototype.addImage = function (image, index) {
  30300. var context = this.context;
  30301. var page = context.getCurrentPage(),
  30302. position = this.getCurrentPositionOnPage();
  30303. if (!page || (context.availableHeight < image._height && page.items.length > 0)) {
  30304. return false;
  30305. }
  30306. if (image._x === undefined) {
  30307. image._x = image.x || 0;
  30308. }
  30309. image.x = context.x + image._x;
  30310. image.y = context.y;
  30311. this.alignImage(image);
  30312. addPageItem(page, {
  30313. type: 'image',
  30314. item: image
  30315. }, index);
  30316. context.moveDown(image._height);
  30317. return position;
  30318. };
  30319. ElementWriter.prototype.addQr = function (qr, index) {
  30320. var context = this.context;
  30321. var page = context.getCurrentPage(),
  30322. position = this.getCurrentPositionOnPage();
  30323. if (context.availableHeight < qr._height || !page) {
  30324. return false;
  30325. }
  30326. if (qr._x === undefined) {
  30327. qr._x = qr.x || 0;
  30328. }
  30329. qr.x = context.x + qr._x;
  30330. qr.y = context.y;
  30331. this.alignImage(qr);
  30332. for (var i = 0, l = qr._canvas.length; i < l; i++) {
  30333. var vector = qr._canvas[i];
  30334. vector.x += qr.x;
  30335. vector.y += qr.y;
  30336. this.addVector(vector, true, true, index);
  30337. }
  30338. context.moveDown(qr._height);
  30339. return position;
  30340. };
  30341. ElementWriter.prototype.alignImage = function (image) {
  30342. var width = this.context.availableWidth;
  30343. var imageWidth = image._minWidth;
  30344. var offset = 0;
  30345. switch (image._alignment) {
  30346. case 'right':
  30347. offset = width - imageWidth;
  30348. break;
  30349. case 'center':
  30350. offset = (width - imageWidth) / 2;
  30351. break;
  30352. }
  30353. if (offset) {
  30354. image.x = (image.x || 0) + offset;
  30355. }
  30356. };
  30357. ElementWriter.prototype.addVector = function (vector, ignoreContextX, ignoreContextY, index) {
  30358. var context = this.context;
  30359. var page = context.getCurrentPage(),
  30360. position = this.getCurrentPositionOnPage();
  30361. if (page) {
  30362. offsetVector(vector, ignoreContextX ? 0 : context.x, ignoreContextY ? 0 : context.y);
  30363. addPageItem(page, {
  30364. type: 'vector',
  30365. item: vector
  30366. }, index);
  30367. return position;
  30368. }
  30369. };
  30370. function cloneLine(line) {
  30371. var result = new Line(line.maxWidth);
  30372. for (var key in line) {
  30373. if (line.hasOwnProperty(key)) {
  30374. result[key] = line[key];
  30375. }
  30376. }
  30377. return result;
  30378. }
  30379. ElementWriter.prototype.addFragment = function (block, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
  30380. var ctx = this.context;
  30381. var page = ctx.getCurrentPage();
  30382. if (!useBlockXOffset && block.height > ctx.availableHeight) {
  30383. return false;
  30384. }
  30385. block.items.forEach(function (item) {
  30386. switch (item.type) {
  30387. case 'line':
  30388. var l = cloneLine(item.item);
  30389. l.x = (l.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
  30390. l.y = (l.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
  30391. page.items.push({
  30392. type: 'line',
  30393. item: l
  30394. });
  30395. break;
  30396. case 'vector':
  30397. var v = pack(item.item);
  30398. offsetVector(v, useBlockXOffset ? (block.xOffset || 0) : ctx.x, useBlockYOffset ? (block.yOffset || 0) : ctx.y);
  30399. page.items.push({
  30400. type: 'vector',
  30401. item: v
  30402. });
  30403. break;
  30404. case 'image':
  30405. var img = pack(item.item);
  30406. img.x = (img.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
  30407. img.y = (img.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
  30408. page.items.push({
  30409. type: 'image',
  30410. item: img
  30411. });
  30412. break;
  30413. }
  30414. });
  30415. if (!dontUpdateContextPosition) {
  30416. ctx.moveDown(block.height);
  30417. }
  30418. return true;
  30419. };
  30420. /**
  30421. * Pushes the provided context onto the stack or creates a new one
  30422. *
  30423. * pushContext(context) - pushes the provided context and makes it current
  30424. * pushContext(width, height) - creates and pushes a new context with the specified width and height
  30425. * pushContext() - creates a new context for unbreakable blocks (with current availableWidth and full-page-height)
  30426. */
  30427. ElementWriter.prototype.pushContext = function (contextOrWidth, height) {
  30428. if (contextOrWidth === undefined) {
  30429. height = this.context.getCurrentPage().height - this.context.pageMargins.top - this.context.pageMargins.bottom;
  30430. contextOrWidth = this.context.availableWidth;
  30431. }
  30432. if (typeof contextOrWidth === 'number' || contextOrWidth instanceof Number) {
  30433. contextOrWidth = new DocumentContext({width: contextOrWidth, height: height}, {left: 0, right: 0, top: 0, bottom: 0});
  30434. }
  30435. this.contextStack.push(this.context);
  30436. this.context = contextOrWidth;
  30437. };
  30438. ElementWriter.prototype.popContext = function () {
  30439. this.context = this.contextStack.pop();
  30440. };
  30441. ElementWriter.prototype.getCurrentPositionOnPage = function () {
  30442. return (this.contextStack[0] || this.context).getCurrentPosition();
  30443. };
  30444. module.exports = ElementWriter;
  30445. /***/ }),
  30446. /* 28 */
  30447. /***/ (function(module, exports) {
  30448. /* jslint node: true */
  30449. 'use strict';
  30450. /**
  30451. * Creates an instance of Line
  30452. *
  30453. * @constructor
  30454. * @this {Line}
  30455. * @param {Number} Maximum width this line can have
  30456. */
  30457. function Line(maxWidth) {
  30458. this.maxWidth = maxWidth;
  30459. this.leadingCut = 0;
  30460. this.trailingCut = 0;
  30461. this.inlineWidths = 0;
  30462. this.inlines = [];
  30463. }
  30464. Line.prototype.getAscenderHeight = function () {
  30465. var y = 0;
  30466. this.inlines.forEach(function (inline) {
  30467. y = Math.max(y, inline.font.ascender / 1000 * inline.fontSize);
  30468. });
  30469. return y;
  30470. };
  30471. Line.prototype.hasEnoughSpaceForInline = function (inline) {
  30472. if (this.inlines.length === 0) {
  30473. return true;
  30474. }
  30475. if (this.newLineForced) {
  30476. return false;
  30477. }
  30478. return this.inlineWidths + inline.width - this.leadingCut - (inline.trailingCut || 0) <= this.maxWidth;
  30479. };
  30480. Line.prototype.addInline = function (inline) {
  30481. if (this.inlines.length === 0) {
  30482. this.leadingCut = inline.leadingCut || 0;
  30483. }
  30484. this.trailingCut = inline.trailingCut || 0;
  30485. inline.x = this.inlineWidths - this.leadingCut;
  30486. this.inlines.push(inline);
  30487. this.inlineWidths += inline.width;
  30488. if (inline.lineEnd) {
  30489. this.newLineForced = true;
  30490. }
  30491. };
  30492. Line.prototype.getWidth = function () {
  30493. return this.inlineWidths - this.leadingCut - this.trailingCut;
  30494. };
  30495. /**
  30496. * Returns line height
  30497. * @return {Number}
  30498. */
  30499. Line.prototype.getHeight = function () {
  30500. var max = 0;
  30501. this.inlines.forEach(function (item) {
  30502. max = Math.max(max, item.height || 0);
  30503. });
  30504. return max;
  30505. };
  30506. module.exports = Line;
  30507. /***/ }),
  30508. /* 29 */
  30509. /***/ (function(module, exports, __webpack_require__) {
  30510. /* jslint node: true */
  30511. 'use strict';
  30512. var ColumnCalculator = __webpack_require__(23);
  30513. function TableProcessor(tableNode) {
  30514. this.tableNode = tableNode;
  30515. }
  30516. TableProcessor.prototype.beginTable = function (writer) {
  30517. var tableNode;
  30518. var availableWidth;
  30519. var self = this;
  30520. tableNode = this.tableNode;
  30521. this.offsets = tableNode._offsets;
  30522. this.layout = tableNode._layout;
  30523. availableWidth = writer.context().availableWidth - this.offsets.total;
  30524. ColumnCalculator.buildColumnWidths(tableNode.table.widths, availableWidth);
  30525. this.tableWidth = tableNode._offsets.total + getTableInnerContentWidth();
  30526. this.rowSpanData = prepareRowSpanData();
  30527. this.cleanUpRepeatables = false;
  30528. this.headerRows = tableNode.table.headerRows || 0;
  30529. this.rowsWithoutPageBreak = this.headerRows + (tableNode.table.keepWithHeaderRows || 0);
  30530. this.dontBreakRows = tableNode.table.dontBreakRows || false;
  30531. if (this.rowsWithoutPageBreak) {
  30532. writer.beginUnbreakableBlock();
  30533. }
  30534. // update the border properties of all cells before drawing any lines
  30535. prepareCellBorders(this.tableNode.table.body);
  30536. this.drawHorizontalLine(0, writer);
  30537. function getTableInnerContentWidth() {
  30538. var width = 0;
  30539. tableNode.table.widths.forEach(function (w) {
  30540. width += w._calcWidth;
  30541. });
  30542. return width;
  30543. }
  30544. function prepareRowSpanData() {
  30545. var rsd = [];
  30546. var x = 0;
  30547. var lastWidth = 0;
  30548. rsd.push({left: 0, rowSpan: 0});
  30549. for (var i = 0, l = self.tableNode.table.body[0].length; i < l; i++) {
  30550. var paddings = self.layout.paddingLeft(i, self.tableNode) + self.layout.paddingRight(i, self.tableNode);
  30551. var lBorder = self.layout.vLineWidth(i, self.tableNode);
  30552. lastWidth = paddings + lBorder + self.tableNode.table.widths[i]._calcWidth;
  30553. rsd[rsd.length - 1].width = lastWidth;
  30554. x += lastWidth;
  30555. rsd.push({left: x, rowSpan: 0, width: 0});
  30556. }
  30557. return rsd;
  30558. }
  30559. // Iterate through all cells. If the current cell is the start of a
  30560. // rowSpan/colSpan, update the border property of the cells on its
  30561. // bottom/right accordingly. This is needed since each iteration of the
  30562. // line-drawing loops draws lines for a single cell, not for an entire
  30563. // rowSpan/colSpan.
  30564. function prepareCellBorders(body) {
  30565. for (var rowIndex = 0; rowIndex < body.length; rowIndex++) {
  30566. var row = body[rowIndex];
  30567. for (var colIndex = 0; colIndex < row.length; colIndex++) {
  30568. var cell = row[colIndex];
  30569. if (cell.border) {
  30570. var rowSpan = cell.rowSpan || 1;
  30571. var colSpan = cell.colSpan || 1;
  30572. for (var rowOffset = 0; rowOffset < rowSpan; rowOffset++) {
  30573. // set left border
  30574. if (cell.border[0] !== undefined && rowOffset > 0) {
  30575. setBorder(rowIndex + rowOffset, colIndex, 0, cell.border[0]);
  30576. }
  30577. // set right border
  30578. if (cell.border[2] !== undefined) {
  30579. setBorder(rowIndex + rowOffset, colIndex + colSpan - 1, 2, cell.border[2]);
  30580. }
  30581. }
  30582. for (var colOffset = 0; colOffset < colSpan; colOffset++) {
  30583. // set top border
  30584. if (cell.border[1] !== undefined && colOffset > 0) {
  30585. setBorder(rowIndex, colIndex + colOffset, 1, cell.border[1]);
  30586. }
  30587. // set bottom border
  30588. if (cell.border[3] !== undefined) {
  30589. setBorder(rowIndex + rowSpan - 1, colIndex + colOffset, 3, cell.border[3]);
  30590. }
  30591. }
  30592. }
  30593. }
  30594. }
  30595. // helper function to set the border for a given cell
  30596. function setBorder(rowIndex, colIndex, borderIndex, borderValue) {
  30597. var cell = body[rowIndex][colIndex];
  30598. cell.border = cell.border || {};
  30599. cell.border[borderIndex] = borderValue;
  30600. }
  30601. }
  30602. };
  30603. TableProcessor.prototype.onRowBreak = function (rowIndex, writer) {
  30604. var self = this;
  30605. return function () {
  30606. var offset = self.rowPaddingTop + (!self.headerRows ? self.topLineWidth : 0);
  30607. writer.context().availableHeight -= self.reservedAtBottom;
  30608. writer.context().moveDown(offset);
  30609. };
  30610. };
  30611. TableProcessor.prototype.beginRow = function (rowIndex, writer) {
  30612. this.topLineWidth = this.layout.hLineWidth(rowIndex, this.tableNode);
  30613. this.rowPaddingTop = this.layout.paddingTop(rowIndex, this.tableNode);
  30614. this.bottomLineWidth = this.layout.hLineWidth(rowIndex + 1, this.tableNode);
  30615. this.rowPaddingBottom = this.layout.paddingBottom(rowIndex, this.tableNode);
  30616. this.rowCallback = this.onRowBreak(rowIndex, writer);
  30617. writer.tracker.startTracking('pageChanged', this.rowCallback);
  30618. if (this.dontBreakRows) {
  30619. writer.beginUnbreakableBlock();
  30620. }
  30621. this.rowTopY = writer.context().y;
  30622. this.reservedAtBottom = this.bottomLineWidth + this.rowPaddingBottom;
  30623. writer.context().availableHeight -= this.reservedAtBottom;
  30624. writer.context().moveDown(this.rowPaddingTop);
  30625. };
  30626. TableProcessor.prototype.drawHorizontalLine = function (lineIndex, writer, overrideY) {
  30627. var lineWidth = this.layout.hLineWidth(lineIndex, this.tableNode);
  30628. if (lineWidth) {
  30629. var offset = lineWidth / 2;
  30630. var currentLine = null;
  30631. var body = this.tableNode.table.body;
  30632. for (var i = 0, l = this.rowSpanData.length; i < l; i++) {
  30633. var data = this.rowSpanData[i];
  30634. var shouldDrawLine = !data.rowSpan;
  30635. // draw only if the current cell requires a top border or the cell in the
  30636. // row above requires a bottom border
  30637. if (shouldDrawLine && i < l - 1) {
  30638. var topBorder = false, bottomBorder = false;
  30639. // the current cell
  30640. if (lineIndex < body.length) {
  30641. var cell = body[lineIndex][i];
  30642. topBorder = cell.border ? cell.border[1] : this.layout.defaultBorder;
  30643. }
  30644. // the cell in the row above
  30645. if (lineIndex > 0) {
  30646. var cellAbove = body[lineIndex - 1][i];
  30647. bottomBorder = cellAbove.border ? cellAbove.border[3] : this.layout.defaultBorder;
  30648. }
  30649. shouldDrawLine = topBorder || bottomBorder;
  30650. }
  30651. if (!currentLine && shouldDrawLine) {
  30652. currentLine = {left: data.left, width: 0};
  30653. }
  30654. if (shouldDrawLine) {
  30655. currentLine.width += (data.width || 0);
  30656. }
  30657. var y = (overrideY || 0) + offset;
  30658. if (!shouldDrawLine || i === l - 1) {
  30659. if (currentLine && currentLine.width) {
  30660. writer.addVector({
  30661. type: 'line',
  30662. x1: currentLine.left,
  30663. x2: currentLine.left + currentLine.width,
  30664. y1: y,
  30665. y2: y,
  30666. lineWidth: lineWidth,
  30667. lineColor: typeof this.layout.hLineColor === 'function' ? this.layout.hLineColor(lineIndex, this.tableNode) : this.layout.hLineColor
  30668. }, false, overrideY);
  30669. currentLine = null;
  30670. }
  30671. }
  30672. }
  30673. writer.context().moveDown(lineWidth);
  30674. }
  30675. };
  30676. TableProcessor.prototype.drawVerticalLine = function (x, y0, y1, vLineIndex, writer) {
  30677. var width = this.layout.vLineWidth(vLineIndex, this.tableNode);
  30678. if (width === 0) {
  30679. return;
  30680. }
  30681. writer.addVector({
  30682. type: 'line',
  30683. x1: x + width / 2,
  30684. x2: x + width / 2,
  30685. y1: y0,
  30686. y2: y1,
  30687. lineWidth: width,
  30688. lineColor: typeof this.layout.vLineColor === 'function' ? this.layout.vLineColor(vLineIndex, this.tableNode) : this.layout.vLineColor
  30689. }, false, true);
  30690. };
  30691. TableProcessor.prototype.endTable = function (writer) {
  30692. if (this.cleanUpRepeatables) {
  30693. writer.popFromRepeatables();
  30694. this.headerRepeatableHeight = null;
  30695. }
  30696. };
  30697. TableProcessor.prototype.endRow = function (rowIndex, writer, pageBreaks) {
  30698. var l, i;
  30699. var self = this;
  30700. writer.tracker.stopTracking('pageChanged', this.rowCallback);
  30701. writer.context().moveDown(this.layout.paddingBottom(rowIndex, this.tableNode));
  30702. writer.context().availableHeight += this.reservedAtBottom;
  30703. var endingPage = writer.context().page;
  30704. var endingY = writer.context().y;
  30705. var xs = getLineXs();
  30706. var ys = [];
  30707. var hasBreaks = pageBreaks && pageBreaks.length > 0;
  30708. var body = this.tableNode.table.body;
  30709. ys.push({
  30710. y0: this.rowTopY,
  30711. page: hasBreaks ? pageBreaks[0].prevPage : endingPage
  30712. });
  30713. if (hasBreaks) {
  30714. for (i = 0, l = pageBreaks.length; i < l; i++) {
  30715. var pageBreak = pageBreaks[i];
  30716. ys[ys.length - 1].y1 = pageBreak.prevY;
  30717. ys.push({y0: pageBreak.y, page: pageBreak.prevPage + 1});
  30718. if (this.headerRepeatableHeight) {
  30719. ys[ys.length - 1].y0 += this.headerRepeatableHeight;
  30720. }
  30721. }
  30722. }
  30723. ys[ys.length - 1].y1 = endingY;
  30724. var skipOrphanePadding = (ys[0].y1 - ys[0].y0 === this.rowPaddingTop);
  30725. for (var yi = (skipOrphanePadding ? 1 : 0), yl = ys.length; yi < yl; yi++) {
  30726. var willBreak = yi < ys.length - 1;
  30727. var rowBreakWithoutHeader = (yi > 0 && !this.headerRows);
  30728. var hzLineOffset = rowBreakWithoutHeader ? 0 : this.topLineWidth;
  30729. var y1 = ys[yi].y0;
  30730. var y2 = ys[yi].y1;
  30731. if (willBreak) {
  30732. y2 = y2 + this.rowPaddingBottom;
  30733. }
  30734. if (writer.context().page != ys[yi].page) {
  30735. writer.context().page = ys[yi].page;
  30736. //TODO: buggy, availableHeight should be updated on every pageChanged event
  30737. // TableProcessor should be pageChanged listener, instead of processRow
  30738. this.reservedAtBottom = 0;
  30739. }
  30740. for (i = 0, l = xs.length; i < l; i++) {
  30741. var leftBorder = false, rightBorder = false;
  30742. var colIndex = xs[i].index;
  30743. // the current cell
  30744. if (colIndex < body[rowIndex].length) {
  30745. var cell = body[rowIndex][colIndex];
  30746. leftBorder = cell.border ? cell.border[0] : this.layout.defaultBorder;
  30747. }
  30748. // the cell from before column
  30749. if (colIndex > 0) {
  30750. var cell = body[rowIndex][colIndex - 1];
  30751. rightBorder = cell.border ? cell.border[2] : this.layout.defaultBorder;
  30752. }
  30753. if (leftBorder || rightBorder) {
  30754. this.drawVerticalLine(xs[i].x, y1 - hzLineOffset, y2 + this.bottomLineWidth, xs[i].index, writer);
  30755. }
  30756. if (i < l - 1) {
  30757. var fillColor = body[rowIndex][colIndex].fillColor;
  30758. if (!fillColor) {
  30759. fillColor = typeof this.layout.fillColor === 'function' ? this.layout.fillColor(rowIndex, this.tableNode) : this.layout.fillColor;
  30760. }
  30761. if (fillColor) {
  30762. var wBorder = (leftBorder || rightBorder) ? this.layout.vLineWidth(colIndex, this.tableNode) : 0;
  30763. var xf = xs[i].x + wBorder;
  30764. var yf = this.dontBreakRows ? y1 : y1 - hzLineOffset;
  30765. writer.addVector({
  30766. type: 'rect',
  30767. x: xf,
  30768. y: yf,
  30769. w: xs[i + 1].x - xf,
  30770. h: y2 + this.bottomLineWidth - yf,
  30771. lineWidth: 0,
  30772. color: fillColor
  30773. }, false, true, 0);
  30774. }
  30775. }
  30776. }
  30777. if (willBreak && this.layout.hLineWhenBroken !== false) {
  30778. this.drawHorizontalLine(rowIndex + 1, writer, y2);
  30779. }
  30780. if (rowBreakWithoutHeader && this.layout.hLineWhenBroken !== false) {
  30781. this.drawHorizontalLine(rowIndex, writer, y1);
  30782. }
  30783. }
  30784. writer.context().page = endingPage;
  30785. writer.context().y = endingY;
  30786. var row = this.tableNode.table.body[rowIndex];
  30787. for (i = 0, l = row.length; i < l; i++) {
  30788. if (row[i].rowSpan) {
  30789. this.rowSpanData[i].rowSpan = row[i].rowSpan;
  30790. // fix colSpans
  30791. if (row[i].colSpan && row[i].colSpan > 1) {
  30792. for (var j = 1; j < row[i].rowSpan; j++) {
  30793. this.tableNode.table.body[rowIndex + j][i]._colSpan = row[i].colSpan;
  30794. }
  30795. }
  30796. }
  30797. if (this.rowSpanData[i].rowSpan > 0) {
  30798. this.rowSpanData[i].rowSpan--;
  30799. }
  30800. }
  30801. this.drawHorizontalLine(rowIndex + 1, writer);
  30802. if (this.headerRows && rowIndex === this.headerRows - 1) {
  30803. this.headerRepeatable = writer.currentBlockToRepeatable();
  30804. }
  30805. if (this.dontBreakRows) {
  30806. writer.tracker.auto('pageChanged',
  30807. function () {
  30808. if (!self.headerRows && self.layout.hLineWhenBroken !== false) {
  30809. self.drawHorizontalLine(rowIndex, writer);
  30810. }
  30811. },
  30812. function () {
  30813. writer.commitUnbreakableBlock();
  30814. }
  30815. );
  30816. }
  30817. if (this.headerRepeatable && (rowIndex === (this.rowsWithoutPageBreak - 1) || rowIndex === this.tableNode.table.body.length - 1)) {
  30818. this.headerRepeatableHeight = this.headerRepeatable.height;
  30819. writer.commitUnbreakableBlock();
  30820. writer.pushToRepeatables(this.headerRepeatable);
  30821. this.cleanUpRepeatables = true;
  30822. this.headerRepeatable = null;
  30823. }
  30824. function getLineXs() {
  30825. var result = [];
  30826. var cols = 0;
  30827. for (var i = 0, l = self.tableNode.table.body[rowIndex].length; i < l; i++) {
  30828. if (!cols) {
  30829. result.push({x: self.rowSpanData[i].left, index: i});
  30830. var item = self.tableNode.table.body[rowIndex][i];
  30831. cols = (item._colSpan || item.colSpan || 0);
  30832. }
  30833. if (cols > 0) {
  30834. cols--;
  30835. }
  30836. }
  30837. result.push({x: self.rowSpanData[self.rowSpanData.length - 1].left, index: self.rowSpanData.length - 1});
  30838. return result;
  30839. }
  30840. };
  30841. module.exports = TableProcessor;
  30842. /***/ }),
  30843. /* 30 */
  30844. /***/ (function(module, exports, __webpack_require__) {
  30845. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  30846. /*
  30847. PDFDocument - represents an entire PDF document
  30848. By Devon Govett
  30849. */
  30850. (function() {
  30851. var PDFDocument, PDFObject, PDFPage, PDFReference, fs, stream,
  30852. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  30853. hasProp = {}.hasOwnProperty;
  30854. stream = __webpack_require__(31);
  30855. fs = __webpack_require__(56);
  30856. PDFObject = __webpack_require__(57);
  30857. PDFReference = __webpack_require__(58);
  30858. PDFPage = __webpack_require__(76);
  30859. PDFDocument = (function(superClass) {
  30860. var mixin;
  30861. extend(PDFDocument, superClass);
  30862. function PDFDocument(options1) {
  30863. var key, ref1, ref2, val;
  30864. this.options = options1 != null ? options1 : {};
  30865. PDFDocument.__super__.constructor.apply(this, arguments);
  30866. this.version = 1.3;
  30867. this.compress = (ref1 = this.options.compress) != null ? ref1 : true;
  30868. this._pageBuffer = [];
  30869. this._pageBufferStart = 0;
  30870. this._offsets = [];
  30871. this._waiting = 0;
  30872. this._ended = false;
  30873. this._offset = 0;
  30874. this._root = this.ref({
  30875. Type: 'Catalog',
  30876. Pages: this.ref({
  30877. Type: 'Pages',
  30878. Count: 0,
  30879. Kids: []
  30880. })
  30881. });
  30882. this.page = null;
  30883. this.initColor();
  30884. this.initVector();
  30885. this.initFonts();
  30886. this.initText();
  30887. this.initImages();
  30888. this.info = {
  30889. Producer: 'PDFKit',
  30890. Creator: 'PDFKit',
  30891. CreationDate: new Date()
  30892. };
  30893. if (this.options.info) {
  30894. ref2 = this.options.info;
  30895. for (key in ref2) {
  30896. val = ref2[key];
  30897. this.info[key] = val;
  30898. }
  30899. }
  30900. this._write("%PDF-" + this.version);
  30901. this._write("%\xFF\xFF\xFF\xFF");
  30902. if (this.options.autoFirstPage !== false) {
  30903. this.addPage();
  30904. }
  30905. }
  30906. mixin = function(methods) {
  30907. var method, name, results;
  30908. results = [];
  30909. for (name in methods) {
  30910. method = methods[name];
  30911. results.push(PDFDocument.prototype[name] = method);
  30912. }
  30913. return results;
  30914. };
  30915. mixin(__webpack_require__(77));
  30916. mixin(__webpack_require__(79));
  30917. mixin(__webpack_require__(81));
  30918. mixin(__webpack_require__(288));
  30919. mixin(__webpack_require__(290));
  30920. mixin(__webpack_require__(296));
  30921. PDFDocument.prototype.addPage = function(options) {
  30922. var pages;
  30923. if (options == null) {
  30924. options = this.options;
  30925. }
  30926. if (!this.options.bufferPages) {
  30927. this.flushPages();
  30928. }
  30929. this.page = new PDFPage(this, options);
  30930. this._pageBuffer.push(this.page);
  30931. pages = this._root.data.Pages.data;
  30932. pages.Kids.push(this.page.dictionary);
  30933. pages.Count++;
  30934. this.x = this.page.margins.left;
  30935. this.y = this.page.margins.top;
  30936. this._ctm = [1, 0, 0, 1, 0, 0];
  30937. this.transform(1, 0, 0, -1, 0, this.page.height);
  30938. this.emit('pageAdded');
  30939. return this;
  30940. };
  30941. PDFDocument.prototype.bufferedPageRange = function() {
  30942. return {
  30943. start: this._pageBufferStart,
  30944. count: this._pageBuffer.length
  30945. };
  30946. };
  30947. PDFDocument.prototype.switchToPage = function(n) {
  30948. var page;
  30949. if (!(page = this._pageBuffer[n - this._pageBufferStart])) {
  30950. throw new Error("switchToPage(" + n + ") out of bounds, current buffer covers pages " + this._pageBufferStart + " to " + (this._pageBufferStart + this._pageBuffer.length - 1));
  30951. }
  30952. return this.page = page;
  30953. };
  30954. PDFDocument.prototype.flushPages = function() {
  30955. var i, len, page, pages;
  30956. pages = this._pageBuffer;
  30957. this._pageBuffer = [];
  30958. this._pageBufferStart += pages.length;
  30959. for (i = 0, len = pages.length; i < len; i++) {
  30960. page = pages[i];
  30961. page.end();
  30962. }
  30963. };
  30964. PDFDocument.prototype.ref = function(data) {
  30965. var ref;
  30966. ref = new PDFReference(this, this._offsets.length + 1, data);
  30967. this._offsets.push(null);
  30968. this._waiting++;
  30969. return ref;
  30970. };
  30971. PDFDocument.prototype._read = function() {};
  30972. PDFDocument.prototype._write = function(data) {
  30973. if (!Buffer.isBuffer(data)) {
  30974. data = new Buffer(data + '\n', 'binary');
  30975. }
  30976. this.push(data);
  30977. return this._offset += data.length;
  30978. };
  30979. PDFDocument.prototype.addContent = function(data) {
  30980. this.page.write(data);
  30981. return this;
  30982. };
  30983. PDFDocument.prototype._refEnd = function(ref) {
  30984. this._offsets[ref.id - 1] = ref.offset;
  30985. if (--this._waiting === 0 && this._ended) {
  30986. this._finalize();
  30987. return this._ended = false;
  30988. }
  30989. };
  30990. PDFDocument.prototype.write = function(filename, fn) {
  30991. var err;
  30992. err = new Error('PDFDocument#write is deprecated, and will be removed in a future version of PDFKit. Please pipe the document into a Node stream.');
  30993. console.warn(err.stack);
  30994. this.pipe(fs.createWriteStream(filename));
  30995. this.end();
  30996. return this.once('end', fn);
  30997. };
  30998. PDFDocument.prototype.output = function(fn) {
  30999. throw new Error('PDFDocument#output is deprecated, and has been removed from PDFKit. Please pipe the document into a Node stream.');
  31000. };
  31001. PDFDocument.prototype.end = function() {
  31002. var font, key, name, ref1, ref2, val;
  31003. this.flushPages();
  31004. this._info = this.ref();
  31005. ref1 = this.info;
  31006. for (key in ref1) {
  31007. val = ref1[key];
  31008. if (typeof val === 'string') {
  31009. val = new String(val);
  31010. }
  31011. this._info.data[key] = val;
  31012. }
  31013. this._info.end();
  31014. ref2 = this._fontFamilies;
  31015. for (name in ref2) {
  31016. font = ref2[name];
  31017. font.finalize();
  31018. }
  31019. this._root.end();
  31020. this._root.data.Pages.end();
  31021. if (this._waiting === 0) {
  31022. return this._finalize();
  31023. } else {
  31024. return this._ended = true;
  31025. }
  31026. };
  31027. PDFDocument.prototype._finalize = function(fn) {
  31028. var i, len, offset, ref1, xRefOffset;
  31029. xRefOffset = this._offset;
  31030. this._write("xref");
  31031. this._write("0 " + (this._offsets.length + 1));
  31032. this._write("0000000000 65535 f ");
  31033. ref1 = this._offsets;
  31034. for (i = 0, len = ref1.length; i < len; i++) {
  31035. offset = ref1[i];
  31036. offset = ('0000000000' + offset).slice(-10);
  31037. this._write(offset + ' 00000 n ');
  31038. }
  31039. this._write('trailer');
  31040. this._write(PDFObject.convert({
  31041. Size: this._offsets.length + 1,
  31042. Root: this._root,
  31043. Info: this._info
  31044. }));
  31045. this._write('startxref');
  31046. this._write("" + xRefOffset);
  31047. this._write('%%EOF');
  31048. return this.push(null);
  31049. };
  31050. PDFDocument.prototype.toString = function() {
  31051. return "[object PDFDocument]";
  31052. };
  31053. return PDFDocument;
  31054. })(stream.Readable);
  31055. module.exports = PDFDocument;
  31056. }).call(this);
  31057. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  31058. /***/ }),
  31059. /* 31 */
  31060. /***/ (function(module, exports, __webpack_require__) {
  31061. // Copyright Joyent, Inc. and other Node contributors.
  31062. //
  31063. // Permission is hereby granted, free of charge, to any person obtaining a
  31064. // copy of this software and associated documentation files (the
  31065. // "Software"), to deal in the Software without restriction, including
  31066. // without limitation the rights to use, copy, modify, merge, publish,
  31067. // distribute, sublicense, and/or sell copies of the Software, and to permit
  31068. // persons to whom the Software is furnished to do so, subject to the
  31069. // following conditions:
  31070. //
  31071. // The above copyright notice and this permission notice shall be included
  31072. // in all copies or substantial portions of the Software.
  31073. //
  31074. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  31075. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  31076. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  31077. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  31078. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  31079. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  31080. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  31081. module.exports = Stream;
  31082. var EE = __webpack_require__(32).EventEmitter;
  31083. var inherits = __webpack_require__(33);
  31084. inherits(Stream, EE);
  31085. Stream.Readable = __webpack_require__(34);
  31086. Stream.Writable = __webpack_require__(52);
  31087. Stream.Duplex = __webpack_require__(53);
  31088. Stream.Transform = __webpack_require__(54);
  31089. Stream.PassThrough = __webpack_require__(55);
  31090. // Backwards-compat with node 0.4.x
  31091. Stream.Stream = Stream;
  31092. // old-style streams. Note that the pipe method (the only relevant
  31093. // part of this class) is overridden in the Readable class.
  31094. function Stream() {
  31095. EE.call(this);
  31096. }
  31097. Stream.prototype.pipe = function(dest, options) {
  31098. var source = this;
  31099. function ondata(chunk) {
  31100. if (dest.writable) {
  31101. if (false === dest.write(chunk) && source.pause) {
  31102. source.pause();
  31103. }
  31104. }
  31105. }
  31106. source.on('data', ondata);
  31107. function ondrain() {
  31108. if (source.readable && source.resume) {
  31109. source.resume();
  31110. }
  31111. }
  31112. dest.on('drain', ondrain);
  31113. // If the 'end' option is not supplied, dest.end() will be called when
  31114. // source gets the 'end' or 'close' events. Only dest.end() once.
  31115. if (!dest._isStdio && (!options || options.end !== false)) {
  31116. source.on('end', onend);
  31117. source.on('close', onclose);
  31118. }
  31119. var didOnEnd = false;
  31120. function onend() {
  31121. if (didOnEnd) return;
  31122. didOnEnd = true;
  31123. dest.end();
  31124. }
  31125. function onclose() {
  31126. if (didOnEnd) return;
  31127. didOnEnd = true;
  31128. if (typeof dest.destroy === 'function') dest.destroy();
  31129. }
  31130. // don't leave dangling pipes when there are errors.
  31131. function onerror(er) {
  31132. cleanup();
  31133. if (EE.listenerCount(this, 'error') === 0) {
  31134. throw er; // Unhandled stream error in pipe.
  31135. }
  31136. }
  31137. source.on('error', onerror);
  31138. dest.on('error', onerror);
  31139. // remove all the event listeners that were added.
  31140. function cleanup() {
  31141. source.removeListener('data', ondata);
  31142. dest.removeListener('drain', ondrain);
  31143. source.removeListener('end', onend);
  31144. source.removeListener('close', onclose);
  31145. source.removeListener('error', onerror);
  31146. dest.removeListener('error', onerror);
  31147. source.removeListener('end', cleanup);
  31148. source.removeListener('close', cleanup);
  31149. dest.removeListener('close', cleanup);
  31150. }
  31151. source.on('end', cleanup);
  31152. source.on('close', cleanup);
  31153. dest.on('close', cleanup);
  31154. dest.emit('pipe', source);
  31155. // Allow for unix-like usage: A.pipe(B).pipe(C)
  31156. return dest;
  31157. };
  31158. /***/ }),
  31159. /* 32 */
  31160. /***/ (function(module, exports) {
  31161. // Copyright Joyent, Inc. and other Node contributors.
  31162. //
  31163. // Permission is hereby granted, free of charge, to any person obtaining a
  31164. // copy of this software and associated documentation files (the
  31165. // "Software"), to deal in the Software without restriction, including
  31166. // without limitation the rights to use, copy, modify, merge, publish,
  31167. // distribute, sublicense, and/or sell copies of the Software, and to permit
  31168. // persons to whom the Software is furnished to do so, subject to the
  31169. // following conditions:
  31170. //
  31171. // The above copyright notice and this permission notice shall be included
  31172. // in all copies or substantial portions of the Software.
  31173. //
  31174. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  31175. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  31176. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  31177. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  31178. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  31179. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  31180. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  31181. function EventEmitter() {
  31182. this._events = this._events || {};
  31183. this._maxListeners = this._maxListeners || undefined;
  31184. }
  31185. module.exports = EventEmitter;
  31186. // Backwards-compat with node 0.10.x
  31187. EventEmitter.EventEmitter = EventEmitter;
  31188. EventEmitter.prototype._events = undefined;
  31189. EventEmitter.prototype._maxListeners = undefined;
  31190. // By default EventEmitters will print a warning if more than 10 listeners are
  31191. // added to it. This is a useful default which helps finding memory leaks.
  31192. EventEmitter.defaultMaxListeners = 10;
  31193. // Obviously not all Emitters should be limited to 10. This function allows
  31194. // that to be increased. Set to zero for unlimited.
  31195. EventEmitter.prototype.setMaxListeners = function(n) {
  31196. if (!isNumber(n) || n < 0 || isNaN(n))
  31197. throw TypeError('n must be a positive number');
  31198. this._maxListeners = n;
  31199. return this;
  31200. };
  31201. EventEmitter.prototype.emit = function(type) {
  31202. var er, handler, len, args, i, listeners;
  31203. if (!this._events)
  31204. this._events = {};
  31205. // If there is no 'error' event listener then throw.
  31206. if (type === 'error') {
  31207. if (!this._events.error ||
  31208. (isObject(this._events.error) && !this._events.error.length)) {
  31209. er = arguments[1];
  31210. if (er instanceof Error) {
  31211. throw er; // Unhandled 'error' event
  31212. } else {
  31213. // At least give some kind of context to the user
  31214. var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
  31215. err.context = er;
  31216. throw err;
  31217. }
  31218. }
  31219. }
  31220. handler = this._events[type];
  31221. if (isUndefined(handler))
  31222. return false;
  31223. if (isFunction(handler)) {
  31224. switch (arguments.length) {
  31225. // fast cases
  31226. case 1:
  31227. handler.call(this);
  31228. break;
  31229. case 2:
  31230. handler.call(this, arguments[1]);
  31231. break;
  31232. case 3:
  31233. handler.call(this, arguments[1], arguments[2]);
  31234. break;
  31235. // slower
  31236. default:
  31237. args = Array.prototype.slice.call(arguments, 1);
  31238. handler.apply(this, args);
  31239. }
  31240. } else if (isObject(handler)) {
  31241. args = Array.prototype.slice.call(arguments, 1);
  31242. listeners = handler.slice();
  31243. len = listeners.length;
  31244. for (i = 0; i < len; i++)
  31245. listeners[i].apply(this, args);
  31246. }
  31247. return true;
  31248. };
  31249. EventEmitter.prototype.addListener = function(type, listener) {
  31250. var m;
  31251. if (!isFunction(listener))
  31252. throw TypeError('listener must be a function');
  31253. if (!this._events)
  31254. this._events = {};
  31255. // To avoid recursion in the case that type === "newListener"! Before
  31256. // adding it to the listeners, first emit "newListener".
  31257. if (this._events.newListener)
  31258. this.emit('newListener', type,
  31259. isFunction(listener.listener) ?
  31260. listener.listener : listener);
  31261. if (!this._events[type])
  31262. // Optimize the case of one listener. Don't need the extra array object.
  31263. this._events[type] = listener;
  31264. else if (isObject(this._events[type]))
  31265. // If we've already got an array, just append.
  31266. this._events[type].push(listener);
  31267. else
  31268. // Adding the second element, need to change to array.
  31269. this._events[type] = [this._events[type], listener];
  31270. // Check for listener leak
  31271. if (isObject(this._events[type]) && !this._events[type].warned) {
  31272. if (!isUndefined(this._maxListeners)) {
  31273. m = this._maxListeners;
  31274. } else {
  31275. m = EventEmitter.defaultMaxListeners;
  31276. }
  31277. if (m && m > 0 && this._events[type].length > m) {
  31278. this._events[type].warned = true;
  31279. console.error('(node) warning: possible EventEmitter memory ' +
  31280. 'leak detected. %d listeners added. ' +
  31281. 'Use emitter.setMaxListeners() to increase limit.',
  31282. this._events[type].length);
  31283. if (typeof console.trace === 'function') {
  31284. // not supported in IE 10
  31285. console.trace();
  31286. }
  31287. }
  31288. }
  31289. return this;
  31290. };
  31291. EventEmitter.prototype.on = EventEmitter.prototype.addListener;
  31292. EventEmitter.prototype.once = function(type, listener) {
  31293. if (!isFunction(listener))
  31294. throw TypeError('listener must be a function');
  31295. var fired = false;
  31296. function g() {
  31297. this.removeListener(type, g);
  31298. if (!fired) {
  31299. fired = true;
  31300. listener.apply(this, arguments);
  31301. }
  31302. }
  31303. g.listener = listener;
  31304. this.on(type, g);
  31305. return this;
  31306. };
  31307. // emits a 'removeListener' event iff the listener was removed
  31308. EventEmitter.prototype.removeListener = function(type, listener) {
  31309. var list, position, length, i;
  31310. if (!isFunction(listener))
  31311. throw TypeError('listener must be a function');
  31312. if (!this._events || !this._events[type])
  31313. return this;
  31314. list = this._events[type];
  31315. length = list.length;
  31316. position = -1;
  31317. if (list === listener ||
  31318. (isFunction(list.listener) && list.listener === listener)) {
  31319. delete this._events[type];
  31320. if (this._events.removeListener)
  31321. this.emit('removeListener', type, listener);
  31322. } else if (isObject(list)) {
  31323. for (i = length; i-- > 0;) {
  31324. if (list[i] === listener ||
  31325. (list[i].listener && list[i].listener === listener)) {
  31326. position = i;
  31327. break;
  31328. }
  31329. }
  31330. if (position < 0)
  31331. return this;
  31332. if (list.length === 1) {
  31333. list.length = 0;
  31334. delete this._events[type];
  31335. } else {
  31336. list.splice(position, 1);
  31337. }
  31338. if (this._events.removeListener)
  31339. this.emit('removeListener', type, listener);
  31340. }
  31341. return this;
  31342. };
  31343. EventEmitter.prototype.removeAllListeners = function(type) {
  31344. var key, listeners;
  31345. if (!this._events)
  31346. return this;
  31347. // not listening for removeListener, no need to emit
  31348. if (!this._events.removeListener) {
  31349. if (arguments.length === 0)
  31350. this._events = {};
  31351. else if (this._events[type])
  31352. delete this._events[type];
  31353. return this;
  31354. }
  31355. // emit removeListener for all listeners on all events
  31356. if (arguments.length === 0) {
  31357. for (key in this._events) {
  31358. if (key === 'removeListener') continue;
  31359. this.removeAllListeners(key);
  31360. }
  31361. this.removeAllListeners('removeListener');
  31362. this._events = {};
  31363. return this;
  31364. }
  31365. listeners = this._events[type];
  31366. if (isFunction(listeners)) {
  31367. this.removeListener(type, listeners);
  31368. } else if (listeners) {
  31369. // LIFO order
  31370. while (listeners.length)
  31371. this.removeListener(type, listeners[listeners.length - 1]);
  31372. }
  31373. delete this._events[type];
  31374. return this;
  31375. };
  31376. EventEmitter.prototype.listeners = function(type) {
  31377. var ret;
  31378. if (!this._events || !this._events[type])
  31379. ret = [];
  31380. else if (isFunction(this._events[type]))
  31381. ret = [this._events[type]];
  31382. else
  31383. ret = this._events[type].slice();
  31384. return ret;
  31385. };
  31386. EventEmitter.prototype.listenerCount = function(type) {
  31387. if (this._events) {
  31388. var evlistener = this._events[type];
  31389. if (isFunction(evlistener))
  31390. return 1;
  31391. else if (evlistener)
  31392. return evlistener.length;
  31393. }
  31394. return 0;
  31395. };
  31396. EventEmitter.listenerCount = function(emitter, type) {
  31397. return emitter.listenerCount(type);
  31398. };
  31399. function isFunction(arg) {
  31400. return typeof arg === 'function';
  31401. }
  31402. function isNumber(arg) {
  31403. return typeof arg === 'number';
  31404. }
  31405. function isObject(arg) {
  31406. return typeof arg === 'object' && arg !== null;
  31407. }
  31408. function isUndefined(arg) {
  31409. return arg === void 0;
  31410. }
  31411. /***/ }),
  31412. /* 33 */
  31413. /***/ (function(module, exports) {
  31414. if (typeof Object.create === 'function') {
  31415. // implementation from standard node.js 'util' module
  31416. module.exports = function inherits(ctor, superCtor) {
  31417. ctor.super_ = superCtor
  31418. ctor.prototype = Object.create(superCtor.prototype, {
  31419. constructor: {
  31420. value: ctor,
  31421. enumerable: false,
  31422. writable: true,
  31423. configurable: true
  31424. }
  31425. });
  31426. };
  31427. } else {
  31428. // old school shim for old browsers
  31429. module.exports = function inherits(ctor, superCtor) {
  31430. ctor.super_ = superCtor
  31431. var TempCtor = function () {}
  31432. TempCtor.prototype = superCtor.prototype
  31433. ctor.prototype = new TempCtor()
  31434. ctor.prototype.constructor = ctor
  31435. }
  31436. }
  31437. /***/ }),
  31438. /* 34 */
  31439. /***/ (function(module, exports, __webpack_require__) {
  31440. exports = module.exports = __webpack_require__(35);
  31441. exports.Stream = exports;
  31442. exports.Readable = exports;
  31443. exports.Writable = __webpack_require__(45);
  31444. exports.Duplex = __webpack_require__(44);
  31445. exports.Transform = __webpack_require__(50);
  31446. exports.PassThrough = __webpack_require__(51);
  31447. /***/ }),
  31448. /* 35 */
  31449. /***/ (function(module, exports, __webpack_require__) {
  31450. /* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
  31451. //
  31452. // Permission is hereby granted, free of charge, to any person obtaining a
  31453. // copy of this software and associated documentation files (the
  31454. // "Software"), to deal in the Software without restriction, including
  31455. // without limitation the rights to use, copy, modify, merge, publish,
  31456. // distribute, sublicense, and/or sell copies of the Software, and to permit
  31457. // persons to whom the Software is furnished to do so, subject to the
  31458. // following conditions:
  31459. //
  31460. // The above copyright notice and this permission notice shall be included
  31461. // in all copies or substantial portions of the Software.
  31462. //
  31463. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  31464. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  31465. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  31466. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  31467. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  31468. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  31469. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  31470. 'use strict';
  31471. /*<replacement>*/
  31472. var processNextTick = __webpack_require__(37);
  31473. /*</replacement>*/
  31474. module.exports = Readable;
  31475. /*<replacement>*/
  31476. var isArray = __webpack_require__(5);
  31477. /*</replacement>*/
  31478. /*<replacement>*/
  31479. var Duplex;
  31480. /*</replacement>*/
  31481. Readable.ReadableState = ReadableState;
  31482. /*<replacement>*/
  31483. var EE = __webpack_require__(32).EventEmitter;
  31484. var EElistenerCount = function (emitter, type) {
  31485. return emitter.listeners(type).length;
  31486. };
  31487. /*</replacement>*/
  31488. /*<replacement>*/
  31489. var Stream = __webpack_require__(38);
  31490. /*</replacement>*/
  31491. // TODO(bmeurer): Change this back to const once hole checks are
  31492. // properly optimized away early in Ignition+TurboFan.
  31493. /*<replacement>*/
  31494. var Buffer = __webpack_require__(39).Buffer;
  31495. var OurUint8Array = global.Uint8Array || function () {};
  31496. function _uint8ArrayToBuffer(chunk) {
  31497. return Buffer.from(chunk);
  31498. }
  31499. function _isUint8Array(obj) {
  31500. return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
  31501. }
  31502. /*</replacement>*/
  31503. /*<replacement>*/
  31504. var util = __webpack_require__(40);
  31505. util.inherits = __webpack_require__(33);
  31506. /*</replacement>*/
  31507. /*<replacement>*/
  31508. var debugUtil = __webpack_require__(41);
  31509. var debug = void 0;
  31510. if (debugUtil && debugUtil.debuglog) {
  31511. debug = debugUtil.debuglog('stream');
  31512. } else {
  31513. debug = function () {};
  31514. }
  31515. /*</replacement>*/
  31516. var BufferList = __webpack_require__(42);
  31517. var destroyImpl = __webpack_require__(43);
  31518. var StringDecoder;
  31519. util.inherits(Readable, Stream);
  31520. var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
  31521. function prependListener(emitter, event, fn) {
  31522. // Sadly this is not cacheable as some libraries bundle their own
  31523. // event emitter implementation with them.
  31524. if (typeof emitter.prependListener === 'function') {
  31525. return emitter.prependListener(event, fn);
  31526. } else {
  31527. // This is a hack to make sure that our error handler is attached before any
  31528. // userland ones. NEVER DO THIS. This is here only because this code needs
  31529. // to continue to work with older versions of Node.js that do not include
  31530. // the prependListener() method. The goal is to eventually remove this hack.
  31531. if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
  31532. }
  31533. }
  31534. function ReadableState(options, stream) {
  31535. Duplex = Duplex || __webpack_require__(44);
  31536. options = options || {};
  31537. // object stream flag. Used to make read(n) ignore n and to
  31538. // make all the buffer merging and length checks go away
  31539. this.objectMode = !!options.objectMode;
  31540. if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
  31541. // the point at which it stops calling _read() to fill the buffer
  31542. // Note: 0 is a valid value, means "don't call _read preemptively ever"
  31543. var hwm = options.highWaterMark;
  31544. var defaultHwm = this.objectMode ? 16 : 16 * 1024;
  31545. this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
  31546. // cast to ints.
  31547. this.highWaterMark = Math.floor(this.highWaterMark);
  31548. // A linked list is used to store data chunks instead of an array because the
  31549. // linked list can remove elements from the beginning faster than
  31550. // array.shift()
  31551. this.buffer = new BufferList();
  31552. this.length = 0;
  31553. this.pipes = null;
  31554. this.pipesCount = 0;
  31555. this.flowing = null;
  31556. this.ended = false;
  31557. this.endEmitted = false;
  31558. this.reading = false;
  31559. // a flag to be able to tell if the event 'readable'/'data' is emitted
  31560. // immediately, or on a later tick. We set this to true at first, because
  31561. // any actions that shouldn't happen until "later" should generally also
  31562. // not happen before the first read call.
  31563. this.sync = true;
  31564. // whenever we return null, then we set a flag to say
  31565. // that we're awaiting a 'readable' event emission.
  31566. this.needReadable = false;
  31567. this.emittedReadable = false;
  31568. this.readableListening = false;
  31569. this.resumeScheduled = false;
  31570. // has it been destroyed
  31571. this.destroyed = false;
  31572. // Crypto is kind of old and crusty. Historically, its default string
  31573. // encoding is 'binary' so we have to make this configurable.
  31574. // Everything else in the universe uses 'utf8', though.
  31575. this.defaultEncoding = options.defaultEncoding || 'utf8';
  31576. // the number of writers that are awaiting a drain event in .pipe()s
  31577. this.awaitDrain = 0;
  31578. // if true, a maybeReadMore has been scheduled
  31579. this.readingMore = false;
  31580. this.decoder = null;
  31581. this.encoding = null;
  31582. if (options.encoding) {
  31583. if (!StringDecoder) StringDecoder = __webpack_require__(49).StringDecoder;
  31584. this.decoder = new StringDecoder(options.encoding);
  31585. this.encoding = options.encoding;
  31586. }
  31587. }
  31588. function Readable(options) {
  31589. Duplex = Duplex || __webpack_require__(44);
  31590. if (!(this instanceof Readable)) return new Readable(options);
  31591. this._readableState = new ReadableState(options, this);
  31592. // legacy
  31593. this.readable = true;
  31594. if (options) {
  31595. if (typeof options.read === 'function') this._read = options.read;
  31596. if (typeof options.destroy === 'function') this._destroy = options.destroy;
  31597. }
  31598. Stream.call(this);
  31599. }
  31600. Object.defineProperty(Readable.prototype, 'destroyed', {
  31601. get: function () {
  31602. if (this._readableState === undefined) {
  31603. return false;
  31604. }
  31605. return this._readableState.destroyed;
  31606. },
  31607. set: function (value) {
  31608. // we ignore the value if the stream
  31609. // has not been initialized yet
  31610. if (!this._readableState) {
  31611. return;
  31612. }
  31613. // backward compatibility, the user is explicitly
  31614. // managing destroyed
  31615. this._readableState.destroyed = value;
  31616. }
  31617. });
  31618. Readable.prototype.destroy = destroyImpl.destroy;
  31619. Readable.prototype._undestroy = destroyImpl.undestroy;
  31620. Readable.prototype._destroy = function (err, cb) {
  31621. this.push(null);
  31622. cb(err);
  31623. };
  31624. // Manually shove something into the read() buffer.
  31625. // This returns true if the highWaterMark has not been hit yet,
  31626. // similar to how Writable.write() returns true if you should
  31627. // write() some more.
  31628. Readable.prototype.push = function (chunk, encoding) {
  31629. var state = this._readableState;
  31630. var skipChunkCheck;
  31631. if (!state.objectMode) {
  31632. if (typeof chunk === 'string') {
  31633. encoding = encoding || state.defaultEncoding;
  31634. if (encoding !== state.encoding) {
  31635. chunk = Buffer.from(chunk, encoding);
  31636. encoding = '';
  31637. }
  31638. skipChunkCheck = true;
  31639. }
  31640. } else {
  31641. skipChunkCheck = true;
  31642. }
  31643. return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
  31644. };
  31645. // Unshift should *always* be something directly out of read()
  31646. Readable.prototype.unshift = function (chunk) {
  31647. return readableAddChunk(this, chunk, null, true, false);
  31648. };
  31649. function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  31650. var state = stream._readableState;
  31651. if (chunk === null) {
  31652. state.reading = false;
  31653. onEofChunk(stream, state);
  31654. } else {
  31655. var er;
  31656. if (!skipChunkCheck) er = chunkInvalid(state, chunk);
  31657. if (er) {
  31658. stream.emit('error', er);
  31659. } else if (state.objectMode || chunk && chunk.length > 0) {
  31660. if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
  31661. chunk = _uint8ArrayToBuffer(chunk);
  31662. }
  31663. if (addToFront) {
  31664. if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
  31665. } else if (state.ended) {
  31666. stream.emit('error', new Error('stream.push() after EOF'));
  31667. } else {
  31668. state.reading = false;
  31669. if (state.decoder && !encoding) {
  31670. chunk = state.decoder.write(chunk);
  31671. if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
  31672. } else {
  31673. addChunk(stream, state, chunk, false);
  31674. }
  31675. }
  31676. } else if (!addToFront) {
  31677. state.reading = false;
  31678. }
  31679. }
  31680. return needMoreData(state);
  31681. }
  31682. function addChunk(stream, state, chunk, addToFront) {
  31683. if (state.flowing && state.length === 0 && !state.sync) {
  31684. stream.emit('data', chunk);
  31685. stream.read(0);
  31686. } else {
  31687. // update the buffer info.
  31688. state.length += state.objectMode ? 1 : chunk.length;
  31689. if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
  31690. if (state.needReadable) emitReadable(stream);
  31691. }
  31692. maybeReadMore(stream, state);
  31693. }
  31694. function chunkInvalid(state, chunk) {
  31695. var er;
  31696. if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
  31697. er = new TypeError('Invalid non-string/buffer chunk');
  31698. }
  31699. return er;
  31700. }
  31701. // if it's past the high water mark, we can push in some more.
  31702. // Also, if we have no data yet, we can stand some
  31703. // more bytes. This is to work around cases where hwm=0,
  31704. // such as the repl. Also, if the push() triggered a
  31705. // readable event, and the user called read(largeNumber) such that
  31706. // needReadable was set, then we ought to push more, so that another
  31707. // 'readable' event will be triggered.
  31708. function needMoreData(state) {
  31709. return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
  31710. }
  31711. Readable.prototype.isPaused = function () {
  31712. return this._readableState.flowing === false;
  31713. };
  31714. // backwards compatibility.
  31715. Readable.prototype.setEncoding = function (enc) {
  31716. if (!StringDecoder) StringDecoder = __webpack_require__(49).StringDecoder;
  31717. this._readableState.decoder = new StringDecoder(enc);
  31718. this._readableState.encoding = enc;
  31719. return this;
  31720. };
  31721. // Don't raise the hwm > 8MB
  31722. var MAX_HWM = 0x800000;
  31723. function computeNewHighWaterMark(n) {
  31724. if (n >= MAX_HWM) {
  31725. n = MAX_HWM;
  31726. } else {
  31727. // Get the next highest power of 2 to prevent increasing hwm excessively in
  31728. // tiny amounts
  31729. n--;
  31730. n |= n >>> 1;
  31731. n |= n >>> 2;
  31732. n |= n >>> 4;
  31733. n |= n >>> 8;
  31734. n |= n >>> 16;
  31735. n++;
  31736. }
  31737. return n;
  31738. }
  31739. // This function is designed to be inlinable, so please take care when making
  31740. // changes to the function body.
  31741. function howMuchToRead(n, state) {
  31742. if (n <= 0 || state.length === 0 && state.ended) return 0;
  31743. if (state.objectMode) return 1;
  31744. if (n !== n) {
  31745. // Only flow one buffer at a time
  31746. if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  31747. }
  31748. // If we're asking for more than the current hwm, then raise the hwm.
  31749. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  31750. if (n <= state.length) return n;
  31751. // Don't have enough
  31752. if (!state.ended) {
  31753. state.needReadable = true;
  31754. return 0;
  31755. }
  31756. return state.length;
  31757. }
  31758. // you can override either this method, or the async _read(n) below.
  31759. Readable.prototype.read = function (n) {
  31760. debug('read', n);
  31761. n = parseInt(n, 10);
  31762. var state = this._readableState;
  31763. var nOrig = n;
  31764. if (n !== 0) state.emittedReadable = false;
  31765. // if we're doing read(0) to trigger a readable event, but we
  31766. // already have a bunch of data in the buffer, then just trigger
  31767. // the 'readable' event and move on.
  31768. if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
  31769. debug('read: emitReadable', state.length, state.ended);
  31770. if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
  31771. return null;
  31772. }
  31773. n = howMuchToRead(n, state);
  31774. // if we've ended, and we're now clear, then finish it up.
  31775. if (n === 0 && state.ended) {
  31776. if (state.length === 0) endReadable(this);
  31777. return null;
  31778. }
  31779. // All the actual chunk generation logic needs to be
  31780. // *below* the call to _read. The reason is that in certain
  31781. // synthetic stream cases, such as passthrough streams, _read
  31782. // may be a completely synchronous operation which may change
  31783. // the state of the read buffer, providing enough data when
  31784. // before there was *not* enough.
  31785. //
  31786. // So, the steps are:
  31787. // 1. Figure out what the state of things will be after we do
  31788. // a read from the buffer.
  31789. //
  31790. // 2. If that resulting state will trigger a _read, then call _read.
  31791. // Note that this may be asynchronous, or synchronous. Yes, it is
  31792. // deeply ugly to write APIs this way, but that still doesn't mean
  31793. // that the Readable class should behave improperly, as streams are
  31794. // designed to be sync/async agnostic.
  31795. // Take note if the _read call is sync or async (ie, if the read call
  31796. // has returned yet), so that we know whether or not it's safe to emit
  31797. // 'readable' etc.
  31798. //
  31799. // 3. Actually pull the requested chunks out of the buffer and return.
  31800. // if we need a readable event, then we need to do some reading.
  31801. var doRead = state.needReadable;
  31802. debug('need readable', doRead);
  31803. // if we currently have less than the highWaterMark, then also read some
  31804. if (state.length === 0 || state.length - n < state.highWaterMark) {
  31805. doRead = true;
  31806. debug('length less than watermark', doRead);
  31807. }
  31808. // however, if we've ended, then there's no point, and if we're already
  31809. // reading, then it's unnecessary.
  31810. if (state.ended || state.reading) {
  31811. doRead = false;
  31812. debug('reading or ended', doRead);
  31813. } else if (doRead) {
  31814. debug('do read');
  31815. state.reading = true;
  31816. state.sync = true;
  31817. // if the length is currently zero, then we *need* a readable event.
  31818. if (state.length === 0) state.needReadable = true;
  31819. // call internal read method
  31820. this._read(state.highWaterMark);
  31821. state.sync = false;
  31822. // If _read pushed data synchronously, then `reading` will be false,
  31823. // and we need to re-evaluate how much data we can return to the user.
  31824. if (!state.reading) n = howMuchToRead(nOrig, state);
  31825. }
  31826. var ret;
  31827. if (n > 0) ret = fromList(n, state);else ret = null;
  31828. if (ret === null) {
  31829. state.needReadable = true;
  31830. n = 0;
  31831. } else {
  31832. state.length -= n;
  31833. }
  31834. if (state.length === 0) {
  31835. // If we have nothing in the buffer, then we want to know
  31836. // as soon as we *do* get something into the buffer.
  31837. if (!state.ended) state.needReadable = true;
  31838. // If we tried to read() past the EOF, then emit end on the next tick.
  31839. if (nOrig !== n && state.ended) endReadable(this);
  31840. }
  31841. if (ret !== null) this.emit('data', ret);
  31842. return ret;
  31843. };
  31844. function onEofChunk(stream, state) {
  31845. if (state.ended) return;
  31846. if (state.decoder) {
  31847. var chunk = state.decoder.end();
  31848. if (chunk && chunk.length) {
  31849. state.buffer.push(chunk);
  31850. state.length += state.objectMode ? 1 : chunk.length;
  31851. }
  31852. }
  31853. state.ended = true;
  31854. // emit 'readable' now to make sure it gets picked up.
  31855. emitReadable(stream);
  31856. }
  31857. // Don't emit readable right away in sync mode, because this can trigger
  31858. // another read() call => stack overflow. This way, it might trigger
  31859. // a nextTick recursion warning, but that's not so bad.
  31860. function emitReadable(stream) {
  31861. var state = stream._readableState;
  31862. state.needReadable = false;
  31863. if (!state.emittedReadable) {
  31864. debug('emitReadable', state.flowing);
  31865. state.emittedReadable = true;
  31866. if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
  31867. }
  31868. }
  31869. function emitReadable_(stream) {
  31870. debug('emit readable');
  31871. stream.emit('readable');
  31872. flow(stream);
  31873. }
  31874. // at this point, the user has presumably seen the 'readable' event,
  31875. // and called read() to consume some data. that may have triggered
  31876. // in turn another _read(n) call, in which case reading = true if
  31877. // it's in progress.
  31878. // However, if we're not ended, or reading, and the length < hwm,
  31879. // then go ahead and try to read some more preemptively.
  31880. function maybeReadMore(stream, state) {
  31881. if (!state.readingMore) {
  31882. state.readingMore = true;
  31883. processNextTick(maybeReadMore_, stream, state);
  31884. }
  31885. }
  31886. function maybeReadMore_(stream, state) {
  31887. var len = state.length;
  31888. while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
  31889. debug('maybeReadMore read 0');
  31890. stream.read(0);
  31891. if (len === state.length)
  31892. // didn't get any data, stop spinning.
  31893. break;else len = state.length;
  31894. }
  31895. state.readingMore = false;
  31896. }
  31897. // abstract method. to be overridden in specific implementation classes.
  31898. // call cb(er, data) where data is <= n in length.
  31899. // for virtual (non-string, non-buffer) streams, "length" is somewhat
  31900. // arbitrary, and perhaps not very meaningful.
  31901. Readable.prototype._read = function (n) {
  31902. this.emit('error', new Error('_read() is not implemented'));
  31903. };
  31904. Readable.prototype.pipe = function (dest, pipeOpts) {
  31905. var src = this;
  31906. var state = this._readableState;
  31907. switch (state.pipesCount) {
  31908. case 0:
  31909. state.pipes = dest;
  31910. break;
  31911. case 1:
  31912. state.pipes = [state.pipes, dest];
  31913. break;
  31914. default:
  31915. state.pipes.push(dest);
  31916. break;
  31917. }
  31918. state.pipesCount += 1;
  31919. debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
  31920. var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
  31921. var endFn = doEnd ? onend : unpipe;
  31922. if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
  31923. dest.on('unpipe', onunpipe);
  31924. function onunpipe(readable, unpipeInfo) {
  31925. debug('onunpipe');
  31926. if (readable === src) {
  31927. if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
  31928. unpipeInfo.hasUnpiped = true;
  31929. cleanup();
  31930. }
  31931. }
  31932. }
  31933. function onend() {
  31934. debug('onend');
  31935. dest.end();
  31936. }
  31937. // when the dest drains, it reduces the awaitDrain counter
  31938. // on the source. This would be more elegant with a .once()
  31939. // handler in flow(), but adding and removing repeatedly is
  31940. // too slow.
  31941. var ondrain = pipeOnDrain(src);
  31942. dest.on('drain', ondrain);
  31943. var cleanedUp = false;
  31944. function cleanup() {
  31945. debug('cleanup');
  31946. // cleanup event handlers once the pipe is broken
  31947. dest.removeListener('close', onclose);
  31948. dest.removeListener('finish', onfinish);
  31949. dest.removeListener('drain', ondrain);
  31950. dest.removeListener('error', onerror);
  31951. dest.removeListener('unpipe', onunpipe);
  31952. src.removeListener('end', onend);
  31953. src.removeListener('end', unpipe);
  31954. src.removeListener('data', ondata);
  31955. cleanedUp = true;
  31956. // if the reader is waiting for a drain event from this
  31957. // specific writer, then it would cause it to never start
  31958. // flowing again.
  31959. // So, if this is awaiting a drain, then we just call it now.
  31960. // If we don't know, then assume that we are waiting for one.
  31961. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  31962. }
  31963. // If the user pushes more data while we're writing to dest then we'll end up
  31964. // in ondata again. However, we only want to increase awaitDrain once because
  31965. // dest will only emit one 'drain' event for the multiple writes.
  31966. // => Introduce a guard on increasing awaitDrain.
  31967. var increasedAwaitDrain = false;
  31968. src.on('data', ondata);
  31969. function ondata(chunk) {
  31970. debug('ondata');
  31971. increasedAwaitDrain = false;
  31972. var ret = dest.write(chunk);
  31973. if (false === ret && !increasedAwaitDrain) {
  31974. // If the user unpiped during `dest.write()`, it is possible
  31975. // to get stuck in a permanently paused state if that write
  31976. // also returned false.
  31977. // => Check whether `dest` is still a piping destination.
  31978. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
  31979. debug('false write response, pause', src._readableState.awaitDrain);
  31980. src._readableState.awaitDrain++;
  31981. increasedAwaitDrain = true;
  31982. }
  31983. src.pause();
  31984. }
  31985. }
  31986. // if the dest has an error, then stop piping into it.
  31987. // however, don't suppress the throwing behavior for this.
  31988. function onerror(er) {
  31989. debug('onerror', er);
  31990. unpipe();
  31991. dest.removeListener('error', onerror);
  31992. if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
  31993. }
  31994. // Make sure our error handler is attached before userland ones.
  31995. prependListener(dest, 'error', onerror);
  31996. // Both close and finish should trigger unpipe, but only once.
  31997. function onclose() {
  31998. dest.removeListener('finish', onfinish);
  31999. unpipe();
  32000. }
  32001. dest.once('close', onclose);
  32002. function onfinish() {
  32003. debug('onfinish');
  32004. dest.removeListener('close', onclose);
  32005. unpipe();
  32006. }
  32007. dest.once('finish', onfinish);
  32008. function unpipe() {
  32009. debug('unpipe');
  32010. src.unpipe(dest);
  32011. }
  32012. // tell the dest that it's being piped to
  32013. dest.emit('pipe', src);
  32014. // start the flow if it hasn't been started already.
  32015. if (!state.flowing) {
  32016. debug('pipe resume');
  32017. src.resume();
  32018. }
  32019. return dest;
  32020. };
  32021. function pipeOnDrain(src) {
  32022. return function () {
  32023. var state = src._readableState;
  32024. debug('pipeOnDrain', state.awaitDrain);
  32025. if (state.awaitDrain) state.awaitDrain--;
  32026. if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
  32027. state.flowing = true;
  32028. flow(src);
  32029. }
  32030. };
  32031. }
  32032. Readable.prototype.unpipe = function (dest) {
  32033. var state = this._readableState;
  32034. var unpipeInfo = { hasUnpiped: false };
  32035. // if we're not piping anywhere, then do nothing.
  32036. if (state.pipesCount === 0) return this;
  32037. // just one destination. most common case.
  32038. if (state.pipesCount === 1) {
  32039. // passed in one, but it's not the right one.
  32040. if (dest && dest !== state.pipes) return this;
  32041. if (!dest) dest = state.pipes;
  32042. // got a match.
  32043. state.pipes = null;
  32044. state.pipesCount = 0;
  32045. state.flowing = false;
  32046. if (dest) dest.emit('unpipe', this, unpipeInfo);
  32047. return this;
  32048. }
  32049. // slow case. multiple pipe destinations.
  32050. if (!dest) {
  32051. // remove all.
  32052. var dests = state.pipes;
  32053. var len = state.pipesCount;
  32054. state.pipes = null;
  32055. state.pipesCount = 0;
  32056. state.flowing = false;
  32057. for (var i = 0; i < len; i++) {
  32058. dests[i].emit('unpipe', this, unpipeInfo);
  32059. }return this;
  32060. }
  32061. // try to find the right one.
  32062. var index = indexOf(state.pipes, dest);
  32063. if (index === -1) return this;
  32064. state.pipes.splice(index, 1);
  32065. state.pipesCount -= 1;
  32066. if (state.pipesCount === 1) state.pipes = state.pipes[0];
  32067. dest.emit('unpipe', this, unpipeInfo);
  32068. return this;
  32069. };
  32070. // set up data events if they are asked for
  32071. // Ensure readable listeners eventually get something
  32072. Readable.prototype.on = function (ev, fn) {
  32073. var res = Stream.prototype.on.call(this, ev, fn);
  32074. if (ev === 'data') {
  32075. // Start flowing on next tick if stream isn't explicitly paused
  32076. if (this._readableState.flowing !== false) this.resume();
  32077. } else if (ev === 'readable') {
  32078. var state = this._readableState;
  32079. if (!state.endEmitted && !state.readableListening) {
  32080. state.readableListening = state.needReadable = true;
  32081. state.emittedReadable = false;
  32082. if (!state.reading) {
  32083. processNextTick(nReadingNextTick, this);
  32084. } else if (state.length) {
  32085. emitReadable(this);
  32086. }
  32087. }
  32088. }
  32089. return res;
  32090. };
  32091. Readable.prototype.addListener = Readable.prototype.on;
  32092. function nReadingNextTick(self) {
  32093. debug('readable nexttick read 0');
  32094. self.read(0);
  32095. }
  32096. // pause() and resume() are remnants of the legacy readable stream API
  32097. // If the user uses them, then switch into old mode.
  32098. Readable.prototype.resume = function () {
  32099. var state = this._readableState;
  32100. if (!state.flowing) {
  32101. debug('resume');
  32102. state.flowing = true;
  32103. resume(this, state);
  32104. }
  32105. return this;
  32106. };
  32107. function resume(stream, state) {
  32108. if (!state.resumeScheduled) {
  32109. state.resumeScheduled = true;
  32110. processNextTick(resume_, stream, state);
  32111. }
  32112. }
  32113. function resume_(stream, state) {
  32114. if (!state.reading) {
  32115. debug('resume read 0');
  32116. stream.read(0);
  32117. }
  32118. state.resumeScheduled = false;
  32119. state.awaitDrain = 0;
  32120. stream.emit('resume');
  32121. flow(stream);
  32122. if (state.flowing && !state.reading) stream.read(0);
  32123. }
  32124. Readable.prototype.pause = function () {
  32125. debug('call pause flowing=%j', this._readableState.flowing);
  32126. if (false !== this._readableState.flowing) {
  32127. debug('pause');
  32128. this._readableState.flowing = false;
  32129. this.emit('pause');
  32130. }
  32131. return this;
  32132. };
  32133. function flow(stream) {
  32134. var state = stream._readableState;
  32135. debug('flow', state.flowing);
  32136. while (state.flowing && stream.read() !== null) {}
  32137. }
  32138. // wrap an old-style stream as the async data source.
  32139. // This is *not* part of the readable stream interface.
  32140. // It is an ugly unfortunate mess of history.
  32141. Readable.prototype.wrap = function (stream) {
  32142. var state = this._readableState;
  32143. var paused = false;
  32144. var self = this;
  32145. stream.on('end', function () {
  32146. debug('wrapped end');
  32147. if (state.decoder && !state.ended) {
  32148. var chunk = state.decoder.end();
  32149. if (chunk && chunk.length) self.push(chunk);
  32150. }
  32151. self.push(null);
  32152. });
  32153. stream.on('data', function (chunk) {
  32154. debug('wrapped data');
  32155. if (state.decoder) chunk = state.decoder.write(chunk);
  32156. // don't skip over falsy values in objectMode
  32157. if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
  32158. var ret = self.push(chunk);
  32159. if (!ret) {
  32160. paused = true;
  32161. stream.pause();
  32162. }
  32163. });
  32164. // proxy all the other methods.
  32165. // important when wrapping filters and duplexes.
  32166. for (var i in stream) {
  32167. if (this[i] === undefined && typeof stream[i] === 'function') {
  32168. this[i] = function (method) {
  32169. return function () {
  32170. return stream[method].apply(stream, arguments);
  32171. };
  32172. }(i);
  32173. }
  32174. }
  32175. // proxy certain important events.
  32176. for (var n = 0; n < kProxyEvents.length; n++) {
  32177. stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n]));
  32178. }
  32179. // when we try to consume some more bytes, simply unpause the
  32180. // underlying stream.
  32181. self._read = function (n) {
  32182. debug('wrapped _read', n);
  32183. if (paused) {
  32184. paused = false;
  32185. stream.resume();
  32186. }
  32187. };
  32188. return self;
  32189. };
  32190. // exposed for testing purposes only.
  32191. Readable._fromList = fromList;
  32192. // Pluck off n bytes from an array of buffers.
  32193. // Length is the combined lengths of all the buffers in the list.
  32194. // This function is designed to be inlinable, so please take care when making
  32195. // changes to the function body.
  32196. function fromList(n, state) {
  32197. // nothing buffered
  32198. if (state.length === 0) return null;
  32199. var ret;
  32200. if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
  32201. // read it all, truncate the list
  32202. if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
  32203. state.buffer.clear();
  32204. } else {
  32205. // read part of list
  32206. ret = fromListPartial(n, state.buffer, state.decoder);
  32207. }
  32208. return ret;
  32209. }
  32210. // Extracts only enough buffered data to satisfy the amount requested.
  32211. // This function is designed to be inlinable, so please take care when making
  32212. // changes to the function body.
  32213. function fromListPartial(n, list, hasStrings) {
  32214. var ret;
  32215. if (n < list.head.data.length) {
  32216. // slice is the same for buffers and strings
  32217. ret = list.head.data.slice(0, n);
  32218. list.head.data = list.head.data.slice(n);
  32219. } else if (n === list.head.data.length) {
  32220. // first chunk is a perfect match
  32221. ret = list.shift();
  32222. } else {
  32223. // result spans more than one buffer
  32224. ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
  32225. }
  32226. return ret;
  32227. }
  32228. // Copies a specified amount of characters from the list of buffered data
  32229. // chunks.
  32230. // This function is designed to be inlinable, so please take care when making
  32231. // changes to the function body.
  32232. function copyFromBufferString(n, list) {
  32233. var p = list.head;
  32234. var c = 1;
  32235. var ret = p.data;
  32236. n -= ret.length;
  32237. while (p = p.next) {
  32238. var str = p.data;
  32239. var nb = n > str.length ? str.length : n;
  32240. if (nb === str.length) ret += str;else ret += str.slice(0, n);
  32241. n -= nb;
  32242. if (n === 0) {
  32243. if (nb === str.length) {
  32244. ++c;
  32245. if (p.next) list.head = p.next;else list.head = list.tail = null;
  32246. } else {
  32247. list.head = p;
  32248. p.data = str.slice(nb);
  32249. }
  32250. break;
  32251. }
  32252. ++c;
  32253. }
  32254. list.length -= c;
  32255. return ret;
  32256. }
  32257. // Copies a specified amount of bytes from the list of buffered data chunks.
  32258. // This function is designed to be inlinable, so please take care when making
  32259. // changes to the function body.
  32260. function copyFromBuffer(n, list) {
  32261. var ret = Buffer.allocUnsafe(n);
  32262. var p = list.head;
  32263. var c = 1;
  32264. p.data.copy(ret);
  32265. n -= p.data.length;
  32266. while (p = p.next) {
  32267. var buf = p.data;
  32268. var nb = n > buf.length ? buf.length : n;
  32269. buf.copy(ret, ret.length - n, 0, nb);
  32270. n -= nb;
  32271. if (n === 0) {
  32272. if (nb === buf.length) {
  32273. ++c;
  32274. if (p.next) list.head = p.next;else list.head = list.tail = null;
  32275. } else {
  32276. list.head = p;
  32277. p.data = buf.slice(nb);
  32278. }
  32279. break;
  32280. }
  32281. ++c;
  32282. }
  32283. list.length -= c;
  32284. return ret;
  32285. }
  32286. function endReadable(stream) {
  32287. var state = stream._readableState;
  32288. // If we get here before consuming all the bytes, then that is a
  32289. // bug in node. Should never happen.
  32290. if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
  32291. if (!state.endEmitted) {
  32292. state.ended = true;
  32293. processNextTick(endReadableNT, state, stream);
  32294. }
  32295. }
  32296. function endReadableNT(state, stream) {
  32297. // Check that we didn't get one last unshift.
  32298. if (!state.endEmitted && state.length === 0) {
  32299. state.endEmitted = true;
  32300. stream.readable = false;
  32301. stream.emit('end');
  32302. }
  32303. }
  32304. function forEach(xs, f) {
  32305. for (var i = 0, l = xs.length; i < l; i++) {
  32306. f(xs[i], i);
  32307. }
  32308. }
  32309. function indexOf(xs, x) {
  32310. for (var i = 0, l = xs.length; i < l; i++) {
  32311. if (xs[i] === x) return i;
  32312. }
  32313. return -1;
  32314. }
  32315. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(36)))
  32316. /***/ }),
  32317. /* 36 */
  32318. /***/ (function(module, exports) {
  32319. // shim for using process in browser
  32320. var process = module.exports = {};
  32321. // cached from whatever global is present so that test runners that stub it
  32322. // don't break things. But we need to wrap it in a try catch in case it is
  32323. // wrapped in strict mode code which doesn't define any globals. It's inside a
  32324. // function because try/catches deoptimize in certain engines.
  32325. var cachedSetTimeout;
  32326. var cachedClearTimeout;
  32327. function defaultSetTimout() {
  32328. throw new Error('setTimeout has not been defined');
  32329. }
  32330. function defaultClearTimeout () {
  32331. throw new Error('clearTimeout has not been defined');
  32332. }
  32333. (function () {
  32334. try {
  32335. if (typeof setTimeout === 'function') {
  32336. cachedSetTimeout = setTimeout;
  32337. } else {
  32338. cachedSetTimeout = defaultSetTimout;
  32339. }
  32340. } catch (e) {
  32341. cachedSetTimeout = defaultSetTimout;
  32342. }
  32343. try {
  32344. if (typeof clearTimeout === 'function') {
  32345. cachedClearTimeout = clearTimeout;
  32346. } else {
  32347. cachedClearTimeout = defaultClearTimeout;
  32348. }
  32349. } catch (e) {
  32350. cachedClearTimeout = defaultClearTimeout;
  32351. }
  32352. } ())
  32353. function runTimeout(fun) {
  32354. if (cachedSetTimeout === setTimeout) {
  32355. //normal enviroments in sane situations
  32356. return setTimeout(fun, 0);
  32357. }
  32358. // if setTimeout wasn't available but was latter defined
  32359. if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
  32360. cachedSetTimeout = setTimeout;
  32361. return setTimeout(fun, 0);
  32362. }
  32363. try {
  32364. // when when somebody has screwed with setTimeout but no I.E. maddness
  32365. return cachedSetTimeout(fun, 0);
  32366. } catch(e){
  32367. try {
  32368. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  32369. return cachedSetTimeout.call(null, fun, 0);
  32370. } catch(e){
  32371. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
  32372. return cachedSetTimeout.call(this, fun, 0);
  32373. }
  32374. }
  32375. }
  32376. function runClearTimeout(marker) {
  32377. if (cachedClearTimeout === clearTimeout) {
  32378. //normal enviroments in sane situations
  32379. return clearTimeout(marker);
  32380. }
  32381. // if clearTimeout wasn't available but was latter defined
  32382. if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
  32383. cachedClearTimeout = clearTimeout;
  32384. return clearTimeout(marker);
  32385. }
  32386. try {
  32387. // when when somebody has screwed with setTimeout but no I.E. maddness
  32388. return cachedClearTimeout(marker);
  32389. } catch (e){
  32390. try {
  32391. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  32392. return cachedClearTimeout.call(null, marker);
  32393. } catch (e){
  32394. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
  32395. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  32396. return cachedClearTimeout.call(this, marker);
  32397. }
  32398. }
  32399. }
  32400. var queue = [];
  32401. var draining = false;
  32402. var currentQueue;
  32403. var queueIndex = -1;
  32404. function cleanUpNextTick() {
  32405. if (!draining || !currentQueue) {
  32406. return;
  32407. }
  32408. draining = false;
  32409. if (currentQueue.length) {
  32410. queue = currentQueue.concat(queue);
  32411. } else {
  32412. queueIndex = -1;
  32413. }
  32414. if (queue.length) {
  32415. drainQueue();
  32416. }
  32417. }
  32418. function drainQueue() {
  32419. if (draining) {
  32420. return;
  32421. }
  32422. var timeout = runTimeout(cleanUpNextTick);
  32423. draining = true;
  32424. var len = queue.length;
  32425. while(len) {
  32426. currentQueue = queue;
  32427. queue = [];
  32428. while (++queueIndex < len) {
  32429. if (currentQueue) {
  32430. currentQueue[queueIndex].run();
  32431. }
  32432. }
  32433. queueIndex = -1;
  32434. len = queue.length;
  32435. }
  32436. currentQueue = null;
  32437. draining = false;
  32438. runClearTimeout(timeout);
  32439. }
  32440. process.nextTick = function (fun) {
  32441. var args = new Array(arguments.length - 1);
  32442. if (arguments.length > 1) {
  32443. for (var i = 1; i < arguments.length; i++) {
  32444. args[i - 1] = arguments[i];
  32445. }
  32446. }
  32447. queue.push(new Item(fun, args));
  32448. if (queue.length === 1 && !draining) {
  32449. runTimeout(drainQueue);
  32450. }
  32451. };
  32452. // v8 likes predictible objects
  32453. function Item(fun, array) {
  32454. this.fun = fun;
  32455. this.array = array;
  32456. }
  32457. Item.prototype.run = function () {
  32458. this.fun.apply(null, this.array);
  32459. };
  32460. process.title = 'browser';
  32461. process.browser = true;
  32462. process.env = {};
  32463. process.argv = [];
  32464. process.version = ''; // empty string to avoid regexp issues
  32465. process.versions = {};
  32466. function noop() {}
  32467. process.on = noop;
  32468. process.addListener = noop;
  32469. process.once = noop;
  32470. process.off = noop;
  32471. process.removeListener = noop;
  32472. process.removeAllListeners = noop;
  32473. process.emit = noop;
  32474. process.prependListener = noop;
  32475. process.prependOnceListener = noop;
  32476. process.listeners = function (name) { return [] }
  32477. process.binding = function (name) {
  32478. throw new Error('process.binding is not supported');
  32479. };
  32480. process.cwd = function () { return '/' };
  32481. process.chdir = function (dir) {
  32482. throw new Error('process.chdir is not supported');
  32483. };
  32484. process.umask = function() { return 0; };
  32485. /***/ }),
  32486. /* 37 */
  32487. /***/ (function(module, exports, __webpack_require__) {
  32488. /* WEBPACK VAR INJECTION */(function(process) {'use strict';
  32489. if (!process.version ||
  32490. process.version.indexOf('v0.') === 0 ||
  32491. process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
  32492. module.exports = nextTick;
  32493. } else {
  32494. module.exports = process.nextTick;
  32495. }
  32496. function nextTick(fn, arg1, arg2, arg3) {
  32497. if (typeof fn !== 'function') {
  32498. throw new TypeError('"callback" argument must be a function');
  32499. }
  32500. var len = arguments.length;
  32501. var args, i;
  32502. switch (len) {
  32503. case 0:
  32504. case 1:
  32505. return process.nextTick(fn);
  32506. case 2:
  32507. return process.nextTick(function afterTickOne() {
  32508. fn.call(null, arg1);
  32509. });
  32510. case 3:
  32511. return process.nextTick(function afterTickTwo() {
  32512. fn.call(null, arg1, arg2);
  32513. });
  32514. case 4:
  32515. return process.nextTick(function afterTickThree() {
  32516. fn.call(null, arg1, arg2, arg3);
  32517. });
  32518. default:
  32519. args = new Array(len - 1);
  32520. i = 0;
  32521. while (i < args.length) {
  32522. args[i++] = arguments[i];
  32523. }
  32524. return process.nextTick(function afterTick() {
  32525. fn.apply(null, args);
  32526. });
  32527. }
  32528. }
  32529. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36)))
  32530. /***/ }),
  32531. /* 38 */
  32532. /***/ (function(module, exports, __webpack_require__) {
  32533. module.exports = __webpack_require__(32).EventEmitter;
  32534. /***/ }),
  32535. /* 39 */
  32536. /***/ (function(module, exports, __webpack_require__) {
  32537. /* eslint-disable node/no-deprecated-api */
  32538. var buffer = __webpack_require__(2)
  32539. var Buffer = buffer.Buffer
  32540. // alternative to using Object.keys for old browsers
  32541. function copyProps (src, dst) {
  32542. for (var key in src) {
  32543. dst[key] = src[key]
  32544. }
  32545. }
  32546. if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  32547. module.exports = buffer
  32548. } else {
  32549. // Copy properties from require('buffer')
  32550. copyProps(buffer, exports)
  32551. exports.Buffer = SafeBuffer
  32552. }
  32553. function SafeBuffer (arg, encodingOrOffset, length) {
  32554. return Buffer(arg, encodingOrOffset, length)
  32555. }
  32556. // Copy static methods from Buffer
  32557. copyProps(Buffer, SafeBuffer)
  32558. SafeBuffer.from = function (arg, encodingOrOffset, length) {
  32559. if (typeof arg === 'number') {
  32560. throw new TypeError('Argument must not be a number')
  32561. }
  32562. return Buffer(arg, encodingOrOffset, length)
  32563. }
  32564. SafeBuffer.alloc = function (size, fill, encoding) {
  32565. if (typeof size !== 'number') {
  32566. throw new TypeError('Argument must be a number')
  32567. }
  32568. var buf = Buffer(size)
  32569. if (fill !== undefined) {
  32570. if (typeof encoding === 'string') {
  32571. buf.fill(fill, encoding)
  32572. } else {
  32573. buf.fill(fill)
  32574. }
  32575. } else {
  32576. buf.fill(0)
  32577. }
  32578. return buf
  32579. }
  32580. SafeBuffer.allocUnsafe = function (size) {
  32581. if (typeof size !== 'number') {
  32582. throw new TypeError('Argument must be a number')
  32583. }
  32584. return Buffer(size)
  32585. }
  32586. SafeBuffer.allocUnsafeSlow = function (size) {
  32587. if (typeof size !== 'number') {
  32588. throw new TypeError('Argument must be a number')
  32589. }
  32590. return buffer.SlowBuffer(size)
  32591. }
  32592. /***/ }),
  32593. /* 40 */
  32594. /***/ (function(module, exports, __webpack_require__) {
  32595. /* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors.
  32596. //
  32597. // Permission is hereby granted, free of charge, to any person obtaining a
  32598. // copy of this software and associated documentation files (the
  32599. // "Software"), to deal in the Software without restriction, including
  32600. // without limitation the rights to use, copy, modify, merge, publish,
  32601. // distribute, sublicense, and/or sell copies of the Software, and to permit
  32602. // persons to whom the Software is furnished to do so, subject to the
  32603. // following conditions:
  32604. //
  32605. // The above copyright notice and this permission notice shall be included
  32606. // in all copies or substantial portions of the Software.
  32607. //
  32608. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  32609. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32610. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  32611. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  32612. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  32613. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  32614. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  32615. // NOTE: These type checking functions intentionally don't use `instanceof`
  32616. // because it is fragile and can be easily faked with `Object.create()`.
  32617. function isArray(arg) {
  32618. if (Array.isArray) {
  32619. return Array.isArray(arg);
  32620. }
  32621. return objectToString(arg) === '[object Array]';
  32622. }
  32623. exports.isArray = isArray;
  32624. function isBoolean(arg) {
  32625. return typeof arg === 'boolean';
  32626. }
  32627. exports.isBoolean = isBoolean;
  32628. function isNull(arg) {
  32629. return arg === null;
  32630. }
  32631. exports.isNull = isNull;
  32632. function isNullOrUndefined(arg) {
  32633. return arg == null;
  32634. }
  32635. exports.isNullOrUndefined = isNullOrUndefined;
  32636. function isNumber(arg) {
  32637. return typeof arg === 'number';
  32638. }
  32639. exports.isNumber = isNumber;
  32640. function isString(arg) {
  32641. return typeof arg === 'string';
  32642. }
  32643. exports.isString = isString;
  32644. function isSymbol(arg) {
  32645. return typeof arg === 'symbol';
  32646. }
  32647. exports.isSymbol = isSymbol;
  32648. function isUndefined(arg) {
  32649. return arg === void 0;
  32650. }
  32651. exports.isUndefined = isUndefined;
  32652. function isRegExp(re) {
  32653. return objectToString(re) === '[object RegExp]';
  32654. }
  32655. exports.isRegExp = isRegExp;
  32656. function isObject(arg) {
  32657. return typeof arg === 'object' && arg !== null;
  32658. }
  32659. exports.isObject = isObject;
  32660. function isDate(d) {
  32661. return objectToString(d) === '[object Date]';
  32662. }
  32663. exports.isDate = isDate;
  32664. function isError(e) {
  32665. return (objectToString(e) === '[object Error]' || e instanceof Error);
  32666. }
  32667. exports.isError = isError;
  32668. function isFunction(arg) {
  32669. return typeof arg === 'function';
  32670. }
  32671. exports.isFunction = isFunction;
  32672. function isPrimitive(arg) {
  32673. return arg === null ||
  32674. typeof arg === 'boolean' ||
  32675. typeof arg === 'number' ||
  32676. typeof arg === 'string' ||
  32677. typeof arg === 'symbol' || // ES6 symbol
  32678. typeof arg === 'undefined';
  32679. }
  32680. exports.isPrimitive = isPrimitive;
  32681. exports.isBuffer = Buffer.isBuffer;
  32682. function objectToString(o) {
  32683. return Object.prototype.toString.call(o);
  32684. }
  32685. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  32686. /***/ }),
  32687. /* 41 */
  32688. /***/ (function(module, exports) {
  32689. /* (ignored) */
  32690. /***/ }),
  32691. /* 42 */
  32692. /***/ (function(module, exports, __webpack_require__) {
  32693. 'use strict';
  32694. /*<replacement>*/
  32695. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  32696. var Buffer = __webpack_require__(39).Buffer;
  32697. /*</replacement>*/
  32698. function copyBuffer(src, target, offset) {
  32699. src.copy(target, offset);
  32700. }
  32701. module.exports = function () {
  32702. function BufferList() {
  32703. _classCallCheck(this, BufferList);
  32704. this.head = null;
  32705. this.tail = null;
  32706. this.length = 0;
  32707. }
  32708. BufferList.prototype.push = function push(v) {
  32709. var entry = { data: v, next: null };
  32710. if (this.length > 0) this.tail.next = entry;else this.head = entry;
  32711. this.tail = entry;
  32712. ++this.length;
  32713. };
  32714. BufferList.prototype.unshift = function unshift(v) {
  32715. var entry = { data: v, next: this.head };
  32716. if (this.length === 0) this.tail = entry;
  32717. this.head = entry;
  32718. ++this.length;
  32719. };
  32720. BufferList.prototype.shift = function shift() {
  32721. if (this.length === 0) return;
  32722. var ret = this.head.data;
  32723. if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
  32724. --this.length;
  32725. return ret;
  32726. };
  32727. BufferList.prototype.clear = function clear() {
  32728. this.head = this.tail = null;
  32729. this.length = 0;
  32730. };
  32731. BufferList.prototype.join = function join(s) {
  32732. if (this.length === 0) return '';
  32733. var p = this.head;
  32734. var ret = '' + p.data;
  32735. while (p = p.next) {
  32736. ret += s + p.data;
  32737. }return ret;
  32738. };
  32739. BufferList.prototype.concat = function concat(n) {
  32740. if (this.length === 0) return Buffer.alloc(0);
  32741. if (this.length === 1) return this.head.data;
  32742. var ret = Buffer.allocUnsafe(n >>> 0);
  32743. var p = this.head;
  32744. var i = 0;
  32745. while (p) {
  32746. copyBuffer(p.data, ret, i);
  32747. i += p.data.length;
  32748. p = p.next;
  32749. }
  32750. return ret;
  32751. };
  32752. return BufferList;
  32753. }();
  32754. /***/ }),
  32755. /* 43 */
  32756. /***/ (function(module, exports, __webpack_require__) {
  32757. 'use strict';
  32758. /*<replacement>*/
  32759. var processNextTick = __webpack_require__(37);
  32760. /*</replacement>*/
  32761. // undocumented cb() API, needed for core, not for public API
  32762. function destroy(err, cb) {
  32763. var _this = this;
  32764. var readableDestroyed = this._readableState && this._readableState.destroyed;
  32765. var writableDestroyed = this._writableState && this._writableState.destroyed;
  32766. if (readableDestroyed || writableDestroyed) {
  32767. if (cb) {
  32768. cb(err);
  32769. } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
  32770. processNextTick(emitErrorNT, this, err);
  32771. }
  32772. return;
  32773. }
  32774. // we set destroyed to true before firing error callbacks in order
  32775. // to make it re-entrance safe in case destroy() is called within callbacks
  32776. if (this._readableState) {
  32777. this._readableState.destroyed = true;
  32778. }
  32779. // if this is a duplex stream mark the writable part as destroyed as well
  32780. if (this._writableState) {
  32781. this._writableState.destroyed = true;
  32782. }
  32783. this._destroy(err || null, function (err) {
  32784. if (!cb && err) {
  32785. processNextTick(emitErrorNT, _this, err);
  32786. if (_this._writableState) {
  32787. _this._writableState.errorEmitted = true;
  32788. }
  32789. } else if (cb) {
  32790. cb(err);
  32791. }
  32792. });
  32793. }
  32794. function undestroy() {
  32795. if (this._readableState) {
  32796. this._readableState.destroyed = false;
  32797. this._readableState.reading = false;
  32798. this._readableState.ended = false;
  32799. this._readableState.endEmitted = false;
  32800. }
  32801. if (this._writableState) {
  32802. this._writableState.destroyed = false;
  32803. this._writableState.ended = false;
  32804. this._writableState.ending = false;
  32805. this._writableState.finished = false;
  32806. this._writableState.errorEmitted = false;
  32807. }
  32808. }
  32809. function emitErrorNT(self, err) {
  32810. self.emit('error', err);
  32811. }
  32812. module.exports = {
  32813. destroy: destroy,
  32814. undestroy: undestroy
  32815. };
  32816. /***/ }),
  32817. /* 44 */
  32818. /***/ (function(module, exports, __webpack_require__) {
  32819. // Copyright Joyent, Inc. and other Node contributors.
  32820. //
  32821. // Permission is hereby granted, free of charge, to any person obtaining a
  32822. // copy of this software and associated documentation files (the
  32823. // "Software"), to deal in the Software without restriction, including
  32824. // without limitation the rights to use, copy, modify, merge, publish,
  32825. // distribute, sublicense, and/or sell copies of the Software, and to permit
  32826. // persons to whom the Software is furnished to do so, subject to the
  32827. // following conditions:
  32828. //
  32829. // The above copyright notice and this permission notice shall be included
  32830. // in all copies or substantial portions of the Software.
  32831. //
  32832. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  32833. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32834. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  32835. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  32836. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  32837. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  32838. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  32839. // a duplex stream is just a stream that is both readable and writable.
  32840. // Since JS doesn't have multiple prototypal inheritance, this class
  32841. // prototypally inherits from Readable, and then parasitically from
  32842. // Writable.
  32843. 'use strict';
  32844. /*<replacement>*/
  32845. var processNextTick = __webpack_require__(37);
  32846. /*</replacement>*/
  32847. /*<replacement>*/
  32848. var objectKeys = Object.keys || function (obj) {
  32849. var keys = [];
  32850. for (var key in obj) {
  32851. keys.push(key);
  32852. }return keys;
  32853. };
  32854. /*</replacement>*/
  32855. module.exports = Duplex;
  32856. /*<replacement>*/
  32857. var util = __webpack_require__(40);
  32858. util.inherits = __webpack_require__(33);
  32859. /*</replacement>*/
  32860. var Readable = __webpack_require__(35);
  32861. var Writable = __webpack_require__(45);
  32862. util.inherits(Duplex, Readable);
  32863. var keys = objectKeys(Writable.prototype);
  32864. for (var v = 0; v < keys.length; v++) {
  32865. var method = keys[v];
  32866. if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  32867. }
  32868. function Duplex(options) {
  32869. if (!(this instanceof Duplex)) return new Duplex(options);
  32870. Readable.call(this, options);
  32871. Writable.call(this, options);
  32872. if (options && options.readable === false) this.readable = false;
  32873. if (options && options.writable === false) this.writable = false;
  32874. this.allowHalfOpen = true;
  32875. if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
  32876. this.once('end', onend);
  32877. }
  32878. // the no-half-open enforcer
  32879. function onend() {
  32880. // if we allow half-open state, or if the writable side ended,
  32881. // then we're ok.
  32882. if (this.allowHalfOpen || this._writableState.ended) return;
  32883. // no more data can be written.
  32884. // But allow more writes to happen in this tick.
  32885. processNextTick(onEndNT, this);
  32886. }
  32887. function onEndNT(self) {
  32888. self.end();
  32889. }
  32890. Object.defineProperty(Duplex.prototype, 'destroyed', {
  32891. get: function () {
  32892. if (this._readableState === undefined || this._writableState === undefined) {
  32893. return false;
  32894. }
  32895. return this._readableState.destroyed && this._writableState.destroyed;
  32896. },
  32897. set: function (value) {
  32898. // we ignore the value if the stream
  32899. // has not been initialized yet
  32900. if (this._readableState === undefined || this._writableState === undefined) {
  32901. return;
  32902. }
  32903. // backward compatibility, the user is explicitly
  32904. // managing destroyed
  32905. this._readableState.destroyed = value;
  32906. this._writableState.destroyed = value;
  32907. }
  32908. });
  32909. Duplex.prototype._destroy = function (err, cb) {
  32910. this.push(null);
  32911. this.end();
  32912. processNextTick(cb, err);
  32913. };
  32914. function forEach(xs, f) {
  32915. for (var i = 0, l = xs.length; i < l; i++) {
  32916. f(xs[i], i);
  32917. }
  32918. }
  32919. /***/ }),
  32920. /* 45 */
  32921. /***/ (function(module, exports, __webpack_require__) {
  32922. /* WEBPACK VAR INJECTION */(function(process, setImmediate, global) {// Copyright Joyent, Inc. and other Node contributors.
  32923. //
  32924. // Permission is hereby granted, free of charge, to any person obtaining a
  32925. // copy of this software and associated documentation files (the
  32926. // "Software"), to deal in the Software without restriction, including
  32927. // without limitation the rights to use, copy, modify, merge, publish,
  32928. // distribute, sublicense, and/or sell copies of the Software, and to permit
  32929. // persons to whom the Software is furnished to do so, subject to the
  32930. // following conditions:
  32931. //
  32932. // The above copyright notice and this permission notice shall be included
  32933. // in all copies or substantial portions of the Software.
  32934. //
  32935. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  32936. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  32937. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  32938. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  32939. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  32940. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  32941. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  32942. // A bit simpler than readable streams.
  32943. // Implement an async ._write(chunk, encoding, cb), and it'll handle all
  32944. // the drain event emission and buffering.
  32945. 'use strict';
  32946. /*<replacement>*/
  32947. var processNextTick = __webpack_require__(37);
  32948. /*</replacement>*/
  32949. module.exports = Writable;
  32950. /* <replacement> */
  32951. function WriteReq(chunk, encoding, cb) {
  32952. this.chunk = chunk;
  32953. this.encoding = encoding;
  32954. this.callback = cb;
  32955. this.next = null;
  32956. }
  32957. // It seems a linked list but it is not
  32958. // there will be only 2 of these for each stream
  32959. function CorkedRequest(state) {
  32960. var _this = this;
  32961. this.next = null;
  32962. this.entry = null;
  32963. this.finish = function () {
  32964. onCorkedFinish(_this, state);
  32965. };
  32966. }
  32967. /* </replacement> */
  32968. /*<replacement>*/
  32969. var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
  32970. /*</replacement>*/
  32971. /*<replacement>*/
  32972. var Duplex;
  32973. /*</replacement>*/
  32974. Writable.WritableState = WritableState;
  32975. /*<replacement>*/
  32976. var util = __webpack_require__(40);
  32977. util.inherits = __webpack_require__(33);
  32978. /*</replacement>*/
  32979. /*<replacement>*/
  32980. var internalUtil = {
  32981. deprecate: __webpack_require__(48)
  32982. };
  32983. /*</replacement>*/
  32984. /*<replacement>*/
  32985. var Stream = __webpack_require__(38);
  32986. /*</replacement>*/
  32987. /*<replacement>*/
  32988. var Buffer = __webpack_require__(39).Buffer;
  32989. var OurUint8Array = global.Uint8Array || function () {};
  32990. function _uint8ArrayToBuffer(chunk) {
  32991. return Buffer.from(chunk);
  32992. }
  32993. function _isUint8Array(obj) {
  32994. return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
  32995. }
  32996. /*</replacement>*/
  32997. var destroyImpl = __webpack_require__(43);
  32998. util.inherits(Writable, Stream);
  32999. function nop() {}
  33000. function WritableState(options, stream) {
  33001. Duplex = Duplex || __webpack_require__(44);
  33002. options = options || {};
  33003. // object stream flag to indicate whether or not this stream
  33004. // contains buffers or objects.
  33005. this.objectMode = !!options.objectMode;
  33006. if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
  33007. // the point at which write() starts returning false
  33008. // Note: 0 is a valid value, means that we always return false if
  33009. // the entire buffer is not flushed immediately on write()
  33010. var hwm = options.highWaterMark;
  33011. var defaultHwm = this.objectMode ? 16 : 16 * 1024;
  33012. this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
  33013. // cast to ints.
  33014. this.highWaterMark = Math.floor(this.highWaterMark);
  33015. // if _final has been called
  33016. this.finalCalled = false;
  33017. // drain event flag.
  33018. this.needDrain = false;
  33019. // at the start of calling end()
  33020. this.ending = false;
  33021. // when end() has been called, and returned
  33022. this.ended = false;
  33023. // when 'finish' is emitted
  33024. this.finished = false;
  33025. // has it been destroyed
  33026. this.destroyed = false;
  33027. // should we decode strings into buffers before passing to _write?
  33028. // this is here so that some node-core streams can optimize string
  33029. // handling at a lower level.
  33030. var noDecode = options.decodeStrings === false;
  33031. this.decodeStrings = !noDecode;
  33032. // Crypto is kind of old and crusty. Historically, its default string
  33033. // encoding is 'binary' so we have to make this configurable.
  33034. // Everything else in the universe uses 'utf8', though.
  33035. this.defaultEncoding = options.defaultEncoding || 'utf8';
  33036. // not an actual buffer we keep track of, but a measurement
  33037. // of how much we're waiting to get pushed to some underlying
  33038. // socket or file.
  33039. this.length = 0;
  33040. // a flag to see when we're in the middle of a write.
  33041. this.writing = false;
  33042. // when true all writes will be buffered until .uncork() call
  33043. this.corked = 0;
  33044. // a flag to be able to tell if the onwrite cb is called immediately,
  33045. // or on a later tick. We set this to true at first, because any
  33046. // actions that shouldn't happen until "later" should generally also
  33047. // not happen before the first write call.
  33048. this.sync = true;
  33049. // a flag to know if we're processing previously buffered items, which
  33050. // may call the _write() callback in the same tick, so that we don't
  33051. // end up in an overlapped onwrite situation.
  33052. this.bufferProcessing = false;
  33053. // the callback that's passed to _write(chunk,cb)
  33054. this.onwrite = function (er) {
  33055. onwrite(stream, er);
  33056. };
  33057. // the callback that the user supplies to write(chunk,encoding,cb)
  33058. this.writecb = null;
  33059. // the amount that is being written when _write is called.
  33060. this.writelen = 0;
  33061. this.bufferedRequest = null;
  33062. this.lastBufferedRequest = null;
  33063. // number of pending user-supplied write callbacks
  33064. // this must be 0 before 'finish' can be emitted
  33065. this.pendingcb = 0;
  33066. // emit prefinish if the only thing we're waiting for is _write cbs
  33067. // This is relevant for synchronous Transform streams
  33068. this.prefinished = false;
  33069. // True if the error was already emitted and should not be thrown again
  33070. this.errorEmitted = false;
  33071. // count buffered requests
  33072. this.bufferedRequestCount = 0;
  33073. // allocate the first CorkedRequest, there is always
  33074. // one allocated and free to use, and we maintain at most two
  33075. this.corkedRequestsFree = new CorkedRequest(this);
  33076. }
  33077. WritableState.prototype.getBuffer = function getBuffer() {
  33078. var current = this.bufferedRequest;
  33079. var out = [];
  33080. while (current) {
  33081. out.push(current);
  33082. current = current.next;
  33083. }
  33084. return out;
  33085. };
  33086. (function () {
  33087. try {
  33088. Object.defineProperty(WritableState.prototype, 'buffer', {
  33089. get: internalUtil.deprecate(function () {
  33090. return this.getBuffer();
  33091. }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
  33092. });
  33093. } catch (_) {}
  33094. })();
  33095. // Test _writableState for inheritance to account for Duplex streams,
  33096. // whose prototype chain only points to Readable.
  33097. var realHasInstance;
  33098. if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  33099. realHasInstance = Function.prototype[Symbol.hasInstance];
  33100. Object.defineProperty(Writable, Symbol.hasInstance, {
  33101. value: function (object) {
  33102. if (realHasInstance.call(this, object)) return true;
  33103. return object && object._writableState instanceof WritableState;
  33104. }
  33105. });
  33106. } else {
  33107. realHasInstance = function (object) {
  33108. return object instanceof this;
  33109. };
  33110. }
  33111. function Writable(options) {
  33112. Duplex = Duplex || __webpack_require__(44);
  33113. // Writable ctor is applied to Duplexes, too.
  33114. // `realHasInstance` is necessary because using plain `instanceof`
  33115. // would return false, as no `_writableState` property is attached.
  33116. // Trying to use the custom `instanceof` for Writable here will also break the
  33117. // Node.js LazyTransform implementation, which has a non-trivial getter for
  33118. // `_writableState` that would lead to infinite recursion.
  33119. if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
  33120. return new Writable(options);
  33121. }
  33122. this._writableState = new WritableState(options, this);
  33123. // legacy.
  33124. this.writable = true;
  33125. if (options) {
  33126. if (typeof options.write === 'function') this._write = options.write;
  33127. if (typeof options.writev === 'function') this._writev = options.writev;
  33128. if (typeof options.destroy === 'function') this._destroy = options.destroy;
  33129. if (typeof options.final === 'function') this._final = options.final;
  33130. }
  33131. Stream.call(this);
  33132. }
  33133. // Otherwise people can pipe Writable streams, which is just wrong.
  33134. Writable.prototype.pipe = function () {
  33135. this.emit('error', new Error('Cannot pipe, not readable'));
  33136. };
  33137. function writeAfterEnd(stream, cb) {
  33138. var er = new Error('write after end');
  33139. // TODO: defer error events consistently everywhere, not just the cb
  33140. stream.emit('error', er);
  33141. processNextTick(cb, er);
  33142. }
  33143. // Checks that a user-supplied chunk is valid, especially for the particular
  33144. // mode the stream is in. Currently this means that `null` is never accepted
  33145. // and undefined/non-string values are only allowed in object mode.
  33146. function validChunk(stream, state, chunk, cb) {
  33147. var valid = true;
  33148. var er = false;
  33149. if (chunk === null) {
  33150. er = new TypeError('May not write null values to stream');
  33151. } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
  33152. er = new TypeError('Invalid non-string/buffer chunk');
  33153. }
  33154. if (er) {
  33155. stream.emit('error', er);
  33156. processNextTick(cb, er);
  33157. valid = false;
  33158. }
  33159. return valid;
  33160. }
  33161. Writable.prototype.write = function (chunk, encoding, cb) {
  33162. var state = this._writableState;
  33163. var ret = false;
  33164. var isBuf = _isUint8Array(chunk) && !state.objectMode;
  33165. if (isBuf && !Buffer.isBuffer(chunk)) {
  33166. chunk = _uint8ArrayToBuffer(chunk);
  33167. }
  33168. if (typeof encoding === 'function') {
  33169. cb = encoding;
  33170. encoding = null;
  33171. }
  33172. if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
  33173. if (typeof cb !== 'function') cb = nop;
  33174. if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
  33175. state.pendingcb++;
  33176. ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  33177. }
  33178. return ret;
  33179. };
  33180. Writable.prototype.cork = function () {
  33181. var state = this._writableState;
  33182. state.corked++;
  33183. };
  33184. Writable.prototype.uncork = function () {
  33185. var state = this._writableState;
  33186. if (state.corked) {
  33187. state.corked--;
  33188. if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  33189. }
  33190. };
  33191. Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  33192. // node::ParseEncoding() requires lower case.
  33193. if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  33194. if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
  33195. this._writableState.defaultEncoding = encoding;
  33196. return this;
  33197. };
  33198. function decodeChunk(state, chunk, encoding) {
  33199. if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
  33200. chunk = Buffer.from(chunk, encoding);
  33201. }
  33202. return chunk;
  33203. }
  33204. // if we're already writing something, then just put this
  33205. // in the queue, and wait our turn. Otherwise, call _write
  33206. // If we return false, then we need a drain event, so set that flag.
  33207. function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  33208. if (!isBuf) {
  33209. var newChunk = decodeChunk(state, chunk, encoding);
  33210. if (chunk !== newChunk) {
  33211. isBuf = true;
  33212. encoding = 'buffer';
  33213. chunk = newChunk;
  33214. }
  33215. }
  33216. var len = state.objectMode ? 1 : chunk.length;
  33217. state.length += len;
  33218. var ret = state.length < state.highWaterMark;
  33219. // we must ensure that previous needDrain will not be reset to false.
  33220. if (!ret) state.needDrain = true;
  33221. if (state.writing || state.corked) {
  33222. var last = state.lastBufferedRequest;
  33223. state.lastBufferedRequest = {
  33224. chunk: chunk,
  33225. encoding: encoding,
  33226. isBuf: isBuf,
  33227. callback: cb,
  33228. next: null
  33229. };
  33230. if (last) {
  33231. last.next = state.lastBufferedRequest;
  33232. } else {
  33233. state.bufferedRequest = state.lastBufferedRequest;
  33234. }
  33235. state.bufferedRequestCount += 1;
  33236. } else {
  33237. doWrite(stream, state, false, len, chunk, encoding, cb);
  33238. }
  33239. return ret;
  33240. }
  33241. function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  33242. state.writelen = len;
  33243. state.writecb = cb;
  33244. state.writing = true;
  33245. state.sync = true;
  33246. if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  33247. state.sync = false;
  33248. }
  33249. function onwriteError(stream, state, sync, er, cb) {
  33250. --state.pendingcb;
  33251. if (sync) {
  33252. // defer the callback if we are being called synchronously
  33253. // to avoid piling up things on the stack
  33254. processNextTick(cb, er);
  33255. // this can emit finish, and it will always happen
  33256. // after error
  33257. processNextTick(finishMaybe, stream, state);
  33258. stream._writableState.errorEmitted = true;
  33259. stream.emit('error', er);
  33260. } else {
  33261. // the caller expect this to happen before if
  33262. // it is async
  33263. cb(er);
  33264. stream._writableState.errorEmitted = true;
  33265. stream.emit('error', er);
  33266. // this can emit finish, but finish must
  33267. // always follow error
  33268. finishMaybe(stream, state);
  33269. }
  33270. }
  33271. function onwriteStateUpdate(state) {
  33272. state.writing = false;
  33273. state.writecb = null;
  33274. state.length -= state.writelen;
  33275. state.writelen = 0;
  33276. }
  33277. function onwrite(stream, er) {
  33278. var state = stream._writableState;
  33279. var sync = state.sync;
  33280. var cb = state.writecb;
  33281. onwriteStateUpdate(state);
  33282. if (er) onwriteError(stream, state, sync, er, cb);else {
  33283. // Check if we're actually ready to finish, but don't emit yet
  33284. var finished = needFinish(state);
  33285. if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
  33286. clearBuffer(stream, state);
  33287. }
  33288. if (sync) {
  33289. /*<replacement>*/
  33290. asyncWrite(afterWrite, stream, state, finished, cb);
  33291. /*</replacement>*/
  33292. } else {
  33293. afterWrite(stream, state, finished, cb);
  33294. }
  33295. }
  33296. }
  33297. function afterWrite(stream, state, finished, cb) {
  33298. if (!finished) onwriteDrain(stream, state);
  33299. state.pendingcb--;
  33300. cb();
  33301. finishMaybe(stream, state);
  33302. }
  33303. // Must force callback to be called on nextTick, so that we don't
  33304. // emit 'drain' before the write() consumer gets the 'false' return
  33305. // value, and has a chance to attach a 'drain' listener.
  33306. function onwriteDrain(stream, state) {
  33307. if (state.length === 0 && state.needDrain) {
  33308. state.needDrain = false;
  33309. stream.emit('drain');
  33310. }
  33311. }
  33312. // if there's something in the buffer waiting, then process it
  33313. function clearBuffer(stream, state) {
  33314. state.bufferProcessing = true;
  33315. var entry = state.bufferedRequest;
  33316. if (stream._writev && entry && entry.next) {
  33317. // Fast case, write everything using _writev()
  33318. var l = state.bufferedRequestCount;
  33319. var buffer = new Array(l);
  33320. var holder = state.corkedRequestsFree;
  33321. holder.entry = entry;
  33322. var count = 0;
  33323. var allBuffers = true;
  33324. while (entry) {
  33325. buffer[count] = entry;
  33326. if (!entry.isBuf) allBuffers = false;
  33327. entry = entry.next;
  33328. count += 1;
  33329. }
  33330. buffer.allBuffers = allBuffers;
  33331. doWrite(stream, state, true, state.length, buffer, '', holder.finish);
  33332. // doWrite is almost always async, defer these to save a bit of time
  33333. // as the hot path ends with doWrite
  33334. state.pendingcb++;
  33335. state.lastBufferedRequest = null;
  33336. if (holder.next) {
  33337. state.corkedRequestsFree = holder.next;
  33338. holder.next = null;
  33339. } else {
  33340. state.corkedRequestsFree = new CorkedRequest(state);
  33341. }
  33342. } else {
  33343. // Slow case, write chunks one-by-one
  33344. while (entry) {
  33345. var chunk = entry.chunk;
  33346. var encoding = entry.encoding;
  33347. var cb = entry.callback;
  33348. var len = state.objectMode ? 1 : chunk.length;
  33349. doWrite(stream, state, false, len, chunk, encoding, cb);
  33350. entry = entry.next;
  33351. // if we didn't call the onwrite immediately, then
  33352. // it means that we need to wait until it does.
  33353. // also, that means that the chunk and cb are currently
  33354. // being processed, so move the buffer counter past them.
  33355. if (state.writing) {
  33356. break;
  33357. }
  33358. }
  33359. if (entry === null) state.lastBufferedRequest = null;
  33360. }
  33361. state.bufferedRequestCount = 0;
  33362. state.bufferedRequest = entry;
  33363. state.bufferProcessing = false;
  33364. }
  33365. Writable.prototype._write = function (chunk, encoding, cb) {
  33366. cb(new Error('_write() is not implemented'));
  33367. };
  33368. Writable.prototype._writev = null;
  33369. Writable.prototype.end = function (chunk, encoding, cb) {
  33370. var state = this._writableState;
  33371. if (typeof chunk === 'function') {
  33372. cb = chunk;
  33373. chunk = null;
  33374. encoding = null;
  33375. } else if (typeof encoding === 'function') {
  33376. cb = encoding;
  33377. encoding = null;
  33378. }
  33379. if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
  33380. // .end() fully uncorks
  33381. if (state.corked) {
  33382. state.corked = 1;
  33383. this.uncork();
  33384. }
  33385. // ignore unnecessary end() calls.
  33386. if (!state.ending && !state.finished) endWritable(this, state, cb);
  33387. };
  33388. function needFinish(state) {
  33389. return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
  33390. }
  33391. function callFinal(stream, state) {
  33392. stream._final(function (err) {
  33393. state.pendingcb--;
  33394. if (err) {
  33395. stream.emit('error', err);
  33396. }
  33397. state.prefinished = true;
  33398. stream.emit('prefinish');
  33399. finishMaybe(stream, state);
  33400. });
  33401. }
  33402. function prefinish(stream, state) {
  33403. if (!state.prefinished && !state.finalCalled) {
  33404. if (typeof stream._final === 'function') {
  33405. state.pendingcb++;
  33406. state.finalCalled = true;
  33407. processNextTick(callFinal, stream, state);
  33408. } else {
  33409. state.prefinished = true;
  33410. stream.emit('prefinish');
  33411. }
  33412. }
  33413. }
  33414. function finishMaybe(stream, state) {
  33415. var need = needFinish(state);
  33416. if (need) {
  33417. prefinish(stream, state);
  33418. if (state.pendingcb === 0) {
  33419. state.finished = true;
  33420. stream.emit('finish');
  33421. }
  33422. }
  33423. return need;
  33424. }
  33425. function endWritable(stream, state, cb) {
  33426. state.ending = true;
  33427. finishMaybe(stream, state);
  33428. if (cb) {
  33429. if (state.finished) processNextTick(cb);else stream.once('finish', cb);
  33430. }
  33431. state.ended = true;
  33432. stream.writable = false;
  33433. }
  33434. function onCorkedFinish(corkReq, state, err) {
  33435. var entry = corkReq.entry;
  33436. corkReq.entry = null;
  33437. while (entry) {
  33438. var cb = entry.callback;
  33439. state.pendingcb--;
  33440. cb(err);
  33441. entry = entry.next;
  33442. }
  33443. if (state.corkedRequestsFree) {
  33444. state.corkedRequestsFree.next = corkReq;
  33445. } else {
  33446. state.corkedRequestsFree = corkReq;
  33447. }
  33448. }
  33449. Object.defineProperty(Writable.prototype, 'destroyed', {
  33450. get: function () {
  33451. if (this._writableState === undefined) {
  33452. return false;
  33453. }
  33454. return this._writableState.destroyed;
  33455. },
  33456. set: function (value) {
  33457. // we ignore the value if the stream
  33458. // has not been initialized yet
  33459. if (!this._writableState) {
  33460. return;
  33461. }
  33462. // backward compatibility, the user is explicitly
  33463. // managing destroyed
  33464. this._writableState.destroyed = value;
  33465. }
  33466. });
  33467. Writable.prototype.destroy = destroyImpl.destroy;
  33468. Writable.prototype._undestroy = destroyImpl.undestroy;
  33469. Writable.prototype._destroy = function (err, cb) {
  33470. this.end();
  33471. cb(err);
  33472. };
  33473. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36), __webpack_require__(46).setImmediate, (function() { return this; }())))
  33474. /***/ }),
  33475. /* 46 */
  33476. /***/ (function(module, exports, __webpack_require__) {
  33477. var apply = Function.prototype.apply;
  33478. // DOM APIs, for completeness
  33479. exports.setTimeout = function() {
  33480. return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
  33481. };
  33482. exports.setInterval = function() {
  33483. return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
  33484. };
  33485. exports.clearTimeout =
  33486. exports.clearInterval = function(timeout) {
  33487. if (timeout) {
  33488. timeout.close();
  33489. }
  33490. };
  33491. function Timeout(id, clearFn) {
  33492. this._id = id;
  33493. this._clearFn = clearFn;
  33494. }
  33495. Timeout.prototype.unref = Timeout.prototype.ref = function() {};
  33496. Timeout.prototype.close = function() {
  33497. this._clearFn.call(window, this._id);
  33498. };
  33499. // Does not start the time, just sets up the members needed.
  33500. exports.enroll = function(item, msecs) {
  33501. clearTimeout(item._idleTimeoutId);
  33502. item._idleTimeout = msecs;
  33503. };
  33504. exports.unenroll = function(item) {
  33505. clearTimeout(item._idleTimeoutId);
  33506. item._idleTimeout = -1;
  33507. };
  33508. exports._unrefActive = exports.active = function(item) {
  33509. clearTimeout(item._idleTimeoutId);
  33510. var msecs = item._idleTimeout;
  33511. if (msecs >= 0) {
  33512. item._idleTimeoutId = setTimeout(function onTimeout() {
  33513. if (item._onTimeout)
  33514. item._onTimeout();
  33515. }, msecs);
  33516. }
  33517. };
  33518. // setimmediate attaches itself to the global object
  33519. __webpack_require__(47);
  33520. exports.setImmediate = setImmediate;
  33521. exports.clearImmediate = clearImmediate;
  33522. /***/ }),
  33523. /* 47 */
  33524. /***/ (function(module, exports, __webpack_require__) {
  33525. /* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {
  33526. "use strict";
  33527. if (global.setImmediate) {
  33528. return;
  33529. }
  33530. var nextHandle = 1; // Spec says greater than zero
  33531. var tasksByHandle = {};
  33532. var currentlyRunningATask = false;
  33533. var doc = global.document;
  33534. var registerImmediate;
  33535. function setImmediate(callback) {
  33536. // Callback can either be a function or a string
  33537. if (typeof callback !== "function") {
  33538. callback = new Function("" + callback);
  33539. }
  33540. // Copy function arguments
  33541. var args = new Array(arguments.length - 1);
  33542. for (var i = 0; i < args.length; i++) {
  33543. args[i] = arguments[i + 1];
  33544. }
  33545. // Store and register the task
  33546. var task = { callback: callback, args: args };
  33547. tasksByHandle[nextHandle] = task;
  33548. registerImmediate(nextHandle);
  33549. return nextHandle++;
  33550. }
  33551. function clearImmediate(handle) {
  33552. delete tasksByHandle[handle];
  33553. }
  33554. function run(task) {
  33555. var callback = task.callback;
  33556. var args = task.args;
  33557. switch (args.length) {
  33558. case 0:
  33559. callback();
  33560. break;
  33561. case 1:
  33562. callback(args[0]);
  33563. break;
  33564. case 2:
  33565. callback(args[0], args[1]);
  33566. break;
  33567. case 3:
  33568. callback(args[0], args[1], args[2]);
  33569. break;
  33570. default:
  33571. callback.apply(undefined, args);
  33572. break;
  33573. }
  33574. }
  33575. function runIfPresent(handle) {
  33576. // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
  33577. // So if we're currently running a task, we'll need to delay this invocation.
  33578. if (currentlyRunningATask) {
  33579. // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
  33580. // "too much recursion" error.
  33581. setTimeout(runIfPresent, 0, handle);
  33582. } else {
  33583. var task = tasksByHandle[handle];
  33584. if (task) {
  33585. currentlyRunningATask = true;
  33586. try {
  33587. run(task);
  33588. } finally {
  33589. clearImmediate(handle);
  33590. currentlyRunningATask = false;
  33591. }
  33592. }
  33593. }
  33594. }
  33595. function installNextTickImplementation() {
  33596. registerImmediate = function(handle) {
  33597. process.nextTick(function () { runIfPresent(handle); });
  33598. };
  33599. }
  33600. function canUsePostMessage() {
  33601. // The test against `importScripts` prevents this implementation from being installed inside a web worker,
  33602. // where `global.postMessage` means something completely different and can't be used for this purpose.
  33603. if (global.postMessage && !global.importScripts) {
  33604. var postMessageIsAsynchronous = true;
  33605. var oldOnMessage = global.onmessage;
  33606. global.onmessage = function() {
  33607. postMessageIsAsynchronous = false;
  33608. };
  33609. global.postMessage("", "*");
  33610. global.onmessage = oldOnMessage;
  33611. return postMessageIsAsynchronous;
  33612. }
  33613. }
  33614. function installPostMessageImplementation() {
  33615. // Installs an event handler on `global` for the `message` event: see
  33616. // * https://developer.mozilla.org/en/DOM/window.postMessage
  33617. // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
  33618. var messagePrefix = "setImmediate$" + Math.random() + "$";
  33619. var onGlobalMessage = function(event) {
  33620. if (event.source === global &&
  33621. typeof event.data === "string" &&
  33622. event.data.indexOf(messagePrefix) === 0) {
  33623. runIfPresent(+event.data.slice(messagePrefix.length));
  33624. }
  33625. };
  33626. if (global.addEventListener) {
  33627. global.addEventListener("message", onGlobalMessage, false);
  33628. } else {
  33629. global.attachEvent("onmessage", onGlobalMessage);
  33630. }
  33631. registerImmediate = function(handle) {
  33632. global.postMessage(messagePrefix + handle, "*");
  33633. };
  33634. }
  33635. function installMessageChannelImplementation() {
  33636. var channel = new MessageChannel();
  33637. channel.port1.onmessage = function(event) {
  33638. var handle = event.data;
  33639. runIfPresent(handle);
  33640. };
  33641. registerImmediate = function(handle) {
  33642. channel.port2.postMessage(handle);
  33643. };
  33644. }
  33645. function installReadyStateChangeImplementation() {
  33646. var html = doc.documentElement;
  33647. registerImmediate = function(handle) {
  33648. // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
  33649. // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
  33650. var script = doc.createElement("script");
  33651. script.onreadystatechange = function () {
  33652. runIfPresent(handle);
  33653. script.onreadystatechange = null;
  33654. html.removeChild(script);
  33655. script = null;
  33656. };
  33657. html.appendChild(script);
  33658. };
  33659. }
  33660. function installSetTimeoutImplementation() {
  33661. registerImmediate = function(handle) {
  33662. setTimeout(runIfPresent, 0, handle);
  33663. };
  33664. }
  33665. // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
  33666. var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
  33667. attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
  33668. // Don't get fooled by e.g. browserify environments.
  33669. if ({}.toString.call(global.process) === "[object process]") {
  33670. // For Node.js before 0.9
  33671. installNextTickImplementation();
  33672. } else if (canUsePostMessage()) {
  33673. // For non-IE10 modern browsers
  33674. installPostMessageImplementation();
  33675. } else if (global.MessageChannel) {
  33676. // For web workers, where supported
  33677. installMessageChannelImplementation();
  33678. } else if (doc && "onreadystatechange" in doc.createElement("script")) {
  33679. // For IE 6–8
  33680. installReadyStateChangeImplementation();
  33681. } else {
  33682. // For older browsers
  33683. installSetTimeoutImplementation();
  33684. }
  33685. attachTo.setImmediate = setImmediate;
  33686. attachTo.clearImmediate = clearImmediate;
  33687. }(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));
  33688. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(36)))
  33689. /***/ }),
  33690. /* 48 */
  33691. /***/ (function(module, exports) {
  33692. /* WEBPACK VAR INJECTION */(function(global) {
  33693. /**
  33694. * Module exports.
  33695. */
  33696. module.exports = deprecate;
  33697. /**
  33698. * Mark that a method should not be used.
  33699. * Returns a modified function which warns once by default.
  33700. *
  33701. * If `localStorage.noDeprecation = true` is set, then it is a no-op.
  33702. *
  33703. * If `localStorage.throwDeprecation = true` is set, then deprecated functions
  33704. * will throw an Error when invoked.
  33705. *
  33706. * If `localStorage.traceDeprecation = true` is set, then deprecated functions
  33707. * will invoke `console.trace()` instead of `console.error()`.
  33708. *
  33709. * @param {Function} fn - the function to deprecate
  33710. * @param {String} msg - the string to print to the console when `fn` is invoked
  33711. * @returns {Function} a new "deprecated" version of `fn`
  33712. * @api public
  33713. */
  33714. function deprecate (fn, msg) {
  33715. if (config('noDeprecation')) {
  33716. return fn;
  33717. }
  33718. var warned = false;
  33719. function deprecated() {
  33720. if (!warned) {
  33721. if (config('throwDeprecation')) {
  33722. throw new Error(msg);
  33723. } else if (config('traceDeprecation')) {
  33724. console.trace(msg);
  33725. } else {
  33726. console.warn(msg);
  33727. }
  33728. warned = true;
  33729. }
  33730. return fn.apply(this, arguments);
  33731. }
  33732. return deprecated;
  33733. }
  33734. /**
  33735. * Checks `localStorage` for boolean values for the given `name`.
  33736. *
  33737. * @param {String} name
  33738. * @returns {Boolean}
  33739. * @api private
  33740. */
  33741. function config (name) {
  33742. // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  33743. try {
  33744. if (!global.localStorage) return false;
  33745. } catch (_) {
  33746. return false;
  33747. }
  33748. var val = global.localStorage[name];
  33749. if (null == val) return false;
  33750. return String(val).toLowerCase() === 'true';
  33751. }
  33752. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  33753. /***/ }),
  33754. /* 49 */
  33755. /***/ (function(module, exports, __webpack_require__) {
  33756. 'use strict';
  33757. var Buffer = __webpack_require__(39).Buffer;
  33758. var isEncoding = Buffer.isEncoding || function (encoding) {
  33759. encoding = '' + encoding;
  33760. switch (encoding && encoding.toLowerCase()) {
  33761. case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
  33762. return true;
  33763. default:
  33764. return false;
  33765. }
  33766. };
  33767. function _normalizeEncoding(enc) {
  33768. if (!enc) return 'utf8';
  33769. var retried;
  33770. while (true) {
  33771. switch (enc) {
  33772. case 'utf8':
  33773. case 'utf-8':
  33774. return 'utf8';
  33775. case 'ucs2':
  33776. case 'ucs-2':
  33777. case 'utf16le':
  33778. case 'utf-16le':
  33779. return 'utf16le';
  33780. case 'latin1':
  33781. case 'binary':
  33782. return 'latin1';
  33783. case 'base64':
  33784. case 'ascii':
  33785. case 'hex':
  33786. return enc;
  33787. default:
  33788. if (retried) return; // undefined
  33789. enc = ('' + enc).toLowerCase();
  33790. retried = true;
  33791. }
  33792. }
  33793. };
  33794. // Do not cache `Buffer.isEncoding` when checking encoding names as some
  33795. // modules monkey-patch it to support additional encodings
  33796. function normalizeEncoding(enc) {
  33797. var nenc = _normalizeEncoding(enc);
  33798. if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  33799. return nenc || enc;
  33800. }
  33801. // StringDecoder provides an interface for efficiently splitting a series of
  33802. // buffers into a series of JS strings without breaking apart multi-byte
  33803. // characters.
  33804. exports.StringDecoder = StringDecoder;
  33805. function StringDecoder(encoding) {
  33806. this.encoding = normalizeEncoding(encoding);
  33807. var nb;
  33808. switch (this.encoding) {
  33809. case 'utf16le':
  33810. this.text = utf16Text;
  33811. this.end = utf16End;
  33812. nb = 4;
  33813. break;
  33814. case 'utf8':
  33815. this.fillLast = utf8FillLast;
  33816. nb = 4;
  33817. break;
  33818. case 'base64':
  33819. this.text = base64Text;
  33820. this.end = base64End;
  33821. nb = 3;
  33822. break;
  33823. default:
  33824. this.write = simpleWrite;
  33825. this.end = simpleEnd;
  33826. return;
  33827. }
  33828. this.lastNeed = 0;
  33829. this.lastTotal = 0;
  33830. this.lastChar = Buffer.allocUnsafe(nb);
  33831. }
  33832. StringDecoder.prototype.write = function (buf) {
  33833. if (buf.length === 0) return '';
  33834. var r;
  33835. var i;
  33836. if (this.lastNeed) {
  33837. r = this.fillLast(buf);
  33838. if (r === undefined) return '';
  33839. i = this.lastNeed;
  33840. this.lastNeed = 0;
  33841. } else {
  33842. i = 0;
  33843. }
  33844. if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  33845. return r || '';
  33846. };
  33847. StringDecoder.prototype.end = utf8End;
  33848. // Returns only complete characters in a Buffer
  33849. StringDecoder.prototype.text = utf8Text;
  33850. // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
  33851. StringDecoder.prototype.fillLast = function (buf) {
  33852. if (this.lastNeed <= buf.length) {
  33853. buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
  33854. return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  33855. }
  33856. buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  33857. this.lastNeed -= buf.length;
  33858. };
  33859. // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
  33860. // continuation byte.
  33861. function utf8CheckByte(byte) {
  33862. if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
  33863. return -1;
  33864. }
  33865. // Checks at most 3 bytes at the end of a Buffer in order to detect an
  33866. // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
  33867. // needed to complete the UTF-8 character (if applicable) are returned.
  33868. function utf8CheckIncomplete(self, buf, i) {
  33869. var j = buf.length - 1;
  33870. if (j < i) return 0;
  33871. var nb = utf8CheckByte(buf[j]);
  33872. if (nb >= 0) {
  33873. if (nb > 0) self.lastNeed = nb - 1;
  33874. return nb;
  33875. }
  33876. if (--j < i) return 0;
  33877. nb = utf8CheckByte(buf[j]);
  33878. if (nb >= 0) {
  33879. if (nb > 0) self.lastNeed = nb - 2;
  33880. return nb;
  33881. }
  33882. if (--j < i) return 0;
  33883. nb = utf8CheckByte(buf[j]);
  33884. if (nb >= 0) {
  33885. if (nb > 0) {
  33886. if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
  33887. }
  33888. return nb;
  33889. }
  33890. return 0;
  33891. }
  33892. // Validates as many continuation bytes for a multi-byte UTF-8 character as
  33893. // needed or are available. If we see a non-continuation byte where we expect
  33894. // one, we "replace" the validated continuation bytes we've seen so far with
  33895. // UTF-8 replacement characters ('\ufffd'), to match v8's UTF-8 decoding
  33896. // behavior. The continuation byte check is included three times in the case
  33897. // where all of the continuation bytes for a character exist in the same buffer.
  33898. // It is also done this way as a slight performance increase instead of using a
  33899. // loop.
  33900. function utf8CheckExtraBytes(self, buf, p) {
  33901. if ((buf[0] & 0xC0) !== 0x80) {
  33902. self.lastNeed = 0;
  33903. return '\ufffd'.repeat(p);
  33904. }
  33905. if (self.lastNeed > 1 && buf.length > 1) {
  33906. if ((buf[1] & 0xC0) !== 0x80) {
  33907. self.lastNeed = 1;
  33908. return '\ufffd'.repeat(p + 1);
  33909. }
  33910. if (self.lastNeed > 2 && buf.length > 2) {
  33911. if ((buf[2] & 0xC0) !== 0x80) {
  33912. self.lastNeed = 2;
  33913. return '\ufffd'.repeat(p + 2);
  33914. }
  33915. }
  33916. }
  33917. }
  33918. // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
  33919. function utf8FillLast(buf) {
  33920. var p = this.lastTotal - this.lastNeed;
  33921. var r = utf8CheckExtraBytes(this, buf, p);
  33922. if (r !== undefined) return r;
  33923. if (this.lastNeed <= buf.length) {
  33924. buf.copy(this.lastChar, p, 0, this.lastNeed);
  33925. return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  33926. }
  33927. buf.copy(this.lastChar, p, 0, buf.length);
  33928. this.lastNeed -= buf.length;
  33929. }
  33930. // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
  33931. // partial character, the character's bytes are buffered until the required
  33932. // number of bytes are available.
  33933. function utf8Text(buf, i) {
  33934. var total = utf8CheckIncomplete(this, buf, i);
  33935. if (!this.lastNeed) return buf.toString('utf8', i);
  33936. this.lastTotal = total;
  33937. var end = buf.length - (total - this.lastNeed);
  33938. buf.copy(this.lastChar, 0, end);
  33939. return buf.toString('utf8', i, end);
  33940. }
  33941. // For UTF-8, a replacement character for each buffered byte of a (partial)
  33942. // character needs to be added to the output.
  33943. function utf8End(buf) {
  33944. var r = buf && buf.length ? this.write(buf) : '';
  33945. if (this.lastNeed) return r + '\ufffd'.repeat(this.lastTotal - this.lastNeed);
  33946. return r;
  33947. }
  33948. // UTF-16LE typically needs two bytes per character, but even if we have an even
  33949. // number of bytes available, we need to check if we end on a leading/high
  33950. // surrogate. In that case, we need to wait for the next two bytes in order to
  33951. // decode the last character properly.
  33952. function utf16Text(buf, i) {
  33953. if ((buf.length - i) % 2 === 0) {
  33954. var r = buf.toString('utf16le', i);
  33955. if (r) {
  33956. var c = r.charCodeAt(r.length - 1);
  33957. if (c >= 0xD800 && c <= 0xDBFF) {
  33958. this.lastNeed = 2;
  33959. this.lastTotal = 4;
  33960. this.lastChar[0] = buf[buf.length - 2];
  33961. this.lastChar[1] = buf[buf.length - 1];
  33962. return r.slice(0, -1);
  33963. }
  33964. }
  33965. return r;
  33966. }
  33967. this.lastNeed = 1;
  33968. this.lastTotal = 2;
  33969. this.lastChar[0] = buf[buf.length - 1];
  33970. return buf.toString('utf16le', i, buf.length - 1);
  33971. }
  33972. // For UTF-16LE we do not explicitly append special replacement characters if we
  33973. // end on a partial character, we simply let v8 handle that.
  33974. function utf16End(buf) {
  33975. var r = buf && buf.length ? this.write(buf) : '';
  33976. if (this.lastNeed) {
  33977. var end = this.lastTotal - this.lastNeed;
  33978. return r + this.lastChar.toString('utf16le', 0, end);
  33979. }
  33980. return r;
  33981. }
  33982. function base64Text(buf, i) {
  33983. var n = (buf.length - i) % 3;
  33984. if (n === 0) return buf.toString('base64', i);
  33985. this.lastNeed = 3 - n;
  33986. this.lastTotal = 3;
  33987. if (n === 1) {
  33988. this.lastChar[0] = buf[buf.length - 1];
  33989. } else {
  33990. this.lastChar[0] = buf[buf.length - 2];
  33991. this.lastChar[1] = buf[buf.length - 1];
  33992. }
  33993. return buf.toString('base64', i, buf.length - n);
  33994. }
  33995. function base64End(buf) {
  33996. var r = buf && buf.length ? this.write(buf) : '';
  33997. if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  33998. return r;
  33999. }
  34000. // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
  34001. function simpleWrite(buf) {
  34002. return buf.toString(this.encoding);
  34003. }
  34004. function simpleEnd(buf) {
  34005. return buf && buf.length ? this.write(buf) : '';
  34006. }
  34007. /***/ }),
  34008. /* 50 */
  34009. /***/ (function(module, exports, __webpack_require__) {
  34010. // Copyright Joyent, Inc. and other Node contributors.
  34011. //
  34012. // Permission is hereby granted, free of charge, to any person obtaining a
  34013. // copy of this software and associated documentation files (the
  34014. // "Software"), to deal in the Software without restriction, including
  34015. // without limitation the rights to use, copy, modify, merge, publish,
  34016. // distribute, sublicense, and/or sell copies of the Software, and to permit
  34017. // persons to whom the Software is furnished to do so, subject to the
  34018. // following conditions:
  34019. //
  34020. // The above copyright notice and this permission notice shall be included
  34021. // in all copies or substantial portions of the Software.
  34022. //
  34023. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  34024. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  34025. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  34026. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  34027. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  34028. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  34029. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  34030. // a transform stream is a readable/writable stream where you do
  34031. // something with the data. Sometimes it's called a "filter",
  34032. // but that's not a great name for it, since that implies a thing where
  34033. // some bits pass through, and others are simply ignored. (That would
  34034. // be a valid example of a transform, of course.)
  34035. //
  34036. // While the output is causally related to the input, it's not a
  34037. // necessarily symmetric or synchronous transformation. For example,
  34038. // a zlib stream might take multiple plain-text writes(), and then
  34039. // emit a single compressed chunk some time in the future.
  34040. //
  34041. // Here's how this works:
  34042. //
  34043. // The Transform stream has all the aspects of the readable and writable
  34044. // stream classes. When you write(chunk), that calls _write(chunk,cb)
  34045. // internally, and returns false if there's a lot of pending writes
  34046. // buffered up. When you call read(), that calls _read(n) until
  34047. // there's enough pending readable data buffered up.
  34048. //
  34049. // In a transform stream, the written data is placed in a buffer. When
  34050. // _read(n) is called, it transforms the queued up data, calling the
  34051. // buffered _write cb's as it consumes chunks. If consuming a single
  34052. // written chunk would result in multiple output chunks, then the first
  34053. // outputted bit calls the readcb, and subsequent chunks just go into
  34054. // the read buffer, and will cause it to emit 'readable' if necessary.
  34055. //
  34056. // This way, back-pressure is actually determined by the reading side,
  34057. // since _read has to be called to start processing a new chunk. However,
  34058. // a pathological inflate type of transform can cause excessive buffering
  34059. // here. For example, imagine a stream where every byte of input is
  34060. // interpreted as an integer from 0-255, and then results in that many
  34061. // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
  34062. // 1kb of data being output. In this case, you could write a very small
  34063. // amount of input, and end up with a very large amount of output. In
  34064. // such a pathological inflating mechanism, there'd be no way to tell
  34065. // the system to stop doing the transform. A single 4MB write could
  34066. // cause the system to run out of memory.
  34067. //
  34068. // However, even in such a pathological case, only a single written chunk
  34069. // would be consumed, and then the rest would wait (un-transformed) until
  34070. // the results of the previous transformed chunk were consumed.
  34071. 'use strict';
  34072. module.exports = Transform;
  34073. var Duplex = __webpack_require__(44);
  34074. /*<replacement>*/
  34075. var util = __webpack_require__(40);
  34076. util.inherits = __webpack_require__(33);
  34077. /*</replacement>*/
  34078. util.inherits(Transform, Duplex);
  34079. function TransformState(stream) {
  34080. this.afterTransform = function (er, data) {
  34081. return afterTransform(stream, er, data);
  34082. };
  34083. this.needTransform = false;
  34084. this.transforming = false;
  34085. this.writecb = null;
  34086. this.writechunk = null;
  34087. this.writeencoding = null;
  34088. }
  34089. function afterTransform(stream, er, data) {
  34090. var ts = stream._transformState;
  34091. ts.transforming = false;
  34092. var cb = ts.writecb;
  34093. if (!cb) {
  34094. return stream.emit('error', new Error('write callback called multiple times'));
  34095. }
  34096. ts.writechunk = null;
  34097. ts.writecb = null;
  34098. if (data !== null && data !== undefined) stream.push(data);
  34099. cb(er);
  34100. var rs = stream._readableState;
  34101. rs.reading = false;
  34102. if (rs.needReadable || rs.length < rs.highWaterMark) {
  34103. stream._read(rs.highWaterMark);
  34104. }
  34105. }
  34106. function Transform(options) {
  34107. if (!(this instanceof Transform)) return new Transform(options);
  34108. Duplex.call(this, options);
  34109. this._transformState = new TransformState(this);
  34110. var stream = this;
  34111. // start out asking for a readable event once data is transformed.
  34112. this._readableState.needReadable = true;
  34113. // we have implemented the _read method, and done the other things
  34114. // that Readable wants before the first _read call, so unset the
  34115. // sync guard flag.
  34116. this._readableState.sync = false;
  34117. if (options) {
  34118. if (typeof options.transform === 'function') this._transform = options.transform;
  34119. if (typeof options.flush === 'function') this._flush = options.flush;
  34120. }
  34121. // When the writable side finishes, then flush out anything remaining.
  34122. this.once('prefinish', function () {
  34123. if (typeof this._flush === 'function') this._flush(function (er, data) {
  34124. done(stream, er, data);
  34125. });else done(stream);
  34126. });
  34127. }
  34128. Transform.prototype.push = function (chunk, encoding) {
  34129. this._transformState.needTransform = false;
  34130. return Duplex.prototype.push.call(this, chunk, encoding);
  34131. };
  34132. // This is the part where you do stuff!
  34133. // override this function in implementation classes.
  34134. // 'chunk' is an input chunk.
  34135. //
  34136. // Call `push(newChunk)` to pass along transformed output
  34137. // to the readable side. You may call 'push' zero or more times.
  34138. //
  34139. // Call `cb(err)` when you are done with this chunk. If you pass
  34140. // an error, then that'll put the hurt on the whole operation. If you
  34141. // never call cb(), then you'll never get another chunk.
  34142. Transform.prototype._transform = function (chunk, encoding, cb) {
  34143. throw new Error('_transform() is not implemented');
  34144. };
  34145. Transform.prototype._write = function (chunk, encoding, cb) {
  34146. var ts = this._transformState;
  34147. ts.writecb = cb;
  34148. ts.writechunk = chunk;
  34149. ts.writeencoding = encoding;
  34150. if (!ts.transforming) {
  34151. var rs = this._readableState;
  34152. if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  34153. }
  34154. };
  34155. // Doesn't matter what the args are here.
  34156. // _transform does all the work.
  34157. // That we got here means that the readable side wants more data.
  34158. Transform.prototype._read = function (n) {
  34159. var ts = this._transformState;
  34160. if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
  34161. ts.transforming = true;
  34162. this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  34163. } else {
  34164. // mark that we need a transform, so that any data that comes in
  34165. // will get processed, now that we've asked for it.
  34166. ts.needTransform = true;
  34167. }
  34168. };
  34169. Transform.prototype._destroy = function (err, cb) {
  34170. var _this = this;
  34171. Duplex.prototype._destroy.call(this, err, function (err2) {
  34172. cb(err2);
  34173. _this.emit('close');
  34174. });
  34175. };
  34176. function done(stream, er, data) {
  34177. if (er) return stream.emit('error', er);
  34178. if (data !== null && data !== undefined) stream.push(data);
  34179. // if there's nothing in the write buffer, then that means
  34180. // that nothing more will ever be provided
  34181. var ws = stream._writableState;
  34182. var ts = stream._transformState;
  34183. if (ws.length) throw new Error('Calling transform done when ws.length != 0');
  34184. if (ts.transforming) throw new Error('Calling transform done when still transforming');
  34185. return stream.push(null);
  34186. }
  34187. /***/ }),
  34188. /* 51 */
  34189. /***/ (function(module, exports, __webpack_require__) {
  34190. // Copyright Joyent, Inc. and other Node contributors.
  34191. //
  34192. // Permission is hereby granted, free of charge, to any person obtaining a
  34193. // copy of this software and associated documentation files (the
  34194. // "Software"), to deal in the Software without restriction, including
  34195. // without limitation the rights to use, copy, modify, merge, publish,
  34196. // distribute, sublicense, and/or sell copies of the Software, and to permit
  34197. // persons to whom the Software is furnished to do so, subject to the
  34198. // following conditions:
  34199. //
  34200. // The above copyright notice and this permission notice shall be included
  34201. // in all copies or substantial portions of the Software.
  34202. //
  34203. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  34204. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  34205. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  34206. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  34207. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  34208. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  34209. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  34210. // a passthrough stream.
  34211. // basically just the most minimal sort of Transform stream.
  34212. // Every written chunk gets output as-is.
  34213. 'use strict';
  34214. module.exports = PassThrough;
  34215. var Transform = __webpack_require__(50);
  34216. /*<replacement>*/
  34217. var util = __webpack_require__(40);
  34218. util.inherits = __webpack_require__(33);
  34219. /*</replacement>*/
  34220. util.inherits(PassThrough, Transform);
  34221. function PassThrough(options) {
  34222. if (!(this instanceof PassThrough)) return new PassThrough(options);
  34223. Transform.call(this, options);
  34224. }
  34225. PassThrough.prototype._transform = function (chunk, encoding, cb) {
  34226. cb(null, chunk);
  34227. };
  34228. /***/ }),
  34229. /* 52 */
  34230. /***/ (function(module, exports, __webpack_require__) {
  34231. module.exports = __webpack_require__(45);
  34232. /***/ }),
  34233. /* 53 */
  34234. /***/ (function(module, exports, __webpack_require__) {
  34235. module.exports = __webpack_require__(44);
  34236. /***/ }),
  34237. /* 54 */
  34238. /***/ (function(module, exports, __webpack_require__) {
  34239. module.exports = __webpack_require__(34).Transform
  34240. /***/ }),
  34241. /* 55 */
  34242. /***/ (function(module, exports, __webpack_require__) {
  34243. module.exports = __webpack_require__(34).PassThrough
  34244. /***/ }),
  34245. /* 56 */
  34246. /***/ (function(module, exports, __webpack_require__) {
  34247. /* WEBPACK VAR INJECTION */(function(Buffer, __dirname) {/* jslint node: true */
  34248. 'use strict';
  34249. function VirtualFileSystem() {
  34250. this.fileSystem = {};
  34251. this.baseSystem = {};
  34252. }
  34253. VirtualFileSystem.prototype.readFileSync = function (filename) {
  34254. filename = fixFilename(filename);
  34255. var base64content = this.baseSystem[filename];
  34256. if (base64content) {
  34257. return new Buffer(base64content, 'base64');
  34258. }
  34259. var content = this.fileSystem[filename];
  34260. if (content) {
  34261. return content;
  34262. }
  34263. throw 'File \'' + filename + '\' not found in virtual file system';
  34264. };
  34265. VirtualFileSystem.prototype.writeFileSync = function (filename, content) {
  34266. this.fileSystem[fixFilename(filename)] = content;
  34267. };
  34268. VirtualFileSystem.prototype.bindFS = function (data) {
  34269. this.baseSystem = data || {};
  34270. };
  34271. function fixFilename(filename) {
  34272. if (filename.indexOf(__dirname) === 0) {
  34273. filename = filename.substring(__dirname.length);
  34274. }
  34275. if (filename.indexOf('/') === 0) {
  34276. filename = filename.substring(1);
  34277. }
  34278. return filename;
  34279. }
  34280. module.exports = new VirtualFileSystem();
  34281. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer, "/"))
  34282. /***/ }),
  34283. /* 57 */
  34284. /***/ (function(module, exports, __webpack_require__) {
  34285. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  34286. /*
  34287. PDFObject - converts JavaScript types into their corrisponding PDF types.
  34288. By Devon Govett
  34289. */
  34290. (function() {
  34291. var PDFObject, PDFReference;
  34292. PDFObject = (function() {
  34293. var escapable, escapableRe, pad, swapBytes;
  34294. function PDFObject() {}
  34295. pad = function(str, length) {
  34296. return (Array(length + 1).join('0') + str).slice(-length);
  34297. };
  34298. escapableRe = /[\n\r\t\b\f\(\)\\]/g;
  34299. escapable = {
  34300. '\n': '\\n',
  34301. '\r': '\\r',
  34302. '\t': '\\t',
  34303. '\b': '\\b',
  34304. '\f': '\\f',
  34305. '\\': '\\\\',
  34306. '(': '\\(',
  34307. ')': '\\)'
  34308. };
  34309. swapBytes = function(buff) {
  34310. var a, i, j, l, ref;
  34311. l = buff.length;
  34312. if (l & 0x01) {
  34313. throw new Error("Buffer length must be even");
  34314. } else {
  34315. for (i = j = 0, ref = l - 1; j < ref; i = j += 2) {
  34316. a = buff[i];
  34317. buff[i] = buff[i + 1];
  34318. buff[i + 1] = a;
  34319. }
  34320. }
  34321. return buff;
  34322. };
  34323. PDFObject.convert = function(object) {
  34324. var e, i, isUnicode, items, j, key, out, ref, string, val;
  34325. if (typeof object === 'string') {
  34326. return '/' + object;
  34327. } else if (object instanceof String) {
  34328. string = object;
  34329. isUnicode = false;
  34330. for (i = j = 0, ref = string.length; j < ref; i = j += 1) {
  34331. if (string.charCodeAt(i) > 0x7f) {
  34332. isUnicode = true;
  34333. break;
  34334. }
  34335. }
  34336. if (isUnicode) {
  34337. string = swapBytes(new Buffer('\ufeff' + string, 'utf16le')).toString('binary');
  34338. }
  34339. string = string.replace(escapableRe, function(c) {
  34340. return escapable[c];
  34341. });
  34342. return '(' + string + ')';
  34343. } else if (Buffer.isBuffer(object)) {
  34344. return '<' + object.toString('hex') + '>';
  34345. } else if (object instanceof PDFReference) {
  34346. return object.toString();
  34347. } else if (object instanceof Date) {
  34348. return '(D:' + pad(object.getUTCFullYear(), 4) + pad(object.getUTCMonth() + 1, 2) + pad(object.getUTCDate(), 2) + pad(object.getUTCHours(), 2) + pad(object.getUTCMinutes(), 2) + pad(object.getUTCSeconds(), 2) + 'Z)';
  34349. } else if (Array.isArray(object)) {
  34350. items = ((function() {
  34351. var k, len, results;
  34352. results = [];
  34353. for (k = 0, len = object.length; k < len; k++) {
  34354. e = object[k];
  34355. results.push(PDFObject.convert(e));
  34356. }
  34357. return results;
  34358. })()).join(' ');
  34359. return '[' + items + ']';
  34360. } else if ({}.toString.call(object) === '[object Object]') {
  34361. out = ['<<'];
  34362. for (key in object) {
  34363. val = object[key];
  34364. out.push('/' + key + ' ' + PDFObject.convert(val));
  34365. }
  34366. out.push('>>');
  34367. return out.join('\n');
  34368. } else if (typeof object === 'number') {
  34369. return PDFObject.number(object);
  34370. } else {
  34371. return '' + object;
  34372. }
  34373. };
  34374. PDFObject.number = function(n) {
  34375. if (n > -1e21 && n < 1e21) {
  34376. return Math.round(n * 1e6) / 1e6;
  34377. }
  34378. throw new Error("unsupported number: " + n);
  34379. };
  34380. return PDFObject;
  34381. })();
  34382. module.exports = PDFObject;
  34383. PDFReference = __webpack_require__(58);
  34384. }).call(this);
  34385. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  34386. /***/ }),
  34387. /* 58 */
  34388. /***/ (function(module, exports, __webpack_require__) {
  34389. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  34390. /*
  34391. PDFReference - represents a reference to another object in the PDF object heirarchy
  34392. By Devon Govett
  34393. */
  34394. (function() {
  34395. var PDFObject, PDFReference, stream, zlib,
  34396. bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
  34397. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  34398. hasProp = {}.hasOwnProperty;
  34399. zlib = __webpack_require__(59);
  34400. stream = __webpack_require__(31);
  34401. PDFReference = (function(superClass) {
  34402. extend(PDFReference, superClass);
  34403. function PDFReference(document, id, data) {
  34404. this.document = document;
  34405. this.id = id;
  34406. this.data = data != null ? data : {};
  34407. this.finalize = bind(this.finalize, this);
  34408. PDFReference.__super__.constructor.call(this, {
  34409. decodeStrings: false
  34410. });
  34411. this.gen = 0;
  34412. this.deflate = null;
  34413. this.compress = this.document.compress && !this.data.Filter;
  34414. this.uncompressedLength = 0;
  34415. this.chunks = [];
  34416. }
  34417. PDFReference.prototype.initDeflate = function() {
  34418. this.data.Filter = 'FlateDecode';
  34419. this.deflate = zlib.createDeflate();
  34420. this.deflate.on('data', (function(_this) {
  34421. return function(chunk) {
  34422. _this.chunks.push(chunk);
  34423. return _this.data.Length += chunk.length;
  34424. };
  34425. })(this));
  34426. return this.deflate.on('end', this.finalize);
  34427. };
  34428. PDFReference.prototype._write = function(chunk, encoding, callback) {
  34429. var base;
  34430. if (!Buffer.isBuffer(chunk)) {
  34431. chunk = new Buffer(chunk + '\n', 'binary');
  34432. }
  34433. this.uncompressedLength += chunk.length;
  34434. if ((base = this.data).Length == null) {
  34435. base.Length = 0;
  34436. }
  34437. if (this.compress) {
  34438. if (!this.deflate) {
  34439. this.initDeflate();
  34440. }
  34441. this.deflate.write(chunk);
  34442. } else {
  34443. this.chunks.push(chunk);
  34444. this.data.Length += chunk.length;
  34445. }
  34446. return callback();
  34447. };
  34448. PDFReference.prototype.end = function(chunk) {
  34449. PDFReference.__super__.end.apply(this, arguments);
  34450. if (this.deflate) {
  34451. return this.deflate.end();
  34452. } else {
  34453. return this.finalize();
  34454. }
  34455. };
  34456. PDFReference.prototype.finalize = function() {
  34457. var chunk, i, len, ref;
  34458. this.offset = this.document._offset;
  34459. this.document._write(this.id + " " + this.gen + " obj");
  34460. this.document._write(PDFObject.convert(this.data));
  34461. if (this.chunks.length) {
  34462. this.document._write('stream');
  34463. ref = this.chunks;
  34464. for (i = 0, len = ref.length; i < len; i++) {
  34465. chunk = ref[i];
  34466. this.document._write(chunk);
  34467. }
  34468. this.chunks.length = 0;
  34469. this.document._write('\nendstream');
  34470. }
  34471. this.document._write('endobj');
  34472. return this.document._refEnd(this);
  34473. };
  34474. PDFReference.prototype.toString = function() {
  34475. return this.id + " " + this.gen + " R";
  34476. };
  34477. return PDFReference;
  34478. })(stream.Writable);
  34479. module.exports = PDFReference;
  34480. PDFObject = __webpack_require__(57);
  34481. }).call(this);
  34482. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  34483. /***/ }),
  34484. /* 59 */
  34485. /***/ (function(module, exports, __webpack_require__) {
  34486. /* WEBPACK VAR INJECTION */(function(Buffer, process) {// Copyright Joyent, Inc. and other Node contributors.
  34487. //
  34488. // Permission is hereby granted, free of charge, to any person obtaining a
  34489. // copy of this software and associated documentation files (the
  34490. // "Software"), to deal in the Software without restriction, including
  34491. // without limitation the rights to use, copy, modify, merge, publish,
  34492. // distribute, sublicense, and/or sell copies of the Software, and to permit
  34493. // persons to whom the Software is furnished to do so, subject to the
  34494. // following conditions:
  34495. //
  34496. // The above copyright notice and this permission notice shall be included
  34497. // in all copies or substantial portions of the Software.
  34498. //
  34499. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  34500. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  34501. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  34502. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  34503. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  34504. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  34505. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  34506. var Transform = __webpack_require__(54);
  34507. var binding = __webpack_require__(60);
  34508. var util = __webpack_require__(72);
  34509. var assert = __webpack_require__(75).ok;
  34510. // zlib doesn't provide these, so kludge them in following the same
  34511. // const naming scheme zlib uses.
  34512. binding.Z_MIN_WINDOWBITS = 8;
  34513. binding.Z_MAX_WINDOWBITS = 15;
  34514. binding.Z_DEFAULT_WINDOWBITS = 15;
  34515. // fewer than 64 bytes per chunk is stupid.
  34516. // technically it could work with as few as 8, but even 64 bytes
  34517. // is absurdly low. Usually a MB or more is best.
  34518. binding.Z_MIN_CHUNK = 64;
  34519. binding.Z_MAX_CHUNK = Infinity;
  34520. binding.Z_DEFAULT_CHUNK = (16 * 1024);
  34521. binding.Z_MIN_MEMLEVEL = 1;
  34522. binding.Z_MAX_MEMLEVEL = 9;
  34523. binding.Z_DEFAULT_MEMLEVEL = 8;
  34524. binding.Z_MIN_LEVEL = -1;
  34525. binding.Z_MAX_LEVEL = 9;
  34526. binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION;
  34527. // expose all the zlib constants
  34528. Object.keys(binding).forEach(function(k) {
  34529. if (k.match(/^Z/)) exports[k] = binding[k];
  34530. });
  34531. // translation table for return codes.
  34532. exports.codes = {
  34533. Z_OK: binding.Z_OK,
  34534. Z_STREAM_END: binding.Z_STREAM_END,
  34535. Z_NEED_DICT: binding.Z_NEED_DICT,
  34536. Z_ERRNO: binding.Z_ERRNO,
  34537. Z_STREAM_ERROR: binding.Z_STREAM_ERROR,
  34538. Z_DATA_ERROR: binding.Z_DATA_ERROR,
  34539. Z_MEM_ERROR: binding.Z_MEM_ERROR,
  34540. Z_BUF_ERROR: binding.Z_BUF_ERROR,
  34541. Z_VERSION_ERROR: binding.Z_VERSION_ERROR
  34542. };
  34543. Object.keys(exports.codes).forEach(function(k) {
  34544. exports.codes[exports.codes[k]] = k;
  34545. });
  34546. exports.Deflate = Deflate;
  34547. exports.Inflate = Inflate;
  34548. exports.Gzip = Gzip;
  34549. exports.Gunzip = Gunzip;
  34550. exports.DeflateRaw = DeflateRaw;
  34551. exports.InflateRaw = InflateRaw;
  34552. exports.Unzip = Unzip;
  34553. exports.createDeflate = function(o) {
  34554. return new Deflate(o);
  34555. };
  34556. exports.createInflate = function(o) {
  34557. return new Inflate(o);
  34558. };
  34559. exports.createDeflateRaw = function(o) {
  34560. return new DeflateRaw(o);
  34561. };
  34562. exports.createInflateRaw = function(o) {
  34563. return new InflateRaw(o);
  34564. };
  34565. exports.createGzip = function(o) {
  34566. return new Gzip(o);
  34567. };
  34568. exports.createGunzip = function(o) {
  34569. return new Gunzip(o);
  34570. };
  34571. exports.createUnzip = function(o) {
  34572. return new Unzip(o);
  34573. };
  34574. // Convenience methods.
  34575. // compress/decompress a string or buffer in one step.
  34576. exports.deflate = function(buffer, opts, callback) {
  34577. if (typeof opts === 'function') {
  34578. callback = opts;
  34579. opts = {};
  34580. }
  34581. return zlibBuffer(new Deflate(opts), buffer, callback);
  34582. };
  34583. exports.deflateSync = function(buffer, opts) {
  34584. return zlibBufferSync(new Deflate(opts), buffer);
  34585. };
  34586. exports.gzip = function(buffer, opts, callback) {
  34587. if (typeof opts === 'function') {
  34588. callback = opts;
  34589. opts = {};
  34590. }
  34591. return zlibBuffer(new Gzip(opts), buffer, callback);
  34592. };
  34593. exports.gzipSync = function(buffer, opts) {
  34594. return zlibBufferSync(new Gzip(opts), buffer);
  34595. };
  34596. exports.deflateRaw = function(buffer, opts, callback) {
  34597. if (typeof opts === 'function') {
  34598. callback = opts;
  34599. opts = {};
  34600. }
  34601. return zlibBuffer(new DeflateRaw(opts), buffer, callback);
  34602. };
  34603. exports.deflateRawSync = function(buffer, opts) {
  34604. return zlibBufferSync(new DeflateRaw(opts), buffer);
  34605. };
  34606. exports.unzip = function(buffer, opts, callback) {
  34607. if (typeof opts === 'function') {
  34608. callback = opts;
  34609. opts = {};
  34610. }
  34611. return zlibBuffer(new Unzip(opts), buffer, callback);
  34612. };
  34613. exports.unzipSync = function(buffer, opts) {
  34614. return zlibBufferSync(new Unzip(opts), buffer);
  34615. };
  34616. exports.inflate = function(buffer, opts, callback) {
  34617. if (typeof opts === 'function') {
  34618. callback = opts;
  34619. opts = {};
  34620. }
  34621. return zlibBuffer(new Inflate(opts), buffer, callback);
  34622. };
  34623. exports.inflateSync = function(buffer, opts) {
  34624. return zlibBufferSync(new Inflate(opts), buffer);
  34625. };
  34626. exports.gunzip = function(buffer, opts, callback) {
  34627. if (typeof opts === 'function') {
  34628. callback = opts;
  34629. opts = {};
  34630. }
  34631. return zlibBuffer(new Gunzip(opts), buffer, callback);
  34632. };
  34633. exports.gunzipSync = function(buffer, opts) {
  34634. return zlibBufferSync(new Gunzip(opts), buffer);
  34635. };
  34636. exports.inflateRaw = function(buffer, opts, callback) {
  34637. if (typeof opts === 'function') {
  34638. callback = opts;
  34639. opts = {};
  34640. }
  34641. return zlibBuffer(new InflateRaw(opts), buffer, callback);
  34642. };
  34643. exports.inflateRawSync = function(buffer, opts) {
  34644. return zlibBufferSync(new InflateRaw(opts), buffer);
  34645. };
  34646. function zlibBuffer(engine, buffer, callback) {
  34647. var buffers = [];
  34648. var nread = 0;
  34649. engine.on('error', onError);
  34650. engine.on('end', onEnd);
  34651. engine.end(buffer);
  34652. flow();
  34653. function flow() {
  34654. var chunk;
  34655. while (null !== (chunk = engine.read())) {
  34656. buffers.push(chunk);
  34657. nread += chunk.length;
  34658. }
  34659. engine.once('readable', flow);
  34660. }
  34661. function onError(err) {
  34662. engine.removeListener('end', onEnd);
  34663. engine.removeListener('readable', flow);
  34664. callback(err);
  34665. }
  34666. function onEnd() {
  34667. var buf = Buffer.concat(buffers, nread);
  34668. buffers = [];
  34669. callback(null, buf);
  34670. engine.close();
  34671. }
  34672. }
  34673. function zlibBufferSync(engine, buffer) {
  34674. if (typeof buffer === 'string')
  34675. buffer = new Buffer(buffer);
  34676. if (!Buffer.isBuffer(buffer))
  34677. throw new TypeError('Not a string or buffer');
  34678. var flushFlag = binding.Z_FINISH;
  34679. return engine._processChunk(buffer, flushFlag);
  34680. }
  34681. // generic zlib
  34682. // minimal 2-byte header
  34683. function Deflate(opts) {
  34684. if (!(this instanceof Deflate)) return new Deflate(opts);
  34685. Zlib.call(this, opts, binding.DEFLATE);
  34686. }
  34687. function Inflate(opts) {
  34688. if (!(this instanceof Inflate)) return new Inflate(opts);
  34689. Zlib.call(this, opts, binding.INFLATE);
  34690. }
  34691. // gzip - bigger header, same deflate compression
  34692. function Gzip(opts) {
  34693. if (!(this instanceof Gzip)) return new Gzip(opts);
  34694. Zlib.call(this, opts, binding.GZIP);
  34695. }
  34696. function Gunzip(opts) {
  34697. if (!(this instanceof Gunzip)) return new Gunzip(opts);
  34698. Zlib.call(this, opts, binding.GUNZIP);
  34699. }
  34700. // raw - no header
  34701. function DeflateRaw(opts) {
  34702. if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts);
  34703. Zlib.call(this, opts, binding.DEFLATERAW);
  34704. }
  34705. function InflateRaw(opts) {
  34706. if (!(this instanceof InflateRaw)) return new InflateRaw(opts);
  34707. Zlib.call(this, opts, binding.INFLATERAW);
  34708. }
  34709. // auto-detect header.
  34710. function Unzip(opts) {
  34711. if (!(this instanceof Unzip)) return new Unzip(opts);
  34712. Zlib.call(this, opts, binding.UNZIP);
  34713. }
  34714. // the Zlib class they all inherit from
  34715. // This thing manages the queue of requests, and returns
  34716. // true or false if there is anything in the queue when
  34717. // you call the .write() method.
  34718. function Zlib(opts, mode) {
  34719. this._opts = opts = opts || {};
  34720. this._chunkSize = opts.chunkSize || exports.Z_DEFAULT_CHUNK;
  34721. Transform.call(this, opts);
  34722. if (opts.flush) {
  34723. if (opts.flush !== binding.Z_NO_FLUSH &&
  34724. opts.flush !== binding.Z_PARTIAL_FLUSH &&
  34725. opts.flush !== binding.Z_SYNC_FLUSH &&
  34726. opts.flush !== binding.Z_FULL_FLUSH &&
  34727. opts.flush !== binding.Z_FINISH &&
  34728. opts.flush !== binding.Z_BLOCK) {
  34729. throw new Error('Invalid flush flag: ' + opts.flush);
  34730. }
  34731. }
  34732. this._flushFlag = opts.flush || binding.Z_NO_FLUSH;
  34733. if (opts.chunkSize) {
  34734. if (opts.chunkSize < exports.Z_MIN_CHUNK ||
  34735. opts.chunkSize > exports.Z_MAX_CHUNK) {
  34736. throw new Error('Invalid chunk size: ' + opts.chunkSize);
  34737. }
  34738. }
  34739. if (opts.windowBits) {
  34740. if (opts.windowBits < exports.Z_MIN_WINDOWBITS ||
  34741. opts.windowBits > exports.Z_MAX_WINDOWBITS) {
  34742. throw new Error('Invalid windowBits: ' + opts.windowBits);
  34743. }
  34744. }
  34745. if (opts.level) {
  34746. if (opts.level < exports.Z_MIN_LEVEL ||
  34747. opts.level > exports.Z_MAX_LEVEL) {
  34748. throw new Error('Invalid compression level: ' + opts.level);
  34749. }
  34750. }
  34751. if (opts.memLevel) {
  34752. if (opts.memLevel < exports.Z_MIN_MEMLEVEL ||
  34753. opts.memLevel > exports.Z_MAX_MEMLEVEL) {
  34754. throw new Error('Invalid memLevel: ' + opts.memLevel);
  34755. }
  34756. }
  34757. if (opts.strategy) {
  34758. if (opts.strategy != exports.Z_FILTERED &&
  34759. opts.strategy != exports.Z_HUFFMAN_ONLY &&
  34760. opts.strategy != exports.Z_RLE &&
  34761. opts.strategy != exports.Z_FIXED &&
  34762. opts.strategy != exports.Z_DEFAULT_STRATEGY) {
  34763. throw new Error('Invalid strategy: ' + opts.strategy);
  34764. }
  34765. }
  34766. if (opts.dictionary) {
  34767. if (!Buffer.isBuffer(opts.dictionary)) {
  34768. throw new Error('Invalid dictionary: it should be a Buffer instance');
  34769. }
  34770. }
  34771. this._binding = new binding.Zlib(mode);
  34772. var self = this;
  34773. this._hadError = false;
  34774. this._binding.onerror = function(message, errno) {
  34775. // there is no way to cleanly recover.
  34776. // continuing only obscures problems.
  34777. self._binding = null;
  34778. self._hadError = true;
  34779. var error = new Error(message);
  34780. error.errno = errno;
  34781. error.code = exports.codes[errno];
  34782. self.emit('error', error);
  34783. };
  34784. var level = exports.Z_DEFAULT_COMPRESSION;
  34785. if (typeof opts.level === 'number') level = opts.level;
  34786. var strategy = exports.Z_DEFAULT_STRATEGY;
  34787. if (typeof opts.strategy === 'number') strategy = opts.strategy;
  34788. this._binding.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS,
  34789. level,
  34790. opts.memLevel || exports.Z_DEFAULT_MEMLEVEL,
  34791. strategy,
  34792. opts.dictionary);
  34793. this._buffer = new Buffer(this._chunkSize);
  34794. this._offset = 0;
  34795. this._closed = false;
  34796. this._level = level;
  34797. this._strategy = strategy;
  34798. this.once('end', this.close);
  34799. }
  34800. util.inherits(Zlib, Transform);
  34801. Zlib.prototype.params = function(level, strategy, callback) {
  34802. if (level < exports.Z_MIN_LEVEL ||
  34803. level > exports.Z_MAX_LEVEL) {
  34804. throw new RangeError('Invalid compression level: ' + level);
  34805. }
  34806. if (strategy != exports.Z_FILTERED &&
  34807. strategy != exports.Z_HUFFMAN_ONLY &&
  34808. strategy != exports.Z_RLE &&
  34809. strategy != exports.Z_FIXED &&
  34810. strategy != exports.Z_DEFAULT_STRATEGY) {
  34811. throw new TypeError('Invalid strategy: ' + strategy);
  34812. }
  34813. if (this._level !== level || this._strategy !== strategy) {
  34814. var self = this;
  34815. this.flush(binding.Z_SYNC_FLUSH, function() {
  34816. self._binding.params(level, strategy);
  34817. if (!self._hadError) {
  34818. self._level = level;
  34819. self._strategy = strategy;
  34820. if (callback) callback();
  34821. }
  34822. });
  34823. } else {
  34824. process.nextTick(callback);
  34825. }
  34826. };
  34827. Zlib.prototype.reset = function() {
  34828. return this._binding.reset();
  34829. };
  34830. // This is the _flush function called by the transform class,
  34831. // internally, when the last chunk has been written.
  34832. Zlib.prototype._flush = function(callback) {
  34833. this._transform(new Buffer(0), '', callback);
  34834. };
  34835. Zlib.prototype.flush = function(kind, callback) {
  34836. var ws = this._writableState;
  34837. if (typeof kind === 'function' || (kind === void 0 && !callback)) {
  34838. callback = kind;
  34839. kind = binding.Z_FULL_FLUSH;
  34840. }
  34841. if (ws.ended) {
  34842. if (callback)
  34843. process.nextTick(callback);
  34844. } else if (ws.ending) {
  34845. if (callback)
  34846. this.once('end', callback);
  34847. } else if (ws.needDrain) {
  34848. var self = this;
  34849. this.once('drain', function() {
  34850. self.flush(callback);
  34851. });
  34852. } else {
  34853. this._flushFlag = kind;
  34854. this.write(new Buffer(0), '', callback);
  34855. }
  34856. };
  34857. Zlib.prototype.close = function(callback) {
  34858. if (callback)
  34859. process.nextTick(callback);
  34860. if (this._closed)
  34861. return;
  34862. this._closed = true;
  34863. this._binding.close();
  34864. var self = this;
  34865. process.nextTick(function() {
  34866. self.emit('close');
  34867. });
  34868. };
  34869. Zlib.prototype._transform = function(chunk, encoding, cb) {
  34870. var flushFlag;
  34871. var ws = this._writableState;
  34872. var ending = ws.ending || ws.ended;
  34873. var last = ending && (!chunk || ws.length === chunk.length);
  34874. if (!chunk === null && !Buffer.isBuffer(chunk))
  34875. return cb(new Error('invalid input'));
  34876. // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag.
  34877. // If it's explicitly flushing at some other time, then we use
  34878. // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression
  34879. // goodness.
  34880. if (last)
  34881. flushFlag = binding.Z_FINISH;
  34882. else {
  34883. flushFlag = this._flushFlag;
  34884. // once we've flushed the last of the queue, stop flushing and
  34885. // go back to the normal behavior.
  34886. if (chunk.length >= ws.length) {
  34887. this._flushFlag = this._opts.flush || binding.Z_NO_FLUSH;
  34888. }
  34889. }
  34890. var self = this;
  34891. this._processChunk(chunk, flushFlag, cb);
  34892. };
  34893. Zlib.prototype._processChunk = function(chunk, flushFlag, cb) {
  34894. var availInBefore = chunk && chunk.length;
  34895. var availOutBefore = this._chunkSize - this._offset;
  34896. var inOff = 0;
  34897. var self = this;
  34898. var async = typeof cb === 'function';
  34899. if (!async) {
  34900. var buffers = [];
  34901. var nread = 0;
  34902. var error;
  34903. this.on('error', function(er) {
  34904. error = er;
  34905. });
  34906. do {
  34907. var res = this._binding.writeSync(flushFlag,
  34908. chunk, // in
  34909. inOff, // in_off
  34910. availInBefore, // in_len
  34911. this._buffer, // out
  34912. this._offset, //out_off
  34913. availOutBefore); // out_len
  34914. } while (!this._hadError && callback(res[0], res[1]));
  34915. if (this._hadError) {
  34916. throw error;
  34917. }
  34918. var buf = Buffer.concat(buffers, nread);
  34919. this.close();
  34920. return buf;
  34921. }
  34922. var req = this._binding.write(flushFlag,
  34923. chunk, // in
  34924. inOff, // in_off
  34925. availInBefore, // in_len
  34926. this._buffer, // out
  34927. this._offset, //out_off
  34928. availOutBefore); // out_len
  34929. req.buffer = chunk;
  34930. req.callback = callback;
  34931. function callback(availInAfter, availOutAfter) {
  34932. if (self._hadError)
  34933. return;
  34934. var have = availOutBefore - availOutAfter;
  34935. assert(have >= 0, 'have should not go down');
  34936. if (have > 0) {
  34937. var out = self._buffer.slice(self._offset, self._offset + have);
  34938. self._offset += have;
  34939. // serve some output to the consumer.
  34940. if (async) {
  34941. self.push(out);
  34942. } else {
  34943. buffers.push(out);
  34944. nread += out.length;
  34945. }
  34946. }
  34947. // exhausted the output buffer, or used all the input create a new one.
  34948. if (availOutAfter === 0 || self._offset >= self._chunkSize) {
  34949. availOutBefore = self._chunkSize;
  34950. self._offset = 0;
  34951. self._buffer = new Buffer(self._chunkSize);
  34952. }
  34953. if (availOutAfter === 0) {
  34954. // Not actually done. Need to reprocess.
  34955. // Also, update the availInBefore to the availInAfter value,
  34956. // so that if we have to hit it a third (fourth, etc.) time,
  34957. // it'll have the correct byte counts.
  34958. inOff += (availInBefore - availInAfter);
  34959. availInBefore = availInAfter;
  34960. if (!async)
  34961. return true;
  34962. var newReq = self._binding.write(flushFlag,
  34963. chunk,
  34964. inOff,
  34965. availInBefore,
  34966. self._buffer,
  34967. self._offset,
  34968. self._chunkSize);
  34969. newReq.callback = callback; // this same function
  34970. newReq.buffer = chunk;
  34971. return;
  34972. }
  34973. if (!async)
  34974. return false;
  34975. // finished with the chunk.
  34976. cb();
  34977. }
  34978. };
  34979. util.inherits(Deflate, Zlib);
  34980. util.inherits(Inflate, Zlib);
  34981. util.inherits(Gzip, Zlib);
  34982. util.inherits(Gunzip, Zlib);
  34983. util.inherits(DeflateRaw, Zlib);
  34984. util.inherits(InflateRaw, Zlib);
  34985. util.inherits(Unzip, Zlib);
  34986. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer, __webpack_require__(36)))
  34987. /***/ }),
  34988. /* 60 */
  34989. /***/ (function(module, exports, __webpack_require__) {
  34990. /* WEBPACK VAR INJECTION */(function(process, Buffer) {var msg = __webpack_require__(61);
  34991. var zstream = __webpack_require__(62);
  34992. var zlib_deflate = __webpack_require__(63);
  34993. var zlib_inflate = __webpack_require__(68);
  34994. var constants = __webpack_require__(71);
  34995. for (var key in constants) {
  34996. exports[key] = constants[key];
  34997. }
  34998. // zlib modes
  34999. exports.NONE = 0;
  35000. exports.DEFLATE = 1;
  35001. exports.INFLATE = 2;
  35002. exports.GZIP = 3;
  35003. exports.GUNZIP = 4;
  35004. exports.DEFLATERAW = 5;
  35005. exports.INFLATERAW = 6;
  35006. exports.UNZIP = 7;
  35007. /**
  35008. * Emulate Node's zlib C++ layer for use by the JS layer in index.js
  35009. */
  35010. function Zlib(mode) {
  35011. if (mode < exports.DEFLATE || mode > exports.UNZIP)
  35012. throw new TypeError("Bad argument");
  35013. this.mode = mode;
  35014. this.init_done = false;
  35015. this.write_in_progress = false;
  35016. this.pending_close = false;
  35017. this.windowBits = 0;
  35018. this.level = 0;
  35019. this.memLevel = 0;
  35020. this.strategy = 0;
  35021. this.dictionary = null;
  35022. }
  35023. Zlib.prototype.init = function(windowBits, level, memLevel, strategy, dictionary) {
  35024. this.windowBits = windowBits;
  35025. this.level = level;
  35026. this.memLevel = memLevel;
  35027. this.strategy = strategy;
  35028. // dictionary not supported.
  35029. if (this.mode === exports.GZIP || this.mode === exports.GUNZIP)
  35030. this.windowBits += 16;
  35031. if (this.mode === exports.UNZIP)
  35032. this.windowBits += 32;
  35033. if (this.mode === exports.DEFLATERAW || this.mode === exports.INFLATERAW)
  35034. this.windowBits = -this.windowBits;
  35035. this.strm = new zstream();
  35036. switch (this.mode) {
  35037. case exports.DEFLATE:
  35038. case exports.GZIP:
  35039. case exports.DEFLATERAW:
  35040. var status = zlib_deflate.deflateInit2(
  35041. this.strm,
  35042. this.level,
  35043. exports.Z_DEFLATED,
  35044. this.windowBits,
  35045. this.memLevel,
  35046. this.strategy
  35047. );
  35048. break;
  35049. case exports.INFLATE:
  35050. case exports.GUNZIP:
  35051. case exports.INFLATERAW:
  35052. case exports.UNZIP:
  35053. var status = zlib_inflate.inflateInit2(
  35054. this.strm,
  35055. this.windowBits
  35056. );
  35057. break;
  35058. default:
  35059. throw new Error("Unknown mode " + this.mode);
  35060. }
  35061. if (status !== exports.Z_OK) {
  35062. this._error(status);
  35063. return;
  35064. }
  35065. this.write_in_progress = false;
  35066. this.init_done = true;
  35067. };
  35068. Zlib.prototype.params = function() {
  35069. throw new Error("deflateParams Not supported");
  35070. };
  35071. Zlib.prototype._writeCheck = function() {
  35072. if (!this.init_done)
  35073. throw new Error("write before init");
  35074. if (this.mode === exports.NONE)
  35075. throw new Error("already finalized");
  35076. if (this.write_in_progress)
  35077. throw new Error("write already in progress");
  35078. if (this.pending_close)
  35079. throw new Error("close is pending");
  35080. };
  35081. Zlib.prototype.write = function(flush, input, in_off, in_len, out, out_off, out_len) {
  35082. this._writeCheck();
  35083. this.write_in_progress = true;
  35084. var self = this;
  35085. process.nextTick(function() {
  35086. self.write_in_progress = false;
  35087. var res = self._write(flush, input, in_off, in_len, out, out_off, out_len);
  35088. self.callback(res[0], res[1]);
  35089. if (self.pending_close)
  35090. self.close();
  35091. });
  35092. return this;
  35093. };
  35094. // set method for Node buffers, used by pako
  35095. function bufferSet(data, offset) {
  35096. for (var i = 0; i < data.length; i++) {
  35097. this[offset + i] = data[i];
  35098. }
  35099. }
  35100. Zlib.prototype.writeSync = function(flush, input, in_off, in_len, out, out_off, out_len) {
  35101. this._writeCheck();
  35102. return this._write(flush, input, in_off, in_len, out, out_off, out_len);
  35103. };
  35104. Zlib.prototype._write = function(flush, input, in_off, in_len, out, out_off, out_len) {
  35105. this.write_in_progress = true;
  35106. if (flush !== exports.Z_NO_FLUSH &&
  35107. flush !== exports.Z_PARTIAL_FLUSH &&
  35108. flush !== exports.Z_SYNC_FLUSH &&
  35109. flush !== exports.Z_FULL_FLUSH &&
  35110. flush !== exports.Z_FINISH &&
  35111. flush !== exports.Z_BLOCK) {
  35112. throw new Error("Invalid flush value");
  35113. }
  35114. if (input == null) {
  35115. input = new Buffer(0);
  35116. in_len = 0;
  35117. in_off = 0;
  35118. }
  35119. if (out._set)
  35120. out.set = out._set;
  35121. else
  35122. out.set = bufferSet;
  35123. var strm = this.strm;
  35124. strm.avail_in = in_len;
  35125. strm.input = input;
  35126. strm.next_in = in_off;
  35127. strm.avail_out = out_len;
  35128. strm.output = out;
  35129. strm.next_out = out_off;
  35130. switch (this.mode) {
  35131. case exports.DEFLATE:
  35132. case exports.GZIP:
  35133. case exports.DEFLATERAW:
  35134. var status = zlib_deflate.deflate(strm, flush);
  35135. break;
  35136. case exports.UNZIP:
  35137. case exports.INFLATE:
  35138. case exports.GUNZIP:
  35139. case exports.INFLATERAW:
  35140. var status = zlib_inflate.inflate(strm, flush);
  35141. break;
  35142. default:
  35143. throw new Error("Unknown mode " + this.mode);
  35144. }
  35145. if (status !== exports.Z_STREAM_END && status !== exports.Z_OK) {
  35146. this._error(status);
  35147. }
  35148. this.write_in_progress = false;
  35149. return [strm.avail_in, strm.avail_out];
  35150. };
  35151. Zlib.prototype.close = function() {
  35152. if (this.write_in_progress) {
  35153. this.pending_close = true;
  35154. return;
  35155. }
  35156. this.pending_close = false;
  35157. if (this.mode === exports.DEFLATE || this.mode === exports.GZIP || this.mode === exports.DEFLATERAW) {
  35158. zlib_deflate.deflateEnd(this.strm);
  35159. } else {
  35160. zlib_inflate.inflateEnd(this.strm);
  35161. }
  35162. this.mode = exports.NONE;
  35163. };
  35164. Zlib.prototype.reset = function() {
  35165. switch (this.mode) {
  35166. case exports.DEFLATE:
  35167. case exports.DEFLATERAW:
  35168. var status = zlib_deflate.deflateReset(this.strm);
  35169. break;
  35170. case exports.INFLATE:
  35171. case exports.INFLATERAW:
  35172. var status = zlib_inflate.inflateReset(this.strm);
  35173. break;
  35174. }
  35175. if (status !== exports.Z_OK) {
  35176. this._error(status);
  35177. }
  35178. };
  35179. Zlib.prototype._error = function(status) {
  35180. this.onerror(msg[status] + ': ' + this.strm.msg, status);
  35181. this.write_in_progress = false;
  35182. if (this.pending_close)
  35183. this.close();
  35184. };
  35185. exports.Zlib = Zlib;
  35186. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36), __webpack_require__(2).Buffer))
  35187. /***/ }),
  35188. /* 61 */
  35189. /***/ (function(module, exports) {
  35190. 'use strict';
  35191. module.exports = {
  35192. 2: 'need dictionary', /* Z_NEED_DICT 2 */
  35193. 1: 'stream end', /* Z_STREAM_END 1 */
  35194. 0: '', /* Z_OK 0 */
  35195. '-1': 'file error', /* Z_ERRNO (-1) */
  35196. '-2': 'stream error', /* Z_STREAM_ERROR (-2) */
  35197. '-3': 'data error', /* Z_DATA_ERROR (-3) */
  35198. '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */
  35199. '-5': 'buffer error', /* Z_BUF_ERROR (-5) */
  35200. '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
  35201. };
  35202. /***/ }),
  35203. /* 62 */
  35204. /***/ (function(module, exports) {
  35205. 'use strict';
  35206. function ZStream() {
  35207. /* next input byte */
  35208. this.input = null; // JS specific, because we have no pointers
  35209. this.next_in = 0;
  35210. /* number of bytes available at input */
  35211. this.avail_in = 0;
  35212. /* total number of input bytes read so far */
  35213. this.total_in = 0;
  35214. /* next output byte should be put there */
  35215. this.output = null; // JS specific, because we have no pointers
  35216. this.next_out = 0;
  35217. /* remaining free space at output */
  35218. this.avail_out = 0;
  35219. /* total number of bytes output so far */
  35220. this.total_out = 0;
  35221. /* last error message, NULL if no error */
  35222. this.msg = ''/*Z_NULL*/;
  35223. /* not visible by applications */
  35224. this.state = null;
  35225. /* best guess about the data type: binary or text */
  35226. this.data_type = 2/*Z_UNKNOWN*/;
  35227. /* adler32 value of the uncompressed data */
  35228. this.adler = 0;
  35229. }
  35230. module.exports = ZStream;
  35231. /***/ }),
  35232. /* 63 */
  35233. /***/ (function(module, exports, __webpack_require__) {
  35234. 'use strict';
  35235. var utils = __webpack_require__(64);
  35236. var trees = __webpack_require__(65);
  35237. var adler32 = __webpack_require__(66);
  35238. var crc32 = __webpack_require__(67);
  35239. var msg = __webpack_require__(61);
  35240. /* Public constants ==========================================================*/
  35241. /* ===========================================================================*/
  35242. /* Allowed flush values; see deflate() and inflate() below for details */
  35243. var Z_NO_FLUSH = 0;
  35244. var Z_PARTIAL_FLUSH = 1;
  35245. //var Z_SYNC_FLUSH = 2;
  35246. var Z_FULL_FLUSH = 3;
  35247. var Z_FINISH = 4;
  35248. var Z_BLOCK = 5;
  35249. //var Z_TREES = 6;
  35250. /* Return codes for the compression/decompression functions. Negative values
  35251. * are errors, positive values are used for special but normal events.
  35252. */
  35253. var Z_OK = 0;
  35254. var Z_STREAM_END = 1;
  35255. //var Z_NEED_DICT = 2;
  35256. //var Z_ERRNO = -1;
  35257. var Z_STREAM_ERROR = -2;
  35258. var Z_DATA_ERROR = -3;
  35259. //var Z_MEM_ERROR = -4;
  35260. var Z_BUF_ERROR = -5;
  35261. //var Z_VERSION_ERROR = -6;
  35262. /* compression levels */
  35263. //var Z_NO_COMPRESSION = 0;
  35264. //var Z_BEST_SPEED = 1;
  35265. //var Z_BEST_COMPRESSION = 9;
  35266. var Z_DEFAULT_COMPRESSION = -1;
  35267. var Z_FILTERED = 1;
  35268. var Z_HUFFMAN_ONLY = 2;
  35269. var Z_RLE = 3;
  35270. var Z_FIXED = 4;
  35271. var Z_DEFAULT_STRATEGY = 0;
  35272. /* Possible values of the data_type field (though see inflate()) */
  35273. //var Z_BINARY = 0;
  35274. //var Z_TEXT = 1;
  35275. //var Z_ASCII = 1; // = Z_TEXT
  35276. var Z_UNKNOWN = 2;
  35277. /* The deflate compression method */
  35278. var Z_DEFLATED = 8;
  35279. /*============================================================================*/
  35280. var MAX_MEM_LEVEL = 9;
  35281. /* Maximum value for memLevel in deflateInit2 */
  35282. var MAX_WBITS = 15;
  35283. /* 32K LZ77 window */
  35284. var DEF_MEM_LEVEL = 8;
  35285. var LENGTH_CODES = 29;
  35286. /* number of length codes, not counting the special END_BLOCK code */
  35287. var LITERALS = 256;
  35288. /* number of literal bytes 0..255 */
  35289. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  35290. /* number of Literal or Length codes, including the END_BLOCK code */
  35291. var D_CODES = 30;
  35292. /* number of distance codes */
  35293. var BL_CODES = 19;
  35294. /* number of codes used to transfer the bit lengths */
  35295. var HEAP_SIZE = 2 * L_CODES + 1;
  35296. /* maximum heap size */
  35297. var MAX_BITS = 15;
  35298. /* All codes must not exceed MAX_BITS bits */
  35299. var MIN_MATCH = 3;
  35300. var MAX_MATCH = 258;
  35301. var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
  35302. var PRESET_DICT = 0x20;
  35303. var INIT_STATE = 42;
  35304. var EXTRA_STATE = 69;
  35305. var NAME_STATE = 73;
  35306. var COMMENT_STATE = 91;
  35307. var HCRC_STATE = 103;
  35308. var BUSY_STATE = 113;
  35309. var FINISH_STATE = 666;
  35310. var BS_NEED_MORE = 1; /* block not completed, need more input or more output */
  35311. var BS_BLOCK_DONE = 2; /* block flush performed */
  35312. var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
  35313. var BS_FINISH_DONE = 4; /* finish done, accept no more input or output */
  35314. var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
  35315. function err(strm, errorCode) {
  35316. strm.msg = msg[errorCode];
  35317. return errorCode;
  35318. }
  35319. function rank(f) {
  35320. return ((f) << 1) - ((f) > 4 ? 9 : 0);
  35321. }
  35322. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  35323. /* =========================================================================
  35324. * Flush as much pending output as possible. All deflate() output goes
  35325. * through this function so some applications may wish to modify it
  35326. * to avoid allocating a large strm->output buffer and copying into it.
  35327. * (See also read_buf()).
  35328. */
  35329. function flush_pending(strm) {
  35330. var s = strm.state;
  35331. //_tr_flush_bits(s);
  35332. var len = s.pending;
  35333. if (len > strm.avail_out) {
  35334. len = strm.avail_out;
  35335. }
  35336. if (len === 0) { return; }
  35337. utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
  35338. strm.next_out += len;
  35339. s.pending_out += len;
  35340. strm.total_out += len;
  35341. strm.avail_out -= len;
  35342. s.pending -= len;
  35343. if (s.pending === 0) {
  35344. s.pending_out = 0;
  35345. }
  35346. }
  35347. function flush_block_only(s, last) {
  35348. trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
  35349. s.block_start = s.strstart;
  35350. flush_pending(s.strm);
  35351. }
  35352. function put_byte(s, b) {
  35353. s.pending_buf[s.pending++] = b;
  35354. }
  35355. /* =========================================================================
  35356. * Put a short in the pending buffer. The 16-bit value is put in MSB order.
  35357. * IN assertion: the stream state is correct and there is enough room in
  35358. * pending_buf.
  35359. */
  35360. function putShortMSB(s, b) {
  35361. // put_byte(s, (Byte)(b >> 8));
  35362. // put_byte(s, (Byte)(b & 0xff));
  35363. s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
  35364. s.pending_buf[s.pending++] = b & 0xff;
  35365. }
  35366. /* ===========================================================================
  35367. * Read a new buffer from the current input stream, update the adler32
  35368. * and total number of bytes read. All deflate() input goes through
  35369. * this function so some applications may wish to modify it to avoid
  35370. * allocating a large strm->input buffer and copying from it.
  35371. * (See also flush_pending()).
  35372. */
  35373. function read_buf(strm, buf, start, size) {
  35374. var len = strm.avail_in;
  35375. if (len > size) { len = size; }
  35376. if (len === 0) { return 0; }
  35377. strm.avail_in -= len;
  35378. // zmemcpy(buf, strm->next_in, len);
  35379. utils.arraySet(buf, strm.input, strm.next_in, len, start);
  35380. if (strm.state.wrap === 1) {
  35381. strm.adler = adler32(strm.adler, buf, len, start);
  35382. }
  35383. else if (strm.state.wrap === 2) {
  35384. strm.adler = crc32(strm.adler, buf, len, start);
  35385. }
  35386. strm.next_in += len;
  35387. strm.total_in += len;
  35388. return len;
  35389. }
  35390. /* ===========================================================================
  35391. * Set match_start to the longest match starting at the given string and
  35392. * return its length. Matches shorter or equal to prev_length are discarded,
  35393. * in which case the result is equal to prev_length and match_start is
  35394. * garbage.
  35395. * IN assertions: cur_match is the head of the hash chain for the current
  35396. * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
  35397. * OUT assertion: the match length is not greater than s->lookahead.
  35398. */
  35399. function longest_match(s, cur_match) {
  35400. var chain_length = s.max_chain_length; /* max hash chain length */
  35401. var scan = s.strstart; /* current string */
  35402. var match; /* matched string */
  35403. var len; /* length of current match */
  35404. var best_len = s.prev_length; /* best match length so far */
  35405. var nice_match = s.nice_match; /* stop if match long enough */
  35406. var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
  35407. s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
  35408. var _win = s.window; // shortcut
  35409. var wmask = s.w_mask;
  35410. var prev = s.prev;
  35411. /* Stop when cur_match becomes <= limit. To simplify the code,
  35412. * we prevent matches with the string of window index 0.
  35413. */
  35414. var strend = s.strstart + MAX_MATCH;
  35415. var scan_end1 = _win[scan + best_len - 1];
  35416. var scan_end = _win[scan + best_len];
  35417. /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
  35418. * It is easy to get rid of this optimization if necessary.
  35419. */
  35420. // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
  35421. /* Do not waste too much time if we already have a good match: */
  35422. if (s.prev_length >= s.good_match) {
  35423. chain_length >>= 2;
  35424. }
  35425. /* Do not look for matches beyond the end of the input. This is necessary
  35426. * to make deflate deterministic.
  35427. */
  35428. if (nice_match > s.lookahead) { nice_match = s.lookahead; }
  35429. // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
  35430. do {
  35431. // Assert(cur_match < s->strstart, "no future");
  35432. match = cur_match;
  35433. /* Skip to next match if the match length cannot increase
  35434. * or if the match length is less than 2. Note that the checks below
  35435. * for insufficient lookahead only occur occasionally for performance
  35436. * reasons. Therefore uninitialized memory will be accessed, and
  35437. * conditional jumps will be made that depend on those values.
  35438. * However the length of the match is limited to the lookahead, so
  35439. * the output of deflate is not affected by the uninitialized values.
  35440. */
  35441. if (_win[match + best_len] !== scan_end ||
  35442. _win[match + best_len - 1] !== scan_end1 ||
  35443. _win[match] !== _win[scan] ||
  35444. _win[++match] !== _win[scan + 1]) {
  35445. continue;
  35446. }
  35447. /* The check at best_len-1 can be removed because it will be made
  35448. * again later. (This heuristic is not always a win.)
  35449. * It is not necessary to compare scan[2] and match[2] since they
  35450. * are always equal when the other bytes match, given that
  35451. * the hash keys are equal and that HASH_BITS >= 8.
  35452. */
  35453. scan += 2;
  35454. match++;
  35455. // Assert(*scan == *match, "match[2]?");
  35456. /* We check for insufficient lookahead only every 8th comparison;
  35457. * the 256th check will be made at strstart+258.
  35458. */
  35459. do {
  35460. /*jshint noempty:false*/
  35461. } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  35462. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  35463. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  35464. _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
  35465. scan < strend);
  35466. // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
  35467. len = MAX_MATCH - (strend - scan);
  35468. scan = strend - MAX_MATCH;
  35469. if (len > best_len) {
  35470. s.match_start = cur_match;
  35471. best_len = len;
  35472. if (len >= nice_match) {
  35473. break;
  35474. }
  35475. scan_end1 = _win[scan + best_len - 1];
  35476. scan_end = _win[scan + best_len];
  35477. }
  35478. } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
  35479. if (best_len <= s.lookahead) {
  35480. return best_len;
  35481. }
  35482. return s.lookahead;
  35483. }
  35484. /* ===========================================================================
  35485. * Fill the window when the lookahead becomes insufficient.
  35486. * Updates strstart and lookahead.
  35487. *
  35488. * IN assertion: lookahead < MIN_LOOKAHEAD
  35489. * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
  35490. * At least one byte has been read, or avail_in == 0; reads are
  35491. * performed for at least two bytes (required for the zip translate_eol
  35492. * option -- not supported here).
  35493. */
  35494. function fill_window(s) {
  35495. var _w_size = s.w_size;
  35496. var p, n, m, more, str;
  35497. //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
  35498. do {
  35499. more = s.window_size - s.lookahead - s.strstart;
  35500. // JS ints have 32 bit, block below not needed
  35501. /* Deal with !@#$% 64K limit: */
  35502. //if (sizeof(int) <= 2) {
  35503. // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
  35504. // more = wsize;
  35505. //
  35506. // } else if (more == (unsigned)(-1)) {
  35507. // /* Very unlikely, but possible on 16 bit machine if
  35508. // * strstart == 0 && lookahead == 1 (input done a byte at time)
  35509. // */
  35510. // more--;
  35511. // }
  35512. //}
  35513. /* If the window is almost full and there is insufficient lookahead,
  35514. * move the upper half to the lower one to make room in the upper half.
  35515. */
  35516. if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
  35517. utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
  35518. s.match_start -= _w_size;
  35519. s.strstart -= _w_size;
  35520. /* we now have strstart >= MAX_DIST */
  35521. s.block_start -= _w_size;
  35522. /* Slide the hash table (could be avoided with 32 bit values
  35523. at the expense of memory usage). We slide even when level == 0
  35524. to keep the hash table consistent if we switch back to level > 0
  35525. later. (Using level 0 permanently is not an optimal usage of
  35526. zlib, so we don't care about this pathological case.)
  35527. */
  35528. n = s.hash_size;
  35529. p = n;
  35530. do {
  35531. m = s.head[--p];
  35532. s.head[p] = (m >= _w_size ? m - _w_size : 0);
  35533. } while (--n);
  35534. n = _w_size;
  35535. p = n;
  35536. do {
  35537. m = s.prev[--p];
  35538. s.prev[p] = (m >= _w_size ? m - _w_size : 0);
  35539. /* If n is not on any hash chain, prev[n] is garbage but
  35540. * its value will never be used.
  35541. */
  35542. } while (--n);
  35543. more += _w_size;
  35544. }
  35545. if (s.strm.avail_in === 0) {
  35546. break;
  35547. }
  35548. /* If there was no sliding:
  35549. * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
  35550. * more == window_size - lookahead - strstart
  35551. * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
  35552. * => more >= window_size - 2*WSIZE + 2
  35553. * In the BIG_MEM or MMAP case (not yet supported),
  35554. * window_size == input_size + MIN_LOOKAHEAD &&
  35555. * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
  35556. * Otherwise, window_size == 2*WSIZE so more >= 2.
  35557. * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
  35558. */
  35559. //Assert(more >= 2, "more < 2");
  35560. n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
  35561. s.lookahead += n;
  35562. /* Initialize the hash value now that we have some input: */
  35563. if (s.lookahead + s.insert >= MIN_MATCH) {
  35564. str = s.strstart - s.insert;
  35565. s.ins_h = s.window[str];
  35566. /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
  35567. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
  35568. //#if MIN_MATCH != 3
  35569. // Call update_hash() MIN_MATCH-3 more times
  35570. //#endif
  35571. while (s.insert) {
  35572. /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
  35573. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
  35574. s.prev[str & s.w_mask] = s.head[s.ins_h];
  35575. s.head[s.ins_h] = str;
  35576. str++;
  35577. s.insert--;
  35578. if (s.lookahead + s.insert < MIN_MATCH) {
  35579. break;
  35580. }
  35581. }
  35582. }
  35583. /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
  35584. * but this is not important since only literal bytes will be emitted.
  35585. */
  35586. } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
  35587. /* If the WIN_INIT bytes after the end of the current data have never been
  35588. * written, then zero those bytes in order to avoid memory check reports of
  35589. * the use of uninitialized (or uninitialised as Julian writes) bytes by
  35590. * the longest match routines. Update the high water mark for the next
  35591. * time through here. WIN_INIT is set to MAX_MATCH since the longest match
  35592. * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
  35593. */
  35594. // if (s.high_water < s.window_size) {
  35595. // var curr = s.strstart + s.lookahead;
  35596. // var init = 0;
  35597. //
  35598. // if (s.high_water < curr) {
  35599. // /* Previous high water mark below current data -- zero WIN_INIT
  35600. // * bytes or up to end of window, whichever is less.
  35601. // */
  35602. // init = s.window_size - curr;
  35603. // if (init > WIN_INIT)
  35604. // init = WIN_INIT;
  35605. // zmemzero(s->window + curr, (unsigned)init);
  35606. // s->high_water = curr + init;
  35607. // }
  35608. // else if (s->high_water < (ulg)curr + WIN_INIT) {
  35609. // /* High water mark at or above current data, but below current data
  35610. // * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
  35611. // * to end of window, whichever is less.
  35612. // */
  35613. // init = (ulg)curr + WIN_INIT - s->high_water;
  35614. // if (init > s->window_size - s->high_water)
  35615. // init = s->window_size - s->high_water;
  35616. // zmemzero(s->window + s->high_water, (unsigned)init);
  35617. // s->high_water += init;
  35618. // }
  35619. // }
  35620. //
  35621. // Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
  35622. // "not enough room for search");
  35623. }
  35624. /* ===========================================================================
  35625. * Copy without compression as much as possible from the input stream, return
  35626. * the current block state.
  35627. * This function does not insert new strings in the dictionary since
  35628. * uncompressible data is probably not useful. This function is used
  35629. * only for the level=0 compression option.
  35630. * NOTE: this function should be optimized to avoid extra copying from
  35631. * window to pending_buf.
  35632. */
  35633. function deflate_stored(s, flush) {
  35634. /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
  35635. * to pending_buf_size, and each stored block has a 5 byte header:
  35636. */
  35637. var max_block_size = 0xffff;
  35638. if (max_block_size > s.pending_buf_size - 5) {
  35639. max_block_size = s.pending_buf_size - 5;
  35640. }
  35641. /* Copy as much as possible from input to output: */
  35642. for (;;) {
  35643. /* Fill the window as much as possible: */
  35644. if (s.lookahead <= 1) {
  35645. //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
  35646. // s->block_start >= (long)s->w_size, "slide too late");
  35647. // if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
  35648. // s.block_start >= s.w_size)) {
  35649. // throw new Error("slide too late");
  35650. // }
  35651. fill_window(s);
  35652. if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
  35653. return BS_NEED_MORE;
  35654. }
  35655. if (s.lookahead === 0) {
  35656. break;
  35657. }
  35658. /* flush the current block */
  35659. }
  35660. //Assert(s->block_start >= 0L, "block gone");
  35661. // if (s.block_start < 0) throw new Error("block gone");
  35662. s.strstart += s.lookahead;
  35663. s.lookahead = 0;
  35664. /* Emit a stored block if pending_buf will be full: */
  35665. var max_start = s.block_start + max_block_size;
  35666. if (s.strstart === 0 || s.strstart >= max_start) {
  35667. /* strstart == 0 is possible when wraparound on 16-bit machine */
  35668. s.lookahead = s.strstart - max_start;
  35669. s.strstart = max_start;
  35670. /*** FLUSH_BLOCK(s, 0); ***/
  35671. flush_block_only(s, false);
  35672. if (s.strm.avail_out === 0) {
  35673. return BS_NEED_MORE;
  35674. }
  35675. /***/
  35676. }
  35677. /* Flush if we may have to slide, otherwise block_start may become
  35678. * negative and the data will be gone:
  35679. */
  35680. if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
  35681. /*** FLUSH_BLOCK(s, 0); ***/
  35682. flush_block_only(s, false);
  35683. if (s.strm.avail_out === 0) {
  35684. return BS_NEED_MORE;
  35685. }
  35686. /***/
  35687. }
  35688. }
  35689. s.insert = 0;
  35690. if (flush === Z_FINISH) {
  35691. /*** FLUSH_BLOCK(s, 1); ***/
  35692. flush_block_only(s, true);
  35693. if (s.strm.avail_out === 0) {
  35694. return BS_FINISH_STARTED;
  35695. }
  35696. /***/
  35697. return BS_FINISH_DONE;
  35698. }
  35699. if (s.strstart > s.block_start) {
  35700. /*** FLUSH_BLOCK(s, 0); ***/
  35701. flush_block_only(s, false);
  35702. if (s.strm.avail_out === 0) {
  35703. return BS_NEED_MORE;
  35704. }
  35705. /***/
  35706. }
  35707. return BS_NEED_MORE;
  35708. }
  35709. /* ===========================================================================
  35710. * Compress as much as possible from the input stream, return the current
  35711. * block state.
  35712. * This function does not perform lazy evaluation of matches and inserts
  35713. * new strings in the dictionary only for unmatched strings or for short
  35714. * matches. It is used only for the fast compression options.
  35715. */
  35716. function deflate_fast(s, flush) {
  35717. var hash_head; /* head of the hash chain */
  35718. var bflush; /* set if current block must be flushed */
  35719. for (;;) {
  35720. /* Make sure that we always have enough lookahead, except
  35721. * at the end of the input file. We need MAX_MATCH bytes
  35722. * for the next match, plus MIN_MATCH bytes to insert the
  35723. * string following the next match.
  35724. */
  35725. if (s.lookahead < MIN_LOOKAHEAD) {
  35726. fill_window(s);
  35727. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  35728. return BS_NEED_MORE;
  35729. }
  35730. if (s.lookahead === 0) {
  35731. break; /* flush the current block */
  35732. }
  35733. }
  35734. /* Insert the string window[strstart .. strstart+2] in the
  35735. * dictionary, and set hash_head to the head of the hash chain:
  35736. */
  35737. hash_head = 0/*NIL*/;
  35738. if (s.lookahead >= MIN_MATCH) {
  35739. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  35740. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  35741. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  35742. s.head[s.ins_h] = s.strstart;
  35743. /***/
  35744. }
  35745. /* Find the longest match, discarding those <= prev_length.
  35746. * At this point we have always match_length < MIN_MATCH
  35747. */
  35748. if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
  35749. /* To simplify the code, we prevent matches with the string
  35750. * of window index 0 (in particular we have to avoid a match
  35751. * of the string with itself at the start of the input file).
  35752. */
  35753. s.match_length = longest_match(s, hash_head);
  35754. /* longest_match() sets match_start */
  35755. }
  35756. if (s.match_length >= MIN_MATCH) {
  35757. // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
  35758. /*** _tr_tally_dist(s, s.strstart - s.match_start,
  35759. s.match_length - MIN_MATCH, bflush); ***/
  35760. bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
  35761. s.lookahead -= s.match_length;
  35762. /* Insert new strings in the hash table only if the match length
  35763. * is not too large. This saves time but degrades compression.
  35764. */
  35765. if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
  35766. s.match_length--; /* string at strstart already in table */
  35767. do {
  35768. s.strstart++;
  35769. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  35770. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  35771. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  35772. s.head[s.ins_h] = s.strstart;
  35773. /***/
  35774. /* strstart never exceeds WSIZE-MAX_MATCH, so there are
  35775. * always MIN_MATCH bytes ahead.
  35776. */
  35777. } while (--s.match_length !== 0);
  35778. s.strstart++;
  35779. } else
  35780. {
  35781. s.strstart += s.match_length;
  35782. s.match_length = 0;
  35783. s.ins_h = s.window[s.strstart];
  35784. /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
  35785. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
  35786. //#if MIN_MATCH != 3
  35787. // Call UPDATE_HASH() MIN_MATCH-3 more times
  35788. //#endif
  35789. /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
  35790. * matter since it will be recomputed at next deflate call.
  35791. */
  35792. }
  35793. } else {
  35794. /* No match, output a literal byte */
  35795. //Tracevv((stderr,"%c", s.window[s.strstart]));
  35796. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  35797. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  35798. s.lookahead--;
  35799. s.strstart++;
  35800. }
  35801. if (bflush) {
  35802. /*** FLUSH_BLOCK(s, 0); ***/
  35803. flush_block_only(s, false);
  35804. if (s.strm.avail_out === 0) {
  35805. return BS_NEED_MORE;
  35806. }
  35807. /***/
  35808. }
  35809. }
  35810. s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
  35811. if (flush === Z_FINISH) {
  35812. /*** FLUSH_BLOCK(s, 1); ***/
  35813. flush_block_only(s, true);
  35814. if (s.strm.avail_out === 0) {
  35815. return BS_FINISH_STARTED;
  35816. }
  35817. /***/
  35818. return BS_FINISH_DONE;
  35819. }
  35820. if (s.last_lit) {
  35821. /*** FLUSH_BLOCK(s, 0); ***/
  35822. flush_block_only(s, false);
  35823. if (s.strm.avail_out === 0) {
  35824. return BS_NEED_MORE;
  35825. }
  35826. /***/
  35827. }
  35828. return BS_BLOCK_DONE;
  35829. }
  35830. /* ===========================================================================
  35831. * Same as above, but achieves better compression. We use a lazy
  35832. * evaluation for matches: a match is finally adopted only if there is
  35833. * no better match at the next window position.
  35834. */
  35835. function deflate_slow(s, flush) {
  35836. var hash_head; /* head of hash chain */
  35837. var bflush; /* set if current block must be flushed */
  35838. var max_insert;
  35839. /* Process the input block. */
  35840. for (;;) {
  35841. /* Make sure that we always have enough lookahead, except
  35842. * at the end of the input file. We need MAX_MATCH bytes
  35843. * for the next match, plus MIN_MATCH bytes to insert the
  35844. * string following the next match.
  35845. */
  35846. if (s.lookahead < MIN_LOOKAHEAD) {
  35847. fill_window(s);
  35848. if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
  35849. return BS_NEED_MORE;
  35850. }
  35851. if (s.lookahead === 0) { break; } /* flush the current block */
  35852. }
  35853. /* Insert the string window[strstart .. strstart+2] in the
  35854. * dictionary, and set hash_head to the head of the hash chain:
  35855. */
  35856. hash_head = 0/*NIL*/;
  35857. if (s.lookahead >= MIN_MATCH) {
  35858. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  35859. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  35860. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  35861. s.head[s.ins_h] = s.strstart;
  35862. /***/
  35863. }
  35864. /* Find the longest match, discarding those <= prev_length.
  35865. */
  35866. s.prev_length = s.match_length;
  35867. s.prev_match = s.match_start;
  35868. s.match_length = MIN_MATCH - 1;
  35869. if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
  35870. s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
  35871. /* To simplify the code, we prevent matches with the string
  35872. * of window index 0 (in particular we have to avoid a match
  35873. * of the string with itself at the start of the input file).
  35874. */
  35875. s.match_length = longest_match(s, hash_head);
  35876. /* longest_match() sets match_start */
  35877. if (s.match_length <= 5 &&
  35878. (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
  35879. /* If prev_match is also MIN_MATCH, match_start is garbage
  35880. * but we will ignore the current match anyway.
  35881. */
  35882. s.match_length = MIN_MATCH - 1;
  35883. }
  35884. }
  35885. /* If there was a match at the previous step and the current
  35886. * match is not better, output the previous match:
  35887. */
  35888. if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
  35889. max_insert = s.strstart + s.lookahead - MIN_MATCH;
  35890. /* Do not insert strings in hash table beyond this. */
  35891. //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
  35892. /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
  35893. s.prev_length - MIN_MATCH, bflush);***/
  35894. bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
  35895. /* Insert in hash table all strings up to the end of the match.
  35896. * strstart-1 and strstart are already inserted. If there is not
  35897. * enough lookahead, the last two strings are not inserted in
  35898. * the hash table.
  35899. */
  35900. s.lookahead -= s.prev_length - 1;
  35901. s.prev_length -= 2;
  35902. do {
  35903. if (++s.strstart <= max_insert) {
  35904. /*** INSERT_STRING(s, s.strstart, hash_head); ***/
  35905. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
  35906. hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
  35907. s.head[s.ins_h] = s.strstart;
  35908. /***/
  35909. }
  35910. } while (--s.prev_length !== 0);
  35911. s.match_available = 0;
  35912. s.match_length = MIN_MATCH - 1;
  35913. s.strstart++;
  35914. if (bflush) {
  35915. /*** FLUSH_BLOCK(s, 0); ***/
  35916. flush_block_only(s, false);
  35917. if (s.strm.avail_out === 0) {
  35918. return BS_NEED_MORE;
  35919. }
  35920. /***/
  35921. }
  35922. } else if (s.match_available) {
  35923. /* If there was no match at the previous position, output a
  35924. * single literal. If there was a match but the current match
  35925. * is longer, truncate the previous match to a single literal.
  35926. */
  35927. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  35928. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  35929. bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
  35930. if (bflush) {
  35931. /*** FLUSH_BLOCK_ONLY(s, 0) ***/
  35932. flush_block_only(s, false);
  35933. /***/
  35934. }
  35935. s.strstart++;
  35936. s.lookahead--;
  35937. if (s.strm.avail_out === 0) {
  35938. return BS_NEED_MORE;
  35939. }
  35940. } else {
  35941. /* There is no previous match to compare with, wait for
  35942. * the next step to decide.
  35943. */
  35944. s.match_available = 1;
  35945. s.strstart++;
  35946. s.lookahead--;
  35947. }
  35948. }
  35949. //Assert (flush != Z_NO_FLUSH, "no flush?");
  35950. if (s.match_available) {
  35951. //Tracevv((stderr,"%c", s->window[s->strstart-1]));
  35952. /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
  35953. bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
  35954. s.match_available = 0;
  35955. }
  35956. s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
  35957. if (flush === Z_FINISH) {
  35958. /*** FLUSH_BLOCK(s, 1); ***/
  35959. flush_block_only(s, true);
  35960. if (s.strm.avail_out === 0) {
  35961. return BS_FINISH_STARTED;
  35962. }
  35963. /***/
  35964. return BS_FINISH_DONE;
  35965. }
  35966. if (s.last_lit) {
  35967. /*** FLUSH_BLOCK(s, 0); ***/
  35968. flush_block_only(s, false);
  35969. if (s.strm.avail_out === 0) {
  35970. return BS_NEED_MORE;
  35971. }
  35972. /***/
  35973. }
  35974. return BS_BLOCK_DONE;
  35975. }
  35976. /* ===========================================================================
  35977. * For Z_RLE, simply look for runs of bytes, generate matches only of distance
  35978. * one. Do not maintain a hash table. (It will be regenerated if this run of
  35979. * deflate switches away from Z_RLE.)
  35980. */
  35981. function deflate_rle(s, flush) {
  35982. var bflush; /* set if current block must be flushed */
  35983. var prev; /* byte at distance one to match */
  35984. var scan, strend; /* scan goes up to strend for length of run */
  35985. var _win = s.window;
  35986. for (;;) {
  35987. /* Make sure that we always have enough lookahead, except
  35988. * at the end of the input file. We need MAX_MATCH bytes
  35989. * for the longest run, plus one for the unrolled loop.
  35990. */
  35991. if (s.lookahead <= MAX_MATCH) {
  35992. fill_window(s);
  35993. if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
  35994. return BS_NEED_MORE;
  35995. }
  35996. if (s.lookahead === 0) { break; } /* flush the current block */
  35997. }
  35998. /* See how many times the previous byte repeats */
  35999. s.match_length = 0;
  36000. if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
  36001. scan = s.strstart - 1;
  36002. prev = _win[scan];
  36003. if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
  36004. strend = s.strstart + MAX_MATCH;
  36005. do {
  36006. /*jshint noempty:false*/
  36007. } while (prev === _win[++scan] && prev === _win[++scan] &&
  36008. prev === _win[++scan] && prev === _win[++scan] &&
  36009. prev === _win[++scan] && prev === _win[++scan] &&
  36010. prev === _win[++scan] && prev === _win[++scan] &&
  36011. scan < strend);
  36012. s.match_length = MAX_MATCH - (strend - scan);
  36013. if (s.match_length > s.lookahead) {
  36014. s.match_length = s.lookahead;
  36015. }
  36016. }
  36017. //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
  36018. }
  36019. /* Emit match if have run of MIN_MATCH or longer, else emit literal */
  36020. if (s.match_length >= MIN_MATCH) {
  36021. //check_match(s, s.strstart, s.strstart - 1, s.match_length);
  36022. /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
  36023. bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
  36024. s.lookahead -= s.match_length;
  36025. s.strstart += s.match_length;
  36026. s.match_length = 0;
  36027. } else {
  36028. /* No match, output a literal byte */
  36029. //Tracevv((stderr,"%c", s->window[s->strstart]));
  36030. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  36031. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  36032. s.lookahead--;
  36033. s.strstart++;
  36034. }
  36035. if (bflush) {
  36036. /*** FLUSH_BLOCK(s, 0); ***/
  36037. flush_block_only(s, false);
  36038. if (s.strm.avail_out === 0) {
  36039. return BS_NEED_MORE;
  36040. }
  36041. /***/
  36042. }
  36043. }
  36044. s.insert = 0;
  36045. if (flush === Z_FINISH) {
  36046. /*** FLUSH_BLOCK(s, 1); ***/
  36047. flush_block_only(s, true);
  36048. if (s.strm.avail_out === 0) {
  36049. return BS_FINISH_STARTED;
  36050. }
  36051. /***/
  36052. return BS_FINISH_DONE;
  36053. }
  36054. if (s.last_lit) {
  36055. /*** FLUSH_BLOCK(s, 0); ***/
  36056. flush_block_only(s, false);
  36057. if (s.strm.avail_out === 0) {
  36058. return BS_NEED_MORE;
  36059. }
  36060. /***/
  36061. }
  36062. return BS_BLOCK_DONE;
  36063. }
  36064. /* ===========================================================================
  36065. * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
  36066. * (It will be regenerated if this run of deflate switches away from Huffman.)
  36067. */
  36068. function deflate_huff(s, flush) {
  36069. var bflush; /* set if current block must be flushed */
  36070. for (;;) {
  36071. /* Make sure that we have a literal to write. */
  36072. if (s.lookahead === 0) {
  36073. fill_window(s);
  36074. if (s.lookahead === 0) {
  36075. if (flush === Z_NO_FLUSH) {
  36076. return BS_NEED_MORE;
  36077. }
  36078. break; /* flush the current block */
  36079. }
  36080. }
  36081. /* Output a literal byte */
  36082. s.match_length = 0;
  36083. //Tracevv((stderr,"%c", s->window[s->strstart]));
  36084. /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
  36085. bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
  36086. s.lookahead--;
  36087. s.strstart++;
  36088. if (bflush) {
  36089. /*** FLUSH_BLOCK(s, 0); ***/
  36090. flush_block_only(s, false);
  36091. if (s.strm.avail_out === 0) {
  36092. return BS_NEED_MORE;
  36093. }
  36094. /***/
  36095. }
  36096. }
  36097. s.insert = 0;
  36098. if (flush === Z_FINISH) {
  36099. /*** FLUSH_BLOCK(s, 1); ***/
  36100. flush_block_only(s, true);
  36101. if (s.strm.avail_out === 0) {
  36102. return BS_FINISH_STARTED;
  36103. }
  36104. /***/
  36105. return BS_FINISH_DONE;
  36106. }
  36107. if (s.last_lit) {
  36108. /*** FLUSH_BLOCK(s, 0); ***/
  36109. flush_block_only(s, false);
  36110. if (s.strm.avail_out === 0) {
  36111. return BS_NEED_MORE;
  36112. }
  36113. /***/
  36114. }
  36115. return BS_BLOCK_DONE;
  36116. }
  36117. /* Values for max_lazy_match, good_match and max_chain_length, depending on
  36118. * the desired pack level (0..9). The values given below have been tuned to
  36119. * exclude worst case performance for pathological files. Better values may be
  36120. * found for specific files.
  36121. */
  36122. function Config(good_length, max_lazy, nice_length, max_chain, func) {
  36123. this.good_length = good_length;
  36124. this.max_lazy = max_lazy;
  36125. this.nice_length = nice_length;
  36126. this.max_chain = max_chain;
  36127. this.func = func;
  36128. }
  36129. var configuration_table;
  36130. configuration_table = [
  36131. /* good lazy nice chain */
  36132. new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */
  36133. new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */
  36134. new Config(4, 5, 16, 8, deflate_fast), /* 2 */
  36135. new Config(4, 6, 32, 32, deflate_fast), /* 3 */
  36136. new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */
  36137. new Config(8, 16, 32, 32, deflate_slow), /* 5 */
  36138. new Config(8, 16, 128, 128, deflate_slow), /* 6 */
  36139. new Config(8, 32, 128, 256, deflate_slow), /* 7 */
  36140. new Config(32, 128, 258, 1024, deflate_slow), /* 8 */
  36141. new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */
  36142. ];
  36143. /* ===========================================================================
  36144. * Initialize the "longest match" routines for a new zlib stream
  36145. */
  36146. function lm_init(s) {
  36147. s.window_size = 2 * s.w_size;
  36148. /*** CLEAR_HASH(s); ***/
  36149. zero(s.head); // Fill with NIL (= 0);
  36150. /* Set the default configuration parameters:
  36151. */
  36152. s.max_lazy_match = configuration_table[s.level].max_lazy;
  36153. s.good_match = configuration_table[s.level].good_length;
  36154. s.nice_match = configuration_table[s.level].nice_length;
  36155. s.max_chain_length = configuration_table[s.level].max_chain;
  36156. s.strstart = 0;
  36157. s.block_start = 0;
  36158. s.lookahead = 0;
  36159. s.insert = 0;
  36160. s.match_length = s.prev_length = MIN_MATCH - 1;
  36161. s.match_available = 0;
  36162. s.ins_h = 0;
  36163. }
  36164. function DeflateState() {
  36165. this.strm = null; /* pointer back to this zlib stream */
  36166. this.status = 0; /* as the name implies */
  36167. this.pending_buf = null; /* output still pending */
  36168. this.pending_buf_size = 0; /* size of pending_buf */
  36169. this.pending_out = 0; /* next pending byte to output to the stream */
  36170. this.pending = 0; /* nb of bytes in the pending buffer */
  36171. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  36172. this.gzhead = null; /* gzip header information to write */
  36173. this.gzindex = 0; /* where in extra, name, or comment */
  36174. this.method = Z_DEFLATED; /* can only be DEFLATED */
  36175. this.last_flush = -1; /* value of flush param for previous deflate call */
  36176. this.w_size = 0; /* LZ77 window size (32K by default) */
  36177. this.w_bits = 0; /* log2(w_size) (8..16) */
  36178. this.w_mask = 0; /* w_size - 1 */
  36179. this.window = null;
  36180. /* Sliding window. Input bytes are read into the second half of the window,
  36181. * and move to the first half later to keep a dictionary of at least wSize
  36182. * bytes. With this organization, matches are limited to a distance of
  36183. * wSize-MAX_MATCH bytes, but this ensures that IO is always
  36184. * performed with a length multiple of the block size.
  36185. */
  36186. this.window_size = 0;
  36187. /* Actual size of window: 2*wSize, except when the user input buffer
  36188. * is directly used as sliding window.
  36189. */
  36190. this.prev = null;
  36191. /* Link to older string with same hash index. To limit the size of this
  36192. * array to 64K, this link is maintained only for the last 32K strings.
  36193. * An index in this array is thus a window index modulo 32K.
  36194. */
  36195. this.head = null; /* Heads of the hash chains or NIL. */
  36196. this.ins_h = 0; /* hash index of string to be inserted */
  36197. this.hash_size = 0; /* number of elements in hash table */
  36198. this.hash_bits = 0; /* log2(hash_size) */
  36199. this.hash_mask = 0; /* hash_size-1 */
  36200. this.hash_shift = 0;
  36201. /* Number of bits by which ins_h must be shifted at each input
  36202. * step. It must be such that after MIN_MATCH steps, the oldest
  36203. * byte no longer takes part in the hash key, that is:
  36204. * hash_shift * MIN_MATCH >= hash_bits
  36205. */
  36206. this.block_start = 0;
  36207. /* Window position at the beginning of the current output block. Gets
  36208. * negative when the window is moved backwards.
  36209. */
  36210. this.match_length = 0; /* length of best match */
  36211. this.prev_match = 0; /* previous match */
  36212. this.match_available = 0; /* set if previous match exists */
  36213. this.strstart = 0; /* start of string to insert */
  36214. this.match_start = 0; /* start of matching string */
  36215. this.lookahead = 0; /* number of valid bytes ahead in window */
  36216. this.prev_length = 0;
  36217. /* Length of the best match at previous step. Matches not greater than this
  36218. * are discarded. This is used in the lazy match evaluation.
  36219. */
  36220. this.max_chain_length = 0;
  36221. /* To speed up deflation, hash chains are never searched beyond this
  36222. * length. A higher limit improves compression ratio but degrades the
  36223. * speed.
  36224. */
  36225. this.max_lazy_match = 0;
  36226. /* Attempt to find a better match only when the current match is strictly
  36227. * smaller than this value. This mechanism is used only for compression
  36228. * levels >= 4.
  36229. */
  36230. // That's alias to max_lazy_match, don't use directly
  36231. //this.max_insert_length = 0;
  36232. /* Insert new strings in the hash table only if the match length is not
  36233. * greater than this length. This saves time but degrades compression.
  36234. * max_insert_length is used only for compression levels <= 3.
  36235. */
  36236. this.level = 0; /* compression level (1..9) */
  36237. this.strategy = 0; /* favor or force Huffman coding*/
  36238. this.good_match = 0;
  36239. /* Use a faster search when the previous match is longer than this */
  36240. this.nice_match = 0; /* Stop searching when current match exceeds this */
  36241. /* used by trees.c: */
  36242. /* Didn't use ct_data typedef below to suppress compiler warning */
  36243. // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
  36244. // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
  36245. // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
  36246. // Use flat array of DOUBLE size, with interleaved fata,
  36247. // because JS does not support effective
  36248. this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);
  36249. this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2);
  36250. this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2);
  36251. zero(this.dyn_ltree);
  36252. zero(this.dyn_dtree);
  36253. zero(this.bl_tree);
  36254. this.l_desc = null; /* desc. for literal tree */
  36255. this.d_desc = null; /* desc. for distance tree */
  36256. this.bl_desc = null; /* desc. for bit length tree */
  36257. //ush bl_count[MAX_BITS+1];
  36258. this.bl_count = new utils.Buf16(MAX_BITS + 1);
  36259. /* number of codes at each bit length for an optimal tree */
  36260. //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
  36261. this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */
  36262. zero(this.heap);
  36263. this.heap_len = 0; /* number of elements in the heap */
  36264. this.heap_max = 0; /* element of largest frequency */
  36265. /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
  36266. * The same heap array is used to build all trees.
  36267. */
  36268. this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
  36269. zero(this.depth);
  36270. /* Depth of each subtree used as tie breaker for trees of equal frequency
  36271. */
  36272. this.l_buf = 0; /* buffer index for literals or lengths */
  36273. this.lit_bufsize = 0;
  36274. /* Size of match buffer for literals/lengths. There are 4 reasons for
  36275. * limiting lit_bufsize to 64K:
  36276. * - frequencies can be kept in 16 bit counters
  36277. * - if compression is not successful for the first block, all input
  36278. * data is still in the window so we can still emit a stored block even
  36279. * when input comes from standard input. (This can also be done for
  36280. * all blocks if lit_bufsize is not greater than 32K.)
  36281. * - if compression is not successful for a file smaller than 64K, we can
  36282. * even emit a stored file instead of a stored block (saving 5 bytes).
  36283. * This is applicable only for zip (not gzip or zlib).
  36284. * - creating new Huffman trees less frequently may not provide fast
  36285. * adaptation to changes in the input data statistics. (Take for
  36286. * example a binary file with poorly compressible code followed by
  36287. * a highly compressible string table.) Smaller buffer sizes give
  36288. * fast adaptation but have of course the overhead of transmitting
  36289. * trees more frequently.
  36290. * - I can't count above 4
  36291. */
  36292. this.last_lit = 0; /* running index in l_buf */
  36293. this.d_buf = 0;
  36294. /* Buffer index for distances. To simplify the code, d_buf and l_buf have
  36295. * the same number of elements. To use different lengths, an extra flag
  36296. * array would be necessary.
  36297. */
  36298. this.opt_len = 0; /* bit length of current block with optimal trees */
  36299. this.static_len = 0; /* bit length of current block with static trees */
  36300. this.matches = 0; /* number of string matches in current block */
  36301. this.insert = 0; /* bytes at end of window left to insert */
  36302. this.bi_buf = 0;
  36303. /* Output buffer. bits are inserted starting at the bottom (least
  36304. * significant bits).
  36305. */
  36306. this.bi_valid = 0;
  36307. /* Number of valid bits in bi_buf. All bits above the last valid bit
  36308. * are always zero.
  36309. */
  36310. // Used for window memory init. We safely ignore it for JS. That makes
  36311. // sense only for pointers and memory check tools.
  36312. //this.high_water = 0;
  36313. /* High water mark offset in window for initialized bytes -- bytes above
  36314. * this are set to zero in order to avoid memory check warnings when
  36315. * longest match routines access bytes past the input. This is then
  36316. * updated to the new high water mark.
  36317. */
  36318. }
  36319. function deflateResetKeep(strm) {
  36320. var s;
  36321. if (!strm || !strm.state) {
  36322. return err(strm, Z_STREAM_ERROR);
  36323. }
  36324. strm.total_in = strm.total_out = 0;
  36325. strm.data_type = Z_UNKNOWN;
  36326. s = strm.state;
  36327. s.pending = 0;
  36328. s.pending_out = 0;
  36329. if (s.wrap < 0) {
  36330. s.wrap = -s.wrap;
  36331. /* was made negative by deflate(..., Z_FINISH); */
  36332. }
  36333. s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
  36334. strm.adler = (s.wrap === 2) ?
  36335. 0 // crc32(0, Z_NULL, 0)
  36336. :
  36337. 1; // adler32(0, Z_NULL, 0)
  36338. s.last_flush = Z_NO_FLUSH;
  36339. trees._tr_init(s);
  36340. return Z_OK;
  36341. }
  36342. function deflateReset(strm) {
  36343. var ret = deflateResetKeep(strm);
  36344. if (ret === Z_OK) {
  36345. lm_init(strm.state);
  36346. }
  36347. return ret;
  36348. }
  36349. function deflateSetHeader(strm, head) {
  36350. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  36351. if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
  36352. strm.state.gzhead = head;
  36353. return Z_OK;
  36354. }
  36355. function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
  36356. if (!strm) { // === Z_NULL
  36357. return Z_STREAM_ERROR;
  36358. }
  36359. var wrap = 1;
  36360. if (level === Z_DEFAULT_COMPRESSION) {
  36361. level = 6;
  36362. }
  36363. if (windowBits < 0) { /* suppress zlib wrapper */
  36364. wrap = 0;
  36365. windowBits = -windowBits;
  36366. }
  36367. else if (windowBits > 15) {
  36368. wrap = 2; /* write gzip wrapper instead */
  36369. windowBits -= 16;
  36370. }
  36371. if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
  36372. windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
  36373. strategy < 0 || strategy > Z_FIXED) {
  36374. return err(strm, Z_STREAM_ERROR);
  36375. }
  36376. if (windowBits === 8) {
  36377. windowBits = 9;
  36378. }
  36379. /* until 256-byte window bug fixed */
  36380. var s = new DeflateState();
  36381. strm.state = s;
  36382. s.strm = strm;
  36383. s.wrap = wrap;
  36384. s.gzhead = null;
  36385. s.w_bits = windowBits;
  36386. s.w_size = 1 << s.w_bits;
  36387. s.w_mask = s.w_size - 1;
  36388. s.hash_bits = memLevel + 7;
  36389. s.hash_size = 1 << s.hash_bits;
  36390. s.hash_mask = s.hash_size - 1;
  36391. s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
  36392. s.window = new utils.Buf8(s.w_size * 2);
  36393. s.head = new utils.Buf16(s.hash_size);
  36394. s.prev = new utils.Buf16(s.w_size);
  36395. // Don't need mem init magic for JS.
  36396. //s.high_water = 0; /* nothing written to s->window yet */
  36397. s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
  36398. s.pending_buf_size = s.lit_bufsize * 4;
  36399. //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
  36400. //s->pending_buf = (uchf *) overlay;
  36401. s.pending_buf = new utils.Buf8(s.pending_buf_size);
  36402. // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
  36403. //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
  36404. s.d_buf = 1 * s.lit_bufsize;
  36405. //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
  36406. s.l_buf = (1 + 2) * s.lit_bufsize;
  36407. s.level = level;
  36408. s.strategy = strategy;
  36409. s.method = method;
  36410. return deflateReset(strm);
  36411. }
  36412. function deflateInit(strm, level) {
  36413. return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
  36414. }
  36415. function deflate(strm, flush) {
  36416. var old_flush, s;
  36417. var beg, val; // for gzip header write only
  36418. if (!strm || !strm.state ||
  36419. flush > Z_BLOCK || flush < 0) {
  36420. return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
  36421. }
  36422. s = strm.state;
  36423. if (!strm.output ||
  36424. (!strm.input && strm.avail_in !== 0) ||
  36425. (s.status === FINISH_STATE && flush !== Z_FINISH)) {
  36426. return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
  36427. }
  36428. s.strm = strm; /* just in case */
  36429. old_flush = s.last_flush;
  36430. s.last_flush = flush;
  36431. /* Write the header */
  36432. if (s.status === INIT_STATE) {
  36433. if (s.wrap === 2) { // GZIP header
  36434. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  36435. put_byte(s, 31);
  36436. put_byte(s, 139);
  36437. put_byte(s, 8);
  36438. if (!s.gzhead) { // s->gzhead == Z_NULL
  36439. put_byte(s, 0);
  36440. put_byte(s, 0);
  36441. put_byte(s, 0);
  36442. put_byte(s, 0);
  36443. put_byte(s, 0);
  36444. put_byte(s, s.level === 9 ? 2 :
  36445. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  36446. 4 : 0));
  36447. put_byte(s, OS_CODE);
  36448. s.status = BUSY_STATE;
  36449. }
  36450. else {
  36451. put_byte(s, (s.gzhead.text ? 1 : 0) +
  36452. (s.gzhead.hcrc ? 2 : 0) +
  36453. (!s.gzhead.extra ? 0 : 4) +
  36454. (!s.gzhead.name ? 0 : 8) +
  36455. (!s.gzhead.comment ? 0 : 16)
  36456. );
  36457. put_byte(s, s.gzhead.time & 0xff);
  36458. put_byte(s, (s.gzhead.time >> 8) & 0xff);
  36459. put_byte(s, (s.gzhead.time >> 16) & 0xff);
  36460. put_byte(s, (s.gzhead.time >> 24) & 0xff);
  36461. put_byte(s, s.level === 9 ? 2 :
  36462. (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
  36463. 4 : 0));
  36464. put_byte(s, s.gzhead.os & 0xff);
  36465. if (s.gzhead.extra && s.gzhead.extra.length) {
  36466. put_byte(s, s.gzhead.extra.length & 0xff);
  36467. put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
  36468. }
  36469. if (s.gzhead.hcrc) {
  36470. strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
  36471. }
  36472. s.gzindex = 0;
  36473. s.status = EXTRA_STATE;
  36474. }
  36475. }
  36476. else // DEFLATE header
  36477. {
  36478. var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
  36479. var level_flags = -1;
  36480. if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
  36481. level_flags = 0;
  36482. } else if (s.level < 6) {
  36483. level_flags = 1;
  36484. } else if (s.level === 6) {
  36485. level_flags = 2;
  36486. } else {
  36487. level_flags = 3;
  36488. }
  36489. header |= (level_flags << 6);
  36490. if (s.strstart !== 0) { header |= PRESET_DICT; }
  36491. header += 31 - (header % 31);
  36492. s.status = BUSY_STATE;
  36493. putShortMSB(s, header);
  36494. /* Save the adler32 of the preset dictionary: */
  36495. if (s.strstart !== 0) {
  36496. putShortMSB(s, strm.adler >>> 16);
  36497. putShortMSB(s, strm.adler & 0xffff);
  36498. }
  36499. strm.adler = 1; // adler32(0L, Z_NULL, 0);
  36500. }
  36501. }
  36502. //#ifdef GZIP
  36503. if (s.status === EXTRA_STATE) {
  36504. if (s.gzhead.extra/* != Z_NULL*/) {
  36505. beg = s.pending; /* start of bytes to update crc */
  36506. while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
  36507. if (s.pending === s.pending_buf_size) {
  36508. if (s.gzhead.hcrc && s.pending > beg) {
  36509. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36510. }
  36511. flush_pending(strm);
  36512. beg = s.pending;
  36513. if (s.pending === s.pending_buf_size) {
  36514. break;
  36515. }
  36516. }
  36517. put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
  36518. s.gzindex++;
  36519. }
  36520. if (s.gzhead.hcrc && s.pending > beg) {
  36521. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36522. }
  36523. if (s.gzindex === s.gzhead.extra.length) {
  36524. s.gzindex = 0;
  36525. s.status = NAME_STATE;
  36526. }
  36527. }
  36528. else {
  36529. s.status = NAME_STATE;
  36530. }
  36531. }
  36532. if (s.status === NAME_STATE) {
  36533. if (s.gzhead.name/* != Z_NULL*/) {
  36534. beg = s.pending; /* start of bytes to update crc */
  36535. //int val;
  36536. do {
  36537. if (s.pending === s.pending_buf_size) {
  36538. if (s.gzhead.hcrc && s.pending > beg) {
  36539. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36540. }
  36541. flush_pending(strm);
  36542. beg = s.pending;
  36543. if (s.pending === s.pending_buf_size) {
  36544. val = 1;
  36545. break;
  36546. }
  36547. }
  36548. // JS specific: little magic to add zero terminator to end of string
  36549. if (s.gzindex < s.gzhead.name.length) {
  36550. val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
  36551. } else {
  36552. val = 0;
  36553. }
  36554. put_byte(s, val);
  36555. } while (val !== 0);
  36556. if (s.gzhead.hcrc && s.pending > beg) {
  36557. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36558. }
  36559. if (val === 0) {
  36560. s.gzindex = 0;
  36561. s.status = COMMENT_STATE;
  36562. }
  36563. }
  36564. else {
  36565. s.status = COMMENT_STATE;
  36566. }
  36567. }
  36568. if (s.status === COMMENT_STATE) {
  36569. if (s.gzhead.comment/* != Z_NULL*/) {
  36570. beg = s.pending; /* start of bytes to update crc */
  36571. //int val;
  36572. do {
  36573. if (s.pending === s.pending_buf_size) {
  36574. if (s.gzhead.hcrc && s.pending > beg) {
  36575. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36576. }
  36577. flush_pending(strm);
  36578. beg = s.pending;
  36579. if (s.pending === s.pending_buf_size) {
  36580. val = 1;
  36581. break;
  36582. }
  36583. }
  36584. // JS specific: little magic to add zero terminator to end of string
  36585. if (s.gzindex < s.gzhead.comment.length) {
  36586. val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
  36587. } else {
  36588. val = 0;
  36589. }
  36590. put_byte(s, val);
  36591. } while (val !== 0);
  36592. if (s.gzhead.hcrc && s.pending > beg) {
  36593. strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
  36594. }
  36595. if (val === 0) {
  36596. s.status = HCRC_STATE;
  36597. }
  36598. }
  36599. else {
  36600. s.status = HCRC_STATE;
  36601. }
  36602. }
  36603. if (s.status === HCRC_STATE) {
  36604. if (s.gzhead.hcrc) {
  36605. if (s.pending + 2 > s.pending_buf_size) {
  36606. flush_pending(strm);
  36607. }
  36608. if (s.pending + 2 <= s.pending_buf_size) {
  36609. put_byte(s, strm.adler & 0xff);
  36610. put_byte(s, (strm.adler >> 8) & 0xff);
  36611. strm.adler = 0; //crc32(0L, Z_NULL, 0);
  36612. s.status = BUSY_STATE;
  36613. }
  36614. }
  36615. else {
  36616. s.status = BUSY_STATE;
  36617. }
  36618. }
  36619. //#endif
  36620. /* Flush as much pending output as possible */
  36621. if (s.pending !== 0) {
  36622. flush_pending(strm);
  36623. if (strm.avail_out === 0) {
  36624. /* Since avail_out is 0, deflate will be called again with
  36625. * more output space, but possibly with both pending and
  36626. * avail_in equal to zero. There won't be anything to do,
  36627. * but this is not an error situation so make sure we
  36628. * return OK instead of BUF_ERROR at next call of deflate:
  36629. */
  36630. s.last_flush = -1;
  36631. return Z_OK;
  36632. }
  36633. /* Make sure there is something to do and avoid duplicate consecutive
  36634. * flushes. For repeated and useless calls with Z_FINISH, we keep
  36635. * returning Z_STREAM_END instead of Z_BUF_ERROR.
  36636. */
  36637. } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
  36638. flush !== Z_FINISH) {
  36639. return err(strm, Z_BUF_ERROR);
  36640. }
  36641. /* User must not provide more input after the first FINISH: */
  36642. if (s.status === FINISH_STATE && strm.avail_in !== 0) {
  36643. return err(strm, Z_BUF_ERROR);
  36644. }
  36645. /* Start a new block or continue the current one.
  36646. */
  36647. if (strm.avail_in !== 0 || s.lookahead !== 0 ||
  36648. (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
  36649. var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
  36650. (s.strategy === Z_RLE ? deflate_rle(s, flush) :
  36651. configuration_table[s.level].func(s, flush));
  36652. if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
  36653. s.status = FINISH_STATE;
  36654. }
  36655. if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
  36656. if (strm.avail_out === 0) {
  36657. s.last_flush = -1;
  36658. /* avoid BUF_ERROR next call, see above */
  36659. }
  36660. return Z_OK;
  36661. /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
  36662. * of deflate should use the same flush parameter to make sure
  36663. * that the flush is complete. So we don't have to output an
  36664. * empty block here, this will be done at next call. This also
  36665. * ensures that for a very small output buffer, we emit at most
  36666. * one empty block.
  36667. */
  36668. }
  36669. if (bstate === BS_BLOCK_DONE) {
  36670. if (flush === Z_PARTIAL_FLUSH) {
  36671. trees._tr_align(s);
  36672. }
  36673. else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
  36674. trees._tr_stored_block(s, 0, 0, false);
  36675. /* For a full flush, this empty block will be recognized
  36676. * as a special marker by inflate_sync().
  36677. */
  36678. if (flush === Z_FULL_FLUSH) {
  36679. /*** CLEAR_HASH(s); ***/ /* forget history */
  36680. zero(s.head); // Fill with NIL (= 0);
  36681. if (s.lookahead === 0) {
  36682. s.strstart = 0;
  36683. s.block_start = 0;
  36684. s.insert = 0;
  36685. }
  36686. }
  36687. }
  36688. flush_pending(strm);
  36689. if (strm.avail_out === 0) {
  36690. s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
  36691. return Z_OK;
  36692. }
  36693. }
  36694. }
  36695. //Assert(strm->avail_out > 0, "bug2");
  36696. //if (strm.avail_out <= 0) { throw new Error("bug2");}
  36697. if (flush !== Z_FINISH) { return Z_OK; }
  36698. if (s.wrap <= 0) { return Z_STREAM_END; }
  36699. /* Write the trailer */
  36700. if (s.wrap === 2) {
  36701. put_byte(s, strm.adler & 0xff);
  36702. put_byte(s, (strm.adler >> 8) & 0xff);
  36703. put_byte(s, (strm.adler >> 16) & 0xff);
  36704. put_byte(s, (strm.adler >> 24) & 0xff);
  36705. put_byte(s, strm.total_in & 0xff);
  36706. put_byte(s, (strm.total_in >> 8) & 0xff);
  36707. put_byte(s, (strm.total_in >> 16) & 0xff);
  36708. put_byte(s, (strm.total_in >> 24) & 0xff);
  36709. }
  36710. else
  36711. {
  36712. putShortMSB(s, strm.adler >>> 16);
  36713. putShortMSB(s, strm.adler & 0xffff);
  36714. }
  36715. flush_pending(strm);
  36716. /* If avail_out is zero, the application will call deflate again
  36717. * to flush the rest.
  36718. */
  36719. if (s.wrap > 0) { s.wrap = -s.wrap; }
  36720. /* write the trailer only once! */
  36721. return s.pending !== 0 ? Z_OK : Z_STREAM_END;
  36722. }
  36723. function deflateEnd(strm) {
  36724. var status;
  36725. if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
  36726. return Z_STREAM_ERROR;
  36727. }
  36728. status = strm.state.status;
  36729. if (status !== INIT_STATE &&
  36730. status !== EXTRA_STATE &&
  36731. status !== NAME_STATE &&
  36732. status !== COMMENT_STATE &&
  36733. status !== HCRC_STATE &&
  36734. status !== BUSY_STATE &&
  36735. status !== FINISH_STATE
  36736. ) {
  36737. return err(strm, Z_STREAM_ERROR);
  36738. }
  36739. strm.state = null;
  36740. return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
  36741. }
  36742. /* =========================================================================
  36743. * Initializes the compression dictionary from the given byte
  36744. * sequence without producing any compressed output.
  36745. */
  36746. function deflateSetDictionary(strm, dictionary) {
  36747. var dictLength = dictionary.length;
  36748. var s;
  36749. var str, n;
  36750. var wrap;
  36751. var avail;
  36752. var next;
  36753. var input;
  36754. var tmpDict;
  36755. if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
  36756. return Z_STREAM_ERROR;
  36757. }
  36758. s = strm.state;
  36759. wrap = s.wrap;
  36760. if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
  36761. return Z_STREAM_ERROR;
  36762. }
  36763. /* when using zlib wrappers, compute Adler-32 for provided dictionary */
  36764. if (wrap === 1) {
  36765. /* adler32(strm->adler, dictionary, dictLength); */
  36766. strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
  36767. }
  36768. s.wrap = 0; /* avoid computing Adler-32 in read_buf */
  36769. /* if dictionary would fill window, just replace the history */
  36770. if (dictLength >= s.w_size) {
  36771. if (wrap === 0) { /* already empty otherwise */
  36772. /*** CLEAR_HASH(s); ***/
  36773. zero(s.head); // Fill with NIL (= 0);
  36774. s.strstart = 0;
  36775. s.block_start = 0;
  36776. s.insert = 0;
  36777. }
  36778. /* use the tail */
  36779. // dictionary = dictionary.slice(dictLength - s.w_size);
  36780. tmpDict = new utils.Buf8(s.w_size);
  36781. utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
  36782. dictionary = tmpDict;
  36783. dictLength = s.w_size;
  36784. }
  36785. /* insert dictionary into window and hash */
  36786. avail = strm.avail_in;
  36787. next = strm.next_in;
  36788. input = strm.input;
  36789. strm.avail_in = dictLength;
  36790. strm.next_in = 0;
  36791. strm.input = dictionary;
  36792. fill_window(s);
  36793. while (s.lookahead >= MIN_MATCH) {
  36794. str = s.strstart;
  36795. n = s.lookahead - (MIN_MATCH - 1);
  36796. do {
  36797. /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
  36798. s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
  36799. s.prev[str & s.w_mask] = s.head[s.ins_h];
  36800. s.head[s.ins_h] = str;
  36801. str++;
  36802. } while (--n);
  36803. s.strstart = str;
  36804. s.lookahead = MIN_MATCH - 1;
  36805. fill_window(s);
  36806. }
  36807. s.strstart += s.lookahead;
  36808. s.block_start = s.strstart;
  36809. s.insert = s.lookahead;
  36810. s.lookahead = 0;
  36811. s.match_length = s.prev_length = MIN_MATCH - 1;
  36812. s.match_available = 0;
  36813. strm.next_in = next;
  36814. strm.input = input;
  36815. strm.avail_in = avail;
  36816. s.wrap = wrap;
  36817. return Z_OK;
  36818. }
  36819. exports.deflateInit = deflateInit;
  36820. exports.deflateInit2 = deflateInit2;
  36821. exports.deflateReset = deflateReset;
  36822. exports.deflateResetKeep = deflateResetKeep;
  36823. exports.deflateSetHeader = deflateSetHeader;
  36824. exports.deflate = deflate;
  36825. exports.deflateEnd = deflateEnd;
  36826. exports.deflateSetDictionary = deflateSetDictionary;
  36827. exports.deflateInfo = 'pako deflate (from Nodeca project)';
  36828. /* Not implemented
  36829. exports.deflateBound = deflateBound;
  36830. exports.deflateCopy = deflateCopy;
  36831. exports.deflateParams = deflateParams;
  36832. exports.deflatePending = deflatePending;
  36833. exports.deflatePrime = deflatePrime;
  36834. exports.deflateTune = deflateTune;
  36835. */
  36836. /***/ }),
  36837. /* 64 */
  36838. /***/ (function(module, exports) {
  36839. 'use strict';
  36840. var TYPED_OK = (typeof Uint8Array !== 'undefined') &&
  36841. (typeof Uint16Array !== 'undefined') &&
  36842. (typeof Int32Array !== 'undefined');
  36843. exports.assign = function (obj /*from1, from2, from3, ...*/) {
  36844. var sources = Array.prototype.slice.call(arguments, 1);
  36845. while (sources.length) {
  36846. var source = sources.shift();
  36847. if (!source) { continue; }
  36848. if (typeof source !== 'object') {
  36849. throw new TypeError(source + 'must be non-object');
  36850. }
  36851. for (var p in source) {
  36852. if (source.hasOwnProperty(p)) {
  36853. obj[p] = source[p];
  36854. }
  36855. }
  36856. }
  36857. return obj;
  36858. };
  36859. // reduce buffer size, avoiding mem copy
  36860. exports.shrinkBuf = function (buf, size) {
  36861. if (buf.length === size) { return buf; }
  36862. if (buf.subarray) { return buf.subarray(0, size); }
  36863. buf.length = size;
  36864. return buf;
  36865. };
  36866. var fnTyped = {
  36867. arraySet: function (dest, src, src_offs, len, dest_offs) {
  36868. if (src.subarray && dest.subarray) {
  36869. dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
  36870. return;
  36871. }
  36872. // Fallback to ordinary array
  36873. for (var i = 0; i < len; i++) {
  36874. dest[dest_offs + i] = src[src_offs + i];
  36875. }
  36876. },
  36877. // Join array of chunks to single array.
  36878. flattenChunks: function (chunks) {
  36879. var i, l, len, pos, chunk, result;
  36880. // calculate data length
  36881. len = 0;
  36882. for (i = 0, l = chunks.length; i < l; i++) {
  36883. len += chunks[i].length;
  36884. }
  36885. // join chunks
  36886. result = new Uint8Array(len);
  36887. pos = 0;
  36888. for (i = 0, l = chunks.length; i < l; i++) {
  36889. chunk = chunks[i];
  36890. result.set(chunk, pos);
  36891. pos += chunk.length;
  36892. }
  36893. return result;
  36894. }
  36895. };
  36896. var fnUntyped = {
  36897. arraySet: function (dest, src, src_offs, len, dest_offs) {
  36898. for (var i = 0; i < len; i++) {
  36899. dest[dest_offs + i] = src[src_offs + i];
  36900. }
  36901. },
  36902. // Join array of chunks to single array.
  36903. flattenChunks: function (chunks) {
  36904. return [].concat.apply([], chunks);
  36905. }
  36906. };
  36907. // Enable/Disable typed arrays use, for testing
  36908. //
  36909. exports.setTyped = function (on) {
  36910. if (on) {
  36911. exports.Buf8 = Uint8Array;
  36912. exports.Buf16 = Uint16Array;
  36913. exports.Buf32 = Int32Array;
  36914. exports.assign(exports, fnTyped);
  36915. } else {
  36916. exports.Buf8 = Array;
  36917. exports.Buf16 = Array;
  36918. exports.Buf32 = Array;
  36919. exports.assign(exports, fnUntyped);
  36920. }
  36921. };
  36922. exports.setTyped(TYPED_OK);
  36923. /***/ }),
  36924. /* 65 */
  36925. /***/ (function(module, exports, __webpack_require__) {
  36926. 'use strict';
  36927. var utils = __webpack_require__(64);
  36928. /* Public constants ==========================================================*/
  36929. /* ===========================================================================*/
  36930. //var Z_FILTERED = 1;
  36931. //var Z_HUFFMAN_ONLY = 2;
  36932. //var Z_RLE = 3;
  36933. var Z_FIXED = 4;
  36934. //var Z_DEFAULT_STRATEGY = 0;
  36935. /* Possible values of the data_type field (though see inflate()) */
  36936. var Z_BINARY = 0;
  36937. var Z_TEXT = 1;
  36938. //var Z_ASCII = 1; // = Z_TEXT
  36939. var Z_UNKNOWN = 2;
  36940. /*============================================================================*/
  36941. function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
  36942. // From zutil.h
  36943. var STORED_BLOCK = 0;
  36944. var STATIC_TREES = 1;
  36945. var DYN_TREES = 2;
  36946. /* The three kinds of block type */
  36947. var MIN_MATCH = 3;
  36948. var MAX_MATCH = 258;
  36949. /* The minimum and maximum match lengths */
  36950. // From deflate.h
  36951. /* ===========================================================================
  36952. * Internal compression state.
  36953. */
  36954. var LENGTH_CODES = 29;
  36955. /* number of length codes, not counting the special END_BLOCK code */
  36956. var LITERALS = 256;
  36957. /* number of literal bytes 0..255 */
  36958. var L_CODES = LITERALS + 1 + LENGTH_CODES;
  36959. /* number of Literal or Length codes, including the END_BLOCK code */
  36960. var D_CODES = 30;
  36961. /* number of distance codes */
  36962. var BL_CODES = 19;
  36963. /* number of codes used to transfer the bit lengths */
  36964. var HEAP_SIZE = 2 * L_CODES + 1;
  36965. /* maximum heap size */
  36966. var MAX_BITS = 15;
  36967. /* All codes must not exceed MAX_BITS bits */
  36968. var Buf_size = 16;
  36969. /* size of bit buffer in bi_buf */
  36970. /* ===========================================================================
  36971. * Constants
  36972. */
  36973. var MAX_BL_BITS = 7;
  36974. /* Bit length codes must not exceed MAX_BL_BITS bits */
  36975. var END_BLOCK = 256;
  36976. /* end of block literal code */
  36977. var REP_3_6 = 16;
  36978. /* repeat previous bit length 3-6 times (2 bits of repeat count) */
  36979. var REPZ_3_10 = 17;
  36980. /* repeat a zero length 3-10 times (3 bits of repeat count) */
  36981. var REPZ_11_138 = 18;
  36982. /* repeat a zero length 11-138 times (7 bits of repeat count) */
  36983. /* eslint-disable comma-spacing,array-bracket-spacing */
  36984. var extra_lbits = /* extra bits for each length code */
  36985. [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
  36986. var extra_dbits = /* extra bits for each distance code */
  36987. [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
  36988. var extra_blbits = /* extra bits for each bit length code */
  36989. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
  36990. var bl_order =
  36991. [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
  36992. /* eslint-enable comma-spacing,array-bracket-spacing */
  36993. /* The lengths of the bit length codes are sent in order of decreasing
  36994. * probability, to avoid transmitting the lengths for unused bit length codes.
  36995. */
  36996. /* ===========================================================================
  36997. * Local data. These are initialized only once.
  36998. */
  36999. // We pre-fill arrays with 0 to avoid uninitialized gaps
  37000. var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
  37001. // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
  37002. var static_ltree = new Array((L_CODES + 2) * 2);
  37003. zero(static_ltree);
  37004. /* The static literal tree. Since the bit lengths are imposed, there is no
  37005. * need for the L_CODES extra codes used during heap construction. However
  37006. * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
  37007. * below).
  37008. */
  37009. var static_dtree = new Array(D_CODES * 2);
  37010. zero(static_dtree);
  37011. /* The static distance tree. (Actually a trivial tree since all codes use
  37012. * 5 bits.)
  37013. */
  37014. var _dist_code = new Array(DIST_CODE_LEN);
  37015. zero(_dist_code);
  37016. /* Distance codes. The first 256 values correspond to the distances
  37017. * 3 .. 258, the last 256 values correspond to the top 8 bits of
  37018. * the 15 bit distances.
  37019. */
  37020. var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);
  37021. zero(_length_code);
  37022. /* length code for each normalized match length (0 == MIN_MATCH) */
  37023. var base_length = new Array(LENGTH_CODES);
  37024. zero(base_length);
  37025. /* First normalized length for each code (0 = MIN_MATCH) */
  37026. var base_dist = new Array(D_CODES);
  37027. zero(base_dist);
  37028. /* First normalized distance for each code (0 = distance of 1) */
  37029. function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
  37030. this.static_tree = static_tree; /* static tree or NULL */
  37031. this.extra_bits = extra_bits; /* extra bits for each code or NULL */
  37032. this.extra_base = extra_base; /* base index for extra_bits */
  37033. this.elems = elems; /* max number of elements in the tree */
  37034. this.max_length = max_length; /* max bit length for the codes */
  37035. // show if `static_tree` has data or dummy - needed for monomorphic objects
  37036. this.has_stree = static_tree && static_tree.length;
  37037. }
  37038. var static_l_desc;
  37039. var static_d_desc;
  37040. var static_bl_desc;
  37041. function TreeDesc(dyn_tree, stat_desc) {
  37042. this.dyn_tree = dyn_tree; /* the dynamic tree */
  37043. this.max_code = 0; /* largest code with non zero frequency */
  37044. this.stat_desc = stat_desc; /* the corresponding static tree */
  37045. }
  37046. function d_code(dist) {
  37047. return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
  37048. }
  37049. /* ===========================================================================
  37050. * Output a short LSB first on the stream.
  37051. * IN assertion: there is enough room in pendingBuf.
  37052. */
  37053. function put_short(s, w) {
  37054. // put_byte(s, (uch)((w) & 0xff));
  37055. // put_byte(s, (uch)((ush)(w) >> 8));
  37056. s.pending_buf[s.pending++] = (w) & 0xff;
  37057. s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
  37058. }
  37059. /* ===========================================================================
  37060. * Send a value on a given number of bits.
  37061. * IN assertion: length <= 16 and value fits in length bits.
  37062. */
  37063. function send_bits(s, value, length) {
  37064. if (s.bi_valid > (Buf_size - length)) {
  37065. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  37066. put_short(s, s.bi_buf);
  37067. s.bi_buf = value >> (Buf_size - s.bi_valid);
  37068. s.bi_valid += length - Buf_size;
  37069. } else {
  37070. s.bi_buf |= (value << s.bi_valid) & 0xffff;
  37071. s.bi_valid += length;
  37072. }
  37073. }
  37074. function send_code(s, c, tree) {
  37075. send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
  37076. }
  37077. /* ===========================================================================
  37078. * Reverse the first len bits of a code, using straightforward code (a faster
  37079. * method would use a table)
  37080. * IN assertion: 1 <= len <= 15
  37081. */
  37082. function bi_reverse(code, len) {
  37083. var res = 0;
  37084. do {
  37085. res |= code & 1;
  37086. code >>>= 1;
  37087. res <<= 1;
  37088. } while (--len > 0);
  37089. return res >>> 1;
  37090. }
  37091. /* ===========================================================================
  37092. * Flush the bit buffer, keeping at most 7 bits in it.
  37093. */
  37094. function bi_flush(s) {
  37095. if (s.bi_valid === 16) {
  37096. put_short(s, s.bi_buf);
  37097. s.bi_buf = 0;
  37098. s.bi_valid = 0;
  37099. } else if (s.bi_valid >= 8) {
  37100. s.pending_buf[s.pending++] = s.bi_buf & 0xff;
  37101. s.bi_buf >>= 8;
  37102. s.bi_valid -= 8;
  37103. }
  37104. }
  37105. /* ===========================================================================
  37106. * Compute the optimal bit lengths for a tree and update the total bit length
  37107. * for the current block.
  37108. * IN assertion: the fields freq and dad are set, heap[heap_max] and
  37109. * above are the tree nodes sorted by increasing frequency.
  37110. * OUT assertions: the field len is set to the optimal bit length, the
  37111. * array bl_count contains the frequencies for each bit length.
  37112. * The length opt_len is updated; static_len is also updated if stree is
  37113. * not null.
  37114. */
  37115. function gen_bitlen(s, desc)
  37116. // deflate_state *s;
  37117. // tree_desc *desc; /* the tree descriptor */
  37118. {
  37119. var tree = desc.dyn_tree;
  37120. var max_code = desc.max_code;
  37121. var stree = desc.stat_desc.static_tree;
  37122. var has_stree = desc.stat_desc.has_stree;
  37123. var extra = desc.stat_desc.extra_bits;
  37124. var base = desc.stat_desc.extra_base;
  37125. var max_length = desc.stat_desc.max_length;
  37126. var h; /* heap index */
  37127. var n, m; /* iterate over the tree elements */
  37128. var bits; /* bit length */
  37129. var xbits; /* extra bits */
  37130. var f; /* frequency */
  37131. var overflow = 0; /* number of elements with bit length too large */
  37132. for (bits = 0; bits <= MAX_BITS; bits++) {
  37133. s.bl_count[bits] = 0;
  37134. }
  37135. /* In a first pass, compute the optimal bit lengths (which may
  37136. * overflow in the case of the bit length tree).
  37137. */
  37138. tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
  37139. for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
  37140. n = s.heap[h];
  37141. bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
  37142. if (bits > max_length) {
  37143. bits = max_length;
  37144. overflow++;
  37145. }
  37146. tree[n * 2 + 1]/*.Len*/ = bits;
  37147. /* We overwrite tree[n].Dad which is no longer needed */
  37148. if (n > max_code) { continue; } /* not a leaf node */
  37149. s.bl_count[bits]++;
  37150. xbits = 0;
  37151. if (n >= base) {
  37152. xbits = extra[n - base];
  37153. }
  37154. f = tree[n * 2]/*.Freq*/;
  37155. s.opt_len += f * (bits + xbits);
  37156. if (has_stree) {
  37157. s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
  37158. }
  37159. }
  37160. if (overflow === 0) { return; }
  37161. // Trace((stderr,"\nbit length overflow\n"));
  37162. /* This happens for example on obj2 and pic of the Calgary corpus */
  37163. /* Find the first bit length which could increase: */
  37164. do {
  37165. bits = max_length - 1;
  37166. while (s.bl_count[bits] === 0) { bits--; }
  37167. s.bl_count[bits]--; /* move one leaf down the tree */
  37168. s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
  37169. s.bl_count[max_length]--;
  37170. /* The brother of the overflow item also moves one step up,
  37171. * but this does not affect bl_count[max_length]
  37172. */
  37173. overflow -= 2;
  37174. } while (overflow > 0);
  37175. /* Now recompute all bit lengths, scanning in increasing frequency.
  37176. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
  37177. * lengths instead of fixing only the wrong ones. This idea is taken
  37178. * from 'ar' written by Haruhiko Okumura.)
  37179. */
  37180. for (bits = max_length; bits !== 0; bits--) {
  37181. n = s.bl_count[bits];
  37182. while (n !== 0) {
  37183. m = s.heap[--h];
  37184. if (m > max_code) { continue; }
  37185. if (tree[m * 2 + 1]/*.Len*/ !== bits) {
  37186. // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
  37187. s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
  37188. tree[m * 2 + 1]/*.Len*/ = bits;
  37189. }
  37190. n--;
  37191. }
  37192. }
  37193. }
  37194. /* ===========================================================================
  37195. * Generate the codes for a given tree and bit counts (which need not be
  37196. * optimal).
  37197. * IN assertion: the array bl_count contains the bit length statistics for
  37198. * the given tree and the field len is set for all tree elements.
  37199. * OUT assertion: the field code is set for all tree elements of non
  37200. * zero code length.
  37201. */
  37202. function gen_codes(tree, max_code, bl_count)
  37203. // ct_data *tree; /* the tree to decorate */
  37204. // int max_code; /* largest code with non zero frequency */
  37205. // ushf *bl_count; /* number of codes at each bit length */
  37206. {
  37207. var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
  37208. var code = 0; /* running code value */
  37209. var bits; /* bit index */
  37210. var n; /* code index */
  37211. /* The distribution counts are first used to generate the code values
  37212. * without bit reversal.
  37213. */
  37214. for (bits = 1; bits <= MAX_BITS; bits++) {
  37215. next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
  37216. }
  37217. /* Check that the bit counts in bl_count are consistent. The last code
  37218. * must be all ones.
  37219. */
  37220. //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
  37221. // "inconsistent bit counts");
  37222. //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
  37223. for (n = 0; n <= max_code; n++) {
  37224. var len = tree[n * 2 + 1]/*.Len*/;
  37225. if (len === 0) { continue; }
  37226. /* Now reverse the bits */
  37227. tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
  37228. //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
  37229. // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
  37230. }
  37231. }
  37232. /* ===========================================================================
  37233. * Initialize the various 'constant' tables.
  37234. */
  37235. function tr_static_init() {
  37236. var n; /* iterates over tree elements */
  37237. var bits; /* bit counter */
  37238. var length; /* length value */
  37239. var code; /* code value */
  37240. var dist; /* distance index */
  37241. var bl_count = new Array(MAX_BITS + 1);
  37242. /* number of codes at each bit length for an optimal tree */
  37243. // do check in _tr_init()
  37244. //if (static_init_done) return;
  37245. /* For some embedded targets, global variables are not initialized: */
  37246. /*#ifdef NO_INIT_GLOBAL_POINTERS
  37247. static_l_desc.static_tree = static_ltree;
  37248. static_l_desc.extra_bits = extra_lbits;
  37249. static_d_desc.static_tree = static_dtree;
  37250. static_d_desc.extra_bits = extra_dbits;
  37251. static_bl_desc.extra_bits = extra_blbits;
  37252. #endif*/
  37253. /* Initialize the mapping length (0..255) -> length code (0..28) */
  37254. length = 0;
  37255. for (code = 0; code < LENGTH_CODES - 1; code++) {
  37256. base_length[code] = length;
  37257. for (n = 0; n < (1 << extra_lbits[code]); n++) {
  37258. _length_code[length++] = code;
  37259. }
  37260. }
  37261. //Assert (length == 256, "tr_static_init: length != 256");
  37262. /* Note that the length 255 (match length 258) can be represented
  37263. * in two different ways: code 284 + 5 bits or code 285, so we
  37264. * overwrite length_code[255] to use the best encoding:
  37265. */
  37266. _length_code[length - 1] = code;
  37267. /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
  37268. dist = 0;
  37269. for (code = 0; code < 16; code++) {
  37270. base_dist[code] = dist;
  37271. for (n = 0; n < (1 << extra_dbits[code]); n++) {
  37272. _dist_code[dist++] = code;
  37273. }
  37274. }
  37275. //Assert (dist == 256, "tr_static_init: dist != 256");
  37276. dist >>= 7; /* from now on, all distances are divided by 128 */
  37277. for (; code < D_CODES; code++) {
  37278. base_dist[code] = dist << 7;
  37279. for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
  37280. _dist_code[256 + dist++] = code;
  37281. }
  37282. }
  37283. //Assert (dist == 256, "tr_static_init: 256+dist != 512");
  37284. /* Construct the codes of the static literal tree */
  37285. for (bits = 0; bits <= MAX_BITS; bits++) {
  37286. bl_count[bits] = 0;
  37287. }
  37288. n = 0;
  37289. while (n <= 143) {
  37290. static_ltree[n * 2 + 1]/*.Len*/ = 8;
  37291. n++;
  37292. bl_count[8]++;
  37293. }
  37294. while (n <= 255) {
  37295. static_ltree[n * 2 + 1]/*.Len*/ = 9;
  37296. n++;
  37297. bl_count[9]++;
  37298. }
  37299. while (n <= 279) {
  37300. static_ltree[n * 2 + 1]/*.Len*/ = 7;
  37301. n++;
  37302. bl_count[7]++;
  37303. }
  37304. while (n <= 287) {
  37305. static_ltree[n * 2 + 1]/*.Len*/ = 8;
  37306. n++;
  37307. bl_count[8]++;
  37308. }
  37309. /* Codes 286 and 287 do not exist, but we must include them in the
  37310. * tree construction to get a canonical Huffman tree (longest code
  37311. * all ones)
  37312. */
  37313. gen_codes(static_ltree, L_CODES + 1, bl_count);
  37314. /* The static distance tree is trivial: */
  37315. for (n = 0; n < D_CODES; n++) {
  37316. static_dtree[n * 2 + 1]/*.Len*/ = 5;
  37317. static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
  37318. }
  37319. // Now data ready and we can init static trees
  37320. static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
  37321. static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
  37322. static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
  37323. //static_init_done = true;
  37324. }
  37325. /* ===========================================================================
  37326. * Initialize a new block.
  37327. */
  37328. function init_block(s) {
  37329. var n; /* iterates over tree elements */
  37330. /* Initialize the trees. */
  37331. for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
  37332. for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
  37333. for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
  37334. s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
  37335. s.opt_len = s.static_len = 0;
  37336. s.last_lit = s.matches = 0;
  37337. }
  37338. /* ===========================================================================
  37339. * Flush the bit buffer and align the output on a byte boundary
  37340. */
  37341. function bi_windup(s)
  37342. {
  37343. if (s.bi_valid > 8) {
  37344. put_short(s, s.bi_buf);
  37345. } else if (s.bi_valid > 0) {
  37346. //put_byte(s, (Byte)s->bi_buf);
  37347. s.pending_buf[s.pending++] = s.bi_buf;
  37348. }
  37349. s.bi_buf = 0;
  37350. s.bi_valid = 0;
  37351. }
  37352. /* ===========================================================================
  37353. * Copy a stored block, storing first the length and its
  37354. * one's complement if requested.
  37355. */
  37356. function copy_block(s, buf, len, header)
  37357. //DeflateState *s;
  37358. //charf *buf; /* the input data */
  37359. //unsigned len; /* its length */
  37360. //int header; /* true if block header must be written */
  37361. {
  37362. bi_windup(s); /* align on byte boundary */
  37363. if (header) {
  37364. put_short(s, len);
  37365. put_short(s, ~len);
  37366. }
  37367. // while (len--) {
  37368. // put_byte(s, *buf++);
  37369. // }
  37370. utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
  37371. s.pending += len;
  37372. }
  37373. /* ===========================================================================
  37374. * Compares to subtrees, using the tree depth as tie breaker when
  37375. * the subtrees have equal frequency. This minimizes the worst case length.
  37376. */
  37377. function smaller(tree, n, m, depth) {
  37378. var _n2 = n * 2;
  37379. var _m2 = m * 2;
  37380. return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
  37381. (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
  37382. }
  37383. /* ===========================================================================
  37384. * Restore the heap property by moving down the tree starting at node k,
  37385. * exchanging a node with the smallest of its two sons if necessary, stopping
  37386. * when the heap property is re-established (each father smaller than its
  37387. * two sons).
  37388. */
  37389. function pqdownheap(s, tree, k)
  37390. // deflate_state *s;
  37391. // ct_data *tree; /* the tree to restore */
  37392. // int k; /* node to move down */
  37393. {
  37394. var v = s.heap[k];
  37395. var j = k << 1; /* left son of k */
  37396. while (j <= s.heap_len) {
  37397. /* Set j to the smallest of the two sons: */
  37398. if (j < s.heap_len &&
  37399. smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
  37400. j++;
  37401. }
  37402. /* Exit if v is smaller than both sons */
  37403. if (smaller(tree, v, s.heap[j], s.depth)) { break; }
  37404. /* Exchange v with the smallest son */
  37405. s.heap[k] = s.heap[j];
  37406. k = j;
  37407. /* And continue down the tree, setting j to the left son of k */
  37408. j <<= 1;
  37409. }
  37410. s.heap[k] = v;
  37411. }
  37412. // inlined manually
  37413. // var SMALLEST = 1;
  37414. /* ===========================================================================
  37415. * Send the block data compressed using the given Huffman trees
  37416. */
  37417. function compress_block(s, ltree, dtree)
  37418. // deflate_state *s;
  37419. // const ct_data *ltree; /* literal tree */
  37420. // const ct_data *dtree; /* distance tree */
  37421. {
  37422. var dist; /* distance of matched string */
  37423. var lc; /* match length or unmatched char (if dist == 0) */
  37424. var lx = 0; /* running index in l_buf */
  37425. var code; /* the code to send */
  37426. var extra; /* number of extra bits to send */
  37427. if (s.last_lit !== 0) {
  37428. do {
  37429. dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
  37430. lc = s.pending_buf[s.l_buf + lx];
  37431. lx++;
  37432. if (dist === 0) {
  37433. send_code(s, lc, ltree); /* send a literal byte */
  37434. //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
  37435. } else {
  37436. /* Here, lc is the match length - MIN_MATCH */
  37437. code = _length_code[lc];
  37438. send_code(s, code + LITERALS + 1, ltree); /* send the length code */
  37439. extra = extra_lbits[code];
  37440. if (extra !== 0) {
  37441. lc -= base_length[code];
  37442. send_bits(s, lc, extra); /* send the extra length bits */
  37443. }
  37444. dist--; /* dist is now the match distance - 1 */
  37445. code = d_code(dist);
  37446. //Assert (code < D_CODES, "bad d_code");
  37447. send_code(s, code, dtree); /* send the distance code */
  37448. extra = extra_dbits[code];
  37449. if (extra !== 0) {
  37450. dist -= base_dist[code];
  37451. send_bits(s, dist, extra); /* send the extra distance bits */
  37452. }
  37453. } /* literal or match pair ? */
  37454. /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
  37455. //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
  37456. // "pendingBuf overflow");
  37457. } while (lx < s.last_lit);
  37458. }
  37459. send_code(s, END_BLOCK, ltree);
  37460. }
  37461. /* ===========================================================================
  37462. * Construct one Huffman tree and assigns the code bit strings and lengths.
  37463. * Update the total bit length for the current block.
  37464. * IN assertion: the field freq is set for all tree elements.
  37465. * OUT assertions: the fields len and code are set to the optimal bit length
  37466. * and corresponding code. The length opt_len is updated; static_len is
  37467. * also updated if stree is not null. The field max_code is set.
  37468. */
  37469. function build_tree(s, desc)
  37470. // deflate_state *s;
  37471. // tree_desc *desc; /* the tree descriptor */
  37472. {
  37473. var tree = desc.dyn_tree;
  37474. var stree = desc.stat_desc.static_tree;
  37475. var has_stree = desc.stat_desc.has_stree;
  37476. var elems = desc.stat_desc.elems;
  37477. var n, m; /* iterate over heap elements */
  37478. var max_code = -1; /* largest code with non zero frequency */
  37479. var node; /* new node being created */
  37480. /* Construct the initial heap, with least frequent element in
  37481. * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
  37482. * heap[0] is not used.
  37483. */
  37484. s.heap_len = 0;
  37485. s.heap_max = HEAP_SIZE;
  37486. for (n = 0; n < elems; n++) {
  37487. if (tree[n * 2]/*.Freq*/ !== 0) {
  37488. s.heap[++s.heap_len] = max_code = n;
  37489. s.depth[n] = 0;
  37490. } else {
  37491. tree[n * 2 + 1]/*.Len*/ = 0;
  37492. }
  37493. }
  37494. /* The pkzip format requires that at least one distance code exists,
  37495. * and that at least one bit should be sent even if there is only one
  37496. * possible code. So to avoid special checks later on we force at least
  37497. * two codes of non zero frequency.
  37498. */
  37499. while (s.heap_len < 2) {
  37500. node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
  37501. tree[node * 2]/*.Freq*/ = 1;
  37502. s.depth[node] = 0;
  37503. s.opt_len--;
  37504. if (has_stree) {
  37505. s.static_len -= stree[node * 2 + 1]/*.Len*/;
  37506. }
  37507. /* node is 0 or 1 so it does not have extra bits */
  37508. }
  37509. desc.max_code = max_code;
  37510. /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
  37511. * establish sub-heaps of increasing lengths:
  37512. */
  37513. for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
  37514. /* Construct the Huffman tree by repeatedly combining the least two
  37515. * frequent nodes.
  37516. */
  37517. node = elems; /* next internal node of the tree */
  37518. do {
  37519. //pqremove(s, tree, n); /* n = node of least frequency */
  37520. /*** pqremove ***/
  37521. n = s.heap[1/*SMALLEST*/];
  37522. s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
  37523. pqdownheap(s, tree, 1/*SMALLEST*/);
  37524. /***/
  37525. m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
  37526. s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
  37527. s.heap[--s.heap_max] = m;
  37528. /* Create a new node father of n and m */
  37529. tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
  37530. s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
  37531. tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
  37532. /* and insert the new node in the heap */
  37533. s.heap[1/*SMALLEST*/] = node++;
  37534. pqdownheap(s, tree, 1/*SMALLEST*/);
  37535. } while (s.heap_len >= 2);
  37536. s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
  37537. /* At this point, the fields freq and dad are set. We can now
  37538. * generate the bit lengths.
  37539. */
  37540. gen_bitlen(s, desc);
  37541. /* The field len is now set, we can generate the bit codes */
  37542. gen_codes(tree, max_code, s.bl_count);
  37543. }
  37544. /* ===========================================================================
  37545. * Scan a literal or distance tree to determine the frequencies of the codes
  37546. * in the bit length tree.
  37547. */
  37548. function scan_tree(s, tree, max_code)
  37549. // deflate_state *s;
  37550. // ct_data *tree; /* the tree to be scanned */
  37551. // int max_code; /* and its largest code of non zero frequency */
  37552. {
  37553. var n; /* iterates over all tree elements */
  37554. var prevlen = -1; /* last emitted length */
  37555. var curlen; /* length of current code */
  37556. var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
  37557. var count = 0; /* repeat count of the current code */
  37558. var max_count = 7; /* max repeat count */
  37559. var min_count = 4; /* min repeat count */
  37560. if (nextlen === 0) {
  37561. max_count = 138;
  37562. min_count = 3;
  37563. }
  37564. tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
  37565. for (n = 0; n <= max_code; n++) {
  37566. curlen = nextlen;
  37567. nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
  37568. if (++count < max_count && curlen === nextlen) {
  37569. continue;
  37570. } else if (count < min_count) {
  37571. s.bl_tree[curlen * 2]/*.Freq*/ += count;
  37572. } else if (curlen !== 0) {
  37573. if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
  37574. s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
  37575. } else if (count <= 10) {
  37576. s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
  37577. } else {
  37578. s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
  37579. }
  37580. count = 0;
  37581. prevlen = curlen;
  37582. if (nextlen === 0) {
  37583. max_count = 138;
  37584. min_count = 3;
  37585. } else if (curlen === nextlen) {
  37586. max_count = 6;
  37587. min_count = 3;
  37588. } else {
  37589. max_count = 7;
  37590. min_count = 4;
  37591. }
  37592. }
  37593. }
  37594. /* ===========================================================================
  37595. * Send a literal or distance tree in compressed form, using the codes in
  37596. * bl_tree.
  37597. */
  37598. function send_tree(s, tree, max_code)
  37599. // deflate_state *s;
  37600. // ct_data *tree; /* the tree to be scanned */
  37601. // int max_code; /* and its largest code of non zero frequency */
  37602. {
  37603. var n; /* iterates over all tree elements */
  37604. var prevlen = -1; /* last emitted length */
  37605. var curlen; /* length of current code */
  37606. var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
  37607. var count = 0; /* repeat count of the current code */
  37608. var max_count = 7; /* max repeat count */
  37609. var min_count = 4; /* min repeat count */
  37610. /* tree[max_code+1].Len = -1; */ /* guard already set */
  37611. if (nextlen === 0) {
  37612. max_count = 138;
  37613. min_count = 3;
  37614. }
  37615. for (n = 0; n <= max_code; n++) {
  37616. curlen = nextlen;
  37617. nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
  37618. if (++count < max_count && curlen === nextlen) {
  37619. continue;
  37620. } else if (count < min_count) {
  37621. do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
  37622. } else if (curlen !== 0) {
  37623. if (curlen !== prevlen) {
  37624. send_code(s, curlen, s.bl_tree);
  37625. count--;
  37626. }
  37627. //Assert(count >= 3 && count <= 6, " 3_6?");
  37628. send_code(s, REP_3_6, s.bl_tree);
  37629. send_bits(s, count - 3, 2);
  37630. } else if (count <= 10) {
  37631. send_code(s, REPZ_3_10, s.bl_tree);
  37632. send_bits(s, count - 3, 3);
  37633. } else {
  37634. send_code(s, REPZ_11_138, s.bl_tree);
  37635. send_bits(s, count - 11, 7);
  37636. }
  37637. count = 0;
  37638. prevlen = curlen;
  37639. if (nextlen === 0) {
  37640. max_count = 138;
  37641. min_count = 3;
  37642. } else if (curlen === nextlen) {
  37643. max_count = 6;
  37644. min_count = 3;
  37645. } else {
  37646. max_count = 7;
  37647. min_count = 4;
  37648. }
  37649. }
  37650. }
  37651. /* ===========================================================================
  37652. * Construct the Huffman tree for the bit lengths and return the index in
  37653. * bl_order of the last bit length code to send.
  37654. */
  37655. function build_bl_tree(s) {
  37656. var max_blindex; /* index of last bit length code of non zero freq */
  37657. /* Determine the bit length frequencies for literal and distance trees */
  37658. scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
  37659. scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
  37660. /* Build the bit length tree: */
  37661. build_tree(s, s.bl_desc);
  37662. /* opt_len now includes the length of the tree representations, except
  37663. * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
  37664. */
  37665. /* Determine the number of bit length codes to send. The pkzip format
  37666. * requires that at least 4 bit length codes be sent. (appnote.txt says
  37667. * 3 but the actual value used is 4.)
  37668. */
  37669. for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
  37670. if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
  37671. break;
  37672. }
  37673. }
  37674. /* Update opt_len to include the bit length tree and counts */
  37675. s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
  37676. //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
  37677. // s->opt_len, s->static_len));
  37678. return max_blindex;
  37679. }
  37680. /* ===========================================================================
  37681. * Send the header for a block using dynamic Huffman trees: the counts, the
  37682. * lengths of the bit length codes, the literal tree and the distance tree.
  37683. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
  37684. */
  37685. function send_all_trees(s, lcodes, dcodes, blcodes)
  37686. // deflate_state *s;
  37687. // int lcodes, dcodes, blcodes; /* number of codes for each tree */
  37688. {
  37689. var rank; /* index in bl_order */
  37690. //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
  37691. //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
  37692. // "too many codes");
  37693. //Tracev((stderr, "\nbl counts: "));
  37694. send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
  37695. send_bits(s, dcodes - 1, 5);
  37696. send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */
  37697. for (rank = 0; rank < blcodes; rank++) {
  37698. //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
  37699. send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
  37700. }
  37701. //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
  37702. send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
  37703. //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
  37704. send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
  37705. //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
  37706. }
  37707. /* ===========================================================================
  37708. * Check if the data type is TEXT or BINARY, using the following algorithm:
  37709. * - TEXT if the two conditions below are satisfied:
  37710. * a) There are no non-portable control characters belonging to the
  37711. * "black list" (0..6, 14..25, 28..31).
  37712. * b) There is at least one printable character belonging to the
  37713. * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
  37714. * - BINARY otherwise.
  37715. * - The following partially-portable control characters form a
  37716. * "gray list" that is ignored in this detection algorithm:
  37717. * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
  37718. * IN assertion: the fields Freq of dyn_ltree are set.
  37719. */
  37720. function detect_data_type(s) {
  37721. /* black_mask is the bit mask of black-listed bytes
  37722. * set bits 0..6, 14..25, and 28..31
  37723. * 0xf3ffc07f = binary 11110011111111111100000001111111
  37724. */
  37725. var black_mask = 0xf3ffc07f;
  37726. var n;
  37727. /* Check for non-textual ("black-listed") bytes. */
  37728. for (n = 0; n <= 31; n++, black_mask >>>= 1) {
  37729. if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
  37730. return Z_BINARY;
  37731. }
  37732. }
  37733. /* Check for textual ("white-listed") bytes. */
  37734. if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
  37735. s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
  37736. return Z_TEXT;
  37737. }
  37738. for (n = 32; n < LITERALS; n++) {
  37739. if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
  37740. return Z_TEXT;
  37741. }
  37742. }
  37743. /* There are no "black-listed" or "white-listed" bytes:
  37744. * this stream either is empty or has tolerated ("gray-listed") bytes only.
  37745. */
  37746. return Z_BINARY;
  37747. }
  37748. var static_init_done = false;
  37749. /* ===========================================================================
  37750. * Initialize the tree data structures for a new zlib stream.
  37751. */
  37752. function _tr_init(s)
  37753. {
  37754. if (!static_init_done) {
  37755. tr_static_init();
  37756. static_init_done = true;
  37757. }
  37758. s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
  37759. s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
  37760. s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
  37761. s.bi_buf = 0;
  37762. s.bi_valid = 0;
  37763. /* Initialize the first block of the first file: */
  37764. init_block(s);
  37765. }
  37766. /* ===========================================================================
  37767. * Send a stored block
  37768. */
  37769. function _tr_stored_block(s, buf, stored_len, last)
  37770. //DeflateState *s;
  37771. //charf *buf; /* input block */
  37772. //ulg stored_len; /* length of input block */
  37773. //int last; /* one if this is the last block for a file */
  37774. {
  37775. send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */
  37776. copy_block(s, buf, stored_len, true); /* with header */
  37777. }
  37778. /* ===========================================================================
  37779. * Send one empty static block to give enough lookahead for inflate.
  37780. * This takes 10 bits, of which 7 may remain in the bit buffer.
  37781. */
  37782. function _tr_align(s) {
  37783. send_bits(s, STATIC_TREES << 1, 3);
  37784. send_code(s, END_BLOCK, static_ltree);
  37785. bi_flush(s);
  37786. }
  37787. /* ===========================================================================
  37788. * Determine the best encoding for the current block: dynamic trees, static
  37789. * trees or store, and output the encoded block to the zip file.
  37790. */
  37791. function _tr_flush_block(s, buf, stored_len, last)
  37792. //DeflateState *s;
  37793. //charf *buf; /* input block, or NULL if too old */
  37794. //ulg stored_len; /* length of input block */
  37795. //int last; /* one if this is the last block for a file */
  37796. {
  37797. var opt_lenb, static_lenb; /* opt_len and static_len in bytes */
  37798. var max_blindex = 0; /* index of last bit length code of non zero freq */
  37799. /* Build the Huffman trees unless a stored block is forced */
  37800. if (s.level > 0) {
  37801. /* Check if the file is binary or text */
  37802. if (s.strm.data_type === Z_UNKNOWN) {
  37803. s.strm.data_type = detect_data_type(s);
  37804. }
  37805. /* Construct the literal and distance trees */
  37806. build_tree(s, s.l_desc);
  37807. // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
  37808. // s->static_len));
  37809. build_tree(s, s.d_desc);
  37810. // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
  37811. // s->static_len));
  37812. /* At this point, opt_len and static_len are the total bit lengths of
  37813. * the compressed block data, excluding the tree representations.
  37814. */
  37815. /* Build the bit length tree for the above two trees, and get the index
  37816. * in bl_order of the last bit length code to send.
  37817. */
  37818. max_blindex = build_bl_tree(s);
  37819. /* Determine the best encoding. Compute the block lengths in bytes. */
  37820. opt_lenb = (s.opt_len + 3 + 7) >>> 3;
  37821. static_lenb = (s.static_len + 3 + 7) >>> 3;
  37822. // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
  37823. // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
  37824. // s->last_lit));
  37825. if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
  37826. } else {
  37827. // Assert(buf != (char*)0, "lost buf");
  37828. opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
  37829. }
  37830. if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
  37831. /* 4: two words for the lengths */
  37832. /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
  37833. * Otherwise we can't have processed more than WSIZE input bytes since
  37834. * the last block flush, because compression would have been
  37835. * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
  37836. * transform a block into a stored block.
  37837. */
  37838. _tr_stored_block(s, buf, stored_len, last);
  37839. } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
  37840. send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
  37841. compress_block(s, static_ltree, static_dtree);
  37842. } else {
  37843. send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
  37844. send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
  37845. compress_block(s, s.dyn_ltree, s.dyn_dtree);
  37846. }
  37847. // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
  37848. /* The above check is made mod 2^32, for files larger than 512 MB
  37849. * and uLong implemented on 32 bits.
  37850. */
  37851. init_block(s);
  37852. if (last) {
  37853. bi_windup(s);
  37854. }
  37855. // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
  37856. // s->compressed_len-7*last));
  37857. }
  37858. /* ===========================================================================
  37859. * Save the match info and tally the frequency counts. Return true if
  37860. * the current block must be flushed.
  37861. */
  37862. function _tr_tally(s, dist, lc)
  37863. // deflate_state *s;
  37864. // unsigned dist; /* distance of matched string */
  37865. // unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
  37866. {
  37867. //var out_length, in_length, dcode;
  37868. s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;
  37869. s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
  37870. s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
  37871. s.last_lit++;
  37872. if (dist === 0) {
  37873. /* lc is the unmatched char */
  37874. s.dyn_ltree[lc * 2]/*.Freq*/++;
  37875. } else {
  37876. s.matches++;
  37877. /* Here, lc is the match length - MIN_MATCH */
  37878. dist--; /* dist = match distance - 1 */
  37879. //Assert((ush)dist < (ush)MAX_DIST(s) &&
  37880. // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
  37881. // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
  37882. s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
  37883. s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
  37884. }
  37885. // (!) This block is disabled in zlib defailts,
  37886. // don't enable it for binary compatibility
  37887. //#ifdef TRUNCATE_BLOCK
  37888. // /* Try to guess if it is profitable to stop the current block here */
  37889. // if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
  37890. // /* Compute an upper bound for the compressed length */
  37891. // out_length = s.last_lit*8;
  37892. // in_length = s.strstart - s.block_start;
  37893. //
  37894. // for (dcode = 0; dcode < D_CODES; dcode++) {
  37895. // out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
  37896. // }
  37897. // out_length >>>= 3;
  37898. // //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
  37899. // // s->last_lit, in_length, out_length,
  37900. // // 100L - out_length*100L/in_length));
  37901. // if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
  37902. // return true;
  37903. // }
  37904. // }
  37905. //#endif
  37906. return (s.last_lit === s.lit_bufsize - 1);
  37907. /* We avoid equality with lit_bufsize because of wraparound at 64K
  37908. * on 16 bit machines and because stored blocks are restricted to
  37909. * 64K-1 bytes.
  37910. */
  37911. }
  37912. exports._tr_init = _tr_init;
  37913. exports._tr_stored_block = _tr_stored_block;
  37914. exports._tr_flush_block = _tr_flush_block;
  37915. exports._tr_tally = _tr_tally;
  37916. exports._tr_align = _tr_align;
  37917. /***/ }),
  37918. /* 66 */
  37919. /***/ (function(module, exports) {
  37920. 'use strict';
  37921. // Note: adler32 takes 12% for level 0 and 2% for level 6.
  37922. // It doesn't worth to make additional optimizationa as in original.
  37923. // Small size is preferable.
  37924. function adler32(adler, buf, len, pos) {
  37925. var s1 = (adler & 0xffff) |0,
  37926. s2 = ((adler >>> 16) & 0xffff) |0,
  37927. n = 0;
  37928. while (len !== 0) {
  37929. // Set limit ~ twice less than 5552, to keep
  37930. // s2 in 31-bits, because we force signed ints.
  37931. // in other case %= will fail.
  37932. n = len > 2000 ? 2000 : len;
  37933. len -= n;
  37934. do {
  37935. s1 = (s1 + buf[pos++]) |0;
  37936. s2 = (s2 + s1) |0;
  37937. } while (--n);
  37938. s1 %= 65521;
  37939. s2 %= 65521;
  37940. }
  37941. return (s1 | (s2 << 16)) |0;
  37942. }
  37943. module.exports = adler32;
  37944. /***/ }),
  37945. /* 67 */
  37946. /***/ (function(module, exports) {
  37947. 'use strict';
  37948. // Note: we can't get significant speed boost here.
  37949. // So write code to minimize size - no pregenerated tables
  37950. // and array tools dependencies.
  37951. // Use ordinary array, since untyped makes no boost here
  37952. function makeTable() {
  37953. var c, table = [];
  37954. for (var n = 0; n < 256; n++) {
  37955. c = n;
  37956. for (var k = 0; k < 8; k++) {
  37957. c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
  37958. }
  37959. table[n] = c;
  37960. }
  37961. return table;
  37962. }
  37963. // Create table on load. Just 255 signed longs. Not a problem.
  37964. var crcTable = makeTable();
  37965. function crc32(crc, buf, len, pos) {
  37966. var t = crcTable,
  37967. end = pos + len;
  37968. crc ^= -1;
  37969. for (var i = pos; i < end; i++) {
  37970. crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
  37971. }
  37972. return (crc ^ (-1)); // >>> 0;
  37973. }
  37974. module.exports = crc32;
  37975. /***/ }),
  37976. /* 68 */
  37977. /***/ (function(module, exports, __webpack_require__) {
  37978. 'use strict';
  37979. var utils = __webpack_require__(64);
  37980. var adler32 = __webpack_require__(66);
  37981. var crc32 = __webpack_require__(67);
  37982. var inflate_fast = __webpack_require__(69);
  37983. var inflate_table = __webpack_require__(70);
  37984. var CODES = 0;
  37985. var LENS = 1;
  37986. var DISTS = 2;
  37987. /* Public constants ==========================================================*/
  37988. /* ===========================================================================*/
  37989. /* Allowed flush values; see deflate() and inflate() below for details */
  37990. //var Z_NO_FLUSH = 0;
  37991. //var Z_PARTIAL_FLUSH = 1;
  37992. //var Z_SYNC_FLUSH = 2;
  37993. //var Z_FULL_FLUSH = 3;
  37994. var Z_FINISH = 4;
  37995. var Z_BLOCK = 5;
  37996. var Z_TREES = 6;
  37997. /* Return codes for the compression/decompression functions. Negative values
  37998. * are errors, positive values are used for special but normal events.
  37999. */
  38000. var Z_OK = 0;
  38001. var Z_STREAM_END = 1;
  38002. var Z_NEED_DICT = 2;
  38003. //var Z_ERRNO = -1;
  38004. var Z_STREAM_ERROR = -2;
  38005. var Z_DATA_ERROR = -3;
  38006. var Z_MEM_ERROR = -4;
  38007. var Z_BUF_ERROR = -5;
  38008. //var Z_VERSION_ERROR = -6;
  38009. /* The deflate compression method */
  38010. var Z_DEFLATED = 8;
  38011. /* STATES ====================================================================*/
  38012. /* ===========================================================================*/
  38013. var HEAD = 1; /* i: waiting for magic header */
  38014. var FLAGS = 2; /* i: waiting for method and flags (gzip) */
  38015. var TIME = 3; /* i: waiting for modification time (gzip) */
  38016. var OS = 4; /* i: waiting for extra flags and operating system (gzip) */
  38017. var EXLEN = 5; /* i: waiting for extra length (gzip) */
  38018. var EXTRA = 6; /* i: waiting for extra bytes (gzip) */
  38019. var NAME = 7; /* i: waiting for end of file name (gzip) */
  38020. var COMMENT = 8; /* i: waiting for end of comment (gzip) */
  38021. var HCRC = 9; /* i: waiting for header crc (gzip) */
  38022. var DICTID = 10; /* i: waiting for dictionary check value */
  38023. var DICT = 11; /* waiting for inflateSetDictionary() call */
  38024. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  38025. var TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */
  38026. var STORED = 14; /* i: waiting for stored size (length and complement) */
  38027. var COPY_ = 15; /* i/o: same as COPY below, but only first time in */
  38028. var COPY = 16; /* i/o: waiting for input or output to copy stored block */
  38029. var TABLE = 17; /* i: waiting for dynamic block table lengths */
  38030. var LENLENS = 18; /* i: waiting for code length code lengths */
  38031. var CODELENS = 19; /* i: waiting for length/lit and distance code lengths */
  38032. var LEN_ = 20; /* i: same as LEN below, but only first time in */
  38033. var LEN = 21; /* i: waiting for length/lit/eob code */
  38034. var LENEXT = 22; /* i: waiting for length extra bits */
  38035. var DIST = 23; /* i: waiting for distance code */
  38036. var DISTEXT = 24; /* i: waiting for distance extra bits */
  38037. var MATCH = 25; /* o: waiting for output space to copy string */
  38038. var LIT = 26; /* o: waiting for output space to write literal */
  38039. var CHECK = 27; /* i: waiting for 32-bit check value */
  38040. var LENGTH = 28; /* i: waiting for 32-bit length (gzip) */
  38041. var DONE = 29; /* finished check, done -- remain here until reset */
  38042. var BAD = 30; /* got a data error -- remain here until reset */
  38043. var MEM = 31; /* got an inflate() memory error -- remain here until reset */
  38044. var SYNC = 32; /* looking for synchronization bytes to restart inflate() */
  38045. /* ===========================================================================*/
  38046. var ENOUGH_LENS = 852;
  38047. var ENOUGH_DISTS = 592;
  38048. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  38049. var MAX_WBITS = 15;
  38050. /* 32K LZ77 window */
  38051. var DEF_WBITS = MAX_WBITS;
  38052. function zswap32(q) {
  38053. return (((q >>> 24) & 0xff) +
  38054. ((q >>> 8) & 0xff00) +
  38055. ((q & 0xff00) << 8) +
  38056. ((q & 0xff) << 24));
  38057. }
  38058. function InflateState() {
  38059. this.mode = 0; /* current inflate mode */
  38060. this.last = false; /* true if processing last block */
  38061. this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */
  38062. this.havedict = false; /* true if dictionary provided */
  38063. this.flags = 0; /* gzip header method and flags (0 if zlib) */
  38064. this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */
  38065. this.check = 0; /* protected copy of check value */
  38066. this.total = 0; /* protected copy of output count */
  38067. // TODO: may be {}
  38068. this.head = null; /* where to save gzip header information */
  38069. /* sliding window */
  38070. this.wbits = 0; /* log base 2 of requested window size */
  38071. this.wsize = 0; /* window size or zero if not using window */
  38072. this.whave = 0; /* valid bytes in the window */
  38073. this.wnext = 0; /* window write index */
  38074. this.window = null; /* allocated sliding window, if needed */
  38075. /* bit accumulator */
  38076. this.hold = 0; /* input bit accumulator */
  38077. this.bits = 0; /* number of bits in "in" */
  38078. /* for string and stored block copying */
  38079. this.length = 0; /* literal or length of data to copy */
  38080. this.offset = 0; /* distance back to copy string from */
  38081. /* for table and code decoding */
  38082. this.extra = 0; /* extra bits needed */
  38083. /* fixed and dynamic code tables */
  38084. this.lencode = null; /* starting table for length/literal codes */
  38085. this.distcode = null; /* starting table for distance codes */
  38086. this.lenbits = 0; /* index bits for lencode */
  38087. this.distbits = 0; /* index bits for distcode */
  38088. /* dynamic table building */
  38089. this.ncode = 0; /* number of code length code lengths */
  38090. this.nlen = 0; /* number of length code lengths */
  38091. this.ndist = 0; /* number of distance code lengths */
  38092. this.have = 0; /* number of code lengths in lens[] */
  38093. this.next = null; /* next available space in codes[] */
  38094. this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
  38095. this.work = new utils.Buf16(288); /* work area for code table building */
  38096. /*
  38097. because we don't have pointers in js, we use lencode and distcode directly
  38098. as buffers so we don't need codes
  38099. */
  38100. //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */
  38101. this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */
  38102. this.distdyn = null; /* dynamic table for distance codes (JS specific) */
  38103. this.sane = 0; /* if false, allow invalid distance too far */
  38104. this.back = 0; /* bits back of last unprocessed length/lit */
  38105. this.was = 0; /* initial length of match */
  38106. }
  38107. function inflateResetKeep(strm) {
  38108. var state;
  38109. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  38110. state = strm.state;
  38111. strm.total_in = strm.total_out = state.total = 0;
  38112. strm.msg = ''; /*Z_NULL*/
  38113. if (state.wrap) { /* to support ill-conceived Java test suite */
  38114. strm.adler = state.wrap & 1;
  38115. }
  38116. state.mode = HEAD;
  38117. state.last = 0;
  38118. state.havedict = 0;
  38119. state.dmax = 32768;
  38120. state.head = null/*Z_NULL*/;
  38121. state.hold = 0;
  38122. state.bits = 0;
  38123. //state.lencode = state.distcode = state.next = state.codes;
  38124. state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
  38125. state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
  38126. state.sane = 1;
  38127. state.back = -1;
  38128. //Tracev((stderr, "inflate: reset\n"));
  38129. return Z_OK;
  38130. }
  38131. function inflateReset(strm) {
  38132. var state;
  38133. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  38134. state = strm.state;
  38135. state.wsize = 0;
  38136. state.whave = 0;
  38137. state.wnext = 0;
  38138. return inflateResetKeep(strm);
  38139. }
  38140. function inflateReset2(strm, windowBits) {
  38141. var wrap;
  38142. var state;
  38143. /* get the state */
  38144. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  38145. state = strm.state;
  38146. /* extract wrap request from windowBits parameter */
  38147. if (windowBits < 0) {
  38148. wrap = 0;
  38149. windowBits = -windowBits;
  38150. }
  38151. else {
  38152. wrap = (windowBits >> 4) + 1;
  38153. if (windowBits < 48) {
  38154. windowBits &= 15;
  38155. }
  38156. }
  38157. /* set number of window bits, free window if different */
  38158. if (windowBits && (windowBits < 8 || windowBits > 15)) {
  38159. return Z_STREAM_ERROR;
  38160. }
  38161. if (state.window !== null && state.wbits !== windowBits) {
  38162. state.window = null;
  38163. }
  38164. /* update state and reset the rest of it */
  38165. state.wrap = wrap;
  38166. state.wbits = windowBits;
  38167. return inflateReset(strm);
  38168. }
  38169. function inflateInit2(strm, windowBits) {
  38170. var ret;
  38171. var state;
  38172. if (!strm) { return Z_STREAM_ERROR; }
  38173. //strm.msg = Z_NULL; /* in case we return an error */
  38174. state = new InflateState();
  38175. //if (state === Z_NULL) return Z_MEM_ERROR;
  38176. //Tracev((stderr, "inflate: allocated\n"));
  38177. strm.state = state;
  38178. state.window = null/*Z_NULL*/;
  38179. ret = inflateReset2(strm, windowBits);
  38180. if (ret !== Z_OK) {
  38181. strm.state = null/*Z_NULL*/;
  38182. }
  38183. return ret;
  38184. }
  38185. function inflateInit(strm) {
  38186. return inflateInit2(strm, DEF_WBITS);
  38187. }
  38188. /*
  38189. Return state with length and distance decoding tables and index sizes set to
  38190. fixed code decoding. Normally this returns fixed tables from inffixed.h.
  38191. If BUILDFIXED is defined, then instead this routine builds the tables the
  38192. first time it's called, and returns those tables the first time and
  38193. thereafter. This reduces the size of the code by about 2K bytes, in
  38194. exchange for a little execution time. However, BUILDFIXED should not be
  38195. used for threaded applications, since the rewriting of the tables and virgin
  38196. may not be thread-safe.
  38197. */
  38198. var virgin = true;
  38199. var lenfix, distfix; // We have no pointers in JS, so keep tables separate
  38200. function fixedtables(state) {
  38201. /* build fixed huffman tables if first call (may not be thread safe) */
  38202. if (virgin) {
  38203. var sym;
  38204. lenfix = new utils.Buf32(512);
  38205. distfix = new utils.Buf32(32);
  38206. /* literal/length table */
  38207. sym = 0;
  38208. while (sym < 144) { state.lens[sym++] = 8; }
  38209. while (sym < 256) { state.lens[sym++] = 9; }
  38210. while (sym < 280) { state.lens[sym++] = 7; }
  38211. while (sym < 288) { state.lens[sym++] = 8; }
  38212. inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });
  38213. /* distance table */
  38214. sym = 0;
  38215. while (sym < 32) { state.lens[sym++] = 5; }
  38216. inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });
  38217. /* do this just once */
  38218. virgin = false;
  38219. }
  38220. state.lencode = lenfix;
  38221. state.lenbits = 9;
  38222. state.distcode = distfix;
  38223. state.distbits = 5;
  38224. }
  38225. /*
  38226. Update the window with the last wsize (normally 32K) bytes written before
  38227. returning. If window does not exist yet, create it. This is only called
  38228. when a window is already in use, or when output has been written during this
  38229. inflate call, but the end of the deflate stream has not been reached yet.
  38230. It is also called to create a window for dictionary data when a dictionary
  38231. is loaded.
  38232. Providing output buffers larger than 32K to inflate() should provide a speed
  38233. advantage, since only the last 32K of output is copied to the sliding window
  38234. upon return from inflate(), and since all distances after the first 32K of
  38235. output will fall in the output data, making match copies simpler and faster.
  38236. The advantage may be dependent on the size of the processor's data caches.
  38237. */
  38238. function updatewindow(strm, src, end, copy) {
  38239. var dist;
  38240. var state = strm.state;
  38241. /* if it hasn't been done already, allocate space for the window */
  38242. if (state.window === null) {
  38243. state.wsize = 1 << state.wbits;
  38244. state.wnext = 0;
  38245. state.whave = 0;
  38246. state.window = new utils.Buf8(state.wsize);
  38247. }
  38248. /* copy state->wsize or less output bytes into the circular window */
  38249. if (copy >= state.wsize) {
  38250. utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
  38251. state.wnext = 0;
  38252. state.whave = state.wsize;
  38253. }
  38254. else {
  38255. dist = state.wsize - state.wnext;
  38256. if (dist > copy) {
  38257. dist = copy;
  38258. }
  38259. //zmemcpy(state->window + state->wnext, end - copy, dist);
  38260. utils.arraySet(state.window, src, end - copy, dist, state.wnext);
  38261. copy -= dist;
  38262. if (copy) {
  38263. //zmemcpy(state->window, end - copy, copy);
  38264. utils.arraySet(state.window, src, end - copy, copy, 0);
  38265. state.wnext = copy;
  38266. state.whave = state.wsize;
  38267. }
  38268. else {
  38269. state.wnext += dist;
  38270. if (state.wnext === state.wsize) { state.wnext = 0; }
  38271. if (state.whave < state.wsize) { state.whave += dist; }
  38272. }
  38273. }
  38274. return 0;
  38275. }
  38276. function inflate(strm, flush) {
  38277. var state;
  38278. var input, output; // input/output buffers
  38279. var next; /* next input INDEX */
  38280. var put; /* next output INDEX */
  38281. var have, left; /* available input and output */
  38282. var hold; /* bit buffer */
  38283. var bits; /* bits in bit buffer */
  38284. var _in, _out; /* save starting available input and output */
  38285. var copy; /* number of stored or match bytes to copy */
  38286. var from; /* where to copy match bytes from */
  38287. var from_source;
  38288. var here = 0; /* current decoding table entry */
  38289. var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
  38290. //var last; /* parent table entry */
  38291. var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
  38292. var len; /* length to copy for repeats, bits to drop */
  38293. var ret; /* return code */
  38294. var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */
  38295. var opts;
  38296. var n; // temporary var for NEED_BITS
  38297. var order = /* permutation of code lengths */
  38298. [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
  38299. if (!strm || !strm.state || !strm.output ||
  38300. (!strm.input && strm.avail_in !== 0)) {
  38301. return Z_STREAM_ERROR;
  38302. }
  38303. state = strm.state;
  38304. if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */
  38305. //--- LOAD() ---
  38306. put = strm.next_out;
  38307. output = strm.output;
  38308. left = strm.avail_out;
  38309. next = strm.next_in;
  38310. input = strm.input;
  38311. have = strm.avail_in;
  38312. hold = state.hold;
  38313. bits = state.bits;
  38314. //---
  38315. _in = have;
  38316. _out = left;
  38317. ret = Z_OK;
  38318. inf_leave: // goto emulation
  38319. for (;;) {
  38320. switch (state.mode) {
  38321. case HEAD:
  38322. if (state.wrap === 0) {
  38323. state.mode = TYPEDO;
  38324. break;
  38325. }
  38326. //=== NEEDBITS(16);
  38327. while (bits < 16) {
  38328. if (have === 0) { break inf_leave; }
  38329. have--;
  38330. hold += input[next++] << bits;
  38331. bits += 8;
  38332. }
  38333. //===//
  38334. if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */
  38335. state.check = 0/*crc32(0L, Z_NULL, 0)*/;
  38336. //=== CRC2(state.check, hold);
  38337. hbuf[0] = hold & 0xff;
  38338. hbuf[1] = (hold >>> 8) & 0xff;
  38339. state.check = crc32(state.check, hbuf, 2, 0);
  38340. //===//
  38341. //=== INITBITS();
  38342. hold = 0;
  38343. bits = 0;
  38344. //===//
  38345. state.mode = FLAGS;
  38346. break;
  38347. }
  38348. state.flags = 0; /* expect zlib header */
  38349. if (state.head) {
  38350. state.head.done = false;
  38351. }
  38352. if (!(state.wrap & 1) || /* check if zlib header allowed */
  38353. (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
  38354. strm.msg = 'incorrect header check';
  38355. state.mode = BAD;
  38356. break;
  38357. }
  38358. if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
  38359. strm.msg = 'unknown compression method';
  38360. state.mode = BAD;
  38361. break;
  38362. }
  38363. //--- DROPBITS(4) ---//
  38364. hold >>>= 4;
  38365. bits -= 4;
  38366. //---//
  38367. len = (hold & 0x0f)/*BITS(4)*/ + 8;
  38368. if (state.wbits === 0) {
  38369. state.wbits = len;
  38370. }
  38371. else if (len > state.wbits) {
  38372. strm.msg = 'invalid window size';
  38373. state.mode = BAD;
  38374. break;
  38375. }
  38376. state.dmax = 1 << len;
  38377. //Tracev((stderr, "inflate: zlib header ok\n"));
  38378. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  38379. state.mode = hold & 0x200 ? DICTID : TYPE;
  38380. //=== INITBITS();
  38381. hold = 0;
  38382. bits = 0;
  38383. //===//
  38384. break;
  38385. case FLAGS:
  38386. //=== NEEDBITS(16); */
  38387. while (bits < 16) {
  38388. if (have === 0) { break inf_leave; }
  38389. have--;
  38390. hold += input[next++] << bits;
  38391. bits += 8;
  38392. }
  38393. //===//
  38394. state.flags = hold;
  38395. if ((state.flags & 0xff) !== Z_DEFLATED) {
  38396. strm.msg = 'unknown compression method';
  38397. state.mode = BAD;
  38398. break;
  38399. }
  38400. if (state.flags & 0xe000) {
  38401. strm.msg = 'unknown header flags set';
  38402. state.mode = BAD;
  38403. break;
  38404. }
  38405. if (state.head) {
  38406. state.head.text = ((hold >> 8) & 1);
  38407. }
  38408. if (state.flags & 0x0200) {
  38409. //=== CRC2(state.check, hold);
  38410. hbuf[0] = hold & 0xff;
  38411. hbuf[1] = (hold >>> 8) & 0xff;
  38412. state.check = crc32(state.check, hbuf, 2, 0);
  38413. //===//
  38414. }
  38415. //=== INITBITS();
  38416. hold = 0;
  38417. bits = 0;
  38418. //===//
  38419. state.mode = TIME;
  38420. /* falls through */
  38421. case TIME:
  38422. //=== NEEDBITS(32); */
  38423. while (bits < 32) {
  38424. if (have === 0) { break inf_leave; }
  38425. have--;
  38426. hold += input[next++] << bits;
  38427. bits += 8;
  38428. }
  38429. //===//
  38430. if (state.head) {
  38431. state.head.time = hold;
  38432. }
  38433. if (state.flags & 0x0200) {
  38434. //=== CRC4(state.check, hold)
  38435. hbuf[0] = hold & 0xff;
  38436. hbuf[1] = (hold >>> 8) & 0xff;
  38437. hbuf[2] = (hold >>> 16) & 0xff;
  38438. hbuf[3] = (hold >>> 24) & 0xff;
  38439. state.check = crc32(state.check, hbuf, 4, 0);
  38440. //===
  38441. }
  38442. //=== INITBITS();
  38443. hold = 0;
  38444. bits = 0;
  38445. //===//
  38446. state.mode = OS;
  38447. /* falls through */
  38448. case OS:
  38449. //=== NEEDBITS(16); */
  38450. while (bits < 16) {
  38451. if (have === 0) { break inf_leave; }
  38452. have--;
  38453. hold += input[next++] << bits;
  38454. bits += 8;
  38455. }
  38456. //===//
  38457. if (state.head) {
  38458. state.head.xflags = (hold & 0xff);
  38459. state.head.os = (hold >> 8);
  38460. }
  38461. if (state.flags & 0x0200) {
  38462. //=== CRC2(state.check, hold);
  38463. hbuf[0] = hold & 0xff;
  38464. hbuf[1] = (hold >>> 8) & 0xff;
  38465. state.check = crc32(state.check, hbuf, 2, 0);
  38466. //===//
  38467. }
  38468. //=== INITBITS();
  38469. hold = 0;
  38470. bits = 0;
  38471. //===//
  38472. state.mode = EXLEN;
  38473. /* falls through */
  38474. case EXLEN:
  38475. if (state.flags & 0x0400) {
  38476. //=== NEEDBITS(16); */
  38477. while (bits < 16) {
  38478. if (have === 0) { break inf_leave; }
  38479. have--;
  38480. hold += input[next++] << bits;
  38481. bits += 8;
  38482. }
  38483. //===//
  38484. state.length = hold;
  38485. if (state.head) {
  38486. state.head.extra_len = hold;
  38487. }
  38488. if (state.flags & 0x0200) {
  38489. //=== CRC2(state.check, hold);
  38490. hbuf[0] = hold & 0xff;
  38491. hbuf[1] = (hold >>> 8) & 0xff;
  38492. state.check = crc32(state.check, hbuf, 2, 0);
  38493. //===//
  38494. }
  38495. //=== INITBITS();
  38496. hold = 0;
  38497. bits = 0;
  38498. //===//
  38499. }
  38500. else if (state.head) {
  38501. state.head.extra = null/*Z_NULL*/;
  38502. }
  38503. state.mode = EXTRA;
  38504. /* falls through */
  38505. case EXTRA:
  38506. if (state.flags & 0x0400) {
  38507. copy = state.length;
  38508. if (copy > have) { copy = have; }
  38509. if (copy) {
  38510. if (state.head) {
  38511. len = state.head.extra_len - state.length;
  38512. if (!state.head.extra) {
  38513. // Use untyped array for more conveniend processing later
  38514. state.head.extra = new Array(state.head.extra_len);
  38515. }
  38516. utils.arraySet(
  38517. state.head.extra,
  38518. input,
  38519. next,
  38520. // extra field is limited to 65536 bytes
  38521. // - no need for additional size check
  38522. copy,
  38523. /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
  38524. len
  38525. );
  38526. //zmemcpy(state.head.extra + len, next,
  38527. // len + copy > state.head.extra_max ?
  38528. // state.head.extra_max - len : copy);
  38529. }
  38530. if (state.flags & 0x0200) {
  38531. state.check = crc32(state.check, input, copy, next);
  38532. }
  38533. have -= copy;
  38534. next += copy;
  38535. state.length -= copy;
  38536. }
  38537. if (state.length) { break inf_leave; }
  38538. }
  38539. state.length = 0;
  38540. state.mode = NAME;
  38541. /* falls through */
  38542. case NAME:
  38543. if (state.flags & 0x0800) {
  38544. if (have === 0) { break inf_leave; }
  38545. copy = 0;
  38546. do {
  38547. // TODO: 2 or 1 bytes?
  38548. len = input[next + copy++];
  38549. /* use constant limit because in js we should not preallocate memory */
  38550. if (state.head && len &&
  38551. (state.length < 65536 /*state.head.name_max*/)) {
  38552. state.head.name += String.fromCharCode(len);
  38553. }
  38554. } while (len && copy < have);
  38555. if (state.flags & 0x0200) {
  38556. state.check = crc32(state.check, input, copy, next);
  38557. }
  38558. have -= copy;
  38559. next += copy;
  38560. if (len) { break inf_leave; }
  38561. }
  38562. else if (state.head) {
  38563. state.head.name = null;
  38564. }
  38565. state.length = 0;
  38566. state.mode = COMMENT;
  38567. /* falls through */
  38568. case COMMENT:
  38569. if (state.flags & 0x1000) {
  38570. if (have === 0) { break inf_leave; }
  38571. copy = 0;
  38572. do {
  38573. len = input[next + copy++];
  38574. /* use constant limit because in js we should not preallocate memory */
  38575. if (state.head && len &&
  38576. (state.length < 65536 /*state.head.comm_max*/)) {
  38577. state.head.comment += String.fromCharCode(len);
  38578. }
  38579. } while (len && copy < have);
  38580. if (state.flags & 0x0200) {
  38581. state.check = crc32(state.check, input, copy, next);
  38582. }
  38583. have -= copy;
  38584. next += copy;
  38585. if (len) { break inf_leave; }
  38586. }
  38587. else if (state.head) {
  38588. state.head.comment = null;
  38589. }
  38590. state.mode = HCRC;
  38591. /* falls through */
  38592. case HCRC:
  38593. if (state.flags & 0x0200) {
  38594. //=== NEEDBITS(16); */
  38595. while (bits < 16) {
  38596. if (have === 0) { break inf_leave; }
  38597. have--;
  38598. hold += input[next++] << bits;
  38599. bits += 8;
  38600. }
  38601. //===//
  38602. if (hold !== (state.check & 0xffff)) {
  38603. strm.msg = 'header crc mismatch';
  38604. state.mode = BAD;
  38605. break;
  38606. }
  38607. //=== INITBITS();
  38608. hold = 0;
  38609. bits = 0;
  38610. //===//
  38611. }
  38612. if (state.head) {
  38613. state.head.hcrc = ((state.flags >> 9) & 1);
  38614. state.head.done = true;
  38615. }
  38616. strm.adler = state.check = 0;
  38617. state.mode = TYPE;
  38618. break;
  38619. case DICTID:
  38620. //=== NEEDBITS(32); */
  38621. while (bits < 32) {
  38622. if (have === 0) { break inf_leave; }
  38623. have--;
  38624. hold += input[next++] << bits;
  38625. bits += 8;
  38626. }
  38627. //===//
  38628. strm.adler = state.check = zswap32(hold);
  38629. //=== INITBITS();
  38630. hold = 0;
  38631. bits = 0;
  38632. //===//
  38633. state.mode = DICT;
  38634. /* falls through */
  38635. case DICT:
  38636. if (state.havedict === 0) {
  38637. //--- RESTORE() ---
  38638. strm.next_out = put;
  38639. strm.avail_out = left;
  38640. strm.next_in = next;
  38641. strm.avail_in = have;
  38642. state.hold = hold;
  38643. state.bits = bits;
  38644. //---
  38645. return Z_NEED_DICT;
  38646. }
  38647. strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
  38648. state.mode = TYPE;
  38649. /* falls through */
  38650. case TYPE:
  38651. if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
  38652. /* falls through */
  38653. case TYPEDO:
  38654. if (state.last) {
  38655. //--- BYTEBITS() ---//
  38656. hold >>>= bits & 7;
  38657. bits -= bits & 7;
  38658. //---//
  38659. state.mode = CHECK;
  38660. break;
  38661. }
  38662. //=== NEEDBITS(3); */
  38663. while (bits < 3) {
  38664. if (have === 0) { break inf_leave; }
  38665. have--;
  38666. hold += input[next++] << bits;
  38667. bits += 8;
  38668. }
  38669. //===//
  38670. state.last = (hold & 0x01)/*BITS(1)*/;
  38671. //--- DROPBITS(1) ---//
  38672. hold >>>= 1;
  38673. bits -= 1;
  38674. //---//
  38675. switch ((hold & 0x03)/*BITS(2)*/) {
  38676. case 0: /* stored block */
  38677. //Tracev((stderr, "inflate: stored block%s\n",
  38678. // state.last ? " (last)" : ""));
  38679. state.mode = STORED;
  38680. break;
  38681. case 1: /* fixed block */
  38682. fixedtables(state);
  38683. //Tracev((stderr, "inflate: fixed codes block%s\n",
  38684. // state.last ? " (last)" : ""));
  38685. state.mode = LEN_; /* decode codes */
  38686. if (flush === Z_TREES) {
  38687. //--- DROPBITS(2) ---//
  38688. hold >>>= 2;
  38689. bits -= 2;
  38690. //---//
  38691. break inf_leave;
  38692. }
  38693. break;
  38694. case 2: /* dynamic block */
  38695. //Tracev((stderr, "inflate: dynamic codes block%s\n",
  38696. // state.last ? " (last)" : ""));
  38697. state.mode = TABLE;
  38698. break;
  38699. case 3:
  38700. strm.msg = 'invalid block type';
  38701. state.mode = BAD;
  38702. }
  38703. //--- DROPBITS(2) ---//
  38704. hold >>>= 2;
  38705. bits -= 2;
  38706. //---//
  38707. break;
  38708. case STORED:
  38709. //--- BYTEBITS() ---// /* go to byte boundary */
  38710. hold >>>= bits & 7;
  38711. bits -= bits & 7;
  38712. //---//
  38713. //=== NEEDBITS(32); */
  38714. while (bits < 32) {
  38715. if (have === 0) { break inf_leave; }
  38716. have--;
  38717. hold += input[next++] << bits;
  38718. bits += 8;
  38719. }
  38720. //===//
  38721. if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
  38722. strm.msg = 'invalid stored block lengths';
  38723. state.mode = BAD;
  38724. break;
  38725. }
  38726. state.length = hold & 0xffff;
  38727. //Tracev((stderr, "inflate: stored length %u\n",
  38728. // state.length));
  38729. //=== INITBITS();
  38730. hold = 0;
  38731. bits = 0;
  38732. //===//
  38733. state.mode = COPY_;
  38734. if (flush === Z_TREES) { break inf_leave; }
  38735. /* falls through */
  38736. case COPY_:
  38737. state.mode = COPY;
  38738. /* falls through */
  38739. case COPY:
  38740. copy = state.length;
  38741. if (copy) {
  38742. if (copy > have) { copy = have; }
  38743. if (copy > left) { copy = left; }
  38744. if (copy === 0) { break inf_leave; }
  38745. //--- zmemcpy(put, next, copy); ---
  38746. utils.arraySet(output, input, next, copy, put);
  38747. //---//
  38748. have -= copy;
  38749. next += copy;
  38750. left -= copy;
  38751. put += copy;
  38752. state.length -= copy;
  38753. break;
  38754. }
  38755. //Tracev((stderr, "inflate: stored end\n"));
  38756. state.mode = TYPE;
  38757. break;
  38758. case TABLE:
  38759. //=== NEEDBITS(14); */
  38760. while (bits < 14) {
  38761. if (have === 0) { break inf_leave; }
  38762. have--;
  38763. hold += input[next++] << bits;
  38764. bits += 8;
  38765. }
  38766. //===//
  38767. state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
  38768. //--- DROPBITS(5) ---//
  38769. hold >>>= 5;
  38770. bits -= 5;
  38771. //---//
  38772. state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
  38773. //--- DROPBITS(5) ---//
  38774. hold >>>= 5;
  38775. bits -= 5;
  38776. //---//
  38777. state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
  38778. //--- DROPBITS(4) ---//
  38779. hold >>>= 4;
  38780. bits -= 4;
  38781. //---//
  38782. //#ifndef PKZIP_BUG_WORKAROUND
  38783. if (state.nlen > 286 || state.ndist > 30) {
  38784. strm.msg = 'too many length or distance symbols';
  38785. state.mode = BAD;
  38786. break;
  38787. }
  38788. //#endif
  38789. //Tracev((stderr, "inflate: table sizes ok\n"));
  38790. state.have = 0;
  38791. state.mode = LENLENS;
  38792. /* falls through */
  38793. case LENLENS:
  38794. while (state.have < state.ncode) {
  38795. //=== NEEDBITS(3);
  38796. while (bits < 3) {
  38797. if (have === 0) { break inf_leave; }
  38798. have--;
  38799. hold += input[next++] << bits;
  38800. bits += 8;
  38801. }
  38802. //===//
  38803. state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
  38804. //--- DROPBITS(3) ---//
  38805. hold >>>= 3;
  38806. bits -= 3;
  38807. //---//
  38808. }
  38809. while (state.have < 19) {
  38810. state.lens[order[state.have++]] = 0;
  38811. }
  38812. // We have separate tables & no pointers. 2 commented lines below not needed.
  38813. //state.next = state.codes;
  38814. //state.lencode = state.next;
  38815. // Switch to use dynamic table
  38816. state.lencode = state.lendyn;
  38817. state.lenbits = 7;
  38818. opts = { bits: state.lenbits };
  38819. ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
  38820. state.lenbits = opts.bits;
  38821. if (ret) {
  38822. strm.msg = 'invalid code lengths set';
  38823. state.mode = BAD;
  38824. break;
  38825. }
  38826. //Tracev((stderr, "inflate: code lengths ok\n"));
  38827. state.have = 0;
  38828. state.mode = CODELENS;
  38829. /* falls through */
  38830. case CODELENS:
  38831. while (state.have < state.nlen + state.ndist) {
  38832. for (;;) {
  38833. here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
  38834. here_bits = here >>> 24;
  38835. here_op = (here >>> 16) & 0xff;
  38836. here_val = here & 0xffff;
  38837. if ((here_bits) <= bits) { break; }
  38838. //--- PULLBYTE() ---//
  38839. if (have === 0) { break inf_leave; }
  38840. have--;
  38841. hold += input[next++] << bits;
  38842. bits += 8;
  38843. //---//
  38844. }
  38845. if (here_val < 16) {
  38846. //--- DROPBITS(here.bits) ---//
  38847. hold >>>= here_bits;
  38848. bits -= here_bits;
  38849. //---//
  38850. state.lens[state.have++] = here_val;
  38851. }
  38852. else {
  38853. if (here_val === 16) {
  38854. //=== NEEDBITS(here.bits + 2);
  38855. n = here_bits + 2;
  38856. while (bits < n) {
  38857. if (have === 0) { break inf_leave; }
  38858. have--;
  38859. hold += input[next++] << bits;
  38860. bits += 8;
  38861. }
  38862. //===//
  38863. //--- DROPBITS(here.bits) ---//
  38864. hold >>>= here_bits;
  38865. bits -= here_bits;
  38866. //---//
  38867. if (state.have === 0) {
  38868. strm.msg = 'invalid bit length repeat';
  38869. state.mode = BAD;
  38870. break;
  38871. }
  38872. len = state.lens[state.have - 1];
  38873. copy = 3 + (hold & 0x03);//BITS(2);
  38874. //--- DROPBITS(2) ---//
  38875. hold >>>= 2;
  38876. bits -= 2;
  38877. //---//
  38878. }
  38879. else if (here_val === 17) {
  38880. //=== NEEDBITS(here.bits + 3);
  38881. n = here_bits + 3;
  38882. while (bits < n) {
  38883. if (have === 0) { break inf_leave; }
  38884. have--;
  38885. hold += input[next++] << bits;
  38886. bits += 8;
  38887. }
  38888. //===//
  38889. //--- DROPBITS(here.bits) ---//
  38890. hold >>>= here_bits;
  38891. bits -= here_bits;
  38892. //---//
  38893. len = 0;
  38894. copy = 3 + (hold & 0x07);//BITS(3);
  38895. //--- DROPBITS(3) ---//
  38896. hold >>>= 3;
  38897. bits -= 3;
  38898. //---//
  38899. }
  38900. else {
  38901. //=== NEEDBITS(here.bits + 7);
  38902. n = here_bits + 7;
  38903. while (bits < n) {
  38904. if (have === 0) { break inf_leave; }
  38905. have--;
  38906. hold += input[next++] << bits;
  38907. bits += 8;
  38908. }
  38909. //===//
  38910. //--- DROPBITS(here.bits) ---//
  38911. hold >>>= here_bits;
  38912. bits -= here_bits;
  38913. //---//
  38914. len = 0;
  38915. copy = 11 + (hold & 0x7f);//BITS(7);
  38916. //--- DROPBITS(7) ---//
  38917. hold >>>= 7;
  38918. bits -= 7;
  38919. //---//
  38920. }
  38921. if (state.have + copy > state.nlen + state.ndist) {
  38922. strm.msg = 'invalid bit length repeat';
  38923. state.mode = BAD;
  38924. break;
  38925. }
  38926. while (copy--) {
  38927. state.lens[state.have++] = len;
  38928. }
  38929. }
  38930. }
  38931. /* handle error breaks in while */
  38932. if (state.mode === BAD) { break; }
  38933. /* check for end-of-block code (better have one) */
  38934. if (state.lens[256] === 0) {
  38935. strm.msg = 'invalid code -- missing end-of-block';
  38936. state.mode = BAD;
  38937. break;
  38938. }
  38939. /* build code tables -- note: do not change the lenbits or distbits
  38940. values here (9 and 6) without reading the comments in inftrees.h
  38941. concerning the ENOUGH constants, which depend on those values */
  38942. state.lenbits = 9;
  38943. opts = { bits: state.lenbits };
  38944. ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
  38945. // We have separate tables & no pointers. 2 commented lines below not needed.
  38946. // state.next_index = opts.table_index;
  38947. state.lenbits = opts.bits;
  38948. // state.lencode = state.next;
  38949. if (ret) {
  38950. strm.msg = 'invalid literal/lengths set';
  38951. state.mode = BAD;
  38952. break;
  38953. }
  38954. state.distbits = 6;
  38955. //state.distcode.copy(state.codes);
  38956. // Switch to use dynamic table
  38957. state.distcode = state.distdyn;
  38958. opts = { bits: state.distbits };
  38959. ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
  38960. // We have separate tables & no pointers. 2 commented lines below not needed.
  38961. // state.next_index = opts.table_index;
  38962. state.distbits = opts.bits;
  38963. // state.distcode = state.next;
  38964. if (ret) {
  38965. strm.msg = 'invalid distances set';
  38966. state.mode = BAD;
  38967. break;
  38968. }
  38969. //Tracev((stderr, 'inflate: codes ok\n'));
  38970. state.mode = LEN_;
  38971. if (flush === Z_TREES) { break inf_leave; }
  38972. /* falls through */
  38973. case LEN_:
  38974. state.mode = LEN;
  38975. /* falls through */
  38976. case LEN:
  38977. if (have >= 6 && left >= 258) {
  38978. //--- RESTORE() ---
  38979. strm.next_out = put;
  38980. strm.avail_out = left;
  38981. strm.next_in = next;
  38982. strm.avail_in = have;
  38983. state.hold = hold;
  38984. state.bits = bits;
  38985. //---
  38986. inflate_fast(strm, _out);
  38987. //--- LOAD() ---
  38988. put = strm.next_out;
  38989. output = strm.output;
  38990. left = strm.avail_out;
  38991. next = strm.next_in;
  38992. input = strm.input;
  38993. have = strm.avail_in;
  38994. hold = state.hold;
  38995. bits = state.bits;
  38996. //---
  38997. if (state.mode === TYPE) {
  38998. state.back = -1;
  38999. }
  39000. break;
  39001. }
  39002. state.back = 0;
  39003. for (;;) {
  39004. here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/
  39005. here_bits = here >>> 24;
  39006. here_op = (here >>> 16) & 0xff;
  39007. here_val = here & 0xffff;
  39008. if (here_bits <= bits) { break; }
  39009. //--- PULLBYTE() ---//
  39010. if (have === 0) { break inf_leave; }
  39011. have--;
  39012. hold += input[next++] << bits;
  39013. bits += 8;
  39014. //---//
  39015. }
  39016. if (here_op && (here_op & 0xf0) === 0) {
  39017. last_bits = here_bits;
  39018. last_op = here_op;
  39019. last_val = here_val;
  39020. for (;;) {
  39021. here = state.lencode[last_val +
  39022. ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  39023. here_bits = here >>> 24;
  39024. here_op = (here >>> 16) & 0xff;
  39025. here_val = here & 0xffff;
  39026. if ((last_bits + here_bits) <= bits) { break; }
  39027. //--- PULLBYTE() ---//
  39028. if (have === 0) { break inf_leave; }
  39029. have--;
  39030. hold += input[next++] << bits;
  39031. bits += 8;
  39032. //---//
  39033. }
  39034. //--- DROPBITS(last.bits) ---//
  39035. hold >>>= last_bits;
  39036. bits -= last_bits;
  39037. //---//
  39038. state.back += last_bits;
  39039. }
  39040. //--- DROPBITS(here.bits) ---//
  39041. hold >>>= here_bits;
  39042. bits -= here_bits;
  39043. //---//
  39044. state.back += here_bits;
  39045. state.length = here_val;
  39046. if (here_op === 0) {
  39047. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  39048. // "inflate: literal '%c'\n" :
  39049. // "inflate: literal 0x%02x\n", here.val));
  39050. state.mode = LIT;
  39051. break;
  39052. }
  39053. if (here_op & 32) {
  39054. //Tracevv((stderr, "inflate: end of block\n"));
  39055. state.back = -1;
  39056. state.mode = TYPE;
  39057. break;
  39058. }
  39059. if (here_op & 64) {
  39060. strm.msg = 'invalid literal/length code';
  39061. state.mode = BAD;
  39062. break;
  39063. }
  39064. state.extra = here_op & 15;
  39065. state.mode = LENEXT;
  39066. /* falls through */
  39067. case LENEXT:
  39068. if (state.extra) {
  39069. //=== NEEDBITS(state.extra);
  39070. n = state.extra;
  39071. while (bits < n) {
  39072. if (have === 0) { break inf_leave; }
  39073. have--;
  39074. hold += input[next++] << bits;
  39075. bits += 8;
  39076. }
  39077. //===//
  39078. state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
  39079. //--- DROPBITS(state.extra) ---//
  39080. hold >>>= state.extra;
  39081. bits -= state.extra;
  39082. //---//
  39083. state.back += state.extra;
  39084. }
  39085. //Tracevv((stderr, "inflate: length %u\n", state.length));
  39086. state.was = state.length;
  39087. state.mode = DIST;
  39088. /* falls through */
  39089. case DIST:
  39090. for (;;) {
  39091. here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
  39092. here_bits = here >>> 24;
  39093. here_op = (here >>> 16) & 0xff;
  39094. here_val = here & 0xffff;
  39095. if ((here_bits) <= bits) { break; }
  39096. //--- PULLBYTE() ---//
  39097. if (have === 0) { break inf_leave; }
  39098. have--;
  39099. hold += input[next++] << bits;
  39100. bits += 8;
  39101. //---//
  39102. }
  39103. if ((here_op & 0xf0) === 0) {
  39104. last_bits = here_bits;
  39105. last_op = here_op;
  39106. last_val = here_val;
  39107. for (;;) {
  39108. here = state.distcode[last_val +
  39109. ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
  39110. here_bits = here >>> 24;
  39111. here_op = (here >>> 16) & 0xff;
  39112. here_val = here & 0xffff;
  39113. if ((last_bits + here_bits) <= bits) { break; }
  39114. //--- PULLBYTE() ---//
  39115. if (have === 0) { break inf_leave; }
  39116. have--;
  39117. hold += input[next++] << bits;
  39118. bits += 8;
  39119. //---//
  39120. }
  39121. //--- DROPBITS(last.bits) ---//
  39122. hold >>>= last_bits;
  39123. bits -= last_bits;
  39124. //---//
  39125. state.back += last_bits;
  39126. }
  39127. //--- DROPBITS(here.bits) ---//
  39128. hold >>>= here_bits;
  39129. bits -= here_bits;
  39130. //---//
  39131. state.back += here_bits;
  39132. if (here_op & 64) {
  39133. strm.msg = 'invalid distance code';
  39134. state.mode = BAD;
  39135. break;
  39136. }
  39137. state.offset = here_val;
  39138. state.extra = (here_op) & 15;
  39139. state.mode = DISTEXT;
  39140. /* falls through */
  39141. case DISTEXT:
  39142. if (state.extra) {
  39143. //=== NEEDBITS(state.extra);
  39144. n = state.extra;
  39145. while (bits < n) {
  39146. if (have === 0) { break inf_leave; }
  39147. have--;
  39148. hold += input[next++] << bits;
  39149. bits += 8;
  39150. }
  39151. //===//
  39152. state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
  39153. //--- DROPBITS(state.extra) ---//
  39154. hold >>>= state.extra;
  39155. bits -= state.extra;
  39156. //---//
  39157. state.back += state.extra;
  39158. }
  39159. //#ifdef INFLATE_STRICT
  39160. if (state.offset > state.dmax) {
  39161. strm.msg = 'invalid distance too far back';
  39162. state.mode = BAD;
  39163. break;
  39164. }
  39165. //#endif
  39166. //Tracevv((stderr, "inflate: distance %u\n", state.offset));
  39167. state.mode = MATCH;
  39168. /* falls through */
  39169. case MATCH:
  39170. if (left === 0) { break inf_leave; }
  39171. copy = _out - left;
  39172. if (state.offset > copy) { /* copy from window */
  39173. copy = state.offset - copy;
  39174. if (copy > state.whave) {
  39175. if (state.sane) {
  39176. strm.msg = 'invalid distance too far back';
  39177. state.mode = BAD;
  39178. break;
  39179. }
  39180. // (!) This block is disabled in zlib defailts,
  39181. // don't enable it for binary compatibility
  39182. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  39183. // Trace((stderr, "inflate.c too far\n"));
  39184. // copy -= state.whave;
  39185. // if (copy > state.length) { copy = state.length; }
  39186. // if (copy > left) { copy = left; }
  39187. // left -= copy;
  39188. // state.length -= copy;
  39189. // do {
  39190. // output[put++] = 0;
  39191. // } while (--copy);
  39192. // if (state.length === 0) { state.mode = LEN; }
  39193. // break;
  39194. //#endif
  39195. }
  39196. if (copy > state.wnext) {
  39197. copy -= state.wnext;
  39198. from = state.wsize - copy;
  39199. }
  39200. else {
  39201. from = state.wnext - copy;
  39202. }
  39203. if (copy > state.length) { copy = state.length; }
  39204. from_source = state.window;
  39205. }
  39206. else { /* copy from output */
  39207. from_source = output;
  39208. from = put - state.offset;
  39209. copy = state.length;
  39210. }
  39211. if (copy > left) { copy = left; }
  39212. left -= copy;
  39213. state.length -= copy;
  39214. do {
  39215. output[put++] = from_source[from++];
  39216. } while (--copy);
  39217. if (state.length === 0) { state.mode = LEN; }
  39218. break;
  39219. case LIT:
  39220. if (left === 0) { break inf_leave; }
  39221. output[put++] = state.length;
  39222. left--;
  39223. state.mode = LEN;
  39224. break;
  39225. case CHECK:
  39226. if (state.wrap) {
  39227. //=== NEEDBITS(32);
  39228. while (bits < 32) {
  39229. if (have === 0) { break inf_leave; }
  39230. have--;
  39231. // Use '|' insdead of '+' to make sure that result is signed
  39232. hold |= input[next++] << bits;
  39233. bits += 8;
  39234. }
  39235. //===//
  39236. _out -= left;
  39237. strm.total_out += _out;
  39238. state.total += _out;
  39239. if (_out) {
  39240. strm.adler = state.check =
  39241. /*UPDATE(state.check, put - _out, _out);*/
  39242. (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
  39243. }
  39244. _out = left;
  39245. // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
  39246. if ((state.flags ? hold : zswap32(hold)) !== state.check) {
  39247. strm.msg = 'incorrect data check';
  39248. state.mode = BAD;
  39249. break;
  39250. }
  39251. //=== INITBITS();
  39252. hold = 0;
  39253. bits = 0;
  39254. //===//
  39255. //Tracev((stderr, "inflate: check matches trailer\n"));
  39256. }
  39257. state.mode = LENGTH;
  39258. /* falls through */
  39259. case LENGTH:
  39260. if (state.wrap && state.flags) {
  39261. //=== NEEDBITS(32);
  39262. while (bits < 32) {
  39263. if (have === 0) { break inf_leave; }
  39264. have--;
  39265. hold += input[next++] << bits;
  39266. bits += 8;
  39267. }
  39268. //===//
  39269. if (hold !== (state.total & 0xffffffff)) {
  39270. strm.msg = 'incorrect length check';
  39271. state.mode = BAD;
  39272. break;
  39273. }
  39274. //=== INITBITS();
  39275. hold = 0;
  39276. bits = 0;
  39277. //===//
  39278. //Tracev((stderr, "inflate: length matches trailer\n"));
  39279. }
  39280. state.mode = DONE;
  39281. /* falls through */
  39282. case DONE:
  39283. ret = Z_STREAM_END;
  39284. break inf_leave;
  39285. case BAD:
  39286. ret = Z_DATA_ERROR;
  39287. break inf_leave;
  39288. case MEM:
  39289. return Z_MEM_ERROR;
  39290. case SYNC:
  39291. /* falls through */
  39292. default:
  39293. return Z_STREAM_ERROR;
  39294. }
  39295. }
  39296. // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
  39297. /*
  39298. Return from inflate(), updating the total counts and the check value.
  39299. If there was no progress during the inflate() call, return a buffer
  39300. error. Call updatewindow() to create and/or update the window state.
  39301. Note: a memory error from inflate() is non-recoverable.
  39302. */
  39303. //--- RESTORE() ---
  39304. strm.next_out = put;
  39305. strm.avail_out = left;
  39306. strm.next_in = next;
  39307. strm.avail_in = have;
  39308. state.hold = hold;
  39309. state.bits = bits;
  39310. //---
  39311. if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
  39312. (state.mode < CHECK || flush !== Z_FINISH))) {
  39313. if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
  39314. state.mode = MEM;
  39315. return Z_MEM_ERROR;
  39316. }
  39317. }
  39318. _in -= strm.avail_in;
  39319. _out -= strm.avail_out;
  39320. strm.total_in += _in;
  39321. strm.total_out += _out;
  39322. state.total += _out;
  39323. if (state.wrap && _out) {
  39324. strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
  39325. (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
  39326. }
  39327. strm.data_type = state.bits + (state.last ? 64 : 0) +
  39328. (state.mode === TYPE ? 128 : 0) +
  39329. (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
  39330. if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
  39331. ret = Z_BUF_ERROR;
  39332. }
  39333. return ret;
  39334. }
  39335. function inflateEnd(strm) {
  39336. if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
  39337. return Z_STREAM_ERROR;
  39338. }
  39339. var state = strm.state;
  39340. if (state.window) {
  39341. state.window = null;
  39342. }
  39343. strm.state = null;
  39344. return Z_OK;
  39345. }
  39346. function inflateGetHeader(strm, head) {
  39347. var state;
  39348. /* check state */
  39349. if (!strm || !strm.state) { return Z_STREAM_ERROR; }
  39350. state = strm.state;
  39351. if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
  39352. /* save header structure */
  39353. state.head = head;
  39354. head.done = false;
  39355. return Z_OK;
  39356. }
  39357. function inflateSetDictionary(strm, dictionary) {
  39358. var dictLength = dictionary.length;
  39359. var state;
  39360. var dictid;
  39361. var ret;
  39362. /* check state */
  39363. if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
  39364. state = strm.state;
  39365. if (state.wrap !== 0 && state.mode !== DICT) {
  39366. return Z_STREAM_ERROR;
  39367. }
  39368. /* check for correct dictionary identifier */
  39369. if (state.mode === DICT) {
  39370. dictid = 1; /* adler32(0, null, 0)*/
  39371. /* dictid = adler32(dictid, dictionary, dictLength); */
  39372. dictid = adler32(dictid, dictionary, dictLength, 0);
  39373. if (dictid !== state.check) {
  39374. return Z_DATA_ERROR;
  39375. }
  39376. }
  39377. /* copy dictionary to window using updatewindow(), which will amend the
  39378. existing dictionary if appropriate */
  39379. ret = updatewindow(strm, dictionary, dictLength, dictLength);
  39380. if (ret) {
  39381. state.mode = MEM;
  39382. return Z_MEM_ERROR;
  39383. }
  39384. state.havedict = 1;
  39385. // Tracev((stderr, "inflate: dictionary set\n"));
  39386. return Z_OK;
  39387. }
  39388. exports.inflateReset = inflateReset;
  39389. exports.inflateReset2 = inflateReset2;
  39390. exports.inflateResetKeep = inflateResetKeep;
  39391. exports.inflateInit = inflateInit;
  39392. exports.inflateInit2 = inflateInit2;
  39393. exports.inflate = inflate;
  39394. exports.inflateEnd = inflateEnd;
  39395. exports.inflateGetHeader = inflateGetHeader;
  39396. exports.inflateSetDictionary = inflateSetDictionary;
  39397. exports.inflateInfo = 'pako inflate (from Nodeca project)';
  39398. /* Not implemented
  39399. exports.inflateCopy = inflateCopy;
  39400. exports.inflateGetDictionary = inflateGetDictionary;
  39401. exports.inflateMark = inflateMark;
  39402. exports.inflatePrime = inflatePrime;
  39403. exports.inflateSync = inflateSync;
  39404. exports.inflateSyncPoint = inflateSyncPoint;
  39405. exports.inflateUndermine = inflateUndermine;
  39406. */
  39407. /***/ }),
  39408. /* 69 */
  39409. /***/ (function(module, exports) {
  39410. 'use strict';
  39411. // See state defs from inflate.js
  39412. var BAD = 30; /* got a data error -- remain here until reset */
  39413. var TYPE = 12; /* i: waiting for type bits, including last-flag bit */
  39414. /*
  39415. Decode literal, length, and distance codes and write out the resulting
  39416. literal and match bytes until either not enough input or output is
  39417. available, an end-of-block is encountered, or a data error is encountered.
  39418. When large enough input and output buffers are supplied to inflate(), for
  39419. example, a 16K input buffer and a 64K output buffer, more than 95% of the
  39420. inflate execution time is spent in this routine.
  39421. Entry assumptions:
  39422. state.mode === LEN
  39423. strm.avail_in >= 6
  39424. strm.avail_out >= 258
  39425. start >= strm.avail_out
  39426. state.bits < 8
  39427. On return, state.mode is one of:
  39428. LEN -- ran out of enough output space or enough available input
  39429. TYPE -- reached end of block code, inflate() to interpret next block
  39430. BAD -- error in block data
  39431. Notes:
  39432. - The maximum input bits used by a length/distance pair is 15 bits for the
  39433. length code, 5 bits for the length extra, 15 bits for the distance code,
  39434. and 13 bits for the distance extra. This totals 48 bits, or six bytes.
  39435. Therefore if strm.avail_in >= 6, then there is enough input to avoid
  39436. checking for available input while decoding.
  39437. - The maximum bytes that a single length/distance pair can output is 258
  39438. bytes, which is the maximum length that can be coded. inflate_fast()
  39439. requires strm.avail_out >= 258 for each loop to avoid checking for
  39440. output space.
  39441. */
  39442. module.exports = function inflate_fast(strm, start) {
  39443. var state;
  39444. var _in; /* local strm.input */
  39445. var last; /* have enough input while in < last */
  39446. var _out; /* local strm.output */
  39447. var beg; /* inflate()'s initial strm.output */
  39448. var end; /* while out < end, enough space available */
  39449. //#ifdef INFLATE_STRICT
  39450. var dmax; /* maximum distance from zlib header */
  39451. //#endif
  39452. var wsize; /* window size or zero if not using window */
  39453. var whave; /* valid bytes in the window */
  39454. var wnext; /* window write index */
  39455. // Use `s_window` instead `window`, avoid conflict with instrumentation tools
  39456. var s_window; /* allocated sliding window, if wsize != 0 */
  39457. var hold; /* local strm.hold */
  39458. var bits; /* local strm.bits */
  39459. var lcode; /* local strm.lencode */
  39460. var dcode; /* local strm.distcode */
  39461. var lmask; /* mask for first level of length codes */
  39462. var dmask; /* mask for first level of distance codes */
  39463. var here; /* retrieved table entry */
  39464. var op; /* code bits, operation, extra bits, or */
  39465. /* window position, window bytes to copy */
  39466. var len; /* match length, unused bytes */
  39467. var dist; /* match distance */
  39468. var from; /* where to copy match from */
  39469. var from_source;
  39470. var input, output; // JS specific, because we have no pointers
  39471. /* copy state to local variables */
  39472. state = strm.state;
  39473. //here = state.here;
  39474. _in = strm.next_in;
  39475. input = strm.input;
  39476. last = _in + (strm.avail_in - 5);
  39477. _out = strm.next_out;
  39478. output = strm.output;
  39479. beg = _out - (start - strm.avail_out);
  39480. end = _out + (strm.avail_out - 257);
  39481. //#ifdef INFLATE_STRICT
  39482. dmax = state.dmax;
  39483. //#endif
  39484. wsize = state.wsize;
  39485. whave = state.whave;
  39486. wnext = state.wnext;
  39487. s_window = state.window;
  39488. hold = state.hold;
  39489. bits = state.bits;
  39490. lcode = state.lencode;
  39491. dcode = state.distcode;
  39492. lmask = (1 << state.lenbits) - 1;
  39493. dmask = (1 << state.distbits) - 1;
  39494. /* decode literals and length/distances until end-of-block or not enough
  39495. input data or output space */
  39496. top:
  39497. do {
  39498. if (bits < 15) {
  39499. hold += input[_in++] << bits;
  39500. bits += 8;
  39501. hold += input[_in++] << bits;
  39502. bits += 8;
  39503. }
  39504. here = lcode[hold & lmask];
  39505. dolen:
  39506. for (;;) { // Goto emulation
  39507. op = here >>> 24/*here.bits*/;
  39508. hold >>>= op;
  39509. bits -= op;
  39510. op = (here >>> 16) & 0xff/*here.op*/;
  39511. if (op === 0) { /* literal */
  39512. //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
  39513. // "inflate: literal '%c'\n" :
  39514. // "inflate: literal 0x%02x\n", here.val));
  39515. output[_out++] = here & 0xffff/*here.val*/;
  39516. }
  39517. else if (op & 16) { /* length base */
  39518. len = here & 0xffff/*here.val*/;
  39519. op &= 15; /* number of extra bits */
  39520. if (op) {
  39521. if (bits < op) {
  39522. hold += input[_in++] << bits;
  39523. bits += 8;
  39524. }
  39525. len += hold & ((1 << op) - 1);
  39526. hold >>>= op;
  39527. bits -= op;
  39528. }
  39529. //Tracevv((stderr, "inflate: length %u\n", len));
  39530. if (bits < 15) {
  39531. hold += input[_in++] << bits;
  39532. bits += 8;
  39533. hold += input[_in++] << bits;
  39534. bits += 8;
  39535. }
  39536. here = dcode[hold & dmask];
  39537. dodist:
  39538. for (;;) { // goto emulation
  39539. op = here >>> 24/*here.bits*/;
  39540. hold >>>= op;
  39541. bits -= op;
  39542. op = (here >>> 16) & 0xff/*here.op*/;
  39543. if (op & 16) { /* distance base */
  39544. dist = here & 0xffff/*here.val*/;
  39545. op &= 15; /* number of extra bits */
  39546. if (bits < op) {
  39547. hold += input[_in++] << bits;
  39548. bits += 8;
  39549. if (bits < op) {
  39550. hold += input[_in++] << bits;
  39551. bits += 8;
  39552. }
  39553. }
  39554. dist += hold & ((1 << op) - 1);
  39555. //#ifdef INFLATE_STRICT
  39556. if (dist > dmax) {
  39557. strm.msg = 'invalid distance too far back';
  39558. state.mode = BAD;
  39559. break top;
  39560. }
  39561. //#endif
  39562. hold >>>= op;
  39563. bits -= op;
  39564. //Tracevv((stderr, "inflate: distance %u\n", dist));
  39565. op = _out - beg; /* max distance in output */
  39566. if (dist > op) { /* see if copy from window */
  39567. op = dist - op; /* distance back in window */
  39568. if (op > whave) {
  39569. if (state.sane) {
  39570. strm.msg = 'invalid distance too far back';
  39571. state.mode = BAD;
  39572. break top;
  39573. }
  39574. // (!) This block is disabled in zlib defailts,
  39575. // don't enable it for binary compatibility
  39576. //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
  39577. // if (len <= op - whave) {
  39578. // do {
  39579. // output[_out++] = 0;
  39580. // } while (--len);
  39581. // continue top;
  39582. // }
  39583. // len -= op - whave;
  39584. // do {
  39585. // output[_out++] = 0;
  39586. // } while (--op > whave);
  39587. // if (op === 0) {
  39588. // from = _out - dist;
  39589. // do {
  39590. // output[_out++] = output[from++];
  39591. // } while (--len);
  39592. // continue top;
  39593. // }
  39594. //#endif
  39595. }
  39596. from = 0; // window index
  39597. from_source = s_window;
  39598. if (wnext === 0) { /* very common case */
  39599. from += wsize - op;
  39600. if (op < len) { /* some from window */
  39601. len -= op;
  39602. do {
  39603. output[_out++] = s_window[from++];
  39604. } while (--op);
  39605. from = _out - dist; /* rest from output */
  39606. from_source = output;
  39607. }
  39608. }
  39609. else if (wnext < op) { /* wrap around window */
  39610. from += wsize + wnext - op;
  39611. op -= wnext;
  39612. if (op < len) { /* some from end of window */
  39613. len -= op;
  39614. do {
  39615. output[_out++] = s_window[from++];
  39616. } while (--op);
  39617. from = 0;
  39618. if (wnext < len) { /* some from start of window */
  39619. op = wnext;
  39620. len -= op;
  39621. do {
  39622. output[_out++] = s_window[from++];
  39623. } while (--op);
  39624. from = _out - dist; /* rest from output */
  39625. from_source = output;
  39626. }
  39627. }
  39628. }
  39629. else { /* contiguous in window */
  39630. from += wnext - op;
  39631. if (op < len) { /* some from window */
  39632. len -= op;
  39633. do {
  39634. output[_out++] = s_window[from++];
  39635. } while (--op);
  39636. from = _out - dist; /* rest from output */
  39637. from_source = output;
  39638. }
  39639. }
  39640. while (len > 2) {
  39641. output[_out++] = from_source[from++];
  39642. output[_out++] = from_source[from++];
  39643. output[_out++] = from_source[from++];
  39644. len -= 3;
  39645. }
  39646. if (len) {
  39647. output[_out++] = from_source[from++];
  39648. if (len > 1) {
  39649. output[_out++] = from_source[from++];
  39650. }
  39651. }
  39652. }
  39653. else {
  39654. from = _out - dist; /* copy direct from output */
  39655. do { /* minimum length is three */
  39656. output[_out++] = output[from++];
  39657. output[_out++] = output[from++];
  39658. output[_out++] = output[from++];
  39659. len -= 3;
  39660. } while (len > 2);
  39661. if (len) {
  39662. output[_out++] = output[from++];
  39663. if (len > 1) {
  39664. output[_out++] = output[from++];
  39665. }
  39666. }
  39667. }
  39668. }
  39669. else if ((op & 64) === 0) { /* 2nd level distance code */
  39670. here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  39671. continue dodist;
  39672. }
  39673. else {
  39674. strm.msg = 'invalid distance code';
  39675. state.mode = BAD;
  39676. break top;
  39677. }
  39678. break; // need to emulate goto via "continue"
  39679. }
  39680. }
  39681. else if ((op & 64) === 0) { /* 2nd level length code */
  39682. here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
  39683. continue dolen;
  39684. }
  39685. else if (op & 32) { /* end-of-block */
  39686. //Tracevv((stderr, "inflate: end of block\n"));
  39687. state.mode = TYPE;
  39688. break top;
  39689. }
  39690. else {
  39691. strm.msg = 'invalid literal/length code';
  39692. state.mode = BAD;
  39693. break top;
  39694. }
  39695. break; // need to emulate goto via "continue"
  39696. }
  39697. } while (_in < last && _out < end);
  39698. /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
  39699. len = bits >> 3;
  39700. _in -= len;
  39701. bits -= len << 3;
  39702. hold &= (1 << bits) - 1;
  39703. /* update state and return */
  39704. strm.next_in = _in;
  39705. strm.next_out = _out;
  39706. strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
  39707. strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
  39708. state.hold = hold;
  39709. state.bits = bits;
  39710. return;
  39711. };
  39712. /***/ }),
  39713. /* 70 */
  39714. /***/ (function(module, exports, __webpack_require__) {
  39715. 'use strict';
  39716. var utils = __webpack_require__(64);
  39717. var MAXBITS = 15;
  39718. var ENOUGH_LENS = 852;
  39719. var ENOUGH_DISTS = 592;
  39720. //var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
  39721. var CODES = 0;
  39722. var LENS = 1;
  39723. var DISTS = 2;
  39724. var lbase = [ /* Length codes 257..285 base */
  39725. 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
  39726. 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
  39727. ];
  39728. var lext = [ /* Length codes 257..285 extra */
  39729. 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
  39730. 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
  39731. ];
  39732. var dbase = [ /* Distance codes 0..29 base */
  39733. 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
  39734. 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
  39735. 8193, 12289, 16385, 24577, 0, 0
  39736. ];
  39737. var dext = [ /* Distance codes 0..29 extra */
  39738. 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
  39739. 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
  39740. 28, 28, 29, 29, 64, 64
  39741. ];
  39742. module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
  39743. {
  39744. var bits = opts.bits;
  39745. //here = opts.here; /* table entry for duplication */
  39746. var len = 0; /* a code's length in bits */
  39747. var sym = 0; /* index of code symbols */
  39748. var min = 0, max = 0; /* minimum and maximum code lengths */
  39749. var root = 0; /* number of index bits for root table */
  39750. var curr = 0; /* number of index bits for current table */
  39751. var drop = 0; /* code bits to drop for sub-table */
  39752. var left = 0; /* number of prefix codes available */
  39753. var used = 0; /* code entries in table used */
  39754. var huff = 0; /* Huffman code */
  39755. var incr; /* for incrementing code, index */
  39756. var fill; /* index for replicating entries */
  39757. var low; /* low bits for current root entry */
  39758. var mask; /* mask for low root bits */
  39759. var next; /* next available space in table */
  39760. var base = null; /* base value table to use */
  39761. var base_index = 0;
  39762. // var shoextra; /* extra bits table to use */
  39763. var end; /* use base and extra for symbol > end */
  39764. var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */
  39765. var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */
  39766. var extra = null;
  39767. var extra_index = 0;
  39768. var here_bits, here_op, here_val;
  39769. /*
  39770. Process a set of code lengths to create a canonical Huffman code. The
  39771. code lengths are lens[0..codes-1]. Each length corresponds to the
  39772. symbols 0..codes-1. The Huffman code is generated by first sorting the
  39773. symbols by length from short to long, and retaining the symbol order
  39774. for codes with equal lengths. Then the code starts with all zero bits
  39775. for the first code of the shortest length, and the codes are integer
  39776. increments for the same length, and zeros are appended as the length
  39777. increases. For the deflate format, these bits are stored backwards
  39778. from their more natural integer increment ordering, and so when the
  39779. decoding tables are built in the large loop below, the integer codes
  39780. are incremented backwards.
  39781. This routine assumes, but does not check, that all of the entries in
  39782. lens[] are in the range 0..MAXBITS. The caller must assure this.
  39783. 1..MAXBITS is interpreted as that code length. zero means that that
  39784. symbol does not occur in this code.
  39785. The codes are sorted by computing a count of codes for each length,
  39786. creating from that a table of starting indices for each length in the
  39787. sorted table, and then entering the symbols in order in the sorted
  39788. table. The sorted table is work[], with that space being provided by
  39789. the caller.
  39790. The length counts are used for other purposes as well, i.e. finding
  39791. the minimum and maximum length codes, determining if there are any
  39792. codes at all, checking for a valid set of lengths, and looking ahead
  39793. at length counts to determine sub-table sizes when building the
  39794. decoding tables.
  39795. */
  39796. /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
  39797. for (len = 0; len <= MAXBITS; len++) {
  39798. count[len] = 0;
  39799. }
  39800. for (sym = 0; sym < codes; sym++) {
  39801. count[lens[lens_index + sym]]++;
  39802. }
  39803. /* bound code lengths, force root to be within code lengths */
  39804. root = bits;
  39805. for (max = MAXBITS; max >= 1; max--) {
  39806. if (count[max] !== 0) { break; }
  39807. }
  39808. if (root > max) {
  39809. root = max;
  39810. }
  39811. if (max === 0) { /* no symbols to code at all */
  39812. //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */
  39813. //table.bits[opts.table_index] = 1; //here.bits = (var char)1;
  39814. //table.val[opts.table_index++] = 0; //here.val = (var short)0;
  39815. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  39816. //table.op[opts.table_index] = 64;
  39817. //table.bits[opts.table_index] = 1;
  39818. //table.val[opts.table_index++] = 0;
  39819. table[table_index++] = (1 << 24) | (64 << 16) | 0;
  39820. opts.bits = 1;
  39821. return 0; /* no symbols, but wait for decoding to report error */
  39822. }
  39823. for (min = 1; min < max; min++) {
  39824. if (count[min] !== 0) { break; }
  39825. }
  39826. if (root < min) {
  39827. root = min;
  39828. }
  39829. /* check for an over-subscribed or incomplete set of lengths */
  39830. left = 1;
  39831. for (len = 1; len <= MAXBITS; len++) {
  39832. left <<= 1;
  39833. left -= count[len];
  39834. if (left < 0) {
  39835. return -1;
  39836. } /* over-subscribed */
  39837. }
  39838. if (left > 0 && (type === CODES || max !== 1)) {
  39839. return -1; /* incomplete set */
  39840. }
  39841. /* generate offsets into symbol table for each length for sorting */
  39842. offs[1] = 0;
  39843. for (len = 1; len < MAXBITS; len++) {
  39844. offs[len + 1] = offs[len] + count[len];
  39845. }
  39846. /* sort symbols by length, by symbol order within each length */
  39847. for (sym = 0; sym < codes; sym++) {
  39848. if (lens[lens_index + sym] !== 0) {
  39849. work[offs[lens[lens_index + sym]]++] = sym;
  39850. }
  39851. }
  39852. /*
  39853. Create and fill in decoding tables. In this loop, the table being
  39854. filled is at next and has curr index bits. The code being used is huff
  39855. with length len. That code is converted to an index by dropping drop
  39856. bits off of the bottom. For codes where len is less than drop + curr,
  39857. those top drop + curr - len bits are incremented through all values to
  39858. fill the table with replicated entries.
  39859. root is the number of index bits for the root table. When len exceeds
  39860. root, sub-tables are created pointed to by the root entry with an index
  39861. of the low root bits of huff. This is saved in low to check for when a
  39862. new sub-table should be started. drop is zero when the root table is
  39863. being filled, and drop is root when sub-tables are being filled.
  39864. When a new sub-table is needed, it is necessary to look ahead in the
  39865. code lengths to determine what size sub-table is needed. The length
  39866. counts are used for this, and so count[] is decremented as codes are
  39867. entered in the tables.
  39868. used keeps track of how many table entries have been allocated from the
  39869. provided *table space. It is checked for LENS and DIST tables against
  39870. the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
  39871. the initial root table size constants. See the comments in inftrees.h
  39872. for more information.
  39873. sym increments through all symbols, and the loop terminates when
  39874. all codes of length max, i.e. all codes, have been processed. This
  39875. routine permits incomplete codes, so another loop after this one fills
  39876. in the rest of the decoding tables with invalid code markers.
  39877. */
  39878. /* set up for code type */
  39879. // poor man optimization - use if-else instead of switch,
  39880. // to avoid deopts in old v8
  39881. if (type === CODES) {
  39882. base = extra = work; /* dummy value--not used */
  39883. end = 19;
  39884. } else if (type === LENS) {
  39885. base = lbase;
  39886. base_index -= 257;
  39887. extra = lext;
  39888. extra_index -= 257;
  39889. end = 256;
  39890. } else { /* DISTS */
  39891. base = dbase;
  39892. extra = dext;
  39893. end = -1;
  39894. }
  39895. /* initialize opts for loop */
  39896. huff = 0; /* starting code */
  39897. sym = 0; /* starting code symbol */
  39898. len = min; /* starting code length */
  39899. next = table_index; /* current table to fill in */
  39900. curr = root; /* current table index bits */
  39901. drop = 0; /* current bits to drop from code for index */
  39902. low = -1; /* trigger new sub-table when len > root */
  39903. used = 1 << root; /* use root table entries */
  39904. mask = used - 1; /* mask for comparing low */
  39905. /* check available table space */
  39906. if ((type === LENS && used > ENOUGH_LENS) ||
  39907. (type === DISTS && used > ENOUGH_DISTS)) {
  39908. return 1;
  39909. }
  39910. var i = 0;
  39911. /* process all codes and make table entries */
  39912. for (;;) {
  39913. i++;
  39914. /* create table entry */
  39915. here_bits = len - drop;
  39916. if (work[sym] < end) {
  39917. here_op = 0;
  39918. here_val = work[sym];
  39919. }
  39920. else if (work[sym] > end) {
  39921. here_op = extra[extra_index + work[sym]];
  39922. here_val = base[base_index + work[sym]];
  39923. }
  39924. else {
  39925. here_op = 32 + 64; /* end of block */
  39926. here_val = 0;
  39927. }
  39928. /* replicate for those indices with low len bits equal to huff */
  39929. incr = 1 << (len - drop);
  39930. fill = 1 << curr;
  39931. min = fill; /* save offset to next table */
  39932. do {
  39933. fill -= incr;
  39934. table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
  39935. } while (fill !== 0);
  39936. /* backwards increment the len-bit code huff */
  39937. incr = 1 << (len - 1);
  39938. while (huff & incr) {
  39939. incr >>= 1;
  39940. }
  39941. if (incr !== 0) {
  39942. huff &= incr - 1;
  39943. huff += incr;
  39944. } else {
  39945. huff = 0;
  39946. }
  39947. /* go to next symbol, update count, len */
  39948. sym++;
  39949. if (--count[len] === 0) {
  39950. if (len === max) { break; }
  39951. len = lens[lens_index + work[sym]];
  39952. }
  39953. /* create new sub-table if needed */
  39954. if (len > root && (huff & mask) !== low) {
  39955. /* if first time, transition to sub-tables */
  39956. if (drop === 0) {
  39957. drop = root;
  39958. }
  39959. /* increment past last table */
  39960. next += min; /* here min is 1 << curr */
  39961. /* determine length of next table */
  39962. curr = len - drop;
  39963. left = 1 << curr;
  39964. while (curr + drop < max) {
  39965. left -= count[curr + drop];
  39966. if (left <= 0) { break; }
  39967. curr++;
  39968. left <<= 1;
  39969. }
  39970. /* check for enough space */
  39971. used += 1 << curr;
  39972. if ((type === LENS && used > ENOUGH_LENS) ||
  39973. (type === DISTS && used > ENOUGH_DISTS)) {
  39974. return 1;
  39975. }
  39976. /* point entry in root table to sub-table */
  39977. low = huff & mask;
  39978. /*table.op[low] = curr;
  39979. table.bits[low] = root;
  39980. table.val[low] = next - opts.table_index;*/
  39981. table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
  39982. }
  39983. }
  39984. /* fill in remaining table entry if code is incomplete (guaranteed to have
  39985. at most one remaining entry, since if the code is incomplete, the
  39986. maximum code length that was allowed to get this far is one bit) */
  39987. if (huff !== 0) {
  39988. //table.op[next + huff] = 64; /* invalid code marker */
  39989. //table.bits[next + huff] = len - drop;
  39990. //table.val[next + huff] = 0;
  39991. table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
  39992. }
  39993. /* set return parameters */
  39994. //opts.table_index += used;
  39995. opts.bits = root;
  39996. return 0;
  39997. };
  39998. /***/ }),
  39999. /* 71 */
  40000. /***/ (function(module, exports) {
  40001. 'use strict';
  40002. module.exports = {
  40003. /* Allowed flush values; see deflate() and inflate() below for details */
  40004. Z_NO_FLUSH: 0,
  40005. Z_PARTIAL_FLUSH: 1,
  40006. Z_SYNC_FLUSH: 2,
  40007. Z_FULL_FLUSH: 3,
  40008. Z_FINISH: 4,
  40009. Z_BLOCK: 5,
  40010. Z_TREES: 6,
  40011. /* Return codes for the compression/decompression functions. Negative values
  40012. * are errors, positive values are used for special but normal events.
  40013. */
  40014. Z_OK: 0,
  40015. Z_STREAM_END: 1,
  40016. Z_NEED_DICT: 2,
  40017. Z_ERRNO: -1,
  40018. Z_STREAM_ERROR: -2,
  40019. Z_DATA_ERROR: -3,
  40020. //Z_MEM_ERROR: -4,
  40021. Z_BUF_ERROR: -5,
  40022. //Z_VERSION_ERROR: -6,
  40023. /* compression levels */
  40024. Z_NO_COMPRESSION: 0,
  40025. Z_BEST_SPEED: 1,
  40026. Z_BEST_COMPRESSION: 9,
  40027. Z_DEFAULT_COMPRESSION: -1,
  40028. Z_FILTERED: 1,
  40029. Z_HUFFMAN_ONLY: 2,
  40030. Z_RLE: 3,
  40031. Z_FIXED: 4,
  40032. Z_DEFAULT_STRATEGY: 0,
  40033. /* Possible values of the data_type field (though see inflate()) */
  40034. Z_BINARY: 0,
  40035. Z_TEXT: 1,
  40036. //Z_ASCII: 1, // = Z_TEXT (deprecated)
  40037. Z_UNKNOWN: 2,
  40038. /* The deflate compression method */
  40039. Z_DEFLATED: 8
  40040. //Z_NULL: null // Use -1 or null inline, depending on var type
  40041. };
  40042. /***/ }),
  40043. /* 72 */
  40044. /***/ (function(module, exports, __webpack_require__) {
  40045. /* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
  40046. //
  40047. // Permission is hereby granted, free of charge, to any person obtaining a
  40048. // copy of this software and associated documentation files (the
  40049. // "Software"), to deal in the Software without restriction, including
  40050. // without limitation the rights to use, copy, modify, merge, publish,
  40051. // distribute, sublicense, and/or sell copies of the Software, and to permit
  40052. // persons to whom the Software is furnished to do so, subject to the
  40053. // following conditions:
  40054. //
  40055. // The above copyright notice and this permission notice shall be included
  40056. // in all copies or substantial portions of the Software.
  40057. //
  40058. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  40059. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  40060. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  40061. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  40062. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  40063. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  40064. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  40065. var formatRegExp = /%[sdj%]/g;
  40066. exports.format = function(f) {
  40067. if (!isString(f)) {
  40068. var objects = [];
  40069. for (var i = 0; i < arguments.length; i++) {
  40070. objects.push(inspect(arguments[i]));
  40071. }
  40072. return objects.join(' ');
  40073. }
  40074. var i = 1;
  40075. var args = arguments;
  40076. var len = args.length;
  40077. var str = String(f).replace(formatRegExp, function(x) {
  40078. if (x === '%%') return '%';
  40079. if (i >= len) return x;
  40080. switch (x) {
  40081. case '%s': return String(args[i++]);
  40082. case '%d': return Number(args[i++]);
  40083. case '%j':
  40084. try {
  40085. return JSON.stringify(args[i++]);
  40086. } catch (_) {
  40087. return '[Circular]';
  40088. }
  40089. default:
  40090. return x;
  40091. }
  40092. });
  40093. for (var x = args[i]; i < len; x = args[++i]) {
  40094. if (isNull(x) || !isObject(x)) {
  40095. str += ' ' + x;
  40096. } else {
  40097. str += ' ' + inspect(x);
  40098. }
  40099. }
  40100. return str;
  40101. };
  40102. // Mark that a method should not be used.
  40103. // Returns a modified function which warns once by default.
  40104. // If --no-deprecation is set, then it is a no-op.
  40105. exports.deprecate = function(fn, msg) {
  40106. // Allow for deprecating things in the process of starting up.
  40107. if (isUndefined(global.process)) {
  40108. return function() {
  40109. return exports.deprecate(fn, msg).apply(this, arguments);
  40110. };
  40111. }
  40112. if (process.noDeprecation === true) {
  40113. return fn;
  40114. }
  40115. var warned = false;
  40116. function deprecated() {
  40117. if (!warned) {
  40118. if (process.throwDeprecation) {
  40119. throw new Error(msg);
  40120. } else if (process.traceDeprecation) {
  40121. console.trace(msg);
  40122. } else {
  40123. console.error(msg);
  40124. }
  40125. warned = true;
  40126. }
  40127. return fn.apply(this, arguments);
  40128. }
  40129. return deprecated;
  40130. };
  40131. var debugs = {};
  40132. var debugEnviron;
  40133. exports.debuglog = function(set) {
  40134. if (isUndefined(debugEnviron))
  40135. debugEnviron = process.env.NODE_DEBUG || '';
  40136. set = set.toUpperCase();
  40137. if (!debugs[set]) {
  40138. if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
  40139. var pid = process.pid;
  40140. debugs[set] = function() {
  40141. var msg = exports.format.apply(exports, arguments);
  40142. console.error('%s %d: %s', set, pid, msg);
  40143. };
  40144. } else {
  40145. debugs[set] = function() {};
  40146. }
  40147. }
  40148. return debugs[set];
  40149. };
  40150. /**
  40151. * Echos the value of a value. Trys to print the value out
  40152. * in the best way possible given the different types.
  40153. *
  40154. * @param {Object} obj The object to print out.
  40155. * @param {Object} opts Optional options object that alters the output.
  40156. */
  40157. /* legacy: obj, showHidden, depth, colors*/
  40158. function inspect(obj, opts) {
  40159. // default options
  40160. var ctx = {
  40161. seen: [],
  40162. stylize: stylizeNoColor
  40163. };
  40164. // legacy...
  40165. if (arguments.length >= 3) ctx.depth = arguments[2];
  40166. if (arguments.length >= 4) ctx.colors = arguments[3];
  40167. if (isBoolean(opts)) {
  40168. // legacy...
  40169. ctx.showHidden = opts;
  40170. } else if (opts) {
  40171. // got an "options" object
  40172. exports._extend(ctx, opts);
  40173. }
  40174. // set default options
  40175. if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
  40176. if (isUndefined(ctx.depth)) ctx.depth = 2;
  40177. if (isUndefined(ctx.colors)) ctx.colors = false;
  40178. if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
  40179. if (ctx.colors) ctx.stylize = stylizeWithColor;
  40180. return formatValue(ctx, obj, ctx.depth);
  40181. }
  40182. exports.inspect = inspect;
  40183. // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
  40184. inspect.colors = {
  40185. 'bold' : [1, 22],
  40186. 'italic' : [3, 23],
  40187. 'underline' : [4, 24],
  40188. 'inverse' : [7, 27],
  40189. 'white' : [37, 39],
  40190. 'grey' : [90, 39],
  40191. 'black' : [30, 39],
  40192. 'blue' : [34, 39],
  40193. 'cyan' : [36, 39],
  40194. 'green' : [32, 39],
  40195. 'magenta' : [35, 39],
  40196. 'red' : [31, 39],
  40197. 'yellow' : [33, 39]
  40198. };
  40199. // Don't use 'blue' not visible on cmd.exe
  40200. inspect.styles = {
  40201. 'special': 'cyan',
  40202. 'number': 'yellow',
  40203. 'boolean': 'yellow',
  40204. 'undefined': 'grey',
  40205. 'null': 'bold',
  40206. 'string': 'green',
  40207. 'date': 'magenta',
  40208. // "name": intentionally not styling
  40209. 'regexp': 'red'
  40210. };
  40211. function stylizeWithColor(str, styleType) {
  40212. var style = inspect.styles[styleType];
  40213. if (style) {
  40214. return '\u001b[' + inspect.colors[style][0] + 'm' + str +
  40215. '\u001b[' + inspect.colors[style][1] + 'm';
  40216. } else {
  40217. return str;
  40218. }
  40219. }
  40220. function stylizeNoColor(str, styleType) {
  40221. return str;
  40222. }
  40223. function arrayToHash(array) {
  40224. var hash = {};
  40225. array.forEach(function(val, idx) {
  40226. hash[val] = true;
  40227. });
  40228. return hash;
  40229. }
  40230. function formatValue(ctx, value, recurseTimes) {
  40231. // Provide a hook for user-specified inspect functions.
  40232. // Check that value is an object with an inspect function on it
  40233. if (ctx.customInspect &&
  40234. value &&
  40235. isFunction(value.inspect) &&
  40236. // Filter out the util module, it's inspect function is special
  40237. value.inspect !== exports.inspect &&
  40238. // Also filter out any prototype objects using the circular check.
  40239. !(value.constructor && value.constructor.prototype === value)) {
  40240. var ret = value.inspect(recurseTimes, ctx);
  40241. if (!isString(ret)) {
  40242. ret = formatValue(ctx, ret, recurseTimes);
  40243. }
  40244. return ret;
  40245. }
  40246. // Primitive types cannot have properties
  40247. var primitive = formatPrimitive(ctx, value);
  40248. if (primitive) {
  40249. return primitive;
  40250. }
  40251. // Look up the keys of the object.
  40252. var keys = Object.keys(value);
  40253. var visibleKeys = arrayToHash(keys);
  40254. if (ctx.showHidden) {
  40255. keys = Object.getOwnPropertyNames(value);
  40256. }
  40257. // IE doesn't make error fields non-enumerable
  40258. // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
  40259. if (isError(value)
  40260. && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
  40261. return formatError(value);
  40262. }
  40263. // Some type of object without properties can be shortcutted.
  40264. if (keys.length === 0) {
  40265. if (isFunction(value)) {
  40266. var name = value.name ? ': ' + value.name : '';
  40267. return ctx.stylize('[Function' + name + ']', 'special');
  40268. }
  40269. if (isRegExp(value)) {
  40270. return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
  40271. }
  40272. if (isDate(value)) {
  40273. return ctx.stylize(Date.prototype.toString.call(value), 'date');
  40274. }
  40275. if (isError(value)) {
  40276. return formatError(value);
  40277. }
  40278. }
  40279. var base = '', array = false, braces = ['{', '}'];
  40280. // Make Array say that they are Array
  40281. if (isArray(value)) {
  40282. array = true;
  40283. braces = ['[', ']'];
  40284. }
  40285. // Make functions say that they are functions
  40286. if (isFunction(value)) {
  40287. var n = value.name ? ': ' + value.name : '';
  40288. base = ' [Function' + n + ']';
  40289. }
  40290. // Make RegExps say that they are RegExps
  40291. if (isRegExp(value)) {
  40292. base = ' ' + RegExp.prototype.toString.call(value);
  40293. }
  40294. // Make dates with properties first say the date
  40295. if (isDate(value)) {
  40296. base = ' ' + Date.prototype.toUTCString.call(value);
  40297. }
  40298. // Make error with message first say the error
  40299. if (isError(value)) {
  40300. base = ' ' + formatError(value);
  40301. }
  40302. if (keys.length === 0 && (!array || value.length == 0)) {
  40303. return braces[0] + base + braces[1];
  40304. }
  40305. if (recurseTimes < 0) {
  40306. if (isRegExp(value)) {
  40307. return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
  40308. } else {
  40309. return ctx.stylize('[Object]', 'special');
  40310. }
  40311. }
  40312. ctx.seen.push(value);
  40313. var output;
  40314. if (array) {
  40315. output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
  40316. } else {
  40317. output = keys.map(function(key) {
  40318. return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
  40319. });
  40320. }
  40321. ctx.seen.pop();
  40322. return reduceToSingleString(output, base, braces);
  40323. }
  40324. function formatPrimitive(ctx, value) {
  40325. if (isUndefined(value))
  40326. return ctx.stylize('undefined', 'undefined');
  40327. if (isString(value)) {
  40328. var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
  40329. .replace(/'/g, "\\'")
  40330. .replace(/\\"/g, '"') + '\'';
  40331. return ctx.stylize(simple, 'string');
  40332. }
  40333. if (isNumber(value))
  40334. return ctx.stylize('' + value, 'number');
  40335. if (isBoolean(value))
  40336. return ctx.stylize('' + value, 'boolean');
  40337. // For some reason typeof null is "object", so special case here.
  40338. if (isNull(value))
  40339. return ctx.stylize('null', 'null');
  40340. }
  40341. function formatError(value) {
  40342. return '[' + Error.prototype.toString.call(value) + ']';
  40343. }
  40344. function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  40345. var output = [];
  40346. for (var i = 0, l = value.length; i < l; ++i) {
  40347. if (hasOwnProperty(value, String(i))) {
  40348. output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
  40349. String(i), true));
  40350. } else {
  40351. output.push('');
  40352. }
  40353. }
  40354. keys.forEach(function(key) {
  40355. if (!key.match(/^\d+$/)) {
  40356. output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
  40357. key, true));
  40358. }
  40359. });
  40360. return output;
  40361. }
  40362. function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
  40363. var name, str, desc;
  40364. desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
  40365. if (desc.get) {
  40366. if (desc.set) {
  40367. str = ctx.stylize('[Getter/Setter]', 'special');
  40368. } else {
  40369. str = ctx.stylize('[Getter]', 'special');
  40370. }
  40371. } else {
  40372. if (desc.set) {
  40373. str = ctx.stylize('[Setter]', 'special');
  40374. }
  40375. }
  40376. if (!hasOwnProperty(visibleKeys, key)) {
  40377. name = '[' + key + ']';
  40378. }
  40379. if (!str) {
  40380. if (ctx.seen.indexOf(desc.value) < 0) {
  40381. if (isNull(recurseTimes)) {
  40382. str = formatValue(ctx, desc.value, null);
  40383. } else {
  40384. str = formatValue(ctx, desc.value, recurseTimes - 1);
  40385. }
  40386. if (str.indexOf('\n') > -1) {
  40387. if (array) {
  40388. str = str.split('\n').map(function(line) {
  40389. return ' ' + line;
  40390. }).join('\n').substr(2);
  40391. } else {
  40392. str = '\n' + str.split('\n').map(function(line) {
  40393. return ' ' + line;
  40394. }).join('\n');
  40395. }
  40396. }
  40397. } else {
  40398. str = ctx.stylize('[Circular]', 'special');
  40399. }
  40400. }
  40401. if (isUndefined(name)) {
  40402. if (array && key.match(/^\d+$/)) {
  40403. return str;
  40404. }
  40405. name = JSON.stringify('' + key);
  40406. if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
  40407. name = name.substr(1, name.length - 2);
  40408. name = ctx.stylize(name, 'name');
  40409. } else {
  40410. name = name.replace(/'/g, "\\'")
  40411. .replace(/\\"/g, '"')
  40412. .replace(/(^"|"$)/g, "'");
  40413. name = ctx.stylize(name, 'string');
  40414. }
  40415. }
  40416. return name + ': ' + str;
  40417. }
  40418. function reduceToSingleString(output, base, braces) {
  40419. var numLinesEst = 0;
  40420. var length = output.reduce(function(prev, cur) {
  40421. numLinesEst++;
  40422. if (cur.indexOf('\n') >= 0) numLinesEst++;
  40423. return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
  40424. }, 0);
  40425. if (length > 60) {
  40426. return braces[0] +
  40427. (base === '' ? '' : base + '\n ') +
  40428. ' ' +
  40429. output.join(',\n ') +
  40430. ' ' +
  40431. braces[1];
  40432. }
  40433. return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
  40434. }
  40435. // NOTE: These type checking functions intentionally don't use `instanceof`
  40436. // because it is fragile and can be easily faked with `Object.create()`.
  40437. function isArray(ar) {
  40438. return Array.isArray(ar);
  40439. }
  40440. exports.isArray = isArray;
  40441. function isBoolean(arg) {
  40442. return typeof arg === 'boolean';
  40443. }
  40444. exports.isBoolean = isBoolean;
  40445. function isNull(arg) {
  40446. return arg === null;
  40447. }
  40448. exports.isNull = isNull;
  40449. function isNullOrUndefined(arg) {
  40450. return arg == null;
  40451. }
  40452. exports.isNullOrUndefined = isNullOrUndefined;
  40453. function isNumber(arg) {
  40454. return typeof arg === 'number';
  40455. }
  40456. exports.isNumber = isNumber;
  40457. function isString(arg) {
  40458. return typeof arg === 'string';
  40459. }
  40460. exports.isString = isString;
  40461. function isSymbol(arg) {
  40462. return typeof arg === 'symbol';
  40463. }
  40464. exports.isSymbol = isSymbol;
  40465. function isUndefined(arg) {
  40466. return arg === void 0;
  40467. }
  40468. exports.isUndefined = isUndefined;
  40469. function isRegExp(re) {
  40470. return isObject(re) && objectToString(re) === '[object RegExp]';
  40471. }
  40472. exports.isRegExp = isRegExp;
  40473. function isObject(arg) {
  40474. return typeof arg === 'object' && arg !== null;
  40475. }
  40476. exports.isObject = isObject;
  40477. function isDate(d) {
  40478. return isObject(d) && objectToString(d) === '[object Date]';
  40479. }
  40480. exports.isDate = isDate;
  40481. function isError(e) {
  40482. return isObject(e) &&
  40483. (objectToString(e) === '[object Error]' || e instanceof Error);
  40484. }
  40485. exports.isError = isError;
  40486. function isFunction(arg) {
  40487. return typeof arg === 'function';
  40488. }
  40489. exports.isFunction = isFunction;
  40490. function isPrimitive(arg) {
  40491. return arg === null ||
  40492. typeof arg === 'boolean' ||
  40493. typeof arg === 'number' ||
  40494. typeof arg === 'string' ||
  40495. typeof arg === 'symbol' || // ES6 symbol
  40496. typeof arg === 'undefined';
  40497. }
  40498. exports.isPrimitive = isPrimitive;
  40499. exports.isBuffer = __webpack_require__(73);
  40500. function objectToString(o) {
  40501. return Object.prototype.toString.call(o);
  40502. }
  40503. function pad(n) {
  40504. return n < 10 ? '0' + n.toString(10) : n.toString(10);
  40505. }
  40506. var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
  40507. 'Oct', 'Nov', 'Dec'];
  40508. // 26 Feb 16:19:34
  40509. function timestamp() {
  40510. var d = new Date();
  40511. var time = [pad(d.getHours()),
  40512. pad(d.getMinutes()),
  40513. pad(d.getSeconds())].join(':');
  40514. return [d.getDate(), months[d.getMonth()], time].join(' ');
  40515. }
  40516. // log is just a thin wrapper to console.log that prepends a timestamp
  40517. exports.log = function() {
  40518. console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
  40519. };
  40520. /**
  40521. * Inherit the prototype methods from one constructor into another.
  40522. *
  40523. * The Function.prototype.inherits from lang.js rewritten as a standalone
  40524. * function (not on Function.prototype). NOTE: If this file is to be loaded
  40525. * during bootstrapping this function needs to be rewritten using some native
  40526. * functions as prototype setup using normal JavaScript does not work as
  40527. * expected during bootstrapping (see mirror.js in r114903).
  40528. *
  40529. * @param {function} ctor Constructor function which needs to inherit the
  40530. * prototype.
  40531. * @param {function} superCtor Constructor function to inherit prototype from.
  40532. */
  40533. exports.inherits = __webpack_require__(74);
  40534. exports._extend = function(origin, add) {
  40535. // Don't do anything if add isn't an object
  40536. if (!add || !isObject(add)) return origin;
  40537. var keys = Object.keys(add);
  40538. var i = keys.length;
  40539. while (i--) {
  40540. origin[keys[i]] = add[keys[i]];
  40541. }
  40542. return origin;
  40543. };
  40544. function hasOwnProperty(obj, prop) {
  40545. return Object.prototype.hasOwnProperty.call(obj, prop);
  40546. }
  40547. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(36)))
  40548. /***/ }),
  40549. /* 73 */
  40550. /***/ (function(module, exports) {
  40551. module.exports = function isBuffer(arg) {
  40552. return arg && typeof arg === 'object'
  40553. && typeof arg.copy === 'function'
  40554. && typeof arg.fill === 'function'
  40555. && typeof arg.readUInt8 === 'function';
  40556. }
  40557. /***/ }),
  40558. /* 74 */
  40559. /***/ (function(module, exports) {
  40560. if (typeof Object.create === 'function') {
  40561. // implementation from standard node.js 'util' module
  40562. module.exports = function inherits(ctor, superCtor) {
  40563. ctor.super_ = superCtor
  40564. ctor.prototype = Object.create(superCtor.prototype, {
  40565. constructor: {
  40566. value: ctor,
  40567. enumerable: false,
  40568. writable: true,
  40569. configurable: true
  40570. }
  40571. });
  40572. };
  40573. } else {
  40574. // old school shim for old browsers
  40575. module.exports = function inherits(ctor, superCtor) {
  40576. ctor.super_ = superCtor
  40577. var TempCtor = function () {}
  40578. TempCtor.prototype = superCtor.prototype
  40579. ctor.prototype = new TempCtor()
  40580. ctor.prototype.constructor = ctor
  40581. }
  40582. }
  40583. /***/ }),
  40584. /* 75 */
  40585. /***/ (function(module, exports, __webpack_require__) {
  40586. /* WEBPACK VAR INJECTION */(function(global) {'use strict';
  40587. // compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
  40588. // original notice:
  40589. /*!
  40590. * The buffer module from node.js, for the browser.
  40591. *
  40592. * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
  40593. * @license MIT
  40594. */
  40595. function compare(a, b) {
  40596. if (a === b) {
  40597. return 0;
  40598. }
  40599. var x = a.length;
  40600. var y = b.length;
  40601. for (var i = 0, len = Math.min(x, y); i < len; ++i) {
  40602. if (a[i] !== b[i]) {
  40603. x = a[i];
  40604. y = b[i];
  40605. break;
  40606. }
  40607. }
  40608. if (x < y) {
  40609. return -1;
  40610. }
  40611. if (y < x) {
  40612. return 1;
  40613. }
  40614. return 0;
  40615. }
  40616. function isBuffer(b) {
  40617. if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
  40618. return global.Buffer.isBuffer(b);
  40619. }
  40620. return !!(b != null && b._isBuffer);
  40621. }
  40622. // based on node assert, original notice:
  40623. // http://wiki.commonjs.org/wiki/Unit_Testing/1.0
  40624. //
  40625. // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
  40626. //
  40627. // Originally from narwhal.js (http://narwhaljs.org)
  40628. // Copyright (c) 2009 Thomas Robinson <280north.com>
  40629. //
  40630. // Permission is hereby granted, free of charge, to any person obtaining a copy
  40631. // of this software and associated documentation files (the 'Software'), to
  40632. // deal in the Software without restriction, including without limitation the
  40633. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  40634. // sell copies of the Software, and to permit persons to whom the Software is
  40635. // furnished to do so, subject to the following conditions:
  40636. //
  40637. // The above copyright notice and this permission notice shall be included in
  40638. // all copies or substantial portions of the Software.
  40639. //
  40640. // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  40641. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  40642. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  40643. // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  40644. // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  40645. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  40646. var util = __webpack_require__(72);
  40647. var hasOwn = Object.prototype.hasOwnProperty;
  40648. var pSlice = Array.prototype.slice;
  40649. var functionsHaveNames = (function () {
  40650. return function foo() {}.name === 'foo';
  40651. }());
  40652. function pToString (obj) {
  40653. return Object.prototype.toString.call(obj);
  40654. }
  40655. function isView(arrbuf) {
  40656. if (isBuffer(arrbuf)) {
  40657. return false;
  40658. }
  40659. if (typeof global.ArrayBuffer !== 'function') {
  40660. return false;
  40661. }
  40662. if (typeof ArrayBuffer.isView === 'function') {
  40663. return ArrayBuffer.isView(arrbuf);
  40664. }
  40665. if (!arrbuf) {
  40666. return false;
  40667. }
  40668. if (arrbuf instanceof DataView) {
  40669. return true;
  40670. }
  40671. if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
  40672. return true;
  40673. }
  40674. return false;
  40675. }
  40676. // 1. The assert module provides functions that throw
  40677. // AssertionError's when particular conditions are not met. The
  40678. // assert module must conform to the following interface.
  40679. var assert = module.exports = ok;
  40680. // 2. The AssertionError is defined in assert.
  40681. // new assert.AssertionError({ message: message,
  40682. // actual: actual,
  40683. // expected: expected })
  40684. var regex = /\s*function\s+([^\(\s]*)\s*/;
  40685. // based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
  40686. function getName(func) {
  40687. if (!util.isFunction(func)) {
  40688. return;
  40689. }
  40690. if (functionsHaveNames) {
  40691. return func.name;
  40692. }
  40693. var str = func.toString();
  40694. var match = str.match(regex);
  40695. return match && match[1];
  40696. }
  40697. assert.AssertionError = function AssertionError(options) {
  40698. this.name = 'AssertionError';
  40699. this.actual = options.actual;
  40700. this.expected = options.expected;
  40701. this.operator = options.operator;
  40702. if (options.message) {
  40703. this.message = options.message;
  40704. this.generatedMessage = false;
  40705. } else {
  40706. this.message = getMessage(this);
  40707. this.generatedMessage = true;
  40708. }
  40709. var stackStartFunction = options.stackStartFunction || fail;
  40710. if (Error.captureStackTrace) {
  40711. Error.captureStackTrace(this, stackStartFunction);
  40712. } else {
  40713. // non v8 browsers so we can have a stacktrace
  40714. var err = new Error();
  40715. if (err.stack) {
  40716. var out = err.stack;
  40717. // try to strip useless frames
  40718. var fn_name = getName(stackStartFunction);
  40719. var idx = out.indexOf('\n' + fn_name);
  40720. if (idx >= 0) {
  40721. // once we have located the function frame
  40722. // we need to strip out everything before it (and its line)
  40723. var next_line = out.indexOf('\n', idx + 1);
  40724. out = out.substring(next_line + 1);
  40725. }
  40726. this.stack = out;
  40727. }
  40728. }
  40729. };
  40730. // assert.AssertionError instanceof Error
  40731. util.inherits(assert.AssertionError, Error);
  40732. function truncate(s, n) {
  40733. if (typeof s === 'string') {
  40734. return s.length < n ? s : s.slice(0, n);
  40735. } else {
  40736. return s;
  40737. }
  40738. }
  40739. function inspect(something) {
  40740. if (functionsHaveNames || !util.isFunction(something)) {
  40741. return util.inspect(something);
  40742. }
  40743. var rawname = getName(something);
  40744. var name = rawname ? ': ' + rawname : '';
  40745. return '[Function' + name + ']';
  40746. }
  40747. function getMessage(self) {
  40748. return truncate(inspect(self.actual), 128) + ' ' +
  40749. self.operator + ' ' +
  40750. truncate(inspect(self.expected), 128);
  40751. }
  40752. // At present only the three keys mentioned above are used and
  40753. // understood by the spec. Implementations or sub modules can pass
  40754. // other keys to the AssertionError's constructor - they will be
  40755. // ignored.
  40756. // 3. All of the following functions must throw an AssertionError
  40757. // when a corresponding condition is not met, with a message that
  40758. // may be undefined if not provided. All assertion methods provide
  40759. // both the actual and expected values to the assertion error for
  40760. // display purposes.
  40761. function fail(actual, expected, message, operator, stackStartFunction) {
  40762. throw new assert.AssertionError({
  40763. message: message,
  40764. actual: actual,
  40765. expected: expected,
  40766. operator: operator,
  40767. stackStartFunction: stackStartFunction
  40768. });
  40769. }
  40770. // EXTENSION! allows for well behaved errors defined elsewhere.
  40771. assert.fail = fail;
  40772. // 4. Pure assertion tests whether a value is truthy, as determined
  40773. // by !!guard.
  40774. // assert.ok(guard, message_opt);
  40775. // This statement is equivalent to assert.equal(true, !!guard,
  40776. // message_opt);. To test strictly for the value true, use
  40777. // assert.strictEqual(true, guard, message_opt);.
  40778. function ok(value, message) {
  40779. if (!value) fail(value, true, message, '==', assert.ok);
  40780. }
  40781. assert.ok = ok;
  40782. // 5. The equality assertion tests shallow, coercive equality with
  40783. // ==.
  40784. // assert.equal(actual, expected, message_opt);
  40785. assert.equal = function equal(actual, expected, message) {
  40786. if (actual != expected) fail(actual, expected, message, '==', assert.equal);
  40787. };
  40788. // 6. The non-equality assertion tests for whether two objects are not equal
  40789. // with != assert.notEqual(actual, expected, message_opt);
  40790. assert.notEqual = function notEqual(actual, expected, message) {
  40791. if (actual == expected) {
  40792. fail(actual, expected, message, '!=', assert.notEqual);
  40793. }
  40794. };
  40795. // 7. The equivalence assertion tests a deep equality relation.
  40796. // assert.deepEqual(actual, expected, message_opt);
  40797. assert.deepEqual = function deepEqual(actual, expected, message) {
  40798. if (!_deepEqual(actual, expected, false)) {
  40799. fail(actual, expected, message, 'deepEqual', assert.deepEqual);
  40800. }
  40801. };
  40802. assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
  40803. if (!_deepEqual(actual, expected, true)) {
  40804. fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
  40805. }
  40806. };
  40807. function _deepEqual(actual, expected, strict, memos) {
  40808. // 7.1. All identical values are equivalent, as determined by ===.
  40809. if (actual === expected) {
  40810. return true;
  40811. } else if (isBuffer(actual) && isBuffer(expected)) {
  40812. return compare(actual, expected) === 0;
  40813. // 7.2. If the expected value is a Date object, the actual value is
  40814. // equivalent if it is also a Date object that refers to the same time.
  40815. } else if (util.isDate(actual) && util.isDate(expected)) {
  40816. return actual.getTime() === expected.getTime();
  40817. // 7.3 If the expected value is a RegExp object, the actual value is
  40818. // equivalent if it is also a RegExp object with the same source and
  40819. // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
  40820. } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
  40821. return actual.source === expected.source &&
  40822. actual.global === expected.global &&
  40823. actual.multiline === expected.multiline &&
  40824. actual.lastIndex === expected.lastIndex &&
  40825. actual.ignoreCase === expected.ignoreCase;
  40826. // 7.4. Other pairs that do not both pass typeof value == 'object',
  40827. // equivalence is determined by ==.
  40828. } else if ((actual === null || typeof actual !== 'object') &&
  40829. (expected === null || typeof expected !== 'object')) {
  40830. return strict ? actual === expected : actual == expected;
  40831. // If both values are instances of typed arrays, wrap their underlying
  40832. // ArrayBuffers in a Buffer each to increase performance
  40833. // This optimization requires the arrays to have the same type as checked by
  40834. // Object.prototype.toString (aka pToString). Never perform binary
  40835. // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
  40836. // bit patterns are not identical.
  40837. } else if (isView(actual) && isView(expected) &&
  40838. pToString(actual) === pToString(expected) &&
  40839. !(actual instanceof Float32Array ||
  40840. actual instanceof Float64Array)) {
  40841. return compare(new Uint8Array(actual.buffer),
  40842. new Uint8Array(expected.buffer)) === 0;
  40843. // 7.5 For all other Object pairs, including Array objects, equivalence is
  40844. // determined by having the same number of owned properties (as verified
  40845. // with Object.prototype.hasOwnProperty.call), the same set of keys
  40846. // (although not necessarily the same order), equivalent values for every
  40847. // corresponding key, and an identical 'prototype' property. Note: this
  40848. // accounts for both named and indexed properties on Arrays.
  40849. } else if (isBuffer(actual) !== isBuffer(expected)) {
  40850. return false;
  40851. } else {
  40852. memos = memos || {actual: [], expected: []};
  40853. var actualIndex = memos.actual.indexOf(actual);
  40854. if (actualIndex !== -1) {
  40855. if (actualIndex === memos.expected.indexOf(expected)) {
  40856. return true;
  40857. }
  40858. }
  40859. memos.actual.push(actual);
  40860. memos.expected.push(expected);
  40861. return objEquiv(actual, expected, strict, memos);
  40862. }
  40863. }
  40864. function isArguments(object) {
  40865. return Object.prototype.toString.call(object) == '[object Arguments]';
  40866. }
  40867. function objEquiv(a, b, strict, actualVisitedObjects) {
  40868. if (a === null || a === undefined || b === null || b === undefined)
  40869. return false;
  40870. // if one is a primitive, the other must be same
  40871. if (util.isPrimitive(a) || util.isPrimitive(b))
  40872. return a === b;
  40873. if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
  40874. return false;
  40875. var aIsArgs = isArguments(a);
  40876. var bIsArgs = isArguments(b);
  40877. if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
  40878. return false;
  40879. if (aIsArgs) {
  40880. a = pSlice.call(a);
  40881. b = pSlice.call(b);
  40882. return _deepEqual(a, b, strict);
  40883. }
  40884. var ka = objectKeys(a);
  40885. var kb = objectKeys(b);
  40886. var key, i;
  40887. // having the same number of owned properties (keys incorporates
  40888. // hasOwnProperty)
  40889. if (ka.length !== kb.length)
  40890. return false;
  40891. //the same set of keys (although not necessarily the same order),
  40892. ka.sort();
  40893. kb.sort();
  40894. //~~~cheap key test
  40895. for (i = ka.length - 1; i >= 0; i--) {
  40896. if (ka[i] !== kb[i])
  40897. return false;
  40898. }
  40899. //equivalent values for every corresponding key, and
  40900. //~~~possibly expensive deep test
  40901. for (i = ka.length - 1; i >= 0; i--) {
  40902. key = ka[i];
  40903. if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
  40904. return false;
  40905. }
  40906. return true;
  40907. }
  40908. // 8. The non-equivalence assertion tests for any deep inequality.
  40909. // assert.notDeepEqual(actual, expected, message_opt);
  40910. assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
  40911. if (_deepEqual(actual, expected, false)) {
  40912. fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
  40913. }
  40914. };
  40915. assert.notDeepStrictEqual = notDeepStrictEqual;
  40916. function notDeepStrictEqual(actual, expected, message) {
  40917. if (_deepEqual(actual, expected, true)) {
  40918. fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
  40919. }
  40920. }
  40921. // 9. The strict equality assertion tests strict equality, as determined by ===.
  40922. // assert.strictEqual(actual, expected, message_opt);
  40923. assert.strictEqual = function strictEqual(actual, expected, message) {
  40924. if (actual !== expected) {
  40925. fail(actual, expected, message, '===', assert.strictEqual);
  40926. }
  40927. };
  40928. // 10. The strict non-equality assertion tests for strict inequality, as
  40929. // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
  40930. assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
  40931. if (actual === expected) {
  40932. fail(actual, expected, message, '!==', assert.notStrictEqual);
  40933. }
  40934. };
  40935. function expectedException(actual, expected) {
  40936. if (!actual || !expected) {
  40937. return false;
  40938. }
  40939. if (Object.prototype.toString.call(expected) == '[object RegExp]') {
  40940. return expected.test(actual);
  40941. }
  40942. try {
  40943. if (actual instanceof expected) {
  40944. return true;
  40945. }
  40946. } catch (e) {
  40947. // Ignore. The instanceof check doesn't work for arrow functions.
  40948. }
  40949. if (Error.isPrototypeOf(expected)) {
  40950. return false;
  40951. }
  40952. return expected.call({}, actual) === true;
  40953. }
  40954. function _tryBlock(block) {
  40955. var error;
  40956. try {
  40957. block();
  40958. } catch (e) {
  40959. error = e;
  40960. }
  40961. return error;
  40962. }
  40963. function _throws(shouldThrow, block, expected, message) {
  40964. var actual;
  40965. if (typeof block !== 'function') {
  40966. throw new TypeError('"block" argument must be a function');
  40967. }
  40968. if (typeof expected === 'string') {
  40969. message = expected;
  40970. expected = null;
  40971. }
  40972. actual = _tryBlock(block);
  40973. message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
  40974. (message ? ' ' + message : '.');
  40975. if (shouldThrow && !actual) {
  40976. fail(actual, expected, 'Missing expected exception' + message);
  40977. }
  40978. var userProvidedMessage = typeof message === 'string';
  40979. var isUnwantedException = !shouldThrow && util.isError(actual);
  40980. var isUnexpectedException = !shouldThrow && actual && !expected;
  40981. if ((isUnwantedException &&
  40982. userProvidedMessage &&
  40983. expectedException(actual, expected)) ||
  40984. isUnexpectedException) {
  40985. fail(actual, expected, 'Got unwanted exception' + message);
  40986. }
  40987. if ((shouldThrow && actual && expected &&
  40988. !expectedException(actual, expected)) || (!shouldThrow && actual)) {
  40989. throw actual;
  40990. }
  40991. }
  40992. // 11. Expected to throw an error:
  40993. // assert.throws(block, Error_opt, message_opt);
  40994. assert.throws = function(block, /*optional*/error, /*optional*/message) {
  40995. _throws(true, block, error, message);
  40996. };
  40997. // EXTENSION! This is annoying to write outside this module.
  40998. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
  40999. _throws(false, block, error, message);
  41000. };
  41001. assert.ifError = function(err) { if (err) throw err; };
  41002. var objectKeys = Object.keys || function (obj) {
  41003. var keys = [];
  41004. for (var key in obj) {
  41005. if (hasOwn.call(obj, key)) keys.push(key);
  41006. }
  41007. return keys;
  41008. };
  41009. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  41010. /***/ }),
  41011. /* 76 */
  41012. /***/ (function(module, exports) {
  41013. // Generated by CoffeeScript 1.12.6
  41014. /*
  41015. PDFPage - represents a single page in the PDF document
  41016. By Devon Govett
  41017. */
  41018. (function() {
  41019. var PDFPage;
  41020. PDFPage = (function() {
  41021. var DEFAULT_MARGINS, SIZES;
  41022. function PDFPage(document, options) {
  41023. var dimensions;
  41024. this.document = document;
  41025. if (options == null) {
  41026. options = {};
  41027. }
  41028. this.size = options.size || 'letter';
  41029. this.layout = options.layout || 'portrait';
  41030. if (typeof options.margin === 'number') {
  41031. this.margins = {
  41032. top: options.margin,
  41033. left: options.margin,
  41034. bottom: options.margin,
  41035. right: options.margin
  41036. };
  41037. } else {
  41038. this.margins = options.margins || DEFAULT_MARGINS;
  41039. }
  41040. dimensions = Array.isArray(this.size) ? this.size : SIZES[this.size.toUpperCase()];
  41041. this.width = dimensions[this.layout === 'portrait' ? 0 : 1];
  41042. this.height = dimensions[this.layout === 'portrait' ? 1 : 0];
  41043. this.content = this.document.ref();
  41044. this.resources = this.document.ref({
  41045. ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI']
  41046. });
  41047. Object.defineProperties(this, {
  41048. fonts: {
  41049. get: (function(_this) {
  41050. return function() {
  41051. var base;
  41052. return (base = _this.resources.data).Font != null ? base.Font : base.Font = {};
  41053. };
  41054. })(this)
  41055. },
  41056. xobjects: {
  41057. get: (function(_this) {
  41058. return function() {
  41059. var base;
  41060. return (base = _this.resources.data).XObject != null ? base.XObject : base.XObject = {};
  41061. };
  41062. })(this)
  41063. },
  41064. ext_gstates: {
  41065. get: (function(_this) {
  41066. return function() {
  41067. var base;
  41068. return (base = _this.resources.data).ExtGState != null ? base.ExtGState : base.ExtGState = {};
  41069. };
  41070. })(this)
  41071. },
  41072. patterns: {
  41073. get: (function(_this) {
  41074. return function() {
  41075. var base;
  41076. return (base = _this.resources.data).Pattern != null ? base.Pattern : base.Pattern = {};
  41077. };
  41078. })(this)
  41079. },
  41080. annotations: {
  41081. get: (function(_this) {
  41082. return function() {
  41083. var base;
  41084. return (base = _this.dictionary.data).Annots != null ? base.Annots : base.Annots = [];
  41085. };
  41086. })(this)
  41087. }
  41088. });
  41089. this.dictionary = this.document.ref({
  41090. Type: 'Page',
  41091. Parent: this.document._root.data.Pages,
  41092. MediaBox: [0, 0, this.width, this.height],
  41093. Contents: this.content,
  41094. Resources: this.resources
  41095. });
  41096. }
  41097. PDFPage.prototype.maxY = function() {
  41098. return this.height - this.margins.bottom;
  41099. };
  41100. PDFPage.prototype.write = function(chunk) {
  41101. return this.content.write(chunk);
  41102. };
  41103. PDFPage.prototype.end = function() {
  41104. this.dictionary.end();
  41105. this.resources.end();
  41106. return this.content.end();
  41107. };
  41108. DEFAULT_MARGINS = {
  41109. top: 72,
  41110. left: 72,
  41111. bottom: 72,
  41112. right: 72
  41113. };
  41114. SIZES = {
  41115. '4A0': [4767.87, 6740.79],
  41116. '2A0': [3370.39, 4767.87],
  41117. A0: [2383.94, 3370.39],
  41118. A1: [1683.78, 2383.94],
  41119. A2: [1190.55, 1683.78],
  41120. A3: [841.89, 1190.55],
  41121. A4: [595.28, 841.89],
  41122. A5: [419.53, 595.28],
  41123. A6: [297.64, 419.53],
  41124. A7: [209.76, 297.64],
  41125. A8: [147.40, 209.76],
  41126. A9: [104.88, 147.40],
  41127. A10: [73.70, 104.88],
  41128. B0: [2834.65, 4008.19],
  41129. B1: [2004.09, 2834.65],
  41130. B2: [1417.32, 2004.09],
  41131. B3: [1000.63, 1417.32],
  41132. B4: [708.66, 1000.63],
  41133. B5: [498.90, 708.66],
  41134. B6: [354.33, 498.90],
  41135. B7: [249.45, 354.33],
  41136. B8: [175.75, 249.45],
  41137. B9: [124.72, 175.75],
  41138. B10: [87.87, 124.72],
  41139. C0: [2599.37, 3676.54],
  41140. C1: [1836.85, 2599.37],
  41141. C2: [1298.27, 1836.85],
  41142. C3: [918.43, 1298.27],
  41143. C4: [649.13, 918.43],
  41144. C5: [459.21, 649.13],
  41145. C6: [323.15, 459.21],
  41146. C7: [229.61, 323.15],
  41147. C8: [161.57, 229.61],
  41148. C9: [113.39, 161.57],
  41149. C10: [79.37, 113.39],
  41150. RA0: [2437.80, 3458.27],
  41151. RA1: [1729.13, 2437.80],
  41152. RA2: [1218.90, 1729.13],
  41153. RA3: [864.57, 1218.90],
  41154. RA4: [609.45, 864.57],
  41155. SRA0: [2551.18, 3628.35],
  41156. SRA1: [1814.17, 2551.18],
  41157. SRA2: [1275.59, 1814.17],
  41158. SRA3: [907.09, 1275.59],
  41159. SRA4: [637.80, 907.09],
  41160. EXECUTIVE: [521.86, 756.00],
  41161. FOLIO: [612.00, 936.00],
  41162. LEGAL: [612.00, 1008.00],
  41163. LETTER: [612.00, 792.00],
  41164. TABLOID: [792.00, 1224.00]
  41165. };
  41166. return PDFPage;
  41167. })();
  41168. module.exports = PDFPage;
  41169. }).call(this);
  41170. /***/ }),
  41171. /* 77 */
  41172. /***/ (function(module, exports, __webpack_require__) {
  41173. // Generated by CoffeeScript 1.12.6
  41174. (function() {
  41175. var PDFGradient, PDFLinearGradient, PDFRadialGradient, namedColors, ref;
  41176. ref = __webpack_require__(78), PDFGradient = ref.PDFGradient, PDFLinearGradient = ref.PDFLinearGradient, PDFRadialGradient = ref.PDFRadialGradient;
  41177. module.exports = {
  41178. initColor: function() {
  41179. this._opacityRegistry = {};
  41180. this._opacityCount = 0;
  41181. return this._gradCount = 0;
  41182. },
  41183. _normalizeColor: function(color) {
  41184. var hex, part;
  41185. if (color instanceof PDFGradient) {
  41186. return color;
  41187. }
  41188. if (typeof color === 'string') {
  41189. if (color.charAt(0) === '#') {
  41190. if (color.length === 4) {
  41191. color = color.replace(/#([0-9A-F])([0-9A-F])([0-9A-F])/i, "#$1$1$2$2$3$3");
  41192. }
  41193. hex = parseInt(color.slice(1), 16);
  41194. color = [hex >> 16, hex >> 8 & 0xff, hex & 0xff];
  41195. } else if (namedColors[color]) {
  41196. color = namedColors[color];
  41197. }
  41198. }
  41199. if (Array.isArray(color)) {
  41200. if (color.length === 3) {
  41201. color = (function() {
  41202. var i, len, results;
  41203. results = [];
  41204. for (i = 0, len = color.length; i < len; i++) {
  41205. part = color[i];
  41206. results.push(part / 255);
  41207. }
  41208. return results;
  41209. })();
  41210. } else if (color.length === 4) {
  41211. color = (function() {
  41212. var i, len, results;
  41213. results = [];
  41214. for (i = 0, len = color.length; i < len; i++) {
  41215. part = color[i];
  41216. results.push(part / 100);
  41217. }
  41218. return results;
  41219. })();
  41220. }
  41221. return color;
  41222. }
  41223. return null;
  41224. },
  41225. _setColor: function(color, stroke) {
  41226. var op, space;
  41227. color = this._normalizeColor(color);
  41228. if (!color) {
  41229. return false;
  41230. }
  41231. op = stroke ? 'SCN' : 'scn';
  41232. if (color instanceof PDFGradient) {
  41233. this._setColorSpace('Pattern', stroke);
  41234. color.apply(op);
  41235. } else {
  41236. space = color.length === 4 ? 'DeviceCMYK' : 'DeviceRGB';
  41237. this._setColorSpace(space, stroke);
  41238. color = color.join(' ');
  41239. this.addContent(color + " " + op);
  41240. }
  41241. return true;
  41242. },
  41243. _setColorSpace: function(space, stroke) {
  41244. var op;
  41245. op = stroke ? 'CS' : 'cs';
  41246. return this.addContent("/" + space + " " + op);
  41247. },
  41248. fillColor: function(color, opacity) {
  41249. var set;
  41250. set = this._setColor(color, false);
  41251. if (set) {
  41252. this.fillOpacity(opacity);
  41253. }
  41254. this._fillColor = [color, opacity];
  41255. return this;
  41256. },
  41257. strokeColor: function(color, opacity) {
  41258. var set;
  41259. set = this._setColor(color, true);
  41260. if (set) {
  41261. this.strokeOpacity(opacity);
  41262. }
  41263. return this;
  41264. },
  41265. opacity: function(opacity) {
  41266. this._doOpacity(opacity, opacity);
  41267. return this;
  41268. },
  41269. fillOpacity: function(opacity) {
  41270. this._doOpacity(opacity, null);
  41271. return this;
  41272. },
  41273. strokeOpacity: function(opacity) {
  41274. this._doOpacity(null, opacity);
  41275. return this;
  41276. },
  41277. _doOpacity: function(fillOpacity, strokeOpacity) {
  41278. var dictionary, id, key, name, ref1;
  41279. if (!((fillOpacity != null) || (strokeOpacity != null))) {
  41280. return;
  41281. }
  41282. if (fillOpacity != null) {
  41283. fillOpacity = Math.max(0, Math.min(1, fillOpacity));
  41284. }
  41285. if (strokeOpacity != null) {
  41286. strokeOpacity = Math.max(0, Math.min(1, strokeOpacity));
  41287. }
  41288. key = fillOpacity + "_" + strokeOpacity;
  41289. if (this._opacityRegistry[key]) {
  41290. ref1 = this._opacityRegistry[key], dictionary = ref1[0], name = ref1[1];
  41291. } else {
  41292. dictionary = {
  41293. Type: 'ExtGState'
  41294. };
  41295. if (fillOpacity != null) {
  41296. dictionary.ca = fillOpacity;
  41297. }
  41298. if (strokeOpacity != null) {
  41299. dictionary.CA = strokeOpacity;
  41300. }
  41301. dictionary = this.ref(dictionary);
  41302. dictionary.end();
  41303. id = ++this._opacityCount;
  41304. name = "Gs" + id;
  41305. this._opacityRegistry[key] = [dictionary, name];
  41306. }
  41307. this.page.ext_gstates[name] = dictionary;
  41308. return this.addContent("/" + name + " gs");
  41309. },
  41310. linearGradient: function(x1, y1, x2, y2) {
  41311. return new PDFLinearGradient(this, x1, y1, x2, y2);
  41312. },
  41313. radialGradient: function(x1, y1, r1, x2, y2, r2) {
  41314. return new PDFRadialGradient(this, x1, y1, r1, x2, y2, r2);
  41315. }
  41316. };
  41317. namedColors = {
  41318. aliceblue: [240, 248, 255],
  41319. antiquewhite: [250, 235, 215],
  41320. aqua: [0, 255, 255],
  41321. aquamarine: [127, 255, 212],
  41322. azure: [240, 255, 255],
  41323. beige: [245, 245, 220],
  41324. bisque: [255, 228, 196],
  41325. black: [0, 0, 0],
  41326. blanchedalmond: [255, 235, 205],
  41327. blue: [0, 0, 255],
  41328. blueviolet: [138, 43, 226],
  41329. brown: [165, 42, 42],
  41330. burlywood: [222, 184, 135],
  41331. cadetblue: [95, 158, 160],
  41332. chartreuse: [127, 255, 0],
  41333. chocolate: [210, 105, 30],
  41334. coral: [255, 127, 80],
  41335. cornflowerblue: [100, 149, 237],
  41336. cornsilk: [255, 248, 220],
  41337. crimson: [220, 20, 60],
  41338. cyan: [0, 255, 255],
  41339. darkblue: [0, 0, 139],
  41340. darkcyan: [0, 139, 139],
  41341. darkgoldenrod: [184, 134, 11],
  41342. darkgray: [169, 169, 169],
  41343. darkgreen: [0, 100, 0],
  41344. darkgrey: [169, 169, 169],
  41345. darkkhaki: [189, 183, 107],
  41346. darkmagenta: [139, 0, 139],
  41347. darkolivegreen: [85, 107, 47],
  41348. darkorange: [255, 140, 0],
  41349. darkorchid: [153, 50, 204],
  41350. darkred: [139, 0, 0],
  41351. darksalmon: [233, 150, 122],
  41352. darkseagreen: [143, 188, 143],
  41353. darkslateblue: [72, 61, 139],
  41354. darkslategray: [47, 79, 79],
  41355. darkslategrey: [47, 79, 79],
  41356. darkturquoise: [0, 206, 209],
  41357. darkviolet: [148, 0, 211],
  41358. deeppink: [255, 20, 147],
  41359. deepskyblue: [0, 191, 255],
  41360. dimgray: [105, 105, 105],
  41361. dimgrey: [105, 105, 105],
  41362. dodgerblue: [30, 144, 255],
  41363. firebrick: [178, 34, 34],
  41364. floralwhite: [255, 250, 240],
  41365. forestgreen: [34, 139, 34],
  41366. fuchsia: [255, 0, 255],
  41367. gainsboro: [220, 220, 220],
  41368. ghostwhite: [248, 248, 255],
  41369. gold: [255, 215, 0],
  41370. goldenrod: [218, 165, 32],
  41371. gray: [128, 128, 128],
  41372. grey: [128, 128, 128],
  41373. green: [0, 128, 0],
  41374. greenyellow: [173, 255, 47],
  41375. honeydew: [240, 255, 240],
  41376. hotpink: [255, 105, 180],
  41377. indianred: [205, 92, 92],
  41378. indigo: [75, 0, 130],
  41379. ivory: [255, 255, 240],
  41380. khaki: [240, 230, 140],
  41381. lavender: [230, 230, 250],
  41382. lavenderblush: [255, 240, 245],
  41383. lawngreen: [124, 252, 0],
  41384. lemonchiffon: [255, 250, 205],
  41385. lightblue: [173, 216, 230],
  41386. lightcoral: [240, 128, 128],
  41387. lightcyan: [224, 255, 255],
  41388. lightgoldenrodyellow: [250, 250, 210],
  41389. lightgray: [211, 211, 211],
  41390. lightgreen: [144, 238, 144],
  41391. lightgrey: [211, 211, 211],
  41392. lightpink: [255, 182, 193],
  41393. lightsalmon: [255, 160, 122],
  41394. lightseagreen: [32, 178, 170],
  41395. lightskyblue: [135, 206, 250],
  41396. lightslategray: [119, 136, 153],
  41397. lightslategrey: [119, 136, 153],
  41398. lightsteelblue: [176, 196, 222],
  41399. lightyellow: [255, 255, 224],
  41400. lime: [0, 255, 0],
  41401. limegreen: [50, 205, 50],
  41402. linen: [250, 240, 230],
  41403. magenta: [255, 0, 255],
  41404. maroon: [128, 0, 0],
  41405. mediumaquamarine: [102, 205, 170],
  41406. mediumblue: [0, 0, 205],
  41407. mediumorchid: [186, 85, 211],
  41408. mediumpurple: [147, 112, 219],
  41409. mediumseagreen: [60, 179, 113],
  41410. mediumslateblue: [123, 104, 238],
  41411. mediumspringgreen: [0, 250, 154],
  41412. mediumturquoise: [72, 209, 204],
  41413. mediumvioletred: [199, 21, 133],
  41414. midnightblue: [25, 25, 112],
  41415. mintcream: [245, 255, 250],
  41416. mistyrose: [255, 228, 225],
  41417. moccasin: [255, 228, 181],
  41418. navajowhite: [255, 222, 173],
  41419. navy: [0, 0, 128],
  41420. oldlace: [253, 245, 230],
  41421. olive: [128, 128, 0],
  41422. olivedrab: [107, 142, 35],
  41423. orange: [255, 165, 0],
  41424. orangered: [255, 69, 0],
  41425. orchid: [218, 112, 214],
  41426. palegoldenrod: [238, 232, 170],
  41427. palegreen: [152, 251, 152],
  41428. paleturquoise: [175, 238, 238],
  41429. palevioletred: [219, 112, 147],
  41430. papayawhip: [255, 239, 213],
  41431. peachpuff: [255, 218, 185],
  41432. peru: [205, 133, 63],
  41433. pink: [255, 192, 203],
  41434. plum: [221, 160, 221],
  41435. powderblue: [176, 224, 230],
  41436. purple: [128, 0, 128],
  41437. red: [255, 0, 0],
  41438. rosybrown: [188, 143, 143],
  41439. royalblue: [65, 105, 225],
  41440. saddlebrown: [139, 69, 19],
  41441. salmon: [250, 128, 114],
  41442. sandybrown: [244, 164, 96],
  41443. seagreen: [46, 139, 87],
  41444. seashell: [255, 245, 238],
  41445. sienna: [160, 82, 45],
  41446. silver: [192, 192, 192],
  41447. skyblue: [135, 206, 235],
  41448. slateblue: [106, 90, 205],
  41449. slategray: [112, 128, 144],
  41450. slategrey: [112, 128, 144],
  41451. snow: [255, 250, 250],
  41452. springgreen: [0, 255, 127],
  41453. steelblue: [70, 130, 180],
  41454. tan: [210, 180, 140],
  41455. teal: [0, 128, 128],
  41456. thistle: [216, 191, 216],
  41457. tomato: [255, 99, 71],
  41458. turquoise: [64, 224, 208],
  41459. violet: [238, 130, 238],
  41460. wheat: [245, 222, 179],
  41461. white: [255, 255, 255],
  41462. whitesmoke: [245, 245, 245],
  41463. yellow: [255, 255, 0],
  41464. yellowgreen: [154, 205, 50]
  41465. };
  41466. }).call(this);
  41467. /***/ }),
  41468. /* 78 */
  41469. /***/ (function(module, exports) {
  41470. // Generated by CoffeeScript 1.12.6
  41471. (function() {
  41472. var PDFGradient, PDFLinearGradient, PDFRadialGradient,
  41473. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  41474. hasProp = {}.hasOwnProperty;
  41475. PDFGradient = (function() {
  41476. function PDFGradient(doc) {
  41477. this.doc = doc;
  41478. this.stops = [];
  41479. this.embedded = false;
  41480. this.transform = [1, 0, 0, 1, 0, 0];
  41481. this._colorSpace = 'DeviceRGB';
  41482. }
  41483. PDFGradient.prototype.stop = function(pos, color, opacity) {
  41484. if (opacity == null) {
  41485. opacity = 1;
  41486. }
  41487. opacity = Math.max(0, Math.min(1, opacity));
  41488. this.stops.push([pos, this.doc._normalizeColor(color), opacity]);
  41489. return this;
  41490. };
  41491. PDFGradient.prototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
  41492. this.transform = [m11, m12, m21, m22, dx, dy];
  41493. return this;
  41494. };
  41495. PDFGradient.prototype.embed = function(m) {
  41496. var bounds, encode, fn, form, grad, gstate, i, j, k, last, len, opacityPattern, pageBBox, pattern, ref, ref1, shader, stop, stops, v;
  41497. if (this.stops.length === 0) {
  41498. return;
  41499. }
  41500. this.embedded = true;
  41501. this.matrix = m;
  41502. last = this.stops[this.stops.length - 1];
  41503. if (last[0] < 1) {
  41504. this.stops.push([1, last[1], last[2]]);
  41505. }
  41506. bounds = [];
  41507. encode = [];
  41508. stops = [];
  41509. for (i = j = 0, ref = this.stops.length - 1; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  41510. encode.push(0, 1);
  41511. if (i + 2 !== this.stops.length) {
  41512. bounds.push(this.stops[i + 1][0]);
  41513. }
  41514. fn = this.doc.ref({
  41515. FunctionType: 2,
  41516. Domain: [0, 1],
  41517. C0: this.stops[i + 0][1],
  41518. C1: this.stops[i + 1][1],
  41519. N: 1
  41520. });
  41521. stops.push(fn);
  41522. fn.end();
  41523. }
  41524. if (stops.length === 1) {
  41525. fn = stops[0];
  41526. } else {
  41527. fn = this.doc.ref({
  41528. FunctionType: 3,
  41529. Domain: [0, 1],
  41530. Functions: stops,
  41531. Bounds: bounds,
  41532. Encode: encode
  41533. });
  41534. fn.end();
  41535. }
  41536. this.id = 'Sh' + (++this.doc._gradCount);
  41537. shader = this.shader(fn);
  41538. shader.end();
  41539. pattern = this.doc.ref({
  41540. Type: 'Pattern',
  41541. PatternType: 2,
  41542. Shading: shader,
  41543. Matrix: (function() {
  41544. var k, len, ref1, results;
  41545. ref1 = this.matrix;
  41546. results = [];
  41547. for (k = 0, len = ref1.length; k < len; k++) {
  41548. v = ref1[k];
  41549. results.push(+v.toFixed(5));
  41550. }
  41551. return results;
  41552. }).call(this)
  41553. });
  41554. pattern.end();
  41555. if (this.stops.some(function(stop) {
  41556. return stop[2] < 1;
  41557. })) {
  41558. grad = this.opacityGradient();
  41559. grad._colorSpace = 'DeviceGray';
  41560. ref1 = this.stops;
  41561. for (k = 0, len = ref1.length; k < len; k++) {
  41562. stop = ref1[k];
  41563. grad.stop(stop[0], [stop[2]]);
  41564. }
  41565. grad = grad.embed(this.matrix);
  41566. pageBBox = [0, 0, this.doc.page.width, this.doc.page.height];
  41567. form = this.doc.ref({
  41568. Type: 'XObject',
  41569. Subtype: 'Form',
  41570. FormType: 1,
  41571. BBox: pageBBox,
  41572. Group: {
  41573. Type: 'Group',
  41574. S: 'Transparency',
  41575. CS: 'DeviceGray'
  41576. },
  41577. Resources: {
  41578. ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],
  41579. Pattern: {
  41580. Sh1: grad
  41581. }
  41582. }
  41583. });
  41584. form.write("/Pattern cs /Sh1 scn");
  41585. form.end((pageBBox.join(" ")) + " re f");
  41586. gstate = this.doc.ref({
  41587. Type: 'ExtGState',
  41588. SMask: {
  41589. Type: 'Mask',
  41590. S: 'Luminosity',
  41591. G: form
  41592. }
  41593. });
  41594. gstate.end();
  41595. opacityPattern = this.doc.ref({
  41596. Type: 'Pattern',
  41597. PatternType: 1,
  41598. PaintType: 1,
  41599. TilingType: 2,
  41600. BBox: pageBBox,
  41601. XStep: pageBBox[2],
  41602. YStep: pageBBox[3],
  41603. Resources: {
  41604. ProcSet: ['PDF', 'Text', 'ImageB', 'ImageC', 'ImageI'],
  41605. Pattern: {
  41606. Sh1: pattern
  41607. },
  41608. ExtGState: {
  41609. Gs1: gstate
  41610. }
  41611. }
  41612. });
  41613. opacityPattern.write("/Gs1 gs /Pattern cs /Sh1 scn");
  41614. opacityPattern.end((pageBBox.join(" ")) + " re f");
  41615. this.doc.page.patterns[this.id] = opacityPattern;
  41616. } else {
  41617. this.doc.page.patterns[this.id] = pattern;
  41618. }
  41619. return pattern;
  41620. };
  41621. PDFGradient.prototype.apply = function(op) {
  41622. var dx, dy, m, m0, m1, m11, m12, m2, m21, m22, m3, m4, m5, ref, ref1;
  41623. ref = this.doc._ctm.slice(), m0 = ref[0], m1 = ref[1], m2 = ref[2], m3 = ref[3], m4 = ref[4], m5 = ref[5];
  41624. ref1 = this.transform, m11 = ref1[0], m12 = ref1[1], m21 = ref1[2], m22 = ref1[3], dx = ref1[4], dy = ref1[5];
  41625. m = [m0 * m11 + m2 * m12, m1 * m11 + m3 * m12, m0 * m21 + m2 * m22, m1 * m21 + m3 * m22, m0 * dx + m2 * dy + m4, m1 * dx + m3 * dy + m5];
  41626. if (!(this.embedded && m.join(" ") === this.matrix.join(" "))) {
  41627. this.embed(m);
  41628. }
  41629. return this.doc.addContent("/" + this.id + " " + op);
  41630. };
  41631. return PDFGradient;
  41632. })();
  41633. PDFLinearGradient = (function(superClass) {
  41634. extend(PDFLinearGradient, superClass);
  41635. function PDFLinearGradient(doc, x1, y1, x2, y2) {
  41636. this.doc = doc;
  41637. this.x1 = x1;
  41638. this.y1 = y1;
  41639. this.x2 = x2;
  41640. this.y2 = y2;
  41641. PDFLinearGradient.__super__.constructor.apply(this, arguments);
  41642. }
  41643. PDFLinearGradient.prototype.shader = function(fn) {
  41644. return this.doc.ref({
  41645. ShadingType: 2,
  41646. ColorSpace: this._colorSpace,
  41647. Coords: [this.x1, this.y1, this.x2, this.y2],
  41648. Function: fn,
  41649. Extend: [true, true]
  41650. });
  41651. };
  41652. PDFLinearGradient.prototype.opacityGradient = function() {
  41653. return new PDFLinearGradient(this.doc, this.x1, this.y1, this.x2, this.y2);
  41654. };
  41655. return PDFLinearGradient;
  41656. })(PDFGradient);
  41657. PDFRadialGradient = (function(superClass) {
  41658. extend(PDFRadialGradient, superClass);
  41659. function PDFRadialGradient(doc, x1, y1, r1, x2, y2, r2) {
  41660. this.doc = doc;
  41661. this.x1 = x1;
  41662. this.y1 = y1;
  41663. this.r1 = r1;
  41664. this.x2 = x2;
  41665. this.y2 = y2;
  41666. this.r2 = r2;
  41667. PDFRadialGradient.__super__.constructor.apply(this, arguments);
  41668. }
  41669. PDFRadialGradient.prototype.shader = function(fn) {
  41670. return this.doc.ref({
  41671. ShadingType: 3,
  41672. ColorSpace: this._colorSpace,
  41673. Coords: [this.x1, this.y1, this.r1, this.x2, this.y2, this.r2],
  41674. Function: fn,
  41675. Extend: [true, true]
  41676. });
  41677. };
  41678. PDFRadialGradient.prototype.opacityGradient = function() {
  41679. return new PDFRadialGradient(this.doc, this.x1, this.y1, this.r1, this.x2, this.y2, this.r2);
  41680. };
  41681. return PDFRadialGradient;
  41682. })(PDFGradient);
  41683. module.exports = {
  41684. PDFGradient: PDFGradient,
  41685. PDFLinearGradient: PDFLinearGradient,
  41686. PDFRadialGradient: PDFRadialGradient
  41687. };
  41688. }).call(this);
  41689. /***/ }),
  41690. /* 79 */
  41691. /***/ (function(module, exports, __webpack_require__) {
  41692. // Generated by CoffeeScript 1.12.6
  41693. (function() {
  41694. var KAPPA, SVGPath, number,
  41695. slice = [].slice;
  41696. SVGPath = __webpack_require__(80);
  41697. number = __webpack_require__(57).number;
  41698. KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0);
  41699. module.exports = {
  41700. initVector: function() {
  41701. this._ctm = [1, 0, 0, 1, 0, 0];
  41702. return this._ctmStack = [];
  41703. },
  41704. save: function() {
  41705. this._ctmStack.push(this._ctm.slice());
  41706. return this.addContent('q');
  41707. },
  41708. restore: function() {
  41709. this._ctm = this._ctmStack.pop() || [1, 0, 0, 1, 0, 0];
  41710. return this.addContent('Q');
  41711. },
  41712. closePath: function() {
  41713. return this.addContent('h');
  41714. },
  41715. lineWidth: function(w) {
  41716. return this.addContent((number(w)) + " w");
  41717. },
  41718. _CAP_STYLES: {
  41719. BUTT: 0,
  41720. ROUND: 1,
  41721. SQUARE: 2
  41722. },
  41723. lineCap: function(c) {
  41724. if (typeof c === 'string') {
  41725. c = this._CAP_STYLES[c.toUpperCase()];
  41726. }
  41727. return this.addContent(c + " J");
  41728. },
  41729. _JOIN_STYLES: {
  41730. MITER: 0,
  41731. ROUND: 1,
  41732. BEVEL: 2
  41733. },
  41734. lineJoin: function(j) {
  41735. if (typeof j === 'string') {
  41736. j = this._JOIN_STYLES[j.toUpperCase()];
  41737. }
  41738. return this.addContent(j + " j");
  41739. },
  41740. miterLimit: function(m) {
  41741. return this.addContent((number(m)) + " M");
  41742. },
  41743. dash: function(length, options) {
  41744. var phase, ref, space, v;
  41745. if (options == null) {
  41746. options = {};
  41747. }
  41748. if (length == null) {
  41749. return this;
  41750. }
  41751. if (Array.isArray(length)) {
  41752. length = ((function() {
  41753. var i, len, results;
  41754. results = [];
  41755. for (i = 0, len = length.length; i < len; i++) {
  41756. v = length[i];
  41757. results.push(number(v));
  41758. }
  41759. return results;
  41760. })()).join(' ');
  41761. phase = options.phase || 0;
  41762. return this.addContent("[" + length + "] " + (number(phase)) + " d");
  41763. } else {
  41764. space = (ref = options.space) != null ? ref : length;
  41765. phase = options.phase || 0;
  41766. return this.addContent("[" + (number(length)) + " " + (number(space)) + "] " + (number(phase)) + " d");
  41767. }
  41768. },
  41769. undash: function() {
  41770. return this.addContent("[] 0 d");
  41771. },
  41772. moveTo: function(x, y) {
  41773. return this.addContent((number(x)) + " " + (number(y)) + " m");
  41774. },
  41775. lineTo: function(x, y) {
  41776. return this.addContent((number(x)) + " " + (number(y)) + " l");
  41777. },
  41778. bezierCurveTo: function(cp1x, cp1y, cp2x, cp2y, x, y) {
  41779. return this.addContent((number(cp1x)) + " " + (number(cp1y)) + " " + (number(cp2x)) + " " + (number(cp2y)) + " " + (number(x)) + " " + (number(y)) + " c");
  41780. },
  41781. quadraticCurveTo: function(cpx, cpy, x, y) {
  41782. return this.addContent((number(cpx)) + " " + (number(cpy)) + " " + (number(x)) + " " + (number(y)) + " v");
  41783. },
  41784. rect: function(x, y, w, h) {
  41785. return this.addContent((number(x)) + " " + (number(y)) + " " + (number(w)) + " " + (number(h)) + " re");
  41786. },
  41787. roundedRect: function(x, y, w, h, r) {
  41788. var c;
  41789. if (r == null) {
  41790. r = 0;
  41791. }
  41792. r = Math.min(r, 0.5 * w, 0.5 * h);
  41793. c = r * (1.0 - KAPPA);
  41794. this.moveTo(x + r, y);
  41795. this.lineTo(x + w - r, y);
  41796. this.bezierCurveTo(x + w - c, y, x + w, y + c, x + w, y + r);
  41797. this.lineTo(x + w, y + h - r);
  41798. this.bezierCurveTo(x + w, y + h - c, x + w - c, y + h, x + w - r, y + h);
  41799. this.lineTo(x + r, y + h);
  41800. this.bezierCurveTo(x + c, y + h, x, y + h - c, x, y + h - r);
  41801. this.lineTo(x, y + r);
  41802. this.bezierCurveTo(x, y + c, x + c, y, x + r, y);
  41803. return this.closePath();
  41804. },
  41805. ellipse: function(x, y, r1, r2) {
  41806. var ox, oy, xe, xm, ye, ym;
  41807. if (r2 == null) {
  41808. r2 = r1;
  41809. }
  41810. x -= r1;
  41811. y -= r2;
  41812. ox = r1 * KAPPA;
  41813. oy = r2 * KAPPA;
  41814. xe = x + r1 * 2;
  41815. ye = y + r2 * 2;
  41816. xm = x + r1;
  41817. ym = y + r2;
  41818. this.moveTo(x, ym);
  41819. this.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
  41820. this.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
  41821. this.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
  41822. this.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
  41823. return this.closePath();
  41824. },
  41825. circle: function(x, y, radius) {
  41826. return this.ellipse(x, y, radius);
  41827. },
  41828. arc: function(x, y, radius, startAngle, endAngle, anticlockwise) {
  41829. var HALF_PI, TWO_PI, ax, ay, cp1x, cp1y, cp2x, cp2y, curAng, deltaAng, deltaCx, deltaCy, dir, handleLen, i, numSegs, ref, segAng, segIdx;
  41830. if (anticlockwise == null) {
  41831. anticlockwise = false;
  41832. }
  41833. TWO_PI = 2.0 * Math.PI;
  41834. HALF_PI = 0.5 * Math.PI;
  41835. deltaAng = endAngle - startAngle;
  41836. if (Math.abs(deltaAng) > TWO_PI) {
  41837. deltaAng = TWO_PI;
  41838. } else if (deltaAng !== 0 && anticlockwise !== (deltaAng < 0)) {
  41839. dir = anticlockwise ? -1 : 1;
  41840. deltaAng = dir * TWO_PI + deltaAng;
  41841. }
  41842. numSegs = Math.ceil(Math.abs(deltaAng) / HALF_PI);
  41843. segAng = deltaAng / numSegs;
  41844. handleLen = (segAng / HALF_PI) * KAPPA * radius;
  41845. curAng = startAngle;
  41846. deltaCx = -Math.sin(curAng) * handleLen;
  41847. deltaCy = Math.cos(curAng) * handleLen;
  41848. ax = x + Math.cos(curAng) * radius;
  41849. ay = y + Math.sin(curAng) * radius;
  41850. this.moveTo(ax, ay);
  41851. for (segIdx = i = 0, ref = numSegs; 0 <= ref ? i < ref : i > ref; segIdx = 0 <= ref ? ++i : --i) {
  41852. cp1x = ax + deltaCx;
  41853. cp1y = ay + deltaCy;
  41854. curAng += segAng;
  41855. ax = x + Math.cos(curAng) * radius;
  41856. ay = y + Math.sin(curAng) * radius;
  41857. deltaCx = -Math.sin(curAng) * handleLen;
  41858. deltaCy = Math.cos(curAng) * handleLen;
  41859. cp2x = ax - deltaCx;
  41860. cp2y = ay - deltaCy;
  41861. this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, ax, ay);
  41862. }
  41863. return this;
  41864. },
  41865. polygon: function() {
  41866. var i, len, point, points;
  41867. points = 1 <= arguments.length ? slice.call(arguments, 0) : [];
  41868. this.moveTo.apply(this, points.shift());
  41869. for (i = 0, len = points.length; i < len; i++) {
  41870. point = points[i];
  41871. this.lineTo.apply(this, point);
  41872. }
  41873. return this.closePath();
  41874. },
  41875. path: function(path) {
  41876. SVGPath.apply(this, path);
  41877. return this;
  41878. },
  41879. _windingRule: function(rule) {
  41880. if (/even-?odd/.test(rule)) {
  41881. return '*';
  41882. }
  41883. return '';
  41884. },
  41885. fill: function(color, rule) {
  41886. if (/(even-?odd)|(non-?zero)/.test(color)) {
  41887. rule = color;
  41888. color = null;
  41889. }
  41890. if (color) {
  41891. this.fillColor(color);
  41892. }
  41893. return this.addContent('f' + this._windingRule(rule));
  41894. },
  41895. stroke: function(color) {
  41896. if (color) {
  41897. this.strokeColor(color);
  41898. }
  41899. return this.addContent('S');
  41900. },
  41901. fillAndStroke: function(fillColor, strokeColor, rule) {
  41902. var isFillRule;
  41903. if (strokeColor == null) {
  41904. strokeColor = fillColor;
  41905. }
  41906. isFillRule = /(even-?odd)|(non-?zero)/;
  41907. if (isFillRule.test(fillColor)) {
  41908. rule = fillColor;
  41909. fillColor = null;
  41910. }
  41911. if (isFillRule.test(strokeColor)) {
  41912. rule = strokeColor;
  41913. strokeColor = fillColor;
  41914. }
  41915. if (fillColor) {
  41916. this.fillColor(fillColor);
  41917. this.strokeColor(strokeColor);
  41918. }
  41919. return this.addContent('B' + this._windingRule(rule));
  41920. },
  41921. clip: function(rule) {
  41922. return this.addContent('W' + this._windingRule(rule) + ' n');
  41923. },
  41924. transform: function(m11, m12, m21, m22, dx, dy) {
  41925. var m, m0, m1, m2, m3, m4, m5, v, values;
  41926. m = this._ctm;
  41927. m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5];
  41928. m[0] = m0 * m11 + m2 * m12;
  41929. m[1] = m1 * m11 + m3 * m12;
  41930. m[2] = m0 * m21 + m2 * m22;
  41931. m[3] = m1 * m21 + m3 * m22;
  41932. m[4] = m0 * dx + m2 * dy + m4;
  41933. m[5] = m1 * dx + m3 * dy + m5;
  41934. values = ((function() {
  41935. var i, len, ref, results;
  41936. ref = [m11, m12, m21, m22, dx, dy];
  41937. results = [];
  41938. for (i = 0, len = ref.length; i < len; i++) {
  41939. v = ref[i];
  41940. results.push(number(v));
  41941. }
  41942. return results;
  41943. })()).join(' ');
  41944. return this.addContent(values + " cm");
  41945. },
  41946. translate: function(x, y) {
  41947. return this.transform(1, 0, 0, 1, x, y);
  41948. },
  41949. rotate: function(angle, options) {
  41950. var cos, rad, ref, sin, x, x1, y, y1;
  41951. if (options == null) {
  41952. options = {};
  41953. }
  41954. rad = angle * Math.PI / 180;
  41955. cos = Math.cos(rad);
  41956. sin = Math.sin(rad);
  41957. x = y = 0;
  41958. if (options.origin != null) {
  41959. ref = options.origin, x = ref[0], y = ref[1];
  41960. x1 = x * cos - y * sin;
  41961. y1 = x * sin + y * cos;
  41962. x -= x1;
  41963. y -= y1;
  41964. }
  41965. return this.transform(cos, sin, -sin, cos, x, y);
  41966. },
  41967. scale: function(xFactor, yFactor, options) {
  41968. var ref, x, y;
  41969. if (yFactor == null) {
  41970. yFactor = xFactor;
  41971. }
  41972. if (options == null) {
  41973. options = {};
  41974. }
  41975. if (typeof yFactor === "object") {
  41976. options = yFactor;
  41977. yFactor = xFactor;
  41978. }
  41979. x = y = 0;
  41980. if (options.origin != null) {
  41981. ref = options.origin, x = ref[0], y = ref[1];
  41982. x -= xFactor * x;
  41983. y -= yFactor * y;
  41984. }
  41985. return this.transform(xFactor, 0, 0, yFactor, x, y);
  41986. }
  41987. };
  41988. }).call(this);
  41989. /***/ }),
  41990. /* 80 */
  41991. /***/ (function(module, exports) {
  41992. // Generated by CoffeeScript 1.12.6
  41993. (function() {
  41994. var SVGPath;
  41995. SVGPath = (function() {
  41996. var apply, arcToSegments, cx, cy, parameters, parse, px, py, runners, segmentToBezier, solveArc, sx, sy;
  41997. function SVGPath() {}
  41998. SVGPath.apply = function(doc, path) {
  41999. var commands;
  42000. commands = parse(path);
  42001. return apply(commands, doc);
  42002. };
  42003. parameters = {
  42004. A: 7,
  42005. a: 7,
  42006. C: 6,
  42007. c: 6,
  42008. H: 1,
  42009. h: 1,
  42010. L: 2,
  42011. l: 2,
  42012. M: 2,
  42013. m: 2,
  42014. Q: 4,
  42015. q: 4,
  42016. S: 4,
  42017. s: 4,
  42018. T: 2,
  42019. t: 2,
  42020. V: 1,
  42021. v: 1,
  42022. Z: 0,
  42023. z: 0
  42024. };
  42025. parse = function(path) {
  42026. var args, c, cmd, curArg, foundDecimal, j, len, params, ret;
  42027. ret = [];
  42028. args = [];
  42029. curArg = "";
  42030. foundDecimal = false;
  42031. params = 0;
  42032. for (j = 0, len = path.length; j < len; j++) {
  42033. c = path[j];
  42034. if (parameters[c] != null) {
  42035. params = parameters[c];
  42036. if (cmd) {
  42037. if (curArg.length > 0) {
  42038. args[args.length] = +curArg;
  42039. }
  42040. ret[ret.length] = {
  42041. cmd: cmd,
  42042. args: args
  42043. };
  42044. args = [];
  42045. curArg = "";
  42046. foundDecimal = false;
  42047. }
  42048. cmd = c;
  42049. } else if ((c === " " || c === ",") || (c === "-" && curArg.length > 0 && curArg[curArg.length - 1] !== 'e') || (c === "." && foundDecimal)) {
  42050. if (curArg.length === 0) {
  42051. continue;
  42052. }
  42053. if (args.length === params) {
  42054. ret[ret.length] = {
  42055. cmd: cmd,
  42056. args: args
  42057. };
  42058. args = [+curArg];
  42059. if (cmd === "M") {
  42060. cmd = "L";
  42061. }
  42062. if (cmd === "m") {
  42063. cmd = "l";
  42064. }
  42065. } else {
  42066. args[args.length] = +curArg;
  42067. }
  42068. foundDecimal = c === ".";
  42069. curArg = c === '-' || c === '.' ? c : '';
  42070. } else {
  42071. curArg += c;
  42072. if (c === '.') {
  42073. foundDecimal = true;
  42074. }
  42075. }
  42076. }
  42077. if (curArg.length > 0) {
  42078. if (args.length === params) {
  42079. ret[ret.length] = {
  42080. cmd: cmd,
  42081. args: args
  42082. };
  42083. args = [+curArg];
  42084. if (cmd === "M") {
  42085. cmd = "L";
  42086. }
  42087. if (cmd === "m") {
  42088. cmd = "l";
  42089. }
  42090. } else {
  42091. args[args.length] = +curArg;
  42092. }
  42093. }
  42094. ret[ret.length] = {
  42095. cmd: cmd,
  42096. args: args
  42097. };
  42098. return ret;
  42099. };
  42100. cx = cy = px = py = sx = sy = 0;
  42101. apply = function(commands, doc) {
  42102. var c, i, j, len, name;
  42103. cx = cy = px = py = sx = sy = 0;
  42104. for (i = j = 0, len = commands.length; j < len; i = ++j) {
  42105. c = commands[i];
  42106. if (typeof runners[name = c.cmd] === "function") {
  42107. runners[name](doc, c.args);
  42108. }
  42109. }
  42110. return cx = cy = px = py = 0;
  42111. };
  42112. runners = {
  42113. M: function(doc, a) {
  42114. cx = a[0];
  42115. cy = a[1];
  42116. px = py = null;
  42117. sx = cx;
  42118. sy = cy;
  42119. return doc.moveTo(cx, cy);
  42120. },
  42121. m: function(doc, a) {
  42122. cx += a[0];
  42123. cy += a[1];
  42124. px = py = null;
  42125. sx = cx;
  42126. sy = cy;
  42127. return doc.moveTo(cx, cy);
  42128. },
  42129. C: function(doc, a) {
  42130. cx = a[4];
  42131. cy = a[5];
  42132. px = a[2];
  42133. py = a[3];
  42134. return doc.bezierCurveTo.apply(doc, a);
  42135. },
  42136. c: function(doc, a) {
  42137. doc.bezierCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy, a[4] + cx, a[5] + cy);
  42138. px = cx + a[2];
  42139. py = cy + a[3];
  42140. cx += a[4];
  42141. return cy += a[5];
  42142. },
  42143. S: function(doc, a) {
  42144. if (px === null) {
  42145. px = cx;
  42146. py = cy;
  42147. }
  42148. doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), a[0], a[1], a[2], a[3]);
  42149. px = a[0];
  42150. py = a[1];
  42151. cx = a[2];
  42152. return cy = a[3];
  42153. },
  42154. s: function(doc, a) {
  42155. if (px === null) {
  42156. px = cx;
  42157. py = cy;
  42158. }
  42159. doc.bezierCurveTo(cx - (px - cx), cy - (py - cy), cx + a[0], cy + a[1], cx + a[2], cy + a[3]);
  42160. px = cx + a[0];
  42161. py = cy + a[1];
  42162. cx += a[2];
  42163. return cy += a[3];
  42164. },
  42165. Q: function(doc, a) {
  42166. px = a[0];
  42167. py = a[1];
  42168. cx = a[2];
  42169. cy = a[3];
  42170. return doc.quadraticCurveTo(a[0], a[1], cx, cy);
  42171. },
  42172. q: function(doc, a) {
  42173. doc.quadraticCurveTo(a[0] + cx, a[1] + cy, a[2] + cx, a[3] + cy);
  42174. px = cx + a[0];
  42175. py = cy + a[1];
  42176. cx += a[2];
  42177. return cy += a[3];
  42178. },
  42179. T: function(doc, a) {
  42180. if (px === null) {
  42181. px = cx;
  42182. py = cy;
  42183. } else {
  42184. px = cx - (px - cx);
  42185. py = cy - (py - cy);
  42186. }
  42187. doc.quadraticCurveTo(px, py, a[0], a[1]);
  42188. px = cx - (px - cx);
  42189. py = cy - (py - cy);
  42190. cx = a[0];
  42191. return cy = a[1];
  42192. },
  42193. t: function(doc, a) {
  42194. if (px === null) {
  42195. px = cx;
  42196. py = cy;
  42197. } else {
  42198. px = cx - (px - cx);
  42199. py = cy - (py - cy);
  42200. }
  42201. doc.quadraticCurveTo(px, py, cx + a[0], cy + a[1]);
  42202. cx += a[0];
  42203. return cy += a[1];
  42204. },
  42205. A: function(doc, a) {
  42206. solveArc(doc, cx, cy, a);
  42207. cx = a[5];
  42208. return cy = a[6];
  42209. },
  42210. a: function(doc, a) {
  42211. a[5] += cx;
  42212. a[6] += cy;
  42213. solveArc(doc, cx, cy, a);
  42214. cx = a[5];
  42215. return cy = a[6];
  42216. },
  42217. L: function(doc, a) {
  42218. cx = a[0];
  42219. cy = a[1];
  42220. px = py = null;
  42221. return doc.lineTo(cx, cy);
  42222. },
  42223. l: function(doc, a) {
  42224. cx += a[0];
  42225. cy += a[1];
  42226. px = py = null;
  42227. return doc.lineTo(cx, cy);
  42228. },
  42229. H: function(doc, a) {
  42230. cx = a[0];
  42231. px = py = null;
  42232. return doc.lineTo(cx, cy);
  42233. },
  42234. h: function(doc, a) {
  42235. cx += a[0];
  42236. px = py = null;
  42237. return doc.lineTo(cx, cy);
  42238. },
  42239. V: function(doc, a) {
  42240. cy = a[0];
  42241. px = py = null;
  42242. return doc.lineTo(cx, cy);
  42243. },
  42244. v: function(doc, a) {
  42245. cy += a[0];
  42246. px = py = null;
  42247. return doc.lineTo(cx, cy);
  42248. },
  42249. Z: function(doc) {
  42250. doc.closePath();
  42251. cx = sx;
  42252. return cy = sy;
  42253. },
  42254. z: function(doc) {
  42255. doc.closePath();
  42256. cx = sx;
  42257. return cy = sy;
  42258. }
  42259. };
  42260. solveArc = function(doc, x, y, coords) {
  42261. var bez, ex, ey, j, large, len, results, rot, rx, ry, seg, segs, sweep;
  42262. rx = coords[0], ry = coords[1], rot = coords[2], large = coords[3], sweep = coords[4], ex = coords[5], ey = coords[6];
  42263. segs = arcToSegments(ex, ey, rx, ry, large, sweep, rot, x, y);
  42264. results = [];
  42265. for (j = 0, len = segs.length; j < len; j++) {
  42266. seg = segs[j];
  42267. bez = segmentToBezier.apply(null, seg);
  42268. results.push(doc.bezierCurveTo.apply(doc, bez));
  42269. }
  42270. return results;
  42271. };
  42272. arcToSegments = function(x, y, rx, ry, large, sweep, rotateX, ox, oy) {
  42273. var a00, a01, a10, a11, cos_th, d, i, j, pl, ref, result, segments, sfactor, sfactor_sq, sin_th, th, th0, th1, th2, th3, th_arc, x0, x1, xc, y0, y1, yc;
  42274. th = rotateX * (Math.PI / 180);
  42275. sin_th = Math.sin(th);
  42276. cos_th = Math.cos(th);
  42277. rx = Math.abs(rx);
  42278. ry = Math.abs(ry);
  42279. px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5;
  42280. py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5;
  42281. pl = (px * px) / (rx * rx) + (py * py) / (ry * ry);
  42282. if (pl > 1) {
  42283. pl = Math.sqrt(pl);
  42284. rx *= pl;
  42285. ry *= pl;
  42286. }
  42287. a00 = cos_th / rx;
  42288. a01 = sin_th / rx;
  42289. a10 = (-sin_th) / ry;
  42290. a11 = cos_th / ry;
  42291. x0 = a00 * ox + a01 * oy;
  42292. y0 = a10 * ox + a11 * oy;
  42293. x1 = a00 * x + a01 * y;
  42294. y1 = a10 * x + a11 * y;
  42295. d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);
  42296. sfactor_sq = 1 / d - 0.25;
  42297. if (sfactor_sq < 0) {
  42298. sfactor_sq = 0;
  42299. }
  42300. sfactor = Math.sqrt(sfactor_sq);
  42301. if (sweep === large) {
  42302. sfactor = -sfactor;
  42303. }
  42304. xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);
  42305. yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);
  42306. th0 = Math.atan2(y0 - yc, x0 - xc);
  42307. th1 = Math.atan2(y1 - yc, x1 - xc);
  42308. th_arc = th1 - th0;
  42309. if (th_arc < 0 && sweep === 1) {
  42310. th_arc += 2 * Math.PI;
  42311. } else if (th_arc > 0 && sweep === 0) {
  42312. th_arc -= 2 * Math.PI;
  42313. }
  42314. segments = Math.ceil(Math.abs(th_arc / (Math.PI * 0.5 + 0.001)));
  42315. result = [];
  42316. for (i = j = 0, ref = segments; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  42317. th2 = th0 + i * th_arc / segments;
  42318. th3 = th0 + (i + 1) * th_arc / segments;
  42319. result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];
  42320. }
  42321. return result;
  42322. };
  42323. segmentToBezier = function(cx, cy, th0, th1, rx, ry, sin_th, cos_th) {
  42324. var a00, a01, a10, a11, t, th_half, x1, x2, x3, y1, y2, y3;
  42325. a00 = cos_th * rx;
  42326. a01 = -sin_th * ry;
  42327. a10 = sin_th * rx;
  42328. a11 = cos_th * ry;
  42329. th_half = 0.5 * (th1 - th0);
  42330. t = (8 / 3) * Math.sin(th_half * 0.5) * Math.sin(th_half * 0.5) / Math.sin(th_half);
  42331. x1 = cx + Math.cos(th0) - t * Math.sin(th0);
  42332. y1 = cy + Math.sin(th0) + t * Math.cos(th0);
  42333. x3 = cx + Math.cos(th1);
  42334. y3 = cy + Math.sin(th1);
  42335. x2 = x3 + t * Math.sin(th1);
  42336. y2 = y3 - t * Math.cos(th1);
  42337. return [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];
  42338. };
  42339. return SVGPath;
  42340. })();
  42341. module.exports = SVGPath;
  42342. }).call(this);
  42343. /***/ }),
  42344. /* 81 */
  42345. /***/ (function(module, exports, __webpack_require__) {
  42346. // Generated by CoffeeScript 1.12.6
  42347. (function() {
  42348. var PDFFont;
  42349. PDFFont = __webpack_require__(82);
  42350. module.exports = {
  42351. initFonts: function() {
  42352. this._fontFamilies = {};
  42353. this._fontCount = 0;
  42354. this._fontSize = 12;
  42355. this._font = null;
  42356. this._registeredFonts = {};
  42357. },
  42358. font: function(src, family, size) {
  42359. var cacheKey, font, id, ref;
  42360. if (typeof family === 'number') {
  42361. size = family;
  42362. family = null;
  42363. }
  42364. if (typeof src === 'string' && this._registeredFonts[src]) {
  42365. cacheKey = src;
  42366. ref = this._registeredFonts[src], src = ref.src, family = ref.family;
  42367. } else {
  42368. cacheKey = family || src;
  42369. if (typeof cacheKey !== 'string') {
  42370. cacheKey = null;
  42371. }
  42372. }
  42373. if (size != null) {
  42374. this.fontSize(size);
  42375. }
  42376. if (font = this._fontFamilies[cacheKey]) {
  42377. this._font = font;
  42378. return this;
  42379. }
  42380. id = 'F' + (++this._fontCount);
  42381. this._font = PDFFont.open(this, src, family, id);
  42382. if (font = this._fontFamilies[this._font.name]) {
  42383. this._font = font;
  42384. return this;
  42385. }
  42386. if (cacheKey) {
  42387. this._fontFamilies[cacheKey] = this._font;
  42388. }
  42389. if (this._font.name) {
  42390. this._fontFamilies[this._font.name] = this._font;
  42391. }
  42392. return this;
  42393. },
  42394. fontSize: function(_fontSize) {
  42395. this._fontSize = _fontSize;
  42396. return this;
  42397. },
  42398. currentLineHeight: function(includeGap) {
  42399. if (includeGap == null) {
  42400. includeGap = false;
  42401. }
  42402. return this._font.lineHeight(this._fontSize, includeGap);
  42403. },
  42404. registerFont: function(name, src, family) {
  42405. this._registeredFonts[name] = {
  42406. src: src,
  42407. family: family
  42408. };
  42409. return this;
  42410. }
  42411. };
  42412. }).call(this);
  42413. /***/ }),
  42414. /* 82 */
  42415. /***/ (function(module, exports, __webpack_require__) {
  42416. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  42417. (function() {
  42418. var EmbeddedFont, PDFFont, StandardFont, fontkit;
  42419. fontkit = __webpack_require__(83);
  42420. PDFFont = (function() {
  42421. PDFFont.open = function(document, src, family, id) {
  42422. var font;
  42423. if (typeof src === 'string') {
  42424. if (StandardFont.isStandardFont(src)) {
  42425. return new StandardFont(document, src, id);
  42426. }
  42427. font = fontkit.openSync(src, family);
  42428. } else if (Buffer.isBuffer(src)) {
  42429. font = fontkit.create(src, family);
  42430. } else if (src instanceof Uint8Array) {
  42431. font = fontkit.create(new Buffer(src), family);
  42432. } else if (src instanceof ArrayBuffer) {
  42433. font = fontkit.create(new Buffer(new Uint8Array(src)), family);
  42434. }
  42435. if (font == null) {
  42436. throw new Error('Not a supported font format or standard PDF font.');
  42437. }
  42438. return new EmbeddedFont(document, font, id);
  42439. };
  42440. function PDFFont() {
  42441. throw new Error('Cannot construct a PDFFont directly.');
  42442. }
  42443. PDFFont.prototype.encode = function(text) {
  42444. throw new Error('Must be implemented by subclasses');
  42445. };
  42446. PDFFont.prototype.widthOfString = function(text) {
  42447. throw new Error('Must be implemented by subclasses');
  42448. };
  42449. PDFFont.prototype.ref = function() {
  42450. return this.dictionary != null ? this.dictionary : this.dictionary = this.document.ref();
  42451. };
  42452. PDFFont.prototype.finalize = function() {
  42453. if (this.embedded || (this.dictionary == null)) {
  42454. return;
  42455. }
  42456. this.embed();
  42457. return this.embedded = true;
  42458. };
  42459. PDFFont.prototype.embed = function() {
  42460. throw new Error('Must be implemented by subclasses');
  42461. };
  42462. PDFFont.prototype.lineHeight = function(size, includeGap) {
  42463. var gap;
  42464. if (includeGap == null) {
  42465. includeGap = false;
  42466. }
  42467. gap = includeGap ? this.lineGap : 0;
  42468. return (this.ascender + gap - this.descender) / 1000 * size;
  42469. };
  42470. return PDFFont;
  42471. })();
  42472. module.exports = PDFFont;
  42473. StandardFont = __webpack_require__(285);
  42474. EmbeddedFont = __webpack_require__(287);
  42475. }).call(this);
  42476. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  42477. /***/ }),
  42478. /* 83 */
  42479. /***/ (function(module, exports, __webpack_require__) {
  42480. /* WEBPACK VAR INJECTION */(function(Buffer, process) {'use strict';
  42481. function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
  42482. var r = _interopDefault(__webpack_require__(84));
  42483. var _Object$getOwnPropertyDescriptor = _interopDefault(__webpack_require__(122));
  42484. var _getIterator = _interopDefault(__webpack_require__(148));
  42485. var _Object$freeze = _interopDefault(__webpack_require__(181));
  42486. var _Object$keys = _interopDefault(__webpack_require__(185));
  42487. var _typeof = _interopDefault(__webpack_require__(188));
  42488. var _Object$defineProperty = _interopDefault(__webpack_require__(205));
  42489. var _classCallCheck = _interopDefault(__webpack_require__(208));
  42490. var _createClass = _interopDefault(__webpack_require__(209));
  42491. var _Map = _interopDefault(__webpack_require__(210));
  42492. var _possibleConstructorReturn = _interopDefault(__webpack_require__(227));
  42493. var _inherits = _interopDefault(__webpack_require__(228));
  42494. var restructure_src_utils = __webpack_require__(110);
  42495. var _Object$defineProperties = _interopDefault(__webpack_require__(236));
  42496. var isEqual = _interopDefault(__webpack_require__(239));
  42497. var _Object$assign = _interopDefault(__webpack_require__(242));
  42498. var _String$fromCodePoint = _interopDefault(__webpack_require__(246));
  42499. var _Array$from = _interopDefault(__webpack_require__(249));
  42500. var _Set = _interopDefault(__webpack_require__(254));
  42501. var unicode = _interopDefault(__webpack_require__(258));
  42502. var UnicodeTrie = _interopDefault(__webpack_require__(17));
  42503. var StateMachine = _interopDefault(__webpack_require__(260));
  42504. var _Number$EPSILON = _interopDefault(__webpack_require__(269));
  42505. var cloneDeep = _interopDefault(__webpack_require__(272));
  42506. var inflate = _interopDefault(__webpack_require__(18));
  42507. var brotli = _interopDefault(__webpack_require__(273));
  42508. var fontkit = {};
  42509. fontkit.logErrors = false;
  42510. var formats = [];
  42511. fontkit.registerFormat = function (format) {
  42512. formats.push(format);
  42513. };
  42514. fontkit.openSync = function (filename, postscriptName) {
  42515. var buffer = __webpack_require__(56).readFileSync(filename);
  42516. return fontkit.create(buffer, postscriptName);
  42517. };
  42518. fontkit.open = function (filename, postscriptName, callback) {
  42519. if (typeof postscriptName === 'function') {
  42520. callback = postscriptName;
  42521. postscriptName = null;
  42522. }
  42523. __webpack_require__(56).readFile(filename, function (err, buffer) {
  42524. if (err) {
  42525. return callback(err);
  42526. }
  42527. try {
  42528. var font = fontkit.create(buffer, postscriptName);
  42529. } catch (e) {
  42530. return callback(e);
  42531. }
  42532. return callback(null, font);
  42533. });
  42534. return;
  42535. };
  42536. fontkit.create = function (buffer, postscriptName) {
  42537. for (var i = 0; i < formats.length; i++) {
  42538. var format = formats[i];
  42539. if (format.probe(buffer)) {
  42540. var font = new format(new r.DecodeStream(buffer));
  42541. if (postscriptName) {
  42542. return font.getFont(postscriptName);
  42543. }
  42544. return font;
  42545. }
  42546. }
  42547. throw new Error('Unknown font format');
  42548. };
  42549. /**
  42550. * This decorator caches the results of a getter or method such that
  42551. * the results are lazily computed once, and then cached.
  42552. * @private
  42553. */
  42554. function cache(target, key, descriptor) {
  42555. if (descriptor.get) {
  42556. var get = descriptor.get;
  42557. descriptor.get = function () {
  42558. var value = get.call(this);
  42559. _Object$defineProperty(this, key, { value: value });
  42560. return value;
  42561. };
  42562. } else if (typeof descriptor.value === 'function') {
  42563. var fn = descriptor.value;
  42564. return {
  42565. get: function get() {
  42566. var cache = new _Map();
  42567. function memoized() {
  42568. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  42569. args[_key] = arguments[_key];
  42570. }
  42571. var key = args.length > 0 ? args[0] : 'value';
  42572. if (cache.has(key)) {
  42573. return cache.get(key);
  42574. }
  42575. var result = fn.apply(this, args);
  42576. cache.set(key, result);
  42577. return result;
  42578. };
  42579. _Object$defineProperty(this, key, { value: memoized });
  42580. return memoized;
  42581. }
  42582. };
  42583. }
  42584. }
  42585. var SubHeader = new r.Struct({
  42586. firstCode: r.uint16,
  42587. entryCount: r.uint16,
  42588. idDelta: r.int16,
  42589. idRangeOffset: r.uint16
  42590. });
  42591. var CmapGroup = new r.Struct({
  42592. startCharCode: r.uint32,
  42593. endCharCode: r.uint32,
  42594. glyphID: r.uint32
  42595. });
  42596. var UnicodeValueRange = new r.Struct({
  42597. startUnicodeValue: r.uint24,
  42598. additionalCount: r.uint8
  42599. });
  42600. var UVSMapping = new r.Struct({
  42601. unicodeValue: r.uint24,
  42602. glyphID: r.uint16
  42603. });
  42604. var DefaultUVS = new r.Array(UnicodeValueRange, r.uint32);
  42605. var NonDefaultUVS = new r.Array(UVSMapping, r.uint32);
  42606. var VarSelectorRecord = new r.Struct({
  42607. varSelector: r.uint24,
  42608. defaultUVS: new r.Pointer(r.uint32, DefaultUVS, { type: 'parent' }),
  42609. nonDefaultUVS: new r.Pointer(r.uint32, NonDefaultUVS, { type: 'parent' })
  42610. });
  42611. var CmapSubtable = new r.VersionedStruct(r.uint16, {
  42612. 0: { // Byte encoding
  42613. length: r.uint16, // Total table length in bytes (set to 262 for format 0)
  42614. language: r.uint16, // Language code for this encoding subtable, or zero if language-independent
  42615. codeMap: new r.LazyArray(r.uint8, 256)
  42616. },
  42617. 2: { // High-byte mapping (CJK)
  42618. length: r.uint16,
  42619. language: r.uint16,
  42620. subHeaderKeys: new r.Array(r.uint16, 256),
  42621. subHeaderCount: function subHeaderCount(t) {
  42622. return Math.max.apply(Math, t.subHeaderKeys);
  42623. },
  42624. subHeaders: new r.LazyArray(SubHeader, 'subHeaderCount'),
  42625. glyphIndexArray: new r.LazyArray(r.uint16, 'subHeaderCount')
  42626. },
  42627. 4: { // Segment mapping to delta values
  42628. length: r.uint16, // Total table length in bytes
  42629. language: r.uint16, // Language code
  42630. segCountX2: r.uint16,
  42631. segCount: function segCount(t) {
  42632. return t.segCountX2 >> 1;
  42633. },
  42634. searchRange: r.uint16,
  42635. entrySelector: r.uint16,
  42636. rangeShift: r.uint16,
  42637. endCode: new r.LazyArray(r.uint16, 'segCount'),
  42638. reservedPad: new r.Reserved(r.uint16), // This value should be zero
  42639. startCode: new r.LazyArray(r.uint16, 'segCount'),
  42640. idDelta: new r.LazyArray(r.int16, 'segCount'),
  42641. idRangeOffset: new r.LazyArray(r.uint16, 'segCount'),
  42642. glyphIndexArray: new r.LazyArray(r.uint16, function (t) {
  42643. return (t.length - t._currentOffset) / 2;
  42644. })
  42645. },
  42646. 6: { // Trimmed table
  42647. length: r.uint16,
  42648. language: r.uint16,
  42649. firstCode: r.uint16,
  42650. entryCount: r.uint16,
  42651. glyphIndices: new r.LazyArray(r.uint16, 'entryCount')
  42652. },
  42653. 8: { // mixed 16-bit and 32-bit coverage
  42654. reserved: new r.Reserved(r.uint16),
  42655. length: r.uint32,
  42656. language: r.uint16,
  42657. is32: new r.LazyArray(r.uint8, 8192),
  42658. nGroups: r.uint32,
  42659. groups: new r.LazyArray(CmapGroup, 'nGroups')
  42660. },
  42661. 10: { // Trimmed Array
  42662. reserved: new r.Reserved(r.uint16),
  42663. length: r.uint32,
  42664. language: r.uint32,
  42665. firstCode: r.uint32,
  42666. entryCount: r.uint32,
  42667. glyphIndices: new r.LazyArray(r.uint16, 'numChars')
  42668. },
  42669. 12: { // Segmented coverage
  42670. reserved: new r.Reserved(r.uint16),
  42671. length: r.uint32,
  42672. language: r.uint32,
  42673. nGroups: r.uint32,
  42674. groups: new r.LazyArray(CmapGroup, 'nGroups')
  42675. },
  42676. 13: { // Many-to-one range mappings (same as 12 except for group.startGlyphID)
  42677. reserved: new r.Reserved(r.uint16),
  42678. length: r.uint32,
  42679. language: r.uint32,
  42680. nGroups: r.uint32,
  42681. groups: new r.LazyArray(CmapGroup, 'nGroups')
  42682. },
  42683. 14: { // Unicode Variation Sequences
  42684. length: r.uint32,
  42685. numRecords: r.uint32,
  42686. varSelectors: new r.LazyArray(VarSelectorRecord, 'numRecords')
  42687. }
  42688. });
  42689. var CmapEntry = new r.Struct({
  42690. platformID: r.uint16, // Platform identifier
  42691. encodingID: r.uint16, // Platform-specific encoding identifier
  42692. table: new r.Pointer(r.uint32, CmapSubtable, { type: 'parent', lazy: true })
  42693. });
  42694. // character to glyph mapping
  42695. var cmap = new r.Struct({
  42696. version: r.uint16,
  42697. numSubtables: r.uint16,
  42698. tables: new r.Array(CmapEntry, 'numSubtables')
  42699. });
  42700. // font header
  42701. var head = new r.Struct({
  42702. version: r.int32, // 0x00010000 (version 1.0)
  42703. revision: r.int32, // set by font manufacturer
  42704. checkSumAdjustment: r.uint32,
  42705. magicNumber: r.uint32, // set to 0x5F0F3CF5
  42706. flags: r.uint16,
  42707. unitsPerEm: r.uint16, // range from 64 to 16384
  42708. created: new r.Array(r.int32, 2),
  42709. modified: new r.Array(r.int32, 2),
  42710. xMin: r.int16, // for all glyph bounding boxes
  42711. yMin: r.int16, // for all glyph bounding boxes
  42712. xMax: r.int16, // for all glyph bounding boxes
  42713. yMax: r.int16, // for all glyph bounding boxes
  42714. macStyle: new r.Bitfield(r.uint16, ['bold', 'italic', 'underline', 'outline', 'shadow', 'condensed', 'extended']),
  42715. lowestRecPPEM: r.uint16, // smallest readable size in pixels
  42716. fontDirectionHint: r.int16,
  42717. indexToLocFormat: r.int16, // 0 for short offsets, 1 for long
  42718. glyphDataFormat: r.int16 // 0 for current format
  42719. });
  42720. // horizontal header
  42721. var hhea = new r.Struct({
  42722. version: r.int32,
  42723. ascent: r.int16, // Distance from baseline of highest ascender
  42724. descent: r.int16, // Distance from baseline of lowest descender
  42725. lineGap: r.int16, // Typographic line gap
  42726. advanceWidthMax: r.uint16, // Maximum advance width value in 'hmtx' table
  42727. minLeftSideBearing: r.int16, // Maximum advance width value in 'hmtx' table
  42728. minRightSideBearing: r.int16, // Minimum right sidebearing value
  42729. xMaxExtent: r.int16,
  42730. caretSlopeRise: r.int16, // Used to calculate the slope of the cursor (rise/run); 1 for vertical
  42731. caretSlopeRun: r.int16, // 0 for vertical
  42732. caretOffset: r.int16, // Set to 0 for non-slanted fonts
  42733. reserved: new r.Reserved(r.int16, 4),
  42734. metricDataFormat: r.int16, // 0 for current format
  42735. numberOfMetrics: r.uint16 // Number of advance widths in 'hmtx' table
  42736. });
  42737. var HmtxEntry = new r.Struct({
  42738. advance: r.uint16,
  42739. bearing: r.int16
  42740. });
  42741. var hmtx = new r.Struct({
  42742. metrics: new r.LazyArray(HmtxEntry, function (t) {
  42743. return t.parent.hhea.numberOfMetrics;
  42744. }),
  42745. bearings: new r.LazyArray(r.int16, function (t) {
  42746. return t.parent.maxp.numGlyphs - t.parent.hhea.numberOfMetrics;
  42747. })
  42748. });
  42749. // maxiumum profile
  42750. var maxp = new r.Struct({
  42751. version: r.int32,
  42752. numGlyphs: r.uint16, // The number of glyphs in the font
  42753. maxPoints: r.uint16, // Maximum points in a non-composite glyph
  42754. maxContours: r.uint16, // Maximum contours in a non-composite glyph
  42755. maxComponentPoints: r.uint16, // Maximum points in a composite glyph
  42756. maxComponentContours: r.uint16, // Maximum contours in a composite glyph
  42757. maxZones: r.uint16, // 1 if instructions do not use the twilight zone, 2 otherwise
  42758. maxTwilightPoints: r.uint16, // Maximum points used in Z0
  42759. maxStorage: r.uint16, // Number of Storage Area locations
  42760. maxFunctionDefs: r.uint16, // Number of FDEFs
  42761. maxInstructionDefs: r.uint16, // Number of IDEFs
  42762. maxStackElements: r.uint16, // Maximum stack depth
  42763. maxSizeOfInstructions: r.uint16, // Maximum byte count for glyph instructions
  42764. maxComponentElements: r.uint16, // Maximum number of components referenced at “top level” for any composite glyph
  42765. maxComponentDepth: r.uint16 // Maximum levels of recursion; 1 for simple components
  42766. });
  42767. /**
  42768. * Gets an encoding name from platform, encoding, and language ids.
  42769. * Returned encoding names can be used in iconv-lite to decode text.
  42770. */
  42771. function getEncoding(platformID, encodingID) {
  42772. var languageID = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  42773. if (platformID === 1 && MAC_LANGUAGE_ENCODINGS[languageID]) {
  42774. return MAC_LANGUAGE_ENCODINGS[languageID];
  42775. }
  42776. return ENCODINGS[platformID][encodingID];
  42777. }
  42778. // Map of platform ids to encoding ids.
  42779. var ENCODINGS = [
  42780. // unicode
  42781. ['utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be', 'utf16be'],
  42782. // macintosh
  42783. // Mappings available at http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/
  42784. // 0 Roman 17 Malayalam
  42785. // 1 Japanese 18 Sinhalese
  42786. // 2 Traditional Chinese 19 Burmese
  42787. // 3 Korean 20 Khmer
  42788. // 4 Arabic 21 Thai
  42789. // 5 Hebrew 22 Laotian
  42790. // 6 Greek 23 Georgian
  42791. // 7 Russian 24 Armenian
  42792. // 8 RSymbol 25 Simplified Chinese
  42793. // 9 Devanagari 26 Tibetan
  42794. // 10 Gurmukhi 27 Mongolian
  42795. // 11 Gujarati 28 Geez
  42796. // 12 Oriya 29 Slavic
  42797. // 13 Bengali 30 Vietnamese
  42798. // 14 Tamil 31 Sindhi
  42799. // 15 Telugu 32 (Uninterpreted)
  42800. // 16 Kannada
  42801. ['macroman', 'shift-jis', 'big5', 'euc-kr', 'iso-8859-6', 'iso-8859-8', 'macgreek', 'maccyrillic', 'symbol', 'Devanagari', 'Gurmukhi', 'Gujarati', 'Oriya', 'Bengali', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhalese', 'Burmese', 'Khmer', 'macthai', 'Laotian', 'Georgian', 'Armenian', 'gb-2312-80', 'Tibetan', 'Mongolian', 'Geez', 'maccenteuro', 'Vietnamese', 'Sindhi'],
  42802. // ISO (deprecated)
  42803. ['ascii'],
  42804. // windows
  42805. // Docs here: http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
  42806. ['symbol', 'utf16be', 'shift-jis', 'gb18030', 'big5', 'wansung', 'johab', null, null, null, 'utf16be']];
  42807. // Overrides for Mac scripts by language id.
  42808. // See http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt
  42809. var MAC_LANGUAGE_ENCODINGS = {
  42810. 15: 'maciceland',
  42811. 17: 'macturkish',
  42812. 18: 'maccroatian',
  42813. 24: 'maccenteuro',
  42814. 25: 'maccenteuro',
  42815. 26: 'maccenteuro',
  42816. 27: 'maccenteuro',
  42817. 28: 'maccenteuro',
  42818. 30: 'maciceland',
  42819. 37: 'macromania',
  42820. 38: 'maccenteuro',
  42821. 39: 'maccenteuro',
  42822. 40: 'maccenteuro',
  42823. 143: 'macinuit', // Unsupported by iconv-lite
  42824. 146: 'macgaelic' // Unsupported by iconv-lite
  42825. };
  42826. // Map of platform ids to BCP-47 language codes.
  42827. var LANGUAGES = [
  42828. // unicode
  42829. [], { // macintosh
  42830. 0: 'en', 30: 'fo', 60: 'ks', 90: 'rw',
  42831. 1: 'fr', 31: 'fa', 61: 'ku', 91: 'rn',
  42832. 2: 'de', 32: 'ru', 62: 'sd', 92: 'ny',
  42833. 3: 'it', 33: 'zh', 63: 'bo', 93: 'mg',
  42834. 4: 'nl', 34: 'nl-BE', 64: 'ne', 94: 'eo',
  42835. 5: 'sv', 35: 'ga', 65: 'sa', 128: 'cy',
  42836. 6: 'es', 36: 'sq', 66: 'mr', 129: 'eu',
  42837. 7: 'da', 37: 'ro', 67: 'bn', 130: 'ca',
  42838. 8: 'pt', 38: 'cz', 68: 'as', 131: 'la',
  42839. 9: 'no', 39: 'sk', 69: 'gu', 132: 'qu',
  42840. 10: 'he', 40: 'si', 70: 'pa', 133: 'gn',
  42841. 11: 'ja', 41: 'yi', 71: 'or', 134: 'ay',
  42842. 12: 'ar', 42: 'sr', 72: 'ml', 135: 'tt',
  42843. 13: 'fi', 43: 'mk', 73: 'kn', 136: 'ug',
  42844. 14: 'el', 44: 'bg', 74: 'ta', 137: 'dz',
  42845. 15: 'is', 45: 'uk', 75: 'te', 138: 'jv',
  42846. 16: 'mt', 46: 'be', 76: 'si', 139: 'su',
  42847. 17: 'tr', 47: 'uz', 77: 'my', 140: 'gl',
  42848. 18: 'hr', 48: 'kk', 78: 'km', 141: 'af',
  42849. 19: 'zh-Hant', 49: 'az-Cyrl', 79: 'lo', 142: 'br',
  42850. 20: 'ur', 50: 'az-Arab', 80: 'vi', 143: 'iu',
  42851. 21: 'hi', 51: 'hy', 81: 'id', 144: 'gd',
  42852. 22: 'th', 52: 'ka', 82: 'tl', 145: 'gv',
  42853. 23: 'ko', 53: 'mo', 83: 'ms', 146: 'ga',
  42854. 24: 'lt', 54: 'ky', 84: 'ms-Arab', 147: 'to',
  42855. 25: 'pl', 55: 'tg', 85: 'am', 148: 'el-polyton',
  42856. 26: 'hu', 56: 'tk', 86: 'ti', 149: 'kl',
  42857. 27: 'es', 57: 'mn-CN', 87: 'om', 150: 'az',
  42858. 28: 'lv', 58: 'mn', 88: 'so', 151: 'nn',
  42859. 29: 'se', 59: 'ps', 89: 'sw'
  42860. },
  42861. // ISO (deprecated)
  42862. [], { // windows
  42863. 0x0436: 'af', 0x4009: 'en-IN', 0x0487: 'rw', 0x0432: 'tn',
  42864. 0x041C: 'sq', 0x1809: 'en-IE', 0x0441: 'sw', 0x045B: 'si',
  42865. 0x0484: 'gsw', 0x2009: 'en-JM', 0x0457: 'kok', 0x041B: 'sk',
  42866. 0x045E: 'am', 0x4409: 'en-MY', 0x0412: 'ko', 0x0424: 'sl',
  42867. 0x1401: 'ar-DZ', 0x1409: 'en-NZ', 0x0440: 'ky', 0x2C0A: 'es-AR',
  42868. 0x3C01: 'ar-BH', 0x3409: 'en-PH', 0x0454: 'lo', 0x400A: 'es-BO',
  42869. 0x0C01: 'ar', 0x4809: 'en-SG', 0x0426: 'lv', 0x340A: 'es-CL',
  42870. 0x0801: 'ar-IQ', 0x1C09: 'en-ZA', 0x0427: 'lt', 0x240A: 'es-CO',
  42871. 0x2C01: 'ar-JO', 0x2C09: 'en-TT', 0x082E: 'dsb', 0x140A: 'es-CR',
  42872. 0x3401: 'ar-KW', 0x0809: 'en-GB', 0x046E: 'lb', 0x1C0A: 'es-DO',
  42873. 0x3001: 'ar-LB', 0x0409: 'en', 0x042F: 'mk', 0x300A: 'es-EC',
  42874. 0x1001: 'ar-LY', 0x3009: 'en-ZW', 0x083E: 'ms-BN', 0x440A: 'es-SV',
  42875. 0x1801: 'ary', 0x0425: 'et', 0x043E: 'ms', 0x100A: 'es-GT',
  42876. 0x2001: 'ar-OM', 0x0438: 'fo', 0x044C: 'ml', 0x480A: 'es-HN',
  42877. 0x4001: 'ar-QA', 0x0464: 'fil', 0x043A: 'mt', 0x080A: 'es-MX',
  42878. 0x0401: 'ar-SA', 0x040B: 'fi', 0x0481: 'mi', 0x4C0A: 'es-NI',
  42879. 0x2801: 'ar-SY', 0x080C: 'fr-BE', 0x047A: 'arn', 0x180A: 'es-PA',
  42880. 0x1C01: 'aeb', 0x0C0C: 'fr-CA', 0x044E: 'mr', 0x3C0A: 'es-PY',
  42881. 0x3801: 'ar-AE', 0x040C: 'fr', 0x047C: 'moh', 0x280A: 'es-PE',
  42882. 0x2401: 'ar-YE', 0x140C: 'fr-LU', 0x0450: 'mn', 0x500A: 'es-PR',
  42883. 0x042B: 'hy', 0x180C: 'fr-MC', 0x0850: 'mn-CN', 0x0C0A: 'es',
  42884. 0x044D: 'as', 0x100C: 'fr-CH', 0x0461: 'ne', 0x040A: 'es',
  42885. 0x082C: 'az-Cyrl', 0x0462: 'fy', 0x0414: 'nb', 0x540A: 'es-US',
  42886. 0x042C: 'az', 0x0456: 'gl', 0x0814: 'nn', 0x380A: 'es-UY',
  42887. 0x046D: 'ba', 0x0437: 'ka', 0x0482: 'oc', 0x200A: 'es-VE',
  42888. 0x042D: 'eu', 0x0C07: 'de-AT', 0x0448: 'or', 0x081D: 'sv-FI',
  42889. 0x0423: 'be', 0x0407: 'de', 0x0463: 'ps', 0x041D: 'sv',
  42890. 0x0845: 'bn', 0x1407: 'de-LI', 0x0415: 'pl', 0x045A: 'syr',
  42891. 0x0445: 'bn-IN', 0x1007: 'de-LU', 0x0416: 'pt', 0x0428: 'tg',
  42892. 0x201A: 'bs-Cyrl', 0x0807: 'de-CH', 0x0816: 'pt-PT', 0x085F: 'tzm',
  42893. 0x141A: 'bs', 0x0408: 'el', 0x0446: 'pa', 0x0449: 'ta',
  42894. 0x047E: 'br', 0x046F: 'kl', 0x046B: 'qu-BO', 0x0444: 'tt',
  42895. 0x0402: 'bg', 0x0447: 'gu', 0x086B: 'qu-EC', 0x044A: 'te',
  42896. 0x0403: 'ca', 0x0468: 'ha', 0x0C6B: 'qu', 0x041E: 'th',
  42897. 0x0C04: 'zh-HK', 0x040D: 'he', 0x0418: 'ro', 0x0451: 'bo',
  42898. 0x1404: 'zh-MO', 0x0439: 'hi', 0x0417: 'rm', 0x041F: 'tr',
  42899. 0x0804: 'zh', 0x040E: 'hu', 0x0419: 'ru', 0x0442: 'tk',
  42900. 0x1004: 'zh-SG', 0x040F: 'is', 0x243B: 'smn', 0x0480: 'ug',
  42901. 0x0404: 'zh-TW', 0x0470: 'ig', 0x103B: 'smj-NO', 0x0422: 'uk',
  42902. 0x0483: 'co', 0x0421: 'id', 0x143B: 'smj', 0x042E: 'hsb',
  42903. 0x041A: 'hr', 0x045D: 'iu', 0x0C3B: 'se-FI', 0x0420: 'ur',
  42904. 0x101A: 'hr-BA', 0x085D: 'iu-Latn', 0x043B: 'se', 0x0843: 'uz-Cyrl',
  42905. 0x0405: 'cs', 0x083C: 'ga', 0x083B: 'se-SE', 0x0443: 'uz',
  42906. 0x0406: 'da', 0x0434: 'xh', 0x203B: 'sms', 0x042A: 'vi',
  42907. 0x048C: 'prs', 0x0435: 'zu', 0x183B: 'sma-NO', 0x0452: 'cy',
  42908. 0x0465: 'dv', 0x0410: 'it', 0x1C3B: 'sms', 0x0488: 'wo',
  42909. 0x0813: 'nl-BE', 0x0810: 'it-CH', 0x044F: 'sa', 0x0485: 'sah',
  42910. 0x0413: 'nl', 0x0411: 'ja', 0x1C1A: 'sr-Cyrl-BA', 0x0478: 'ii',
  42911. 0x0C09: 'en-AU', 0x044B: 'kn', 0x0C1A: 'sr', 0x046A: 'yo',
  42912. 0x2809: 'en-BZ', 0x043F: 'kk', 0x181A: 'sr-Latn-BA',
  42913. 0x1009: 'en-CA', 0x0453: 'km', 0x081A: 'sr-Latn',
  42914. 0x2409: 'en-029', 0x0486: 'quc', 0x046C: 'nso'
  42915. }];
  42916. var NameRecord = new r.Struct({
  42917. platformID: r.uint16,
  42918. encodingID: r.uint16,
  42919. languageID: r.uint16,
  42920. nameID: r.uint16,
  42921. length: r.uint16,
  42922. string: new r.Pointer(r.uint16, new r.String('length', function (t) {
  42923. return getEncoding(t.platformID, t.encodingID, t.languageID);
  42924. }), { type: 'parent', relativeTo: 'parent.stringOffset', allowNull: false })
  42925. });
  42926. var LangTagRecord = new r.Struct({
  42927. length: r.uint16,
  42928. tag: new r.Pointer(r.uint16, new r.String('length', 'utf16be'), { type: 'parent', relativeTo: 'stringOffset' })
  42929. });
  42930. var NameTable = new r.VersionedStruct(r.uint16, {
  42931. 0: {
  42932. count: r.uint16,
  42933. stringOffset: r.uint16,
  42934. records: new r.Array(NameRecord, 'count')
  42935. },
  42936. 1: {
  42937. count: r.uint16,
  42938. stringOffset: r.uint16,
  42939. records: new r.Array(NameRecord, 'count'),
  42940. langTagCount: r.uint16,
  42941. langTags: new r.Array(LangTagRecord, 'langTagCount')
  42942. }
  42943. });
  42944. var NAMES = ['copyright', 'fontFamily', 'fontSubfamily', 'uniqueSubfamily', 'fullName', 'version', 'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII.
  42945. 'trademark', 'manufacturer', 'designer', 'description', 'vendorURL', 'designerURL', 'license', 'licenseURL', null, // reserved
  42946. 'preferredFamily', 'preferredSubfamily', 'compatibleFull', 'sampleText', 'postscriptCIDFontName', 'wwsFamilyName', 'wwsSubfamilyName'];
  42947. NameTable.process = function (stream) {
  42948. var records = {};
  42949. for (var _iterator = this.records, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  42950. var _ref;
  42951. if (_isArray) {
  42952. if (_i >= _iterator.length) break;
  42953. _ref = _iterator[_i++];
  42954. } else {
  42955. _i = _iterator.next();
  42956. if (_i.done) break;
  42957. _ref = _i.value;
  42958. }
  42959. var record = _ref;
  42960. // find out what language this is for
  42961. var language = LANGUAGES[record.platformID][record.languageID];
  42962. if (language == null && this.langTags != null && record.languageID >= 0x8000) {
  42963. language = this.langTags[record.languageID - 0x8000].tag;
  42964. }
  42965. if (language == null) {
  42966. language = record.platformID + '-' + record.languageID;
  42967. }
  42968. // if the nameID is >= 256, it is a font feature record (AAT)
  42969. var key = record.nameID >= 256 ? 'fontFeatures' : NAMES[record.nameID] || record.nameID;
  42970. if (records[key] == null) {
  42971. records[key] = {};
  42972. }
  42973. var obj = records[key];
  42974. if (record.nameID >= 256) {
  42975. obj = obj[record.nameID] || (obj[record.nameID] = {});
  42976. }
  42977. if (typeof record.string === 'string' || typeof obj[language] !== 'string') {
  42978. obj[language] = record.string;
  42979. }
  42980. }
  42981. this.records = records;
  42982. };
  42983. NameTable.preEncode = function () {
  42984. if (Array.isArray(this.records)) return;
  42985. this.version = 0;
  42986. var records = [];
  42987. for (var key in this.records) {
  42988. var val = this.records[key];
  42989. if (key === 'fontFeatures') continue;
  42990. records.push({
  42991. platformID: 3,
  42992. encodingID: 1,
  42993. languageID: 0x409,
  42994. nameID: NAMES.indexOf(key),
  42995. length: Buffer.byteLength(val.en, 'utf16le'),
  42996. string: val.en
  42997. });
  42998. if (key === 'postscriptName') {
  42999. records.push({
  43000. platformID: 1,
  43001. encodingID: 0,
  43002. languageID: 0,
  43003. nameID: NAMES.indexOf(key),
  43004. length: val.en.length,
  43005. string: val.en
  43006. });
  43007. }
  43008. }
  43009. this.records = records;
  43010. this.count = records.length;
  43011. this.stringOffset = NameTable.size(this, null, false);
  43012. };
  43013. var OS2 = new r.VersionedStruct(r.uint16, {
  43014. header: {
  43015. xAvgCharWidth: r.int16, // average weighted advance width of lower case letters and space
  43016. usWeightClass: r.uint16, // visual weight of stroke in glyphs
  43017. usWidthClass: r.uint16, // relative change from the normal aspect ratio (width to height ratio)
  43018. fsType: new r.Bitfield(r.uint16, [// Indicates font embedding licensing rights
  43019. null, 'noEmbedding', 'viewOnly', 'editable', null, null, null, null, 'noSubsetting', 'bitmapOnly']),
  43020. ySubscriptXSize: r.int16, // recommended horizontal size in pixels for subscripts
  43021. ySubscriptYSize: r.int16, // recommended vertical size in pixels for subscripts
  43022. ySubscriptXOffset: r.int16, // recommended horizontal offset for subscripts
  43023. ySubscriptYOffset: r.int16, // recommended vertical offset form the baseline for subscripts
  43024. ySuperscriptXSize: r.int16, // recommended horizontal size in pixels for superscripts
  43025. ySuperscriptYSize: r.int16, // recommended vertical size in pixels for superscripts
  43026. ySuperscriptXOffset: r.int16, // recommended horizontal offset for superscripts
  43027. ySuperscriptYOffset: r.int16, // recommended vertical offset from the baseline for superscripts
  43028. yStrikeoutSize: r.int16, // width of the strikeout stroke
  43029. yStrikeoutPosition: r.int16, // position of the strikeout stroke relative to the baseline
  43030. sFamilyClass: r.int16, // classification of font-family design
  43031. panose: new r.Array(r.uint8, 10), // describe the visual characteristics of a given typeface
  43032. ulCharRange: new r.Array(r.uint32, 4),
  43033. vendorID: new r.String(4), // four character identifier for the font vendor
  43034. fsSelection: new r.Bitfield(r.uint16, [// bit field containing information about the font
  43035. 'italic', 'underscore', 'negative', 'outlined', 'strikeout', 'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique']),
  43036. usFirstCharIndex: r.uint16, // The minimum Unicode index in this font
  43037. usLastCharIndex: r.uint16 // The maximum Unicode index in this font
  43038. },
  43039. // The Apple version of this table ends here, but the Microsoft one continues on...
  43040. 0: {},
  43041. 1: {
  43042. typoAscender: r.int16,
  43043. typoDescender: r.int16,
  43044. typoLineGap: r.int16,
  43045. winAscent: r.uint16,
  43046. winDescent: r.uint16,
  43047. codePageRange: new r.Array(r.uint32, 2)
  43048. },
  43049. 2: {
  43050. // these should be common with version 1 somehow
  43051. typoAscender: r.int16,
  43052. typoDescender: r.int16,
  43053. typoLineGap: r.int16,
  43054. winAscent: r.uint16,
  43055. winDescent: r.uint16,
  43056. codePageRange: new r.Array(r.uint32, 2),
  43057. xHeight: r.int16,
  43058. capHeight: r.int16,
  43059. defaultChar: r.uint16,
  43060. breakChar: r.uint16,
  43061. maxContent: r.uint16
  43062. },
  43063. 5: {
  43064. typoAscender: r.int16,
  43065. typoDescender: r.int16,
  43066. typoLineGap: r.int16,
  43067. winAscent: r.uint16,
  43068. winDescent: r.uint16,
  43069. codePageRange: new r.Array(r.uint32, 2),
  43070. xHeight: r.int16,
  43071. capHeight: r.int16,
  43072. defaultChar: r.uint16,
  43073. breakChar: r.uint16,
  43074. maxContent: r.uint16,
  43075. usLowerOpticalPointSize: r.uint16,
  43076. usUpperOpticalPointSize: r.uint16
  43077. }
  43078. });
  43079. var versions = OS2.versions;
  43080. versions[3] = versions[4] = versions[2];
  43081. // PostScript information
  43082. var post = new r.VersionedStruct(r.fixed32, {
  43083. header: { // these fields exist at the top of all versions
  43084. italicAngle: r.fixed32, // Italic angle in counter-clockwise degrees from the vertical.
  43085. underlinePosition: r.int16, // Suggested distance of the top of the underline from the baseline
  43086. underlineThickness: r.int16, // Suggested values for the underline thickness
  43087. isFixedPitch: r.uint32, // Whether the font is monospaced
  43088. minMemType42: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 42 font
  43089. maxMemType42: r.uint32, // Maximum memory usage when a TrueType font is downloaded as a Type 42 font
  43090. minMemType1: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 1 font
  43091. maxMemType1: r.uint32 // Maximum memory usage when a TrueType font is downloaded as a Type 1 font
  43092. },
  43093. 1: {}, // version 1 has no additional fields
  43094. 2: {
  43095. numberOfGlyphs: r.uint16,
  43096. glyphNameIndex: new r.Array(r.uint16, 'numberOfGlyphs'),
  43097. names: new r.Array(new r.String(r.uint8))
  43098. },
  43099. 2.5: {
  43100. numberOfGlyphs: r.uint16,
  43101. offsets: new r.Array(r.uint8, 'numberOfGlyphs')
  43102. },
  43103. 3: {}, // version 3 has no additional fields
  43104. 4: {
  43105. map: new r.Array(r.uint32, function (t) {
  43106. return t.parent.maxp.numGlyphs;
  43107. })
  43108. }
  43109. });
  43110. // An array of predefined values accessible by instructions
  43111. var cvt = new r.Struct({
  43112. controlValues: new r.Array(r.int16)
  43113. });
  43114. // A list of instructions that are executed once when a font is first used.
  43115. // These instructions are known as the font program. The main use of this table
  43116. // is for the definition of functions that are used in many different glyph programs.
  43117. var fpgm = new r.Struct({
  43118. instructions: new r.Array(r.uint8)
  43119. });
  43120. var loca = new r.VersionedStruct('head.indexToLocFormat', {
  43121. 0: {
  43122. offsets: new r.Array(r.uint16)
  43123. },
  43124. 1: {
  43125. offsets: new r.Array(r.uint32)
  43126. }
  43127. });
  43128. loca.process = function () {
  43129. if (this.version === 0) {
  43130. for (var i = 0; i < this.offsets.length; i++) {
  43131. this.offsets[i] <<= 1;
  43132. }
  43133. }
  43134. };
  43135. loca.preEncode = function () {
  43136. if (this.version != null) return;
  43137. // assume this.offsets is a sorted array
  43138. this.version = this.offsets[this.offsets.length - 1] > 0xffff ? 1 : 0;
  43139. if (this.version === 0) {
  43140. for (var i = 0; i < this.offsets.length; i++) {
  43141. this.offsets[i] >>>= 1;
  43142. }
  43143. }
  43144. };
  43145. // Set of instructions executed whenever the point size or font transformation change
  43146. var prep = new r.Struct({
  43147. controlValueProgram: new r.Array(r.uint8)
  43148. });
  43149. // only used for encoding
  43150. var glyf = new r.Array(new r.Buffer());
  43151. var CFFIndex = function () {
  43152. function CFFIndex(type) {
  43153. _classCallCheck(this, CFFIndex);
  43154. this.type = type;
  43155. }
  43156. CFFIndex.prototype.getCFFVersion = function getCFFVersion(ctx) {
  43157. while (ctx && !ctx.hdrSize) {
  43158. ctx = ctx.parent;
  43159. }
  43160. return ctx ? ctx.version : -1;
  43161. };
  43162. CFFIndex.prototype.decode = function decode(stream, parent) {
  43163. var version = this.getCFFVersion(parent);
  43164. var count = version >= 2 ? stream.readUInt32BE() : stream.readUInt16BE();
  43165. if (count === 0) {
  43166. return [];
  43167. }
  43168. var offSize = stream.readUInt8();
  43169. var offsetType = void 0;
  43170. if (offSize === 1) {
  43171. offsetType = r.uint8;
  43172. } else if (offSize === 2) {
  43173. offsetType = r.uint16;
  43174. } else if (offSize === 3) {
  43175. offsetType = r.uint24;
  43176. } else if (offSize === 4) {
  43177. offsetType = r.uint32;
  43178. } else {
  43179. throw new Error("Bad offset size in CFFIndex: " + offSize + " " + stream.pos);
  43180. }
  43181. var ret = [];
  43182. var startPos = stream.pos + (count + 1) * offSize - 1;
  43183. var start = offsetType.decode(stream);
  43184. for (var i = 0; i < count; i++) {
  43185. var end = offsetType.decode(stream);
  43186. if (this.type != null) {
  43187. var pos = stream.pos;
  43188. stream.pos = startPos + start;
  43189. parent.length = end - start;
  43190. ret.push(this.type.decode(stream, parent));
  43191. stream.pos = pos;
  43192. } else {
  43193. ret.push({
  43194. offset: startPos + start,
  43195. length: end - start
  43196. });
  43197. }
  43198. start = end;
  43199. }
  43200. stream.pos = startPos + start;
  43201. return ret;
  43202. };
  43203. CFFIndex.prototype.size = function size(arr, parent) {
  43204. var size = 2;
  43205. if (arr.length === 0) {
  43206. return size;
  43207. }
  43208. var type = this.type || new r.Buffer();
  43209. // find maximum offset to detminine offset type
  43210. var offset = 1;
  43211. for (var i = 0; i < arr.length; i++) {
  43212. var item = arr[i];
  43213. offset += type.size(item, parent);
  43214. }
  43215. var offsetType = void 0;
  43216. if (offset <= 0xff) {
  43217. offsetType = r.uint8;
  43218. } else if (offset <= 0xffff) {
  43219. offsetType = r.uint16;
  43220. } else if (offset <= 0xffffff) {
  43221. offsetType = r.uint24;
  43222. } else if (offset <= 0xffffffff) {
  43223. offsetType = r.uint32;
  43224. } else {
  43225. throw new Error("Bad offset in CFFIndex");
  43226. }
  43227. size += 1 + offsetType.size() * (arr.length + 1);
  43228. size += offset - 1;
  43229. return size;
  43230. };
  43231. CFFIndex.prototype.encode = function encode(stream, arr, parent) {
  43232. stream.writeUInt16BE(arr.length);
  43233. if (arr.length === 0) {
  43234. return;
  43235. }
  43236. var type = this.type || new r.Buffer();
  43237. // find maximum offset to detminine offset type
  43238. var sizes = [];
  43239. var offset = 1;
  43240. for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  43241. var _ref;
  43242. if (_isArray) {
  43243. if (_i >= _iterator.length) break;
  43244. _ref = _iterator[_i++];
  43245. } else {
  43246. _i = _iterator.next();
  43247. if (_i.done) break;
  43248. _ref = _i.value;
  43249. }
  43250. var item = _ref;
  43251. var s = type.size(item, parent);
  43252. sizes.push(s);
  43253. offset += s;
  43254. }
  43255. var offsetType = void 0;
  43256. if (offset <= 0xff) {
  43257. offsetType = r.uint8;
  43258. } else if (offset <= 0xffff) {
  43259. offsetType = r.uint16;
  43260. } else if (offset <= 0xffffff) {
  43261. offsetType = r.uint24;
  43262. } else if (offset <= 0xffffffff) {
  43263. offsetType = r.uint32;
  43264. } else {
  43265. throw new Error("Bad offset in CFFIndex");
  43266. }
  43267. // write offset size
  43268. stream.writeUInt8(offsetType.size());
  43269. // write elements
  43270. offset = 1;
  43271. offsetType.encode(stream, offset);
  43272. for (var _iterator2 = sizes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  43273. var _ref2;
  43274. if (_isArray2) {
  43275. if (_i2 >= _iterator2.length) break;
  43276. _ref2 = _iterator2[_i2++];
  43277. } else {
  43278. _i2 = _iterator2.next();
  43279. if (_i2.done) break;
  43280. _ref2 = _i2.value;
  43281. }
  43282. var size = _ref2;
  43283. offset += size;
  43284. offsetType.encode(stream, offset);
  43285. }
  43286. for (var _iterator3 = arr, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  43287. var _ref3;
  43288. if (_isArray3) {
  43289. if (_i3 >= _iterator3.length) break;
  43290. _ref3 = _iterator3[_i3++];
  43291. } else {
  43292. _i3 = _iterator3.next();
  43293. if (_i3.done) break;
  43294. _ref3 = _i3.value;
  43295. }
  43296. var _item = _ref3;
  43297. type.encode(stream, _item, parent);
  43298. }
  43299. return;
  43300. };
  43301. return CFFIndex;
  43302. }();
  43303. var FLOAT_EOF = 0xf;
  43304. var FLOAT_LOOKUP = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
  43305. var FLOAT_ENCODE_LOOKUP = {
  43306. '.': 10,
  43307. 'E': 11,
  43308. 'E-': 12,
  43309. '-': 14
  43310. };
  43311. var CFFOperand = function () {
  43312. function CFFOperand() {
  43313. _classCallCheck(this, CFFOperand);
  43314. }
  43315. CFFOperand.decode = function decode(stream, value) {
  43316. if (32 <= value && value <= 246) {
  43317. return value - 139;
  43318. }
  43319. if (247 <= value && value <= 250) {
  43320. return (value - 247) * 256 + stream.readUInt8() + 108;
  43321. }
  43322. if (251 <= value && value <= 254) {
  43323. return -(value - 251) * 256 - stream.readUInt8() - 108;
  43324. }
  43325. if (value === 28) {
  43326. return stream.readInt16BE();
  43327. }
  43328. if (value === 29) {
  43329. return stream.readInt32BE();
  43330. }
  43331. if (value === 30) {
  43332. var str = '';
  43333. while (true) {
  43334. var b = stream.readUInt8();
  43335. var n1 = b >> 4;
  43336. if (n1 === FLOAT_EOF) {
  43337. break;
  43338. }
  43339. str += FLOAT_LOOKUP[n1];
  43340. var n2 = b & 15;
  43341. if (n2 === FLOAT_EOF) {
  43342. break;
  43343. }
  43344. str += FLOAT_LOOKUP[n2];
  43345. }
  43346. return parseFloat(str);
  43347. }
  43348. return null;
  43349. };
  43350. CFFOperand.size = function size(value) {
  43351. // if the value needs to be forced to the largest size (32 bit)
  43352. // e.g. for unknown pointers, set to 32768
  43353. if (value.forceLarge) {
  43354. value = 32768;
  43355. }
  43356. if ((value | 0) !== value) {
  43357. // floating point
  43358. var str = '' + value;
  43359. return 1 + Math.ceil((str.length + 1) / 2);
  43360. } else if (-107 <= value && value <= 107) {
  43361. return 1;
  43362. } else if (108 <= value && value <= 1131 || -1131 <= value && value <= -108) {
  43363. return 2;
  43364. } else if (-32768 <= value && value <= 32767) {
  43365. return 3;
  43366. } else {
  43367. return 5;
  43368. }
  43369. };
  43370. CFFOperand.encode = function encode(stream, value) {
  43371. // if the value needs to be forced to the largest size (32 bit)
  43372. // e.g. for unknown pointers, save the old value and set to 32768
  43373. var val = Number(value);
  43374. if (value.forceLarge) {
  43375. stream.writeUInt8(29);
  43376. return stream.writeInt32BE(val);
  43377. } else if ((val | 0) !== val) {
  43378. // floating point
  43379. stream.writeUInt8(30);
  43380. var str = '' + val;
  43381. for (var i = 0; i < str.length; i += 2) {
  43382. var c1 = str[i];
  43383. var n1 = FLOAT_ENCODE_LOOKUP[c1] || +c1;
  43384. if (i === str.length - 1) {
  43385. var n2 = FLOAT_EOF;
  43386. } else {
  43387. var c2 = str[i + 1];
  43388. var n2 = FLOAT_ENCODE_LOOKUP[c2] || +c2;
  43389. }
  43390. stream.writeUInt8(n1 << 4 | n2 & 15);
  43391. }
  43392. if (n2 !== FLOAT_EOF) {
  43393. return stream.writeUInt8(FLOAT_EOF << 4);
  43394. }
  43395. } else if (-107 <= val && val <= 107) {
  43396. return stream.writeUInt8(val + 139);
  43397. } else if (108 <= val && val <= 1131) {
  43398. val -= 108;
  43399. stream.writeUInt8((val >> 8) + 247);
  43400. return stream.writeUInt8(val & 0xff);
  43401. } else if (-1131 <= val && val <= -108) {
  43402. val = -val - 108;
  43403. stream.writeUInt8((val >> 8) + 251);
  43404. return stream.writeUInt8(val & 0xff);
  43405. } else if (-32768 <= val && val <= 32767) {
  43406. stream.writeUInt8(28);
  43407. return stream.writeInt16BE(val);
  43408. } else {
  43409. stream.writeUInt8(29);
  43410. return stream.writeInt32BE(val);
  43411. }
  43412. };
  43413. return CFFOperand;
  43414. }();
  43415. var CFFDict = function () {
  43416. function CFFDict() {
  43417. var ops = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  43418. _classCallCheck(this, CFFDict);
  43419. this.ops = ops;
  43420. this.fields = {};
  43421. for (var _iterator = ops, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  43422. var _ref;
  43423. if (_isArray) {
  43424. if (_i >= _iterator.length) break;
  43425. _ref = _iterator[_i++];
  43426. } else {
  43427. _i = _iterator.next();
  43428. if (_i.done) break;
  43429. _ref = _i.value;
  43430. }
  43431. var field = _ref;
  43432. var key = Array.isArray(field[0]) ? field[0][0] << 8 | field[0][1] : field[0];
  43433. this.fields[key] = field;
  43434. }
  43435. }
  43436. CFFDict.prototype.decodeOperands = function decodeOperands(type, stream, ret, operands) {
  43437. var _this = this;
  43438. if (Array.isArray(type)) {
  43439. return operands.map(function (op, i) {
  43440. return _this.decodeOperands(type[i], stream, ret, [op]);
  43441. });
  43442. } else if (type.decode != null) {
  43443. return type.decode(stream, ret, operands);
  43444. } else {
  43445. switch (type) {
  43446. case 'number':
  43447. case 'offset':
  43448. case 'sid':
  43449. return operands[0];
  43450. case 'boolean':
  43451. return !!operands[0];
  43452. default:
  43453. return operands;
  43454. }
  43455. }
  43456. };
  43457. CFFDict.prototype.encodeOperands = function encodeOperands(type, stream, ctx, operands) {
  43458. var _this2 = this;
  43459. if (Array.isArray(type)) {
  43460. return operands.map(function (op, i) {
  43461. return _this2.encodeOperands(type[i], stream, ctx, op)[0];
  43462. });
  43463. } else if (type.encode != null) {
  43464. return type.encode(stream, operands, ctx);
  43465. } else if (typeof operands === 'number') {
  43466. return [operands];
  43467. } else if (typeof operands === 'boolean') {
  43468. return [+operands];
  43469. } else if (Array.isArray(operands)) {
  43470. return operands;
  43471. } else {
  43472. return [operands];
  43473. }
  43474. };
  43475. CFFDict.prototype.decode = function decode(stream, parent) {
  43476. var end = stream.pos + parent.length;
  43477. var ret = {};
  43478. var operands = [];
  43479. // define hidden properties
  43480. _Object$defineProperties(ret, {
  43481. parent: { value: parent },
  43482. _startOffset: { value: stream.pos }
  43483. });
  43484. // fill in defaults
  43485. for (var key in this.fields) {
  43486. var field = this.fields[key];
  43487. ret[field[1]] = field[3];
  43488. }
  43489. while (stream.pos < end) {
  43490. var b = stream.readUInt8();
  43491. if (b < 28) {
  43492. if (b === 12) {
  43493. b = b << 8 | stream.readUInt8();
  43494. }
  43495. var _field = this.fields[b];
  43496. if (!_field) {
  43497. throw new Error('Unknown operator ' + b);
  43498. }
  43499. var val = this.decodeOperands(_field[2], stream, ret, operands);
  43500. if (val != null) {
  43501. if (val instanceof restructure_src_utils.PropertyDescriptor) {
  43502. _Object$defineProperty(ret, _field[1], val);
  43503. } else {
  43504. ret[_field[1]] = val;
  43505. }
  43506. }
  43507. operands = [];
  43508. } else {
  43509. operands.push(CFFOperand.decode(stream, b));
  43510. }
  43511. }
  43512. return ret;
  43513. };
  43514. CFFDict.prototype.size = function size(dict, parent) {
  43515. var includePointers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  43516. var ctx = {
  43517. parent: parent,
  43518. val: dict,
  43519. pointerSize: 0,
  43520. startOffset: parent.startOffset || 0
  43521. };
  43522. var len = 0;
  43523. for (var k in this.fields) {
  43524. var field = this.fields[k];
  43525. var val = dict[field[1]];
  43526. if (val == null || isEqual(val, field[3])) {
  43527. continue;
  43528. }
  43529. var operands = this.encodeOperands(field[2], null, ctx, val);
  43530. for (var _iterator2 = operands, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  43531. var _ref2;
  43532. if (_isArray2) {
  43533. if (_i2 >= _iterator2.length) break;
  43534. _ref2 = _iterator2[_i2++];
  43535. } else {
  43536. _i2 = _iterator2.next();
  43537. if (_i2.done) break;
  43538. _ref2 = _i2.value;
  43539. }
  43540. var op = _ref2;
  43541. len += CFFOperand.size(op);
  43542. }
  43543. var key = Array.isArray(field[0]) ? field[0] : [field[0]];
  43544. len += key.length;
  43545. }
  43546. if (includePointers) {
  43547. len += ctx.pointerSize;
  43548. }
  43549. return len;
  43550. };
  43551. CFFDict.prototype.encode = function encode(stream, dict, parent) {
  43552. var ctx = {
  43553. pointers: [],
  43554. startOffset: stream.pos,
  43555. parent: parent,
  43556. val: dict,
  43557. pointerSize: 0
  43558. };
  43559. ctx.pointerOffset = stream.pos + this.size(dict, ctx, false);
  43560. for (var _iterator3 = this.ops, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  43561. var _ref3;
  43562. if (_isArray3) {
  43563. if (_i3 >= _iterator3.length) break;
  43564. _ref3 = _iterator3[_i3++];
  43565. } else {
  43566. _i3 = _iterator3.next();
  43567. if (_i3.done) break;
  43568. _ref3 = _i3.value;
  43569. }
  43570. var field = _ref3;
  43571. var val = dict[field[1]];
  43572. if (val == null || isEqual(val, field[3])) {
  43573. continue;
  43574. }
  43575. var operands = this.encodeOperands(field[2], stream, ctx, val);
  43576. for (var _iterator4 = operands, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  43577. var _ref4;
  43578. if (_isArray4) {
  43579. if (_i4 >= _iterator4.length) break;
  43580. _ref4 = _iterator4[_i4++];
  43581. } else {
  43582. _i4 = _iterator4.next();
  43583. if (_i4.done) break;
  43584. _ref4 = _i4.value;
  43585. }
  43586. var op = _ref4;
  43587. CFFOperand.encode(stream, op);
  43588. }
  43589. var key = Array.isArray(field[0]) ? field[0] : [field[0]];
  43590. for (var _iterator5 = key, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
  43591. var _ref5;
  43592. if (_isArray5) {
  43593. if (_i5 >= _iterator5.length) break;
  43594. _ref5 = _iterator5[_i5++];
  43595. } else {
  43596. _i5 = _iterator5.next();
  43597. if (_i5.done) break;
  43598. _ref5 = _i5.value;
  43599. }
  43600. var _op = _ref5;
  43601. stream.writeUInt8(_op);
  43602. }
  43603. }
  43604. var i = 0;
  43605. while (i < ctx.pointers.length) {
  43606. var ptr = ctx.pointers[i++];
  43607. ptr.type.encode(stream, ptr.val, ptr.parent);
  43608. }
  43609. return;
  43610. };
  43611. return CFFDict;
  43612. }();
  43613. var CFFPointer = function (_r$Pointer) {
  43614. _inherits(CFFPointer, _r$Pointer);
  43615. function CFFPointer(type) {
  43616. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  43617. _classCallCheck(this, CFFPointer);
  43618. if (options.type == null) {
  43619. options.type = 'global';
  43620. }
  43621. return _possibleConstructorReturn(this, _r$Pointer.call(this, null, type, options));
  43622. }
  43623. CFFPointer.prototype.decode = function decode(stream, parent, operands) {
  43624. this.offsetType = {
  43625. decode: function decode() {
  43626. return operands[0];
  43627. }
  43628. };
  43629. return _r$Pointer.prototype.decode.call(this, stream, parent, operands);
  43630. };
  43631. CFFPointer.prototype.encode = function encode(stream, value, ctx) {
  43632. if (!stream) {
  43633. // compute the size (so ctx.pointerSize is correct)
  43634. this.offsetType = {
  43635. size: function size() {
  43636. return 0;
  43637. }
  43638. };
  43639. this.size(value, ctx);
  43640. return [new Ptr(0)];
  43641. }
  43642. var ptr = null;
  43643. this.offsetType = {
  43644. encode: function encode(stream, val) {
  43645. return ptr = val;
  43646. }
  43647. };
  43648. _r$Pointer.prototype.encode.call(this, stream, value, ctx);
  43649. return [new Ptr(ptr)];
  43650. };
  43651. return CFFPointer;
  43652. }(r.Pointer);
  43653. var Ptr = function () {
  43654. function Ptr(val) {
  43655. _classCallCheck(this, Ptr);
  43656. this.val = val;
  43657. this.forceLarge = true;
  43658. }
  43659. Ptr.prototype.valueOf = function valueOf() {
  43660. return this.val;
  43661. };
  43662. return Ptr;
  43663. }();
  43664. var CFFBlendOp = function () {
  43665. function CFFBlendOp() {
  43666. _classCallCheck(this, CFFBlendOp);
  43667. }
  43668. CFFBlendOp.decode = function decode(stream, parent, operands) {
  43669. var numBlends = operands.pop();
  43670. // TODO: actually blend. For now just consume the deltas
  43671. // since we don't use any of the values anyway.
  43672. while (operands.length > numBlends) {
  43673. operands.pop();
  43674. }
  43675. };
  43676. return CFFBlendOp;
  43677. }();
  43678. var CFFPrivateDict = new CFFDict([
  43679. // key name type default
  43680. [6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'number', 0.039625], [[12, 10], 'BlueShift', 'number', 7], [[12, 11], 'BlueFuzz', 'number', 1], [10, 'StdHW', 'number', null], [11, 'StdVW', 'number', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'boolean', false], [[12, 17], 'LanguageGroup', 'number', 0], [[12, 18], 'ExpansionFactor', 'number', 0.06], [[12, 19], 'initialRandomSeed', 'number', 0], [20, 'defaultWidthX', 'number', 0], [21, 'nominalWidthX', 'number', 0], [22, 'vsindex', 'number', 0], [23, 'blend', CFFBlendOp, null], [19, 'Subrs', new CFFPointer(new CFFIndex(), { type: 'local' }), null]]);
  43681. // Automatically generated from Appendix A of the CFF specification; do
  43682. // not edit. Length should be 391.
  43683. var standardStrings = [".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash", "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash", "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe", "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth", "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar", "degree", "thorn", "threequarters", "twosuperior", "registered", "minus", "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis", "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis", "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave", "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde", "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", "parenrightsuperior", "twodotenleader", "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior", "threequartersemdash", "periodsuperior", "questionsmall", "asuperior", "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior", "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall", "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall", "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior", "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", "threeinferior", "fourinferior", "fiveinferior", "sixinferior", "seveninferior", "eightinferior", "nineinferior", "centinferior", "dollarinferior", "periodinferior", "commainferior", "Agravesmall", "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall", "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black", "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"];
  43684. var StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'];
  43685. var ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
  43686. var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];
  43687. var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
  43688. var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];
  43689. //########################
  43690. // Scripts and Languages #
  43691. //########################
  43692. var LangSysTable = new r.Struct({
  43693. reserved: new r.Reserved(r.uint16),
  43694. reqFeatureIndex: r.uint16,
  43695. featureCount: r.uint16,
  43696. featureIndexes: new r.Array(r.uint16, 'featureCount')
  43697. });
  43698. var LangSysRecord = new r.Struct({
  43699. tag: new r.String(4),
  43700. langSys: new r.Pointer(r.uint16, LangSysTable, { type: 'parent' })
  43701. });
  43702. var Script = new r.Struct({
  43703. defaultLangSys: new r.Pointer(r.uint16, LangSysTable),
  43704. count: r.uint16,
  43705. langSysRecords: new r.Array(LangSysRecord, 'count')
  43706. });
  43707. var ScriptRecord = new r.Struct({
  43708. tag: new r.String(4),
  43709. script: new r.Pointer(r.uint16, Script, { type: 'parent' })
  43710. });
  43711. var ScriptList = new r.Array(ScriptRecord, r.uint16);
  43712. //#######################
  43713. // Features and Lookups #
  43714. //#######################
  43715. var Feature = new r.Struct({
  43716. featureParams: r.uint16, // pointer
  43717. lookupCount: r.uint16,
  43718. lookupListIndexes: new r.Array(r.uint16, 'lookupCount')
  43719. });
  43720. var FeatureRecord = new r.Struct({
  43721. tag: new r.String(4),
  43722. feature: new r.Pointer(r.uint16, Feature, { type: 'parent' })
  43723. });
  43724. var FeatureList = new r.Array(FeatureRecord, r.uint16);
  43725. var LookupFlags = new r.Struct({
  43726. markAttachmentType: r.uint8,
  43727. flags: new r.Bitfield(r.uint8, ['rightToLeft', 'ignoreBaseGlyphs', 'ignoreLigatures', 'ignoreMarks', 'useMarkFilteringSet'])
  43728. });
  43729. function LookupList(SubTable) {
  43730. var Lookup = new r.Struct({
  43731. lookupType: r.uint16,
  43732. flags: LookupFlags,
  43733. subTableCount: r.uint16,
  43734. subTables: new r.Array(new r.Pointer(r.uint16, SubTable), 'subTableCount'),
  43735. markFilteringSet: new r.Optional(r.uint16, function (t) {
  43736. return t.flags.flags.useMarkFilteringSet;
  43737. })
  43738. });
  43739. return new r.LazyArray(new r.Pointer(r.uint16, Lookup), r.uint16);
  43740. }
  43741. //#################
  43742. // Coverage Table #
  43743. //#################
  43744. var RangeRecord = new r.Struct({
  43745. start: r.uint16,
  43746. end: r.uint16,
  43747. startCoverageIndex: r.uint16
  43748. });
  43749. var Coverage = new r.VersionedStruct(r.uint16, {
  43750. 1: {
  43751. glyphCount: r.uint16,
  43752. glyphs: new r.Array(r.uint16, 'glyphCount')
  43753. },
  43754. 2: {
  43755. rangeCount: r.uint16,
  43756. rangeRecords: new r.Array(RangeRecord, 'rangeCount')
  43757. }
  43758. });
  43759. //#########################
  43760. // Class Definition Table #
  43761. //#########################
  43762. var ClassRangeRecord = new r.Struct({
  43763. start: r.uint16,
  43764. end: r.uint16,
  43765. class: r.uint16
  43766. });
  43767. var ClassDef = new r.VersionedStruct(r.uint16, {
  43768. 1: { // Class array
  43769. startGlyph: r.uint16,
  43770. glyphCount: r.uint16,
  43771. classValueArray: new r.Array(r.uint16, 'glyphCount')
  43772. },
  43773. 2: { // Class ranges
  43774. classRangeCount: r.uint16,
  43775. classRangeRecord: new r.Array(ClassRangeRecord, 'classRangeCount')
  43776. }
  43777. });
  43778. //###############
  43779. // Device Table #
  43780. //###############
  43781. var Device = new r.Struct({
  43782. a: r.uint16, // startSize for hinting Device, outerIndex for VariationIndex
  43783. b: r.uint16, // endSize for Device, innerIndex for VariationIndex
  43784. deltaFormat: r.uint16
  43785. });
  43786. //#############################################
  43787. // Contextual Substitution/Positioning Tables #
  43788. //#############################################
  43789. var LookupRecord = new r.Struct({
  43790. sequenceIndex: r.uint16,
  43791. lookupListIndex: r.uint16
  43792. });
  43793. var Rule = new r.Struct({
  43794. glyphCount: r.uint16,
  43795. lookupCount: r.uint16,
  43796. input: new r.Array(r.uint16, function (t) {
  43797. return t.glyphCount - 1;
  43798. }),
  43799. lookupRecords: new r.Array(LookupRecord, 'lookupCount')
  43800. });
  43801. var RuleSet = new r.Array(new r.Pointer(r.uint16, Rule), r.uint16);
  43802. var ClassRule = new r.Struct({
  43803. glyphCount: r.uint16,
  43804. lookupCount: r.uint16,
  43805. classes: new r.Array(r.uint16, function (t) {
  43806. return t.glyphCount - 1;
  43807. }),
  43808. lookupRecords: new r.Array(LookupRecord, 'lookupCount')
  43809. });
  43810. var ClassSet = new r.Array(new r.Pointer(r.uint16, ClassRule), r.uint16);
  43811. var Context = new r.VersionedStruct(r.uint16, {
  43812. 1: { // Simple context
  43813. coverage: new r.Pointer(r.uint16, Coverage),
  43814. ruleSetCount: r.uint16,
  43815. ruleSets: new r.Array(new r.Pointer(r.uint16, RuleSet), 'ruleSetCount')
  43816. },
  43817. 2: { // Class-based context
  43818. coverage: new r.Pointer(r.uint16, Coverage),
  43819. classDef: new r.Pointer(r.uint16, ClassDef),
  43820. classSetCnt: r.uint16,
  43821. classSet: new r.Array(new r.Pointer(r.uint16, ClassSet), 'classSetCnt')
  43822. },
  43823. 3: {
  43824. glyphCount: r.uint16,
  43825. lookupCount: r.uint16,
  43826. coverages: new r.Array(new r.Pointer(r.uint16, Coverage), 'glyphCount'),
  43827. lookupRecords: new r.Array(LookupRecord, 'lookupCount')
  43828. }
  43829. });
  43830. //######################################################
  43831. // Chaining Contextual Substitution/Positioning Tables #
  43832. //######################################################
  43833. var ChainRule = new r.Struct({
  43834. backtrackGlyphCount: r.uint16,
  43835. backtrack: new r.Array(r.uint16, 'backtrackGlyphCount'),
  43836. inputGlyphCount: r.uint16,
  43837. input: new r.Array(r.uint16, function (t) {
  43838. return t.inputGlyphCount - 1;
  43839. }),
  43840. lookaheadGlyphCount: r.uint16,
  43841. lookahead: new r.Array(r.uint16, 'lookaheadGlyphCount'),
  43842. lookupCount: r.uint16,
  43843. lookupRecords: new r.Array(LookupRecord, 'lookupCount')
  43844. });
  43845. var ChainRuleSet = new r.Array(new r.Pointer(r.uint16, ChainRule), r.uint16);
  43846. var ChainingContext = new r.VersionedStruct(r.uint16, {
  43847. 1: { // Simple context glyph substitution
  43848. coverage: new r.Pointer(r.uint16, Coverage),
  43849. chainCount: r.uint16,
  43850. chainRuleSets: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')
  43851. },
  43852. 2: { // Class-based chaining context
  43853. coverage: new r.Pointer(r.uint16, Coverage),
  43854. backtrackClassDef: new r.Pointer(r.uint16, ClassDef),
  43855. inputClassDef: new r.Pointer(r.uint16, ClassDef),
  43856. lookaheadClassDef: new r.Pointer(r.uint16, ClassDef),
  43857. chainCount: r.uint16,
  43858. chainClassSet: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')
  43859. },
  43860. 3: { // Coverage-based chaining context
  43861. backtrackGlyphCount: r.uint16,
  43862. backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),
  43863. inputGlyphCount: r.uint16,
  43864. inputCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'inputGlyphCount'),
  43865. lookaheadGlyphCount: r.uint16,
  43866. lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),
  43867. lookupCount: r.uint16,
  43868. lookupRecords: new r.Array(LookupRecord, 'lookupCount')
  43869. }
  43870. });
  43871. var _;
  43872. /*******************
  43873. * Variation Store *
  43874. *******************/
  43875. var F2DOT14 = new r.Fixed(16, 'BE', 14);
  43876. var RegionAxisCoordinates = new r.Struct({
  43877. startCoord: F2DOT14,
  43878. peakCoord: F2DOT14,
  43879. endCoord: F2DOT14
  43880. });
  43881. var VariationRegionList = new r.Struct({
  43882. axisCount: r.uint16,
  43883. regionCount: r.uint16,
  43884. variationRegions: new r.Array(new r.Array(RegionAxisCoordinates, 'axisCount'), 'regionCount')
  43885. });
  43886. var DeltaSet = new r.Struct({
  43887. shortDeltas: new r.Array(r.int16, function (t) {
  43888. return t.parent.shortDeltaCount;
  43889. }),
  43890. regionDeltas: new r.Array(r.int8, function (t) {
  43891. return t.parent.regionIndexCount - t.parent.shortDeltaCount;
  43892. }),
  43893. deltas: function deltas(t) {
  43894. return t.shortDeltas.concat(t.regionDeltas);
  43895. }
  43896. });
  43897. var ItemVariationData = new r.Struct({
  43898. itemCount: r.uint16,
  43899. shortDeltaCount: r.uint16,
  43900. regionIndexCount: r.uint16,
  43901. regionIndexes: new r.Array(r.uint16, 'regionIndexCount'),
  43902. deltaSets: new r.Array(DeltaSet, 'itemCount')
  43903. });
  43904. var ItemVariationStore = new r.Struct({
  43905. format: r.uint16,
  43906. variationRegionList: new r.Pointer(r.uint32, VariationRegionList),
  43907. variationDataCount: r.uint16,
  43908. itemVariationData: new r.Array(new r.Pointer(r.uint32, ItemVariationData), 'variationDataCount')
  43909. });
  43910. /**********************
  43911. * Feature Variations *
  43912. **********************/
  43913. var ConditionTable = new r.VersionedStruct(r.uint16, {
  43914. 1: (_ = {
  43915. axisIndex: r.uint16
  43916. }, _['axisIndex'] = r.uint16, _.filterRangeMinValue = F2DOT14, _.filterRangeMaxValue = F2DOT14, _)
  43917. });
  43918. var ConditionSet = new r.Struct({
  43919. conditionCount: r.uint16,
  43920. conditionTable: new r.Array(new r.Pointer(r.uint32, ConditionTable), 'conditionCount')
  43921. });
  43922. var FeatureTableSubstitutionRecord = new r.Struct({
  43923. featureIndex: r.uint16,
  43924. alternateFeatureTable: new r.Pointer(r.uint32, Feature, { type: 'parent' })
  43925. });
  43926. var FeatureTableSubstitution = new r.Struct({
  43927. version: r.fixed32,
  43928. substitutionCount: r.uint16,
  43929. substitutions: new r.Array(FeatureTableSubstitutionRecord, 'substitutionCount')
  43930. });
  43931. var FeatureVariationRecord = new r.Struct({
  43932. conditionSet: new r.Pointer(r.uint32, ConditionSet, { type: 'parent' }),
  43933. featureTableSubstitution: new r.Pointer(r.uint32, FeatureTableSubstitution, { type: 'parent' })
  43934. });
  43935. var FeatureVariations = new r.Struct({
  43936. majorVersion: r.uint16,
  43937. minorVersion: r.uint16,
  43938. featureVariationRecordCount: r.uint32,
  43939. featureVariationRecords: new r.Array(FeatureVariationRecord, 'featureVariationRecordCount')
  43940. });
  43941. // Checks if an operand is an index of a predefined value,
  43942. // otherwise delegates to the provided type.
  43943. var PredefinedOp = function () {
  43944. function PredefinedOp(predefinedOps, type) {
  43945. _classCallCheck(this, PredefinedOp);
  43946. this.predefinedOps = predefinedOps;
  43947. this.type = type;
  43948. }
  43949. PredefinedOp.prototype.decode = function decode(stream, parent, operands) {
  43950. if (this.predefinedOps[operands[0]]) {
  43951. return this.predefinedOps[operands[0]];
  43952. }
  43953. return this.type.decode(stream, parent, operands);
  43954. };
  43955. PredefinedOp.prototype.size = function size(value, ctx) {
  43956. return this.type.size(value, ctx);
  43957. };
  43958. PredefinedOp.prototype.encode = function encode(stream, value, ctx) {
  43959. var index = this.predefinedOps.indexOf(value);
  43960. if (index !== -1) {
  43961. return index;
  43962. }
  43963. return this.type.encode(stream, value, ctx);
  43964. };
  43965. return PredefinedOp;
  43966. }();
  43967. var CFFEncodingVersion = function (_r$Number) {
  43968. _inherits(CFFEncodingVersion, _r$Number);
  43969. function CFFEncodingVersion() {
  43970. _classCallCheck(this, CFFEncodingVersion);
  43971. return _possibleConstructorReturn(this, _r$Number.call(this, 'UInt8'));
  43972. }
  43973. CFFEncodingVersion.prototype.decode = function decode(stream) {
  43974. return r.uint8.decode(stream) & 0x7f;
  43975. };
  43976. return CFFEncodingVersion;
  43977. }(r.Number);
  43978. var Range1 = new r.Struct({
  43979. first: r.uint16,
  43980. nLeft: r.uint8
  43981. });
  43982. var Range2 = new r.Struct({
  43983. first: r.uint16,
  43984. nLeft: r.uint16
  43985. });
  43986. var CFFCustomEncoding = new r.VersionedStruct(new CFFEncodingVersion(), {
  43987. 0: {
  43988. nCodes: r.uint8,
  43989. codes: new r.Array(r.uint8, 'nCodes')
  43990. },
  43991. 1: {
  43992. nRanges: r.uint8,
  43993. ranges: new r.Array(Range1, 'nRanges')
  43994. }
  43995. // TODO: supplement?
  43996. });
  43997. var CFFEncoding = new PredefinedOp([StandardEncoding, ExpertEncoding], new CFFPointer(CFFCustomEncoding, { lazy: true }));
  43998. // Decodes an array of ranges until the total
  43999. // length is equal to the provided length.
  44000. var RangeArray = function (_r$Array) {
  44001. _inherits(RangeArray, _r$Array);
  44002. function RangeArray() {
  44003. _classCallCheck(this, RangeArray);
  44004. return _possibleConstructorReturn(this, _r$Array.apply(this, arguments));
  44005. }
  44006. RangeArray.prototype.decode = function decode(stream, parent) {
  44007. var length = restructure_src_utils.resolveLength(this.length, stream, parent);
  44008. var count = 0;
  44009. var res = [];
  44010. while (count < length) {
  44011. var range = this.type.decode(stream, parent);
  44012. range.offset = count;
  44013. count += range.nLeft + 1;
  44014. res.push(range);
  44015. }
  44016. return res;
  44017. };
  44018. return RangeArray;
  44019. }(r.Array);
  44020. var CFFCustomCharset = new r.VersionedStruct(r.uint8, {
  44021. 0: {
  44022. glyphs: new r.Array(r.uint16, function (t) {
  44023. return t.parent.CharStrings.length - 1;
  44024. })
  44025. },
  44026. 1: {
  44027. ranges: new RangeArray(Range1, function (t) {
  44028. return t.parent.CharStrings.length - 1;
  44029. })
  44030. },
  44031. 2: {
  44032. ranges: new RangeArray(Range2, function (t) {
  44033. return t.parent.CharStrings.length - 1;
  44034. })
  44035. }
  44036. });
  44037. var CFFCharset = new PredefinedOp([ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset], new CFFPointer(CFFCustomCharset, { lazy: true }));
  44038. var FDRange3 = new r.Struct({
  44039. first: r.uint16,
  44040. fd: r.uint8
  44041. });
  44042. var FDRange4 = new r.Struct({
  44043. first: r.uint32,
  44044. fd: r.uint16
  44045. });
  44046. var FDSelect = new r.VersionedStruct(r.uint8, {
  44047. 0: {
  44048. fds: new r.Array(r.uint8, function (t) {
  44049. return t.parent.CharStrings.length;
  44050. })
  44051. },
  44052. 3: {
  44053. nRanges: r.uint16,
  44054. ranges: new r.Array(FDRange3, 'nRanges'),
  44055. sentinel: r.uint16
  44056. },
  44057. 4: {
  44058. nRanges: r.uint32,
  44059. ranges: new r.Array(FDRange4, 'nRanges'),
  44060. sentinel: r.uint32
  44061. }
  44062. });
  44063. var ptr = new CFFPointer(CFFPrivateDict);
  44064. var CFFPrivateOp = function () {
  44065. function CFFPrivateOp() {
  44066. _classCallCheck(this, CFFPrivateOp);
  44067. }
  44068. CFFPrivateOp.prototype.decode = function decode(stream, parent, operands) {
  44069. parent.length = operands[0];
  44070. return ptr.decode(stream, parent, [operands[1]]);
  44071. };
  44072. CFFPrivateOp.prototype.size = function size(dict, ctx) {
  44073. return [CFFPrivateDict.size(dict, ctx, false), ptr.size(dict, ctx)[0]];
  44074. };
  44075. CFFPrivateOp.prototype.encode = function encode(stream, dict, ctx) {
  44076. return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]];
  44077. };
  44078. return CFFPrivateOp;
  44079. }();
  44080. var FontDict = new CFFDict([
  44081. // key name type(s) default
  44082. [18, 'Private', new CFFPrivateOp(), null], [[12, 38], 'FontName', 'sid', null]]);
  44083. var CFFTopDict = new CFFDict([
  44084. // key name type(s) default
  44085. [[12, 30], 'ROS', ['sid', 'sid', 'number'], null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'boolean', false], [[12, 2], 'ItalicAngle', 'number', 0], [[12, 3], 'UnderlinePosition', 'number', -100], [[12, 4], 'UnderlineThickness', 'number', 50], [[12, 5], 'PaintType', 'number', 0], [[12, 6], 'CharstringType', 'number', 2], [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'number', null], [5, 'FontBBox', 'array', [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'number', 0], [14, 'XUID', 'array', null], [15, 'charset', CFFCharset, ISOAdobeCharset], [16, 'Encoding', CFFEncoding, StandardEncoding], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [18, 'Private', new CFFPrivateOp(), null], [[12, 20], 'SyntheticBase', 'number', null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null],
  44086. // CID font specific
  44087. [[12, 31], 'CIDFontVersion', 'number', 0], [[12, 32], 'CIDFontRevision', 'number', 0], [[12, 33], 'CIDFontType', 'number', 0], [[12, 34], 'CIDCount', 'number', 8720], [[12, 35], 'UIDBase', 'number', null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [[12, 38], 'FontName', 'sid', null]]);
  44088. var VariationStore = new r.Struct({
  44089. length: r.uint16,
  44090. itemVariationStore: ItemVariationStore
  44091. });
  44092. var CFF2TopDict = new CFFDict([[[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]], [17, 'CharStrings', new CFFPointer(new CFFIndex()), null], [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null], [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null], [24, 'vstore', new CFFPointer(VariationStore), null], [25, 'maxstack', 'number', 193]]);
  44093. var CFFTop = new r.VersionedStruct(r.fixed16, {
  44094. 1: {
  44095. hdrSize: r.uint8,
  44096. offSize: r.uint8,
  44097. nameIndex: new CFFIndex(new r.String('length')),
  44098. topDictIndex: new CFFIndex(CFFTopDict),
  44099. stringIndex: new CFFIndex(new r.String('length')),
  44100. globalSubrIndex: new CFFIndex()
  44101. },
  44102. 2: {
  44103. hdrSize: r.uint8,
  44104. length: r.uint16,
  44105. topDict: CFF2TopDict,
  44106. globalSubrIndex: new CFFIndex()
  44107. }
  44108. });
  44109. var CFFFont = function () {
  44110. function CFFFont(stream) {
  44111. _classCallCheck(this, CFFFont);
  44112. this.stream = stream;
  44113. this.decode();
  44114. }
  44115. CFFFont.decode = function decode(stream) {
  44116. return new CFFFont(stream);
  44117. };
  44118. CFFFont.prototype.decode = function decode() {
  44119. var start = this.stream.pos;
  44120. var top = CFFTop.decode(this.stream);
  44121. for (var key in top) {
  44122. var val = top[key];
  44123. this[key] = val;
  44124. }
  44125. if (this.version < 2) {
  44126. if (this.topDictIndex.length !== 1) {
  44127. throw new Error("Only a single font is allowed in CFF");
  44128. }
  44129. this.topDict = this.topDictIndex[0];
  44130. }
  44131. this.isCIDFont = this.topDict.ROS != null;
  44132. return this;
  44133. };
  44134. CFFFont.prototype.string = function string(sid) {
  44135. if (this.version >= 2) {
  44136. return null;
  44137. }
  44138. if (sid < standardStrings.length) {
  44139. return standardStrings[sid];
  44140. }
  44141. return this.stringIndex[sid - standardStrings.length];
  44142. };
  44143. CFFFont.prototype.getCharString = function getCharString(glyph) {
  44144. this.stream.pos = this.topDict.CharStrings[glyph].offset;
  44145. return this.stream.readBuffer(this.topDict.CharStrings[glyph].length);
  44146. };
  44147. CFFFont.prototype.getGlyphName = function getGlyphName(gid) {
  44148. // CFF2 glyph names are in the post table.
  44149. if (this.version >= 2) {
  44150. return null;
  44151. }
  44152. // CID-keyed fonts don't have glyph names
  44153. if (this.isCIDFont) {
  44154. return null;
  44155. }
  44156. var charset = this.topDict.charset;
  44157. if (Array.isArray(charset)) {
  44158. return charset[gid];
  44159. }
  44160. if (gid === 0) {
  44161. return '.notdef';
  44162. }
  44163. gid -= 1;
  44164. switch (charset.version) {
  44165. case 0:
  44166. return this.string(charset.glyphs[gid]);
  44167. case 1:
  44168. case 2:
  44169. for (var i = 0; i < charset.ranges.length; i++) {
  44170. var range = charset.ranges[i];
  44171. if (range.offset <= gid && gid <= range.offset + range.nLeft) {
  44172. return this.string(range.first + (gid - range.offset));
  44173. }
  44174. }
  44175. break;
  44176. }
  44177. return null;
  44178. };
  44179. CFFFont.prototype.fdForGlyph = function fdForGlyph(gid) {
  44180. if (!this.topDict.FDSelect) {
  44181. return null;
  44182. }
  44183. switch (this.topDict.FDSelect.version) {
  44184. case 0:
  44185. return this.topDict.FDSelect.fds[gid];
  44186. case 3:
  44187. case 4:
  44188. var ranges = this.topDict.FDSelect.ranges;
  44189. var low = 0;
  44190. var high = ranges.length - 1;
  44191. while (low <= high) {
  44192. var mid = low + high >> 1;
  44193. if (gid < ranges[mid].first) {
  44194. high = mid - 1;
  44195. } else if (mid < high && gid > ranges[mid + 1].first) {
  44196. low = mid + 1;
  44197. } else {
  44198. return ranges[mid].fd;
  44199. }
  44200. }
  44201. default:
  44202. throw new Error('Unknown FDSelect version: ' + this.topDict.FDSelect.version);
  44203. }
  44204. };
  44205. CFFFont.prototype.privateDictForGlyph = function privateDictForGlyph(gid) {
  44206. if (this.topDict.FDSelect) {
  44207. var fd = this.fdForGlyph(gid);
  44208. if (this.topDict.FDArray[fd]) {
  44209. return this.topDict.FDArray[fd].Private;
  44210. }
  44211. return null;
  44212. }
  44213. if (this.version < 2) {
  44214. return this.topDict.Private;
  44215. }
  44216. return this.topDict.FDArray[0].Private;
  44217. };
  44218. _createClass(CFFFont, [{
  44219. key: 'postscriptName',
  44220. get: function get() {
  44221. if (this.version < 2) {
  44222. return this.nameIndex[0];
  44223. }
  44224. return null;
  44225. }
  44226. }, {
  44227. key: 'fullName',
  44228. get: function get() {
  44229. return this.string(this.topDict.FullName);
  44230. }
  44231. }, {
  44232. key: 'familyName',
  44233. get: function get() {
  44234. return this.string(this.topDict.FamilyName);
  44235. }
  44236. }]);
  44237. return CFFFont;
  44238. }();
  44239. var VerticalOrigin = new r.Struct({
  44240. glyphIndex: r.uint16,
  44241. vertOriginY: r.int16
  44242. });
  44243. var VORG = new r.Struct({
  44244. majorVersion: r.uint16,
  44245. minorVersion: r.uint16,
  44246. defaultVertOriginY: r.int16,
  44247. numVertOriginYMetrics: r.uint16,
  44248. metrics: new r.Array(VerticalOrigin, 'numVertOriginYMetrics')
  44249. });
  44250. var BigMetrics = new r.Struct({
  44251. height: r.uint8,
  44252. width: r.uint8,
  44253. horiBearingX: r.int8,
  44254. horiBearingY: r.int8,
  44255. horiAdvance: r.uint8,
  44256. vertBearingX: r.int8,
  44257. vertBearingY: r.int8,
  44258. vertAdvance: r.uint8
  44259. });
  44260. var SmallMetrics = new r.Struct({
  44261. height: r.uint8,
  44262. width: r.uint8,
  44263. bearingX: r.int8,
  44264. bearingY: r.int8,
  44265. advance: r.uint8
  44266. });
  44267. var EBDTComponent = new r.Struct({
  44268. glyph: r.uint16,
  44269. xOffset: r.int8,
  44270. yOffset: r.int8
  44271. });
  44272. var ByteAligned = function ByteAligned() {
  44273. _classCallCheck(this, ByteAligned);
  44274. };
  44275. var BitAligned = function BitAligned() {
  44276. _classCallCheck(this, BitAligned);
  44277. };
  44278. var glyph = new r.VersionedStruct('version', {
  44279. 1: {
  44280. metrics: SmallMetrics,
  44281. data: ByteAligned
  44282. },
  44283. 2: {
  44284. metrics: SmallMetrics,
  44285. data: BitAligned
  44286. },
  44287. // format 3 is deprecated
  44288. // format 4 is not supported by Microsoft
  44289. 5: {
  44290. data: BitAligned
  44291. },
  44292. 6: {
  44293. metrics: BigMetrics,
  44294. data: ByteAligned
  44295. },
  44296. 7: {
  44297. metrics: BigMetrics,
  44298. data: BitAligned
  44299. },
  44300. 8: {
  44301. metrics: SmallMetrics,
  44302. pad: new r.Reserved(r.uint8),
  44303. numComponents: r.uint16,
  44304. components: new r.Array(EBDTComponent, 'numComponents')
  44305. },
  44306. 9: {
  44307. metrics: BigMetrics,
  44308. pad: new r.Reserved(r.uint8),
  44309. numComponents: r.uint16,
  44310. components: new r.Array(EBDTComponent, 'numComponents')
  44311. },
  44312. 17: {
  44313. metrics: SmallMetrics,
  44314. dataLen: r.uint32,
  44315. data: new r.Buffer('dataLen')
  44316. },
  44317. 18: {
  44318. metrics: BigMetrics,
  44319. dataLen: r.uint32,
  44320. data: new r.Buffer('dataLen')
  44321. },
  44322. 19: {
  44323. dataLen: r.uint32,
  44324. data: new r.Buffer('dataLen')
  44325. }
  44326. });
  44327. var SBitLineMetrics = new r.Struct({
  44328. ascender: r.int8,
  44329. descender: r.int8,
  44330. widthMax: r.uint8,
  44331. caretSlopeNumerator: r.int8,
  44332. caretSlopeDenominator: r.int8,
  44333. caretOffset: r.int8,
  44334. minOriginSB: r.int8,
  44335. minAdvanceSB: r.int8,
  44336. maxBeforeBL: r.int8,
  44337. minAfterBL: r.int8,
  44338. pad: new r.Reserved(r.int8, 2)
  44339. });
  44340. var CodeOffsetPair = new r.Struct({
  44341. glyphCode: r.uint16,
  44342. offset: r.uint16
  44343. });
  44344. var IndexSubtable = new r.VersionedStruct(r.uint16, {
  44345. header: {
  44346. imageFormat: r.uint16,
  44347. imageDataOffset: r.uint32
  44348. },
  44349. 1: {
  44350. offsetArray: new r.Array(r.uint32, function (t) {
  44351. return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1;
  44352. })
  44353. },
  44354. 2: {
  44355. imageSize: r.uint32,
  44356. bigMetrics: BigMetrics
  44357. },
  44358. 3: {
  44359. offsetArray: new r.Array(r.uint16, function (t) {
  44360. return t.parent.lastGlyphIndex - t.parent.firstGlyphIndex + 1;
  44361. })
  44362. },
  44363. 4: {
  44364. numGlyphs: r.uint32,
  44365. glyphArray: new r.Array(CodeOffsetPair, function (t) {
  44366. return t.numGlyphs + 1;
  44367. })
  44368. },
  44369. 5: {
  44370. imageSize: r.uint32,
  44371. bigMetrics: BigMetrics,
  44372. numGlyphs: r.uint32,
  44373. glyphCodeArray: new r.Array(r.uint16, 'numGlyphs')
  44374. }
  44375. });
  44376. var IndexSubtableArray = new r.Struct({
  44377. firstGlyphIndex: r.uint16,
  44378. lastGlyphIndex: r.uint16,
  44379. subtable: new r.Pointer(r.uint32, IndexSubtable)
  44380. });
  44381. var BitmapSizeTable = new r.Struct({
  44382. indexSubTableArray: new r.Pointer(r.uint32, new r.Array(IndexSubtableArray, 1), { type: 'parent' }),
  44383. indexTablesSize: r.uint32,
  44384. numberOfIndexSubTables: r.uint32,
  44385. colorRef: r.uint32,
  44386. hori: SBitLineMetrics,
  44387. vert: SBitLineMetrics,
  44388. startGlyphIndex: r.uint16,
  44389. endGlyphIndex: r.uint16,
  44390. ppemX: r.uint8,
  44391. ppemY: r.uint8,
  44392. bitDepth: r.uint8,
  44393. flags: new r.Bitfield(r.uint8, ['horizontal', 'vertical'])
  44394. });
  44395. var EBLC = new r.Struct({
  44396. version: r.uint32, // 0x00020000
  44397. numSizes: r.uint32,
  44398. sizes: new r.Array(BitmapSizeTable, 'numSizes')
  44399. });
  44400. var ImageTable = new r.Struct({
  44401. ppem: r.uint16,
  44402. resolution: r.uint16,
  44403. imageOffsets: new r.Array(new r.Pointer(r.uint32, 'void'), function (t) {
  44404. return t.parent.parent.maxp.numGlyphs + 1;
  44405. })
  44406. });
  44407. // This is the Apple sbix table, used by the "Apple Color Emoji" font.
  44408. // It includes several image tables with images for each bitmap glyph
  44409. // of several different sizes.
  44410. var sbix = new r.Struct({
  44411. version: r.uint16,
  44412. flags: new r.Bitfield(r.uint16, ['renderOutlines']),
  44413. numImgTables: r.uint32,
  44414. imageTables: new r.Array(new r.Pointer(r.uint32, ImageTable), 'numImgTables')
  44415. });
  44416. var LayerRecord = new r.Struct({
  44417. gid: r.uint16, // Glyph ID of layer glyph (must be in z-order from bottom to top).
  44418. paletteIndex: r.uint16 // Index value to use in the appropriate palette. This value must
  44419. }); // be less than numPaletteEntries in the CPAL table, except for
  44420. // the special case noted below. Each palette entry is 16 bits.
  44421. // A palette index of 0xFFFF is a special case indicating that
  44422. // the text foreground color should be used.
  44423. var BaseGlyphRecord = new r.Struct({
  44424. gid: r.uint16, // Glyph ID of reference glyph. This glyph is for reference only
  44425. // and is not rendered for color.
  44426. firstLayerIndex: r.uint16, // Index (from beginning of the Layer Records) to the layer record.
  44427. // There will be numLayers consecutive entries for this base glyph.
  44428. numLayers: r.uint16
  44429. });
  44430. var COLR = new r.Struct({
  44431. version: r.uint16,
  44432. numBaseGlyphRecords: r.uint16,
  44433. baseGlyphRecord: new r.Pointer(r.uint32, new r.Array(BaseGlyphRecord, 'numBaseGlyphRecords')),
  44434. layerRecords: new r.Pointer(r.uint32, new r.Array(LayerRecord, 'numLayerRecords'), { lazy: true }),
  44435. numLayerRecords: r.uint16
  44436. });
  44437. var ColorRecord = new r.Struct({
  44438. blue: r.uint8,
  44439. green: r.uint8,
  44440. red: r.uint8,
  44441. alpha: r.uint8
  44442. });
  44443. var CPAL = new r.VersionedStruct(r.uint16, {
  44444. header: {
  44445. numPaletteEntries: r.uint16,
  44446. numPalettes: r.uint16,
  44447. numColorRecords: r.uint16,
  44448. colorRecords: new r.Pointer(r.uint32, new r.Array(ColorRecord, 'numColorRecords')),
  44449. colorRecordIndices: new r.Array(r.uint16, 'numPalettes')
  44450. },
  44451. 0: {},
  44452. 1: {
  44453. offsetPaletteTypeArray: new r.Pointer(r.uint32, new r.Array(r.uint32, 'numPalettes')),
  44454. offsetPaletteLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPalettes')),
  44455. offsetPaletteEntryLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPaletteEntries'))
  44456. }
  44457. });
  44458. var BaseCoord = new r.VersionedStruct(r.uint16, {
  44459. 1: { // Design units only
  44460. coordinate: r.int16 // X or Y value, in design units
  44461. },
  44462. 2: { // Design units plus contour point
  44463. coordinate: r.int16, // X or Y value, in design units
  44464. referenceGlyph: r.uint16, // GlyphID of control glyph
  44465. baseCoordPoint: r.uint16 // Index of contour point on the referenceGlyph
  44466. },
  44467. 3: { // Design units plus Device table
  44468. coordinate: r.int16, // X or Y value, in design units
  44469. deviceTable: new r.Pointer(r.uint16, Device) // Device table for X or Y value
  44470. }
  44471. });
  44472. var BaseValues = new r.Struct({
  44473. defaultIndex: r.uint16, // Index of default baseline for this script-same index in the BaseTagList
  44474. baseCoordCount: r.uint16,
  44475. baseCoords: new r.Array(new r.Pointer(r.uint16, BaseCoord), 'baseCoordCount')
  44476. });
  44477. var FeatMinMaxRecord = new r.Struct({
  44478. tag: new r.String(4), // 4-byte feature identification tag-must match FeatureTag in FeatureList
  44479. minCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }), // May be NULL
  44480. maxCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }) // May be NULL
  44481. });
  44482. var MinMax = new r.Struct({
  44483. minCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL
  44484. maxCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL
  44485. featMinMaxCount: r.uint16, // May be 0
  44486. featMinMaxRecords: new r.Array(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order
  44487. });
  44488. var BaseLangSysRecord = new r.Struct({
  44489. tag: new r.String(4), // 4-byte language system identification tag
  44490. minMax: new r.Pointer(r.uint16, MinMax, { type: 'parent' })
  44491. });
  44492. var BaseScript = new r.Struct({
  44493. baseValues: new r.Pointer(r.uint16, BaseValues), // May be NULL
  44494. defaultMinMax: new r.Pointer(r.uint16, MinMax), // May be NULL
  44495. baseLangSysCount: r.uint16, // May be 0
  44496. baseLangSysRecords: new r.Array(BaseLangSysRecord, 'baseLangSysCount') // in alphabetical order by BaseLangSysTag
  44497. });
  44498. var BaseScriptRecord = new r.Struct({
  44499. tag: new r.String(4), // 4-byte script identification tag
  44500. script: new r.Pointer(r.uint16, BaseScript, { type: 'parent' })
  44501. });
  44502. var BaseScriptList = new r.Array(BaseScriptRecord, r.uint16);
  44503. // Array of 4-byte baseline identification tags-must be in alphabetical order
  44504. var BaseTagList = new r.Array(new r.String(4), r.uint16);
  44505. var Axis = new r.Struct({
  44506. baseTagList: new r.Pointer(r.uint16, BaseTagList), // May be NULL
  44507. baseScriptList: new r.Pointer(r.uint16, BaseScriptList)
  44508. });
  44509. var BASE = new r.VersionedStruct(r.uint32, {
  44510. header: {
  44511. horizAxis: new r.Pointer(r.uint16, Axis), // May be NULL
  44512. vertAxis: new r.Pointer(r.uint16, Axis) // May be NULL
  44513. },
  44514. 0x00010000: {},
  44515. 0x00010001: {
  44516. itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)
  44517. }
  44518. });
  44519. var AttachPoint = new r.Array(r.uint16, r.uint16);
  44520. var AttachList = new r.Struct({
  44521. coverage: new r.Pointer(r.uint16, Coverage),
  44522. glyphCount: r.uint16,
  44523. attachPoints: new r.Array(new r.Pointer(r.uint16, AttachPoint), 'glyphCount')
  44524. });
  44525. var CaretValue = new r.VersionedStruct(r.uint16, {
  44526. 1: { // Design units only
  44527. coordinate: r.int16
  44528. },
  44529. 2: { // Contour point
  44530. caretValuePoint: r.uint16
  44531. },
  44532. 3: { // Design units plus Device table
  44533. coordinate: r.int16,
  44534. deviceTable: new r.Pointer(r.uint16, Device)
  44535. }
  44536. });
  44537. var LigGlyph = new r.Array(new r.Pointer(r.uint16, CaretValue), r.uint16);
  44538. var LigCaretList = new r.Struct({
  44539. coverage: new r.Pointer(r.uint16, Coverage),
  44540. ligGlyphCount: r.uint16,
  44541. ligGlyphs: new r.Array(new r.Pointer(r.uint16, LigGlyph), 'ligGlyphCount')
  44542. });
  44543. var MarkGlyphSetsDef = new r.Struct({
  44544. markSetTableFormat: r.uint16,
  44545. markSetCount: r.uint16,
  44546. coverage: new r.Array(new r.Pointer(r.uint32, Coverage), 'markSetCount')
  44547. });
  44548. var GDEF = new r.VersionedStruct(r.uint32, {
  44549. header: {
  44550. glyphClassDef: new r.Pointer(r.uint16, ClassDef),
  44551. attachList: new r.Pointer(r.uint16, AttachList),
  44552. ligCaretList: new r.Pointer(r.uint16, LigCaretList),
  44553. markAttachClassDef: new r.Pointer(r.uint16, ClassDef)
  44554. },
  44555. 0x00010000: {},
  44556. 0x00010002: {
  44557. markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef)
  44558. },
  44559. 0x00010003: {
  44560. markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef),
  44561. itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)
  44562. }
  44563. });
  44564. var ValueFormat = new r.Bitfield(r.uint16, ['xPlacement', 'yPlacement', 'xAdvance', 'yAdvance', 'xPlaDevice', 'yPlaDevice', 'xAdvDevice', 'yAdvDevice']);
  44565. var types = {
  44566. xPlacement: r.int16,
  44567. yPlacement: r.int16,
  44568. xAdvance: r.int16,
  44569. yAdvance: r.int16,
  44570. xPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
  44571. yPlaDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
  44572. xAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' }),
  44573. yAdvDevice: new r.Pointer(r.uint16, Device, { type: 'global', relativeTo: 'rel' })
  44574. };
  44575. var ValueRecord = function () {
  44576. function ValueRecord() {
  44577. var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'valueFormat';
  44578. _classCallCheck(this, ValueRecord);
  44579. this.key = key;
  44580. }
  44581. ValueRecord.prototype.buildStruct = function buildStruct(parent) {
  44582. var struct = parent;
  44583. while (!struct[this.key] && struct.parent) {
  44584. struct = struct.parent;
  44585. }
  44586. if (!struct[this.key]) return;
  44587. var fields = {};
  44588. fields.rel = function () {
  44589. return struct._startOffset;
  44590. };
  44591. var format = struct[this.key];
  44592. for (var key in format) {
  44593. if (format[key]) {
  44594. fields[key] = types[key];
  44595. }
  44596. }
  44597. return new r.Struct(fields);
  44598. };
  44599. ValueRecord.prototype.size = function size(val, ctx) {
  44600. return this.buildStruct(ctx).size(val, ctx);
  44601. };
  44602. ValueRecord.prototype.decode = function decode(stream, parent) {
  44603. var res = this.buildStruct(parent).decode(stream, parent);
  44604. delete res.rel;
  44605. return res;
  44606. };
  44607. return ValueRecord;
  44608. }();
  44609. var PairValueRecord = new r.Struct({
  44610. secondGlyph: r.uint16,
  44611. value1: new ValueRecord('valueFormat1'),
  44612. value2: new ValueRecord('valueFormat2')
  44613. });
  44614. var PairSet = new r.Array(PairValueRecord, r.uint16);
  44615. var Class2Record = new r.Struct({
  44616. value1: new ValueRecord('valueFormat1'),
  44617. value2: new ValueRecord('valueFormat2')
  44618. });
  44619. var Anchor = new r.VersionedStruct(r.uint16, {
  44620. 1: { // Design units only
  44621. xCoordinate: r.int16,
  44622. yCoordinate: r.int16
  44623. },
  44624. 2: { // Design units plus contour point
  44625. xCoordinate: r.int16,
  44626. yCoordinate: r.int16,
  44627. anchorPoint: r.uint16
  44628. },
  44629. 3: { // Design units plus Device tables
  44630. xCoordinate: r.int16,
  44631. yCoordinate: r.int16,
  44632. xDeviceTable: new r.Pointer(r.uint16, Device),
  44633. yDeviceTable: new r.Pointer(r.uint16, Device)
  44634. }
  44635. });
  44636. var EntryExitRecord = new r.Struct({
  44637. entryAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' }),
  44638. exitAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })
  44639. });
  44640. var MarkRecord = new r.Struct({
  44641. class: r.uint16,
  44642. markAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })
  44643. });
  44644. var MarkArray = new r.Array(MarkRecord, r.uint16);
  44645. var BaseRecord = new r.Array(new r.Pointer(r.uint16, Anchor), function (t) {
  44646. return t.parent.classCount;
  44647. });
  44648. var BaseArray = new r.Array(BaseRecord, r.uint16);
  44649. var ComponentRecord = new r.Array(new r.Pointer(r.uint16, Anchor), function (t) {
  44650. return t.parent.parent.classCount;
  44651. });
  44652. var LigatureAttach = new r.Array(ComponentRecord, r.uint16);
  44653. var LigatureArray = new r.Array(new r.Pointer(r.uint16, LigatureAttach), r.uint16);
  44654. var GPOSLookup = new r.VersionedStruct('lookupType', {
  44655. 1: new r.VersionedStruct(r.uint16, { // Single Adjustment
  44656. 1: { // Single positioning value
  44657. coverage: new r.Pointer(r.uint16, Coverage),
  44658. valueFormat: ValueFormat,
  44659. value: new ValueRecord()
  44660. },
  44661. 2: {
  44662. coverage: new r.Pointer(r.uint16, Coverage),
  44663. valueFormat: ValueFormat,
  44664. valueCount: r.uint16,
  44665. values: new r.LazyArray(new ValueRecord(), 'valueCount')
  44666. }
  44667. }),
  44668. 2: new r.VersionedStruct(r.uint16, { // Pair Adjustment Positioning
  44669. 1: { // Adjustments for glyph pairs
  44670. coverage: new r.Pointer(r.uint16, Coverage),
  44671. valueFormat1: ValueFormat,
  44672. valueFormat2: ValueFormat,
  44673. pairSetCount: r.uint16,
  44674. pairSets: new r.LazyArray(new r.Pointer(r.uint16, PairSet), 'pairSetCount')
  44675. },
  44676. 2: { // Class pair adjustment
  44677. coverage: new r.Pointer(r.uint16, Coverage),
  44678. valueFormat1: ValueFormat,
  44679. valueFormat2: ValueFormat,
  44680. classDef1: new r.Pointer(r.uint16, ClassDef),
  44681. classDef2: new r.Pointer(r.uint16, ClassDef),
  44682. class1Count: r.uint16,
  44683. class2Count: r.uint16,
  44684. classRecords: new r.LazyArray(new r.LazyArray(Class2Record, 'class2Count'), 'class1Count')
  44685. }
  44686. }),
  44687. 3: { // Cursive Attachment Positioning
  44688. format: r.uint16,
  44689. coverage: new r.Pointer(r.uint16, Coverage),
  44690. entryExitCount: r.uint16,
  44691. entryExitRecords: new r.Array(EntryExitRecord, 'entryExitCount')
  44692. },
  44693. 4: { // MarkToBase Attachment Positioning
  44694. format: r.uint16,
  44695. markCoverage: new r.Pointer(r.uint16, Coverage),
  44696. baseCoverage: new r.Pointer(r.uint16, Coverage),
  44697. classCount: r.uint16,
  44698. markArray: new r.Pointer(r.uint16, MarkArray),
  44699. baseArray: new r.Pointer(r.uint16, BaseArray)
  44700. },
  44701. 5: { // MarkToLigature Attachment Positioning
  44702. format: r.uint16,
  44703. markCoverage: new r.Pointer(r.uint16, Coverage),
  44704. ligatureCoverage: new r.Pointer(r.uint16, Coverage),
  44705. classCount: r.uint16,
  44706. markArray: new r.Pointer(r.uint16, MarkArray),
  44707. ligatureArray: new r.Pointer(r.uint16, LigatureArray)
  44708. },
  44709. 6: { // MarkToMark Attachment Positioning
  44710. format: r.uint16,
  44711. mark1Coverage: new r.Pointer(r.uint16, Coverage),
  44712. mark2Coverage: new r.Pointer(r.uint16, Coverage),
  44713. classCount: r.uint16,
  44714. mark1Array: new r.Pointer(r.uint16, MarkArray),
  44715. mark2Array: new r.Pointer(r.uint16, BaseArray)
  44716. },
  44717. 7: Context, // Contextual positioning
  44718. 8: ChainingContext, // Chaining contextual positioning
  44719. 9: { // Extension Positioning
  44720. posFormat: r.uint16,
  44721. lookupType: r.uint16, // cannot also be 9
  44722. extension: new r.Pointer(r.uint32, GPOSLookup)
  44723. }
  44724. });
  44725. // Fix circular reference
  44726. GPOSLookup.versions[9].extension.type = GPOSLookup;
  44727. var GPOS = new r.VersionedStruct(r.uint32, {
  44728. header: {
  44729. scriptList: new r.Pointer(r.uint16, ScriptList),
  44730. featureList: new r.Pointer(r.uint16, FeatureList),
  44731. lookupList: new r.Pointer(r.uint16, new LookupList(GPOSLookup))
  44732. },
  44733. 0x00010000: {},
  44734. 0x00010001: {
  44735. featureVariations: new r.Pointer(r.uint32, FeatureVariations)
  44736. }
  44737. });
  44738. var Sequence = new r.Array(r.uint16, r.uint16);
  44739. var AlternateSet = Sequence;
  44740. var Ligature = new r.Struct({
  44741. glyph: r.uint16,
  44742. compCount: r.uint16,
  44743. components: new r.Array(r.uint16, function (t) {
  44744. return t.compCount - 1;
  44745. })
  44746. });
  44747. var LigatureSet = new r.Array(new r.Pointer(r.uint16, Ligature), r.uint16);
  44748. var GSUBLookup = new r.VersionedStruct('lookupType', {
  44749. 1: new r.VersionedStruct(r.uint16, { // Single Substitution
  44750. 1: {
  44751. coverage: new r.Pointer(r.uint16, Coverage),
  44752. deltaGlyphID: r.int16
  44753. },
  44754. 2: {
  44755. coverage: new r.Pointer(r.uint16, Coverage),
  44756. glyphCount: r.uint16,
  44757. substitute: new r.LazyArray(r.uint16, 'glyphCount')
  44758. }
  44759. }),
  44760. 2: { // Multiple Substitution
  44761. substFormat: r.uint16,
  44762. coverage: new r.Pointer(r.uint16, Coverage),
  44763. count: r.uint16,
  44764. sequences: new r.LazyArray(new r.Pointer(r.uint16, Sequence), 'count')
  44765. },
  44766. 3: { // Alternate Substitution
  44767. substFormat: r.uint16,
  44768. coverage: new r.Pointer(r.uint16, Coverage),
  44769. count: r.uint16,
  44770. alternateSet: new r.LazyArray(new r.Pointer(r.uint16, AlternateSet), 'count')
  44771. },
  44772. 4: { // Ligature Substitution
  44773. substFormat: r.uint16,
  44774. coverage: new r.Pointer(r.uint16, Coverage),
  44775. count: r.uint16,
  44776. ligatureSets: new r.LazyArray(new r.Pointer(r.uint16, LigatureSet), 'count')
  44777. },
  44778. 5: Context, // Contextual Substitution
  44779. 6: ChainingContext, // Chaining Contextual Substitution
  44780. 7: { // Extension Substitution
  44781. substFormat: r.uint16,
  44782. lookupType: r.uint16, // cannot also be 7
  44783. extension: new r.Pointer(r.uint32, GSUBLookup)
  44784. },
  44785. 8: { // Reverse Chaining Contextual Single Substitution
  44786. substFormat: r.uint16,
  44787. coverage: new r.Pointer(r.uint16, Coverage),
  44788. backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),
  44789. lookaheadGlyphCount: r.uint16,
  44790. lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),
  44791. glyphCount: r.uint16,
  44792. substitutes: new r.Array(r.uint16, 'glyphCount')
  44793. }
  44794. });
  44795. // Fix circular reference
  44796. GSUBLookup.versions[7].extension.type = GSUBLookup;
  44797. var GSUB = new r.VersionedStruct(r.uint32, {
  44798. header: {
  44799. scriptList: new r.Pointer(r.uint16, ScriptList),
  44800. featureList: new r.Pointer(r.uint16, FeatureList),
  44801. lookupList: new r.Pointer(r.uint16, new LookupList(GSUBLookup))
  44802. },
  44803. 0x00010000: {},
  44804. 0x00010001: {
  44805. featureVariations: new r.Pointer(r.uint32, FeatureVariations)
  44806. }
  44807. });
  44808. var JstfGSUBModList = new r.Array(r.uint16, r.uint16);
  44809. var JstfPriority = new r.Struct({
  44810. shrinkageEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
  44811. shrinkageDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
  44812. shrinkageEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
  44813. shrinkageDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
  44814. shrinkageJstfMax: new r.Pointer(r.uint16, new LookupList(GPOSLookup)),
  44815. extensionEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
  44816. extensionDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),
  44817. extensionEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
  44818. extensionDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),
  44819. extensionJstfMax: new r.Pointer(r.uint16, new LookupList(GPOSLookup))
  44820. });
  44821. var JstfLangSys = new r.Array(new r.Pointer(r.uint16, JstfPriority), r.uint16);
  44822. var JstfLangSysRecord = new r.Struct({
  44823. tag: new r.String(4),
  44824. jstfLangSys: new r.Pointer(r.uint16, JstfLangSys)
  44825. });
  44826. var JstfScript = new r.Struct({
  44827. extenderGlyphs: new r.Pointer(r.uint16, new r.Array(r.uint16, r.uint16)), // array of glyphs to extend line length
  44828. defaultLangSys: new r.Pointer(r.uint16, JstfLangSys),
  44829. langSysCount: r.uint16,
  44830. langSysRecords: new r.Array(JstfLangSysRecord, 'langSysCount')
  44831. });
  44832. var JstfScriptRecord = new r.Struct({
  44833. tag: new r.String(4),
  44834. script: new r.Pointer(r.uint16, JstfScript, { type: 'parent' })
  44835. });
  44836. var JSTF = new r.Struct({
  44837. version: r.uint32, // should be 0x00010000
  44838. scriptCount: r.uint16,
  44839. scriptList: new r.Array(JstfScriptRecord, 'scriptCount')
  44840. });
  44841. // TODO: add this to restructure
  44842. var VariableSizeNumber = function () {
  44843. function VariableSizeNumber(size) {
  44844. _classCallCheck(this, VariableSizeNumber);
  44845. this._size = size;
  44846. }
  44847. VariableSizeNumber.prototype.decode = function decode(stream, parent) {
  44848. switch (this.size(0, parent)) {
  44849. case 1:
  44850. return stream.readUInt8();
  44851. case 2:
  44852. return stream.readUInt16BE();
  44853. case 3:
  44854. return stream.readUInt24BE();
  44855. case 4:
  44856. return stream.readUInt32BE();
  44857. }
  44858. };
  44859. VariableSizeNumber.prototype.size = function size(val, parent) {
  44860. return restructure_src_utils.resolveLength(this._size, null, parent);
  44861. };
  44862. return VariableSizeNumber;
  44863. }();
  44864. var MapDataEntry = new r.Struct({
  44865. entry: new VariableSizeNumber(function (t) {
  44866. return ((t.parent.entryFormat & 0x0030) >> 4) + 1;
  44867. }),
  44868. outerIndex: function outerIndex(t) {
  44869. return t.entry >> (t.parent.entryFormat & 0x000F) + 1;
  44870. },
  44871. innerIndex: function innerIndex(t) {
  44872. return t.entry & (1 << (t.parent.entryFormat & 0x000F) + 1) - 1;
  44873. }
  44874. });
  44875. var DeltaSetIndexMap = new r.Struct({
  44876. entryFormat: r.uint16,
  44877. mapCount: r.uint16,
  44878. mapData: new r.Array(MapDataEntry, 'mapCount')
  44879. });
  44880. var HVAR = new r.Struct({
  44881. majorVersion: r.uint16,
  44882. minorVersion: r.uint16,
  44883. itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore),
  44884. advanceWidthMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
  44885. LSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
  44886. RSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap)
  44887. });
  44888. var Signature = new r.Struct({
  44889. format: r.uint32,
  44890. length: r.uint32,
  44891. offset: r.uint32
  44892. });
  44893. var SignatureBlock = new r.Struct({
  44894. reserved: new r.Reserved(r.uint16, 2),
  44895. cbSignature: r.uint32, // Length (in bytes) of the PKCS#7 packet in pbSignature
  44896. signature: new r.Buffer('cbSignature')
  44897. });
  44898. var DSIG = new r.Struct({
  44899. ulVersion: r.uint32, // Version number of the DSIG table (0x00000001)
  44900. usNumSigs: r.uint16, // Number of signatures in the table
  44901. usFlag: r.uint16, // Permission flags
  44902. signatures: new r.Array(Signature, 'usNumSigs'),
  44903. signatureBlocks: new r.Array(SignatureBlock, 'usNumSigs')
  44904. });
  44905. var GaspRange = new r.Struct({
  44906. rangeMaxPPEM: r.uint16, // Upper limit of range, in ppem
  44907. rangeGaspBehavior: new r.Bitfield(r.uint16, [// Flags describing desired rasterizer behavior
  44908. 'grayscale', 'gridfit', 'symmetricSmoothing', 'symmetricGridfit' // only in version 1, for ClearType
  44909. ])
  44910. });
  44911. var gasp = new r.Struct({
  44912. version: r.uint16, // set to 0
  44913. numRanges: r.uint16,
  44914. gaspRanges: new r.Array(GaspRange, 'numRanges') // Sorted by ppem
  44915. });
  44916. var DeviceRecord = new r.Struct({
  44917. pixelSize: r.uint8,
  44918. maximumWidth: r.uint8,
  44919. widths: new r.Array(r.uint8, function (t) {
  44920. return t.parent.parent.maxp.numGlyphs;
  44921. })
  44922. });
  44923. // The Horizontal Device Metrics table stores integer advance widths scaled to particular pixel sizes
  44924. var hdmx = new r.Struct({
  44925. version: r.uint16,
  44926. numRecords: r.int16,
  44927. sizeDeviceRecord: r.int32,
  44928. records: new r.Array(DeviceRecord, 'numRecords')
  44929. });
  44930. var KernPair = new r.Struct({
  44931. left: r.uint16,
  44932. right: r.uint16,
  44933. value: r.int16
  44934. });
  44935. var ClassTable = new r.Struct({
  44936. firstGlyph: r.uint16,
  44937. nGlyphs: r.uint16,
  44938. offsets: new r.Array(r.uint16, 'nGlyphs'),
  44939. max: function max(t) {
  44940. return t.offsets.length && Math.max.apply(Math, t.offsets);
  44941. }
  44942. });
  44943. var Kern2Array = new r.Struct({
  44944. off: function off(t) {
  44945. return t._startOffset - t.parent.parent._startOffset;
  44946. },
  44947. len: function len(t) {
  44948. return ((t.parent.leftTable.max - t.off) / t.parent.rowWidth + 1) * (t.parent.rowWidth / 2);
  44949. },
  44950. values: new r.LazyArray(r.int16, 'len')
  44951. });
  44952. var KernSubtable = new r.VersionedStruct('format', {
  44953. 0: {
  44954. nPairs: r.uint16,
  44955. searchRange: r.uint16,
  44956. entrySelector: r.uint16,
  44957. rangeShift: r.uint16,
  44958. pairs: new r.Array(KernPair, 'nPairs')
  44959. },
  44960. 2: {
  44961. rowWidth: r.uint16,
  44962. leftTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),
  44963. rightTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),
  44964. array: new r.Pointer(r.uint16, Kern2Array, { type: 'parent' })
  44965. },
  44966. 3: {
  44967. glyphCount: r.uint16,
  44968. kernValueCount: r.uint8,
  44969. leftClassCount: r.uint8,
  44970. rightClassCount: r.uint8,
  44971. flags: r.uint8,
  44972. kernValue: new r.Array(r.int16, 'kernValueCount'),
  44973. leftClass: new r.Array(r.uint8, 'glyphCount'),
  44974. rightClass: new r.Array(r.uint8, 'glyphCount'),
  44975. kernIndex: new r.Array(r.uint8, function (t) {
  44976. return t.leftClassCount * t.rightClassCount;
  44977. })
  44978. }
  44979. });
  44980. var KernTable = new r.VersionedStruct('version', {
  44981. 0: { // Microsoft uses this format
  44982. subVersion: r.uint16, // Microsoft has an extra sub-table version number
  44983. length: r.uint16, // Length of the subtable, in bytes
  44984. format: r.uint8, // Format of subtable
  44985. coverage: new r.Bitfield(r.uint8, ['horizontal', // 1 if table has horizontal data, 0 if vertical
  44986. 'minimum', // If set to 1, the table has minimum values. If set to 0, the table has kerning values.
  44987. 'crossStream', // If set to 1, kerning is perpendicular to the flow of the text
  44988. 'override' // If set to 1 the value in this table replaces the accumulated value
  44989. ]),
  44990. subtable: KernSubtable,
  44991. padding: new r.Reserved(r.uint8, function (t) {
  44992. return t.length - t._currentOffset;
  44993. })
  44994. },
  44995. 1: { // Apple uses this format
  44996. length: r.uint32,
  44997. coverage: new r.Bitfield(r.uint8, [null, null, null, null, null, 'variation', // Set if table has variation kerning values
  44998. 'crossStream', // Set if table has cross-stream kerning values
  44999. 'vertical' // Set if table has vertical kerning values
  45000. ]),
  45001. format: r.uint8,
  45002. tupleIndex: r.uint16,
  45003. subtable: KernSubtable,
  45004. padding: new r.Reserved(r.uint8, function (t) {
  45005. return t.length - t._currentOffset;
  45006. })
  45007. }
  45008. });
  45009. var kern = new r.VersionedStruct(r.uint16, {
  45010. 0: { // Microsoft Version
  45011. nTables: r.uint16,
  45012. tables: new r.Array(KernTable, 'nTables')
  45013. },
  45014. 1: { // Apple Version
  45015. reserved: new r.Reserved(r.uint16), // the other half of the version number
  45016. nTables: r.uint32,
  45017. tables: new r.Array(KernTable, 'nTables')
  45018. }
  45019. });
  45020. // Linear Threshold table
  45021. // Records the ppem for each glyph at which the scaling becomes linear again,
  45022. // despite instructions effecting the advance width
  45023. var LTSH = new r.Struct({
  45024. version: r.uint16,
  45025. numGlyphs: r.uint16,
  45026. yPels: new r.Array(r.uint8, 'numGlyphs')
  45027. });
  45028. // PCL 5 Table
  45029. // NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines
  45030. var PCLT = new r.Struct({
  45031. version: r.uint16,
  45032. fontNumber: r.uint32,
  45033. pitch: r.uint16,
  45034. xHeight: r.uint16,
  45035. style: r.uint16,
  45036. typeFamily: r.uint16,
  45037. capHeight: r.uint16,
  45038. symbolSet: r.uint16,
  45039. typeface: new r.String(16),
  45040. characterComplement: new r.String(8),
  45041. fileName: new r.String(6),
  45042. strokeWeight: new r.String(1),
  45043. widthType: new r.String(1),
  45044. serifStyle: r.uint8,
  45045. reserved: new r.Reserved(r.uint8)
  45046. });
  45047. // VDMX tables contain ascender/descender overrides for certain (usually small)
  45048. // sizes. This is needed in order to match font metrics on Windows.
  45049. var Ratio = new r.Struct({
  45050. bCharSet: r.uint8, // Character set
  45051. xRatio: r.uint8, // Value to use for x-Ratio
  45052. yStartRatio: r.uint8, // Starting y-Ratio value
  45053. yEndRatio: r.uint8 // Ending y-Ratio value
  45054. });
  45055. var vTable = new r.Struct({
  45056. yPelHeight: r.uint16, // yPelHeight to which values apply
  45057. yMax: r.int16, // Maximum value (in pels) for this yPelHeight
  45058. yMin: r.int16 // Minimum value (in pels) for this yPelHeight
  45059. });
  45060. var VdmxGroup = new r.Struct({
  45061. recs: r.uint16, // Number of height records in this group
  45062. startsz: r.uint8, // Starting yPelHeight
  45063. endsz: r.uint8, // Ending yPelHeight
  45064. entries: new r.Array(vTable, 'recs') // The VDMX records
  45065. });
  45066. var VDMX = new r.Struct({
  45067. version: r.uint16, // Version number (0 or 1)
  45068. numRecs: r.uint16, // Number of VDMX groups present
  45069. numRatios: r.uint16, // Number of aspect ratio groupings
  45070. ratioRanges: new r.Array(Ratio, 'numRatios'), // Ratio ranges
  45071. offsets: new r.Array(r.uint16, 'numRatios'), // Offset to the VDMX group for this ratio range
  45072. groups: new r.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings
  45073. });
  45074. // Vertical Header Table
  45075. var vhea = new r.Struct({
  45076. version: r.uint16, // Version number of the Vertical Header Table
  45077. ascent: r.int16, // The vertical typographic ascender for this font
  45078. descent: r.int16, // The vertical typographic descender for this font
  45079. lineGap: r.int16, // The vertical typographic line gap for this font
  45080. advanceHeightMax: r.int16, // The maximum advance height measurement found in the font
  45081. minTopSideBearing: r.int16, // The minimum top side bearing measurement found in the font
  45082. minBottomSideBearing: r.int16, // The minimum bottom side bearing measurement found in the font
  45083. yMaxExtent: r.int16,
  45084. caretSlopeRise: r.int16, // Caret slope (rise/run)
  45085. caretSlopeRun: r.int16,
  45086. caretOffset: r.int16, // Set value equal to 0 for nonslanted fonts
  45087. reserved: new r.Reserved(r.int16, 4),
  45088. metricDataFormat: r.int16, // Set to 0
  45089. numberOfMetrics: r.uint16 // Number of advance heights in the Vertical Metrics table
  45090. });
  45091. var VmtxEntry = new r.Struct({
  45092. advance: r.uint16, // The advance height of the glyph
  45093. bearing: r.int16 // The top sidebearing of the glyph
  45094. });
  45095. // Vertical Metrics Table
  45096. var vmtx = new r.Struct({
  45097. metrics: new r.LazyArray(VmtxEntry, function (t) {
  45098. return t.parent.vhea.numberOfMetrics;
  45099. }),
  45100. bearings: new r.LazyArray(r.int16, function (t) {
  45101. return t.parent.maxp.numGlyphs - t.parent.vhea.numberOfMetrics;
  45102. })
  45103. });
  45104. var shortFrac = new r.Fixed(16, 'BE', 14);
  45105. var Correspondence = new r.Struct({
  45106. fromCoord: shortFrac,
  45107. toCoord: shortFrac
  45108. });
  45109. var Segment = new r.Struct({
  45110. pairCount: r.uint16,
  45111. correspondence: new r.Array(Correspondence, 'pairCount')
  45112. });
  45113. var avar = new r.Struct({
  45114. version: r.fixed32,
  45115. axisCount: r.uint32,
  45116. segment: new r.Array(Segment, 'axisCount')
  45117. });
  45118. var UnboundedArrayAccessor = function () {
  45119. function UnboundedArrayAccessor(type, stream, parent) {
  45120. _classCallCheck(this, UnboundedArrayAccessor);
  45121. this.type = type;
  45122. this.stream = stream;
  45123. this.parent = parent;
  45124. this.base = this.stream.pos;
  45125. this._items = [];
  45126. }
  45127. UnboundedArrayAccessor.prototype.getItem = function getItem(index) {
  45128. if (this._items[index] == null) {
  45129. var pos = this.stream.pos;
  45130. this.stream.pos = this.base + this.type.size(null, this.parent) * index;
  45131. this._items[index] = this.type.decode(this.stream, this.parent);
  45132. this.stream.pos = pos;
  45133. }
  45134. return this._items[index];
  45135. };
  45136. UnboundedArrayAccessor.prototype.inspect = function inspect() {
  45137. return '[UnboundedArray ' + this.type.constructor.name + ']';
  45138. };
  45139. return UnboundedArrayAccessor;
  45140. }();
  45141. var UnboundedArray = function (_r$Array) {
  45142. _inherits(UnboundedArray, _r$Array);
  45143. function UnboundedArray(type) {
  45144. _classCallCheck(this, UnboundedArray);
  45145. return _possibleConstructorReturn(this, _r$Array.call(this, type, 0));
  45146. }
  45147. UnboundedArray.prototype.decode = function decode(stream, parent) {
  45148. return new UnboundedArrayAccessor(this.type, stream, parent);
  45149. };
  45150. return UnboundedArray;
  45151. }(r.Array);
  45152. var LookupTable = function LookupTable() {
  45153. var ValueType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : r.uint16;
  45154. // Helper class that makes internal structures invisible to pointers
  45155. var Shadow = function () {
  45156. function Shadow(type) {
  45157. _classCallCheck(this, Shadow);
  45158. this.type = type;
  45159. }
  45160. Shadow.prototype.decode = function decode(stream, ctx) {
  45161. ctx = ctx.parent.parent;
  45162. return this.type.decode(stream, ctx);
  45163. };
  45164. Shadow.prototype.size = function size(val, ctx) {
  45165. ctx = ctx.parent.parent;
  45166. return this.type.size(val, ctx);
  45167. };
  45168. Shadow.prototype.encode = function encode(stream, val, ctx) {
  45169. ctx = ctx.parent.parent;
  45170. return this.type.encode(stream, val, ctx);
  45171. };
  45172. return Shadow;
  45173. }();
  45174. ValueType = new Shadow(ValueType);
  45175. var BinarySearchHeader = new r.Struct({
  45176. unitSize: r.uint16,
  45177. nUnits: r.uint16,
  45178. searchRange: r.uint16,
  45179. entrySelector: r.uint16,
  45180. rangeShift: r.uint16
  45181. });
  45182. var LookupSegmentSingle = new r.Struct({
  45183. lastGlyph: r.uint16,
  45184. firstGlyph: r.uint16,
  45185. value: ValueType
  45186. });
  45187. var LookupSegmentArray = new r.Struct({
  45188. lastGlyph: r.uint16,
  45189. firstGlyph: r.uint16,
  45190. values: new r.Pointer(r.uint16, new r.Array(ValueType, function (t) {
  45191. return t.lastGlyph - t.firstGlyph + 1;
  45192. }), { type: 'parent' })
  45193. });
  45194. var LookupSingle = new r.Struct({
  45195. glyph: r.uint16,
  45196. value: ValueType
  45197. });
  45198. return new r.VersionedStruct(r.uint16, {
  45199. 0: {
  45200. values: new UnboundedArray(ValueType) // length == number of glyphs maybe?
  45201. },
  45202. 2: {
  45203. binarySearchHeader: BinarySearchHeader,
  45204. segments: new r.Array(LookupSegmentSingle, function (t) {
  45205. return t.binarySearchHeader.nUnits;
  45206. })
  45207. },
  45208. 4: {
  45209. binarySearchHeader: BinarySearchHeader,
  45210. segments: new r.Array(LookupSegmentArray, function (t) {
  45211. return t.binarySearchHeader.nUnits;
  45212. })
  45213. },
  45214. 6: {
  45215. binarySearchHeader: BinarySearchHeader,
  45216. segments: new r.Array(LookupSingle, function (t) {
  45217. return t.binarySearchHeader.nUnits;
  45218. })
  45219. },
  45220. 8: {
  45221. firstGlyph: r.uint16,
  45222. count: r.uint16,
  45223. values: new r.Array(ValueType, 'count')
  45224. }
  45225. });
  45226. };
  45227. function StateTable() {
  45228. var entryData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  45229. var lookupType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : r.uint16;
  45230. var entry = _Object$assign({
  45231. newState: r.uint16,
  45232. flags: r.uint16
  45233. }, entryData);
  45234. var Entry = new r.Struct(entry);
  45235. var StateArray = new UnboundedArray(new r.Array(r.uint16, function (t) {
  45236. return t.nClasses;
  45237. }));
  45238. var StateHeader = new r.Struct({
  45239. nClasses: r.uint32,
  45240. classTable: new r.Pointer(r.uint32, new LookupTable(lookupType)),
  45241. stateArray: new r.Pointer(r.uint32, StateArray),
  45242. entryTable: new r.Pointer(r.uint32, new UnboundedArray(Entry))
  45243. });
  45244. return StateHeader;
  45245. }
  45246. // This is the old version of the StateTable structure
  45247. function StateTable1() {
  45248. var entryData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  45249. var lookupType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : r.uint16;
  45250. var ClassLookupTable = new r.Struct({
  45251. version: function version() {
  45252. return 8;
  45253. },
  45254. // simulate LookupTable
  45255. firstGlyph: r.uint16,
  45256. values: new r.Array(r.uint8, r.uint16)
  45257. });
  45258. var entry = _Object$assign({
  45259. newStateOffset: r.uint16,
  45260. // convert offset to stateArray index
  45261. newState: function newState(t) {
  45262. return (t.newStateOffset - (t.parent.stateArray.base - t.parent._startOffset)) / t.parent.nClasses;
  45263. },
  45264. flags: r.uint16
  45265. }, entryData);
  45266. var Entry = new r.Struct(entry);
  45267. var StateArray = new UnboundedArray(new r.Array(r.uint8, function (t) {
  45268. return t.nClasses;
  45269. }));
  45270. var StateHeader1 = new r.Struct({
  45271. nClasses: r.uint16,
  45272. classTable: new r.Pointer(r.uint16, ClassLookupTable),
  45273. stateArray: new r.Pointer(r.uint16, StateArray),
  45274. entryTable: new r.Pointer(r.uint16, new UnboundedArray(Entry))
  45275. });
  45276. return StateHeader1;
  45277. }
  45278. var BslnSubtable = new r.VersionedStruct('format', {
  45279. 0: { // Distance-based, no mapping
  45280. deltas: new r.Array(r.int16, 32)
  45281. },
  45282. 1: { // Distance-based, with mapping
  45283. deltas: new r.Array(r.int16, 32),
  45284. mappingData: new LookupTable(r.uint16)
  45285. },
  45286. 2: { // Control point-based, no mapping
  45287. standardGlyph: r.uint16,
  45288. controlPoints: new r.Array(r.uint16, 32)
  45289. },
  45290. 3: { // Control point-based, with mapping
  45291. standardGlyph: r.uint16,
  45292. controlPoints: new r.Array(r.uint16, 32),
  45293. mappingData: new LookupTable(r.uint16)
  45294. }
  45295. });
  45296. var bsln = new r.Struct({
  45297. version: r.fixed32,
  45298. format: r.uint16,
  45299. defaultBaseline: r.uint16,
  45300. subtable: BslnSubtable
  45301. });
  45302. var Setting = new r.Struct({
  45303. setting: r.uint16,
  45304. nameIndex: r.int16,
  45305. name: function name(t) {
  45306. return t.parent.parent.parent.name.records.fontFeatures[t.nameIndex];
  45307. }
  45308. });
  45309. var FeatureName = new r.Struct({
  45310. feature: r.uint16,
  45311. nSettings: r.uint16,
  45312. settingTable: new r.Pointer(r.uint32, new r.Array(Setting, 'nSettings'), { type: 'parent' }),
  45313. featureFlags: new r.Bitfield(r.uint8, [null, null, null, null, null, null, 'hasDefault', 'exclusive']),
  45314. defaultSetting: r.uint8,
  45315. nameIndex: r.int16,
  45316. name: function name(t) {
  45317. return t.parent.parent.name.records.fontFeatures[t.nameIndex];
  45318. }
  45319. });
  45320. var feat = new r.Struct({
  45321. version: r.fixed32,
  45322. featureNameCount: r.uint16,
  45323. reserved1: new r.Reserved(r.uint16),
  45324. reserved2: new r.Reserved(r.uint32),
  45325. featureNames: new r.Array(FeatureName, 'featureNameCount')
  45326. });
  45327. var Axis$1 = new r.Struct({
  45328. axisTag: new r.String(4),
  45329. minValue: r.fixed32,
  45330. defaultValue: r.fixed32,
  45331. maxValue: r.fixed32,
  45332. flags: r.uint16,
  45333. nameID: r.uint16,
  45334. name: function name(t) {
  45335. return t.parent.parent.name.records.fontFeatures[t.nameID];
  45336. }
  45337. });
  45338. var Instance = new r.Struct({
  45339. nameID: r.uint16,
  45340. name: function name(t) {
  45341. return t.parent.parent.name.records.fontFeatures[t.nameID];
  45342. },
  45343. flags: r.uint16,
  45344. coord: new r.Array(r.fixed32, function (t) {
  45345. return t.parent.axisCount;
  45346. }),
  45347. postscriptNameID: new r.Optional(r.uint16, function (t) {
  45348. return t.parent.instanceSize - t._currentOffset > 0;
  45349. })
  45350. });
  45351. var fvar = new r.Struct({
  45352. version: r.fixed32,
  45353. offsetToData: r.uint16,
  45354. countSizePairs: r.uint16,
  45355. axisCount: r.uint16,
  45356. axisSize: r.uint16,
  45357. instanceCount: r.uint16,
  45358. instanceSize: r.uint16,
  45359. axis: new r.Array(Axis$1, 'axisCount'),
  45360. instance: new r.Array(Instance, 'instanceCount')
  45361. });
  45362. var shortFrac$1 = new r.Fixed(16, 'BE', 14);
  45363. var Offset = function () {
  45364. function Offset() {
  45365. _classCallCheck(this, Offset);
  45366. }
  45367. Offset.decode = function decode(stream, parent) {
  45368. // In short format, offsets are multiplied by 2.
  45369. // This doesn't seem to be documented by Apple, but it
  45370. // is implemented this way in Freetype.
  45371. return parent.flags ? stream.readUInt32BE() : stream.readUInt16BE() * 2;
  45372. };
  45373. return Offset;
  45374. }();
  45375. var gvar = new r.Struct({
  45376. version: r.uint16,
  45377. reserved: new r.Reserved(r.uint16),
  45378. axisCount: r.uint16,
  45379. globalCoordCount: r.uint16,
  45380. globalCoords: new r.Pointer(r.uint32, new r.Array(new r.Array(shortFrac$1, 'axisCount'), 'globalCoordCount')),
  45381. glyphCount: r.uint16,
  45382. flags: r.uint16,
  45383. offsetToData: r.uint32,
  45384. offsets: new r.Array(new r.Pointer(Offset, 'void', { relativeTo: 'offsetToData', allowNull: false }), function (t) {
  45385. return t.glyphCount + 1;
  45386. })
  45387. });
  45388. var ClassTable$1 = new r.Struct({
  45389. length: r.uint16,
  45390. coverage: r.uint16,
  45391. subFeatureFlags: r.uint32,
  45392. stateTable: new StateTable1()
  45393. });
  45394. var WidthDeltaRecord = new r.Struct({
  45395. justClass: r.uint32,
  45396. beforeGrowLimit: r.fixed32,
  45397. beforeShrinkLimit: r.fixed32,
  45398. afterGrowLimit: r.fixed32,
  45399. afterShrinkLimit: r.fixed32,
  45400. growFlags: r.uint16,
  45401. shrinkFlags: r.uint16
  45402. });
  45403. var WidthDeltaCluster = new r.Array(WidthDeltaRecord, r.uint32);
  45404. var ActionData = new r.VersionedStruct('actionType', {
  45405. 0: { // Decomposition action
  45406. lowerLimit: r.fixed32,
  45407. upperLimit: r.fixed32,
  45408. order: r.uint16,
  45409. glyphs: new r.Array(r.uint16, r.uint16)
  45410. },
  45411. 1: { // Unconditional add glyph action
  45412. addGlyph: r.uint16
  45413. },
  45414. 2: { // Conditional add glyph action
  45415. substThreshold: r.fixed32,
  45416. addGlyph: r.uint16,
  45417. substGlyph: r.uint16
  45418. },
  45419. 3: {}, // Stretch glyph action (no data, not supported by CoreText)
  45420. 4: { // Ductile glyph action (not supported by CoreText)
  45421. variationAxis: r.uint32,
  45422. minimumLimit: r.fixed32,
  45423. noStretchValue: r.fixed32,
  45424. maximumLimit: r.fixed32
  45425. },
  45426. 5: { // Repeated add glyph action
  45427. flags: r.uint16,
  45428. glyph: r.uint16
  45429. }
  45430. });
  45431. var Action = new r.Struct({
  45432. actionClass: r.uint16,
  45433. actionType: r.uint16,
  45434. actionLength: r.uint32,
  45435. actionData: ActionData,
  45436. padding: new r.Reserved(r.uint8, function (t) {
  45437. return t.actionLength - t._currentOffset;
  45438. })
  45439. });
  45440. var PostcompensationAction = new r.Array(Action, r.uint32);
  45441. var PostCompensationTable = new r.Struct({
  45442. lookupTable: new LookupTable(new r.Pointer(r.uint16, PostcompensationAction))
  45443. });
  45444. var JustificationTable = new r.Struct({
  45445. classTable: new r.Pointer(r.uint16, ClassTable$1, { type: 'parent' }),
  45446. wdcOffset: r.uint16,
  45447. postCompensationTable: new r.Pointer(r.uint16, PostCompensationTable, { type: 'parent' }),
  45448. widthDeltaClusters: new LookupTable(new r.Pointer(r.uint16, WidthDeltaCluster, { type: 'parent', relativeTo: 'wdcOffset' }))
  45449. });
  45450. var just = new r.Struct({
  45451. version: r.uint32,
  45452. format: r.uint16,
  45453. horizontal: new r.Pointer(r.uint16, JustificationTable),
  45454. vertical: new r.Pointer(r.uint16, JustificationTable)
  45455. });
  45456. var LigatureData = {
  45457. action: r.uint16
  45458. };
  45459. var ContextualData = {
  45460. markIndex: r.uint16,
  45461. currentIndex: r.uint16
  45462. };
  45463. var InsertionData = {
  45464. currentInsertIndex: r.uint16,
  45465. markedInsertIndex: r.uint16
  45466. };
  45467. var SubstitutionTable = new r.Struct({
  45468. items: new UnboundedArray(new r.Pointer(r.uint32, new LookupTable()))
  45469. });
  45470. var SubtableData = new r.VersionedStruct('type', {
  45471. 0: { // Indic Rearrangement Subtable
  45472. stateTable: new StateTable()
  45473. },
  45474. 1: { // Contextual Glyph Substitution Subtable
  45475. stateTable: new StateTable(ContextualData),
  45476. substitutionTable: new r.Pointer(r.uint32, SubstitutionTable)
  45477. },
  45478. 2: { // Ligature subtable
  45479. stateTable: new StateTable(LigatureData),
  45480. ligatureActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint32)),
  45481. components: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)),
  45482. ligatureList: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))
  45483. },
  45484. 4: { // Non-contextual Glyph Substitution Subtable
  45485. lookupTable: new LookupTable()
  45486. },
  45487. 5: { // Glyph Insertion Subtable
  45488. stateTable: new StateTable(InsertionData),
  45489. insertionActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))
  45490. }
  45491. });
  45492. var Subtable = new r.Struct({
  45493. length: r.uint32,
  45494. coverage: r.uint24,
  45495. type: r.uint8,
  45496. subFeatureFlags: r.uint32,
  45497. table: SubtableData,
  45498. padding: new r.Reserved(r.uint8, function (t) {
  45499. return t.length - t._currentOffset;
  45500. })
  45501. });
  45502. var FeatureEntry = new r.Struct({
  45503. featureType: r.uint16,
  45504. featureSetting: r.uint16,
  45505. enableFlags: r.uint32,
  45506. disableFlags: r.uint32
  45507. });
  45508. var MorxChain = new r.Struct({
  45509. defaultFlags: r.uint32,
  45510. chainLength: r.uint32,
  45511. nFeatureEntries: r.uint32,
  45512. nSubtables: r.uint32,
  45513. features: new r.Array(FeatureEntry, 'nFeatureEntries'),
  45514. subtables: new r.Array(Subtable, 'nSubtables')
  45515. });
  45516. var morx = new r.Struct({
  45517. version: r.uint16,
  45518. unused: new r.Reserved(r.uint16),
  45519. nChains: r.uint32,
  45520. chains: new r.Array(MorxChain, 'nChains')
  45521. });
  45522. var OpticalBounds = new r.Struct({
  45523. left: r.int16,
  45524. top: r.int16,
  45525. right: r.int16,
  45526. bottom: r.int16
  45527. });
  45528. var opbd = new r.Struct({
  45529. version: r.fixed32,
  45530. format: r.uint16,
  45531. lookupTable: new LookupTable(OpticalBounds)
  45532. });
  45533. var tables = {};
  45534. // Required Tables
  45535. tables.cmap = cmap;
  45536. tables.head = head;
  45537. tables.hhea = hhea;
  45538. tables.hmtx = hmtx;
  45539. tables.maxp = maxp;
  45540. tables.name = NameTable;
  45541. tables['OS/2'] = OS2;
  45542. tables.post = post;
  45543. // TrueType Outlines
  45544. tables.fpgm = fpgm;
  45545. tables.loca = loca;
  45546. tables.prep = prep;
  45547. tables['cvt '] = cvt;
  45548. tables.glyf = glyf;
  45549. // PostScript Outlines
  45550. tables['CFF '] = CFFFont;
  45551. tables['CFF2'] = CFFFont;
  45552. tables.VORG = VORG;
  45553. // Bitmap Glyphs
  45554. tables.EBLC = EBLC;
  45555. tables.CBLC = tables.EBLC;
  45556. tables.sbix = sbix;
  45557. tables.COLR = COLR;
  45558. tables.CPAL = CPAL;
  45559. // Advanced OpenType Tables
  45560. tables.BASE = BASE;
  45561. tables.GDEF = GDEF;
  45562. tables.GPOS = GPOS;
  45563. tables.GSUB = GSUB;
  45564. tables.JSTF = JSTF;
  45565. // OpenType variations tables
  45566. tables.HVAR = HVAR;
  45567. // Other OpenType Tables
  45568. tables.DSIG = DSIG;
  45569. tables.gasp = gasp;
  45570. tables.hdmx = hdmx;
  45571. tables.kern = kern;
  45572. tables.LTSH = LTSH;
  45573. tables.PCLT = PCLT;
  45574. tables.VDMX = VDMX;
  45575. tables.vhea = vhea;
  45576. tables.vmtx = vmtx;
  45577. // Apple Advanced Typography Tables
  45578. tables.avar = avar;
  45579. tables.bsln = bsln;
  45580. tables.feat = feat;
  45581. tables.fvar = fvar;
  45582. tables.gvar = gvar;
  45583. tables.just = just;
  45584. tables.morx = morx;
  45585. tables.opbd = opbd;
  45586. var TableEntry = new r.Struct({
  45587. tag: new r.String(4),
  45588. checkSum: r.uint32,
  45589. offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
  45590. length: r.uint32
  45591. });
  45592. var Directory = new r.Struct({
  45593. tag: new r.String(4),
  45594. numTables: r.uint16,
  45595. searchRange: r.uint16,
  45596. entrySelector: r.uint16,
  45597. rangeShift: r.uint16,
  45598. tables: new r.Array(TableEntry, 'numTables')
  45599. });
  45600. Directory.process = function () {
  45601. var tables = {};
  45602. for (var _iterator = this.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  45603. var _ref;
  45604. if (_isArray) {
  45605. if (_i >= _iterator.length) break;
  45606. _ref = _iterator[_i++];
  45607. } else {
  45608. _i = _iterator.next();
  45609. if (_i.done) break;
  45610. _ref = _i.value;
  45611. }
  45612. var table = _ref;
  45613. tables[table.tag] = table;
  45614. }
  45615. this.tables = tables;
  45616. };
  45617. Directory.preEncode = function (stream) {
  45618. var tables$$ = [];
  45619. for (var tag in this.tables) {
  45620. var table = this.tables[tag];
  45621. if (table) {
  45622. tables$$.push({
  45623. tag: tag,
  45624. checkSum: 0,
  45625. offset: new r.VoidPointer(tables[tag], table),
  45626. length: tables[tag].size(table)
  45627. });
  45628. }
  45629. }
  45630. this.tag = 'true';
  45631. this.numTables = tables$$.length;
  45632. this.tables = tables$$;
  45633. this.searchRange = Math.floor(Math.log(this.numTables) / Math.LN2) * 16;
  45634. this.entrySelector = Math.floor(this.searchRange / Math.LN2);
  45635. this.rangeShift = this.numTables * 16 - this.searchRange;
  45636. };
  45637. function binarySearch(arr, cmp) {
  45638. var min = 0;
  45639. var max = arr.length - 1;
  45640. while (min <= max) {
  45641. var mid = min + max >> 1;
  45642. var res = cmp(arr[mid]);
  45643. if (res < 0) {
  45644. max = mid - 1;
  45645. } else if (res > 0) {
  45646. min = mid + 1;
  45647. } else {
  45648. return mid;
  45649. }
  45650. }
  45651. return -1;
  45652. }
  45653. function range(index, end) {
  45654. var range = [];
  45655. while (index < end) {
  45656. range.push(index++);
  45657. }
  45658. return range;
  45659. }
  45660. var _class$1;
  45661. function _applyDecoratedDescriptor$1(target, property, decorators, descriptor, context) {
  45662. var desc = {};
  45663. Object['ke' + 'ys'](descriptor).forEach(function (key) {
  45664. desc[key] = descriptor[key];
  45665. });
  45666. desc.enumerable = !!desc.enumerable;
  45667. desc.configurable = !!desc.configurable;
  45668. if ('value' in desc || desc.initializer) {
  45669. desc.writable = true;
  45670. }
  45671. desc = decorators.slice().reverse().reduce(function (desc, decorator) {
  45672. return decorator(target, property, desc) || desc;
  45673. }, desc);
  45674. if (context && desc.initializer !== void 0) {
  45675. desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
  45676. desc.initializer = undefined;
  45677. }
  45678. if (desc.initializer === void 0) {
  45679. Object['define' + 'Property'](target, property, desc);
  45680. desc = null;
  45681. }
  45682. return desc;
  45683. }
  45684. // iconv-lite is an optional dependency.
  45685. try {
  45686. var iconv = __webpack_require__(87);
  45687. } catch (err) {}
  45688. var CmapProcessor = (_class$1 = function () {
  45689. function CmapProcessor(cmapTable) {
  45690. _classCallCheck(this, CmapProcessor);
  45691. // Attempt to find a Unicode cmap first
  45692. this.encoding = null;
  45693. this.cmap = this.findSubtable(cmapTable, [
  45694. // 32-bit subtables
  45695. [3, 10], [0, 6], [0, 4],
  45696. // 16-bit subtables
  45697. [3, 1], [0, 3], [0, 2], [0, 1], [0, 0]]);
  45698. // If not unicode cmap was found, and iconv-lite is installed,
  45699. // take the first table with a supported encoding.
  45700. if (!this.cmap && iconv) {
  45701. for (var _iterator = cmapTable.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  45702. var _ref;
  45703. if (_isArray) {
  45704. if (_i >= _iterator.length) break;
  45705. _ref = _iterator[_i++];
  45706. } else {
  45707. _i = _iterator.next();
  45708. if (_i.done) break;
  45709. _ref = _i.value;
  45710. }
  45711. var cmap = _ref;
  45712. var encoding = getEncoding(cmap.platformID, cmap.encodingID, cmap.table.language - 1);
  45713. if (iconv.encodingExists(encoding)) {
  45714. this.cmap = cmap.table;
  45715. this.encoding = encoding;
  45716. }
  45717. }
  45718. }
  45719. if (!this.cmap) {
  45720. throw new Error("Could not find a supported cmap table");
  45721. }
  45722. this.uvs = this.findSubtable(cmapTable, [[0, 5]]);
  45723. if (this.uvs && this.uvs.version !== 14) {
  45724. this.uvs = null;
  45725. }
  45726. }
  45727. CmapProcessor.prototype.findSubtable = function findSubtable(cmapTable, pairs) {
  45728. for (var _iterator2 = pairs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  45729. var _ref2;
  45730. if (_isArray2) {
  45731. if (_i2 >= _iterator2.length) break;
  45732. _ref2 = _iterator2[_i2++];
  45733. } else {
  45734. _i2 = _iterator2.next();
  45735. if (_i2.done) break;
  45736. _ref2 = _i2.value;
  45737. }
  45738. var _ref3 = _ref2,
  45739. platformID = _ref3[0],
  45740. encodingID = _ref3[1];
  45741. for (var _iterator3 = cmapTable.tables, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  45742. var _ref4;
  45743. if (_isArray3) {
  45744. if (_i3 >= _iterator3.length) break;
  45745. _ref4 = _iterator3[_i3++];
  45746. } else {
  45747. _i3 = _iterator3.next();
  45748. if (_i3.done) break;
  45749. _ref4 = _i3.value;
  45750. }
  45751. var cmap = _ref4;
  45752. if (cmap.platformID === platformID && cmap.encodingID === encodingID) {
  45753. return cmap.table;
  45754. }
  45755. }
  45756. }
  45757. return null;
  45758. };
  45759. CmapProcessor.prototype.lookup = function lookup(codepoint, variationSelector) {
  45760. // If there is no Unicode cmap in this font, we need to re-encode
  45761. // the codepoint in the encoding that the cmap supports.
  45762. if (this.encoding) {
  45763. var buf = iconv.encode(_String$fromCodePoint(codepoint), this.encoding);
  45764. codepoint = 0;
  45765. for (var i = 0; i < buf.length; i++) {
  45766. codepoint = codepoint << 8 | buf[i];
  45767. }
  45768. // Otherwise, try to get a Unicode variation selector for this codepoint if one is provided.
  45769. } else if (variationSelector) {
  45770. var gid = this.getVariationSelector(codepoint, variationSelector);
  45771. if (gid) {
  45772. return gid;
  45773. }
  45774. }
  45775. var cmap = this.cmap;
  45776. switch (cmap.version) {
  45777. case 0:
  45778. return cmap.codeMap.get(codepoint) || 0;
  45779. case 4:
  45780. {
  45781. var min = 0;
  45782. var max = cmap.segCount - 1;
  45783. while (min <= max) {
  45784. var mid = min + max >> 1;
  45785. if (codepoint < cmap.startCode.get(mid)) {
  45786. max = mid - 1;
  45787. } else if (codepoint > cmap.endCode.get(mid)) {
  45788. min = mid + 1;
  45789. } else {
  45790. var rangeOffset = cmap.idRangeOffset.get(mid);
  45791. var _gid = void 0;
  45792. if (rangeOffset === 0) {
  45793. _gid = codepoint + cmap.idDelta.get(mid);
  45794. } else {
  45795. var index = rangeOffset / 2 + (codepoint - cmap.startCode.get(mid)) - (cmap.segCount - mid);
  45796. _gid = cmap.glyphIndexArray.get(index) || 0;
  45797. if (_gid !== 0) {
  45798. _gid += cmap.idDelta.get(mid);
  45799. }
  45800. }
  45801. return _gid & 0xffff;
  45802. }
  45803. }
  45804. return 0;
  45805. }
  45806. case 8:
  45807. throw new Error('TODO: cmap format 8');
  45808. case 6:
  45809. case 10:
  45810. return cmap.glyphIndices.get(codepoint - cmap.firstCode) || 0;
  45811. case 12:
  45812. case 13:
  45813. {
  45814. var _min = 0;
  45815. var _max = cmap.nGroups - 1;
  45816. while (_min <= _max) {
  45817. var _mid = _min + _max >> 1;
  45818. var group = cmap.groups.get(_mid);
  45819. if (codepoint < group.startCharCode) {
  45820. _max = _mid - 1;
  45821. } else if (codepoint > group.endCharCode) {
  45822. _min = _mid + 1;
  45823. } else {
  45824. if (cmap.version === 12) {
  45825. return group.glyphID + (codepoint - group.startCharCode);
  45826. } else {
  45827. return group.glyphID;
  45828. }
  45829. }
  45830. }
  45831. return 0;
  45832. }
  45833. case 14:
  45834. throw new Error('TODO: cmap format 14');
  45835. default:
  45836. throw new Error('Unknown cmap format ' + cmap.version);
  45837. }
  45838. };
  45839. CmapProcessor.prototype.getVariationSelector = function getVariationSelector(codepoint, variationSelector) {
  45840. if (!this.uvs) {
  45841. return 0;
  45842. }
  45843. var selectors = this.uvs.varSelectors.toArray();
  45844. var i = binarySearch(selectors, function (x) {
  45845. return variationSelector - x.varSelector;
  45846. });
  45847. var sel = selectors[i];
  45848. if (i !== -1 && sel.defaultUVS) {
  45849. i = binarySearch(sel.defaultUVS, function (x) {
  45850. return codepoint < x.startUnicodeValue ? -1 : codepoint > x.startUnicodeValue + x.additionalCount ? +1 : 0;
  45851. });
  45852. }
  45853. if (i !== -1 && sel.nonDefaultUVS) {
  45854. i = binarySearch(sel.nonDefaultUVS, function (x) {
  45855. return codepoint - x.unicodeValue;
  45856. });
  45857. if (i !== -1) {
  45858. return sel.nonDefaultUVS[i].glyphID;
  45859. }
  45860. }
  45861. return 0;
  45862. };
  45863. CmapProcessor.prototype.getCharacterSet = function getCharacterSet() {
  45864. var cmap = this.cmap;
  45865. switch (cmap.version) {
  45866. case 0:
  45867. return range(0, cmap.codeMap.length);
  45868. case 4:
  45869. {
  45870. var res = [];
  45871. var endCodes = cmap.endCode.toArray();
  45872. for (var i = 0; i < endCodes.length; i++) {
  45873. var tail = endCodes[i] + 1;
  45874. var start = cmap.startCode.get(i);
  45875. res.push.apply(res, range(start, tail));
  45876. }
  45877. return res;
  45878. }
  45879. case 8:
  45880. throw new Error('TODO: cmap format 8');
  45881. case 6:
  45882. case 10:
  45883. return range(cmap.firstCode, cmap.firstCode + cmap.glyphIndices.length);
  45884. case 12:
  45885. case 13:
  45886. {
  45887. var _res = [];
  45888. for (var _iterator4 = cmap.groups.toArray(), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  45889. var _ref5;
  45890. if (_isArray4) {
  45891. if (_i4 >= _iterator4.length) break;
  45892. _ref5 = _iterator4[_i4++];
  45893. } else {
  45894. _i4 = _iterator4.next();
  45895. if (_i4.done) break;
  45896. _ref5 = _i4.value;
  45897. }
  45898. var group = _ref5;
  45899. _res.push.apply(_res, range(group.startCharCode, group.endCharCode + 1));
  45900. }
  45901. return _res;
  45902. }
  45903. case 14:
  45904. throw new Error('TODO: cmap format 14');
  45905. default:
  45906. throw new Error('Unknown cmap format ' + cmap.version);
  45907. }
  45908. };
  45909. CmapProcessor.prototype.codePointsForGlyph = function codePointsForGlyph(gid) {
  45910. var cmap = this.cmap;
  45911. switch (cmap.version) {
  45912. case 0:
  45913. {
  45914. var res = [];
  45915. for (var i = 0; i < 256; i++) {
  45916. if (cmap.codeMap.get(i) === gid) {
  45917. res.push(i);
  45918. }
  45919. }
  45920. return res;
  45921. }
  45922. case 4:
  45923. {
  45924. var _res2 = [];
  45925. for (var _i5 = 0; _i5 < cmap.segCount; _i5++) {
  45926. var end = cmap.endCode.get(_i5);
  45927. var start = cmap.startCode.get(_i5);
  45928. var rangeOffset = cmap.idRangeOffset.get(_i5);
  45929. var delta = cmap.idDelta.get(_i5);
  45930. for (var c = start; c <= end; c++) {
  45931. var g = 0;
  45932. if (rangeOffset === 0) {
  45933. g = c + delta;
  45934. } else {
  45935. var index = rangeOffset / 2 + (c - start) - (cmap.segCount - _i5);
  45936. g = cmap.glyphIndexArray.get(index) || 0;
  45937. if (g !== 0) {
  45938. g += delta;
  45939. }
  45940. }
  45941. if (g === gid) {
  45942. _res2.push(c);
  45943. }
  45944. }
  45945. }
  45946. return _res2;
  45947. }
  45948. case 12:
  45949. {
  45950. var _res3 = [];
  45951. for (var _iterator5 = cmap.groups.toArray(), _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
  45952. var _ref6;
  45953. if (_isArray5) {
  45954. if (_i6 >= _iterator5.length) break;
  45955. _ref6 = _iterator5[_i6++];
  45956. } else {
  45957. _i6 = _iterator5.next();
  45958. if (_i6.done) break;
  45959. _ref6 = _i6.value;
  45960. }
  45961. var group = _ref6;
  45962. if (gid >= group.glyphID && gid <= group.glyphID + (group.endCharCode - group.startCharCode)) {
  45963. _res3.push(group.startCharCode + (gid - group.glyphID));
  45964. }
  45965. }
  45966. return _res3;
  45967. }
  45968. case 13:
  45969. {
  45970. var _res4 = [];
  45971. for (var _iterator6 = cmap.groups.toArray(), _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
  45972. var _ref7;
  45973. if (_isArray6) {
  45974. if (_i7 >= _iterator6.length) break;
  45975. _ref7 = _iterator6[_i7++];
  45976. } else {
  45977. _i7 = _iterator6.next();
  45978. if (_i7.done) break;
  45979. _ref7 = _i7.value;
  45980. }
  45981. var _group = _ref7;
  45982. if (gid === _group.glyphID) {
  45983. _res4.push.apply(_res4, range(_group.startCharCode, _group.endCharCode + 1));
  45984. }
  45985. }
  45986. return _res4;
  45987. }
  45988. default:
  45989. throw new Error('Unknown cmap format ' + cmap.version);
  45990. }
  45991. };
  45992. return CmapProcessor;
  45993. }(), (_applyDecoratedDescriptor$1(_class$1.prototype, 'getCharacterSet', [cache], _Object$getOwnPropertyDescriptor(_class$1.prototype, 'getCharacterSet'), _class$1.prototype), _applyDecoratedDescriptor$1(_class$1.prototype, 'codePointsForGlyph', [cache], _Object$getOwnPropertyDescriptor(_class$1.prototype, 'codePointsForGlyph'), _class$1.prototype)), _class$1);
  45994. var KernProcessor = function () {
  45995. function KernProcessor(font) {
  45996. _classCallCheck(this, KernProcessor);
  45997. this.kern = font.kern;
  45998. }
  45999. KernProcessor.prototype.process = function process(glyphs, positions) {
  46000. for (var glyphIndex = 0; glyphIndex < glyphs.length - 1; glyphIndex++) {
  46001. var left = glyphs[glyphIndex].id;
  46002. var right = glyphs[glyphIndex + 1].id;
  46003. positions[glyphIndex].xAdvance += this.getKerning(left, right);
  46004. }
  46005. };
  46006. KernProcessor.prototype.getKerning = function getKerning(left, right) {
  46007. var res = 0;
  46008. for (var _iterator = this.kern.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  46009. var _ref;
  46010. if (_isArray) {
  46011. if (_i >= _iterator.length) break;
  46012. _ref = _iterator[_i++];
  46013. } else {
  46014. _i = _iterator.next();
  46015. if (_i.done) break;
  46016. _ref = _i.value;
  46017. }
  46018. var table = _ref;
  46019. if (table.coverage.crossStream) {
  46020. continue;
  46021. }
  46022. switch (table.version) {
  46023. case 0:
  46024. if (!table.coverage.horizontal) {
  46025. continue;
  46026. }
  46027. break;
  46028. case 1:
  46029. if (table.coverage.vertical || table.coverage.variation) {
  46030. continue;
  46031. }
  46032. break;
  46033. default:
  46034. throw new Error('Unsupported kerning table version ' + table.version);
  46035. }
  46036. var val = 0;
  46037. var s = table.subtable;
  46038. switch (table.format) {
  46039. case 0:
  46040. var pairIdx = binarySearch(s.pairs, function (pair) {
  46041. return left - pair.left || right - pair.right;
  46042. });
  46043. if (pairIdx >= 0) {
  46044. val = s.pairs[pairIdx].value;
  46045. }
  46046. break;
  46047. case 2:
  46048. var leftOffset = 0,
  46049. rightOffset = 0;
  46050. if (left >= s.leftTable.firstGlyph && left < s.leftTable.firstGlyph + s.leftTable.nGlyphs) {
  46051. leftOffset = s.leftTable.offsets[left - s.leftTable.firstGlyph];
  46052. } else {
  46053. leftOffset = s.array.off;
  46054. }
  46055. if (right >= s.rightTable.firstGlyph && right < s.rightTable.firstGlyph + s.rightTable.nGlyphs) {
  46056. rightOffset = s.rightTable.offsets[right - s.rightTable.firstGlyph];
  46057. }
  46058. var index = (leftOffset + rightOffset - s.array.off) / 2;
  46059. val = s.array.values.get(index);
  46060. break;
  46061. case 3:
  46062. if (left >= s.glyphCount || right >= s.glyphCount) {
  46063. return 0;
  46064. }
  46065. val = s.kernValue[s.kernIndex[s.leftClass[left] * s.rightClassCount + s.rightClass[right]]];
  46066. break;
  46067. default:
  46068. throw new Error('Unsupported kerning sub-table format ' + table.format);
  46069. }
  46070. // Microsoft supports the override flag, which resets the result
  46071. // Otherwise, the sum of the results from all subtables is returned
  46072. if (table.coverage.override) {
  46073. res = val;
  46074. } else {
  46075. res += val;
  46076. }
  46077. }
  46078. return res;
  46079. };
  46080. return KernProcessor;
  46081. }();
  46082. /**
  46083. * This class is used when GPOS does not define 'mark' or 'mkmk' features
  46084. * for positioning marks relative to base glyphs. It uses the unicode
  46085. * combining class property to position marks.
  46086. *
  46087. * Based on code from Harfbuzz, thanks!
  46088. * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-fallback.cc
  46089. */
  46090. var UnicodeLayoutEngine = function () {
  46091. function UnicodeLayoutEngine(font) {
  46092. _classCallCheck(this, UnicodeLayoutEngine);
  46093. this.font = font;
  46094. }
  46095. UnicodeLayoutEngine.prototype.positionGlyphs = function positionGlyphs(glyphs, positions) {
  46096. // find each base + mark cluster, and position the marks relative to the base
  46097. var clusterStart = 0;
  46098. var clusterEnd = 0;
  46099. for (var index = 0; index < glyphs.length; index++) {
  46100. var glyph = glyphs[index];
  46101. if (glyph.isMark) {
  46102. // TODO: handle ligatures
  46103. clusterEnd = index;
  46104. } else {
  46105. if (clusterStart !== clusterEnd) {
  46106. this.positionCluster(glyphs, positions, clusterStart, clusterEnd);
  46107. }
  46108. clusterStart = clusterEnd = index;
  46109. }
  46110. }
  46111. if (clusterStart !== clusterEnd) {
  46112. this.positionCluster(glyphs, positions, clusterStart, clusterEnd);
  46113. }
  46114. return positions;
  46115. };
  46116. UnicodeLayoutEngine.prototype.positionCluster = function positionCluster(glyphs, positions, clusterStart, clusterEnd) {
  46117. var base = glyphs[clusterStart];
  46118. var baseBox = base.cbox.copy();
  46119. // adjust bounding box for ligature glyphs
  46120. if (base.codePoints.length > 1) {
  46121. // LTR. TODO: RTL support.
  46122. baseBox.minX += (base.codePoints.length - 1) * baseBox.width / base.codePoints.length;
  46123. }
  46124. var xOffset = -positions[clusterStart].xAdvance;
  46125. var yOffset = 0;
  46126. var yGap = this.font.unitsPerEm / 16;
  46127. // position each of the mark glyphs relative to the base glyph
  46128. for (var index = clusterStart + 1; index <= clusterEnd; index++) {
  46129. var mark = glyphs[index];
  46130. var markBox = mark.cbox;
  46131. var position = positions[index];
  46132. var combiningClass = this.getCombiningClass(mark.codePoints[0]);
  46133. if (combiningClass !== 'Not_Reordered') {
  46134. position.xOffset = position.yOffset = 0;
  46135. // x positioning
  46136. switch (combiningClass) {
  46137. case 'Double_Above':
  46138. case 'Double_Below':
  46139. // LTR. TODO: RTL support.
  46140. position.xOffset += baseBox.minX - markBox.width / 2 - markBox.minX;
  46141. break;
  46142. case 'Attached_Below_Left':
  46143. case 'Below_Left':
  46144. case 'Above_Left':
  46145. // left align
  46146. position.xOffset += baseBox.minX - markBox.minX;
  46147. break;
  46148. case 'Attached_Above_Right':
  46149. case 'Below_Right':
  46150. case 'Above_Right':
  46151. // right align
  46152. position.xOffset += baseBox.maxX - markBox.width - markBox.minX;
  46153. break;
  46154. default:
  46155. // Attached_Below, Attached_Above, Below, Above, other
  46156. // center align
  46157. position.xOffset += baseBox.minX + (baseBox.width - markBox.width) / 2 - markBox.minX;
  46158. }
  46159. // y positioning
  46160. switch (combiningClass) {
  46161. case 'Double_Below':
  46162. case 'Below_Left':
  46163. case 'Below':
  46164. case 'Below_Right':
  46165. case 'Attached_Below_Left':
  46166. case 'Attached_Below':
  46167. // add a small gap between the glyphs if they are not attached
  46168. if (combiningClass === 'Attached_Below_Left' || combiningClass === 'Attached_Below') {
  46169. baseBox.minY += yGap;
  46170. }
  46171. position.yOffset = -baseBox.minY - markBox.maxY;
  46172. baseBox.minY += markBox.height;
  46173. break;
  46174. case 'Double_Above':
  46175. case 'Above_Left':
  46176. case 'Above':
  46177. case 'Above_Right':
  46178. case 'Attached_Above':
  46179. case 'Attached_Above_Right':
  46180. // add a small gap between the glyphs if they are not attached
  46181. if (combiningClass === 'Attached_Above' || combiningClass === 'Attached_Above_Right') {
  46182. baseBox.maxY += yGap;
  46183. }
  46184. position.yOffset = baseBox.maxY - markBox.minY;
  46185. baseBox.maxY += markBox.height;
  46186. break;
  46187. }
  46188. position.xAdvance = position.yAdvance = 0;
  46189. position.xOffset += xOffset;
  46190. position.yOffset += yOffset;
  46191. } else {
  46192. xOffset -= position.xAdvance;
  46193. yOffset -= position.yAdvance;
  46194. }
  46195. }
  46196. return;
  46197. };
  46198. UnicodeLayoutEngine.prototype.getCombiningClass = function getCombiningClass(codePoint) {
  46199. var combiningClass = unicode.getCombiningClass(codePoint);
  46200. // Thai / Lao need some per-character work
  46201. if ((codePoint & ~0xff) === 0x0e00) {
  46202. if (combiningClass === 'Not_Reordered') {
  46203. switch (codePoint) {
  46204. case 0x0e31:
  46205. case 0x0e34:
  46206. case 0x0e35:
  46207. case 0x0e36:
  46208. case 0x0e37:
  46209. case 0x0e47:
  46210. case 0x0e4c:
  46211. case 0x0e3d:
  46212. case 0x0e4e:
  46213. return 'Above_Right';
  46214. case 0x0eb1:
  46215. case 0x0eb4:
  46216. case 0x0eb5:
  46217. case 0x0eb6:
  46218. case 0x0eb7:
  46219. case 0x0ebb:
  46220. case 0x0ecc:
  46221. case 0x0ecd:
  46222. return 'Above';
  46223. case 0x0ebc:
  46224. return 'Below';
  46225. }
  46226. } else if (codePoint === 0x0e3a) {
  46227. // virama
  46228. return 'Below_Right';
  46229. }
  46230. }
  46231. switch (combiningClass) {
  46232. // Hebrew
  46233. case 'CCC10': // sheva
  46234. case 'CCC11': // hataf segol
  46235. case 'CCC12': // hataf patah
  46236. case 'CCC13': // hataf qamats
  46237. case 'CCC14': // hiriq
  46238. case 'CCC15': // tsere
  46239. case 'CCC16': // segol
  46240. case 'CCC17': // patah
  46241. case 'CCC18': // qamats
  46242. case 'CCC20': // qubuts
  46243. case 'CCC22':
  46244. // meteg
  46245. return 'Below';
  46246. case 'CCC23':
  46247. // rafe
  46248. return 'Attached_Above';
  46249. case 'CCC24':
  46250. // shin dot
  46251. return 'Above_Right';
  46252. case 'CCC25': // sin dot
  46253. case 'CCC19':
  46254. // holam
  46255. return 'Above_Left';
  46256. case 'CCC26':
  46257. // point varika
  46258. return 'Above';
  46259. case 'CCC21':
  46260. // dagesh
  46261. break;
  46262. // Arabic and Syriac
  46263. case 'CCC27': // fathatan
  46264. case 'CCC28': // dammatan
  46265. case 'CCC30': // fatha
  46266. case 'CCC31': // damma
  46267. case 'CCC33': // shadda
  46268. case 'CCC34': // sukun
  46269. case 'CCC35': // superscript alef
  46270. case 'CCC36':
  46271. // superscript alaph
  46272. return 'Above';
  46273. case 'CCC29': // kasratan
  46274. case 'CCC32':
  46275. // kasra
  46276. return 'Below';
  46277. // Thai
  46278. case 'CCC103':
  46279. // sara u / sara uu
  46280. return 'Below_Right';
  46281. case 'CCC107':
  46282. // mai
  46283. return 'Above_Right';
  46284. // Lao
  46285. case 'CCC118':
  46286. // sign u / sign uu
  46287. return 'Below';
  46288. case 'CCC122':
  46289. // mai
  46290. return 'Above';
  46291. // Tibetan
  46292. case 'CCC129': // sign aa
  46293. case 'CCC132':
  46294. // sign u
  46295. return 'Below';
  46296. case 'CCC130':
  46297. // sign i
  46298. return 'Above';
  46299. }
  46300. return combiningClass;
  46301. };
  46302. return UnicodeLayoutEngine;
  46303. }();
  46304. /**
  46305. * Represents a glyph bounding box
  46306. */
  46307. var BBox = function () {
  46308. function BBox() {
  46309. var minX = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
  46310. var minY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
  46311. var maxX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -Infinity;
  46312. var maxY = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -Infinity;
  46313. _classCallCheck(this, BBox);
  46314. /**
  46315. * The minimum X position in the bounding box
  46316. * @type {number}
  46317. */
  46318. this.minX = minX;
  46319. /**
  46320. * The minimum Y position in the bounding box
  46321. * @type {number}
  46322. */
  46323. this.minY = minY;
  46324. /**
  46325. * The maxmimum X position in the bounding box
  46326. * @type {number}
  46327. */
  46328. this.maxX = maxX;
  46329. /**
  46330. * The maxmimum Y position in the bounding box
  46331. * @type {number}
  46332. */
  46333. this.maxY = maxY;
  46334. }
  46335. /**
  46336. * The width of the bounding box
  46337. * @type {number}
  46338. */
  46339. BBox.prototype.addPoint = function addPoint(x, y) {
  46340. if (Math.abs(x) !== Infinity) {
  46341. if (x < this.minX) {
  46342. this.minX = x;
  46343. }
  46344. if (x > this.maxX) {
  46345. this.maxX = x;
  46346. }
  46347. }
  46348. if (Math.abs(y) !== Infinity) {
  46349. if (y < this.minY) {
  46350. this.minY = y;
  46351. }
  46352. if (y > this.maxY) {
  46353. this.maxY = y;
  46354. }
  46355. }
  46356. };
  46357. BBox.prototype.copy = function copy() {
  46358. return new BBox(this.minX, this.minY, this.maxX, this.maxY);
  46359. };
  46360. _createClass(BBox, [{
  46361. key: "width",
  46362. get: function get() {
  46363. return this.maxX - this.minX;
  46364. }
  46365. /**
  46366. * The height of the bounding box
  46367. * @type {number}
  46368. */
  46369. }, {
  46370. key: "height",
  46371. get: function get() {
  46372. return this.maxY - this.minY;
  46373. }
  46374. }]);
  46375. return BBox;
  46376. }();
  46377. // This maps the Unicode Script property to an OpenType script tag
  46378. // Data from http://www.microsoft.com/typography/otspec/scripttags.htm
  46379. // and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt.
  46380. var UNICODE_SCRIPTS = {
  46381. Caucasian_Albanian: 'aghb',
  46382. Arabic: 'arab',
  46383. Imperial_Aramaic: 'armi',
  46384. Armenian: 'armn',
  46385. Avestan: 'avst',
  46386. Balinese: 'bali',
  46387. Bamum: 'bamu',
  46388. Bassa_Vah: 'bass',
  46389. Batak: 'batk',
  46390. Bengali: ['bng2', 'beng'],
  46391. Bopomofo: 'bopo',
  46392. Brahmi: 'brah',
  46393. Braille: 'brai',
  46394. Buginese: 'bugi',
  46395. Buhid: 'buhd',
  46396. Chakma: 'cakm',
  46397. Canadian_Aboriginal: 'cans',
  46398. Carian: 'cari',
  46399. Cham: 'cham',
  46400. Cherokee: 'cher',
  46401. Coptic: 'copt',
  46402. Cypriot: 'cprt',
  46403. Cyrillic: 'cyrl',
  46404. Devanagari: ['dev2', 'deva'],
  46405. Deseret: 'dsrt',
  46406. Duployan: 'dupl',
  46407. Egyptian_Hieroglyphs: 'egyp',
  46408. Elbasan: 'elba',
  46409. Ethiopic: 'ethi',
  46410. Georgian: 'geor',
  46411. Glagolitic: 'glag',
  46412. Gothic: 'goth',
  46413. Grantha: 'gran',
  46414. Greek: 'grek',
  46415. Gujarati: ['gjr2', 'gujr'],
  46416. Gurmukhi: ['gur2', 'guru'],
  46417. Hangul: 'hang',
  46418. Han: 'hani',
  46419. Hanunoo: 'hano',
  46420. Hebrew: 'hebr',
  46421. Hiragana: 'hira',
  46422. Pahawh_Hmong: 'hmng',
  46423. Katakana_Or_Hiragana: 'hrkt',
  46424. Old_Italic: 'ital',
  46425. Javanese: 'java',
  46426. Kayah_Li: 'kali',
  46427. Katakana: 'kana',
  46428. Kharoshthi: 'khar',
  46429. Khmer: 'khmr',
  46430. Khojki: 'khoj',
  46431. Kannada: ['knd2', 'knda'],
  46432. Kaithi: 'kthi',
  46433. Tai_Tham: 'lana',
  46434. Lao: 'lao ',
  46435. Latin: 'latn',
  46436. Lepcha: 'lepc',
  46437. Limbu: 'limb',
  46438. Linear_A: 'lina',
  46439. Linear_B: 'linb',
  46440. Lisu: 'lisu',
  46441. Lycian: 'lyci',
  46442. Lydian: 'lydi',
  46443. Mahajani: 'mahj',
  46444. Mandaic: 'mand',
  46445. Manichaean: 'mani',
  46446. Mende_Kikakui: 'mend',
  46447. Meroitic_Cursive: 'merc',
  46448. Meroitic_Hieroglyphs: 'mero',
  46449. Malayalam: ['mlm2', 'mlym'],
  46450. Modi: 'modi',
  46451. Mongolian: 'mong',
  46452. Mro: 'mroo',
  46453. Meetei_Mayek: 'mtei',
  46454. Myanmar: ['mym2', 'mymr'],
  46455. Old_North_Arabian: 'narb',
  46456. Nabataean: 'nbat',
  46457. Nko: 'nko ',
  46458. Ogham: 'ogam',
  46459. Ol_Chiki: 'olck',
  46460. Old_Turkic: 'orkh',
  46461. Oriya: ['ory2', 'orya'],
  46462. Osmanya: 'osma',
  46463. Palmyrene: 'palm',
  46464. Pau_Cin_Hau: 'pauc',
  46465. Old_Permic: 'perm',
  46466. Phags_Pa: 'phag',
  46467. Inscriptional_Pahlavi: 'phli',
  46468. Psalter_Pahlavi: 'phlp',
  46469. Phoenician: 'phnx',
  46470. Miao: 'plrd',
  46471. Inscriptional_Parthian: 'prti',
  46472. Rejang: 'rjng',
  46473. Runic: 'runr',
  46474. Samaritan: 'samr',
  46475. Old_South_Arabian: 'sarb',
  46476. Saurashtra: 'saur',
  46477. Shavian: 'shaw',
  46478. Sharada: 'shrd',
  46479. Siddham: 'sidd',
  46480. Khudawadi: 'sind',
  46481. Sinhala: 'sinh',
  46482. Sora_Sompeng: 'sora',
  46483. Sundanese: 'sund',
  46484. Syloti_Nagri: 'sylo',
  46485. Syriac: 'syrc',
  46486. Tagbanwa: 'tagb',
  46487. Takri: 'takr',
  46488. Tai_Le: 'tale',
  46489. New_Tai_Lue: 'talu',
  46490. Tamil: ['tml2', 'taml'],
  46491. Tai_Viet: 'tavt',
  46492. Telugu: ['tel2', 'telu'],
  46493. Tifinagh: 'tfng',
  46494. Tagalog: 'tglg',
  46495. Thaana: 'thaa',
  46496. Thai: 'thai',
  46497. Tibetan: 'tibt',
  46498. Tirhuta: 'tirh',
  46499. Ugaritic: 'ugar',
  46500. Vai: 'vai ',
  46501. Warang_Citi: 'wara',
  46502. Old_Persian: 'xpeo',
  46503. Cuneiform: 'xsux',
  46504. Yi: 'yi ',
  46505. Inherited: 'zinh',
  46506. Common: 'zyyy',
  46507. Unknown: 'zzzz'
  46508. };
  46509. var OPENTYPE_SCRIPTS = {};
  46510. for (var script in UNICODE_SCRIPTS) {
  46511. var tag = UNICODE_SCRIPTS[script];
  46512. if (Array.isArray(tag)) {
  46513. for (var _iterator = tag, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  46514. var _ref;
  46515. if (_isArray) {
  46516. if (_i >= _iterator.length) break;
  46517. _ref = _iterator[_i++];
  46518. } else {
  46519. _i = _iterator.next();
  46520. if (_i.done) break;
  46521. _ref = _i.value;
  46522. }
  46523. var t = _ref;
  46524. OPENTYPE_SCRIPTS[t] = script;
  46525. }
  46526. } else {
  46527. OPENTYPE_SCRIPTS[tag] = script;
  46528. }
  46529. }
  46530. function fromOpenType(tag) {
  46531. return OPENTYPE_SCRIPTS[tag];
  46532. }
  46533. function forString(string) {
  46534. var len = string.length;
  46535. var idx = 0;
  46536. while (idx < len) {
  46537. var code = string.charCodeAt(idx++);
  46538. // Check if this is a high surrogate
  46539. if (0xd800 <= code && code <= 0xdbff && idx < len) {
  46540. var next = string.charCodeAt(idx);
  46541. // Check if this is a low surrogate
  46542. if (0xdc00 <= next && next <= 0xdfff) {
  46543. idx++;
  46544. code = ((code & 0x3FF) << 10) + (next & 0x3FF) + 0x10000;
  46545. }
  46546. }
  46547. var _script = unicode.getScript(code);
  46548. if (_script !== 'Common' && _script !== 'Inherited' && _script !== 'Unknown') {
  46549. return UNICODE_SCRIPTS[_script];
  46550. }
  46551. }
  46552. return UNICODE_SCRIPTS.Unknown;
  46553. }
  46554. function forCodePoints(codePoints) {
  46555. for (var i = 0; i < codePoints.length; i++) {
  46556. var codePoint = codePoints[i];
  46557. var _script2 = unicode.getScript(codePoint);
  46558. if (_script2 !== 'Common' && _script2 !== 'Inherited' && _script2 !== 'Unknown') {
  46559. return UNICODE_SCRIPTS[_script2];
  46560. }
  46561. }
  46562. return UNICODE_SCRIPTS.Unknown;
  46563. }
  46564. // The scripts in this map are written from right to left
  46565. var RTL = {
  46566. arab: true, // Arabic
  46567. hebr: true, // Hebrew
  46568. syrc: true, // Syriac
  46569. thaa: true, // Thaana
  46570. cprt: true, // Cypriot Syllabary
  46571. khar: true, // Kharosthi
  46572. phnx: true, // Phoenician
  46573. 'nko ': true, // N'Ko
  46574. lydi: true, // Lydian
  46575. avst: true, // Avestan
  46576. armi: true, // Imperial Aramaic
  46577. phli: true, // Inscriptional Pahlavi
  46578. prti: true, // Inscriptional Parthian
  46579. sarb: true, // Old South Arabian
  46580. orkh: true, // Old Turkic, Orkhon Runic
  46581. samr: true, // Samaritan
  46582. mand: true, // Mandaic, Mandaean
  46583. merc: true, // Meroitic Cursive
  46584. mero: true, // Meroitic Hieroglyphs
  46585. // Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm)
  46586. mani: true, // Manichaean
  46587. mend: true, // Mende Kikakui
  46588. nbat: true, // Nabataean
  46589. narb: true, // Old North Arabian
  46590. palm: true, // Palmyrene
  46591. phlp: true // Psalter Pahlavi
  46592. };
  46593. function direction(script) {
  46594. if (RTL[script]) {
  46595. return 'rtl';
  46596. }
  46597. return 'ltr';
  46598. }
  46599. /**
  46600. * Represents a run of Glyph and GlyphPosition objects.
  46601. * Returned by the font layout method.
  46602. */
  46603. var GlyphRun = function () {
  46604. function GlyphRun(glyphs, features, script, language, direction$$) {
  46605. _classCallCheck(this, GlyphRun);
  46606. /**
  46607. * An array of Glyph objects in the run
  46608. * @type {Glyph[]}
  46609. */
  46610. this.glyphs = glyphs;
  46611. /**
  46612. * An array of GlyphPosition objects for each glyph in the run
  46613. * @type {GlyphPosition[]}
  46614. */
  46615. this.positions = null;
  46616. /**
  46617. * The script that was requested for shaping. This was either passed in or detected automatically.
  46618. * @type {string}
  46619. */
  46620. this.script = script;
  46621. /**
  46622. * The language requested for shaping, as passed in. If `null`, the default language for the
  46623. * script was used.
  46624. * @type {string}
  46625. */
  46626. this.language = language || null;
  46627. /**
  46628. * The direction requested for shaping, as passed in (either ltr or rtl).
  46629. * If `null`, the default direction of the script is used.
  46630. * @type {string}
  46631. */
  46632. this.direction = direction$$ || direction(script);
  46633. /**
  46634. * The features requested during shaping. This is a combination of user
  46635. * specified features and features chosen by the shaper.
  46636. * @type {object}
  46637. */
  46638. this.features = {};
  46639. // Convert features to an object
  46640. if (Array.isArray(features)) {
  46641. for (var _iterator = features, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  46642. var _ref;
  46643. if (_isArray) {
  46644. if (_i >= _iterator.length) break;
  46645. _ref = _iterator[_i++];
  46646. } else {
  46647. _i = _iterator.next();
  46648. if (_i.done) break;
  46649. _ref = _i.value;
  46650. }
  46651. var tag = _ref;
  46652. this.features[tag] = true;
  46653. }
  46654. } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
  46655. this.features = features;
  46656. }
  46657. }
  46658. /**
  46659. * The total advance width of the run.
  46660. * @type {number}
  46661. */
  46662. _createClass(GlyphRun, [{
  46663. key: 'advanceWidth',
  46664. get: function get() {
  46665. var width = 0;
  46666. for (var _iterator2 = this.positions, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  46667. var _ref2;
  46668. if (_isArray2) {
  46669. if (_i2 >= _iterator2.length) break;
  46670. _ref2 = _iterator2[_i2++];
  46671. } else {
  46672. _i2 = _iterator2.next();
  46673. if (_i2.done) break;
  46674. _ref2 = _i2.value;
  46675. }
  46676. var position = _ref2;
  46677. width += position.xAdvance;
  46678. }
  46679. return width;
  46680. }
  46681. /**
  46682. * The total advance height of the run.
  46683. * @type {number}
  46684. */
  46685. }, {
  46686. key: 'advanceHeight',
  46687. get: function get() {
  46688. var height = 0;
  46689. for (var _iterator3 = this.positions, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  46690. var _ref3;
  46691. if (_isArray3) {
  46692. if (_i3 >= _iterator3.length) break;
  46693. _ref3 = _iterator3[_i3++];
  46694. } else {
  46695. _i3 = _iterator3.next();
  46696. if (_i3.done) break;
  46697. _ref3 = _i3.value;
  46698. }
  46699. var position = _ref3;
  46700. height += position.yAdvance;
  46701. }
  46702. return height;
  46703. }
  46704. /**
  46705. * The bounding box containing all glyphs in the run.
  46706. * @type {BBox}
  46707. */
  46708. }, {
  46709. key: 'bbox',
  46710. get: function get() {
  46711. var bbox = new BBox();
  46712. var x = 0;
  46713. var y = 0;
  46714. for (var index = 0; index < this.glyphs.length; index++) {
  46715. var glyph = this.glyphs[index];
  46716. var p = this.positions[index];
  46717. var b = glyph.bbox;
  46718. bbox.addPoint(b.minX + x + p.xOffset, b.minY + y + p.yOffset);
  46719. bbox.addPoint(b.maxX + x + p.xOffset, b.maxY + y + p.yOffset);
  46720. x += p.xAdvance;
  46721. y += p.yAdvance;
  46722. }
  46723. return bbox;
  46724. }
  46725. }]);
  46726. return GlyphRun;
  46727. }();
  46728. /**
  46729. * Represents positioning information for a glyph in a GlyphRun.
  46730. */
  46731. var GlyphPosition = function GlyphPosition() {
  46732. var xAdvance = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  46733. var yAdvance = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  46734. var xOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  46735. var yOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  46736. _classCallCheck(this, GlyphPosition);
  46737. /**
  46738. * The amount to move the virtual pen in the X direction after rendering this glyph.
  46739. * @type {number}
  46740. */
  46741. this.xAdvance = xAdvance;
  46742. /**
  46743. * The amount to move the virtual pen in the Y direction after rendering this glyph.
  46744. * @type {number}
  46745. */
  46746. this.yAdvance = yAdvance;
  46747. /**
  46748. * The offset from the pen position in the X direction at which to render this glyph.
  46749. * @type {number}
  46750. */
  46751. this.xOffset = xOffset;
  46752. /**
  46753. * The offset from the pen position in the Y direction at which to render this glyph.
  46754. * @type {number}
  46755. */
  46756. this.yOffset = yOffset;
  46757. };
  46758. // see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html
  46759. // and /System/Library/Frameworks/CoreText.framework/Versions/A/Headers/SFNTLayoutTypes.h on a Mac
  46760. var features = {
  46761. allTypographicFeatures: {
  46762. code: 0,
  46763. exclusive: false,
  46764. allTypeFeatures: 0
  46765. },
  46766. ligatures: {
  46767. code: 1,
  46768. exclusive: false,
  46769. requiredLigatures: 0,
  46770. commonLigatures: 2,
  46771. rareLigatures: 4,
  46772. // logos: 6
  46773. rebusPictures: 8,
  46774. diphthongLigatures: 10,
  46775. squaredLigatures: 12,
  46776. abbrevSquaredLigatures: 14,
  46777. symbolLigatures: 16,
  46778. contextualLigatures: 18,
  46779. historicalLigatures: 20
  46780. },
  46781. cursiveConnection: {
  46782. code: 2,
  46783. exclusive: true,
  46784. unconnected: 0,
  46785. partiallyConnected: 1,
  46786. cursive: 2
  46787. },
  46788. letterCase: {
  46789. code: 3,
  46790. exclusive: true
  46791. },
  46792. // upperAndLowerCase: 0 # deprecated
  46793. // allCaps: 1 # deprecated
  46794. // allLowerCase: 2 # deprecated
  46795. // smallCaps: 3 # deprecated
  46796. // initialCaps: 4 # deprecated
  46797. // initialCapsAndSmallCaps: 5 # deprecated
  46798. verticalSubstitution: {
  46799. code: 4,
  46800. exclusive: false,
  46801. substituteVerticalForms: 0
  46802. },
  46803. linguisticRearrangement: {
  46804. code: 5,
  46805. exclusive: false,
  46806. linguisticRearrangement: 0
  46807. },
  46808. numberSpacing: {
  46809. code: 6,
  46810. exclusive: true,
  46811. monospacedNumbers: 0,
  46812. proportionalNumbers: 1,
  46813. thirdWidthNumbers: 2,
  46814. quarterWidthNumbers: 3
  46815. },
  46816. smartSwash: {
  46817. code: 8,
  46818. exclusive: false,
  46819. wordInitialSwashes: 0,
  46820. wordFinalSwashes: 2,
  46821. // lineInitialSwashes: 4
  46822. // lineFinalSwashes: 6
  46823. nonFinalSwashes: 8
  46824. },
  46825. diacritics: {
  46826. code: 9,
  46827. exclusive: true,
  46828. showDiacritics: 0,
  46829. hideDiacritics: 1,
  46830. decomposeDiacritics: 2
  46831. },
  46832. verticalPosition: {
  46833. code: 10,
  46834. exclusive: true,
  46835. normalPosition: 0,
  46836. superiors: 1,
  46837. inferiors: 2,
  46838. ordinals: 3,
  46839. scientificInferiors: 4
  46840. },
  46841. fractions: {
  46842. code: 11,
  46843. exclusive: true,
  46844. noFractions: 0,
  46845. verticalFractions: 1,
  46846. diagonalFractions: 2
  46847. },
  46848. overlappingCharacters: {
  46849. code: 13,
  46850. exclusive: false,
  46851. preventOverlap: 0
  46852. },
  46853. typographicExtras: {
  46854. code: 14,
  46855. exclusive: false,
  46856. // hyphensToEmDash: 0
  46857. // hyphenToEnDash: 2
  46858. slashedZero: 4
  46859. },
  46860. // formInterrobang: 6
  46861. // smartQuotes: 8
  46862. // periodsToEllipsis: 10
  46863. mathematicalExtras: {
  46864. code: 15,
  46865. exclusive: false,
  46866. // hyphenToMinus: 0
  46867. // asteristoMultiply: 2
  46868. // slashToDivide: 4
  46869. // inequalityLigatures: 6
  46870. // exponents: 8
  46871. mathematicalGreek: 10
  46872. },
  46873. ornamentSets: {
  46874. code: 16,
  46875. exclusive: true,
  46876. noOrnaments: 0,
  46877. dingbats: 1,
  46878. piCharacters: 2,
  46879. fleurons: 3,
  46880. decorativeBorders: 4,
  46881. internationalSymbols: 5,
  46882. mathSymbols: 6
  46883. },
  46884. characterAlternatives: {
  46885. code: 17,
  46886. exclusive: true,
  46887. noAlternates: 0
  46888. },
  46889. // user defined options
  46890. designComplexity: {
  46891. code: 18,
  46892. exclusive: true,
  46893. designLevel1: 0,
  46894. designLevel2: 1,
  46895. designLevel3: 2,
  46896. designLevel4: 3,
  46897. designLevel5: 4
  46898. },
  46899. styleOptions: {
  46900. code: 19,
  46901. exclusive: true,
  46902. noStyleOptions: 0,
  46903. displayText: 1,
  46904. engravedText: 2,
  46905. illuminatedCaps: 3,
  46906. titlingCaps: 4,
  46907. tallCaps: 5
  46908. },
  46909. characterShape: {
  46910. code: 20,
  46911. exclusive: true,
  46912. traditionalCharacters: 0,
  46913. simplifiedCharacters: 1,
  46914. JIS1978Characters: 2,
  46915. JIS1983Characters: 3,
  46916. JIS1990Characters: 4,
  46917. traditionalAltOne: 5,
  46918. traditionalAltTwo: 6,
  46919. traditionalAltThree: 7,
  46920. traditionalAltFour: 8,
  46921. traditionalAltFive: 9,
  46922. expertCharacters: 10,
  46923. JIS2004Characters: 11,
  46924. hojoCharacters: 12,
  46925. NLCCharacters: 13,
  46926. traditionalNamesCharacters: 14
  46927. },
  46928. numberCase: {
  46929. code: 21,
  46930. exclusive: true,
  46931. lowerCaseNumbers: 0,
  46932. upperCaseNumbers: 1
  46933. },
  46934. textSpacing: {
  46935. code: 22,
  46936. exclusive: true,
  46937. proportionalText: 0,
  46938. monospacedText: 1,
  46939. halfWidthText: 2,
  46940. thirdWidthText: 3,
  46941. quarterWidthText: 4,
  46942. altProportionalText: 5,
  46943. altHalfWidthText: 6
  46944. },
  46945. transliteration: {
  46946. code: 23,
  46947. exclusive: true,
  46948. noTransliteration: 0
  46949. },
  46950. // hanjaToHangul: 1
  46951. // hiraganaToKatakana: 2
  46952. // katakanaToHiragana: 3
  46953. // kanaToRomanization: 4
  46954. // romanizationToHiragana: 5
  46955. // romanizationToKatakana: 6
  46956. // hanjaToHangulAltOne: 7
  46957. // hanjaToHangulAltTwo: 8
  46958. // hanjaToHangulAltThree: 9
  46959. annotation: {
  46960. code: 24,
  46961. exclusive: true,
  46962. noAnnotation: 0,
  46963. boxAnnotation: 1,
  46964. roundedBoxAnnotation: 2,
  46965. circleAnnotation: 3,
  46966. invertedCircleAnnotation: 4,
  46967. parenthesisAnnotation: 5,
  46968. periodAnnotation: 6,
  46969. romanNumeralAnnotation: 7,
  46970. diamondAnnotation: 8,
  46971. invertedBoxAnnotation: 9,
  46972. invertedRoundedBoxAnnotation: 10
  46973. },
  46974. kanaSpacing: {
  46975. code: 25,
  46976. exclusive: true,
  46977. fullWidthKana: 0,
  46978. proportionalKana: 1
  46979. },
  46980. ideographicSpacing: {
  46981. code: 26,
  46982. exclusive: true,
  46983. fullWidthIdeographs: 0,
  46984. proportionalIdeographs: 1,
  46985. halfWidthIdeographs: 2
  46986. },
  46987. unicodeDecomposition: {
  46988. code: 27,
  46989. exclusive: false,
  46990. canonicalComposition: 0,
  46991. compatibilityComposition: 2,
  46992. transcodingComposition: 4
  46993. },
  46994. rubyKana: {
  46995. code: 28,
  46996. exclusive: false,
  46997. // noRubyKana: 0 # deprecated - use rubyKanaOff instead
  46998. // rubyKana: 1 # deprecated - use rubyKanaOn instead
  46999. rubyKana: 2
  47000. },
  47001. CJKSymbolAlternatives: {
  47002. code: 29,
  47003. exclusive: true,
  47004. noCJKSymbolAlternatives: 0,
  47005. CJKSymbolAltOne: 1,
  47006. CJKSymbolAltTwo: 2,
  47007. CJKSymbolAltThree: 3,
  47008. CJKSymbolAltFour: 4,
  47009. CJKSymbolAltFive: 5
  47010. },
  47011. ideographicAlternatives: {
  47012. code: 30,
  47013. exclusive: true,
  47014. noIdeographicAlternatives: 0,
  47015. ideographicAltOne: 1,
  47016. ideographicAltTwo: 2,
  47017. ideographicAltThree: 3,
  47018. ideographicAltFour: 4,
  47019. ideographicAltFive: 5
  47020. },
  47021. CJKVerticalRomanPlacement: {
  47022. code: 31,
  47023. exclusive: true,
  47024. CJKVerticalRomanCentered: 0,
  47025. CJKVerticalRomanHBaseline: 1
  47026. },
  47027. italicCJKRoman: {
  47028. code: 32,
  47029. exclusive: false,
  47030. // noCJKItalicRoman: 0 # deprecated - use CJKItalicRomanOff instead
  47031. // CJKItalicRoman: 1 # deprecated - use CJKItalicRomanOn instead
  47032. CJKItalicRoman: 2
  47033. },
  47034. caseSensitiveLayout: {
  47035. code: 33,
  47036. exclusive: false,
  47037. caseSensitiveLayout: 0,
  47038. caseSensitiveSpacing: 2
  47039. },
  47040. alternateKana: {
  47041. code: 34,
  47042. exclusive: false,
  47043. alternateHorizKana: 0,
  47044. alternateVertKana: 2
  47045. },
  47046. stylisticAlternatives: {
  47047. code: 35,
  47048. exclusive: false,
  47049. noStylisticAlternates: 0,
  47050. stylisticAltOne: 2,
  47051. stylisticAltTwo: 4,
  47052. stylisticAltThree: 6,
  47053. stylisticAltFour: 8,
  47054. stylisticAltFive: 10,
  47055. stylisticAltSix: 12,
  47056. stylisticAltSeven: 14,
  47057. stylisticAltEight: 16,
  47058. stylisticAltNine: 18,
  47059. stylisticAltTen: 20,
  47060. stylisticAltEleven: 22,
  47061. stylisticAltTwelve: 24,
  47062. stylisticAltThirteen: 26,
  47063. stylisticAltFourteen: 28,
  47064. stylisticAltFifteen: 30,
  47065. stylisticAltSixteen: 32,
  47066. stylisticAltSeventeen: 34,
  47067. stylisticAltEighteen: 36,
  47068. stylisticAltNineteen: 38,
  47069. stylisticAltTwenty: 40
  47070. },
  47071. contextualAlternates: {
  47072. code: 36,
  47073. exclusive: false,
  47074. contextualAlternates: 0,
  47075. swashAlternates: 2,
  47076. contextualSwashAlternates: 4
  47077. },
  47078. lowerCase: {
  47079. code: 37,
  47080. exclusive: true,
  47081. defaultLowerCase: 0,
  47082. lowerCaseSmallCaps: 1,
  47083. lowerCasePetiteCaps: 2
  47084. },
  47085. upperCase: {
  47086. code: 38,
  47087. exclusive: true,
  47088. defaultUpperCase: 0,
  47089. upperCaseSmallCaps: 1,
  47090. upperCasePetiteCaps: 2
  47091. },
  47092. languageTag: { // indices into ltag table
  47093. code: 39,
  47094. exclusive: true
  47095. },
  47096. CJKRomanSpacing: {
  47097. code: 103,
  47098. exclusive: true,
  47099. halfWidthCJKRoman: 0,
  47100. proportionalCJKRoman: 1,
  47101. defaultCJKRoman: 2,
  47102. fullWidthCJKRoman: 3
  47103. }
  47104. };
  47105. var feature = function feature(name, selector) {
  47106. return [features[name].code, features[name][selector]];
  47107. };
  47108. var OTMapping = {
  47109. rlig: feature('ligatures', 'requiredLigatures'),
  47110. clig: feature('ligatures', 'contextualLigatures'),
  47111. dlig: feature('ligatures', 'rareLigatures'),
  47112. hlig: feature('ligatures', 'historicalLigatures'),
  47113. liga: feature('ligatures', 'commonLigatures'),
  47114. hist: feature('ligatures', 'historicalLigatures'), // ??
  47115. smcp: feature('lowerCase', 'lowerCaseSmallCaps'),
  47116. pcap: feature('lowerCase', 'lowerCasePetiteCaps'),
  47117. frac: feature('fractions', 'diagonalFractions'),
  47118. dnom: feature('fractions', 'diagonalFractions'), // ??
  47119. numr: feature('fractions', 'diagonalFractions'), // ??
  47120. afrc: feature('fractions', 'verticalFractions'),
  47121. // aalt
  47122. // abvf, abvm, abvs, akhn, blwf, blwm, blws, cfar, cjct, cpsp, falt, isol, jalt, ljmo, mset?
  47123. // ltra, ltrm, nukt, pref, pres, pstf, psts, rand, rkrf, rphf, rtla, rtlm, size, tjmo, tnum?
  47124. // unic, vatu, vhal, vjmo, vpal, vrt2
  47125. // dist -> trak table?
  47126. // kern, vkrn -> kern table
  47127. // lfbd + opbd + rtbd -> opbd table?
  47128. // mark, mkmk -> acnt table?
  47129. // locl -> languageTag + ltag table
  47130. case: feature('caseSensitiveLayout', 'caseSensitiveLayout'), // also caseSensitiveSpacing
  47131. ccmp: feature('unicodeDecomposition', 'canonicalComposition'), // compatibilityComposition?
  47132. cpct: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), // guess..., probably not given below
  47133. valt: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'),
  47134. swsh: feature('contextualAlternates', 'swashAlternates'),
  47135. cswh: feature('contextualAlternates', 'contextualSwashAlternates'),
  47136. curs: feature('cursiveConnection', 'cursive'), // ??
  47137. c2pc: feature('upperCase', 'upperCasePetiteCaps'),
  47138. c2sc: feature('upperCase', 'upperCaseSmallCaps'),
  47139. init: feature('smartSwash', 'wordInitialSwashes'), // ??
  47140. fin2: feature('smartSwash', 'wordFinalSwashes'), // ??
  47141. medi: feature('smartSwash', 'nonFinalSwashes'), // ??
  47142. med2: feature('smartSwash', 'nonFinalSwashes'), // ??
  47143. fin3: feature('smartSwash', 'wordFinalSwashes'), // ??
  47144. fina: feature('smartSwash', 'wordFinalSwashes'), // ??
  47145. pkna: feature('kanaSpacing', 'proportionalKana'),
  47146. half: feature('textSpacing', 'halfWidthText'), // also HalfWidthCJKRoman, HalfWidthIdeographs?
  47147. halt: feature('textSpacing', 'altHalfWidthText'),
  47148. hkna: feature('alternateKana', 'alternateHorizKana'),
  47149. vkna: feature('alternateKana', 'alternateVertKana'),
  47150. // hngl: feature 'transliteration', 'hanjaToHangulSelector' # deprecated
  47151. ital: feature('italicCJKRoman', 'CJKItalicRoman'),
  47152. lnum: feature('numberCase', 'upperCaseNumbers'),
  47153. onum: feature('numberCase', 'lowerCaseNumbers'),
  47154. mgrk: feature('mathematicalExtras', 'mathematicalGreek'),
  47155. // nalt: not enough info. what type of annotation?
  47156. // ornm: ditto, which ornament style?
  47157. calt: feature('contextualAlternates', 'contextualAlternates'), // or more?
  47158. vrt2: feature('verticalSubstitution', 'substituteVerticalForms'), // oh... below?
  47159. vert: feature('verticalSubstitution', 'substituteVerticalForms'),
  47160. tnum: feature('numberSpacing', 'monospacedNumbers'),
  47161. pnum: feature('numberSpacing', 'proportionalNumbers'),
  47162. sups: feature('verticalPosition', 'superiors'),
  47163. subs: feature('verticalPosition', 'inferiors'),
  47164. ordn: feature('verticalPosition', 'ordinals'),
  47165. pwid: feature('textSpacing', 'proportionalText'),
  47166. hwid: feature('textSpacing', 'halfWidthText'),
  47167. qwid: feature('textSpacing', 'quarterWidthText'), // also QuarterWidthNumbers?
  47168. twid: feature('textSpacing', 'thirdWidthText'), // also ThirdWidthNumbers?
  47169. fwid: feature('textSpacing', 'proportionalText'), //??
  47170. palt: feature('textSpacing', 'altProportionalText'),
  47171. trad: feature('characterShape', 'traditionalCharacters'),
  47172. smpl: feature('characterShape', 'simplifiedCharacters'),
  47173. jp78: feature('characterShape', 'JIS1978Characters'),
  47174. jp83: feature('characterShape', 'JIS1983Characters'),
  47175. jp90: feature('characterShape', 'JIS1990Characters'),
  47176. jp04: feature('characterShape', 'JIS2004Characters'),
  47177. expt: feature('characterShape', 'expertCharacters'),
  47178. hojo: feature('characterShape', 'hojoCharacters'),
  47179. nlck: feature('characterShape', 'NLCCharacters'),
  47180. tnam: feature('characterShape', 'traditionalNamesCharacters'),
  47181. ruby: feature('rubyKana', 'rubyKana'),
  47182. titl: feature('styleOptions', 'titlingCaps'),
  47183. zero: feature('typographicExtras', 'slashedZero'),
  47184. ss01: feature('stylisticAlternatives', 'stylisticAltOne'),
  47185. ss02: feature('stylisticAlternatives', 'stylisticAltTwo'),
  47186. ss03: feature('stylisticAlternatives', 'stylisticAltThree'),
  47187. ss04: feature('stylisticAlternatives', 'stylisticAltFour'),
  47188. ss05: feature('stylisticAlternatives', 'stylisticAltFive'),
  47189. ss06: feature('stylisticAlternatives', 'stylisticAltSix'),
  47190. ss07: feature('stylisticAlternatives', 'stylisticAltSeven'),
  47191. ss08: feature('stylisticAlternatives', 'stylisticAltEight'),
  47192. ss09: feature('stylisticAlternatives', 'stylisticAltNine'),
  47193. ss10: feature('stylisticAlternatives', 'stylisticAltTen'),
  47194. ss11: feature('stylisticAlternatives', 'stylisticAltEleven'),
  47195. ss12: feature('stylisticAlternatives', 'stylisticAltTwelve'),
  47196. ss13: feature('stylisticAlternatives', 'stylisticAltThirteen'),
  47197. ss14: feature('stylisticAlternatives', 'stylisticAltFourteen'),
  47198. ss15: feature('stylisticAlternatives', 'stylisticAltFifteen'),
  47199. ss16: feature('stylisticAlternatives', 'stylisticAltSixteen'),
  47200. ss17: feature('stylisticAlternatives', 'stylisticAltSeventeen'),
  47201. ss18: feature('stylisticAlternatives', 'stylisticAltEighteen'),
  47202. ss19: feature('stylisticAlternatives', 'stylisticAltNineteen'),
  47203. ss20: feature('stylisticAlternatives', 'stylisticAltTwenty')
  47204. };
  47205. // salt: feature 'stylisticAlternatives', 'stylisticAltOne' # hmm, which one to choose
  47206. // Add cv01-cv99 features
  47207. for (var i = 1; i <= 99; i++) {
  47208. OTMapping['cv' + ('00' + i).slice(-2)] = [features.characterAlternatives.code, i];
  47209. }
  47210. // create inverse mapping
  47211. var AATMapping = {};
  47212. for (var ot in OTMapping) {
  47213. var aat = OTMapping[ot];
  47214. if (AATMapping[aat[0]] == null) {
  47215. AATMapping[aat[0]] = {};
  47216. }
  47217. AATMapping[aat[0]][aat[1]] = ot;
  47218. }
  47219. // Maps an array of OpenType features to AAT features
  47220. // in the form of {featureType:{featureSetting:true}}
  47221. function mapOTToAAT(features) {
  47222. var res = {};
  47223. for (var k in features) {
  47224. var r = void 0;
  47225. if (r = OTMapping[k]) {
  47226. if (res[r[0]] == null) {
  47227. res[r[0]] = {};
  47228. }
  47229. res[r[0]][r[1]] = features[k];
  47230. }
  47231. }
  47232. return res;
  47233. }
  47234. // Maps strings in a [featureType, featureSetting]
  47235. // to their equivalent number codes
  47236. function mapFeatureStrings(f) {
  47237. var type = f[0],
  47238. setting = f[1];
  47239. if (isNaN(type)) {
  47240. var typeCode = features[type] && features[type].code;
  47241. } else {
  47242. var typeCode = type;
  47243. }
  47244. if (isNaN(setting)) {
  47245. var settingCode = features[type] && features[type][setting];
  47246. } else {
  47247. var settingCode = setting;
  47248. }
  47249. return [typeCode, settingCode];
  47250. }
  47251. // Maps AAT features to an array of OpenType features
  47252. // Supports both arrays in the form of [[featureType, featureSetting]]
  47253. // and objects in the form of {featureType:{featureSetting:true}}
  47254. // featureTypes and featureSettings can be either strings or number codes
  47255. function mapAATToOT(features) {
  47256. var res = {};
  47257. if (Array.isArray(features)) {
  47258. for (var k = 0; k < features.length; k++) {
  47259. var r = void 0;
  47260. var f = mapFeatureStrings(features[k]);
  47261. if (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]]) {
  47262. res[r] = true;
  47263. }
  47264. }
  47265. } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
  47266. for (var type in features) {
  47267. var _feature = features[type];
  47268. for (var setting in _feature) {
  47269. var _r = void 0;
  47270. var _f = mapFeatureStrings([type, setting]);
  47271. if (_feature[setting] && (_r = AATMapping[_f[0]] && AATMapping[_f[0]][_f[1]])) {
  47272. res[_r] = true;
  47273. }
  47274. }
  47275. }
  47276. }
  47277. return _Object$keys(res);
  47278. }
  47279. var _class$3;
  47280. function _applyDecoratedDescriptor$3(target, property, decorators, descriptor, context) {
  47281. var desc = {};
  47282. Object['ke' + 'ys'](descriptor).forEach(function (key) {
  47283. desc[key] = descriptor[key];
  47284. });
  47285. desc.enumerable = !!desc.enumerable;
  47286. desc.configurable = !!desc.configurable;
  47287. if ('value' in desc || desc.initializer) {
  47288. desc.writable = true;
  47289. }
  47290. desc = decorators.slice().reverse().reduce(function (desc, decorator) {
  47291. return decorator(target, property, desc) || desc;
  47292. }, desc);
  47293. if (context && desc.initializer !== void 0) {
  47294. desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
  47295. desc.initializer = undefined;
  47296. }
  47297. if (desc.initializer === void 0) {
  47298. Object['define' + 'Property'](target, property, desc);
  47299. desc = null;
  47300. }
  47301. return desc;
  47302. }
  47303. var AATLookupTable = (_class$3 = function () {
  47304. function AATLookupTable(table) {
  47305. _classCallCheck(this, AATLookupTable);
  47306. this.table = table;
  47307. }
  47308. AATLookupTable.prototype.lookup = function lookup(glyph) {
  47309. switch (this.table.version) {
  47310. case 0:
  47311. // simple array format
  47312. return this.table.values.getItem(glyph);
  47313. case 2: // segment format
  47314. case 4:
  47315. {
  47316. var min = 0;
  47317. var max = this.table.binarySearchHeader.nUnits - 1;
  47318. while (min <= max) {
  47319. var mid = min + max >> 1;
  47320. var seg = this.table.segments[mid];
  47321. // special end of search value
  47322. if (seg.firstGlyph === 0xffff) {
  47323. return null;
  47324. }
  47325. if (glyph < seg.firstGlyph) {
  47326. max = mid - 1;
  47327. } else if (glyph > seg.lastGlyph) {
  47328. min = mid + 1;
  47329. } else {
  47330. if (this.table.version === 2) {
  47331. return seg.value;
  47332. } else {
  47333. return seg.values[glyph - seg.firstGlyph];
  47334. }
  47335. }
  47336. }
  47337. return null;
  47338. }
  47339. case 6:
  47340. {
  47341. // lookup single
  47342. var _min = 0;
  47343. var _max = this.table.binarySearchHeader.nUnits - 1;
  47344. while (_min <= _max) {
  47345. var mid = _min + _max >> 1;
  47346. var seg = this.table.segments[mid];
  47347. // special end of search value
  47348. if (seg.glyph === 0xffff) {
  47349. return null;
  47350. }
  47351. if (glyph < seg.glyph) {
  47352. _max = mid - 1;
  47353. } else if (glyph > seg.glyph) {
  47354. _min = mid + 1;
  47355. } else {
  47356. return seg.value;
  47357. }
  47358. }
  47359. return null;
  47360. }
  47361. case 8:
  47362. // lookup trimmed
  47363. return this.table.values[glyph - this.table.firstGlyph];
  47364. default:
  47365. throw new Error('Unknown lookup table format: ' + this.table.version);
  47366. }
  47367. };
  47368. AATLookupTable.prototype.glyphsForValue = function glyphsForValue(classValue) {
  47369. var res = [];
  47370. switch (this.table.version) {
  47371. case 2: // segment format
  47372. case 4:
  47373. {
  47374. for (var _iterator = this.table.segments, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  47375. var _ref;
  47376. if (_isArray) {
  47377. if (_i >= _iterator.length) break;
  47378. _ref = _iterator[_i++];
  47379. } else {
  47380. _i = _iterator.next();
  47381. if (_i.done) break;
  47382. _ref = _i.value;
  47383. }
  47384. var segment = _ref;
  47385. if (this.table.version === 2 && segment.value === classValue) {
  47386. res.push.apply(res, range(segment.firstGlyph, segment.lastGlyph + 1));
  47387. } else {
  47388. for (var index = 0; index < segment.values.length; index++) {
  47389. if (segment.values[index] === classValue) {
  47390. res.push(segment.firstGlyph + index);
  47391. }
  47392. }
  47393. }
  47394. }
  47395. break;
  47396. }
  47397. case 6:
  47398. {
  47399. // lookup single
  47400. for (var _iterator2 = this.table.segments, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  47401. var _ref2;
  47402. if (_isArray2) {
  47403. if (_i2 >= _iterator2.length) break;
  47404. _ref2 = _iterator2[_i2++];
  47405. } else {
  47406. _i2 = _iterator2.next();
  47407. if (_i2.done) break;
  47408. _ref2 = _i2.value;
  47409. }
  47410. var _segment = _ref2;
  47411. if (_segment.value === classValue) {
  47412. res.push(_segment.glyph);
  47413. }
  47414. }
  47415. break;
  47416. }
  47417. case 8:
  47418. {
  47419. // lookup trimmed
  47420. for (var i = 0; i < this.table.values.length; i++) {
  47421. if (this.table.values[i] === classValue) {
  47422. res.push(this.table.firstGlyph + i);
  47423. }
  47424. }
  47425. break;
  47426. }
  47427. default:
  47428. throw new Error('Unknown lookup table format: ' + this.table.version);
  47429. }
  47430. return res;
  47431. };
  47432. return AATLookupTable;
  47433. }(), (_applyDecoratedDescriptor$3(_class$3.prototype, 'glyphsForValue', [cache], _Object$getOwnPropertyDescriptor(_class$3.prototype, 'glyphsForValue'), _class$3.prototype)), _class$3);
  47434. var START_OF_TEXT_STATE = 0;
  47435. var END_OF_TEXT_CLASS = 0;
  47436. var OUT_OF_BOUNDS_CLASS = 1;
  47437. var DELETED_GLYPH_CLASS = 2;
  47438. var DONT_ADVANCE = 0x4000;
  47439. var AATStateMachine = function () {
  47440. function AATStateMachine(stateTable) {
  47441. _classCallCheck(this, AATStateMachine);
  47442. this.stateTable = stateTable;
  47443. this.lookupTable = new AATLookupTable(stateTable.classTable);
  47444. }
  47445. AATStateMachine.prototype.process = function process(glyphs, reverse, processEntry) {
  47446. var currentState = START_OF_TEXT_STATE; // START_OF_LINE_STATE is used for kashida glyph insertions sometimes I think?
  47447. var index = reverse ? glyphs.length - 1 : 0;
  47448. var dir = reverse ? -1 : 1;
  47449. while (dir === 1 && index <= glyphs.length || dir === -1 && index >= -1) {
  47450. var glyph = null;
  47451. var classCode = OUT_OF_BOUNDS_CLASS;
  47452. var shouldAdvance = true;
  47453. if (index === glyphs.length || index === -1) {
  47454. classCode = END_OF_TEXT_CLASS;
  47455. } else {
  47456. glyph = glyphs[index];
  47457. if (glyph.id === 0xffff) {
  47458. // deleted glyph
  47459. classCode = DELETED_GLYPH_CLASS;
  47460. } else {
  47461. classCode = this.lookupTable.lookup(glyph.id);
  47462. if (classCode == null) {
  47463. classCode = OUT_OF_BOUNDS_CLASS;
  47464. }
  47465. }
  47466. }
  47467. var row = this.stateTable.stateArray.getItem(currentState);
  47468. var entryIndex = row[classCode];
  47469. var entry = this.stateTable.entryTable.getItem(entryIndex);
  47470. if (classCode !== END_OF_TEXT_CLASS && classCode !== DELETED_GLYPH_CLASS) {
  47471. processEntry(glyph, entry, index);
  47472. shouldAdvance = !(entry.flags & DONT_ADVANCE);
  47473. }
  47474. currentState = entry.newState;
  47475. if (shouldAdvance) {
  47476. index += dir;
  47477. }
  47478. }
  47479. return glyphs;
  47480. };
  47481. /**
  47482. * Performs a depth-first traversal of the glyph strings
  47483. * represented by the state machine.
  47484. */
  47485. AATStateMachine.prototype.traverse = function traverse(opts) {
  47486. var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  47487. var visited = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new _Set();
  47488. if (visited.has(state)) {
  47489. return;
  47490. }
  47491. visited.add(state);
  47492. var _stateTable = this.stateTable,
  47493. nClasses = _stateTable.nClasses,
  47494. stateArray = _stateTable.stateArray,
  47495. entryTable = _stateTable.entryTable;
  47496. var row = stateArray.getItem(state);
  47497. // Skip predefined classes
  47498. for (var classCode = 4; classCode < nClasses; classCode++) {
  47499. var entryIndex = row[classCode];
  47500. var entry = entryTable.getItem(entryIndex);
  47501. // Try all glyphs in the class
  47502. for (var _iterator = this.lookupTable.glyphsForValue(classCode), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  47503. var _ref;
  47504. if (_isArray) {
  47505. if (_i >= _iterator.length) break;
  47506. _ref = _iterator[_i++];
  47507. } else {
  47508. _i = _iterator.next();
  47509. if (_i.done) break;
  47510. _ref = _i.value;
  47511. }
  47512. var glyph = _ref;
  47513. if (opts.enter) {
  47514. opts.enter(glyph, entry);
  47515. }
  47516. if (entry.newState !== 0) {
  47517. this.traverse(opts, entry.newState, visited);
  47518. }
  47519. if (opts.exit) {
  47520. opts.exit(glyph, entry);
  47521. }
  47522. }
  47523. }
  47524. };
  47525. return AATStateMachine;
  47526. }();
  47527. var _class$2;
  47528. function _applyDecoratedDescriptor$2(target, property, decorators, descriptor, context) {
  47529. var desc = {};
  47530. Object['ke' + 'ys'](descriptor).forEach(function (key) {
  47531. desc[key] = descriptor[key];
  47532. });
  47533. desc.enumerable = !!desc.enumerable;
  47534. desc.configurable = !!desc.configurable;
  47535. if ('value' in desc || desc.initializer) {
  47536. desc.writable = true;
  47537. }
  47538. desc = decorators.slice().reverse().reduce(function (desc, decorator) {
  47539. return decorator(target, property, desc) || desc;
  47540. }, desc);
  47541. if (context && desc.initializer !== void 0) {
  47542. desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
  47543. desc.initializer = undefined;
  47544. }
  47545. if (desc.initializer === void 0) {
  47546. Object['define' + 'Property'](target, property, desc);
  47547. desc = null;
  47548. }
  47549. return desc;
  47550. }
  47551. // indic replacement flags
  47552. var MARK_FIRST = 0x8000;
  47553. var MARK_LAST = 0x2000;
  47554. var VERB = 0x000F;
  47555. // contextual substitution and glyph insertion flag
  47556. var SET_MARK = 0x8000;
  47557. // ligature entry flags
  47558. var SET_COMPONENT = 0x8000;
  47559. var PERFORM_ACTION = 0x2000;
  47560. // ligature action masks
  47561. var LAST_MASK = 0x80000000;
  47562. var STORE_MASK = 0x40000000;
  47563. var OFFSET_MASK = 0x3FFFFFFF;
  47564. var REVERSE_DIRECTION = 0x400000;
  47565. var CURRENT_INSERT_BEFORE = 0x0800;
  47566. var MARKED_INSERT_BEFORE = 0x0400;
  47567. var CURRENT_INSERT_COUNT = 0x03E0;
  47568. var MARKED_INSERT_COUNT = 0x001F;
  47569. var AATMorxProcessor = (_class$2 = function () {
  47570. function AATMorxProcessor(font) {
  47571. _classCallCheck(this, AATMorxProcessor);
  47572. this.processIndicRearragement = this.processIndicRearragement.bind(this);
  47573. this.processContextualSubstitution = this.processContextualSubstitution.bind(this);
  47574. this.processLigature = this.processLigature.bind(this);
  47575. this.processNoncontextualSubstitutions = this.processNoncontextualSubstitutions.bind(this);
  47576. this.processGlyphInsertion = this.processGlyphInsertion.bind(this);
  47577. this.font = font;
  47578. this.morx = font.morx;
  47579. this.inputCache = null;
  47580. }
  47581. // Processes an array of glyphs and applies the specified features
  47582. // Features should be in the form of {featureType:{featureSetting:true}}
  47583. AATMorxProcessor.prototype.process = function process(glyphs) {
  47584. var features = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  47585. for (var _iterator = this.morx.chains, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  47586. var _ref;
  47587. if (_isArray) {
  47588. if (_i >= _iterator.length) break;
  47589. _ref = _iterator[_i++];
  47590. } else {
  47591. _i = _iterator.next();
  47592. if (_i.done) break;
  47593. _ref = _i.value;
  47594. }
  47595. var chain = _ref;
  47596. var flags = chain.defaultFlags;
  47597. // enable/disable the requested features
  47598. for (var _iterator2 = chain.features, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  47599. var _ref2;
  47600. if (_isArray2) {
  47601. if (_i2 >= _iterator2.length) break;
  47602. _ref2 = _iterator2[_i2++];
  47603. } else {
  47604. _i2 = _iterator2.next();
  47605. if (_i2.done) break;
  47606. _ref2 = _i2.value;
  47607. }
  47608. var feature = _ref2;
  47609. var f = void 0;
  47610. if ((f = features[feature.featureType]) && f[feature.featureSetting]) {
  47611. flags &= feature.disableFlags;
  47612. flags |= feature.enableFlags;
  47613. }
  47614. }
  47615. for (var _iterator3 = chain.subtables, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  47616. var _ref3;
  47617. if (_isArray3) {
  47618. if (_i3 >= _iterator3.length) break;
  47619. _ref3 = _iterator3[_i3++];
  47620. } else {
  47621. _i3 = _iterator3.next();
  47622. if (_i3.done) break;
  47623. _ref3 = _i3.value;
  47624. }
  47625. var subtable = _ref3;
  47626. if (subtable.subFeatureFlags & flags) {
  47627. this.processSubtable(subtable, glyphs);
  47628. }
  47629. }
  47630. }
  47631. // remove deleted glyphs
  47632. var index = glyphs.length - 1;
  47633. while (index >= 0) {
  47634. if (glyphs[index].id === 0xffff) {
  47635. glyphs.splice(index, 1);
  47636. }
  47637. index--;
  47638. }
  47639. return glyphs;
  47640. };
  47641. AATMorxProcessor.prototype.processSubtable = function processSubtable(subtable, glyphs) {
  47642. this.subtable = subtable;
  47643. this.glyphs = glyphs;
  47644. if (this.subtable.type === 4) {
  47645. this.processNoncontextualSubstitutions(this.subtable, this.glyphs);
  47646. return;
  47647. }
  47648. this.ligatureStack = [];
  47649. this.markedGlyph = null;
  47650. this.firstGlyph = null;
  47651. this.lastGlyph = null;
  47652. this.markedIndex = null;
  47653. var stateMachine = this.getStateMachine(subtable);
  47654. var process = this.getProcessor();
  47655. var reverse = !!(this.subtable.coverage & REVERSE_DIRECTION);
  47656. return stateMachine.process(this.glyphs, reverse, process);
  47657. };
  47658. AATMorxProcessor.prototype.getStateMachine = function getStateMachine(subtable) {
  47659. return new AATStateMachine(subtable.table.stateTable);
  47660. };
  47661. AATMorxProcessor.prototype.getProcessor = function getProcessor() {
  47662. switch (this.subtable.type) {
  47663. case 0:
  47664. return this.processIndicRearragement;
  47665. case 1:
  47666. return this.processContextualSubstitution;
  47667. case 2:
  47668. return this.processLigature;
  47669. case 4:
  47670. return this.processNoncontextualSubstitutions;
  47671. case 5:
  47672. return this.processGlyphInsertion;
  47673. default:
  47674. throw new Error('Invalid morx subtable type: ' + this.subtable.type);
  47675. }
  47676. };
  47677. AATMorxProcessor.prototype.processIndicRearragement = function processIndicRearragement(glyph, entry, index) {
  47678. if (entry.flags & MARK_FIRST) {
  47679. this.firstGlyph = index;
  47680. }
  47681. if (entry.flags & MARK_LAST) {
  47682. this.lastGlyph = index;
  47683. }
  47684. reorderGlyphs(this.glyphs, entry.flags & VERB, this.firstGlyph, this.lastGlyph);
  47685. };
  47686. AATMorxProcessor.prototype.processContextualSubstitution = function processContextualSubstitution(glyph, entry, index) {
  47687. var subsitutions = this.subtable.table.substitutionTable.items;
  47688. if (entry.markIndex !== 0xffff) {
  47689. var lookup = subsitutions.getItem(entry.markIndex);
  47690. var lookupTable = new AATLookupTable(lookup);
  47691. glyph = this.glyphs[this.markedGlyph];
  47692. var gid = lookupTable.lookup(glyph.id);
  47693. if (gid) {
  47694. this.glyphs[this.markedGlyph] = this.font.getGlyph(gid, glyph.codePoints);
  47695. }
  47696. }
  47697. if (entry.currentIndex !== 0xffff) {
  47698. var _lookup = subsitutions.getItem(entry.currentIndex);
  47699. var _lookupTable = new AATLookupTable(_lookup);
  47700. glyph = this.glyphs[index];
  47701. var gid = _lookupTable.lookup(glyph.id);
  47702. if (gid) {
  47703. this.glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);
  47704. }
  47705. }
  47706. if (entry.flags & SET_MARK) {
  47707. this.markedGlyph = index;
  47708. }
  47709. };
  47710. AATMorxProcessor.prototype.processLigature = function processLigature(glyph, entry, index) {
  47711. if (entry.flags & SET_COMPONENT) {
  47712. this.ligatureStack.push(index);
  47713. }
  47714. if (entry.flags & PERFORM_ACTION) {
  47715. var _ligatureStack;
  47716. var actions = this.subtable.table.ligatureActions;
  47717. var components = this.subtable.table.components;
  47718. var ligatureList = this.subtable.table.ligatureList;
  47719. var actionIndex = entry.action;
  47720. var last = false;
  47721. var ligatureIndex = 0;
  47722. var codePoints = [];
  47723. var ligatureGlyphs = [];
  47724. while (!last) {
  47725. var _codePoints;
  47726. var componentGlyph = this.ligatureStack.pop();
  47727. (_codePoints = codePoints).unshift.apply(_codePoints, this.glyphs[componentGlyph].codePoints);
  47728. var action = actions.getItem(actionIndex++);
  47729. last = !!(action & LAST_MASK);
  47730. var store = !!(action & STORE_MASK);
  47731. var offset = (action & OFFSET_MASK) << 2 >> 2; // sign extend 30 to 32 bits
  47732. offset += this.glyphs[componentGlyph].id;
  47733. var component = components.getItem(offset);
  47734. ligatureIndex += component;
  47735. if (last || store) {
  47736. var ligatureEntry = ligatureList.getItem(ligatureIndex);
  47737. this.glyphs[componentGlyph] = this.font.getGlyph(ligatureEntry, codePoints);
  47738. ligatureGlyphs.push(componentGlyph);
  47739. ligatureIndex = 0;
  47740. codePoints = [];
  47741. } else {
  47742. this.glyphs[componentGlyph] = this.font.getGlyph(0xffff);
  47743. }
  47744. }
  47745. // Put ligature glyph indexes back on the stack
  47746. (_ligatureStack = this.ligatureStack).push.apply(_ligatureStack, ligatureGlyphs);
  47747. }
  47748. };
  47749. AATMorxProcessor.prototype.processNoncontextualSubstitutions = function processNoncontextualSubstitutions(subtable, glyphs, index) {
  47750. var lookupTable = new AATLookupTable(subtable.table.lookupTable);
  47751. for (index = 0; index < glyphs.length; index++) {
  47752. var glyph = glyphs[index];
  47753. if (glyph.id !== 0xffff) {
  47754. var gid = lookupTable.lookup(glyph.id);
  47755. if (gid) {
  47756. // 0 means do nothing
  47757. glyphs[index] = this.font.getGlyph(gid, glyph.codePoints);
  47758. }
  47759. }
  47760. }
  47761. };
  47762. AATMorxProcessor.prototype._insertGlyphs = function _insertGlyphs(glyphIndex, insertionActionIndex, count, isBefore) {
  47763. var _glyphs;
  47764. var insertions = [];
  47765. while (count--) {
  47766. var gid = this.subtable.table.insertionActions.getItem(insertionActionIndex++);
  47767. insertions.push(this.font.getGlyph(gid));
  47768. }
  47769. if (!isBefore) {
  47770. glyphIndex++;
  47771. }
  47772. (_glyphs = this.glyphs).splice.apply(_glyphs, [glyphIndex, 0].concat(insertions));
  47773. };
  47774. AATMorxProcessor.prototype.processGlyphInsertion = function processGlyphInsertion(glyph, entry, index) {
  47775. if (entry.flags & SET_MARK) {
  47776. this.markedIndex = index;
  47777. }
  47778. if (entry.markedInsertIndex !== 0xffff) {
  47779. var count = (entry.flags & MARKED_INSERT_COUNT) >>> 5;
  47780. var isBefore = !!(entry.flags & MARKED_INSERT_BEFORE);
  47781. this._insertGlyphs(this.markedIndex, entry.markedInsertIndex, count, isBefore);
  47782. }
  47783. if (entry.currentInsertIndex !== 0xffff) {
  47784. var _count = (entry.flags & CURRENT_INSERT_COUNT) >>> 5;
  47785. var _isBefore = !!(entry.flags & CURRENT_INSERT_BEFORE);
  47786. this._insertGlyphs(index, entry.currentInsertIndex, _count, _isBefore);
  47787. }
  47788. };
  47789. AATMorxProcessor.prototype.getSupportedFeatures = function getSupportedFeatures() {
  47790. var features = [];
  47791. for (var _iterator4 = this.morx.chains, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  47792. var _ref4;
  47793. if (_isArray4) {
  47794. if (_i4 >= _iterator4.length) break;
  47795. _ref4 = _iterator4[_i4++];
  47796. } else {
  47797. _i4 = _iterator4.next();
  47798. if (_i4.done) break;
  47799. _ref4 = _i4.value;
  47800. }
  47801. var chain = _ref4;
  47802. for (var _iterator5 = chain.features, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
  47803. var _ref5;
  47804. if (_isArray5) {
  47805. if (_i5 >= _iterator5.length) break;
  47806. _ref5 = _iterator5[_i5++];
  47807. } else {
  47808. _i5 = _iterator5.next();
  47809. if (_i5.done) break;
  47810. _ref5 = _i5.value;
  47811. }
  47812. var feature = _ref5;
  47813. features.push([feature.featureType, feature.featureSetting]);
  47814. }
  47815. }
  47816. return features;
  47817. };
  47818. AATMorxProcessor.prototype.generateInputs = function generateInputs(gid) {
  47819. if (!this.inputCache) {
  47820. this.generateInputCache();
  47821. }
  47822. return this.inputCache[gid] || [];
  47823. };
  47824. AATMorxProcessor.prototype.generateInputCache = function generateInputCache() {
  47825. this.inputCache = {};
  47826. for (var _iterator6 = this.morx.chains, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
  47827. var _ref6;
  47828. if (_isArray6) {
  47829. if (_i6 >= _iterator6.length) break;
  47830. _ref6 = _iterator6[_i6++];
  47831. } else {
  47832. _i6 = _iterator6.next();
  47833. if (_i6.done) break;
  47834. _ref6 = _i6.value;
  47835. }
  47836. var chain = _ref6;
  47837. var flags = chain.defaultFlags;
  47838. for (var _iterator7 = chain.subtables, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _getIterator(_iterator7);;) {
  47839. var _ref7;
  47840. if (_isArray7) {
  47841. if (_i7 >= _iterator7.length) break;
  47842. _ref7 = _iterator7[_i7++];
  47843. } else {
  47844. _i7 = _iterator7.next();
  47845. if (_i7.done) break;
  47846. _ref7 = _i7.value;
  47847. }
  47848. var subtable = _ref7;
  47849. if (subtable.subFeatureFlags & flags) {
  47850. this.generateInputsForSubtable(subtable);
  47851. }
  47852. }
  47853. }
  47854. };
  47855. AATMorxProcessor.prototype.generateInputsForSubtable = function generateInputsForSubtable(subtable) {
  47856. var _this = this;
  47857. // Currently, only supporting ligature subtables.
  47858. if (subtable.type !== 2) {
  47859. return;
  47860. }
  47861. var reverse = !!(subtable.coverage & REVERSE_DIRECTION);
  47862. if (reverse) {
  47863. throw new Error('Reverse subtable, not supported.');
  47864. }
  47865. this.subtable = subtable;
  47866. this.ligatureStack = [];
  47867. var stateMachine = this.getStateMachine(subtable);
  47868. var process = this.getProcessor();
  47869. var input = [];
  47870. var stack = [];
  47871. this.glyphs = [];
  47872. stateMachine.traverse({
  47873. enter: function enter(glyph, entry) {
  47874. var glyphs = _this.glyphs;
  47875. stack.push({
  47876. glyphs: glyphs.slice(),
  47877. ligatureStack: _this.ligatureStack.slice()
  47878. });
  47879. // Add glyph to input and glyphs to process.
  47880. var g = _this.font.getGlyph(glyph);
  47881. input.push(g);
  47882. glyphs.push(input[input.length - 1]);
  47883. // Process ligature substitution
  47884. process(glyphs[glyphs.length - 1], entry, glyphs.length - 1);
  47885. // Add input to result if only one matching (non-deleted) glyph remains.
  47886. var count = 0;
  47887. var found = 0;
  47888. for (var i = 0; i < glyphs.length && count <= 1; i++) {
  47889. if (glyphs[i].id !== 0xffff) {
  47890. count++;
  47891. found = glyphs[i].id;
  47892. }
  47893. }
  47894. if (count === 1) {
  47895. var result = input.map(function (g) {
  47896. return g.id;
  47897. });
  47898. var _cache = _this.inputCache[found];
  47899. if (_cache) {
  47900. _cache.push(result);
  47901. } else {
  47902. _this.inputCache[found] = [result];
  47903. }
  47904. }
  47905. },
  47906. exit: function exit() {
  47907. var _stack$pop = stack.pop();
  47908. _this.glyphs = _stack$pop.glyphs;
  47909. _this.ligatureStack = _stack$pop.ligatureStack;
  47910. input.pop();
  47911. }
  47912. });
  47913. };
  47914. return AATMorxProcessor;
  47915. }(), (_applyDecoratedDescriptor$2(_class$2.prototype, 'getStateMachine', [cache], _Object$getOwnPropertyDescriptor(_class$2.prototype, 'getStateMachine'), _class$2.prototype)), _class$2);
  47916. function swap(glyphs, rangeA, rangeB) {
  47917. var reverseA = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  47918. var reverseB = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
  47919. var end = glyphs.splice(rangeB[0] - (rangeB[1] - 1), rangeB[1]);
  47920. if (reverseB) {
  47921. end.reverse();
  47922. }
  47923. var start = glyphs.splice.apply(glyphs, [rangeA[0], rangeA[1]].concat(end));
  47924. if (reverseA) {
  47925. start.reverse();
  47926. }
  47927. glyphs.splice.apply(glyphs, [rangeB[0] - (rangeA[1] - 1), 0].concat(start));
  47928. return glyphs;
  47929. }
  47930. function reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {
  47931. var length = lastGlyph - firstGlyph + 1;
  47932. switch (verb) {
  47933. case 0:
  47934. // no change
  47935. return glyphs;
  47936. case 1:
  47937. // Ax => xA
  47938. return swap(glyphs, [firstGlyph, 1], [lastGlyph, 0]);
  47939. case 2:
  47940. // xD => Dx
  47941. return swap(glyphs, [firstGlyph, 0], [lastGlyph, 1]);
  47942. case 3:
  47943. // AxD => DxA
  47944. return swap(glyphs, [firstGlyph, 1], [lastGlyph, 1]);
  47945. case 4:
  47946. // ABx => xAB
  47947. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0]);
  47948. case 5:
  47949. // ABx => xBA
  47950. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 0], true, false);
  47951. case 6:
  47952. // xCD => CDx
  47953. return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2]);
  47954. case 7:
  47955. // xCD => DCx
  47956. return swap(glyphs, [firstGlyph, 0], [lastGlyph, 2], false, true);
  47957. case 8:
  47958. // AxCD => CDxA
  47959. return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2]);
  47960. case 9:
  47961. // AxCD => DCxA
  47962. return swap(glyphs, [firstGlyph, 1], [lastGlyph, 2], false, true);
  47963. case 10:
  47964. // ABxD => DxAB
  47965. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1]);
  47966. case 11:
  47967. // ABxD => DxBA
  47968. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 1], true, false);
  47969. case 12:
  47970. // ABxCD => CDxAB
  47971. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2]);
  47972. case 13:
  47973. // ABxCD => CDxBA
  47974. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, false);
  47975. case 14:
  47976. // ABxCD => DCxAB
  47977. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], false, true);
  47978. case 15:
  47979. // ABxCD => DCxBA
  47980. return swap(glyphs, [firstGlyph, 2], [lastGlyph, 2], true, true);
  47981. default:
  47982. throw new Error('Unknown verb: ' + verb);
  47983. }
  47984. }
  47985. var AATLayoutEngine = function () {
  47986. function AATLayoutEngine(font) {
  47987. _classCallCheck(this, AATLayoutEngine);
  47988. this.font = font;
  47989. this.morxProcessor = new AATMorxProcessor(font);
  47990. this.fallbackPosition = false;
  47991. }
  47992. AATLayoutEngine.prototype.substitute = function substitute(glyphRun) {
  47993. // AAT expects the glyphs to be in visual order prior to morx processing,
  47994. // so reverse the glyphs if the script is right-to-left.
  47995. if (glyphRun.direction === 'rtl') {
  47996. glyphRun.glyphs.reverse();
  47997. }
  47998. this.morxProcessor.process(glyphRun.glyphs, mapOTToAAT(glyphRun.features));
  47999. };
  48000. AATLayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
  48001. return mapAATToOT(this.morxProcessor.getSupportedFeatures());
  48002. };
  48003. AATLayoutEngine.prototype.stringsForGlyph = function stringsForGlyph(gid) {
  48004. var glyphStrings = this.morxProcessor.generateInputs(gid);
  48005. var result = new _Set();
  48006. for (var _iterator = glyphStrings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  48007. var _ref;
  48008. if (_isArray) {
  48009. if (_i >= _iterator.length) break;
  48010. _ref = _iterator[_i++];
  48011. } else {
  48012. _i = _iterator.next();
  48013. if (_i.done) break;
  48014. _ref = _i.value;
  48015. }
  48016. var glyphs = _ref;
  48017. this._addStrings(glyphs, 0, result, '');
  48018. }
  48019. return result;
  48020. };
  48021. AATLayoutEngine.prototype._addStrings = function _addStrings(glyphs, index, strings, string) {
  48022. var codePoints = this.font._cmapProcessor.codePointsForGlyph(glyphs[index]);
  48023. for (var _iterator2 = codePoints, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  48024. var _ref2;
  48025. if (_isArray2) {
  48026. if (_i2 >= _iterator2.length) break;
  48027. _ref2 = _iterator2[_i2++];
  48028. } else {
  48029. _i2 = _iterator2.next();
  48030. if (_i2.done) break;
  48031. _ref2 = _i2.value;
  48032. }
  48033. var codePoint = _ref2;
  48034. var s = string + _String$fromCodePoint(codePoint);
  48035. if (index < glyphs.length - 1) {
  48036. this._addStrings(glyphs, index + 1, strings, s);
  48037. } else {
  48038. strings.add(s);
  48039. }
  48040. }
  48041. };
  48042. return AATLayoutEngine;
  48043. }();
  48044. /**
  48045. * ShapingPlans are used by the OpenType shapers to store which
  48046. * features should by applied, and in what order to apply them.
  48047. * The features are applied in groups called stages. A feature
  48048. * can be applied globally to all glyphs, or locally to only
  48049. * specific glyphs.
  48050. *
  48051. * @private
  48052. */
  48053. var ShapingPlan = function () {
  48054. function ShapingPlan(font, script, direction) {
  48055. _classCallCheck(this, ShapingPlan);
  48056. this.font = font;
  48057. this.script = script;
  48058. this.direction = direction;
  48059. this.stages = [];
  48060. this.globalFeatures = {};
  48061. this.allFeatures = {};
  48062. }
  48063. /**
  48064. * Adds the given features to the last stage.
  48065. * Ignores features that have already been applied.
  48066. */
  48067. ShapingPlan.prototype._addFeatures = function _addFeatures(features, global) {
  48068. var stageIndex = this.stages.length - 1;
  48069. var stage = this.stages[stageIndex];
  48070. for (var _iterator = features, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  48071. var _ref;
  48072. if (_isArray) {
  48073. if (_i >= _iterator.length) break;
  48074. _ref = _iterator[_i++];
  48075. } else {
  48076. _i = _iterator.next();
  48077. if (_i.done) break;
  48078. _ref = _i.value;
  48079. }
  48080. var feature = _ref;
  48081. if (this.allFeatures[feature] == null) {
  48082. stage.push(feature);
  48083. this.allFeatures[feature] = stageIndex;
  48084. if (global) {
  48085. this.globalFeatures[feature] = true;
  48086. }
  48087. }
  48088. }
  48089. };
  48090. /**
  48091. * Add features to the last stage
  48092. */
  48093. ShapingPlan.prototype.add = function add(arg) {
  48094. var global = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  48095. if (this.stages.length === 0) {
  48096. this.stages.push([]);
  48097. }
  48098. if (typeof arg === 'string') {
  48099. arg = [arg];
  48100. }
  48101. if (Array.isArray(arg)) {
  48102. this._addFeatures(arg, global);
  48103. } else if ((typeof arg === 'undefined' ? 'undefined' : _typeof(arg)) === 'object') {
  48104. this._addFeatures(arg.global || [], true);
  48105. this._addFeatures(arg.local || [], false);
  48106. } else {
  48107. throw new Error("Unsupported argument to ShapingPlan#add");
  48108. }
  48109. };
  48110. /**
  48111. * Add a new stage
  48112. */
  48113. ShapingPlan.prototype.addStage = function addStage(arg, global) {
  48114. if (typeof arg === 'function') {
  48115. this.stages.push(arg, []);
  48116. } else {
  48117. this.stages.push([]);
  48118. this.add(arg, global);
  48119. }
  48120. };
  48121. ShapingPlan.prototype.setFeatureOverrides = function setFeatureOverrides(features) {
  48122. if (Array.isArray(features)) {
  48123. this.add(features);
  48124. } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
  48125. for (var tag in features) {
  48126. if (features[tag]) {
  48127. this.add(tag);
  48128. } else if (this.allFeatures[tag] != null) {
  48129. var stage = this.stages[this.allFeatures[tag]];
  48130. stage.splice(stage.indexOf(tag), 1);
  48131. delete this.allFeatures[tag];
  48132. delete this.globalFeatures[tag];
  48133. }
  48134. }
  48135. }
  48136. };
  48137. /**
  48138. * Assigns the global features to the given glyphs
  48139. */
  48140. ShapingPlan.prototype.assignGlobalFeatures = function assignGlobalFeatures(glyphs) {
  48141. for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  48142. var _ref2;
  48143. if (_isArray2) {
  48144. if (_i2 >= _iterator2.length) break;
  48145. _ref2 = _iterator2[_i2++];
  48146. } else {
  48147. _i2 = _iterator2.next();
  48148. if (_i2.done) break;
  48149. _ref2 = _i2.value;
  48150. }
  48151. var glyph = _ref2;
  48152. for (var feature in this.globalFeatures) {
  48153. glyph.features[feature] = true;
  48154. }
  48155. }
  48156. };
  48157. /**
  48158. * Executes the planned stages using the given OTProcessor
  48159. */
  48160. ShapingPlan.prototype.process = function process(processor, glyphs, positions) {
  48161. for (var _iterator3 = this.stages, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  48162. var _ref3;
  48163. if (_isArray3) {
  48164. if (_i3 >= _iterator3.length) break;
  48165. _ref3 = _iterator3[_i3++];
  48166. } else {
  48167. _i3 = _iterator3.next();
  48168. if (_i3.done) break;
  48169. _ref3 = _i3.value;
  48170. }
  48171. var stage = _ref3;
  48172. if (typeof stage === 'function') {
  48173. if (!positions) {
  48174. stage(this.font, glyphs, this);
  48175. }
  48176. } else if (stage.length > 0) {
  48177. processor.applyFeatures(stage, glyphs, positions);
  48178. }
  48179. }
  48180. };
  48181. return ShapingPlan;
  48182. }();
  48183. var _class$4;
  48184. var _temp;
  48185. var VARIATION_FEATURES = ['rvrn'];
  48186. var COMMON_FEATURES = ['ccmp', 'locl', 'rlig', 'mark', 'mkmk'];
  48187. var FRACTIONAL_FEATURES = ['frac', 'numr', 'dnom'];
  48188. var HORIZONTAL_FEATURES = ['calt', 'clig', 'liga', 'rclt', 'curs', 'kern'];
  48189. var DIRECTIONAL_FEATURES = {
  48190. ltr: ['ltra', 'ltrm'],
  48191. rtl: ['rtla', 'rtlm']
  48192. };
  48193. var DefaultShaper = (_temp = _class$4 = function () {
  48194. function DefaultShaper() {
  48195. _classCallCheck(this, DefaultShaper);
  48196. }
  48197. DefaultShaper.plan = function plan(_plan, glyphs, features) {
  48198. // Plan the features we want to apply
  48199. this.planPreprocessing(_plan);
  48200. this.planFeatures(_plan);
  48201. this.planPostprocessing(_plan, features);
  48202. // Assign the global features to all the glyphs
  48203. _plan.assignGlobalFeatures(glyphs);
  48204. // Assign local features to glyphs
  48205. this.assignFeatures(_plan, glyphs);
  48206. };
  48207. DefaultShaper.planPreprocessing = function planPreprocessing(plan) {
  48208. plan.add({
  48209. global: [].concat(VARIATION_FEATURES, DIRECTIONAL_FEATURES[plan.direction]),
  48210. local: FRACTIONAL_FEATURES
  48211. });
  48212. };
  48213. DefaultShaper.planFeatures = function planFeatures(plan) {
  48214. // Do nothing by default. Let subclasses override this.
  48215. };
  48216. DefaultShaper.planPostprocessing = function planPostprocessing(plan, userFeatures) {
  48217. plan.add([].concat(COMMON_FEATURES, HORIZONTAL_FEATURES));
  48218. plan.setFeatureOverrides(userFeatures);
  48219. };
  48220. DefaultShaper.assignFeatures = function assignFeatures(plan, glyphs) {
  48221. // Enable contextual fractions
  48222. for (var i = 0; i < glyphs.length; i++) {
  48223. var glyph = glyphs[i];
  48224. if (glyph.codePoints[0] === 0x2044) {
  48225. // fraction slash
  48226. var start = i;
  48227. var end = i + 1;
  48228. // Apply numerator
  48229. while (start > 0 && unicode.isDigit(glyphs[start - 1].codePoints[0])) {
  48230. glyphs[start - 1].features.numr = true;
  48231. glyphs[start - 1].features.frac = true;
  48232. start--;
  48233. }
  48234. // Apply denominator
  48235. while (end < glyphs.length && unicode.isDigit(glyphs[end].codePoints[0])) {
  48236. glyphs[end].features.dnom = true;
  48237. glyphs[end].features.frac = true;
  48238. end++;
  48239. }
  48240. // Apply fraction slash
  48241. glyph.features.frac = true;
  48242. i = end - 1;
  48243. }
  48244. }
  48245. };
  48246. return DefaultShaper;
  48247. }(), _class$4.zeroMarkWidths = 'AFTER_GPOS', _temp);
  48248. var trie = new UnicodeTrie(Buffer("AAEQAAAAAAAAADGgAZUBav7t2CtPA0EUBeDZB00pin9AJZIEgyUEj0QhweDAgQOJxCBRBElQSBwSicLgkOAwnNKZ5GaY2c7uzj4o5yZfZrrbefbuIx2nSq3CGmzAWH/+K+UO7MIe7MMhHMMpnMMFXMIVXIt2t3CnP088iPqjqNN8e4Ij7Rle4LUH82rLm6i/92A+RERERERERERNmfz/89GDeRARERERzbN8ceps2Iwt9H0C9/AJ6yOlDkbTczcot5VSm8Pm1vcFWfb7+BKOLTuOd2UlTX4wGP85Eg953lWPFbnuN7PkjtLmalOWbNenkHOSa7T3KmR9MVTZ2zZkVj1kHa68MueVKH0R4zqQ44WEXLM8VjcWHP0PtKLfPzQnMtGn3W4QYf6qxFxceVI394r2xnV+1rih0fV1Vzf3fO1n3evL5J78ruvZ5ptX2Rwy92Tfb1wlEqut3U+sZ3HXOeJ7/zDrbyuP6+Zz0fqa6Nv3vhY7Yu1xWnGevmsvsUpTT/RYIe8waUH/rvHMWKFzLfN8L+rTfp645mfX7ftlnfDtYxN59w0=","base64"));
  48249. var FEATURES = ['isol', 'fina', 'fin2', 'fin3', 'medi', 'med2', 'init'];
  48250. var ShapingClasses = {
  48251. Non_Joining: 0,
  48252. Left_Joining: 1,
  48253. Right_Joining: 2,
  48254. Dual_Joining: 3,
  48255. Join_Causing: 3,
  48256. ALAPH: 4,
  48257. 'DALATH RISH': 5,
  48258. Transparent: 6
  48259. };
  48260. var ISOL = 'isol';
  48261. var FINA = 'fina';
  48262. var FIN2 = 'fin2';
  48263. var FIN3 = 'fin3';
  48264. var MEDI = 'medi';
  48265. var MED2 = 'med2';
  48266. var INIT = 'init';
  48267. var NONE = null;
  48268. // Each entry is [prevAction, curAction, nextState]
  48269. var STATE_TABLE = [
  48270. // Non_Joining, Left_Joining, Right_Joining, Dual_Joining, ALAPH, DALATH RISH
  48271. // State 0: prev was U, not willing to join.
  48272. [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 6]],
  48273. // State 1: prev was R or ISOL/ALAPH, not willing to join.
  48274. [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN2, 5], [NONE, ISOL, 6]],
  48275. // State 2: prev was D/L in ISOL form, willing to join.
  48276. [[NONE, NONE, 0], [NONE, ISOL, 2], [INIT, FINA, 1], [INIT, FINA, 3], [INIT, FINA, 4], [INIT, FINA, 6]],
  48277. // State 3: prev was D in FINA form, willing to join.
  48278. [[NONE, NONE, 0], [NONE, ISOL, 2], [MEDI, FINA, 1], [MEDI, FINA, 3], [MEDI, FINA, 4], [MEDI, FINA, 6]],
  48279. // State 4: prev was FINA ALAPH, not willing to join.
  48280. [[NONE, NONE, 0], [NONE, ISOL, 2], [MED2, ISOL, 1], [MED2, ISOL, 2], [MED2, FIN2, 5], [MED2, ISOL, 6]],
  48281. // State 5: prev was FIN2/FIN3 ALAPH, not willing to join.
  48282. [[NONE, NONE, 0], [NONE, ISOL, 2], [ISOL, ISOL, 1], [ISOL, ISOL, 2], [ISOL, FIN2, 5], [ISOL, ISOL, 6]],
  48283. // State 6: prev was DALATH/RISH, not willing to join.
  48284. [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN3, 5], [NONE, ISOL, 6]]];
  48285. /**
  48286. * This is a shaper for Arabic, and other cursive scripts.
  48287. * It uses data from ArabicShaping.txt in the Unicode database,
  48288. * compiled to a UnicodeTrie by generate-data.coffee.
  48289. *
  48290. * The shaping state machine was ported from Harfbuzz.
  48291. * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-arabic.cc
  48292. */
  48293. var ArabicShaper = function (_DefaultShaper) {
  48294. _inherits(ArabicShaper, _DefaultShaper);
  48295. function ArabicShaper() {
  48296. _classCallCheck(this, ArabicShaper);
  48297. return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
  48298. }
  48299. ArabicShaper.planFeatures = function planFeatures(plan) {
  48300. plan.add(['ccmp', 'locl']);
  48301. for (var i = 0; i < FEATURES.length; i++) {
  48302. var feature = FEATURES[i];
  48303. plan.addStage(feature, false);
  48304. }
  48305. plan.addStage('mset');
  48306. };
  48307. ArabicShaper.assignFeatures = function assignFeatures(plan, glyphs) {
  48308. _DefaultShaper.assignFeatures.call(this, plan, glyphs);
  48309. var prev = -1;
  48310. var state = 0;
  48311. var actions = [];
  48312. // Apply the state machine to map glyphs to features
  48313. for (var i = 0; i < glyphs.length; i++) {
  48314. var curAction = void 0,
  48315. prevAction = void 0;
  48316. var glyph = glyphs[i];
  48317. var type = getShapingClass(glyph.codePoints[0]);
  48318. if (type === ShapingClasses.Transparent) {
  48319. actions[i] = NONE;
  48320. continue;
  48321. }
  48322. var _STATE_TABLE$state$ty = STATE_TABLE[state][type];
  48323. prevAction = _STATE_TABLE$state$ty[0];
  48324. curAction = _STATE_TABLE$state$ty[1];
  48325. state = _STATE_TABLE$state$ty[2];
  48326. if (prevAction !== NONE && prev !== -1) {
  48327. actions[prev] = prevAction;
  48328. }
  48329. actions[i] = curAction;
  48330. prev = i;
  48331. }
  48332. // Apply the chosen features to their respective glyphs
  48333. for (var index = 0; index < glyphs.length; index++) {
  48334. var feature = void 0;
  48335. var glyph = glyphs[index];
  48336. if (feature = actions[index]) {
  48337. glyph.features[feature] = true;
  48338. }
  48339. }
  48340. };
  48341. return ArabicShaper;
  48342. }(DefaultShaper);
  48343. function getShapingClass(codePoint) {
  48344. var res = trie.get(codePoint);
  48345. if (res) {
  48346. return res - 1;
  48347. }
  48348. var category = unicode.getCategory(codePoint);
  48349. if (category === 'Mn' || category === 'Me' || category === 'Cf') {
  48350. return ShapingClasses.Transparent;
  48351. }
  48352. return ShapingClasses.Non_Joining;
  48353. }
  48354. var GlyphIterator = function () {
  48355. function GlyphIterator(glyphs, options) {
  48356. _classCallCheck(this, GlyphIterator);
  48357. this.glyphs = glyphs;
  48358. this.reset(options);
  48359. }
  48360. GlyphIterator.prototype.reset = function reset() {
  48361. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  48362. var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  48363. this.options = options;
  48364. this.flags = options.flags || {};
  48365. this.markAttachmentType = options.markAttachmentType || 0;
  48366. this.index = index;
  48367. };
  48368. GlyphIterator.prototype.shouldIgnore = function shouldIgnore(glyph) {
  48369. return this.flags.ignoreMarks && glyph.isMark || this.flags.ignoreBaseGlyphs && glyph.isBase || this.flags.ignoreLigatures && glyph.isLigature || this.markAttachmentType && glyph.isMark && glyph.markAttachmentType !== this.markAttachmentType;
  48370. };
  48371. GlyphIterator.prototype.move = function move(dir) {
  48372. this.index += dir;
  48373. while (0 <= this.index && this.index < this.glyphs.length && this.shouldIgnore(this.glyphs[this.index])) {
  48374. this.index += dir;
  48375. }
  48376. if (0 > this.index || this.index >= this.glyphs.length) {
  48377. return null;
  48378. }
  48379. return this.glyphs[this.index];
  48380. };
  48381. GlyphIterator.prototype.next = function next() {
  48382. return this.move(+1);
  48383. };
  48384. GlyphIterator.prototype.prev = function prev() {
  48385. return this.move(-1);
  48386. };
  48387. GlyphIterator.prototype.peek = function peek() {
  48388. var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
  48389. var idx = this.index;
  48390. var res = this.increment(count);
  48391. this.index = idx;
  48392. return res;
  48393. };
  48394. GlyphIterator.prototype.peekIndex = function peekIndex() {
  48395. var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
  48396. var idx = this.index;
  48397. this.increment(count);
  48398. var res = this.index;
  48399. this.index = idx;
  48400. return res;
  48401. };
  48402. GlyphIterator.prototype.increment = function increment() {
  48403. var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
  48404. var dir = count < 0 ? -1 : 1;
  48405. count = Math.abs(count);
  48406. while (count--) {
  48407. this.move(dir);
  48408. }
  48409. return this.glyphs[this.index];
  48410. };
  48411. _createClass(GlyphIterator, [{
  48412. key: "cur",
  48413. get: function get() {
  48414. return this.glyphs[this.index] || null;
  48415. }
  48416. }]);
  48417. return GlyphIterator;
  48418. }();
  48419. var DEFAULT_SCRIPTS = ['DFLT', 'dflt', 'latn'];
  48420. var OTProcessor = function () {
  48421. function OTProcessor(font, table) {
  48422. _classCallCheck(this, OTProcessor);
  48423. this.font = font;
  48424. this.table = table;
  48425. this.script = null;
  48426. this.scriptTag = null;
  48427. this.language = null;
  48428. this.languageTag = null;
  48429. this.features = {};
  48430. this.lookups = {};
  48431. // Setup variation substitutions
  48432. this.variationsIndex = font._variationProcessor ? this.findVariationsIndex(font._variationProcessor.normalizedCoords) : -1;
  48433. // initialize to default script + language
  48434. this.selectScript();
  48435. // current context (set by applyFeatures)
  48436. this.glyphs = [];
  48437. this.positions = []; // only used by GPOS
  48438. this.ligatureID = 1;
  48439. this.currentFeature = null;
  48440. }
  48441. OTProcessor.prototype.findScript = function findScript(script) {
  48442. if (this.table.scriptList == null) {
  48443. return null;
  48444. }
  48445. if (!Array.isArray(script)) {
  48446. script = [script];
  48447. }
  48448. for (var _iterator = script, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  48449. var _ref;
  48450. if (_isArray) {
  48451. if (_i >= _iterator.length) break;
  48452. _ref = _iterator[_i++];
  48453. } else {
  48454. _i = _iterator.next();
  48455. if (_i.done) break;
  48456. _ref = _i.value;
  48457. }
  48458. var s = _ref;
  48459. for (var _iterator2 = this.table.scriptList, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  48460. var _ref2;
  48461. if (_isArray2) {
  48462. if (_i2 >= _iterator2.length) break;
  48463. _ref2 = _iterator2[_i2++];
  48464. } else {
  48465. _i2 = _iterator2.next();
  48466. if (_i2.done) break;
  48467. _ref2 = _i2.value;
  48468. }
  48469. var entry = _ref2;
  48470. if (entry.tag === s) {
  48471. return entry;
  48472. }
  48473. }
  48474. }
  48475. return null;
  48476. };
  48477. OTProcessor.prototype.selectScript = function selectScript(script, language, direction$$) {
  48478. var changed = false;
  48479. var entry = void 0;
  48480. if (!this.script || script !== this.scriptTag) {
  48481. entry = this.findScript(script);
  48482. if (!entry) {
  48483. entry = this.findScript(DEFAULT_SCRIPTS);
  48484. }
  48485. if (!entry) {
  48486. return this.scriptTag;
  48487. }
  48488. this.scriptTag = entry.tag;
  48489. this.script = entry.script;
  48490. this.language = null;
  48491. this.languageTag = null;
  48492. changed = true;
  48493. }
  48494. if (!direction$$ || direction$$ !== this.direction) {
  48495. this.direction = direction$$ || direction(script);
  48496. }
  48497. if (language && language.length < 4) {
  48498. language += ' '.repeat(4 - language.length);
  48499. }
  48500. if (!language || language !== this.languageTag) {
  48501. this.language = null;
  48502. for (var _iterator3 = this.script.langSysRecords, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  48503. var _ref3;
  48504. if (_isArray3) {
  48505. if (_i3 >= _iterator3.length) break;
  48506. _ref3 = _iterator3[_i3++];
  48507. } else {
  48508. _i3 = _iterator3.next();
  48509. if (_i3.done) break;
  48510. _ref3 = _i3.value;
  48511. }
  48512. var lang = _ref3;
  48513. if (lang.tag === language) {
  48514. this.language = lang.langSys;
  48515. this.languageTag = lang.tag;
  48516. break;
  48517. }
  48518. }
  48519. if (!this.language) {
  48520. this.language = this.script.defaultLangSys;
  48521. this.languageTag = null;
  48522. }
  48523. changed = true;
  48524. }
  48525. // Build a feature lookup table
  48526. if (changed) {
  48527. this.features = {};
  48528. if (this.language) {
  48529. for (var _iterator4 = this.language.featureIndexes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  48530. var _ref4;
  48531. if (_isArray4) {
  48532. if (_i4 >= _iterator4.length) break;
  48533. _ref4 = _iterator4[_i4++];
  48534. } else {
  48535. _i4 = _iterator4.next();
  48536. if (_i4.done) break;
  48537. _ref4 = _i4.value;
  48538. }
  48539. var featureIndex = _ref4;
  48540. var record = this.table.featureList[featureIndex];
  48541. var substituteFeature = this.substituteFeatureForVariations(featureIndex);
  48542. this.features[record.tag] = substituteFeature || record.feature;
  48543. }
  48544. }
  48545. }
  48546. return this.scriptTag;
  48547. };
  48548. OTProcessor.prototype.lookupsForFeatures = function lookupsForFeatures() {
  48549. var userFeatures = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  48550. var exclude = arguments[1];
  48551. var lookups = [];
  48552. for (var _iterator5 = userFeatures, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
  48553. var _ref5;
  48554. if (_isArray5) {
  48555. if (_i5 >= _iterator5.length) break;
  48556. _ref5 = _iterator5[_i5++];
  48557. } else {
  48558. _i5 = _iterator5.next();
  48559. if (_i5.done) break;
  48560. _ref5 = _i5.value;
  48561. }
  48562. var tag = _ref5;
  48563. var feature = this.features[tag];
  48564. if (!feature) {
  48565. continue;
  48566. }
  48567. for (var _iterator6 = feature.lookupListIndexes, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _getIterator(_iterator6);;) {
  48568. var _ref6;
  48569. if (_isArray6) {
  48570. if (_i6 >= _iterator6.length) break;
  48571. _ref6 = _iterator6[_i6++];
  48572. } else {
  48573. _i6 = _iterator6.next();
  48574. if (_i6.done) break;
  48575. _ref6 = _i6.value;
  48576. }
  48577. var lookupIndex = _ref6;
  48578. if (exclude && exclude.indexOf(lookupIndex) !== -1) {
  48579. continue;
  48580. }
  48581. lookups.push({
  48582. feature: tag,
  48583. index: lookupIndex,
  48584. lookup: this.table.lookupList.get(lookupIndex)
  48585. });
  48586. }
  48587. }
  48588. lookups.sort(function (a, b) {
  48589. return a.index - b.index;
  48590. });
  48591. return lookups;
  48592. };
  48593. OTProcessor.prototype.substituteFeatureForVariations = function substituteFeatureForVariations(featureIndex) {
  48594. if (this.variationsIndex === -1) {
  48595. return null;
  48596. }
  48597. var record = this.table.featureVariations.featureVariationRecords[this.variationsIndex];
  48598. var substitutions = record.featureTableSubstitution.substitutions;
  48599. for (var _iterator7 = substitutions, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _getIterator(_iterator7);;) {
  48600. var _ref7;
  48601. if (_isArray7) {
  48602. if (_i7 >= _iterator7.length) break;
  48603. _ref7 = _iterator7[_i7++];
  48604. } else {
  48605. _i7 = _iterator7.next();
  48606. if (_i7.done) break;
  48607. _ref7 = _i7.value;
  48608. }
  48609. var substitution = _ref7;
  48610. if (substitution.featureIndex === featureIndex) {
  48611. return substitution.alternateFeatureTable;
  48612. }
  48613. }
  48614. return null;
  48615. };
  48616. OTProcessor.prototype.findVariationsIndex = function findVariationsIndex(coords) {
  48617. var variations = this.table.featureVariations;
  48618. if (!variations) {
  48619. return -1;
  48620. }
  48621. var records = variations.featureVariationRecords;
  48622. for (var i = 0; i < records.length; i++) {
  48623. var conditions = records[i].conditionSet.conditionTable;
  48624. if (this.variationConditionsMatch(conditions, coords)) {
  48625. return i;
  48626. }
  48627. }
  48628. return -1;
  48629. };
  48630. OTProcessor.prototype.variationConditionsMatch = function variationConditionsMatch(conditions, coords) {
  48631. return conditions.every(function (condition) {
  48632. var coord = condition.axisIndex < coords.length ? coords[condition.axisIndex] : 0;
  48633. return condition.filterRangeMinValue <= coord && coord <= condition.filterRangeMaxValue;
  48634. });
  48635. };
  48636. OTProcessor.prototype.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) {
  48637. var lookups = this.lookupsForFeatures(userFeatures);
  48638. this.applyLookups(lookups, glyphs, advances);
  48639. };
  48640. OTProcessor.prototype.applyLookups = function applyLookups(lookups, glyphs, positions) {
  48641. this.glyphs = glyphs;
  48642. this.positions = positions;
  48643. this.glyphIterator = new GlyphIterator(glyphs);
  48644. for (var _iterator8 = lookups, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _getIterator(_iterator8);;) {
  48645. var _ref8;
  48646. if (_isArray8) {
  48647. if (_i8 >= _iterator8.length) break;
  48648. _ref8 = _iterator8[_i8++];
  48649. } else {
  48650. _i8 = _iterator8.next();
  48651. if (_i8.done) break;
  48652. _ref8 = _i8.value;
  48653. }
  48654. var _ref9 = _ref8,
  48655. feature = _ref9.feature,
  48656. lookup = _ref9.lookup;
  48657. this.currentFeature = feature;
  48658. this.glyphIterator.reset(lookup.flags);
  48659. while (this.glyphIterator.index < glyphs.length) {
  48660. if (!(feature in this.glyphIterator.cur.features)) {
  48661. this.glyphIterator.next();
  48662. continue;
  48663. }
  48664. for (var _iterator9 = lookup.subTables, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _getIterator(_iterator9);;) {
  48665. var _ref10;
  48666. if (_isArray9) {
  48667. if (_i9 >= _iterator9.length) break;
  48668. _ref10 = _iterator9[_i9++];
  48669. } else {
  48670. _i9 = _iterator9.next();
  48671. if (_i9.done) break;
  48672. _ref10 = _i9.value;
  48673. }
  48674. var table = _ref10;
  48675. var res = this.applyLookup(lookup.lookupType, table);
  48676. if (res) {
  48677. break;
  48678. }
  48679. }
  48680. this.glyphIterator.next();
  48681. }
  48682. }
  48683. };
  48684. OTProcessor.prototype.applyLookup = function applyLookup(lookup, table) {
  48685. throw new Error("applyLookup must be implemented by subclasses");
  48686. };
  48687. OTProcessor.prototype.applyLookupList = function applyLookupList(lookupRecords) {
  48688. var options = this.glyphIterator.options;
  48689. var glyphIndex = this.glyphIterator.index;
  48690. for (var _iterator10 = lookupRecords, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _getIterator(_iterator10);;) {
  48691. var _ref11;
  48692. if (_isArray10) {
  48693. if (_i10 >= _iterator10.length) break;
  48694. _ref11 = _iterator10[_i10++];
  48695. } else {
  48696. _i10 = _iterator10.next();
  48697. if (_i10.done) break;
  48698. _ref11 = _i10.value;
  48699. }
  48700. var lookupRecord = _ref11;
  48701. // Reset flags and find glyph index for this lookup record
  48702. this.glyphIterator.reset(options, glyphIndex);
  48703. this.glyphIterator.increment(lookupRecord.sequenceIndex);
  48704. // Get the lookup and setup flags for subtables
  48705. var lookup = this.table.lookupList.get(lookupRecord.lookupListIndex);
  48706. this.glyphIterator.reset(lookup.flags, this.glyphIterator.index);
  48707. // Apply lookup subtables until one matches
  48708. for (var _iterator11 = lookup.subTables, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _getIterator(_iterator11);;) {
  48709. var _ref12;
  48710. if (_isArray11) {
  48711. if (_i11 >= _iterator11.length) break;
  48712. _ref12 = _iterator11[_i11++];
  48713. } else {
  48714. _i11 = _iterator11.next();
  48715. if (_i11.done) break;
  48716. _ref12 = _i11.value;
  48717. }
  48718. var table = _ref12;
  48719. if (this.applyLookup(lookup.lookupType, table)) {
  48720. break;
  48721. }
  48722. }
  48723. }
  48724. this.glyphIterator.reset(options, glyphIndex);
  48725. return true;
  48726. };
  48727. OTProcessor.prototype.coverageIndex = function coverageIndex(coverage, glyph) {
  48728. if (glyph == null) {
  48729. glyph = this.glyphIterator.cur.id;
  48730. }
  48731. switch (coverage.version) {
  48732. case 1:
  48733. return coverage.glyphs.indexOf(glyph);
  48734. case 2:
  48735. for (var _iterator12 = coverage.rangeRecords, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _getIterator(_iterator12);;) {
  48736. var _ref13;
  48737. if (_isArray12) {
  48738. if (_i12 >= _iterator12.length) break;
  48739. _ref13 = _iterator12[_i12++];
  48740. } else {
  48741. _i12 = _iterator12.next();
  48742. if (_i12.done) break;
  48743. _ref13 = _i12.value;
  48744. }
  48745. var range = _ref13;
  48746. if (range.start <= glyph && glyph <= range.end) {
  48747. return range.startCoverageIndex + glyph - range.start;
  48748. }
  48749. }
  48750. break;
  48751. }
  48752. return -1;
  48753. };
  48754. OTProcessor.prototype.match = function match(sequenceIndex, sequence, fn, matched) {
  48755. var pos = this.glyphIterator.index;
  48756. var glyph = this.glyphIterator.increment(sequenceIndex);
  48757. var idx = 0;
  48758. while (idx < sequence.length && glyph && fn(sequence[idx], glyph)) {
  48759. if (matched) {
  48760. matched.push(this.glyphIterator.index);
  48761. }
  48762. idx++;
  48763. glyph = this.glyphIterator.next();
  48764. }
  48765. this.glyphIterator.index = pos;
  48766. if (idx < sequence.length) {
  48767. return false;
  48768. }
  48769. return matched || true;
  48770. };
  48771. OTProcessor.prototype.sequenceMatches = function sequenceMatches(sequenceIndex, sequence) {
  48772. return this.match(sequenceIndex, sequence, function (component, glyph) {
  48773. return component === glyph.id;
  48774. });
  48775. };
  48776. OTProcessor.prototype.sequenceMatchIndices = function sequenceMatchIndices(sequenceIndex, sequence) {
  48777. var _this = this;
  48778. return this.match(sequenceIndex, sequence, function (component, glyph) {
  48779. // If the current feature doesn't apply to this glyph,
  48780. if (!(_this.currentFeature in glyph.features)) {
  48781. return false;
  48782. }
  48783. return component === glyph.id;
  48784. }, []);
  48785. };
  48786. OTProcessor.prototype.coverageSequenceMatches = function coverageSequenceMatches(sequenceIndex, sequence) {
  48787. var _this2 = this;
  48788. return this.match(sequenceIndex, sequence, function (coverage, glyph) {
  48789. return _this2.coverageIndex(coverage, glyph.id) >= 0;
  48790. });
  48791. };
  48792. OTProcessor.prototype.getClassID = function getClassID(glyph, classDef) {
  48793. switch (classDef.version) {
  48794. case 1:
  48795. // Class array
  48796. var i = glyph - classDef.startGlyph;
  48797. if (i >= 0 && i < classDef.classValueArray.length) {
  48798. return classDef.classValueArray[i];
  48799. }
  48800. break;
  48801. case 2:
  48802. for (var _iterator13 = classDef.classRangeRecord, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _getIterator(_iterator13);;) {
  48803. var _ref14;
  48804. if (_isArray13) {
  48805. if (_i13 >= _iterator13.length) break;
  48806. _ref14 = _iterator13[_i13++];
  48807. } else {
  48808. _i13 = _iterator13.next();
  48809. if (_i13.done) break;
  48810. _ref14 = _i13.value;
  48811. }
  48812. var range = _ref14;
  48813. if (range.start <= glyph && glyph <= range.end) {
  48814. return range.class;
  48815. }
  48816. }
  48817. break;
  48818. }
  48819. return 0;
  48820. };
  48821. OTProcessor.prototype.classSequenceMatches = function classSequenceMatches(sequenceIndex, sequence, classDef) {
  48822. var _this3 = this;
  48823. return this.match(sequenceIndex, sequence, function (classID, glyph) {
  48824. return classID === _this3.getClassID(glyph.id, classDef);
  48825. });
  48826. };
  48827. OTProcessor.prototype.applyContext = function applyContext(table) {
  48828. switch (table.version) {
  48829. case 1:
  48830. var index = this.coverageIndex(table.coverage);
  48831. if (index === -1) {
  48832. return false;
  48833. }
  48834. var set = table.ruleSets[index];
  48835. for (var _iterator14 = set, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _getIterator(_iterator14);;) {
  48836. var _ref15;
  48837. if (_isArray14) {
  48838. if (_i14 >= _iterator14.length) break;
  48839. _ref15 = _iterator14[_i14++];
  48840. } else {
  48841. _i14 = _iterator14.next();
  48842. if (_i14.done) break;
  48843. _ref15 = _i14.value;
  48844. }
  48845. var rule = _ref15;
  48846. if (this.sequenceMatches(1, rule.input)) {
  48847. return this.applyLookupList(rule.lookupRecords);
  48848. }
  48849. }
  48850. break;
  48851. case 2:
  48852. if (this.coverageIndex(table.coverage) === -1) {
  48853. return false;
  48854. }
  48855. index = this.getClassID(this.glyphIterator.cur.id, table.classDef);
  48856. if (index === -1) {
  48857. return false;
  48858. }
  48859. set = table.classSet[index];
  48860. for (var _iterator15 = set, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _getIterator(_iterator15);;) {
  48861. var _ref16;
  48862. if (_isArray15) {
  48863. if (_i15 >= _iterator15.length) break;
  48864. _ref16 = _iterator15[_i15++];
  48865. } else {
  48866. _i15 = _iterator15.next();
  48867. if (_i15.done) break;
  48868. _ref16 = _i15.value;
  48869. }
  48870. var _rule = _ref16;
  48871. if (this.classSequenceMatches(1, _rule.classes, table.classDef)) {
  48872. return this.applyLookupList(_rule.lookupRecords);
  48873. }
  48874. }
  48875. break;
  48876. case 3:
  48877. if (this.coverageSequenceMatches(0, table.coverages)) {
  48878. return this.applyLookupList(table.lookupRecords);
  48879. }
  48880. break;
  48881. }
  48882. return false;
  48883. };
  48884. OTProcessor.prototype.applyChainingContext = function applyChainingContext(table) {
  48885. switch (table.version) {
  48886. case 1:
  48887. var index = this.coverageIndex(table.coverage);
  48888. if (index === -1) {
  48889. return false;
  48890. }
  48891. var set = table.chainRuleSets[index];
  48892. for (var _iterator16 = set, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _getIterator(_iterator16);;) {
  48893. var _ref17;
  48894. if (_isArray16) {
  48895. if (_i16 >= _iterator16.length) break;
  48896. _ref17 = _iterator16[_i16++];
  48897. } else {
  48898. _i16 = _iterator16.next();
  48899. if (_i16.done) break;
  48900. _ref17 = _i16.value;
  48901. }
  48902. var rule = _ref17;
  48903. if (this.sequenceMatches(-rule.backtrack.length, rule.backtrack) && this.sequenceMatches(1, rule.input) && this.sequenceMatches(1 + rule.input.length, rule.lookahead)) {
  48904. return this.applyLookupList(rule.lookupRecords);
  48905. }
  48906. }
  48907. break;
  48908. case 2:
  48909. if (this.coverageIndex(table.coverage) === -1) {
  48910. return false;
  48911. }
  48912. index = this.getClassID(this.glyphIterator.cur.id, table.inputClassDef);
  48913. var rules = table.chainClassSet[index];
  48914. if (!rules) {
  48915. return false;
  48916. }
  48917. for (var _iterator17 = rules, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _getIterator(_iterator17);;) {
  48918. var _ref18;
  48919. if (_isArray17) {
  48920. if (_i17 >= _iterator17.length) break;
  48921. _ref18 = _iterator17[_i17++];
  48922. } else {
  48923. _i17 = _iterator17.next();
  48924. if (_i17.done) break;
  48925. _ref18 = _i17.value;
  48926. }
  48927. var _rule2 = _ref18;
  48928. if (this.classSequenceMatches(-_rule2.backtrack.length, _rule2.backtrack, table.backtrackClassDef) && this.classSequenceMatches(1, _rule2.input, table.inputClassDef) && this.classSequenceMatches(1 + _rule2.input.length, _rule2.lookahead, table.lookaheadClassDef)) {
  48929. return this.applyLookupList(_rule2.lookupRecords);
  48930. }
  48931. }
  48932. break;
  48933. case 3:
  48934. if (this.coverageSequenceMatches(-table.backtrackGlyphCount, table.backtrackCoverage) && this.coverageSequenceMatches(0, table.inputCoverage) && this.coverageSequenceMatches(table.inputGlyphCount, table.lookaheadCoverage)) {
  48935. return this.applyLookupList(table.lookupRecords);
  48936. }
  48937. break;
  48938. }
  48939. return false;
  48940. };
  48941. return OTProcessor;
  48942. }();
  48943. var GlyphInfo = function () {
  48944. function GlyphInfo(font, id) {
  48945. var codePoints = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  48946. var features = arguments[3];
  48947. _classCallCheck(this, GlyphInfo);
  48948. this._font = font;
  48949. this.codePoints = codePoints;
  48950. this.id = id;
  48951. this.features = {};
  48952. if (Array.isArray(features)) {
  48953. for (var i = 0; i < features.length; i++) {
  48954. var feature = features[i];
  48955. this.features[feature] = true;
  48956. }
  48957. } else if ((typeof features === 'undefined' ? 'undefined' : _typeof(features)) === 'object') {
  48958. _Object$assign(this.features, features);
  48959. }
  48960. this.ligatureID = null;
  48961. this.ligatureComponent = null;
  48962. this.isLigated = false;
  48963. this.cursiveAttachment = null;
  48964. this.markAttachment = null;
  48965. this.shaperInfo = null;
  48966. this.substituted = false;
  48967. this.isMultiplied = false;
  48968. }
  48969. GlyphInfo.prototype.copy = function copy() {
  48970. return new GlyphInfo(this._font, this.id, this.codePoints, this.features);
  48971. };
  48972. _createClass(GlyphInfo, [{
  48973. key: 'id',
  48974. get: function get() {
  48975. return this._id;
  48976. },
  48977. set: function set(id) {
  48978. this._id = id;
  48979. this.substituted = true;
  48980. var GDEF = this._font.GDEF;
  48981. if (GDEF && GDEF.glyphClassDef) {
  48982. // TODO: clean this up
  48983. var classID = OTProcessor.prototype.getClassID(id, GDEF.glyphClassDef);
  48984. this.isBase = classID === 1;
  48985. this.isLigature = classID === 2;
  48986. this.isMark = classID === 3;
  48987. this.markAttachmentType = GDEF.markAttachClassDef ? OTProcessor.prototype.getClassID(id, GDEF.markAttachClassDef) : 0;
  48988. } else {
  48989. this.isMark = this.codePoints.every(unicode.isMark);
  48990. this.isBase = !this.isMark;
  48991. this.isLigature = this.codePoints.length > 1;
  48992. this.markAttachmentType = 0;
  48993. }
  48994. }
  48995. }]);
  48996. return GlyphInfo;
  48997. }();
  48998. var _class$5;
  48999. var _temp$1;
  49000. /**
  49001. * This is a shaper for the Hangul script, used by the Korean language.
  49002. * It does the following:
  49003. * - decompose if unsupported by the font:
  49004. * <LV> -> <L,V>
  49005. * <LVT> -> <L,V,T>
  49006. * <LV,T> -> <L,V,T>
  49007. *
  49008. * - compose if supported by the font:
  49009. * <L,V> -> <LV>
  49010. * <L,V,T> -> <LVT>
  49011. * <LV,T> -> <LVT>
  49012. *
  49013. * - reorder tone marks (S is any valid syllable):
  49014. * <S, M> -> <M, S>
  49015. *
  49016. * - apply ljmo, vjmo, and tjmo OpenType features to decomposed Jamo sequences.
  49017. *
  49018. * This logic is based on the following documents:
  49019. * - http://www.microsoft.com/typography/OpenTypeDev/hangul/intro.htm
  49020. * - http://ktug.org/~nomos/harfbuzz-hangul/hangulshaper.pdf
  49021. */
  49022. var HangulShaper = (_temp$1 = _class$5 = function (_DefaultShaper) {
  49023. _inherits(HangulShaper, _DefaultShaper);
  49024. function HangulShaper() {
  49025. _classCallCheck(this, HangulShaper);
  49026. return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
  49027. }
  49028. HangulShaper.planFeatures = function planFeatures(plan) {
  49029. plan.add(['ljmo', 'vjmo', 'tjmo'], false);
  49030. };
  49031. HangulShaper.assignFeatures = function assignFeatures(plan, glyphs) {
  49032. var state = 0;
  49033. var i = 0;
  49034. while (i < glyphs.length) {
  49035. var action = void 0;
  49036. var glyph = glyphs[i];
  49037. var code = glyph.codePoints[0];
  49038. var type = getType(code);
  49039. var _STATE_TABLE$state$ty = STATE_TABLE$1[state][type];
  49040. action = _STATE_TABLE$state$ty[0];
  49041. state = _STATE_TABLE$state$ty[1];
  49042. switch (action) {
  49043. case DECOMPOSE:
  49044. // Decompose the composed syllable if it is not supported by the font.
  49045. if (!plan.font.hasGlyphForCodePoint(code)) {
  49046. i = decompose(glyphs, i, plan.font);
  49047. }
  49048. break;
  49049. case COMPOSE:
  49050. // Found a decomposed syllable. Try to compose if supported by the font.
  49051. i = compose(glyphs, i, plan.font);
  49052. break;
  49053. case TONE_MARK:
  49054. // Got a valid syllable, followed by a tone mark. Move the tone mark to the beginning of the syllable.
  49055. reorderToneMark(glyphs, i, plan.font);
  49056. break;
  49057. case INVALID:
  49058. // Tone mark has no valid syllable to attach to, so insert a dotted circle
  49059. i = insertDottedCircle(glyphs, i, plan.font);
  49060. break;
  49061. }
  49062. i++;
  49063. }
  49064. };
  49065. return HangulShaper;
  49066. }(DefaultShaper), _class$5.zeroMarkWidths = 'NONE', _temp$1);
  49067. var HANGUL_BASE = 0xac00;
  49068. var HANGUL_END = 0xd7a4;
  49069. var HANGUL_COUNT = HANGUL_END - HANGUL_BASE + 1;
  49070. var L_BASE = 0x1100; // lead
  49071. var V_BASE = 0x1161; // vowel
  49072. var T_BASE = 0x11a7; // trail
  49073. var L_COUNT = 19;
  49074. var V_COUNT = 21;
  49075. var T_COUNT = 28;
  49076. var L_END = L_BASE + L_COUNT - 1;
  49077. var V_END = V_BASE + V_COUNT - 1;
  49078. var T_END = T_BASE + T_COUNT - 1;
  49079. var DOTTED_CIRCLE = 0x25cc;
  49080. var isL = function isL(code) {
  49081. return 0x1100 <= code && code <= 0x115f || 0xa960 <= code && code <= 0xa97c;
  49082. };
  49083. var isV = function isV(code) {
  49084. return 0x1160 <= code && code <= 0x11a7 || 0xd7b0 <= code && code <= 0xd7c6;
  49085. };
  49086. var isT = function isT(code) {
  49087. return 0x11a8 <= code && code <= 0x11ff || 0xd7cb <= code && code <= 0xd7fb;
  49088. };
  49089. var isTone = function isTone(code) {
  49090. return 0x302e <= code && code <= 0x302f;
  49091. };
  49092. var isLVT = function isLVT(code) {
  49093. return HANGUL_BASE <= code && code <= HANGUL_END;
  49094. };
  49095. var isLV = function isLV(code) {
  49096. return code - HANGUL_BASE < HANGUL_COUNT && (code - HANGUL_BASE) % T_COUNT === 0;
  49097. };
  49098. var isCombiningL = function isCombiningL(code) {
  49099. return L_BASE <= code && code <= L_END;
  49100. };
  49101. var isCombiningV = function isCombiningV(code) {
  49102. return V_BASE <= code && code <= V_END;
  49103. };
  49104. var isCombiningT = function isCombiningT(code) {
  49105. return T_BASE + 1 && 1 <= code && code <= T_END;
  49106. };
  49107. // Character categories
  49108. var X = 0; // Other character
  49109. var L = 1; // Leading consonant
  49110. var V = 2; // Medial vowel
  49111. var T = 3; // Trailing consonant
  49112. var LV = 4; // Composed <LV> syllable
  49113. var LVT = 5; // Composed <LVT> syllable
  49114. var M = 6; // Tone mark
  49115. // This function classifies a character using the above categories.
  49116. function getType(code) {
  49117. if (isL(code)) {
  49118. return L;
  49119. }
  49120. if (isV(code)) {
  49121. return V;
  49122. }
  49123. if (isT(code)) {
  49124. return T;
  49125. }
  49126. if (isLV(code)) {
  49127. return LV;
  49128. }
  49129. if (isLVT(code)) {
  49130. return LVT;
  49131. }
  49132. if (isTone(code)) {
  49133. return M;
  49134. }
  49135. return X;
  49136. }
  49137. // State machine actions
  49138. var NO_ACTION = 0;
  49139. var DECOMPOSE = 1;
  49140. var COMPOSE = 2;
  49141. var TONE_MARK = 4;
  49142. var INVALID = 5;
  49143. // Build a state machine that accepts valid syllables, and applies actions along the way.
  49144. // The logic this is implementing is documented at the top of the file.
  49145. var STATE_TABLE$1 = [
  49146. // X L V T LV LVT M
  49147. // State 0: start state
  49148. [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],
  49149. // State 1: <L>
  49150. [[NO_ACTION, 0], [NO_ACTION, 1], [COMPOSE, 2], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],
  49151. // State 2: <L,V> or <LV>
  49152. [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [COMPOSE, 3], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]],
  49153. // State 3: <L,V,T> or <LVT>
  49154. [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]]];
  49155. function getGlyph(font, code, features) {
  49156. return new GlyphInfo(font, font.glyphForCodePoint(code).id, [code], features);
  49157. }
  49158. function decompose(glyphs, i, font) {
  49159. var glyph = glyphs[i];
  49160. var code = glyph.codePoints[0];
  49161. var s = code - HANGUL_BASE;
  49162. var t = T_BASE + s % T_COUNT;
  49163. s = s / T_COUNT | 0;
  49164. var l = L_BASE + s / V_COUNT | 0;
  49165. var v = V_BASE + s % V_COUNT;
  49166. // Don't decompose if all of the components are not available
  49167. if (!font.hasGlyphForCodePoint(l) || !font.hasGlyphForCodePoint(v) || t !== T_BASE && !font.hasGlyphForCodePoint(t)) {
  49168. return i;
  49169. }
  49170. // Replace the current glyph with decomposed L, V, and T glyphs,
  49171. // and apply the proper OpenType features to each component.
  49172. var ljmo = getGlyph(font, l, glyph.features);
  49173. ljmo.features.ljmo = true;
  49174. var vjmo = getGlyph(font, v, glyph.features);
  49175. vjmo.features.vjmo = true;
  49176. var insert = [ljmo, vjmo];
  49177. if (t > T_BASE) {
  49178. var tjmo = getGlyph(font, t, glyph.features);
  49179. tjmo.features.tjmo = true;
  49180. insert.push(tjmo);
  49181. }
  49182. glyphs.splice.apply(glyphs, [i, 1].concat(insert));
  49183. return i + insert.length - 1;
  49184. }
  49185. function compose(glyphs, i, font) {
  49186. var glyph = glyphs[i];
  49187. var code = glyphs[i].codePoints[0];
  49188. var type = getType(code);
  49189. var prev = glyphs[i - 1].codePoints[0];
  49190. var prevType = getType(prev);
  49191. // Figure out what type of syllable we're dealing with
  49192. var lv = void 0,
  49193. ljmo = void 0,
  49194. vjmo = void 0,
  49195. tjmo = void 0;
  49196. if (prevType === LV && type === T) {
  49197. // <LV,T>
  49198. lv = prev;
  49199. tjmo = glyph;
  49200. } else {
  49201. if (type === V) {
  49202. // <L,V>
  49203. ljmo = glyphs[i - 1];
  49204. vjmo = glyph;
  49205. } else {
  49206. // <L,V,T>
  49207. ljmo = glyphs[i - 2];
  49208. vjmo = glyphs[i - 1];
  49209. tjmo = glyph;
  49210. }
  49211. var l = ljmo.codePoints[0];
  49212. var v = vjmo.codePoints[0];
  49213. // Make sure L and V are combining characters
  49214. if (isCombiningL(l) && isCombiningV(v)) {
  49215. lv = HANGUL_BASE + ((l - L_BASE) * V_COUNT + (v - V_BASE)) * T_COUNT;
  49216. }
  49217. }
  49218. var t = tjmo && tjmo.codePoints[0] || T_BASE;
  49219. if (lv != null && (t === T_BASE || isCombiningT(t))) {
  49220. var s = lv + (t - T_BASE);
  49221. // Replace with a composed glyph if supported by the font,
  49222. // otherwise apply the proper OpenType features to each component.
  49223. if (font.hasGlyphForCodePoint(s)) {
  49224. var del = prevType === V ? 3 : 2;
  49225. glyphs.splice(i - del + 1, del, getGlyph(font, s, glyph.features));
  49226. return i - del + 1;
  49227. }
  49228. }
  49229. // Didn't compose (either a non-combining component or unsupported by font).
  49230. if (ljmo) {
  49231. ljmo.features.ljmo = true;
  49232. }
  49233. if (vjmo) {
  49234. vjmo.features.vjmo = true;
  49235. }
  49236. if (tjmo) {
  49237. tjmo.features.tjmo = true;
  49238. }
  49239. if (prevType === LV) {
  49240. // Sequence was originally <L,V>, which got combined earlier.
  49241. // Either the T was non-combining, or the LVT glyph wasn't supported.
  49242. // Decompose the glyph again and apply OT features.
  49243. decompose(glyphs, i - 1, font);
  49244. return i + 1;
  49245. }
  49246. return i;
  49247. }
  49248. function getLength(code) {
  49249. switch (getType(code)) {
  49250. case LV:
  49251. case LVT:
  49252. return 1;
  49253. case V:
  49254. return 2;
  49255. case T:
  49256. return 3;
  49257. }
  49258. }
  49259. function reorderToneMark(glyphs, i, font) {
  49260. var glyph = glyphs[i];
  49261. var code = glyphs[i].codePoints[0];
  49262. // Move tone mark to the beginning of the previous syllable, unless it is zero width
  49263. if (font.glyphForCodePoint(code).advanceWidth === 0) {
  49264. return;
  49265. }
  49266. var prev = glyphs[i - 1].codePoints[0];
  49267. var len = getLength(prev);
  49268. glyphs.splice(i, 1);
  49269. return glyphs.splice(i - len, 0, glyph);
  49270. }
  49271. function insertDottedCircle(glyphs, i, font) {
  49272. var glyph = glyphs[i];
  49273. var code = glyphs[i].codePoints[0];
  49274. if (font.hasGlyphForCodePoint(DOTTED_CIRCLE)) {
  49275. var dottedCircle = getGlyph(font, DOTTED_CIRCLE, glyph.features);
  49276. // If the tone mark is zero width, insert the dotted circle before, otherwise after
  49277. var idx = font.glyphForCodePoint(code).advanceWidth === 0 ? i : i + 1;
  49278. glyphs.splice(idx, 0, dottedCircle);
  49279. i++;
  49280. }
  49281. return i;
  49282. }
  49283. var stateTable = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 11, 12, 13, 14, 15, 16, 17], [0, 0, 0, 18, 19, 20, 21, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 28, 29, 30, 31, 32, 33, 0, 34, 0, 0, 35, 36, 0, 0, 37, 0], [0, 0, 0, 38, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 39, 0, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 43, 44, 44, 8, 9, 0, 0, 0, 0, 12, 43, 0, 0, 0, 0], [0, 0, 0, 0, 43, 44, 44, 8, 9, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0], [0, 0, 0, 45, 46, 47, 48, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 50, 0, 0, 51, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 53, 54, 55, 56, 57, 58, 0, 59, 0, 0, 60, 61, 0, 0, 62, 0], [0, 0, 0, 4, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 63, 64, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 63, 0, 0], [0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 11, 12, 13, 0, 2, 16, 0], [0, 0, 0, 18, 65, 20, 21, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 0, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 0, 0], [0, 0, 0, 69, 0, 70, 70, 0, 71, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 73, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 75, 0, 0, 0, 76, 77, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 79, 80, 80, 22, 23, 0, 0, 0, 0, 25, 79, 0, 0, 0, 0], [0, 0, 0, 18, 19, 20, 74, 22, 23, 0, 24, 0, 0, 25, 26, 0, 0, 27, 0], [0, 0, 0, 81, 82, 83, 84, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 86, 0, 0, 87, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 18, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 89, 90, 0, 0, 76, 77, 0, 23, 0, 24, 0, 0, 0, 78, 0, 89, 0, 0], [0, 0, 0, 0, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 0, 0], [0, 0, 0, 94, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 96, 0, 0, 0, 97, 98, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 35, 100, 0, 0, 0, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0], [0, 0, 0, 102, 103, 104, 105, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 107, 0, 0, 108, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 28, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 110, 111, 0, 0, 97, 98, 0, 33, 0, 34, 0, 0, 0, 99, 0, 110, 0, 0], [0, 0, 0, 0, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 0, 0], [0, 0, 0, 0, 5, 7, 7, 8, 9, 0, 10, 0, 0, 0, 13, 0, 0, 16, 0], [0, 0, 0, 115, 116, 117, 118, 8, 9, 0, 10, 0, 0, 119, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 39, 0, 122, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 124, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0], [0, 39, 0, 0, 0, 121, 125, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 126, 126, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 46, 47, 48, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 47, 47, 49, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 127, 127, 49, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 128, 127, 127, 49, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 129, 130, 131, 132, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 135, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 136, 0, 0, 0, 137, 138, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 140, 141, 141, 57, 58, 0, 0, 0, 0, 60, 140, 0, 0, 0, 0], [0, 0, 0, 0, 140, 141, 141, 57, 58, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0], [0, 0, 0, 142, 143, 144, 145, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 147, 0, 0, 148, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 53, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 150, 151, 0, 0, 137, 138, 0, 58, 0, 59, 0, 0, 0, 139, 0, 150, 0, 0], [0, 0, 0, 0, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 0, 0], [0, 0, 0, 155, 116, 156, 157, 8, 9, 0, 10, 0, 0, 158, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 75, 3, 4, 5, 159, 160, 8, 161, 0, 162, 0, 11, 12, 163, 0, 75, 16, 0], [0, 0, 0, 0, 0, 40, 164, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 0, 165, 0, 0, 0, 0], [0, 124, 64, 0, 0, 40, 164, 0, 9, 0, 10, 0, 0, 0, 42, 0, 124, 0, 0], [0, 0, 0, 0, 0, 70, 70, 0, 71, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 166, 0, 0, 167, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 19, 74, 74, 22, 23, 0, 24, 0, 0, 0, 26, 0, 0, 27, 0], [0, 0, 0, 0, 79, 80, 80, 22, 23, 0, 0, 0, 0, 0, 79, 0, 0, 0, 0], [0, 0, 0, 169, 170, 171, 172, 22, 23, 0, 24, 0, 0, 173, 174, 0, 0, 27, 0], [0, 0, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 75, 0, 176, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 178, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0], [0, 75, 0, 0, 0, 175, 179, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 180, 180, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 82, 83, 84, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 83, 83, 85, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 181, 181, 85, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 182, 181, 181, 85, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 183, 184, 185, 186, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 189, 170, 190, 191, 22, 23, 0, 24, 0, 0, 192, 174, 0, 0, 27, 0], [0, 0, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 76, 193, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 0, 194, 0, 0, 0, 0], [0, 178, 90, 0, 0, 76, 193, 0, 23, 0, 24, 0, 0, 0, 78, 0, 178, 0, 0], [0, 0, 0, 0, 29, 95, 31, 32, 33, 0, 34, 0, 0, 0, 36, 0, 0, 37, 0], [0, 0, 0, 0, 100, 101, 101, 32, 33, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0], [0, 0, 0, 195, 196, 197, 198, 32, 33, 0, 34, 0, 0, 199, 200, 0, 0, 37, 0], [0, 0, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 96, 0, 202, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 204, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0], [0, 96, 0, 0, 0, 201, 205, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 206, 206, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 103, 104, 105, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 104, 104, 106, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 207, 207, 106, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 208, 207, 207, 106, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 209, 210, 211, 212, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 215, 196, 216, 217, 32, 33, 0, 34, 0, 0, 218, 200, 0, 0, 37, 0], [0, 0, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 97, 219, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0], [0, 204, 111, 0, 0, 97, 219, 0, 33, 0, 34, 0, 0, 0, 99, 0, 204, 0, 0], [0, 0, 0, 221, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 223, 0, 0, 0, 40, 224, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 119, 225, 0, 0, 0, 0], [0, 0, 0, 115, 116, 117, 222, 8, 9, 0, 10, 0, 0, 119, 120, 0, 0, 16, 0], [0, 0, 0, 115, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 226, 64, 0, 0, 40, 224, 0, 9, 0, 10, 0, 0, 0, 42, 0, 226, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 39, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 44, 44, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 228, 229, 0, 9, 0, 10, 0, 0, 230, 0, 0, 0, 0, 0], [0, 39, 0, 122, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 39, 0, 0], [0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 231, 231, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 130, 131, 132, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 131, 131, 133, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 233, 233, 133, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 234, 233, 233, 133, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 235, 236, 237, 238, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 54, 56, 56, 57, 58, 0, 59, 0, 0, 0, 61, 0, 0, 62, 0], [0, 0, 0, 240, 241, 242, 243, 57, 58, 0, 59, 0, 0, 244, 245, 0, 0, 62, 0], [0, 0, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 136, 0, 247, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 249, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0], [0, 136, 0, 0, 0, 246, 250, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 251, 251, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 143, 144, 145, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 144, 144, 146, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 252, 252, 146, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 253, 252, 252, 146, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 254, 255, 256, 257, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 260, 241, 261, 262, 57, 58, 0, 59, 0, 0, 263, 245, 0, 0, 62, 0], [0, 0, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 137, 264, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0], [0, 249, 151, 0, 0, 137, 264, 0, 58, 0, 59, 0, 0, 0, 139, 0, 249, 0, 0], [0, 0, 0, 221, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 158, 225, 0, 0, 0, 0], [0, 0, 0, 155, 116, 156, 222, 8, 9, 0, 10, 0, 0, 158, 120, 0, 0, 16, 0], [0, 0, 0, 155, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 43, 266, 266, 8, 161, 0, 24, 0, 0, 12, 267, 0, 0, 0, 0], [0, 75, 0, 176, 43, 268, 268, 269, 161, 0, 24, 0, 0, 0, 267, 0, 75, 0, 0], [0, 0, 0, 0, 0, 270, 0, 0, 271, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0], [0, 273, 274, 0, 0, 40, 41, 0, 9, 0, 10, 0, 0, 0, 42, 0, 273, 0, 0], [0, 0, 0, 40, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 121, 275, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 277, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 279, 0, 0, 0, 76, 280, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 173, 281, 0, 0, 0, 0], [0, 0, 0, 169, 170, 171, 278, 22, 23, 0, 24, 0, 0, 173, 174, 0, 0, 27, 0], [0, 0, 0, 169, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 282, 90, 0, 0, 76, 280, 0, 23, 0, 24, 0, 0, 0, 78, 0, 282, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 75, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 80, 80, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 284, 285, 0, 23, 0, 24, 0, 0, 286, 0, 0, 0, 0, 0], [0, 75, 0, 176, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 75, 0, 0], [0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 287, 287, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 184, 185, 186, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 185, 185, 187, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 289, 289, 187, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 290, 289, 289, 187, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 291, 292, 293, 294, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 277, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 192, 281, 0, 0, 0, 0], [0, 0, 0, 189, 170, 190, 278, 22, 23, 0, 24, 0, 0, 192, 174, 0, 0, 27, 0], [0, 0, 0, 189, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 76, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 175, 296, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 297, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 299, 0, 0, 0, 97, 300, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 199, 301, 0, 0, 0, 0], [0, 0, 0, 195, 196, 197, 298, 32, 33, 0, 34, 0, 0, 199, 200, 0, 0, 37, 0], [0, 0, 0, 195, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 302, 111, 0, 0, 97, 300, 0, 33, 0, 34, 0, 0, 0, 99, 0, 302, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 96, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 101, 101, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 304, 305, 0, 33, 0, 34, 0, 0, 306, 0, 0, 0, 0, 0], [0, 96, 0, 202, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 96, 0, 0], [0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 307, 307, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 210, 211, 212, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 211, 211, 213, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 309, 309, 213, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 310, 309, 309, 213, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 311, 312, 313, 314, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 297, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 218, 301, 0, 0, 0, 0], [0, 0, 0, 215, 196, 216, 298, 32, 33, 0, 34, 0, 0, 218, 200, 0, 0, 37, 0], [0, 0, 0, 215, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 97, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 201, 316, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 116, 222, 222, 8, 9, 0, 10, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 9, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0], [0, 0, 0, 317, 318, 319, 320, 8, 9, 0, 10, 0, 0, 321, 322, 0, 0, 16, 0], [0, 223, 0, 323, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 223, 0, 0, 0, 121, 324, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 325, 318, 326, 327, 8, 9, 0, 10, 0, 0, 328, 322, 0, 0, 16, 0], [0, 0, 0, 64, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 228, 121, 0, 9, 0, 10, 0, 0, 230, 0, 0, 0, 0, 0], [0, 0, 0, 227, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0], [0, 0, 0, 0, 0, 329, 329, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 236, 237, 238, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 237, 237, 239, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 331, 331, 239, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 332, 331, 331, 239, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 333, 40, 121, 334, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 335, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 337, 0, 0, 0, 137, 338, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 244, 339, 0, 0, 0, 0], [0, 0, 0, 240, 241, 242, 336, 57, 58, 0, 59, 0, 0, 244, 245, 0, 0, 62, 0], [0, 0, 0, 240, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 340, 151, 0, 0, 137, 338, 0, 58, 0, 59, 0, 0, 0, 139, 0, 340, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 136, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 141, 141, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 342, 343, 0, 58, 0, 59, 0, 0, 344, 0, 0, 0, 0, 0], [0, 136, 0, 247, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 136, 0, 0], [0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 345, 345, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 255, 256, 257, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 256, 256, 258, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 347, 347, 258, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 348, 347, 347, 258, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 349, 350, 351, 352, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 335, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 263, 339, 0, 0, 0, 0], [0, 0, 0, 260, 241, 261, 336, 57, 58, 0, 59, 0, 0, 263, 245, 0, 0, 62, 0], [0, 0, 0, 260, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 137, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 246, 354, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 126, 126, 8, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 355, 90, 0, 0, 121, 125, 0, 9, 0, 10, 0, 0, 0, 42, 0, 355, 0, 0], [0, 0, 0, 0, 0, 356, 356, 269, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 357, 358, 359, 360, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 364, 116, 365, 366, 8, 161, 0, 162, 0, 0, 367, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 40, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 170, 278, 278, 22, 23, 0, 24, 0, 0, 0, 174, 0, 0, 27, 0], [0, 0, 0, 0, 281, 80, 80, 22, 23, 0, 0, 0, 0, 0, 281, 0, 0, 0, 0], [0, 0, 0, 369, 370, 371, 372, 22, 23, 0, 24, 0, 0, 373, 374, 0, 0, 27, 0], [0, 279, 0, 375, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 279, 0, 0, 0, 175, 376, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 377, 370, 378, 379, 22, 23, 0, 24, 0, 0, 380, 374, 0, 0, 27, 0], [0, 0, 0, 90, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 286, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 284, 175, 0, 23, 0, 24, 0, 0, 286, 0, 0, 0, 0, 0], [0, 0, 0, 283, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0], [0, 0, 0, 0, 0, 381, 381, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 292, 293, 294, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 293, 293, 295, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 0, 383, 383, 295, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 384, 383, 383, 295, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 385, 76, 175, 386, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 76, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 196, 298, 298, 32, 33, 0, 34, 0, 0, 0, 200, 0, 0, 37, 0], [0, 0, 0, 0, 301, 101, 101, 32, 33, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0], [0, 0, 0, 387, 388, 389, 390, 32, 33, 0, 34, 0, 0, 391, 392, 0, 0, 37, 0], [0, 299, 0, 393, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 299, 0, 0, 0, 201, 394, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 395, 388, 396, 397, 32, 33, 0, 34, 0, 0, 398, 392, 0, 0, 37, 0], [0, 0, 0, 111, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 304, 201, 0, 33, 0, 34, 0, 0, 306, 0, 0, 0, 0, 0], [0, 0, 0, 303, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0], [0, 0, 0, 0, 0, 399, 399, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 312, 313, 314, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 313, 313, 315, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 0, 401, 401, 315, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 402, 401, 401, 315, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 403, 97, 201, 404, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 97, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 405, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 407, 0, 0, 0, 40, 408, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 321, 409, 0, 0, 0, 0], [0, 0, 0, 317, 318, 319, 406, 8, 9, 0, 10, 0, 0, 321, 322, 0, 0, 16, 0], [0, 0, 0, 317, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 410, 64, 0, 0, 40, 408, 0, 9, 0, 10, 0, 0, 0, 42, 0, 410, 0, 0], [0, 223, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 223, 0, 323, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 223, 0, 0], [0, 0, 0, 405, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 328, 409, 0, 0, 0, 0], [0, 0, 0, 325, 318, 326, 406, 8, 9, 0, 10, 0, 0, 328, 322, 0, 0, 16, 0], [0, 0, 0, 325, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0], [0, 0, 0, 0, 0, 411, 411, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 40, 121, 334, 0, 9, 0, 10, 0, 0, 0, 42, 0, 0, 0, 0], [0, 0, 0, 0, 413, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 241, 336, 336, 57, 58, 0, 59, 0, 0, 0, 245, 0, 0, 62, 0], [0, 0, 0, 0, 339, 141, 141, 57, 58, 0, 0, 0, 0, 0, 339, 0, 0, 0, 0], [0, 0, 0, 414, 415, 416, 417, 57, 58, 0, 59, 0, 0, 418, 419, 0, 0, 62, 0], [0, 337, 0, 420, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 337, 0, 0, 0, 246, 421, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 422, 415, 423, 424, 57, 58, 0, 59, 0, 0, 425, 419, 0, 0, 62, 0], [0, 0, 0, 151, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 342, 246, 0, 58, 0, 59, 0, 0, 344, 0, 0, 0, 0, 0], [0, 0, 0, 341, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0], [0, 0, 0, 0, 0, 426, 426, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 350, 351, 352, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 351, 351, 353, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 0, 428, 428, 353, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 429, 428, 428, 353, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 430, 137, 246, 431, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 137, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 432, 116, 433, 434, 8, 161, 0, 162, 0, 0, 435, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 180, 180, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 358, 359, 360, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 359, 359, 361, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 436, 436, 361, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 437, 436, 436, 361, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 438, 439, 440, 441, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 443, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 444, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 367, 225, 0, 0, 0, 0], [0, 0, 0, 364, 116, 365, 445, 8, 161, 0, 162, 0, 0, 367, 120, 0, 0, 16, 0], [0, 0, 0, 364, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 446, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 448, 0, 0, 0, 76, 449, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 373, 450, 0, 0, 0, 0], [0, 0, 0, 369, 370, 371, 447, 22, 23, 0, 24, 0, 0, 373, 374, 0, 0, 27, 0], [0, 0, 0, 369, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 451, 90, 0, 0, 76, 449, 0, 23, 0, 24, 0, 0, 0, 78, 0, 451, 0, 0], [0, 279, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 279, 0, 375, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 279, 0, 0], [0, 0, 0, 446, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 380, 450, 0, 0, 0, 0], [0, 0, 0, 377, 370, 378, 447, 22, 23, 0, 24, 0, 0, 380, 374, 0, 0, 27, 0], [0, 0, 0, 377, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 0, 0], [0, 0, 0, 0, 0, 452, 452, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 76, 175, 386, 0, 23, 0, 24, 0, 0, 0, 78, 0, 0, 0, 0], [0, 0, 0, 0, 454, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 455, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 457, 0, 0, 0, 97, 458, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 391, 459, 0, 0, 0, 0], [0, 0, 0, 387, 388, 389, 456, 32, 33, 0, 34, 0, 0, 391, 392, 0, 0, 37, 0], [0, 0, 0, 387, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 460, 111, 0, 0, 97, 458, 0, 33, 0, 34, 0, 0, 0, 99, 0, 460, 0, 0], [0, 299, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 299, 0, 393, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 299, 0, 0], [0, 0, 0, 455, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 398, 459, 0, 0, 0, 0], [0, 0, 0, 395, 388, 396, 456, 32, 33, 0, 34, 0, 0, 398, 392, 0, 0, 37, 0], [0, 0, 0, 395, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0], [0, 0, 0, 0, 0, 461, 461, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 97, 201, 404, 0, 33, 0, 34, 0, 0, 0, 99, 0, 0, 0, 0], [0, 0, 0, 0, 463, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 318, 406, 406, 8, 9, 0, 10, 0, 0, 0, 322, 0, 0, 16, 0], [0, 0, 0, 0, 409, 44, 44, 8, 9, 0, 0, 0, 0, 0, 409, 0, 0, 0, 0], [0, 0, 0, 464, 465, 466, 467, 8, 9, 0, 10, 0, 0, 468, 469, 0, 0, 16, 0], [0, 407, 0, 470, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 407, 0, 0, 0, 121, 471, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 472, 465, 473, 474, 8, 9, 0, 10, 0, 0, 475, 469, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0], [0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 477, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 479, 0, 0, 0, 137, 480, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 418, 481, 0, 0, 0, 0], [0, 0, 0, 414, 415, 416, 478, 57, 58, 0, 59, 0, 0, 418, 419, 0, 0, 62, 0], [0, 0, 0, 414, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 482, 151, 0, 0, 137, 480, 0, 58, 0, 59, 0, 0, 0, 139, 0, 482, 0, 0], [0, 337, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 337, 0, 420, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 337, 0, 0], [0, 0, 0, 477, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 425, 481, 0, 0, 0, 0], [0, 0, 0, 422, 415, 423, 478, 57, 58, 0, 59, 0, 0, 425, 419, 0, 0, 62, 0], [0, 0, 0, 422, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0], [0, 0, 0, 0, 0, 483, 483, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 137, 246, 431, 0, 58, 0, 59, 0, 0, 0, 139, 0, 0, 0, 0], [0, 0, 0, 0, 485, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 444, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 435, 225, 0, 0, 0, 0], [0, 0, 0, 432, 116, 433, 445, 8, 161, 0, 162, 0, 0, 435, 120, 0, 0, 16, 0], [0, 0, 0, 432, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 0, 486, 486, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 439, 440, 441, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 440, 440, 442, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 488, 488, 442, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 489, 488, 488, 442, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 490, 491, 492, 493, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 495, 0, 496, 497, 0, 161, 0, 162, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 0, 116, 445, 445, 8, 161, 0, 162, 0, 0, 0, 120, 0, 0, 16, 0], [0, 0, 0, 0, 225, 44, 44, 8, 161, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0], [0, 0, 0, 0, 370, 447, 447, 22, 23, 0, 24, 0, 0, 0, 374, 0, 0, 27, 0], [0, 0, 0, 0, 450, 80, 80, 22, 23, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0], [0, 0, 0, 499, 500, 501, 502, 22, 23, 0, 24, 0, 0, 503, 504, 0, 0, 27, 0], [0, 448, 0, 505, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 448, 0, 0, 0, 175, 506, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 507, 500, 508, 509, 22, 23, 0, 24, 0, 0, 510, 504, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, 0, 0], [0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 388, 456, 456, 32, 33, 0, 34, 0, 0, 0, 392, 0, 0, 37, 0], [0, 0, 0, 0, 459, 101, 101, 32, 33, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0], [0, 0, 0, 512, 513, 514, 515, 32, 33, 0, 34, 0, 0, 516, 517, 0, 0, 37, 0], [0, 457, 0, 518, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 457, 0, 0, 0, 201, 519, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 520, 513, 521, 522, 32, 33, 0, 34, 0, 0, 523, 517, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0], [0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 525, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 527, 0, 0, 0, 40, 528, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 468, 529, 0, 0, 0, 0], [0, 0, 0, 464, 465, 466, 526, 8, 9, 0, 10, 0, 0, 468, 469, 0, 0, 16, 0], [0, 0, 0, 464, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 530, 64, 0, 0, 40, 528, 0, 9, 0, 10, 0, 0, 0, 42, 0, 530, 0, 0], [0, 407, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 407, 0, 470, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 407, 0, 0], [0, 0, 0, 525, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 475, 529, 0, 0, 0, 0], [0, 0, 0, 472, 465, 473, 526, 8, 9, 0, 10, 0, 0, 475, 469, 0, 0, 16, 0], [0, 0, 0, 472, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0], [0, 0, 0, 0, 415, 478, 478, 57, 58, 0, 59, 0, 0, 0, 419, 0, 0, 62, 0], [0, 0, 0, 0, 481, 141, 141, 57, 58, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0], [0, 0, 0, 531, 532, 533, 534, 57, 58, 0, 59, 0, 0, 535, 536, 0, 0, 62, 0], [0, 479, 0, 537, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 479, 0, 0, 0, 246, 538, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 539, 532, 540, 541, 57, 58, 0, 59, 0, 0, 542, 536, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 0], [0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0], [0, 0, 0, 0, 0, 544, 544, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 491, 492, 493, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 492, 492, 494, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 546, 546, 494, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 547, 546, 546, 494, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 548, 549, 368, 550, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 274, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 495, 0, 496, 368, 0, 161, 0, 162, 0, 0, 498, 0, 0, 0, 0, 0], [0, 0, 0, 495, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 551, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 553, 0, 0, 0, 76, 554, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 503, 555, 0, 0, 0, 0], [0, 0, 0, 499, 500, 501, 552, 22, 23, 0, 24, 0, 0, 503, 504, 0, 0, 27, 0], [0, 0, 0, 499, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 556, 90, 0, 0, 76, 554, 0, 23, 0, 24, 0, 0, 0, 78, 0, 556, 0, 0], [0, 448, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 448, 0, 505, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 448, 0, 0], [0, 0, 0, 551, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 510, 555, 0, 0, 0, 0], [0, 0, 0, 507, 500, 508, 552, 22, 23, 0, 24, 0, 0, 510, 504, 0, 0, 27, 0], [0, 0, 0, 507, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0], [0, 0, 0, 557, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 559, 0, 0, 0, 97, 560, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 516, 561, 0, 0, 0, 0], [0, 0, 0, 512, 513, 514, 558, 32, 33, 0, 34, 0, 0, 516, 517, 0, 0, 37, 0], [0, 0, 0, 512, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 562, 111, 0, 0, 97, 560, 0, 33, 0, 34, 0, 0, 0, 99, 0, 562, 0, 0], [0, 457, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 457, 0, 518, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 457, 0, 0], [0, 0, 0, 557, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 523, 561, 0, 0, 0, 0], [0, 0, 0, 520, 513, 521, 558, 32, 33, 0, 34, 0, 0, 523, 517, 0, 0, 37, 0], [0, 0, 0, 520, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0], [0, 0, 0, 0, 465, 526, 526, 8, 9, 0, 10, 0, 0, 0, 469, 0, 0, 16, 0], [0, 0, 0, 0, 529, 44, 44, 8, 9, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0], [0, 0, 0, 563, 66, 564, 565, 8, 9, 0, 10, 0, 0, 566, 68, 0, 0, 16, 0], [0, 527, 0, 567, 0, 123, 123, 8, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 527, 0, 0, 0, 121, 568, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 569, 66, 570, 571, 8, 9, 0, 10, 0, 0, 572, 68, 0, 0, 16, 0], [0, 0, 0, 573, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 575, 0, 0, 0, 137, 576, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 535, 577, 0, 0, 0, 0], [0, 0, 0, 531, 532, 533, 574, 57, 58, 0, 59, 0, 0, 535, 536, 0, 0, 62, 0], [0, 0, 0, 531, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 578, 151, 0, 0, 137, 576, 0, 58, 0, 59, 0, 0, 0, 139, 0, 578, 0, 0], [0, 479, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 479, 0, 537, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 479, 0, 0], [0, 0, 0, 573, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 542, 577, 0, 0, 0, 0], [0, 0, 0, 539, 532, 540, 574, 57, 58, 0, 59, 0, 0, 542, 536, 0, 0, 62, 0], [0, 0, 0, 539, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0], [0, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0], [0, 0, 0, 0, 0, 579, 579, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 549, 368, 550, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 0, 368, 368, 0, 161, 0, 162, 0, 0, 0, 362, 0, 0, 0, 0], [0, 0, 0, 0, 581, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 500, 552, 552, 22, 23, 0, 24, 0, 0, 0, 504, 0, 0, 27, 0], [0, 0, 0, 0, 555, 80, 80, 22, 23, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0], [0, 0, 0, 582, 91, 583, 584, 22, 23, 0, 24, 0, 0, 585, 93, 0, 0, 27, 0], [0, 553, 0, 586, 0, 177, 177, 22, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 553, 0, 0, 0, 175, 587, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 588, 91, 589, 590, 22, 23, 0, 24, 0, 0, 591, 93, 0, 0, 27, 0], [0, 0, 0, 0, 513, 558, 558, 32, 33, 0, 34, 0, 0, 0, 517, 0, 0, 37, 0], [0, 0, 0, 0, 561, 101, 101, 32, 33, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0], [0, 0, 0, 592, 112, 593, 594, 32, 33, 0, 34, 0, 0, 595, 114, 0, 0, 37, 0], [0, 559, 0, 596, 0, 203, 203, 32, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 559, 0, 0, 0, 201, 597, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 598, 112, 599, 600, 32, 33, 0, 34, 0, 0, 601, 114, 0, 0, 37, 0], [0, 0, 0, 602, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 566, 165, 0, 0, 0, 0], [0, 0, 0, 563, 66, 564, 67, 8, 9, 0, 10, 0, 0, 566, 68, 0, 0, 16, 0], [0, 0, 0, 563, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 527, 0, 0, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 527, 0, 567, 0, 121, 121, 0, 9, 0, 10, 0, 0, 0, 42, 0, 527, 0, 0], [0, 0, 0, 602, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 165, 44, 44, 8, 9, 0, 0, 0, 0, 572, 165, 0, 0, 0, 0], [0, 0, 0, 569, 66, 570, 67, 8, 9, 0, 10, 0, 0, 572, 68, 0, 0, 16, 0], [0, 0, 0, 569, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 0, 532, 574, 574, 57, 58, 0, 59, 0, 0, 0, 536, 0, 0, 62, 0], [0, 0, 0, 0, 577, 141, 141, 57, 58, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0], [0, 0, 0, 603, 152, 604, 605, 57, 58, 0, 59, 0, 0, 606, 154, 0, 0, 62, 0], [0, 575, 0, 607, 0, 248, 248, 57, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 575, 0, 0, 0, 246, 608, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 609, 152, 610, 611, 57, 58, 0, 59, 0, 0, 612, 154, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0], [0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 614, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 585, 194, 0, 0, 0, 0], [0, 0, 0, 582, 91, 583, 92, 22, 23, 0, 24, 0, 0, 585, 93, 0, 0, 27, 0], [0, 0, 0, 582, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 553, 0, 0, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 553, 0, 586, 0, 175, 175, 0, 23, 0, 24, 0, 0, 0, 78, 0, 553, 0, 0], [0, 0, 0, 614, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 194, 80, 80, 22, 23, 0, 0, 0, 0, 591, 194, 0, 0, 0, 0], [0, 0, 0, 588, 91, 589, 92, 22, 23, 0, 24, 0, 0, 591, 93, 0, 0, 27, 0], [0, 0, 0, 588, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 615, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 595, 220, 0, 0, 0, 0], [0, 0, 0, 592, 112, 593, 113, 32, 33, 0, 34, 0, 0, 595, 114, 0, 0, 37, 0], [0, 0, 0, 592, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 559, 0, 0, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 559, 0, 596, 0, 201, 201, 0, 33, 0, 34, 0, 0, 0, 99, 0, 559, 0, 0], [0, 0, 0, 615, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 220, 101, 101, 32, 33, 0, 0, 0, 0, 601, 220, 0, 0, 0, 0], [0, 0, 0, 598, 112, 599, 113, 32, 33, 0, 34, 0, 0, 601, 114, 0, 0, 37, 0], [0, 0, 0, 598, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 66, 67, 67, 8, 9, 0, 10, 0, 0, 0, 68, 0, 0, 16, 0], [0, 0, 0, 616, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 606, 265, 0, 0, 0, 0], [0, 0, 0, 603, 152, 604, 153, 57, 58, 0, 59, 0, 0, 606, 154, 0, 0, 62, 0], [0, 0, 0, 603, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 575, 0, 0, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 575, 0, 607, 0, 246, 246, 0, 58, 0, 59, 0, 0, 0, 139, 0, 575, 0, 0], [0, 0, 0, 616, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 265, 141, 141, 57, 58, 0, 0, 0, 0, 612, 265, 0, 0, 0, 0], [0, 0, 0, 609, 152, 610, 153, 57, 58, 0, 59, 0, 0, 612, 154, 0, 0, 62, 0], [0, 0, 0, 609, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0], [0, 0, 0, 0, 91, 92, 92, 22, 23, 0, 24, 0, 0, 0, 93, 0, 0, 27, 0], [0, 0, 0, 0, 112, 113, 113, 32, 33, 0, 34, 0, 0, 0, 114, 0, 0, 37, 0], [0, 0, 0, 0, 152, 153, 153, 57, 58, 0, 59, 0, 0, 0, 154, 0, 0, 62, 0]];
  49284. var accepting = [false, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, false, false, true, true, true, true, true, true, true, true, true, true, false, true, true, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, true, true, true, false, true, false, true, true, false, false, true, true, true, true, true, true, true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, true, false, true, false, true, true, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, false, true, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, true, true, true, false, true, true, false, false, false, false, true, true, false, false, true, true, true, false, true, true, false, false, true, false, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, true, false, true, false, true, true, false, false, true, true, false, false, true, true, true, false, true, false, true, true, true, true, false, false, false, true, false, true, true, true, true, false, false, false, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, false, true, true, false, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, false, false, false, false, true, true, false, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, true, false, false, false, true, false, true, true, true, true, true, false, true, true, true, false, true, true, true, true, true, false, true, true, true, true, false, true, true, true, true, true, false, true, true, false, true, true, true];
  49285. var tags = [[], ["broken_cluster"], ["consonant_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable"], ["broken_cluster"], ["symbol_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["symbol_cluster"], [], ["symbol_cluster"], ["symbol_cluster"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], [], ["broken_cluster"], ["broken_cluster"], [], [], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["broken_cluster"], ["symbol_cluster"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], [], ["consonant_syllable"], ["consonant_syllable"], [], [], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], [], ["vowel_syllable"], ["vowel_syllable"], [], [], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], [], [], [], ["broken_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], [], ["standalone_cluster"], ["standalone_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], [], [], [], ["consonant_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], [], [], [], ["vowel_syllable"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], [], [], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], ["standalone_cluster"], [], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], [], [], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], [], [], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], [], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], [], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], [], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], [], [], [], [], ["consonant_syllable", "broken_cluster"], ["consonant_syllable", "broken_cluster"], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], [], [], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], ["consonant_syllable"], [], ["consonant_syllable"], ["consonant_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], ["vowel_syllable"], [], ["vowel_syllable"], ["vowel_syllable"], ["broken_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], ["standalone_cluster"], [], ["standalone_cluster"], ["standalone_cluster"], [], ["consonant_syllable"], ["vowel_syllable"], ["standalone_cluster"]];
  49286. var indicMachine = {
  49287. stateTable: stateTable,
  49288. accepting: accepting,
  49289. tags: tags
  49290. };
  49291. var categories = ["O", "IND", "S", "GB", "B", "FM", "CGJ", "VMAbv", "VMPst", "VAbv", "VPst", "CMBlw", "VPre", "VBlw", "H", "VMBlw", "CMAbv", "MBlw", "CS", "R", "SUB", "MPst", "MPre", "FAbv", "FPst", "FBlw", "SMAbv", "SMBlw", "VMPre", "ZWNJ", "ZWJ", "WJ", "VS", "N", "HN", "MAbv"];
  49292. var decompositions$1 = { "2507": [2503, 2494], "2508": [2503, 2519], "2888": [2887, 2902], "2891": [2887, 2878], "2892": [2887, 2903], "3018": [3014, 3006], "3019": [3015, 3006], "3020": [3014, 3031], "3144": [3142, 3158], "3264": [3263, 3285], "3271": [3270, 3285], "3272": [3270, 3286], "3274": [3270, 3266], "3275": [3270, 3266, 3285], "3402": [3398, 3390], "3403": [3399, 3390], "3404": [3398, 3415], "3546": [3545, 3530], "3548": [3545, 3535], "3549": [3545, 3535, 3530], "3550": [3545, 3551], "3635": [3661, 3634], "3763": [3789, 3762], "3955": [3953, 3954], "3957": [3953, 3956], "3958": [4018, 3968], "3959": [4018, 3953, 3968], "3960": [4019, 3968], "3961": [4019, 3953, 3968], "3969": [3953, 3968], "6971": [6970, 6965], "6973": [6972, 6965], "6976": [6974, 6965], "6977": [6975, 6965], "6979": [6978, 6965], "69934": [69937, 69927], "69935": [69938, 69927], "70475": [70471, 70462], "70476": [70471, 70487], "70843": [70841, 70842], "70844": [70841, 70832], "70846": [70841, 70845], "71098": [71096, 71087], "71099": [71097, 71087] };
  49293. var stateTable$1 = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [2, 2, 3, 4, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 2, 0, 24, 0, 25], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 27, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 39, 0, 0, 47], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 9, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 9, 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 0, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 4, 4, 5, 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 48, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 49, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 16, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 0, 11, 12, 0, 14, 0, 16, 0, 0, 0, 11, 0, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 0, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 33, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 33, 0, 0, 36, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 0, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 52, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 53, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 40, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 0, 35, 36, 0, 38, 0, 40, 0, 0, 0, 35, 0, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 0, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 5, 0, 6, 7, 8, 9, 48, 11, 12, 13, 14, 48, 16, 0, 0, 18, 11, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, 0, 25], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 0, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 29, 0, 30, 31, 32, 33, 52, 35, 36, 37, 38, 52, 40, 0, 0, 41, 35, 42, 43, 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, 0, 47], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0]];
  49294. var accepting$1 = [false, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true];
  49295. var tags$1 = [[], ["broken_cluster"], ["independent_cluster"], ["symbol_cluster"], ["standard_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], [], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["broken_cluster"], ["numeral_cluster"], ["broken_cluster"], ["independent_cluster"], ["symbol_cluster"], ["symbol_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["virama_terminated_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["standard_cluster"], ["broken_cluster"], ["broken_cluster"], ["numeral_cluster"], ["number_joiner_terminated_cluster"], ["standard_cluster"], ["standard_cluster"], ["numeral_cluster"]];
  49296. var useData = {
  49297. categories: categories,
  49298. decompositions: decompositions$1,
  49299. stateTable: stateTable$1,
  49300. accepting: accepting$1,
  49301. tags: tags$1
  49302. };
  49303. // Cateories used in the OpenType spec:
  49304. // https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
  49305. var CATEGORIES = {
  49306. X: 1 << 0,
  49307. C: 1 << 1,
  49308. V: 1 << 2,
  49309. N: 1 << 3,
  49310. H: 1 << 4,
  49311. ZWNJ: 1 << 5,
  49312. ZWJ: 1 << 6,
  49313. M: 1 << 7,
  49314. SM: 1 << 8,
  49315. VD: 1 << 9,
  49316. A: 1 << 10,
  49317. Placeholder: 1 << 11,
  49318. Dotted_Circle: 1 << 12,
  49319. RS: 1 << 13, // Register Shifter, used in Khmer OT spec.
  49320. Coeng: 1 << 14, // Khmer-style Virama.
  49321. Repha: 1 << 15, // Atomically-encoded logical or visual repha.
  49322. Ra: 1 << 16,
  49323. CM: 1 << 17, // Consonant-Medial.
  49324. Symbol: 1 << 18 // Avagraha, etc that take marks (SM,A,VD).
  49325. };
  49326. // Visual positions in a syllable from left to right.
  49327. var POSITIONS = {
  49328. Start: 1 << 0,
  49329. Ra_To_Become_Reph: 1 << 1,
  49330. Pre_M: 1 << 2,
  49331. Pre_C: 1 << 3,
  49332. Base_C: 1 << 4,
  49333. After_Main: 1 << 5,
  49334. Above_C: 1 << 6,
  49335. Before_Sub: 1 << 7,
  49336. Below_C: 1 << 8,
  49337. After_Sub: 1 << 9,
  49338. Before_Post: 1 << 10,
  49339. Post_C: 1 << 11,
  49340. After_Post: 1 << 12,
  49341. Final_C: 1 << 13,
  49342. SMVD: 1 << 14,
  49343. End: 1 << 15
  49344. };
  49345. var CONSONANT_FLAGS = CATEGORIES.C | CATEGORIES.Ra | CATEGORIES.CM | CATEGORIES.V | CATEGORIES.Placeholder | CATEGORIES.Dotted_Circle;
  49346. var JOINER_FLAGS = CATEGORIES.ZWJ | CATEGORIES.ZWNJ;
  49347. var HALANT_OR_COENG_FLAGS = CATEGORIES.H | CATEGORIES.Coeng;
  49348. var INDIC_CONFIGS = {
  49349. Default: {
  49350. hasOldSpec: false,
  49351. virama: 0,
  49352. basePos: 'Last',
  49353. rephPos: POSITIONS.Before_Post,
  49354. rephMode: 'Implicit',
  49355. blwfMode: 'Pre_And_Post'
  49356. },
  49357. Devanagari: {
  49358. hasOldSpec: true,
  49359. virama: 0x094D,
  49360. basePos: 'Last',
  49361. rephPos: POSITIONS.Before_Post,
  49362. rephMode: 'Implicit',
  49363. blwfMode: 'Pre_And_Post'
  49364. },
  49365. Bengali: {
  49366. hasOldSpec: true,
  49367. virama: 0x09CD,
  49368. basePos: 'Last',
  49369. rephPos: POSITIONS.After_Sub,
  49370. rephMode: 'Implicit',
  49371. blwfMode: 'Pre_And_Post'
  49372. },
  49373. Gurmukhi: {
  49374. hasOldSpec: true,
  49375. virama: 0x0A4D,
  49376. basePos: 'Last',
  49377. rephPos: POSITIONS.Before_Sub,
  49378. rephMode: 'Implicit',
  49379. blwfMode: 'Pre_And_Post'
  49380. },
  49381. Gujarati: {
  49382. hasOldSpec: true,
  49383. virama: 0x0ACD,
  49384. basePos: 'Last',
  49385. rephPos: POSITIONS.Before_Post,
  49386. rephMode: 'Implicit',
  49387. blwfMode: 'Pre_And_Post'
  49388. },
  49389. Oriya: {
  49390. hasOldSpec: true,
  49391. virama: 0x0B4D,
  49392. basePos: 'Last',
  49393. rephPos: POSITIONS.After_Main,
  49394. rephMode: 'Implicit',
  49395. blwfMode: 'Pre_And_Post'
  49396. },
  49397. Tamil: {
  49398. hasOldSpec: true,
  49399. virama: 0x0BCD,
  49400. basePos: 'Last',
  49401. rephPos: POSITIONS.After_Post,
  49402. rephMode: 'Implicit',
  49403. blwfMode: 'Pre_And_Post'
  49404. },
  49405. Telugu: {
  49406. hasOldSpec: true,
  49407. virama: 0x0C4D,
  49408. basePos: 'Last',
  49409. rephPos: POSITIONS.After_Post,
  49410. rephMode: 'Explicit',
  49411. blwfMode: 'Post_Only'
  49412. },
  49413. Kannada: {
  49414. hasOldSpec: true,
  49415. virama: 0x0CCD,
  49416. basePos: 'Last',
  49417. rephPos: POSITIONS.After_Post,
  49418. rephMode: 'Implicit',
  49419. blwfMode: 'Post_Only'
  49420. },
  49421. Malayalam: {
  49422. hasOldSpec: true,
  49423. virama: 0x0D4D,
  49424. basePos: 'Last',
  49425. rephPos: POSITIONS.After_Main,
  49426. rephMode: 'Log_Repha',
  49427. blwfMode: 'Pre_And_Post'
  49428. },
  49429. // Handled by UniversalShaper
  49430. // Sinhala: {
  49431. // hasOldSpec: false,
  49432. // virama: 0x0DCA,
  49433. // basePos: 'Last_Sinhala',
  49434. // rephPos: POSITIONS.After_Main,
  49435. // rephMode: 'Explicit',
  49436. // blwfMode: 'Pre_And_Post'
  49437. // },
  49438. Khmer: {
  49439. hasOldSpec: false,
  49440. virama: 0x17D2,
  49441. basePos: 'First',
  49442. rephPos: POSITIONS.Ra_To_Become_Reph,
  49443. rephMode: 'Vis_Repha',
  49444. blwfMode: 'Pre_And_Post'
  49445. }
  49446. };
  49447. // Additional decompositions that aren't in Unicode
  49448. var INDIC_DECOMPOSITIONS = {
  49449. // Khmer
  49450. 0x17BE: [0x17C1, 0x17BE],
  49451. 0x17BF: [0x17C1, 0x17BF],
  49452. 0x17C0: [0x17C1, 0x17C0],
  49453. 0x17C4: [0x17C1, 0x17C4],
  49454. 0x17C5: [0x17C1, 0x17C5]
  49455. };
  49456. var _class$6;
  49457. var _temp$2;
  49458. var decompositions = useData.decompositions;
  49459. var trie$1 = new UnicodeTrie(Buffer("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","base64"));
  49460. var stateMachine = new StateMachine(indicMachine);
  49461. /**
  49462. * The IndicShaper supports indic scripts e.g. Devanagari, Kannada, etc.
  49463. * Based on code from Harfbuzz: https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-indic.cc
  49464. */
  49465. var IndicShaper = (_temp$2 = _class$6 = function (_DefaultShaper) {
  49466. _inherits(IndicShaper, _DefaultShaper);
  49467. function IndicShaper() {
  49468. _classCallCheck(this, IndicShaper);
  49469. return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
  49470. }
  49471. IndicShaper.planFeatures = function planFeatures(plan) {
  49472. plan.addStage(setupSyllables);
  49473. plan.addStage(['locl', 'ccmp']);
  49474. plan.addStage(initialReordering);
  49475. plan.addStage('nukt');
  49476. plan.addStage('akhn');
  49477. plan.addStage('rphf', false);
  49478. plan.addStage('rkrf');
  49479. plan.addStage('pref', false);
  49480. plan.addStage('blwf', false);
  49481. plan.addStage('abvf', false);
  49482. plan.addStage('half', false);
  49483. plan.addStage('pstf', false);
  49484. plan.addStage('vatu');
  49485. plan.addStage('cjct');
  49486. plan.addStage('cfar', false);
  49487. plan.addStage(finalReordering);
  49488. plan.addStage({
  49489. local: ['init'],
  49490. global: ['pres', 'abvs', 'blws', 'psts', 'haln', 'dist', 'abvm', 'blwm', 'calt', 'clig']
  49491. });
  49492. // Setup the indic config for the selected script
  49493. plan.unicodeScript = fromOpenType(plan.script);
  49494. plan.indicConfig = INDIC_CONFIGS[plan.unicodeScript] || INDIC_CONFIGS.Default;
  49495. plan.isOldSpec = plan.indicConfig.hasOldSpec && plan.script[plan.script.length - 1] !== '2';
  49496. // TODO: turn off kern (Khmer) and liga features.
  49497. };
  49498. IndicShaper.assignFeatures = function assignFeatures(plan, glyphs) {
  49499. var _loop = function _loop(i) {
  49500. var codepoint = glyphs[i].codePoints[0];
  49501. var d = INDIC_DECOMPOSITIONS[codepoint] || decompositions[codepoint];
  49502. if (d) {
  49503. var decomposed = d.map(function (c) {
  49504. var g = plan.font.glyphForCodePoint(c);
  49505. return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);
  49506. });
  49507. glyphs.splice.apply(glyphs, [i, 1].concat(decomposed));
  49508. }
  49509. };
  49510. // Decompose split matras
  49511. // TODO: do this in a more general unicode normalizer
  49512. for (var i = glyphs.length - 1; i >= 0; i--) {
  49513. _loop(i);
  49514. }
  49515. };
  49516. return IndicShaper;
  49517. }(DefaultShaper), _class$6.zeroMarkWidths = 'NONE', _temp$2);
  49518. function indicCategory(glyph) {
  49519. return trie$1.get(glyph.codePoints[0]) >> 8;
  49520. }
  49521. function indicPosition(glyph) {
  49522. return 1 << (trie$1.get(glyph.codePoints[0]) & 0xff);
  49523. }
  49524. var IndicInfo = function IndicInfo(category, position, syllableType, syllable) {
  49525. _classCallCheck(this, IndicInfo);
  49526. this.category = category;
  49527. this.position = position;
  49528. this.syllableType = syllableType;
  49529. this.syllable = syllable;
  49530. };
  49531. function setupSyllables(font, glyphs) {
  49532. var syllable = 0;
  49533. var last = 0;
  49534. for (var _iterator = stateMachine.match(glyphs.map(indicCategory)), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  49535. var _ref;
  49536. if (_isArray) {
  49537. if (_i >= _iterator.length) break;
  49538. _ref = _iterator[_i++];
  49539. } else {
  49540. _i = _iterator.next();
  49541. if (_i.done) break;
  49542. _ref = _i.value;
  49543. }
  49544. var _ref2 = _ref,
  49545. start = _ref2[0],
  49546. end = _ref2[1],
  49547. tags = _ref2[2];
  49548. if (start > last) {
  49549. ++syllable;
  49550. for (var _i2 = last; _i2 < start; _i2++) {
  49551. glyphs[_i2].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);
  49552. }
  49553. }
  49554. ++syllable;
  49555. // Create shaper info
  49556. for (var _i3 = start; _i3 <= end; _i3++) {
  49557. glyphs[_i3].shaperInfo = new IndicInfo(1 << indicCategory(glyphs[_i3]), indicPosition(glyphs[_i3]), tags[0], syllable);
  49558. }
  49559. last = end + 1;
  49560. }
  49561. if (last < glyphs.length) {
  49562. ++syllable;
  49563. for (var i = last; i < glyphs.length; i++) {
  49564. glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);
  49565. }
  49566. }
  49567. }
  49568. function isConsonant(glyph) {
  49569. return glyph.shaperInfo.category & CONSONANT_FLAGS;
  49570. }
  49571. function isJoiner(glyph) {
  49572. return glyph.shaperInfo.category & JOINER_FLAGS;
  49573. }
  49574. function isHalantOrCoeng(glyph) {
  49575. return glyph.shaperInfo.category & HALANT_OR_COENG_FLAGS;
  49576. }
  49577. function wouldSubstitute(glyphs, feature) {
  49578. for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  49579. var _glyph$features;
  49580. var _ref3;
  49581. if (_isArray2) {
  49582. if (_i4 >= _iterator2.length) break;
  49583. _ref3 = _iterator2[_i4++];
  49584. } else {
  49585. _i4 = _iterator2.next();
  49586. if (_i4.done) break;
  49587. _ref3 = _i4.value;
  49588. }
  49589. var glyph = _ref3;
  49590. glyph.features = (_glyph$features = {}, _glyph$features[feature] = true, _glyph$features);
  49591. }
  49592. var GSUB = glyphs[0]._font._layoutEngine.engine.GSUBProcessor;
  49593. GSUB.applyFeatures([feature], glyphs);
  49594. return glyphs.length === 1;
  49595. }
  49596. function consonantPosition(font, consonant, virama) {
  49597. var glyphs = [virama, consonant, virama];
  49598. if (wouldSubstitute(glyphs.slice(0, 2), 'blwf') || wouldSubstitute(glyphs.slice(1, 3), 'blwf')) {
  49599. return POSITIONS.Below_C;
  49600. } else if (wouldSubstitute(glyphs.slice(0, 2), 'pstf') || wouldSubstitute(glyphs.slice(1, 3), 'pstf')) {
  49601. return POSITIONS.Post_C;
  49602. } else if (wouldSubstitute(glyphs.slice(0, 2), 'pref') || wouldSubstitute(glyphs.slice(1, 3), 'pref')) {
  49603. return POSITIONS.Post_C;
  49604. }
  49605. return POSITIONS.Base_C;
  49606. }
  49607. function initialReordering(font, glyphs, plan) {
  49608. var indicConfig = plan.indicConfig;
  49609. var features = font._layoutEngine.engine.GSUBProcessor.features;
  49610. var dottedCircle = font.glyphForCodePoint(0x25cc).id;
  49611. var virama = font.glyphForCodePoint(indicConfig.virama).id;
  49612. if (virama) {
  49613. var info = new GlyphInfo(font, virama, [indicConfig.virama]);
  49614. for (var i = 0; i < glyphs.length; i++) {
  49615. if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {
  49616. glyphs[i].shaperInfo.position = consonantPosition(font, glyphs[i].copy(), info);
  49617. }
  49618. }
  49619. }
  49620. for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {
  49621. var _glyphs$start$shaperI = glyphs[start].shaperInfo,
  49622. category = _glyphs$start$shaperI.category,
  49623. syllableType = _glyphs$start$shaperI.syllableType;
  49624. if (syllableType === 'symbol_cluster' || syllableType === 'non_indic_cluster') {
  49625. continue;
  49626. }
  49627. if (syllableType === 'broken_cluster' && dottedCircle) {
  49628. var g = new GlyphInfo(font, dottedCircle, [0x25cc]);
  49629. g.shaperInfo = new IndicInfo(1 << indicCategory(g), indicPosition(g), glyphs[start].shaperInfo.syllableType, glyphs[start].shaperInfo.syllable);
  49630. // Insert after possible Repha.
  49631. var _i5 = start;
  49632. while (_i5 < end && glyphs[_i5].shaperInfo.category === CATEGORIES.Repha) {
  49633. _i5++;
  49634. }
  49635. glyphs.splice(_i5++, 0, g);
  49636. end++;
  49637. }
  49638. // 1. Find base consonant:
  49639. //
  49640. // The shaping engine finds the base consonant of the syllable, using the
  49641. // following algorithm: starting from the end of the syllable, move backwards
  49642. // until a consonant is found that does not have a below-base or post-base
  49643. // form (post-base forms have to follow below-base forms), or that is not a
  49644. // pre-base reordering Ra, or arrive at the first consonant. The consonant
  49645. // stopped at will be the base.
  49646. var base = end;
  49647. var limit = start;
  49648. var hasReph = false;
  49649. // If the syllable starts with Ra + Halant (in a script that has Reph)
  49650. // and has more than one consonant, Ra is excluded from candidates for
  49651. // base consonants.
  49652. if (indicConfig.rephPos !== POSITIONS.Ra_To_Become_Reph && features.rphf && start + 3 <= end && (indicConfig.rephMode === 'Implicit' && !isJoiner(glyphs[start + 2]) || indicConfig.rephMode === 'Explicit' && glyphs[start + 2].shaperInfo.category === CATEGORIES.ZWJ)) {
  49653. // See if it matches the 'rphf' feature.
  49654. var _g = [glyphs[start].copy(), glyphs[start + 1].copy(), glyphs[start + 2].copy()];
  49655. if (wouldSubstitute(_g.slice(0, 2), 'rphf') || indicConfig.rephMode === 'Explicit' && wouldSubstitute(_g, 'rphf')) {
  49656. limit += 2;
  49657. while (limit < end && isJoiner(glyphs[limit])) {
  49658. limit++;
  49659. }
  49660. base = start;
  49661. hasReph = true;
  49662. }
  49663. } else if (indicConfig.rephMode === 'Log_Repha' && glyphs[start].shaperInfo.category === CATEGORIES.Repha) {
  49664. limit++;
  49665. while (limit < end && isJoiner(glyphs[limit])) {
  49666. limit++;
  49667. }
  49668. base = start;
  49669. hasReph = true;
  49670. }
  49671. switch (indicConfig.basePos) {
  49672. case 'Last':
  49673. {
  49674. // starting from the end of the syllable, move backwards
  49675. var _i6 = end;
  49676. var seenBelow = false;
  49677. do {
  49678. var _info = glyphs[--_i6].shaperInfo;
  49679. // until a consonant is found
  49680. if (isConsonant(glyphs[_i6])) {
  49681. // that does not have a below-base or post-base form
  49682. // (post-base forms have to follow below-base forms),
  49683. if (_info.position !== POSITIONS.Below_C && (_info.position !== POSITIONS.Post_C || seenBelow)) {
  49684. base = _i6;
  49685. break;
  49686. }
  49687. // or that is not a pre-base reordering Ra,
  49688. //
  49689. // IMPLEMENTATION NOTES:
  49690. //
  49691. // Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped
  49692. // by the logic above already.
  49693. //
  49694. // or arrive at the first consonant. The consonant stopped at will
  49695. // be the base.
  49696. if (_info.position === POSITIONS.Below_C) {
  49697. seenBelow = true;
  49698. }
  49699. base = _i6;
  49700. } else if (start < _i6 && _info.category === CATEGORIES.ZWJ && glyphs[_i6 - 1].shaperInfo.category === CATEGORIES.H) {
  49701. // A ZWJ after a Halant stops the base search, and requests an explicit
  49702. // half form.
  49703. // A ZWJ before a Halant, requests a subjoined form instead, and hence
  49704. // search continues. This is particularly important for Bengali
  49705. // sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya.
  49706. break;
  49707. }
  49708. } while (_i6 > limit);
  49709. break;
  49710. }
  49711. case 'First':
  49712. {
  49713. // The first consonant is always the base.
  49714. base = start;
  49715. // Mark all subsequent consonants as below.
  49716. for (var _i7 = base + 1; _i7 < end; _i7++) {
  49717. if (isConsonant(glyphs[_i7])) {
  49718. glyphs[_i7].shaperInfo.position = POSITIONS.Below_C;
  49719. }
  49720. }
  49721. }
  49722. }
  49723. // If the syllable starts with Ra + Halant (in a script that has Reph)
  49724. // and has more than one consonant, Ra is excluded from candidates for
  49725. // base consonants.
  49726. //
  49727. // Only do this for unforced Reph. (ie. not for Ra,H,ZWJ)
  49728. if (hasReph && base === start && limit - base <= 2) {
  49729. hasReph = false;
  49730. }
  49731. // 2. Decompose and reorder Matras:
  49732. //
  49733. // Each matra and any syllable modifier sign in the cluster are moved to the
  49734. // appropriate position relative to the consonant(s) in the cluster. The
  49735. // shaping engine decomposes two- or three-part matras into their constituent
  49736. // parts before any repositioning. Matra characters are classified by which
  49737. // consonant in a conjunct they have affinity for and are reordered to the
  49738. // following positions:
  49739. //
  49740. // o Before first half form in the syllable
  49741. // o After subjoined consonants
  49742. // o After post-form consonant
  49743. // o After main consonant (for above marks)
  49744. //
  49745. // IMPLEMENTATION NOTES:
  49746. //
  49747. // The normalize() routine has already decomposed matras for us, so we don't
  49748. // need to worry about that.
  49749. // 3. Reorder marks to canonical order:
  49750. //
  49751. // Adjacent nukta and halant or nukta and vedic sign are always repositioned
  49752. // if necessary, so that the nukta is first.
  49753. //
  49754. // IMPLEMENTATION NOTES:
  49755. //
  49756. // We don't need to do this: the normalize() routine already did this for us.
  49757. // Reorder characters
  49758. for (var _i8 = start; _i8 < base; _i8++) {
  49759. var _info2 = glyphs[_i8].shaperInfo;
  49760. _info2.position = Math.min(POSITIONS.Pre_C, _info2.position);
  49761. }
  49762. if (base < end) {
  49763. glyphs[base].shaperInfo.position = POSITIONS.Base_C;
  49764. }
  49765. // Mark final consonants. A final consonant is one appearing after a matra,
  49766. // like in Khmer.
  49767. for (var _i9 = base + 1; _i9 < end; _i9++) {
  49768. if (glyphs[_i9].shaperInfo.category === CATEGORIES.M) {
  49769. for (var j = _i9 + 1; j < end; j++) {
  49770. if (isConsonant(glyphs[j])) {
  49771. glyphs[j].shaperInfo.position = POSITIONS.Final_C;
  49772. break;
  49773. }
  49774. }
  49775. break;
  49776. }
  49777. }
  49778. // Handle beginning Ra
  49779. if (hasReph) {
  49780. glyphs[start].shaperInfo.position = POSITIONS.Ra_To_Become_Reph;
  49781. }
  49782. // For old-style Indic script tags, move the first post-base Halant after
  49783. // last consonant.
  49784. //
  49785. // Reports suggest that in some scripts Uniscribe does this only if there
  49786. // is *not* a Halant after last consonant already (eg. Kannada), while it
  49787. // does it unconditionally in other scripts (eg. Malayalam). We don't
  49788. // currently know about other scripts, so we single out Malayalam for now.
  49789. //
  49790. // Kannada test case:
  49791. // U+0C9A,U+0CCD,U+0C9A,U+0CCD
  49792. // With some versions of Lohit Kannada.
  49793. // https://bugs.freedesktop.org/show_bug.cgi?id=59118
  49794. //
  49795. // Malayalam test case:
  49796. // U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D
  49797. // With lohit-ttf-20121122/Lohit-Malayalam.ttf
  49798. if (plan.isOldSpec) {
  49799. var disallowDoubleHalants = plan.unicodeScript !== 'Malayalam';
  49800. for (var _i10 = base + 1; _i10 < end; _i10++) {
  49801. if (glyphs[_i10].shaperInfo.category === CATEGORIES.H) {
  49802. var _j = void 0;
  49803. for (_j = end - 1; _j > _i10; _j--) {
  49804. if (isConsonant(glyphs[_j]) || disallowDoubleHalants && glyphs[_j].shaperInfo.category === CATEGORIES.H) {
  49805. break;
  49806. }
  49807. }
  49808. if (glyphs[_j].shaperInfo.category !== CATEGORIES.H && _j > _i10) {
  49809. // Move Halant to after last consonant.
  49810. var t = glyphs[_i10];
  49811. glyphs.splice.apply(glyphs, [_i10, 0].concat(glyphs.splice(_i10 + 1, _j - _i10)));
  49812. glyphs[_j] = t;
  49813. }
  49814. break;
  49815. }
  49816. }
  49817. }
  49818. // Attach misc marks to previous char to move with them.
  49819. var lastPos = POSITIONS.Start;
  49820. for (var _i11 = start; _i11 < end; _i11++) {
  49821. var _info3 = glyphs[_i11].shaperInfo;
  49822. if (_info3.category & (JOINER_FLAGS | CATEGORIES.N | CATEGORIES.RS | CATEGORIES.CM | HALANT_OR_COENG_FLAGS & _info3.category)) {
  49823. _info3.position = lastPos;
  49824. if (_info3.category === CATEGORIES.H && _info3.position === POSITIONS.Pre_M) {
  49825. // Uniscribe doesn't move the Halant with Left Matra.
  49826. // TEST: U+092B,U+093F,U+094DE
  49827. // We follow. This is important for the Sinhala
  49828. // U+0DDA split matra since it decomposes to U+0DD9,U+0DCA
  49829. // where U+0DD9 is a left matra and U+0DCA is the virama.
  49830. // We don't want to move the virama with the left matra.
  49831. // TEST: U+0D9A,U+0DDA
  49832. for (var _j2 = _i11; _j2 > start; _j2--) {
  49833. if (glyphs[_j2 - 1].shaperInfo.position !== POSITIONS.Pre_M) {
  49834. _info3.position = glyphs[_j2 - 1].shaperInfo.position;
  49835. break;
  49836. }
  49837. }
  49838. }
  49839. } else if (_info3.position !== POSITIONS.SMVD) {
  49840. lastPos = _info3.position;
  49841. }
  49842. }
  49843. // For post-base consonants let them own anything before them
  49844. // since the last consonant or matra.
  49845. var last = base;
  49846. for (var _i12 = base + 1; _i12 < end; _i12++) {
  49847. if (isConsonant(glyphs[_i12])) {
  49848. for (var _j3 = last + 1; _j3 < _i12; _j3++) {
  49849. if (glyphs[_j3].shaperInfo.position < POSITIONS.SMVD) {
  49850. glyphs[_j3].shaperInfo.position = glyphs[_i12].shaperInfo.position;
  49851. }
  49852. }
  49853. last = _i12;
  49854. } else if (glyphs[_i12].shaperInfo.category === CATEGORIES.M) {
  49855. last = _i12;
  49856. }
  49857. }
  49858. var arr = glyphs.slice(start, end);
  49859. arr.sort(function (a, b) {
  49860. return a.shaperInfo.position - b.shaperInfo.position;
  49861. });
  49862. glyphs.splice.apply(glyphs, [start, arr.length].concat(arr));
  49863. // Find base again
  49864. for (var _i13 = start; _i13 < end; _i13++) {
  49865. if (glyphs[_i13].shaperInfo.position === POSITIONS.Base_C) {
  49866. base = _i13;
  49867. break;
  49868. }
  49869. }
  49870. // Setup features now
  49871. // Reph
  49872. for (var _i14 = start; _i14 < end && glyphs[_i14].shaperInfo.position === POSITIONS.Ra_To_Become_Reph; _i14++) {
  49873. glyphs[_i14].features.rphf = true;
  49874. }
  49875. // Pre-base
  49876. var blwf = !plan.isOldSpec && indicConfig.blwfMode === 'Pre_And_Post';
  49877. for (var _i15 = start; _i15 < base; _i15++) {
  49878. glyphs[_i15].features.half = true;
  49879. if (blwf) {
  49880. glyphs[_i15].features.blwf = true;
  49881. }
  49882. }
  49883. // Post-base
  49884. for (var _i16 = base + 1; _i16 < end; _i16++) {
  49885. glyphs[_i16].features.abvf = true;
  49886. glyphs[_i16].features.pstf = true;
  49887. glyphs[_i16].features.blwf = true;
  49888. }
  49889. if (plan.isOldSpec && plan.unicodeScript === 'Devanagari') {
  49890. // Old-spec eye-lash Ra needs special handling. From the
  49891. // spec:
  49892. //
  49893. // "The feature 'below-base form' is applied to consonants
  49894. // having below-base forms and following the base consonant.
  49895. // The exception is vattu, which may appear below half forms
  49896. // as well as below the base glyph. The feature 'below-base
  49897. // form' will be applied to all such occurrences of Ra as well."
  49898. //
  49899. // Test case: U+0924,U+094D,U+0930,U+094d,U+0915
  49900. // with Sanskrit 2003 font.
  49901. //
  49902. // However, note that Ra,Halant,ZWJ is the correct way to
  49903. // request eyelash form of Ra, so we wouldbn't inhibit it
  49904. // in that sequence.
  49905. //
  49906. // Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915
  49907. for (var _i17 = start; _i17 + 1 < base; _i17++) {
  49908. if (glyphs[_i17].shaperInfo.category === CATEGORIES.Ra && glyphs[_i17 + 1].shaperInfo.category === CATEGORIES.H && (_i17 + 1 === base || glyphs[_i17 + 2].shaperInfo.category === CATEGORIES.ZWJ)) {
  49909. glyphs[_i17].features.blwf = true;
  49910. glyphs[_i17 + 1].features.blwf = true;
  49911. }
  49912. }
  49913. }
  49914. var prefLen = 2;
  49915. if (features.pref && base + prefLen < end) {
  49916. // Find a Halant,Ra sequence and mark it for pre-base reordering processing.
  49917. for (var _i18 = base + 1; _i18 + prefLen - 1 < end; _i18++) {
  49918. var _g2 = [glyphs[_i18].copy(), glyphs[_i18 + 1].copy()];
  49919. if (wouldSubstitute(_g2, 'pref')) {
  49920. for (var _j4 = 0; _j4 < prefLen; _j4++) {
  49921. glyphs[_i18++].features.pref = true;
  49922. }
  49923. // Mark the subsequent stuff with 'cfar'. Used in Khmer.
  49924. // Read the feature spec.
  49925. // This allows distinguishing the following cases with MS Khmer fonts:
  49926. // U+1784,U+17D2,U+179A,U+17D2,U+1782
  49927. // U+1784,U+17D2,U+1782,U+17D2,U+179A
  49928. if (features.cfar) {
  49929. for (; _i18 < end; _i18++) {
  49930. glyphs[_i18].features.cfar = true;
  49931. }
  49932. }
  49933. break;
  49934. }
  49935. }
  49936. }
  49937. // Apply ZWJ/ZWNJ effects
  49938. for (var _i19 = start + 1; _i19 < end; _i19++) {
  49939. if (isJoiner(glyphs[_i19])) {
  49940. var nonJoiner = glyphs[_i19].shaperInfo.category === CATEGORIES.ZWNJ;
  49941. var _j5 = _i19;
  49942. do {
  49943. _j5--;
  49944. // ZWJ/ZWNJ should disable CJCT. They do that by simply
  49945. // being there, since we don't skip them for the CJCT
  49946. // feature (ie. F_MANUAL_ZWJ)
  49947. // A ZWNJ disables HALF.
  49948. if (nonJoiner) {
  49949. delete glyphs[_j5].features.half;
  49950. }
  49951. } while (_j5 > start && !isConsonant(glyphs[_j5]));
  49952. }
  49953. }
  49954. }
  49955. }
  49956. function finalReordering(font, glyphs, plan) {
  49957. var indicConfig = plan.indicConfig;
  49958. var features = font._layoutEngine.engine.GSUBProcessor.features;
  49959. for (var start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {
  49960. // 4. Final reordering:
  49961. //
  49962. // After the localized forms and basic shaping forms GSUB features have been
  49963. // applied (see below), the shaping engine performs some final glyph
  49964. // reordering before applying all the remaining font features to the entire
  49965. // cluster.
  49966. var tryPref = !!features.pref;
  49967. // Find base again
  49968. var base = start;
  49969. for (; base < end; base++) {
  49970. if (glyphs[base].shaperInfo.position >= POSITIONS.Base_C) {
  49971. if (tryPref && base + 1 < end) {
  49972. for (var i = base + 1; i < end; i++) {
  49973. if (glyphs[i].features.pref) {
  49974. if (!(glyphs[i].substituted && glyphs[i].isLigated && !glyphs[i].isMultiplied)) {
  49975. // Ok, this was a 'pref' candidate but didn't form any.
  49976. // Base is around here...
  49977. base = i;
  49978. while (base < end && isHalantOrCoeng(glyphs[base])) {
  49979. base++;
  49980. }
  49981. glyphs[base].shaperInfo.position = POSITIONS.BASE_C;
  49982. tryPref = false;
  49983. }
  49984. break;
  49985. }
  49986. }
  49987. }
  49988. // For Malayalam, skip over unformed below- (but NOT post-) forms.
  49989. if (plan.unicodeScript === 'Malayalam') {
  49990. for (var _i20 = base + 1; _i20 < end; _i20++) {
  49991. while (_i20 < end && isJoiner(glyphs[_i20])) {
  49992. _i20++;
  49993. }
  49994. if (_i20 === end || !isHalantOrCoeng(glyphs[_i20])) {
  49995. break;
  49996. }
  49997. _i20++; // Skip halant.
  49998. while (_i20 < end && isJoiner(glyphs[_i20])) {
  49999. _i20++;
  50000. }
  50001. if (_i20 < end && isConsonant(glyphs[_i20]) && glyphs[_i20].shaperInfo.position === POSITIONS.Below_C) {
  50002. base = _i20;
  50003. glyphs[base].shaperInfo.position = POSITIONS.Base_C;
  50004. }
  50005. }
  50006. }
  50007. if (start < base && glyphs[base].shaperInfo.position > POSITIONS.Base_C) {
  50008. base--;
  50009. }
  50010. break;
  50011. }
  50012. }
  50013. if (base === end && start < base && glyphs[base - 1].shaperInfo.category === CATEGORIES.ZWJ) {
  50014. base--;
  50015. }
  50016. if (base < end) {
  50017. while (start < base && glyphs[base].shaperInfo.category & (CATEGORIES.N | HALANT_OR_COENG_FLAGS)) {
  50018. base--;
  50019. }
  50020. }
  50021. // o Reorder matras:
  50022. //
  50023. // If a pre-base matra character had been reordered before applying basic
  50024. // features, the glyph can be moved closer to the main consonant based on
  50025. // whether half-forms had been formed. Actual position for the matra is
  50026. // defined as “after last standalone halant glyph, after initial matra
  50027. // position and before the main consonant”. If ZWJ or ZWNJ follow this
  50028. // halant, position is moved after it.
  50029. //
  50030. if (start + 1 < end && start < base) {
  50031. // Otherwise there can't be any pre-base matra characters.
  50032. // If we lost track of base, alas, position before last thingy.
  50033. var newPos = base === end ? base - 2 : base - 1;
  50034. // Malayalam / Tamil do not have "half" forms or explicit virama forms.
  50035. // The glyphs formed by 'half' are Chillus or ligated explicit viramas.
  50036. // We want to position matra after them.
  50037. if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {
  50038. while (newPos > start && !(glyphs[newPos].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {
  50039. newPos--;
  50040. }
  50041. // If we found no Halant we are done.
  50042. // Otherwise only proceed if the Halant does
  50043. // not belong to the Matra itself!
  50044. if (isHalantOrCoeng(glyphs[newPos]) && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {
  50045. // If ZWJ or ZWNJ follow this halant, position is moved after it.
  50046. if (newPos + 1 < end && isJoiner(glyphs[newPos + 1])) {
  50047. newPos++;
  50048. }
  50049. } else {
  50050. newPos = start; // No move.
  50051. }
  50052. }
  50053. if (start < newPos && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {
  50054. // Now go see if there's actually any matras...
  50055. for (var _i21 = newPos; _i21 > start; _i21--) {
  50056. if (glyphs[_i21 - 1].shaperInfo.position === POSITIONS.Pre_M) {
  50057. var oldPos = _i21 - 1;
  50058. if (oldPos < base && base <= newPos) {
  50059. // Shouldn't actually happen.
  50060. base--;
  50061. }
  50062. var tmp = glyphs[oldPos];
  50063. glyphs.splice.apply(glyphs, [oldPos, 0].concat(glyphs.splice(oldPos + 1, newPos - oldPos)));
  50064. glyphs[newPos] = tmp;
  50065. newPos--;
  50066. }
  50067. }
  50068. }
  50069. }
  50070. // o Reorder reph:
  50071. //
  50072. // Reph’s original position is always at the beginning of the syllable,
  50073. // (i.e. it is not reordered at the character reordering stage). However,
  50074. // it will be reordered according to the basic-forms shaping results.
  50075. // Possible positions for reph, depending on the script, are; after main,
  50076. // before post-base consonant forms, and after post-base consonant forms.
  50077. // Two cases:
  50078. //
  50079. // - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then
  50080. // we should only move it if the sequence ligated to the repha form.
  50081. //
  50082. // - If repha is encoded separately and in the logical position, we should only
  50083. // move it if it did NOT ligate. If it ligated, it's probably the font trying
  50084. // to make it work without the reordering.
  50085. if (start + 1 < end && glyphs[start].shaperInfo.position === POSITIONS.Ra_To_Become_Reph && glyphs[start].shaperInfo.category === CATEGORIES.Repha !== (glyphs[start].isLigated && !glyphs[start].isMultiplied)) {
  50086. var newRephPos = void 0;
  50087. var rephPos = indicConfig.rephPos;
  50088. var found = false;
  50089. // 1. If reph should be positioned after post-base consonant forms,
  50090. // proceed to step 5.
  50091. if (rephPos !== POSITIONS.After_Post) {
  50092. // 2. If the reph repositioning class is not after post-base: target
  50093. // position is after the first explicit halant glyph between the
  50094. // first post-reph consonant and last main consonant. If ZWJ or ZWNJ
  50095. // are following this halant, position is moved after it. If such
  50096. // position is found, this is the target position. Otherwise,
  50097. // proceed to the next step.
  50098. //
  50099. // Note: in old-implementation fonts, where classifications were
  50100. // fixed in shaping engine, there was no case where reph position
  50101. // will be found on this step.
  50102. newRephPos = start + 1;
  50103. while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {
  50104. newRephPos++;
  50105. }
  50106. if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {
  50107. // ->If ZWJ or ZWNJ are following this halant, position is moved after it.
  50108. if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {
  50109. newRephPos++;
  50110. }
  50111. found = true;
  50112. }
  50113. // 3. If reph should be repositioned after the main consonant: find the
  50114. // first consonant not ligated with main, or find the first
  50115. // consonant that is not a potential pre-base reordering Ra.
  50116. if (!found && rephPos === POSITIONS.After_Main) {
  50117. newRephPos = base;
  50118. while (newRephPos + 1 < end && glyphs[newRephPos + 1].shaperInfo.position <= POSITIONS.After_Main) {
  50119. newRephPos++;
  50120. }
  50121. found = newRephPos < end;
  50122. }
  50123. // 4. If reph should be positioned before post-base consonant, find
  50124. // first post-base classified consonant not ligated with main. If no
  50125. // consonant is found, the target position should be before the
  50126. // first matra, syllable modifier sign or vedic sign.
  50127. //
  50128. // This is our take on what step 4 is trying to say (and failing, BADLY).
  50129. if (!found && rephPos === POSITIONS.After_Sub) {
  50130. newRephPos = base;
  50131. while (newRephPos + 1 < end && !(glyphs[newRephPos + 1].shaperInfo.position & (POSITIONS.Post_C | POSITIONS.After_Post | POSITIONS.SMVD))) {
  50132. newRephPos++;
  50133. }
  50134. found = newRephPos < end;
  50135. }
  50136. }
  50137. // 5. If no consonant is found in steps 3 or 4, move reph to a position
  50138. // immediately before the first post-base matra, syllable modifier
  50139. // sign or vedic sign that has a reordering class after the intended
  50140. // reph position. For example, if the reordering position for reph
  50141. // is post-main, it will skip above-base matras that also have a
  50142. // post-main position.
  50143. if (!found) {
  50144. // Copied from step 2.
  50145. newRephPos = start + 1;
  50146. while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {
  50147. newRephPos++;
  50148. }
  50149. if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {
  50150. // ->If ZWJ or ZWNJ are following this halant, position is moved after it.
  50151. if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {
  50152. newRephPos++;
  50153. }
  50154. found = true;
  50155. }
  50156. }
  50157. // 6. Otherwise, reorder reph to the end of the syllable.
  50158. if (!found) {
  50159. newRephPos = end - 1;
  50160. while (newRephPos > start && glyphs[newRephPos].shaperInfo.position === POSITIONS.SMVD) {
  50161. newRephPos--;
  50162. }
  50163. // If the Reph is to be ending up after a Matra,Halant sequence,
  50164. // position it before that Halant so it can interact with the Matra.
  50165. // However, if it's a plain Consonant,Halant we shouldn't do that.
  50166. // Uniscribe doesn't do this.
  50167. // TEST: U+0930,U+094D,U+0915,U+094B,U+094D
  50168. if (isHalantOrCoeng(glyphs[newRephPos])) {
  50169. for (var _i22 = base + 1; _i22 < newRephPos; _i22++) {
  50170. if (glyphs[_i22].shaperInfo.category === CATEGORIES.M) {
  50171. newRephPos--;
  50172. }
  50173. }
  50174. }
  50175. }
  50176. var reph = glyphs[start];
  50177. glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, newRephPos - start)));
  50178. glyphs[newRephPos] = reph;
  50179. if (start < base && base <= newRephPos) {
  50180. base--;
  50181. }
  50182. }
  50183. // o Reorder pre-base reordering consonants:
  50184. //
  50185. // If a pre-base reordering consonant is found, reorder it according to
  50186. // the following rules:
  50187. if (tryPref && base + 1 < end) {
  50188. for (var _i23 = base + 1; _i23 < end; _i23++) {
  50189. if (glyphs[_i23].features.pref) {
  50190. // 1. Only reorder a glyph produced by substitution during application
  50191. // of the <pref> feature. (Note that a font may shape a Ra consonant with
  50192. // the feature generally but block it in certain contexts.)
  50193. // Note: We just check that something got substituted. We don't check that
  50194. // the <pref> feature actually did it...
  50195. //
  50196. // Reorder pref only if it ligated.
  50197. if (glyphs[_i23].isLigated && !glyphs[_i23].isMultiplied) {
  50198. // 2. Try to find a target position the same way as for pre-base matra.
  50199. // If it is found, reorder pre-base consonant glyph.
  50200. //
  50201. // 3. If position is not found, reorder immediately before main
  50202. // consonant.
  50203. var _newPos = base;
  50204. // Malayalam / Tamil do not have "half" forms or explicit virama forms.
  50205. // The glyphs formed by 'half' are Chillus or ligated explicit viramas.
  50206. // We want to position matra after them.
  50207. if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {
  50208. while (_newPos > start && !(glyphs[_newPos - 1].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {
  50209. _newPos--;
  50210. }
  50211. // In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a
  50212. // split matra, it should be reordered to *before* the left part of such matra.
  50213. if (_newPos > start && glyphs[_newPos - 1].shaperInfo.category === CATEGORIES.M) {
  50214. var _oldPos2 = _i23;
  50215. for (var j = base + 1; j < _oldPos2; j++) {
  50216. if (glyphs[j].shaperInfo.category === CATEGORIES.M) {
  50217. _newPos--;
  50218. break;
  50219. }
  50220. }
  50221. }
  50222. }
  50223. if (_newPos > start && isHalantOrCoeng(glyphs[_newPos - 1])) {
  50224. // -> If ZWJ or ZWNJ follow this halant, position is moved after it.
  50225. if (_newPos < end && isJoiner(glyphs[_newPos])) {
  50226. _newPos++;
  50227. }
  50228. }
  50229. var _oldPos = _i23;
  50230. var _tmp = glyphs[_oldPos];
  50231. glyphs.splice.apply(glyphs, [_newPos + 1, 0].concat(glyphs.splice(_newPos, _oldPos - _newPos)));
  50232. glyphs[_newPos] = _tmp;
  50233. if (_newPos <= base && base < _oldPos) {
  50234. base++;
  50235. }
  50236. }
  50237. break;
  50238. }
  50239. }
  50240. }
  50241. // Apply 'init' to the Left Matra if it's a word start.
  50242. if (glyphs[start].shaperInfo.position === POSITIONS.Pre_M && (!start || !/Cf|Mn/.test(unicode.getCategory(glyphs[start - 1].codePoints[0])))) {
  50243. glyphs[start].features.init = true;
  50244. }
  50245. }
  50246. }
  50247. function nextSyllable(glyphs, start) {
  50248. if (start >= glyphs.length) return start;
  50249. var syllable = glyphs[start].shaperInfo.syllable;
  50250. while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) {}
  50251. return start;
  50252. }
  50253. var _class$7;
  50254. var _temp$3;
  50255. var categories$1 = useData.categories;
  50256. var decompositions$2 = useData.decompositions;
  50257. var trie$2 = new UnicodeTrie(Buffer("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","base64"));
  50258. var stateMachine$1 = new StateMachine(useData);
  50259. /**
  50260. * This shaper is an implementation of the Universal Shaping Engine, which
  50261. * uses Unicode data to shape a number of scripts without a dedicated shaping engine.
  50262. * See https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm.
  50263. */
  50264. var UniversalShaper = (_temp$3 = _class$7 = function (_DefaultShaper) {
  50265. _inherits(UniversalShaper, _DefaultShaper);
  50266. function UniversalShaper() {
  50267. _classCallCheck(this, UniversalShaper);
  50268. return _possibleConstructorReturn(this, _DefaultShaper.apply(this, arguments));
  50269. }
  50270. UniversalShaper.planFeatures = function planFeatures(plan) {
  50271. plan.addStage(setupSyllables$1);
  50272. // Default glyph pre-processing group
  50273. plan.addStage(['locl', 'ccmp', 'nukt', 'akhn']);
  50274. // Reordering group
  50275. plan.addStage(clearSubstitutionFlags);
  50276. plan.addStage(['rphf'], false);
  50277. plan.addStage(recordRphf);
  50278. plan.addStage(clearSubstitutionFlags);
  50279. plan.addStage(['pref']);
  50280. plan.addStage(recordPref);
  50281. // Orthographic unit shaping group
  50282. plan.addStage(['rkrf', 'abvf', 'blwf', 'half', 'pstf', 'vatu', 'cjct']);
  50283. plan.addStage(reorder);
  50284. // Topographical features
  50285. // Scripts that need this are handled by the Arabic shaper, not implemented here for now.
  50286. // plan.addStage(['isol', 'init', 'medi', 'fina', 'med2', 'fin2', 'fin3'], false);
  50287. // Standard topographic presentation and positional feature application
  50288. plan.addStage(['abvs', 'blws', 'pres', 'psts', 'dist', 'abvm', 'blwm']);
  50289. };
  50290. UniversalShaper.assignFeatures = function assignFeatures(plan, glyphs) {
  50291. var _loop = function _loop(i) {
  50292. var codepoint = glyphs[i].codePoints[0];
  50293. if (decompositions$2[codepoint]) {
  50294. var decomposed = decompositions$2[codepoint].map(function (c) {
  50295. var g = plan.font.glyphForCodePoint(c);
  50296. return new GlyphInfo(plan.font, g.id, [c], glyphs[i].features);
  50297. });
  50298. glyphs.splice.apply(glyphs, [i, 1].concat(decomposed));
  50299. }
  50300. };
  50301. // Decompose split vowels
  50302. // TODO: do this in a more general unicode normalizer
  50303. for (var i = glyphs.length - 1; i >= 0; i--) {
  50304. _loop(i);
  50305. }
  50306. };
  50307. return UniversalShaper;
  50308. }(DefaultShaper), _class$7.zeroMarkWidths = 'BEFORE_GPOS', _temp$3);
  50309. function useCategory(glyph) {
  50310. return trie$2.get(glyph.codePoints[0]);
  50311. }
  50312. var USEInfo = function USEInfo(category, syllableType, syllable) {
  50313. _classCallCheck(this, USEInfo);
  50314. this.category = category;
  50315. this.syllableType = syllableType;
  50316. this.syllable = syllable;
  50317. };
  50318. function setupSyllables$1(font, glyphs) {
  50319. var syllable = 0;
  50320. for (var _iterator = stateMachine$1.match(glyphs.map(useCategory)), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  50321. var _ref;
  50322. if (_isArray) {
  50323. if (_i >= _iterator.length) break;
  50324. _ref = _iterator[_i++];
  50325. } else {
  50326. _i = _iterator.next();
  50327. if (_i.done) break;
  50328. _ref = _i.value;
  50329. }
  50330. var _ref2 = _ref,
  50331. start = _ref2[0],
  50332. end = _ref2[1],
  50333. tags = _ref2[2];
  50334. ++syllable;
  50335. // Create shaper info
  50336. for (var i = start; i <= end; i++) {
  50337. glyphs[i].shaperInfo = new USEInfo(categories$1[useCategory(glyphs[i])], tags[0], syllable);
  50338. }
  50339. // Assign rphf feature
  50340. var limit = glyphs[start].shaperInfo.category === 'R' ? 1 : Math.min(3, end - start);
  50341. for (var _i2 = start; _i2 < start + limit; _i2++) {
  50342. glyphs[_i2].features.rphf = true;
  50343. }
  50344. }
  50345. }
  50346. function clearSubstitutionFlags(font, glyphs) {
  50347. for (var _iterator2 = glyphs, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  50348. var _ref3;
  50349. if (_isArray2) {
  50350. if (_i3 >= _iterator2.length) break;
  50351. _ref3 = _iterator2[_i3++];
  50352. } else {
  50353. _i3 = _iterator2.next();
  50354. if (_i3.done) break;
  50355. _ref3 = _i3.value;
  50356. }
  50357. var glyph = _ref3;
  50358. glyph.substituted = false;
  50359. }
  50360. }
  50361. function recordRphf(font, glyphs) {
  50362. for (var _iterator3 = glyphs, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  50363. var _ref4;
  50364. if (_isArray3) {
  50365. if (_i4 >= _iterator3.length) break;
  50366. _ref4 = _iterator3[_i4++];
  50367. } else {
  50368. _i4 = _iterator3.next();
  50369. if (_i4.done) break;
  50370. _ref4 = _i4.value;
  50371. }
  50372. var glyph = _ref4;
  50373. if (glyph.substituted && glyph.features.rphf) {
  50374. // Mark a substituted repha.
  50375. glyph.shaperInfo.category = 'R';
  50376. }
  50377. }
  50378. }
  50379. function recordPref(font, glyphs) {
  50380. for (var _iterator4 = glyphs, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  50381. var _ref5;
  50382. if (_isArray4) {
  50383. if (_i5 >= _iterator4.length) break;
  50384. _ref5 = _iterator4[_i5++];
  50385. } else {
  50386. _i5 = _iterator4.next();
  50387. if (_i5.done) break;
  50388. _ref5 = _i5.value;
  50389. }
  50390. var glyph = _ref5;
  50391. if (glyph.substituted) {
  50392. // Mark a substituted pref as VPre, as they behave the same way.
  50393. glyph.shaperInfo.category = 'VPre';
  50394. }
  50395. }
  50396. }
  50397. function reorder(font, glyphs) {
  50398. var dottedCircle = font.glyphForCodePoint(0x25cc).id;
  50399. for (var start = 0, end = nextSyllable$1(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable$1(glyphs, start)) {
  50400. var i = void 0,
  50401. j = void 0;
  50402. var info = glyphs[start].shaperInfo;
  50403. var type = info.syllableType;
  50404. // Only a few syllable types need reordering.
  50405. if (type !== 'virama_terminated_cluster' && type !== 'standard_cluster' && type !== 'broken_cluster') {
  50406. continue;
  50407. }
  50408. // Insert a dotted circle glyph in broken clusters.
  50409. if (type === 'broken_cluster' && dottedCircle) {
  50410. var g = new GlyphInfo(font, dottedCircle, [0x25cc]);
  50411. g.shaperInfo = info;
  50412. // Insert after possible Repha.
  50413. for (i = start; i < end && glyphs[i].shaperInfo.category === 'R'; i++) {}
  50414. glyphs.splice(++i, 0, g);
  50415. end++;
  50416. }
  50417. // Move things forward.
  50418. if (info.category === 'R' && end - start > 1) {
  50419. // Got a repha. Reorder it to after first base, before first halant.
  50420. for (i = start + 1; i < end; i++) {
  50421. info = glyphs[i].shaperInfo;
  50422. if (isBase(info) || isHalant(glyphs[i])) {
  50423. // If we hit a halant, move before it; otherwise it's a base: move to it's
  50424. // place, and shift things in between backward.
  50425. if (isHalant(glyphs[i])) {
  50426. i--;
  50427. }
  50428. glyphs.splice.apply(glyphs, [start, 0].concat(glyphs.splice(start + 1, i - start), [glyphs[i]]));
  50429. break;
  50430. }
  50431. }
  50432. }
  50433. // Move things back.
  50434. for (i = start, j = end; i < end; i++) {
  50435. info = glyphs[i].shaperInfo;
  50436. if (isBase(info) || isHalant(glyphs[i])) {
  50437. // If we hit a halant, move after it; otherwise it's a base: move to it's
  50438. // place, and shift things in between backward.
  50439. j = isHalant(glyphs[i]) ? i + 1 : i;
  50440. } else if ((info.category === 'VPre' || info.category === 'VMPre') && j < i) {
  50441. glyphs.splice.apply(glyphs, [j, 1, glyphs[i]].concat(glyphs.splice(j, i - j)));
  50442. }
  50443. }
  50444. }
  50445. }
  50446. function nextSyllable$1(glyphs, start) {
  50447. if (start >= glyphs.length) return start;
  50448. var syllable = glyphs[start].shaperInfo.syllable;
  50449. while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable) {}
  50450. return start;
  50451. }
  50452. function isHalant(glyph) {
  50453. return glyph.shaperInfo.category === 'H' && !glyph.isLigated;
  50454. }
  50455. function isBase(info) {
  50456. return info.category === 'B' || info.category === 'GB';
  50457. }
  50458. var SHAPERS = {
  50459. arab: ArabicShaper, // Arabic
  50460. mong: ArabicShaper, // Mongolian
  50461. syrc: ArabicShaper, // Syriac
  50462. 'nko ': ArabicShaper, // N'Ko
  50463. phag: ArabicShaper, // Phags Pa
  50464. mand: ArabicShaper, // Mandaic
  50465. mani: ArabicShaper, // Manichaean
  50466. phlp: ArabicShaper, // Psalter Pahlavi
  50467. hang: HangulShaper, // Hangul
  50468. bng2: IndicShaper, // Bengali
  50469. beng: IndicShaper, // Bengali
  50470. dev2: IndicShaper, // Devanagari
  50471. deva: IndicShaper, // Devanagari
  50472. gjr2: IndicShaper, // Gujarati
  50473. gujr: IndicShaper, // Gujarati
  50474. guru: IndicShaper, // Gurmukhi
  50475. gur2: IndicShaper, // Gurmukhi
  50476. knda: IndicShaper, // Kannada
  50477. knd2: IndicShaper, // Kannada
  50478. mlm2: IndicShaper, // Malayalam
  50479. mlym: IndicShaper, // Malayalam
  50480. ory2: IndicShaper, // Oriya
  50481. orya: IndicShaper, // Oriya
  50482. taml: IndicShaper, // Tamil
  50483. tml2: IndicShaper, // Tamil
  50484. telu: IndicShaper, // Telugu
  50485. tel2: IndicShaper, // Telugu
  50486. khmr: IndicShaper, // Khmer
  50487. bali: UniversalShaper, // Balinese
  50488. batk: UniversalShaper, // Batak
  50489. brah: UniversalShaper, // Brahmi
  50490. bugi: UniversalShaper, // Buginese
  50491. buhd: UniversalShaper, // Buhid
  50492. cakm: UniversalShaper, // Chakma
  50493. cham: UniversalShaper, // Cham
  50494. dupl: UniversalShaper, // Duployan
  50495. egyp: UniversalShaper, // Egyptian Hieroglyphs
  50496. gran: UniversalShaper, // Grantha
  50497. hano: UniversalShaper, // Hanunoo
  50498. java: UniversalShaper, // Javanese
  50499. kthi: UniversalShaper, // Kaithi
  50500. kali: UniversalShaper, // Kayah Li
  50501. khar: UniversalShaper, // Kharoshthi
  50502. khoj: UniversalShaper, // Khojki
  50503. sind: UniversalShaper, // Khudawadi
  50504. lepc: UniversalShaper, // Lepcha
  50505. limb: UniversalShaper, // Limbu
  50506. mahj: UniversalShaper, // Mahajani
  50507. // mand: UniversalShaper, // Mandaic
  50508. // mani: UniversalShaper, // Manichaean
  50509. mtei: UniversalShaper, // Meitei Mayek
  50510. modi: UniversalShaper, // Modi
  50511. // mong: UniversalShaper, // Mongolian
  50512. // 'nko ': UniversalShaper, // N’Ko
  50513. hmng: UniversalShaper, // Pahawh Hmong
  50514. // phag: UniversalShaper, // Phags-pa
  50515. // phlp: UniversalShaper, // Psalter Pahlavi
  50516. rjng: UniversalShaper, // Rejang
  50517. saur: UniversalShaper, // Saurashtra
  50518. shrd: UniversalShaper, // Sharada
  50519. sidd: UniversalShaper, // Siddham
  50520. sinh: UniversalShaper, // Sinhala
  50521. sund: UniversalShaper, // Sundanese
  50522. sylo: UniversalShaper, // Syloti Nagri
  50523. tglg: UniversalShaper, // Tagalog
  50524. tagb: UniversalShaper, // Tagbanwa
  50525. tale: UniversalShaper, // Tai Le
  50526. lana: UniversalShaper, // Tai Tham
  50527. tavt: UniversalShaper, // Tai Viet
  50528. takr: UniversalShaper, // Takri
  50529. tibt: UniversalShaper, // Tibetan
  50530. tfng: UniversalShaper, // Tifinagh
  50531. tirh: UniversalShaper, // Tirhuta
  50532. latn: DefaultShaper, // Latin
  50533. DFLT: DefaultShaper // Default
  50534. };
  50535. function choose(script) {
  50536. if (!Array.isArray(script)) {
  50537. script = [script];
  50538. }
  50539. for (var _iterator = script, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  50540. var _ref;
  50541. if (_isArray) {
  50542. if (_i >= _iterator.length) break;
  50543. _ref = _iterator[_i++];
  50544. } else {
  50545. _i = _iterator.next();
  50546. if (_i.done) break;
  50547. _ref = _i.value;
  50548. }
  50549. var s = _ref;
  50550. var shaper = SHAPERS[s];
  50551. if (shaper) {
  50552. return shaper;
  50553. }
  50554. }
  50555. return DefaultShaper;
  50556. }
  50557. var GSUBProcessor = function (_OTProcessor) {
  50558. _inherits(GSUBProcessor, _OTProcessor);
  50559. function GSUBProcessor() {
  50560. _classCallCheck(this, GSUBProcessor);
  50561. return _possibleConstructorReturn(this, _OTProcessor.apply(this, arguments));
  50562. }
  50563. GSUBProcessor.prototype.applyLookup = function applyLookup(lookupType, table) {
  50564. var _this2 = this;
  50565. switch (lookupType) {
  50566. case 1:
  50567. {
  50568. // Single Substitution
  50569. var index = this.coverageIndex(table.coverage);
  50570. if (index === -1) {
  50571. return false;
  50572. }
  50573. var glyph = this.glyphIterator.cur;
  50574. switch (table.version) {
  50575. case 1:
  50576. glyph.id = glyph.id + table.deltaGlyphID & 0xffff;
  50577. break;
  50578. case 2:
  50579. glyph.id = table.substitute.get(index);
  50580. break;
  50581. }
  50582. return true;
  50583. }
  50584. case 2:
  50585. {
  50586. // Multiple Substitution
  50587. var _index = this.coverageIndex(table.coverage);
  50588. if (_index !== -1) {
  50589. var _glyphs;
  50590. var sequence = table.sequences.get(_index);
  50591. this.glyphIterator.cur.id = sequence[0];
  50592. this.glyphIterator.cur.ligatureComponent = 0;
  50593. var features = this.glyphIterator.cur.features;
  50594. var curGlyph = this.glyphIterator.cur;
  50595. var replacement = sequence.slice(1).map(function (gid, i) {
  50596. var glyph = new GlyphInfo(_this2.font, gid, undefined, features);
  50597. glyph.shaperInfo = curGlyph.shaperInfo;
  50598. glyph.isLigated = curGlyph.isLigated;
  50599. glyph.ligatureComponent = i + 1;
  50600. glyph.substituted = true;
  50601. glyph.isMultiplied = true;
  50602. return glyph;
  50603. });
  50604. (_glyphs = this.glyphs).splice.apply(_glyphs, [this.glyphIterator.index + 1, 0].concat(replacement));
  50605. return true;
  50606. }
  50607. return false;
  50608. }
  50609. case 3:
  50610. {
  50611. // Alternate Substitution
  50612. var _index2 = this.coverageIndex(table.coverage);
  50613. if (_index2 !== -1) {
  50614. var USER_INDEX = 0; // TODO
  50615. this.glyphIterator.cur.id = table.alternateSet.get(_index2)[USER_INDEX];
  50616. return true;
  50617. }
  50618. return false;
  50619. }
  50620. case 4:
  50621. {
  50622. // Ligature Substitution
  50623. var _index3 = this.coverageIndex(table.coverage);
  50624. if (_index3 === -1) {
  50625. return false;
  50626. }
  50627. for (var _iterator = table.ligatureSets.get(_index3), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  50628. var _ref;
  50629. if (_isArray) {
  50630. if (_i >= _iterator.length) break;
  50631. _ref = _iterator[_i++];
  50632. } else {
  50633. _i = _iterator.next();
  50634. if (_i.done) break;
  50635. _ref = _i.value;
  50636. }
  50637. var ligature = _ref;
  50638. var matched = this.sequenceMatchIndices(1, ligature.components);
  50639. if (!matched) {
  50640. continue;
  50641. }
  50642. var _curGlyph = this.glyphIterator.cur;
  50643. // Concatenate all of the characters the new ligature will represent
  50644. var characters = _curGlyph.codePoints.slice();
  50645. for (var _iterator2 = matched, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  50646. var _ref2;
  50647. if (_isArray2) {
  50648. if (_i2 >= _iterator2.length) break;
  50649. _ref2 = _iterator2[_i2++];
  50650. } else {
  50651. _i2 = _iterator2.next();
  50652. if (_i2.done) break;
  50653. _ref2 = _i2.value;
  50654. }
  50655. var _index4 = _ref2;
  50656. characters.push.apply(characters, this.glyphs[_index4].codePoints);
  50657. }
  50658. // Create the replacement ligature glyph
  50659. var ligatureGlyph = new GlyphInfo(this.font, ligature.glyph, characters, _curGlyph.features);
  50660. ligatureGlyph.shaperInfo = _curGlyph.shaperInfo;
  50661. ligatureGlyph.isLigated = true;
  50662. ligatureGlyph.substituted = true;
  50663. // From Harfbuzz:
  50664. // - If it *is* a mark ligature, we don't allocate a new ligature id, and leave
  50665. // the ligature to keep its old ligature id. This will allow it to attach to
  50666. // a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,
  50667. // and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a
  50668. // ligature id and component value of 2. Then if SHADDA,FATHA form a ligature
  50669. // later, we don't want them to lose their ligature id/component, otherwise
  50670. // GPOS will fail to correctly position the mark ligature on top of the
  50671. // LAM,LAM,HEH ligature. See https://bugzilla.gnome.org/show_bug.cgi?id=676343
  50672. //
  50673. // - If a ligature is formed of components that some of which are also ligatures
  50674. // themselves, and those ligature components had marks attached to *their*
  50675. // components, we have to attach the marks to the new ligature component
  50676. // positions! Now *that*'s tricky! And these marks may be following the
  50677. // last component of the whole sequence, so we should loop forward looking
  50678. // for them and update them.
  50679. //
  50680. // Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a
  50681. // 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature
  50682. // id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature
  50683. // form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to
  50684. // the new ligature with a component value of 2.
  50685. //
  50686. // This in fact happened to a font... See https://bugzilla.gnome.org/show_bug.cgi?id=437633
  50687. var isMarkLigature = _curGlyph.isMark;
  50688. for (var i = 0; i < matched.length && isMarkLigature; i++) {
  50689. isMarkLigature = this.glyphs[matched[i]].isMark;
  50690. }
  50691. ligatureGlyph.ligatureID = isMarkLigature ? null : this.ligatureID++;
  50692. var lastLigID = _curGlyph.ligatureID;
  50693. var lastNumComps = _curGlyph.codePoints.length;
  50694. var curComps = lastNumComps;
  50695. var idx = this.glyphIterator.index + 1;
  50696. // Set ligatureID and ligatureComponent on glyphs that were skipped in the matched sequence.
  50697. // This allows GPOS to attach marks to the correct ligature components.
  50698. for (var _iterator3 = matched, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  50699. var _ref3;
  50700. if (_isArray3) {
  50701. if (_i3 >= _iterator3.length) break;
  50702. _ref3 = _iterator3[_i3++];
  50703. } else {
  50704. _i3 = _iterator3.next();
  50705. if (_i3.done) break;
  50706. _ref3 = _i3.value;
  50707. }
  50708. var matchIndex = _ref3;
  50709. // Don't assign new ligature components for mark ligatures (see above)
  50710. if (isMarkLigature) {
  50711. idx = matchIndex;
  50712. } else {
  50713. while (idx < matchIndex) {
  50714. var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[idx].ligatureComponent || 1, lastNumComps);
  50715. this.glyphs[idx].ligatureID = ligatureGlyph.ligatureID;
  50716. this.glyphs[idx].ligatureComponent = ligatureComponent;
  50717. idx++;
  50718. }
  50719. }
  50720. lastLigID = this.glyphs[idx].ligatureID;
  50721. lastNumComps = this.glyphs[idx].codePoints.length;
  50722. curComps += lastNumComps;
  50723. idx++; // skip base glyph
  50724. }
  50725. // Adjust ligature components for any marks following
  50726. if (lastLigID && !isMarkLigature) {
  50727. for (var _i4 = idx; _i4 < this.glyphs.length; _i4++) {
  50728. if (this.glyphs[_i4].ligatureID === lastLigID) {
  50729. var ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[_i4].ligatureComponent || 1, lastNumComps);
  50730. this.glyphs[_i4].ligatureComponent = ligatureComponent;
  50731. } else {
  50732. break;
  50733. }
  50734. }
  50735. }
  50736. // Delete the matched glyphs, and replace the current glyph with the ligature glyph
  50737. for (var _i5 = matched.length - 1; _i5 >= 0; _i5--) {
  50738. this.glyphs.splice(matched[_i5], 1);
  50739. }
  50740. this.glyphs[this.glyphIterator.index] = ligatureGlyph;
  50741. return true;
  50742. }
  50743. return false;
  50744. }
  50745. case 5:
  50746. // Contextual Substitution
  50747. return this.applyContext(table);
  50748. case 6:
  50749. // Chaining Contextual Substitution
  50750. return this.applyChainingContext(table);
  50751. case 7:
  50752. // Extension Substitution
  50753. return this.applyLookup(table.lookupType, table.extension);
  50754. default:
  50755. throw new Error('GSUB lookupType ' + lookupType + ' is not supported');
  50756. }
  50757. };
  50758. return GSUBProcessor;
  50759. }(OTProcessor);
  50760. var GPOSProcessor = function (_OTProcessor) {
  50761. _inherits(GPOSProcessor, _OTProcessor);
  50762. function GPOSProcessor() {
  50763. _classCallCheck(this, GPOSProcessor);
  50764. return _possibleConstructorReturn(this, _OTProcessor.apply(this, arguments));
  50765. }
  50766. GPOSProcessor.prototype.applyPositionValue = function applyPositionValue(sequenceIndex, value) {
  50767. var position = this.positions[this.glyphIterator.peekIndex(sequenceIndex)];
  50768. if (value.xAdvance != null) {
  50769. position.xAdvance += value.xAdvance;
  50770. }
  50771. if (value.yAdvance != null) {
  50772. position.yAdvance += value.yAdvance;
  50773. }
  50774. if (value.xPlacement != null) {
  50775. position.xOffset += value.xPlacement;
  50776. }
  50777. if (value.yPlacement != null) {
  50778. position.yOffset += value.yPlacement;
  50779. }
  50780. // Adjustments for font variations
  50781. var variationProcessor = this.font._variationProcessor;
  50782. var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;
  50783. if (variationProcessor && variationStore) {
  50784. if (value.xPlaDevice) {
  50785. position.xOffset += variationProcessor.getDelta(variationStore, value.xPlaDevice.a, value.xPlaDevice.b);
  50786. }
  50787. if (value.yPlaDevice) {
  50788. position.yOffset += variationProcessor.getDelta(variationStore, value.yPlaDevice.a, value.yPlaDevice.b);
  50789. }
  50790. if (value.xAdvDevice) {
  50791. position.xAdvance += variationProcessor.getDelta(variationStore, value.xAdvDevice.a, value.xAdvDevice.b);
  50792. }
  50793. if (value.yAdvDevice) {
  50794. position.yAdvance += variationProcessor.getDelta(variationStore, value.yAdvDevice.a, value.yAdvDevice.b);
  50795. }
  50796. }
  50797. // TODO: device tables
  50798. };
  50799. GPOSProcessor.prototype.applyLookup = function applyLookup(lookupType, table) {
  50800. switch (lookupType) {
  50801. case 1:
  50802. {
  50803. // Single positioning value
  50804. var index = this.coverageIndex(table.coverage);
  50805. if (index === -1) {
  50806. return false;
  50807. }
  50808. switch (table.version) {
  50809. case 1:
  50810. this.applyPositionValue(0, table.value);
  50811. break;
  50812. case 2:
  50813. this.applyPositionValue(0, table.values.get(index));
  50814. break;
  50815. }
  50816. return true;
  50817. }
  50818. case 2:
  50819. {
  50820. // Pair Adjustment Positioning
  50821. var nextGlyph = this.glyphIterator.peek();
  50822. if (!nextGlyph) {
  50823. return false;
  50824. }
  50825. var _index = this.coverageIndex(table.coverage);
  50826. if (_index === -1) {
  50827. return false;
  50828. }
  50829. switch (table.version) {
  50830. case 1:
  50831. // Adjustments for glyph pairs
  50832. var set = table.pairSets.get(_index);
  50833. for (var _iterator = set, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  50834. var _ref;
  50835. if (_isArray) {
  50836. if (_i >= _iterator.length) break;
  50837. _ref = _iterator[_i++];
  50838. } else {
  50839. _i = _iterator.next();
  50840. if (_i.done) break;
  50841. _ref = _i.value;
  50842. }
  50843. var _pair = _ref;
  50844. if (_pair.secondGlyph === nextGlyph.id) {
  50845. this.applyPositionValue(0, _pair.value1);
  50846. this.applyPositionValue(1, _pair.value2);
  50847. return true;
  50848. }
  50849. }
  50850. return false;
  50851. case 2:
  50852. // Class pair adjustment
  50853. var class1 = this.getClassID(this.glyphIterator.cur.id, table.classDef1);
  50854. var class2 = this.getClassID(nextGlyph.id, table.classDef2);
  50855. if (class1 === -1 || class2 === -1) {
  50856. return false;
  50857. }
  50858. var pair = table.classRecords.get(class1).get(class2);
  50859. this.applyPositionValue(0, pair.value1);
  50860. this.applyPositionValue(1, pair.value2);
  50861. return true;
  50862. }
  50863. }
  50864. case 3:
  50865. {
  50866. // Cursive Attachment Positioning
  50867. var nextIndex = this.glyphIterator.peekIndex();
  50868. var _nextGlyph = this.glyphs[nextIndex];
  50869. if (!_nextGlyph) {
  50870. return false;
  50871. }
  50872. var curRecord = table.entryExitRecords[this.coverageIndex(table.coverage)];
  50873. if (!curRecord || !curRecord.exitAnchor) {
  50874. return false;
  50875. }
  50876. var nextRecord = table.entryExitRecords[this.coverageIndex(table.coverage, _nextGlyph.id)];
  50877. if (!nextRecord || !nextRecord.entryAnchor) {
  50878. return false;
  50879. }
  50880. var entry = this.getAnchor(nextRecord.entryAnchor);
  50881. var exit = this.getAnchor(curRecord.exitAnchor);
  50882. var cur = this.positions[this.glyphIterator.index];
  50883. var next = this.positions[nextIndex];
  50884. switch (this.direction) {
  50885. case 'ltr':
  50886. cur.xAdvance = exit.x + cur.xOffset;
  50887. var d = entry.x + next.xOffset;
  50888. next.xAdvance -= d;
  50889. next.xOffset -= d;
  50890. break;
  50891. case 'rtl':
  50892. d = exit.x + cur.xOffset;
  50893. cur.xAdvance -= d;
  50894. cur.xOffset -= d;
  50895. next.xAdvance = entry.x + next.xOffset;
  50896. break;
  50897. }
  50898. if (this.glyphIterator.flags.rightToLeft) {
  50899. this.glyphIterator.cur.cursiveAttachment = nextIndex;
  50900. cur.yOffset = entry.y - exit.y;
  50901. } else {
  50902. _nextGlyph.cursiveAttachment = this.glyphIterator.index;
  50903. cur.yOffset = exit.y - entry.y;
  50904. }
  50905. return true;
  50906. }
  50907. case 4:
  50908. {
  50909. // Mark to base positioning
  50910. var markIndex = this.coverageIndex(table.markCoverage);
  50911. if (markIndex === -1) {
  50912. return false;
  50913. }
  50914. // search backward for a base glyph
  50915. var baseGlyphIndex = this.glyphIterator.index;
  50916. while (--baseGlyphIndex >= 0 && (this.glyphs[baseGlyphIndex].isMark || this.glyphs[baseGlyphIndex].ligatureComponent > 0)) {}
  50917. if (baseGlyphIndex < 0) {
  50918. return false;
  50919. }
  50920. var baseIndex = this.coverageIndex(table.baseCoverage, this.glyphs[baseGlyphIndex].id);
  50921. if (baseIndex === -1) {
  50922. return false;
  50923. }
  50924. var markRecord = table.markArray[markIndex];
  50925. var baseAnchor = table.baseArray[baseIndex][markRecord.class];
  50926. this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);
  50927. return true;
  50928. }
  50929. case 5:
  50930. {
  50931. // Mark to ligature positioning
  50932. var _markIndex = this.coverageIndex(table.markCoverage);
  50933. if (_markIndex === -1) {
  50934. return false;
  50935. }
  50936. // search backward for a base glyph
  50937. var _baseGlyphIndex = this.glyphIterator.index;
  50938. while (--_baseGlyphIndex >= 0 && this.glyphs[_baseGlyphIndex].isMark) {}
  50939. if (_baseGlyphIndex < 0) {
  50940. return false;
  50941. }
  50942. var ligIndex = this.coverageIndex(table.ligatureCoverage, this.glyphs[_baseGlyphIndex].id);
  50943. if (ligIndex === -1) {
  50944. return false;
  50945. }
  50946. var ligAttach = table.ligatureArray[ligIndex];
  50947. var markGlyph = this.glyphIterator.cur;
  50948. var ligGlyph = this.glyphs[_baseGlyphIndex];
  50949. var compIndex = ligGlyph.ligatureID && ligGlyph.ligatureID === markGlyph.ligatureID && markGlyph.ligatureComponent > 0 ? Math.min(markGlyph.ligatureComponent, ligGlyph.codePoints.length) - 1 : ligGlyph.codePoints.length - 1;
  50950. var _markRecord = table.markArray[_markIndex];
  50951. var _baseAnchor = ligAttach[compIndex][_markRecord.class];
  50952. this.applyAnchor(_markRecord, _baseAnchor, _baseGlyphIndex);
  50953. return true;
  50954. }
  50955. case 6:
  50956. {
  50957. // Mark to mark positioning
  50958. var mark1Index = this.coverageIndex(table.mark1Coverage);
  50959. if (mark1Index === -1) {
  50960. return false;
  50961. }
  50962. // get the previous mark to attach to
  50963. var prevIndex = this.glyphIterator.peekIndex(-1);
  50964. var prev = this.glyphs[prevIndex];
  50965. if (!prev || !prev.isMark) {
  50966. return false;
  50967. }
  50968. var _cur = this.glyphIterator.cur;
  50969. // The following logic was borrowed from Harfbuzz
  50970. var good = false;
  50971. if (_cur.ligatureID === prev.ligatureID) {
  50972. if (!_cur.ligatureID) {
  50973. // Marks belonging to the same base
  50974. good = true;
  50975. } else if (_cur.ligatureComponent === prev.ligatureComponent) {
  50976. // Marks belonging to the same ligature component
  50977. good = true;
  50978. }
  50979. } else {
  50980. // If ligature ids don't match, it may be the case that one of the marks
  50981. // itself is a ligature, in which case match.
  50982. if (_cur.ligatureID && !_cur.ligatureComponent || prev.ligatureID && !prev.ligatureComponent) {
  50983. good = true;
  50984. }
  50985. }
  50986. if (!good) {
  50987. return false;
  50988. }
  50989. var mark2Index = this.coverageIndex(table.mark2Coverage, prev.id);
  50990. if (mark2Index === -1) {
  50991. return false;
  50992. }
  50993. var _markRecord2 = table.mark1Array[mark1Index];
  50994. var _baseAnchor2 = table.mark2Array[mark2Index][_markRecord2.class];
  50995. this.applyAnchor(_markRecord2, _baseAnchor2, prevIndex);
  50996. return true;
  50997. }
  50998. case 7:
  50999. // Contextual positioning
  51000. return this.applyContext(table);
  51001. case 8:
  51002. // Chaining contextual positioning
  51003. return this.applyChainingContext(table);
  51004. case 9:
  51005. // Extension positioning
  51006. return this.applyLookup(table.lookupType, table.extension);
  51007. default:
  51008. throw new Error('Unsupported GPOS table: ' + lookupType);
  51009. }
  51010. };
  51011. GPOSProcessor.prototype.applyAnchor = function applyAnchor(markRecord, baseAnchor, baseGlyphIndex) {
  51012. var baseCoords = this.getAnchor(baseAnchor);
  51013. var markCoords = this.getAnchor(markRecord.markAnchor);
  51014. var basePos = this.positions[baseGlyphIndex];
  51015. var markPos = this.positions[this.glyphIterator.index];
  51016. markPos.xOffset = baseCoords.x - markCoords.x;
  51017. markPos.yOffset = baseCoords.y - markCoords.y;
  51018. this.glyphIterator.cur.markAttachment = baseGlyphIndex;
  51019. };
  51020. GPOSProcessor.prototype.getAnchor = function getAnchor(anchor) {
  51021. // TODO: contour point, device tables
  51022. var x = anchor.xCoordinate;
  51023. var y = anchor.yCoordinate;
  51024. // Adjustments for font variations
  51025. var variationProcessor = this.font._variationProcessor;
  51026. var variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;
  51027. if (variationProcessor && variationStore) {
  51028. if (anchor.xDeviceTable) {
  51029. x += variationProcessor.getDelta(variationStore, anchor.xDeviceTable.a, anchor.xDeviceTable.b);
  51030. }
  51031. if (anchor.yDeviceTable) {
  51032. y += variationProcessor.getDelta(variationStore, anchor.yDeviceTable.a, anchor.yDeviceTable.b);
  51033. }
  51034. }
  51035. return { x: x, y: y };
  51036. };
  51037. GPOSProcessor.prototype.applyFeatures = function applyFeatures(userFeatures, glyphs, advances) {
  51038. _OTProcessor.prototype.applyFeatures.call(this, userFeatures, glyphs, advances);
  51039. for (var i = 0; i < this.glyphs.length; i++) {
  51040. this.fixCursiveAttachment(i);
  51041. }
  51042. this.fixMarkAttachment();
  51043. };
  51044. GPOSProcessor.prototype.fixCursiveAttachment = function fixCursiveAttachment(i) {
  51045. var glyph = this.glyphs[i];
  51046. if (glyph.cursiveAttachment != null) {
  51047. var j = glyph.cursiveAttachment;
  51048. glyph.cursiveAttachment = null;
  51049. this.fixCursiveAttachment(j);
  51050. this.positions[i].yOffset += this.positions[j].yOffset;
  51051. }
  51052. };
  51053. GPOSProcessor.prototype.fixMarkAttachment = function fixMarkAttachment() {
  51054. for (var i = 0; i < this.glyphs.length; i++) {
  51055. var glyph = this.glyphs[i];
  51056. if (glyph.markAttachment != null) {
  51057. var j = glyph.markAttachment;
  51058. this.positions[i].xOffset += this.positions[j].xOffset;
  51059. this.positions[i].yOffset += this.positions[j].yOffset;
  51060. if (this.direction === 'ltr') {
  51061. for (var k = j; k < i; k++) {
  51062. this.positions[i].xOffset -= this.positions[k].xAdvance;
  51063. this.positions[i].yOffset -= this.positions[k].yAdvance;
  51064. }
  51065. } else {
  51066. for (var _k = j + 1; _k < i + 1; _k++) {
  51067. this.positions[i].xOffset += this.positions[_k].xAdvance;
  51068. this.positions[i].yOffset += this.positions[_k].yAdvance;
  51069. }
  51070. }
  51071. }
  51072. }
  51073. };
  51074. return GPOSProcessor;
  51075. }(OTProcessor);
  51076. var OTLayoutEngine = function () {
  51077. function OTLayoutEngine(font) {
  51078. _classCallCheck(this, OTLayoutEngine);
  51079. this.font = font;
  51080. this.glyphInfos = null;
  51081. this.plan = null;
  51082. this.GSUBProcessor = null;
  51083. this.GPOSProcessor = null;
  51084. this.fallbackPosition = true;
  51085. if (font.GSUB) {
  51086. this.GSUBProcessor = new GSUBProcessor(font, font.GSUB);
  51087. }
  51088. if (font.GPOS) {
  51089. this.GPOSProcessor = new GPOSProcessor(font, font.GPOS);
  51090. }
  51091. }
  51092. OTLayoutEngine.prototype.setup = function setup(glyphRun) {
  51093. var _this = this;
  51094. // Map glyphs to GlyphInfo objects so data can be passed between
  51095. // GSUB and GPOS without mutating the real (shared) Glyph objects.
  51096. this.glyphInfos = glyphRun.glyphs.map(function (glyph) {
  51097. return new GlyphInfo(_this.font, glyph.id, [].concat(glyph.codePoints));
  51098. });
  51099. // Select a script based on what is available in GSUB/GPOS.
  51100. var script = null;
  51101. if (this.GPOSProcessor) {
  51102. script = this.GPOSProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);
  51103. }
  51104. if (this.GSUBProcessor) {
  51105. script = this.GSUBProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);
  51106. }
  51107. // Choose a shaper based on the script, and setup a shaping plan.
  51108. // This determines which features to apply to which glyphs.
  51109. this.shaper = choose(script);
  51110. this.plan = new ShapingPlan(this.font, script, glyphRun.direction);
  51111. this.shaper.plan(this.plan, this.glyphInfos, glyphRun.features);
  51112. // Assign chosen features to output glyph run
  51113. for (var key in this.plan.allFeatures) {
  51114. glyphRun.features[key] = true;
  51115. }
  51116. };
  51117. OTLayoutEngine.prototype.substitute = function substitute(glyphRun) {
  51118. var _this2 = this;
  51119. if (this.GSUBProcessor) {
  51120. this.plan.process(this.GSUBProcessor, this.glyphInfos);
  51121. // Map glyph infos back to normal Glyph objects
  51122. glyphRun.glyphs = this.glyphInfos.map(function (glyphInfo) {
  51123. return _this2.font.getGlyph(glyphInfo.id, glyphInfo.codePoints);
  51124. });
  51125. }
  51126. };
  51127. OTLayoutEngine.prototype.position = function position(glyphRun) {
  51128. if (this.shaper.zeroMarkWidths === 'BEFORE_GPOS') {
  51129. this.zeroMarkAdvances(glyphRun.positions);
  51130. }
  51131. if (this.GPOSProcessor) {
  51132. this.plan.process(this.GPOSProcessor, this.glyphInfos, glyphRun.positions);
  51133. }
  51134. if (this.shaper.zeroMarkWidths === 'AFTER_GPOS') {
  51135. this.zeroMarkAdvances(glyphRun.positions);
  51136. }
  51137. // Reverse the glyphs and positions if the script is right-to-left
  51138. if (glyphRun.direction === 'rtl') {
  51139. glyphRun.glyphs.reverse();
  51140. glyphRun.positions.reverse();
  51141. }
  51142. return this.GPOSProcessor && this.GPOSProcessor.features;
  51143. };
  51144. OTLayoutEngine.prototype.zeroMarkAdvances = function zeroMarkAdvances(positions) {
  51145. for (var i = 0; i < this.glyphInfos.length; i++) {
  51146. if (this.glyphInfos[i].isMark) {
  51147. positions[i].xAdvance = 0;
  51148. positions[i].yAdvance = 0;
  51149. }
  51150. }
  51151. };
  51152. OTLayoutEngine.prototype.cleanup = function cleanup() {
  51153. this.glyphInfos = null;
  51154. this.plan = null;
  51155. this.shaper = null;
  51156. };
  51157. OTLayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
  51158. var features = [];
  51159. if (this.GSUBProcessor) {
  51160. this.GSUBProcessor.selectScript(script, language);
  51161. features.push.apply(features, _Object$keys(this.GSUBProcessor.features));
  51162. }
  51163. if (this.GPOSProcessor) {
  51164. this.GPOSProcessor.selectScript(script, language);
  51165. features.push.apply(features, _Object$keys(this.GPOSProcessor.features));
  51166. }
  51167. return features;
  51168. };
  51169. return OTLayoutEngine;
  51170. }();
  51171. var LayoutEngine = function () {
  51172. function LayoutEngine(font) {
  51173. _classCallCheck(this, LayoutEngine);
  51174. this.font = font;
  51175. this.unicodeLayoutEngine = null;
  51176. this.kernProcessor = null;
  51177. // Choose an advanced layout engine. We try the AAT morx table first since more
  51178. // scripts are currently supported because the shaping logic is built into the font.
  51179. if (this.font.morx) {
  51180. this.engine = new AATLayoutEngine(this.font);
  51181. } else if (this.font.GSUB || this.font.GPOS) {
  51182. this.engine = new OTLayoutEngine(this.font);
  51183. }
  51184. }
  51185. LayoutEngine.prototype.layout = function layout(string, features, script, language, direction) {
  51186. // Make the features parameter optional
  51187. if (typeof features === 'string') {
  51188. direction = language;
  51189. language = script;
  51190. script = features;
  51191. features = [];
  51192. }
  51193. // Map string to glyphs if needed
  51194. if (typeof string === 'string') {
  51195. // Attempt to detect the script from the string if not provided.
  51196. if (script == null) {
  51197. script = forString(string);
  51198. }
  51199. var glyphs = this.font.glyphsForString(string);
  51200. } else {
  51201. // Attempt to detect the script from the glyph code points if not provided.
  51202. if (script == null) {
  51203. var codePoints = [];
  51204. for (var _iterator = string, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  51205. var _ref;
  51206. if (_isArray) {
  51207. if (_i >= _iterator.length) break;
  51208. _ref = _iterator[_i++];
  51209. } else {
  51210. _i = _iterator.next();
  51211. if (_i.done) break;
  51212. _ref = _i.value;
  51213. }
  51214. var glyph = _ref;
  51215. codePoints.push.apply(codePoints, glyph.codePoints);
  51216. }
  51217. script = forCodePoints(codePoints);
  51218. }
  51219. var glyphs = string;
  51220. }
  51221. var glyphRun = new GlyphRun(glyphs, features, script, language, direction);
  51222. // Return early if there are no glyphs
  51223. if (glyphs.length === 0) {
  51224. glyphRun.positions = [];
  51225. return glyphRun;
  51226. }
  51227. // Setup the advanced layout engine
  51228. if (this.engine && this.engine.setup) {
  51229. this.engine.setup(glyphRun);
  51230. }
  51231. // Substitute and position the glyphs
  51232. this.substitute(glyphRun);
  51233. this.position(glyphRun);
  51234. this.hideDefaultIgnorables(glyphRun.glyphs, glyphRun.positions);
  51235. // Let the layout engine clean up any state it might have
  51236. if (this.engine && this.engine.cleanup) {
  51237. this.engine.cleanup();
  51238. }
  51239. return glyphRun;
  51240. };
  51241. LayoutEngine.prototype.substitute = function substitute(glyphRun) {
  51242. // Call the advanced layout engine to make substitutions
  51243. if (this.engine && this.engine.substitute) {
  51244. this.engine.substitute(glyphRun);
  51245. }
  51246. };
  51247. LayoutEngine.prototype.position = function position(glyphRun) {
  51248. // Get initial glyph positions
  51249. glyphRun.positions = glyphRun.glyphs.map(function (glyph) {
  51250. return new GlyphPosition(glyph.advanceWidth);
  51251. });
  51252. var positioned = null;
  51253. // Call the advanced layout engine. Returns the features applied.
  51254. if (this.engine && this.engine.position) {
  51255. positioned = this.engine.position(glyphRun);
  51256. }
  51257. // if there is no GPOS table, use unicode properties to position marks.
  51258. if (!positioned && (!this.engine || this.engine.fallbackPosition)) {
  51259. if (!this.unicodeLayoutEngine) {
  51260. this.unicodeLayoutEngine = new UnicodeLayoutEngine(this.font);
  51261. }
  51262. this.unicodeLayoutEngine.positionGlyphs(glyphRun.glyphs, glyphRun.positions);
  51263. }
  51264. // if kerning is not supported by GPOS, do kerning with the TrueType/AAT kern table
  51265. if ((!positioned || !positioned.kern) && glyphRun.features.kern !== false && this.font.kern) {
  51266. if (!this.kernProcessor) {
  51267. this.kernProcessor = new KernProcessor(this.font);
  51268. }
  51269. this.kernProcessor.process(glyphRun.glyphs, glyphRun.positions);
  51270. glyphRun.features.kern = true;
  51271. }
  51272. };
  51273. LayoutEngine.prototype.hideDefaultIgnorables = function hideDefaultIgnorables(glyphs, positions) {
  51274. var space = this.font.glyphForCodePoint(0x20);
  51275. for (var i = 0; i < glyphs.length; i++) {
  51276. if (this.isDefaultIgnorable(glyphs[i].codePoints[0])) {
  51277. glyphs[i] = space;
  51278. positions[i].xAdvance = 0;
  51279. positions[i].yAdvance = 0;
  51280. }
  51281. }
  51282. };
  51283. LayoutEngine.prototype.isDefaultIgnorable = function isDefaultIgnorable(ch) {
  51284. // From DerivedCoreProperties.txt in the Unicode database,
  51285. // minus U+115F, U+1160, U+3164 and U+FFA0, which is what
  51286. // Harfbuzz and Uniscribe do.
  51287. var plane = ch >> 16;
  51288. if (plane === 0) {
  51289. // BMP
  51290. switch (ch >> 8) {
  51291. case 0x00:
  51292. return ch === 0x00AD;
  51293. case 0x03:
  51294. return ch === 0x034F;
  51295. case 0x06:
  51296. return ch === 0x061C;
  51297. case 0x17:
  51298. return 0x17B4 <= ch && ch <= 0x17B5;
  51299. case 0x18:
  51300. return 0x180B <= ch && ch <= 0x180E;
  51301. case 0x20:
  51302. return 0x200B <= ch && ch <= 0x200F || 0x202A <= ch && ch <= 0x202E || 0x2060 <= ch && ch <= 0x206F;
  51303. case 0xFE:
  51304. return 0xFE00 <= ch && ch <= 0xFE0F || ch === 0xFEFF;
  51305. case 0xFF:
  51306. return 0xFFF0 <= ch && ch <= 0xFFF8;
  51307. default:
  51308. return false;
  51309. }
  51310. } else {
  51311. // Other planes
  51312. switch (plane) {
  51313. case 0x01:
  51314. return 0x1BCA0 <= ch && ch <= 0x1BCA3 || 0x1D173 <= ch && ch <= 0x1D17A;
  51315. case 0x0E:
  51316. return 0xE0000 <= ch && ch <= 0xE0FFF;
  51317. default:
  51318. return false;
  51319. }
  51320. }
  51321. };
  51322. LayoutEngine.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
  51323. var features = [];
  51324. if (this.engine) {
  51325. features.push.apply(features, this.engine.getAvailableFeatures(script, language));
  51326. }
  51327. if (this.font.kern && features.indexOf('kern') === -1) {
  51328. features.push('kern');
  51329. }
  51330. return features;
  51331. };
  51332. LayoutEngine.prototype.stringsForGlyph = function stringsForGlyph(gid) {
  51333. var result = new _Set();
  51334. var codePoints = this.font._cmapProcessor.codePointsForGlyph(gid);
  51335. for (var _iterator2 = codePoints, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  51336. var _ref2;
  51337. if (_isArray2) {
  51338. if (_i2 >= _iterator2.length) break;
  51339. _ref2 = _iterator2[_i2++];
  51340. } else {
  51341. _i2 = _iterator2.next();
  51342. if (_i2.done) break;
  51343. _ref2 = _i2.value;
  51344. }
  51345. var codePoint = _ref2;
  51346. result.add(_String$fromCodePoint(codePoint));
  51347. }
  51348. if (this.engine && this.engine.stringsForGlyph) {
  51349. for (var _iterator3 = this.engine.stringsForGlyph(gid), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  51350. var _ref3;
  51351. if (_isArray3) {
  51352. if (_i3 >= _iterator3.length) break;
  51353. _ref3 = _iterator3[_i3++];
  51354. } else {
  51355. _i3 = _iterator3.next();
  51356. if (_i3.done) break;
  51357. _ref3 = _i3.value;
  51358. }
  51359. var string = _ref3;
  51360. result.add(string);
  51361. }
  51362. }
  51363. return _Array$from(result);
  51364. };
  51365. return LayoutEngine;
  51366. }();
  51367. var SVG_COMMANDS = {
  51368. moveTo: 'M',
  51369. lineTo: 'L',
  51370. quadraticCurveTo: 'Q',
  51371. bezierCurveTo: 'C',
  51372. closePath: 'Z'
  51373. };
  51374. /**
  51375. * Path objects are returned by glyphs and represent the actual
  51376. * vector outlines for each glyph in the font. Paths can be converted
  51377. * to SVG path data strings, or to functions that can be applied to
  51378. * render the path to a graphics context.
  51379. */
  51380. var Path = function () {
  51381. function Path() {
  51382. _classCallCheck(this, Path);
  51383. this.commands = [];
  51384. this._bbox = null;
  51385. this._cbox = null;
  51386. }
  51387. /**
  51388. * Compiles the path to a JavaScript function that can be applied with
  51389. * a graphics context in order to render the path.
  51390. * @return {string}
  51391. */
  51392. Path.prototype.toFunction = function toFunction() {
  51393. var cmds = this.commands.map(function (c) {
  51394. return ' ctx.' + c.command + '(' + c.args.join(', ') + ');';
  51395. });
  51396. return new Function('ctx', cmds.join('\n'));
  51397. };
  51398. /**
  51399. * Converts the path to an SVG path data string
  51400. * @return {string}
  51401. */
  51402. Path.prototype.toSVG = function toSVG() {
  51403. var cmds = this.commands.map(function (c) {
  51404. var args = c.args.map(function (arg) {
  51405. return Math.round(arg * 100) / 100;
  51406. });
  51407. return '' + SVG_COMMANDS[c.command] + args.join(' ');
  51408. });
  51409. return cmds.join('');
  51410. };
  51411. /**
  51412. * Gets the "control box" of a path.
  51413. * This is like the bounding box, but it includes all points including
  51414. * control points of bezier segments and is much faster to compute than
  51415. * the real bounding box.
  51416. * @type {BBox}
  51417. */
  51418. /**
  51419. * Applies a mapping function to each point in the path.
  51420. * @param {function} fn
  51421. * @return {Path}
  51422. */
  51423. Path.prototype.mapPoints = function mapPoints(fn) {
  51424. var path = new Path();
  51425. for (var _iterator = this.commands, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  51426. var _ref;
  51427. if (_isArray) {
  51428. if (_i >= _iterator.length) break;
  51429. _ref = _iterator[_i++];
  51430. } else {
  51431. _i = _iterator.next();
  51432. if (_i.done) break;
  51433. _ref = _i.value;
  51434. }
  51435. var c = _ref;
  51436. var args = [];
  51437. for (var _i2 = 0; _i2 < c.args.length; _i2 += 2) {
  51438. var _fn = fn(c.args[_i2], c.args[_i2 + 1]),
  51439. x = _fn[0],
  51440. y = _fn[1];
  51441. args.push(x, y);
  51442. }
  51443. path[c.command].apply(path, args);
  51444. }
  51445. return path;
  51446. };
  51447. /**
  51448. * Transforms the path by the given matrix.
  51449. */
  51450. Path.prototype.transform = function transform(m0, m1, m2, m3, m4, m5) {
  51451. return this.mapPoints(function (x, y) {
  51452. x = m0 * x + m2 * y + m4;
  51453. y = m1 * x + m3 * y + m5;
  51454. return [x, y];
  51455. });
  51456. };
  51457. /**
  51458. * Translates the path by the given offset.
  51459. */
  51460. Path.prototype.translate = function translate(x, y) {
  51461. return this.transform(1, 0, 0, 1, x, y);
  51462. };
  51463. /**
  51464. * Rotates the path by the given angle (in radians).
  51465. */
  51466. Path.prototype.rotate = function rotate(angle) {
  51467. var cos = Math.cos(angle);
  51468. var sin = Math.sin(angle);
  51469. return this.transform(cos, sin, -sin, cos, 0, 0);
  51470. };
  51471. /**
  51472. * Scales the path.
  51473. */
  51474. Path.prototype.scale = function scale(scaleX) {
  51475. var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX;
  51476. return this.transform(scaleX, 0, 0, scaleY, 0, 0);
  51477. };
  51478. _createClass(Path, [{
  51479. key: 'cbox',
  51480. get: function get() {
  51481. if (!this._cbox) {
  51482. var cbox = new BBox();
  51483. for (var _iterator2 = this.commands, _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  51484. var _ref2;
  51485. if (_isArray2) {
  51486. if (_i3 >= _iterator2.length) break;
  51487. _ref2 = _iterator2[_i3++];
  51488. } else {
  51489. _i3 = _iterator2.next();
  51490. if (_i3.done) break;
  51491. _ref2 = _i3.value;
  51492. }
  51493. var command = _ref2;
  51494. for (var _i4 = 0; _i4 < command.args.length; _i4 += 2) {
  51495. cbox.addPoint(command.args[_i4], command.args[_i4 + 1]);
  51496. }
  51497. }
  51498. this._cbox = _Object$freeze(cbox);
  51499. }
  51500. return this._cbox;
  51501. }
  51502. /**
  51503. * Gets the exact bounding box of the path by evaluating curve segments.
  51504. * Slower to compute than the control box, but more accurate.
  51505. * @type {BBox}
  51506. */
  51507. }, {
  51508. key: 'bbox',
  51509. get: function get() {
  51510. if (this._bbox) {
  51511. return this._bbox;
  51512. }
  51513. var bbox = new BBox();
  51514. var cx = 0,
  51515. cy = 0;
  51516. var f = function f(t) {
  51517. return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i];
  51518. };
  51519. for (var _iterator3 = this.commands, _isArray3 = Array.isArray(_iterator3), _i5 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  51520. var _ref3;
  51521. if (_isArray3) {
  51522. if (_i5 >= _iterator3.length) break;
  51523. _ref3 = _iterator3[_i5++];
  51524. } else {
  51525. _i5 = _iterator3.next();
  51526. if (_i5.done) break;
  51527. _ref3 = _i5.value;
  51528. }
  51529. var c = _ref3;
  51530. switch (c.command) {
  51531. case 'moveTo':
  51532. case 'lineTo':
  51533. var _c$args = c.args,
  51534. x = _c$args[0],
  51535. y = _c$args[1];
  51536. bbox.addPoint(x, y);
  51537. cx = x;
  51538. cy = y;
  51539. break;
  51540. case 'quadraticCurveTo':
  51541. case 'bezierCurveTo':
  51542. if (c.command === 'quadraticCurveTo') {
  51543. // http://fontforge.org/bezier.html
  51544. var _c$args2 = c.args,
  51545. qp1x = _c$args2[0],
  51546. qp1y = _c$args2[1],
  51547. p3x = _c$args2[2],
  51548. p3y = _c$args2[3];
  51549. var cp1x = cx + 2 / 3 * (qp1x - cx); // CP1 = QP0 + 2/3 * (QP1-QP0)
  51550. var cp1y = cy + 2 / 3 * (qp1y - cy);
  51551. var cp2x = p3x + 2 / 3 * (qp1x - p3x); // CP2 = QP2 + 2/3 * (QP1-QP2)
  51552. var cp2y = p3y + 2 / 3 * (qp1y - p3y);
  51553. } else {
  51554. var _c$args3 = c.args,
  51555. cp1x = _c$args3[0],
  51556. cp1y = _c$args3[1],
  51557. cp2x = _c$args3[2],
  51558. cp2y = _c$args3[3],
  51559. p3x = _c$args3[4],
  51560. p3y = _c$args3[5];
  51561. }
  51562. // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
  51563. bbox.addPoint(p3x, p3y);
  51564. var p0 = [cx, cy];
  51565. var p1 = [cp1x, cp1y];
  51566. var p2 = [cp2x, cp2y];
  51567. var p3 = [p3x, p3y];
  51568. for (var i = 0; i <= 1; i++) {
  51569. var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
  51570. var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
  51571. c = 3 * p1[i] - 3 * p0[i];
  51572. if (a === 0) {
  51573. if (b === 0) {
  51574. continue;
  51575. }
  51576. var t = -c / b;
  51577. if (0 < t && t < 1) {
  51578. if (i === 0) {
  51579. bbox.addPoint(f(t), bbox.maxY);
  51580. } else if (i === 1) {
  51581. bbox.addPoint(bbox.maxX, f(t));
  51582. }
  51583. }
  51584. continue;
  51585. }
  51586. var b2ac = Math.pow(b, 2) - 4 * c * a;
  51587. if (b2ac < 0) {
  51588. continue;
  51589. }
  51590. var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
  51591. if (0 < t1 && t1 < 1) {
  51592. if (i === 0) {
  51593. bbox.addPoint(f(t1), bbox.maxY);
  51594. } else if (i === 1) {
  51595. bbox.addPoint(bbox.maxX, f(t1));
  51596. }
  51597. }
  51598. var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
  51599. if (0 < t2 && t2 < 1) {
  51600. if (i === 0) {
  51601. bbox.addPoint(f(t2), bbox.maxY);
  51602. } else if (i === 1) {
  51603. bbox.addPoint(bbox.maxX, f(t2));
  51604. }
  51605. }
  51606. }
  51607. cx = p3x;
  51608. cy = p3y;
  51609. break;
  51610. }
  51611. }
  51612. return this._bbox = _Object$freeze(bbox);
  51613. }
  51614. }]);
  51615. return Path;
  51616. }();
  51617. var _arr = ['moveTo', 'lineTo', 'quadraticCurveTo', 'bezierCurveTo', 'closePath'];
  51618. var _loop = function _loop() {
  51619. var command = _arr[_i6];
  51620. Path.prototype[command] = function () {
  51621. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  51622. args[_key] = arguments[_key];
  51623. }
  51624. this._bbox = this._cbox = null;
  51625. this.commands.push({
  51626. command: command,
  51627. args: args
  51628. });
  51629. return this;
  51630. };
  51631. };
  51632. for (var _i6 = 0; _i6 < _arr.length; _i6++) {
  51633. _loop();
  51634. }
  51635. var StandardNames = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
  51636. var _class$8;
  51637. function _applyDecoratedDescriptor$4(target, property, decorators, descriptor, context) {
  51638. var desc = {};
  51639. Object['ke' + 'ys'](descriptor).forEach(function (key) {
  51640. desc[key] = descriptor[key];
  51641. });
  51642. desc.enumerable = !!desc.enumerable;
  51643. desc.configurable = !!desc.configurable;
  51644. if ('value' in desc || desc.initializer) {
  51645. desc.writable = true;
  51646. }
  51647. desc = decorators.slice().reverse().reduce(function (desc, decorator) {
  51648. return decorator(target, property, desc) || desc;
  51649. }, desc);
  51650. if (context && desc.initializer !== void 0) {
  51651. desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
  51652. desc.initializer = undefined;
  51653. }
  51654. if (desc.initializer === void 0) {
  51655. Object['define' + 'Property'](target, property, desc);
  51656. desc = null;
  51657. }
  51658. return desc;
  51659. }
  51660. /**
  51661. * Glyph objects represent a glyph in the font. They have various properties for accessing metrics and
  51662. * the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context.
  51663. *
  51664. * You do not create glyph objects directly. They are created by various methods on the font object.
  51665. * There are several subclasses of the base Glyph class internally that may be returned depending
  51666. * on the font format, but they all inherit from this class.
  51667. */
  51668. var Glyph = (_class$8 = function () {
  51669. function Glyph(id, codePoints, font) {
  51670. _classCallCheck(this, Glyph);
  51671. /**
  51672. * The glyph id in the font
  51673. * @type {number}
  51674. */
  51675. this.id = id;
  51676. /**
  51677. * An array of unicode code points that are represented by this glyph.
  51678. * There can be multiple code points in the case of ligatures and other glyphs
  51679. * that represent multiple visual characters.
  51680. * @type {number[]}
  51681. */
  51682. this.codePoints = codePoints;
  51683. this._font = font;
  51684. // TODO: get this info from GDEF if available
  51685. this.isMark = this.codePoints.every(unicode.isMark);
  51686. this.isLigature = this.codePoints.length > 1;
  51687. }
  51688. Glyph.prototype._getPath = function _getPath() {
  51689. return new Path();
  51690. };
  51691. Glyph.prototype._getCBox = function _getCBox() {
  51692. return this.path.cbox;
  51693. };
  51694. Glyph.prototype._getBBox = function _getBBox() {
  51695. return this.path.bbox;
  51696. };
  51697. Glyph.prototype._getTableMetrics = function _getTableMetrics(table) {
  51698. if (this.id < table.metrics.length) {
  51699. return table.metrics.get(this.id);
  51700. }
  51701. var metric = table.metrics.get(table.metrics.length - 1);
  51702. var res = {
  51703. advance: metric ? metric.advance : 0,
  51704. bearing: table.bearings.get(this.id - table.metrics.length) || 0
  51705. };
  51706. return res;
  51707. };
  51708. Glyph.prototype._getMetrics = function _getMetrics(cbox) {
  51709. if (this._metrics) {
  51710. return this._metrics;
  51711. }
  51712. var _getTableMetrics2 = this._getTableMetrics(this._font.hmtx),
  51713. advanceWidth = _getTableMetrics2.advance,
  51714. leftBearing = _getTableMetrics2.bearing;
  51715. // For vertical metrics, use vmtx if available, or fall back to global data from OS/2 or hhea
  51716. if (this._font.vmtx) {
  51717. var _getTableMetrics3 = this._getTableMetrics(this._font.vmtx),
  51718. advanceHeight = _getTableMetrics3.advance,
  51719. topBearing = _getTableMetrics3.bearing;
  51720. } else {
  51721. var os2 = void 0;
  51722. if (typeof cbox === 'undefined' || cbox === null) {
  51723. cbox = this.cbox;
  51724. }
  51725. if ((os2 = this._font['OS/2']) && os2.version > 0) {
  51726. var advanceHeight = Math.abs(os2.typoAscender - os2.typoDescender);
  51727. var topBearing = os2.typoAscender - cbox.maxY;
  51728. } else {
  51729. var hhea = this._font.hhea;
  51730. var advanceHeight = Math.abs(hhea.ascent - hhea.descent);
  51731. var topBearing = hhea.ascent - cbox.maxY;
  51732. }
  51733. }
  51734. if (this._font._variationProcessor && this._font.HVAR) {
  51735. advanceWidth += this._font._variationProcessor.getAdvanceAdjustment(this.id, this._font.HVAR);
  51736. }
  51737. return this._metrics = { advanceWidth: advanceWidth, advanceHeight: advanceHeight, leftBearing: leftBearing, topBearing: topBearing };
  51738. };
  51739. /**
  51740. * The glyph’s control box.
  51741. * This is often the same as the bounding box, but is faster to compute.
  51742. * Because of the way bezier curves are defined, some of the control points
  51743. * can be outside of the bounding box. Where `bbox` takes this into account,
  51744. * `cbox` does not. Thus, cbox is less accurate, but faster to compute.
  51745. * See [here](http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-2)
  51746. * for a more detailed description.
  51747. *
  51748. * @type {BBox}
  51749. */
  51750. /**
  51751. * Returns a path scaled to the given font size.
  51752. * @param {number} size
  51753. * @return {Path}
  51754. */
  51755. Glyph.prototype.getScaledPath = function getScaledPath(size) {
  51756. var scale = 1 / this._font.unitsPerEm * size;
  51757. return this.path.scale(scale);
  51758. };
  51759. /**
  51760. * The glyph's advance width.
  51761. * @type {number}
  51762. */
  51763. Glyph.prototype._getName = function _getName() {
  51764. var post = this._font.post;
  51765. if (!post) {
  51766. return null;
  51767. }
  51768. switch (post.version) {
  51769. case 1:
  51770. return StandardNames[this.id];
  51771. case 2:
  51772. var id = post.glyphNameIndex[this.id];
  51773. if (id < StandardNames.length) {
  51774. return StandardNames[id];
  51775. }
  51776. return post.names[id - StandardNames.length];
  51777. case 2.5:
  51778. return StandardNames[this.id + post.offsets[this.id]];
  51779. case 4:
  51780. return String.fromCharCode(post.map[this.id]);
  51781. }
  51782. };
  51783. /**
  51784. * The glyph's name
  51785. * @type {string}
  51786. */
  51787. /**
  51788. * Renders the glyph to the given graphics context, at the specified font size.
  51789. * @param {CanvasRenderingContext2d} ctx
  51790. * @param {number} size
  51791. */
  51792. Glyph.prototype.render = function render(ctx, size) {
  51793. ctx.save();
  51794. var scale = 1 / this._font.head.unitsPerEm * size;
  51795. ctx.scale(scale, scale);
  51796. var fn = this.path.toFunction();
  51797. fn(ctx);
  51798. ctx.fill();
  51799. ctx.restore();
  51800. };
  51801. _createClass(Glyph, [{
  51802. key: 'cbox',
  51803. get: function get() {
  51804. return this._getCBox();
  51805. }
  51806. /**
  51807. * The glyph’s bounding box, i.e. the rectangle that encloses the
  51808. * glyph outline as tightly as possible.
  51809. * @type {BBox}
  51810. */
  51811. }, {
  51812. key: 'bbox',
  51813. get: function get() {
  51814. return this._getBBox();
  51815. }
  51816. /**
  51817. * A vector Path object representing the glyph outline.
  51818. * @type {Path}
  51819. */
  51820. }, {
  51821. key: 'path',
  51822. get: function get() {
  51823. // Cache the path so we only decode it once
  51824. // Decoding is actually performed by subclasses
  51825. return this._getPath();
  51826. }
  51827. }, {
  51828. key: 'advanceWidth',
  51829. get: function get() {
  51830. return this._getMetrics().advanceWidth;
  51831. }
  51832. /**
  51833. * The glyph's advance height.
  51834. * @type {number}
  51835. */
  51836. }, {
  51837. key: 'advanceHeight',
  51838. get: function get() {
  51839. return this._getMetrics().advanceHeight;
  51840. }
  51841. }, {
  51842. key: 'ligatureCaretPositions',
  51843. get: function get() {}
  51844. }, {
  51845. key: 'name',
  51846. get: function get() {
  51847. return this._getName();
  51848. }
  51849. }]);
  51850. return Glyph;
  51851. }(), (_applyDecoratedDescriptor$4(_class$8.prototype, 'cbox', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'cbox'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'bbox', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'bbox'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'path', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'path'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'advanceWidth', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'advanceWidth'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'advanceHeight', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'advanceHeight'), _class$8.prototype), _applyDecoratedDescriptor$4(_class$8.prototype, 'name', [cache], _Object$getOwnPropertyDescriptor(_class$8.prototype, 'name'), _class$8.prototype)), _class$8);
  51852. // The header for both simple and composite glyphs
  51853. var GlyfHeader = new r.Struct({
  51854. numberOfContours: r.int16, // if negative, this is a composite glyph
  51855. xMin: r.int16,
  51856. yMin: r.int16,
  51857. xMax: r.int16,
  51858. yMax: r.int16
  51859. });
  51860. // Flags for simple glyphs
  51861. var ON_CURVE = 1 << 0;
  51862. var X_SHORT_VECTOR = 1 << 1;
  51863. var Y_SHORT_VECTOR = 1 << 2;
  51864. var REPEAT = 1 << 3;
  51865. var SAME_X = 1 << 4;
  51866. var SAME_Y = 1 << 5;
  51867. // Flags for composite glyphs
  51868. var ARG_1_AND_2_ARE_WORDS = 1 << 0;
  51869. var WE_HAVE_A_SCALE = 1 << 3;
  51870. var MORE_COMPONENTS = 1 << 5;
  51871. var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
  51872. var WE_HAVE_A_TWO_BY_TWO = 1 << 7;
  51873. var WE_HAVE_INSTRUCTIONS = 1 << 8;
  51874. // Represents a point in a simple glyph
  51875. var Point = function () {
  51876. function Point(onCurve, endContour) {
  51877. var x = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  51878. var y = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  51879. _classCallCheck(this, Point);
  51880. this.onCurve = onCurve;
  51881. this.endContour = endContour;
  51882. this.x = x;
  51883. this.y = y;
  51884. }
  51885. Point.prototype.copy = function copy() {
  51886. return new Point(this.onCurve, this.endContour, this.x, this.y);
  51887. };
  51888. return Point;
  51889. }();
  51890. // Represents a component in a composite glyph
  51891. var Component = function Component(glyphID, dx, dy) {
  51892. _classCallCheck(this, Component);
  51893. this.glyphID = glyphID;
  51894. this.dx = dx;
  51895. this.dy = dy;
  51896. this.pos = 0;
  51897. this.scaleX = this.scaleY = 1;
  51898. this.scale01 = this.scale10 = 0;
  51899. };
  51900. /**
  51901. * Represents a TrueType glyph.
  51902. */
  51903. var TTFGlyph = function (_Glyph) {
  51904. _inherits(TTFGlyph, _Glyph);
  51905. function TTFGlyph() {
  51906. _classCallCheck(this, TTFGlyph);
  51907. return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
  51908. }
  51909. // Parses just the glyph header and returns the bounding box
  51910. TTFGlyph.prototype._getCBox = function _getCBox(internal) {
  51911. // We need to decode the glyph if variation processing is requested,
  51912. // so it's easier just to recompute the path's cbox after decoding.
  51913. if (this._font._variationProcessor && !internal) {
  51914. return this.path.cbox;
  51915. }
  51916. var stream = this._font._getTableStream('glyf');
  51917. stream.pos += this._font.loca.offsets[this.id];
  51918. var glyph = GlyfHeader.decode(stream);
  51919. var cbox = new BBox(glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax);
  51920. return _Object$freeze(cbox);
  51921. };
  51922. // Parses a single glyph coordinate
  51923. TTFGlyph.prototype._parseGlyphCoord = function _parseGlyphCoord(stream, prev, short, same) {
  51924. if (short) {
  51925. var val = stream.readUInt8();
  51926. if (!same) {
  51927. val = -val;
  51928. }
  51929. val += prev;
  51930. } else {
  51931. if (same) {
  51932. var val = prev;
  51933. } else {
  51934. var val = prev + stream.readInt16BE();
  51935. }
  51936. }
  51937. return val;
  51938. };
  51939. // Decodes the glyph data into points for simple glyphs,
  51940. // or components for composite glyphs
  51941. TTFGlyph.prototype._decode = function _decode() {
  51942. var glyfPos = this._font.loca.offsets[this.id];
  51943. var nextPos = this._font.loca.offsets[this.id + 1];
  51944. // Nothing to do if there is no data for this glyph
  51945. if (glyfPos === nextPos) {
  51946. return null;
  51947. }
  51948. var stream = this._font._getTableStream('glyf');
  51949. stream.pos += glyfPos;
  51950. var startPos = stream.pos;
  51951. var glyph = GlyfHeader.decode(stream);
  51952. if (glyph.numberOfContours > 0) {
  51953. this._decodeSimple(glyph, stream);
  51954. } else if (glyph.numberOfContours < 0) {
  51955. this._decodeComposite(glyph, stream, startPos);
  51956. }
  51957. return glyph;
  51958. };
  51959. TTFGlyph.prototype._decodeSimple = function _decodeSimple(glyph, stream) {
  51960. // this is a simple glyph
  51961. glyph.points = [];
  51962. var endPtsOfContours = new r.Array(r.uint16, glyph.numberOfContours).decode(stream);
  51963. glyph.instructions = new r.Array(r.uint8, r.uint16).decode(stream);
  51964. var flags = [];
  51965. var numCoords = endPtsOfContours[endPtsOfContours.length - 1] + 1;
  51966. while (flags.length < numCoords) {
  51967. var flag = stream.readUInt8();
  51968. flags.push(flag);
  51969. // check for repeat flag
  51970. if (flag & REPEAT) {
  51971. var count = stream.readUInt8();
  51972. for (var j = 0; j < count; j++) {
  51973. flags.push(flag);
  51974. }
  51975. }
  51976. }
  51977. for (var i = 0; i < flags.length; i++) {
  51978. var flag = flags[i];
  51979. var point = new Point(!!(flag & ON_CURVE), endPtsOfContours.indexOf(i) >= 0, 0, 0);
  51980. glyph.points.push(point);
  51981. }
  51982. var px = 0;
  51983. for (var i = 0; i < flags.length; i++) {
  51984. var flag = flags[i];
  51985. glyph.points[i].x = px = this._parseGlyphCoord(stream, px, flag & X_SHORT_VECTOR, flag & SAME_X);
  51986. }
  51987. var py = 0;
  51988. for (var i = 0; i < flags.length; i++) {
  51989. var flag = flags[i];
  51990. glyph.points[i].y = py = this._parseGlyphCoord(stream, py, flag & Y_SHORT_VECTOR, flag & SAME_Y);
  51991. }
  51992. if (this._font._variationProcessor) {
  51993. var points = glyph.points.slice();
  51994. points.push.apply(points, this._getPhantomPoints(glyph));
  51995. this._font._variationProcessor.transformPoints(this.id, points);
  51996. glyph.phantomPoints = points.slice(-4);
  51997. }
  51998. return;
  51999. };
  52000. TTFGlyph.prototype._decodeComposite = function _decodeComposite(glyph, stream) {
  52001. var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  52002. // this is a composite glyph
  52003. glyph.components = [];
  52004. var haveInstructions = false;
  52005. var flags = MORE_COMPONENTS;
  52006. while (flags & MORE_COMPONENTS) {
  52007. flags = stream.readUInt16BE();
  52008. var gPos = stream.pos - offset;
  52009. var glyphID = stream.readUInt16BE();
  52010. if (!haveInstructions) {
  52011. haveInstructions = (flags & WE_HAVE_INSTRUCTIONS) !== 0;
  52012. }
  52013. if (flags & ARG_1_AND_2_ARE_WORDS) {
  52014. var dx = stream.readInt16BE();
  52015. var dy = stream.readInt16BE();
  52016. } else {
  52017. var dx = stream.readInt8();
  52018. var dy = stream.readInt8();
  52019. }
  52020. var component = new Component(glyphID, dx, dy);
  52021. component.pos = gPos;
  52022. if (flags & WE_HAVE_A_SCALE) {
  52023. // fixed number with 14 bits of fraction
  52024. component.scaleX = component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52025. } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
  52026. component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52027. component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52028. } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
  52029. component.scaleX = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52030. component.scale01 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52031. component.scale10 = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52032. component.scaleY = (stream.readUInt8() << 24 | stream.readUInt8() << 16) / 1073741824;
  52033. }
  52034. glyph.components.push(component);
  52035. }
  52036. if (this._font._variationProcessor) {
  52037. var points = [];
  52038. for (var j = 0; j < glyph.components.length; j++) {
  52039. var component = glyph.components[j];
  52040. points.push(new Point(true, true, component.dx, component.dy));
  52041. }
  52042. points.push.apply(points, this._getPhantomPoints(glyph));
  52043. this._font._variationProcessor.transformPoints(this.id, points);
  52044. glyph.phantomPoints = points.splice(-4, 4);
  52045. for (var i = 0; i < points.length; i++) {
  52046. var point = points[i];
  52047. glyph.components[i].dx = point.x;
  52048. glyph.components[i].dy = point.y;
  52049. }
  52050. }
  52051. return haveInstructions;
  52052. };
  52053. TTFGlyph.prototype._getPhantomPoints = function _getPhantomPoints(glyph) {
  52054. var cbox = this._getCBox(true);
  52055. if (this._metrics == null) {
  52056. this._metrics = Glyph.prototype._getMetrics.call(this, cbox);
  52057. }
  52058. var _metrics = this._metrics,
  52059. advanceWidth = _metrics.advanceWidth,
  52060. advanceHeight = _metrics.advanceHeight,
  52061. leftBearing = _metrics.leftBearing,
  52062. topBearing = _metrics.topBearing;
  52063. return [new Point(false, true, glyph.xMin - leftBearing, 0), new Point(false, true, glyph.xMin - leftBearing + advanceWidth, 0), new Point(false, true, 0, glyph.yMax + topBearing), new Point(false, true, 0, glyph.yMax + topBearing + advanceHeight)];
  52064. };
  52065. // Decodes font data, resolves composite glyphs, and returns an array of contours
  52066. TTFGlyph.prototype._getContours = function _getContours() {
  52067. var glyph = this._decode();
  52068. if (!glyph) {
  52069. return [];
  52070. }
  52071. var points = [];
  52072. if (glyph.numberOfContours < 0) {
  52073. // resolve composite glyphs
  52074. for (var _iterator = glyph.components, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  52075. var _ref;
  52076. if (_isArray) {
  52077. if (_i >= _iterator.length) break;
  52078. _ref = _iterator[_i++];
  52079. } else {
  52080. _i = _iterator.next();
  52081. if (_i.done) break;
  52082. _ref = _i.value;
  52083. }
  52084. var component = _ref;
  52085. var _contours = this._font.getGlyph(component.glyphID)._getContours();
  52086. for (var i = 0; i < _contours.length; i++) {
  52087. var contour = _contours[i];
  52088. for (var j = 0; j < contour.length; j++) {
  52089. var _point = contour[j];
  52090. var x = _point.x * component.scaleX + _point.y * component.scale01 + component.dx;
  52091. var y = _point.y * component.scaleY + _point.x * component.scale10 + component.dy;
  52092. points.push(new Point(_point.onCurve, _point.endContour, x, y));
  52093. }
  52094. }
  52095. }
  52096. } else {
  52097. points = glyph.points || [];
  52098. }
  52099. // Recompute and cache metrics if we performed variation processing, and don't have an HVAR table
  52100. if (glyph.phantomPoints && !this._font.directory.tables.HVAR) {
  52101. this._metrics.advanceWidth = glyph.phantomPoints[1].x - glyph.phantomPoints[0].x;
  52102. this._metrics.advanceHeight = glyph.phantomPoints[3].y - glyph.phantomPoints[2].y;
  52103. this._metrics.leftBearing = glyph.xMin - glyph.phantomPoints[0].x;
  52104. this._metrics.topBearing = glyph.phantomPoints[2].y - glyph.yMax;
  52105. }
  52106. var contours = [];
  52107. var cur = [];
  52108. for (var k = 0; k < points.length; k++) {
  52109. var point = points[k];
  52110. cur.push(point);
  52111. if (point.endContour) {
  52112. contours.push(cur);
  52113. cur = [];
  52114. }
  52115. }
  52116. return contours;
  52117. };
  52118. TTFGlyph.prototype._getMetrics = function _getMetrics() {
  52119. if (this._metrics) {
  52120. return this._metrics;
  52121. }
  52122. var cbox = this._getCBox(true);
  52123. _Glyph.prototype._getMetrics.call(this, cbox);
  52124. if (this._font._variationProcessor && !this._font.HVAR) {
  52125. // No HVAR table, decode the glyph. This triggers recomputation of metrics.
  52126. this.path;
  52127. }
  52128. return this._metrics;
  52129. };
  52130. // Converts contours to a Path object that can be rendered
  52131. TTFGlyph.prototype._getPath = function _getPath() {
  52132. var contours = this._getContours();
  52133. var path = new Path();
  52134. for (var i = 0; i < contours.length; i++) {
  52135. var contour = contours[i];
  52136. var firstPt = contour[0];
  52137. var lastPt = contour[contour.length - 1];
  52138. var start = 0;
  52139. if (firstPt.onCurve) {
  52140. // The first point will be consumed by the moveTo command, so skip in the loop
  52141. var curvePt = null;
  52142. start = 1;
  52143. } else {
  52144. if (lastPt.onCurve) {
  52145. // Start at the last point if the first point is off curve and the last point is on curve
  52146. firstPt = lastPt;
  52147. } else {
  52148. // Start at the middle if both the first and last points are off curve
  52149. firstPt = new Point(false, false, (firstPt.x + lastPt.x) / 2, (firstPt.y + lastPt.y) / 2);
  52150. }
  52151. var curvePt = firstPt;
  52152. }
  52153. path.moveTo(firstPt.x, firstPt.y);
  52154. for (var j = start; j < contour.length; j++) {
  52155. var pt = contour[j];
  52156. var prevPt = j === 0 ? firstPt : contour[j - 1];
  52157. if (prevPt.onCurve && pt.onCurve) {
  52158. path.lineTo(pt.x, pt.y);
  52159. } else if (prevPt.onCurve && !pt.onCurve) {
  52160. var curvePt = pt;
  52161. } else if (!prevPt.onCurve && !pt.onCurve) {
  52162. var midX = (prevPt.x + pt.x) / 2;
  52163. var midY = (prevPt.y + pt.y) / 2;
  52164. path.quadraticCurveTo(prevPt.x, prevPt.y, midX, midY);
  52165. var curvePt = pt;
  52166. } else if (!prevPt.onCurve && pt.onCurve) {
  52167. path.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y);
  52168. var curvePt = null;
  52169. } else {
  52170. throw new Error("Unknown TTF path state");
  52171. }
  52172. }
  52173. // Connect the first and last points
  52174. if (curvePt) {
  52175. path.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y);
  52176. }
  52177. path.closePath();
  52178. }
  52179. return path;
  52180. };
  52181. return TTFGlyph;
  52182. }(Glyph);
  52183. /**
  52184. * Represents an OpenType PostScript glyph, in the Compact Font Format.
  52185. */
  52186. var CFFGlyph = function (_Glyph) {
  52187. _inherits(CFFGlyph, _Glyph);
  52188. function CFFGlyph() {
  52189. _classCallCheck(this, CFFGlyph);
  52190. return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
  52191. }
  52192. CFFGlyph.prototype._getName = function _getName() {
  52193. if (this._font.CFF2) {
  52194. return _Glyph.prototype._getName.call(this);
  52195. }
  52196. return this._font['CFF '].getGlyphName(this.id);
  52197. };
  52198. CFFGlyph.prototype.bias = function bias(s) {
  52199. if (s.length < 1240) {
  52200. return 107;
  52201. } else if (s.length < 33900) {
  52202. return 1131;
  52203. } else {
  52204. return 32768;
  52205. }
  52206. };
  52207. CFFGlyph.prototype._getPath = function _getPath() {
  52208. var stream = this._font.stream;
  52209. var pos = stream.pos;
  52210. var cff = this._font.CFF2 || this._font['CFF '];
  52211. var str = cff.topDict.CharStrings[this.id];
  52212. var end = str.offset + str.length;
  52213. stream.pos = str.offset;
  52214. var path = new Path();
  52215. var stack = [];
  52216. var trans = [];
  52217. var width = null;
  52218. var nStems = 0;
  52219. var x = 0,
  52220. y = 0;
  52221. var usedGsubrs = void 0;
  52222. var usedSubrs = void 0;
  52223. var open = false;
  52224. this._usedGsubrs = usedGsubrs = {};
  52225. this._usedSubrs = usedSubrs = {};
  52226. var gsubrs = cff.globalSubrIndex || [];
  52227. var gsubrsBias = this.bias(gsubrs);
  52228. var privateDict = cff.privateDictForGlyph(this.id);
  52229. var subrs = privateDict.Subrs || [];
  52230. var subrsBias = this.bias(subrs);
  52231. var vstore = cff.topDict.vstore && cff.topDict.vstore.itemVariationStore;
  52232. var vsindex = privateDict.vsindex;
  52233. var variationProcessor = this._font._variationProcessor;
  52234. function checkWidth() {
  52235. if (width == null) {
  52236. width = stack.shift() + privateDict.nominalWidthX;
  52237. }
  52238. }
  52239. function parseStems() {
  52240. if (stack.length % 2 !== 0) {
  52241. checkWidth();
  52242. }
  52243. nStems += stack.length >> 1;
  52244. return stack.length = 0;
  52245. }
  52246. function moveTo(x, y) {
  52247. if (open) {
  52248. path.closePath();
  52249. }
  52250. path.moveTo(x, y);
  52251. open = true;
  52252. }
  52253. var parse = function parse() {
  52254. while (stream.pos < end) {
  52255. var op = stream.readUInt8();
  52256. if (op < 32) {
  52257. switch (op) {
  52258. case 1: // hstem
  52259. case 3: // vstem
  52260. case 18: // hstemhm
  52261. case 23:
  52262. // vstemhm
  52263. parseStems();
  52264. break;
  52265. case 4:
  52266. // vmoveto
  52267. if (stack.length > 1) {
  52268. checkWidth();
  52269. }
  52270. y += stack.shift();
  52271. moveTo(x, y);
  52272. break;
  52273. case 5:
  52274. // rlineto
  52275. while (stack.length >= 2) {
  52276. x += stack.shift();
  52277. y += stack.shift();
  52278. path.lineTo(x, y);
  52279. }
  52280. break;
  52281. case 6: // hlineto
  52282. case 7:
  52283. // vlineto
  52284. var phase = op === 6;
  52285. while (stack.length >= 1) {
  52286. if (phase) {
  52287. x += stack.shift();
  52288. } else {
  52289. y += stack.shift();
  52290. }
  52291. path.lineTo(x, y);
  52292. phase = !phase;
  52293. }
  52294. break;
  52295. case 8:
  52296. // rrcurveto
  52297. while (stack.length > 0) {
  52298. var c1x = x + stack.shift();
  52299. var c1y = y + stack.shift();
  52300. var c2x = c1x + stack.shift();
  52301. var c2y = c1y + stack.shift();
  52302. x = c2x + stack.shift();
  52303. y = c2y + stack.shift();
  52304. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52305. }
  52306. break;
  52307. case 10:
  52308. // callsubr
  52309. var index = stack.pop() + subrsBias;
  52310. var subr = subrs[index];
  52311. if (subr) {
  52312. usedSubrs[index] = true;
  52313. var p = stream.pos;
  52314. var e = end;
  52315. stream.pos = subr.offset;
  52316. end = subr.offset + subr.length;
  52317. parse();
  52318. stream.pos = p;
  52319. end = e;
  52320. }
  52321. break;
  52322. case 11:
  52323. // return
  52324. if (cff.version >= 2) {
  52325. break;
  52326. }
  52327. return;
  52328. case 14:
  52329. // endchar
  52330. if (cff.version >= 2) {
  52331. break;
  52332. }
  52333. if (stack.length > 0) {
  52334. checkWidth();
  52335. }
  52336. if (open) {
  52337. path.closePath();
  52338. open = false;
  52339. }
  52340. break;
  52341. case 15:
  52342. {
  52343. // vsindex
  52344. if (cff.version < 2) {
  52345. throw new Error('vsindex operator not supported in CFF v1');
  52346. }
  52347. vsindex = stack.pop();
  52348. break;
  52349. }
  52350. case 16:
  52351. {
  52352. // blend
  52353. if (cff.version < 2) {
  52354. throw new Error('blend operator not supported in CFF v1');
  52355. }
  52356. if (!variationProcessor) {
  52357. throw new Error('blend operator in non-variation font');
  52358. }
  52359. var blendVector = variationProcessor.getBlendVector(vstore, vsindex);
  52360. var numBlends = stack.pop();
  52361. var numOperands = numBlends * blendVector.length;
  52362. var delta = stack.length - numOperands;
  52363. var base = delta - numBlends;
  52364. for (var i = 0; i < numBlends; i++) {
  52365. var sum = stack[base + i];
  52366. for (var j = 0; j < blendVector.length; j++) {
  52367. sum += blendVector[j] * stack[delta++];
  52368. }
  52369. stack[base + i] = sum;
  52370. }
  52371. while (numOperands--) {
  52372. stack.pop();
  52373. }
  52374. break;
  52375. }
  52376. case 19: // hintmask
  52377. case 20:
  52378. // cntrmask
  52379. parseStems();
  52380. stream.pos += nStems + 7 >> 3;
  52381. break;
  52382. case 21:
  52383. // rmoveto
  52384. if (stack.length > 2) {
  52385. checkWidth();
  52386. }
  52387. x += stack.shift();
  52388. y += stack.shift();
  52389. moveTo(x, y);
  52390. break;
  52391. case 22:
  52392. // hmoveto
  52393. if (stack.length > 1) {
  52394. checkWidth();
  52395. }
  52396. x += stack.shift();
  52397. moveTo(x, y);
  52398. break;
  52399. case 24:
  52400. // rcurveline
  52401. while (stack.length >= 8) {
  52402. var c1x = x + stack.shift();
  52403. var c1y = y + stack.shift();
  52404. var c2x = c1x + stack.shift();
  52405. var c2y = c1y + stack.shift();
  52406. x = c2x + stack.shift();
  52407. y = c2y + stack.shift();
  52408. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52409. }
  52410. x += stack.shift();
  52411. y += stack.shift();
  52412. path.lineTo(x, y);
  52413. break;
  52414. case 25:
  52415. // rlinecurve
  52416. while (stack.length >= 8) {
  52417. x += stack.shift();
  52418. y += stack.shift();
  52419. path.lineTo(x, y);
  52420. }
  52421. var c1x = x + stack.shift();
  52422. var c1y = y + stack.shift();
  52423. var c2x = c1x + stack.shift();
  52424. var c2y = c1y + stack.shift();
  52425. x = c2x + stack.shift();
  52426. y = c2y + stack.shift();
  52427. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52428. break;
  52429. case 26:
  52430. // vvcurveto
  52431. if (stack.length % 2) {
  52432. x += stack.shift();
  52433. }
  52434. while (stack.length >= 4) {
  52435. c1x = x;
  52436. c1y = y + stack.shift();
  52437. c2x = c1x + stack.shift();
  52438. c2y = c1y + stack.shift();
  52439. x = c2x;
  52440. y = c2y + stack.shift();
  52441. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52442. }
  52443. break;
  52444. case 27:
  52445. // hhcurveto
  52446. if (stack.length % 2) {
  52447. y += stack.shift();
  52448. }
  52449. while (stack.length >= 4) {
  52450. c1x = x + stack.shift();
  52451. c1y = y;
  52452. c2x = c1x + stack.shift();
  52453. c2y = c1y + stack.shift();
  52454. x = c2x + stack.shift();
  52455. y = c2y;
  52456. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52457. }
  52458. break;
  52459. case 28:
  52460. // shortint
  52461. stack.push(stream.readInt16BE());
  52462. break;
  52463. case 29:
  52464. // callgsubr
  52465. index = stack.pop() + gsubrsBias;
  52466. subr = gsubrs[index];
  52467. if (subr) {
  52468. usedGsubrs[index] = true;
  52469. var p = stream.pos;
  52470. var e = end;
  52471. stream.pos = subr.offset;
  52472. end = subr.offset + subr.length;
  52473. parse();
  52474. stream.pos = p;
  52475. end = e;
  52476. }
  52477. break;
  52478. case 30: // vhcurveto
  52479. case 31:
  52480. // hvcurveto
  52481. phase = op === 31;
  52482. while (stack.length >= 4) {
  52483. if (phase) {
  52484. c1x = x + stack.shift();
  52485. c1y = y;
  52486. c2x = c1x + stack.shift();
  52487. c2y = c1y + stack.shift();
  52488. y = c2y + stack.shift();
  52489. x = c2x + (stack.length === 1 ? stack.shift() : 0);
  52490. } else {
  52491. c1x = x;
  52492. c1y = y + stack.shift();
  52493. c2x = c1x + stack.shift();
  52494. c2y = c1y + stack.shift();
  52495. x = c2x + stack.shift();
  52496. y = c2y + (stack.length === 1 ? stack.shift() : 0);
  52497. }
  52498. path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);
  52499. phase = !phase;
  52500. }
  52501. break;
  52502. case 12:
  52503. op = stream.readUInt8();
  52504. switch (op) {
  52505. case 3:
  52506. // and
  52507. var a = stack.pop();
  52508. var b = stack.pop();
  52509. stack.push(a && b ? 1 : 0);
  52510. break;
  52511. case 4:
  52512. // or
  52513. a = stack.pop();
  52514. b = stack.pop();
  52515. stack.push(a || b ? 1 : 0);
  52516. break;
  52517. case 5:
  52518. // not
  52519. a = stack.pop();
  52520. stack.push(a ? 0 : 1);
  52521. break;
  52522. case 9:
  52523. // abs
  52524. a = stack.pop();
  52525. stack.push(Math.abs(a));
  52526. break;
  52527. case 10:
  52528. // add
  52529. a = stack.pop();
  52530. b = stack.pop();
  52531. stack.push(a + b);
  52532. break;
  52533. case 11:
  52534. // sub
  52535. a = stack.pop();
  52536. b = stack.pop();
  52537. stack.push(a - b);
  52538. break;
  52539. case 12:
  52540. // div
  52541. a = stack.pop();
  52542. b = stack.pop();
  52543. stack.push(a / b);
  52544. break;
  52545. case 14:
  52546. // neg
  52547. a = stack.pop();
  52548. stack.push(-a);
  52549. break;
  52550. case 15:
  52551. // eq
  52552. a = stack.pop();
  52553. b = stack.pop();
  52554. stack.push(a === b ? 1 : 0);
  52555. break;
  52556. case 18:
  52557. // drop
  52558. stack.pop();
  52559. break;
  52560. case 20:
  52561. // put
  52562. var val = stack.pop();
  52563. var idx = stack.pop();
  52564. trans[idx] = val;
  52565. break;
  52566. case 21:
  52567. // get
  52568. idx = stack.pop();
  52569. stack.push(trans[idx] || 0);
  52570. break;
  52571. case 22:
  52572. // ifelse
  52573. var s1 = stack.pop();
  52574. var s2 = stack.pop();
  52575. var v1 = stack.pop();
  52576. var v2 = stack.pop();
  52577. stack.push(v1 <= v2 ? s1 : s2);
  52578. break;
  52579. case 23:
  52580. // random
  52581. stack.push(Math.random());
  52582. break;
  52583. case 24:
  52584. // mul
  52585. a = stack.pop();
  52586. b = stack.pop();
  52587. stack.push(a * b);
  52588. break;
  52589. case 26:
  52590. // sqrt
  52591. a = stack.pop();
  52592. stack.push(Math.sqrt(a));
  52593. break;
  52594. case 27:
  52595. // dup
  52596. a = stack.pop();
  52597. stack.push(a, a);
  52598. break;
  52599. case 28:
  52600. // exch
  52601. a = stack.pop();
  52602. b = stack.pop();
  52603. stack.push(b, a);
  52604. break;
  52605. case 29:
  52606. // index
  52607. idx = stack.pop();
  52608. if (idx < 0) {
  52609. idx = 0;
  52610. } else if (idx > stack.length - 1) {
  52611. idx = stack.length - 1;
  52612. }
  52613. stack.push(stack[idx]);
  52614. break;
  52615. case 30:
  52616. // roll
  52617. var n = stack.pop();
  52618. var _j = stack.pop();
  52619. if (_j >= 0) {
  52620. while (_j > 0) {
  52621. var t = stack[n - 1];
  52622. for (var _i = n - 2; _i >= 0; _i--) {
  52623. stack[_i + 1] = stack[_i];
  52624. }
  52625. stack[0] = t;
  52626. _j--;
  52627. }
  52628. } else {
  52629. while (_j < 0) {
  52630. var t = stack[0];
  52631. for (var _i2 = 0; _i2 <= n; _i2++) {
  52632. stack[_i2] = stack[_i2 + 1];
  52633. }
  52634. stack[n - 1] = t;
  52635. _j++;
  52636. }
  52637. }
  52638. break;
  52639. case 34:
  52640. // hflex
  52641. c1x = x + stack.shift();
  52642. c1y = y;
  52643. c2x = c1x + stack.shift();
  52644. c2y = c1y + stack.shift();
  52645. var c3x = c2x + stack.shift();
  52646. var c3y = c2y;
  52647. var c4x = c3x + stack.shift();
  52648. var c4y = c3y;
  52649. var c5x = c4x + stack.shift();
  52650. var c5y = c4y;
  52651. var c6x = c5x + stack.shift();
  52652. var c6y = c5y;
  52653. x = c6x;
  52654. y = c6y;
  52655. path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);
  52656. path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);
  52657. break;
  52658. case 35:
  52659. // flex
  52660. var pts = [];
  52661. for (var _i3 = 0; _i3 <= 5; _i3++) {
  52662. x += stack.shift();
  52663. y += stack.shift();
  52664. pts.push(x, y);
  52665. }
  52666. path.bezierCurveTo.apply(path, pts.slice(0, 6));
  52667. path.bezierCurveTo.apply(path, pts.slice(6));
  52668. stack.shift(); // fd
  52669. break;
  52670. case 36:
  52671. // hflex1
  52672. c1x = x + stack.shift();
  52673. c1y = y + stack.shift();
  52674. c2x = c1x + stack.shift();
  52675. c2y = c1y + stack.shift();
  52676. c3x = c2x + stack.shift();
  52677. c3y = c2y;
  52678. c4x = c3x + stack.shift();
  52679. c4y = c3y;
  52680. c5x = c4x + stack.shift();
  52681. c5y = c4y + stack.shift();
  52682. c6x = c5x + stack.shift();
  52683. c6y = c5y;
  52684. x = c6x;
  52685. y = c6y;
  52686. path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);
  52687. path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);
  52688. break;
  52689. case 37:
  52690. // flex1
  52691. var startx = x;
  52692. var starty = y;
  52693. pts = [];
  52694. for (var _i4 = 0; _i4 <= 4; _i4++) {
  52695. x += stack.shift();
  52696. y += stack.shift();
  52697. pts.push(x, y);
  52698. }
  52699. if (Math.abs(x - startx) > Math.abs(y - starty)) {
  52700. // horizontal
  52701. x += stack.shift();
  52702. y = starty;
  52703. } else {
  52704. x = startx;
  52705. y += stack.shift();
  52706. }
  52707. pts.push(x, y);
  52708. path.bezierCurveTo.apply(path, pts.slice(0, 6));
  52709. path.bezierCurveTo.apply(path, pts.slice(6));
  52710. break;
  52711. default:
  52712. throw new Error('Unknown op: 12 ' + op);
  52713. }
  52714. break;
  52715. default:
  52716. throw new Error('Unknown op: ' + op);
  52717. }
  52718. } else if (op < 247) {
  52719. stack.push(op - 139);
  52720. } else if (op < 251) {
  52721. var b1 = stream.readUInt8();
  52722. stack.push((op - 247) * 256 + b1 + 108);
  52723. } else if (op < 255) {
  52724. var b1 = stream.readUInt8();
  52725. stack.push(-(op - 251) * 256 - b1 - 108);
  52726. } else {
  52727. stack.push(stream.readInt32BE() / 65536);
  52728. }
  52729. }
  52730. };
  52731. parse();
  52732. if (open) {
  52733. path.closePath();
  52734. }
  52735. return path;
  52736. };
  52737. return CFFGlyph;
  52738. }(Glyph);
  52739. var SBIXImage = new r.Struct({
  52740. originX: r.uint16,
  52741. originY: r.uint16,
  52742. type: new r.String(4),
  52743. data: new r.Buffer(function (t) {
  52744. return t.parent.buflen - t._currentOffset;
  52745. })
  52746. });
  52747. /**
  52748. * Represents a color (e.g. emoji) glyph in Apple's SBIX format.
  52749. */
  52750. var SBIXGlyph = function (_TTFGlyph) {
  52751. _inherits(SBIXGlyph, _TTFGlyph);
  52752. function SBIXGlyph() {
  52753. _classCallCheck(this, SBIXGlyph);
  52754. return _possibleConstructorReturn(this, _TTFGlyph.apply(this, arguments));
  52755. }
  52756. /**
  52757. * Returns an object representing a glyph image at the given point size.
  52758. * The object has a data property with a Buffer containing the actual image data,
  52759. * along with the image type, and origin.
  52760. *
  52761. * @param {number} size
  52762. * @return {object}
  52763. */
  52764. SBIXGlyph.prototype.getImageForSize = function getImageForSize(size) {
  52765. for (var i = 0; i < this._font.sbix.imageTables.length; i++) {
  52766. var table = this._font.sbix.imageTables[i];
  52767. if (table.ppem >= size) {
  52768. break;
  52769. }
  52770. }
  52771. var offsets = table.imageOffsets;
  52772. var start = offsets[this.id];
  52773. var end = offsets[this.id + 1];
  52774. if (start === end) {
  52775. return null;
  52776. }
  52777. this._font.stream.pos = start;
  52778. return SBIXImage.decode(this._font.stream, { buflen: end - start });
  52779. };
  52780. SBIXGlyph.prototype.render = function render(ctx, size) {
  52781. var img = this.getImageForSize(size);
  52782. if (img != null) {
  52783. var scale = size / this._font.unitsPerEm;
  52784. ctx.image(img.data, { height: size, x: img.originX, y: (this.bbox.minY - img.originY) * scale });
  52785. }
  52786. if (this._font.sbix.flags.renderOutlines) {
  52787. _TTFGlyph.prototype.render.call(this, ctx, size);
  52788. }
  52789. };
  52790. return SBIXGlyph;
  52791. }(TTFGlyph);
  52792. var COLRLayer = function COLRLayer(glyph, color) {
  52793. _classCallCheck(this, COLRLayer);
  52794. this.glyph = glyph;
  52795. this.color = color;
  52796. };
  52797. /**
  52798. * Represents a color (e.g. emoji) glyph in Microsoft's COLR format.
  52799. * Each glyph in this format contain a list of colored layers, each
  52800. * of which is another vector glyph.
  52801. */
  52802. var COLRGlyph = function (_Glyph) {
  52803. _inherits(COLRGlyph, _Glyph);
  52804. function COLRGlyph() {
  52805. _classCallCheck(this, COLRGlyph);
  52806. return _possibleConstructorReturn(this, _Glyph.apply(this, arguments));
  52807. }
  52808. COLRGlyph.prototype._getBBox = function _getBBox() {
  52809. var bbox = new BBox();
  52810. for (var i = 0; i < this.layers.length; i++) {
  52811. var layer = this.layers[i];
  52812. var b = layer.glyph.bbox;
  52813. bbox.addPoint(b.minX, b.minY);
  52814. bbox.addPoint(b.maxX, b.maxY);
  52815. }
  52816. return bbox;
  52817. };
  52818. /**
  52819. * Returns an array of objects containing the glyph and color for
  52820. * each layer in the composite color glyph.
  52821. * @type {object[]}
  52822. */
  52823. COLRGlyph.prototype.render = function render(ctx, size) {
  52824. for (var _iterator = this.layers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  52825. var _ref;
  52826. if (_isArray) {
  52827. if (_i >= _iterator.length) break;
  52828. _ref = _iterator[_i++];
  52829. } else {
  52830. _i = _iterator.next();
  52831. if (_i.done) break;
  52832. _ref = _i.value;
  52833. }
  52834. var _ref2 = _ref,
  52835. glyph = _ref2.glyph,
  52836. color = _ref2.color;
  52837. ctx.fillColor([color.red, color.green, color.blue], color.alpha / 255 * 100);
  52838. glyph.render(ctx, size);
  52839. }
  52840. return;
  52841. };
  52842. _createClass(COLRGlyph, [{
  52843. key: 'layers',
  52844. get: function get() {
  52845. var cpal = this._font.CPAL;
  52846. var colr = this._font.COLR;
  52847. var low = 0;
  52848. var high = colr.baseGlyphRecord.length - 1;
  52849. while (low <= high) {
  52850. var mid = low + high >> 1;
  52851. var rec = colr.baseGlyphRecord[mid];
  52852. if (this.id < rec.gid) {
  52853. high = mid - 1;
  52854. } else if (this.id > rec.gid) {
  52855. low = mid + 1;
  52856. } else {
  52857. var baseLayer = rec;
  52858. break;
  52859. }
  52860. }
  52861. // if base glyph not found in COLR table,
  52862. // default to normal glyph from glyf or CFF
  52863. if (baseLayer == null) {
  52864. var g = this._font._getBaseGlyph(this.id);
  52865. var color = {
  52866. red: 0,
  52867. green: 0,
  52868. blue: 0,
  52869. alpha: 255
  52870. };
  52871. return [new COLRLayer(g, color)];
  52872. }
  52873. // otherwise, return an array of all the layers
  52874. var layers = [];
  52875. for (var i = baseLayer.firstLayerIndex; i < baseLayer.firstLayerIndex + baseLayer.numLayers; i++) {
  52876. var rec = colr.layerRecords[i];
  52877. var color = cpal.colorRecords[rec.paletteIndex];
  52878. var g = this._font._getBaseGlyph(rec.gid);
  52879. layers.push(new COLRLayer(g, color));
  52880. }
  52881. return layers;
  52882. }
  52883. }]);
  52884. return COLRGlyph;
  52885. }(Glyph);
  52886. var TUPLES_SHARE_POINT_NUMBERS = 0x8000;
  52887. var TUPLE_COUNT_MASK = 0x0fff;
  52888. var EMBEDDED_TUPLE_COORD = 0x8000;
  52889. var INTERMEDIATE_TUPLE = 0x4000;
  52890. var PRIVATE_POINT_NUMBERS = 0x2000;
  52891. var TUPLE_INDEX_MASK = 0x0fff;
  52892. var POINTS_ARE_WORDS = 0x80;
  52893. var POINT_RUN_COUNT_MASK = 0x7f;
  52894. var DELTAS_ARE_ZERO = 0x80;
  52895. var DELTAS_ARE_WORDS = 0x40;
  52896. var DELTA_RUN_COUNT_MASK = 0x3f;
  52897. /**
  52898. * This class is transforms TrueType glyphs according to the data from
  52899. * the Apple Advanced Typography variation tables (fvar, gvar, and avar).
  52900. * These tables allow infinite adjustments to glyph weight, width, slant,
  52901. * and optical size without the designer needing to specify every exact style.
  52902. *
  52903. * Apple's documentation for these tables is not great, so thanks to the
  52904. * Freetype project for figuring much of this out.
  52905. *
  52906. * @private
  52907. */
  52908. var GlyphVariationProcessor = function () {
  52909. function GlyphVariationProcessor(font, coords) {
  52910. _classCallCheck(this, GlyphVariationProcessor);
  52911. this.font = font;
  52912. this.normalizedCoords = this.normalizeCoords(coords);
  52913. this.blendVectors = new _Map();
  52914. }
  52915. GlyphVariationProcessor.prototype.normalizeCoords = function normalizeCoords(coords) {
  52916. // the default mapping is linear along each axis, in two segments:
  52917. // from the minValue to defaultValue, and from defaultValue to maxValue.
  52918. var normalized = [];
  52919. for (var i = 0; i < this.font.fvar.axis.length; i++) {
  52920. var axis = this.font.fvar.axis[i];
  52921. if (coords[i] < axis.defaultValue) {
  52922. normalized.push((coords[i] - axis.defaultValue + _Number$EPSILON) / (axis.defaultValue - axis.minValue + _Number$EPSILON));
  52923. } else {
  52924. normalized.push((coords[i] - axis.defaultValue + _Number$EPSILON) / (axis.maxValue - axis.defaultValue + _Number$EPSILON));
  52925. }
  52926. }
  52927. // if there is an avar table, the normalized value is calculated
  52928. // by interpolating between the two nearest mapped values.
  52929. if (this.font.avar) {
  52930. for (var i = 0; i < this.font.avar.segment.length; i++) {
  52931. var segment = this.font.avar.segment[i];
  52932. for (var j = 0; j < segment.correspondence.length; j++) {
  52933. var pair = segment.correspondence[j];
  52934. if (j >= 1 && normalized[i] < pair.fromCoord) {
  52935. var prev = segment.correspondence[j - 1];
  52936. normalized[i] = ((normalized[i] - prev.fromCoord) * (pair.toCoord - prev.toCoord) + _Number$EPSILON) / (pair.fromCoord - prev.fromCoord + _Number$EPSILON) + prev.toCoord;
  52937. break;
  52938. }
  52939. }
  52940. }
  52941. }
  52942. return normalized;
  52943. };
  52944. GlyphVariationProcessor.prototype.transformPoints = function transformPoints(gid, glyphPoints) {
  52945. if (!this.font.fvar || !this.font.gvar) {
  52946. return;
  52947. }
  52948. var gvar = this.font.gvar;
  52949. if (gid >= gvar.glyphCount) {
  52950. return;
  52951. }
  52952. var offset = gvar.offsets[gid];
  52953. if (offset === gvar.offsets[gid + 1]) {
  52954. return;
  52955. }
  52956. // Read the gvar data for this glyph
  52957. var stream = this.font.stream;
  52958. stream.pos = offset;
  52959. if (stream.pos >= stream.length) {
  52960. return;
  52961. }
  52962. var tupleCount = stream.readUInt16BE();
  52963. var offsetToData = offset + stream.readUInt16BE();
  52964. if (tupleCount & TUPLES_SHARE_POINT_NUMBERS) {
  52965. var here = stream.pos;
  52966. stream.pos = offsetToData;
  52967. var sharedPoints = this.decodePoints();
  52968. offsetToData = stream.pos;
  52969. stream.pos = here;
  52970. }
  52971. var origPoints = glyphPoints.map(function (pt) {
  52972. return pt.copy();
  52973. });
  52974. tupleCount &= TUPLE_COUNT_MASK;
  52975. for (var i = 0; i < tupleCount; i++) {
  52976. var tupleDataSize = stream.readUInt16BE();
  52977. var tupleIndex = stream.readUInt16BE();
  52978. if (tupleIndex & EMBEDDED_TUPLE_COORD) {
  52979. var tupleCoords = [];
  52980. for (var a = 0; a < gvar.axisCount; a++) {
  52981. tupleCoords.push(stream.readInt16BE() / 16384);
  52982. }
  52983. } else {
  52984. if ((tupleIndex & TUPLE_INDEX_MASK) >= gvar.globalCoordCount) {
  52985. throw new Error('Invalid gvar table');
  52986. }
  52987. var tupleCoords = gvar.globalCoords[tupleIndex & TUPLE_INDEX_MASK];
  52988. }
  52989. if (tupleIndex & INTERMEDIATE_TUPLE) {
  52990. var startCoords = [];
  52991. for (var _a = 0; _a < gvar.axisCount; _a++) {
  52992. startCoords.push(stream.readInt16BE() / 16384);
  52993. }
  52994. var endCoords = [];
  52995. for (var _a2 = 0; _a2 < gvar.axisCount; _a2++) {
  52996. endCoords.push(stream.readInt16BE() / 16384);
  52997. }
  52998. }
  52999. // Get the factor at which to apply this tuple
  53000. var factor = this.tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords);
  53001. if (factor === 0) {
  53002. offsetToData += tupleDataSize;
  53003. continue;
  53004. }
  53005. var here = stream.pos;
  53006. stream.pos = offsetToData;
  53007. if (tupleIndex & PRIVATE_POINT_NUMBERS) {
  53008. var points = this.decodePoints();
  53009. } else {
  53010. var points = sharedPoints;
  53011. }
  53012. // points.length = 0 means there are deltas for all points
  53013. var nPoints = points.length === 0 ? glyphPoints.length : points.length;
  53014. var xDeltas = this.decodeDeltas(nPoints);
  53015. var yDeltas = this.decodeDeltas(nPoints);
  53016. if (points.length === 0) {
  53017. // all points
  53018. for (var _i = 0; _i < glyphPoints.length; _i++) {
  53019. var point = glyphPoints[_i];
  53020. point.x += Math.round(xDeltas[_i] * factor);
  53021. point.y += Math.round(yDeltas[_i] * factor);
  53022. }
  53023. } else {
  53024. var outPoints = origPoints.map(function (pt) {
  53025. return pt.copy();
  53026. });
  53027. var hasDelta = glyphPoints.map(function () {
  53028. return false;
  53029. });
  53030. for (var _i2 = 0; _i2 < points.length; _i2++) {
  53031. var idx = points[_i2];
  53032. if (idx < glyphPoints.length) {
  53033. var _point = outPoints[idx];
  53034. hasDelta[idx] = true;
  53035. _point.x += Math.round(xDeltas[_i2] * factor);
  53036. _point.y += Math.round(yDeltas[_i2] * factor);
  53037. }
  53038. }
  53039. this.interpolateMissingDeltas(outPoints, origPoints, hasDelta);
  53040. for (var _i3 = 0; _i3 < glyphPoints.length; _i3++) {
  53041. var deltaX = outPoints[_i3].x - origPoints[_i3].x;
  53042. var deltaY = outPoints[_i3].y - origPoints[_i3].y;
  53043. glyphPoints[_i3].x += deltaX;
  53044. glyphPoints[_i3].y += deltaY;
  53045. }
  53046. }
  53047. offsetToData += tupleDataSize;
  53048. stream.pos = here;
  53049. }
  53050. };
  53051. GlyphVariationProcessor.prototype.decodePoints = function decodePoints() {
  53052. var stream = this.font.stream;
  53053. var count = stream.readUInt8();
  53054. if (count & POINTS_ARE_WORDS) {
  53055. count = (count & POINT_RUN_COUNT_MASK) << 8 | stream.readUInt8();
  53056. }
  53057. var points = new Uint16Array(count);
  53058. var i = 0;
  53059. var point = 0;
  53060. while (i < count) {
  53061. var run = stream.readUInt8();
  53062. var runCount = (run & POINT_RUN_COUNT_MASK) + 1;
  53063. var fn = run & POINTS_ARE_WORDS ? stream.readUInt16 : stream.readUInt8;
  53064. for (var j = 0; j < runCount && i < count; j++) {
  53065. point += fn.call(stream);
  53066. points[i++] = point;
  53067. }
  53068. }
  53069. return points;
  53070. };
  53071. GlyphVariationProcessor.prototype.decodeDeltas = function decodeDeltas(count) {
  53072. var stream = this.font.stream;
  53073. var i = 0;
  53074. var deltas = new Int16Array(count);
  53075. while (i < count) {
  53076. var run = stream.readUInt8();
  53077. var runCount = (run & DELTA_RUN_COUNT_MASK) + 1;
  53078. if (run & DELTAS_ARE_ZERO) {
  53079. i += runCount;
  53080. } else {
  53081. var fn = run & DELTAS_ARE_WORDS ? stream.readInt16BE : stream.readInt8;
  53082. for (var j = 0; j < runCount && i < count; j++) {
  53083. deltas[i++] = fn.call(stream);
  53084. }
  53085. }
  53086. }
  53087. return deltas;
  53088. };
  53089. GlyphVariationProcessor.prototype.tupleFactor = function tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords) {
  53090. var normalized = this.normalizedCoords;
  53091. var gvar = this.font.gvar;
  53092. var factor = 1;
  53093. for (var i = 0; i < gvar.axisCount; i++) {
  53094. if (tupleCoords[i] === 0) {
  53095. continue;
  53096. }
  53097. if (normalized[i] === 0) {
  53098. return 0;
  53099. }
  53100. if ((tupleIndex & INTERMEDIATE_TUPLE) === 0) {
  53101. if (normalized[i] < Math.min(0, tupleCoords[i]) || normalized[i] > Math.max(0, tupleCoords[i])) {
  53102. return 0;
  53103. }
  53104. factor = (factor * normalized[i] + _Number$EPSILON) / (tupleCoords[i] + _Number$EPSILON);
  53105. } else {
  53106. if (normalized[i] < startCoords[i] || normalized[i] > endCoords[i]) {
  53107. return 0;
  53108. } else if (normalized[i] < tupleCoords[i]) {
  53109. factor = factor * (normalized[i] - startCoords[i] + _Number$EPSILON) / (tupleCoords[i] - startCoords[i] + _Number$EPSILON);
  53110. } else {
  53111. factor = factor * (endCoords[i] - normalized[i] + _Number$EPSILON) / (endCoords[i] - tupleCoords[i] + _Number$EPSILON);
  53112. }
  53113. }
  53114. }
  53115. return factor;
  53116. };
  53117. // Interpolates points without delta values.
  53118. // Needed for the Ø and Q glyphs in Skia.
  53119. // Algorithm from Freetype.
  53120. GlyphVariationProcessor.prototype.interpolateMissingDeltas = function interpolateMissingDeltas(points, inPoints, hasDelta) {
  53121. if (points.length === 0) {
  53122. return;
  53123. }
  53124. var point = 0;
  53125. while (point < points.length) {
  53126. var firstPoint = point;
  53127. // find the end point of the contour
  53128. var endPoint = point;
  53129. var pt = points[endPoint];
  53130. while (!pt.endContour) {
  53131. pt = points[++endPoint];
  53132. }
  53133. // find the first point that has a delta
  53134. while (point <= endPoint && !hasDelta[point]) {
  53135. point++;
  53136. }
  53137. if (point > endPoint) {
  53138. continue;
  53139. }
  53140. var firstDelta = point;
  53141. var curDelta = point;
  53142. point++;
  53143. while (point <= endPoint) {
  53144. // find the next point with a delta, and interpolate intermediate points
  53145. if (hasDelta[point]) {
  53146. this.deltaInterpolate(curDelta + 1, point - 1, curDelta, point, inPoints, points);
  53147. curDelta = point;
  53148. }
  53149. point++;
  53150. }
  53151. // shift contour if we only have a single delta
  53152. if (curDelta === firstDelta) {
  53153. this.deltaShift(firstPoint, endPoint, curDelta, inPoints, points);
  53154. } else {
  53155. // otherwise, handle the remaining points at the end and beginning of the contour
  53156. this.deltaInterpolate(curDelta + 1, endPoint, curDelta, firstDelta, inPoints, points);
  53157. if (firstDelta > 0) {
  53158. this.deltaInterpolate(firstPoint, firstDelta - 1, curDelta, firstDelta, inPoints, points);
  53159. }
  53160. }
  53161. point = endPoint + 1;
  53162. }
  53163. };
  53164. GlyphVariationProcessor.prototype.deltaInterpolate = function deltaInterpolate(p1, p2, ref1, ref2, inPoints, outPoints) {
  53165. if (p1 > p2) {
  53166. return;
  53167. }
  53168. var iterable = ['x', 'y'];
  53169. for (var i = 0; i < iterable.length; i++) {
  53170. var k = iterable[i];
  53171. if (inPoints[ref1][k] > inPoints[ref2][k]) {
  53172. var p = ref1;
  53173. ref1 = ref2;
  53174. ref2 = p;
  53175. }
  53176. var in1 = inPoints[ref1][k];
  53177. var in2 = inPoints[ref2][k];
  53178. var out1 = outPoints[ref1][k];
  53179. var out2 = outPoints[ref2][k];
  53180. // If the reference points have the same coordinate but different
  53181. // delta, inferred delta is zero. Otherwise interpolate.
  53182. if (in1 !== in2 || out1 === out2) {
  53183. var scale = in1 === in2 ? 0 : (out2 - out1) / (in2 - in1);
  53184. for (var _p = p1; _p <= p2; _p++) {
  53185. var out = inPoints[_p][k];
  53186. if (out <= in1) {
  53187. out += out1 - in1;
  53188. } else if (out >= in2) {
  53189. out += out2 - in2;
  53190. } else {
  53191. out = out1 + (out - in1) * scale;
  53192. }
  53193. outPoints[_p][k] = out;
  53194. }
  53195. }
  53196. }
  53197. };
  53198. GlyphVariationProcessor.prototype.deltaShift = function deltaShift(p1, p2, ref, inPoints, outPoints) {
  53199. var deltaX = outPoints[ref].x - inPoints[ref].x;
  53200. var deltaY = outPoints[ref].y - inPoints[ref].y;
  53201. if (deltaX === 0 && deltaY === 0) {
  53202. return;
  53203. }
  53204. for (var p = p1; p <= p2; p++) {
  53205. if (p !== ref) {
  53206. outPoints[p].x += deltaX;
  53207. outPoints[p].y += deltaY;
  53208. }
  53209. }
  53210. };
  53211. GlyphVariationProcessor.prototype.getAdvanceAdjustment = function getAdvanceAdjustment(gid, table) {
  53212. var outerIndex = void 0,
  53213. innerIndex = void 0;
  53214. if (table.advanceWidthMapping) {
  53215. var idx = gid;
  53216. if (idx >= table.advanceWidthMapping.mapCount) {
  53217. idx = table.advanceWidthMapping.mapCount - 1;
  53218. }
  53219. var entryFormat = table.advanceWidthMapping.entryFormat;
  53220. var _table$advanceWidthMa = table.advanceWidthMapping.mapData[idx];
  53221. outerIndex = _table$advanceWidthMa.outerIndex;
  53222. innerIndex = _table$advanceWidthMa.innerIndex;
  53223. } else {
  53224. outerIndex = 0;
  53225. innerIndex = gid;
  53226. }
  53227. return this.getDelta(table.itemVariationStore, outerIndex, innerIndex);
  53228. };
  53229. // See pseudo code from `Font Variations Overview'
  53230. // in the OpenType specification.
  53231. GlyphVariationProcessor.prototype.getDelta = function getDelta(itemStore, outerIndex, innerIndex) {
  53232. if (outerIndex >= itemStore.itemVariationData.length) {
  53233. return 0;
  53234. }
  53235. var varData = itemStore.itemVariationData[outerIndex];
  53236. if (innerIndex >= varData.deltaSets.length) {
  53237. return 0;
  53238. }
  53239. var deltaSet = varData.deltaSets[innerIndex];
  53240. var blendVector = this.getBlendVector(itemStore, outerIndex);
  53241. var netAdjustment = 0;
  53242. for (var master = 0; master < varData.regionIndexCount; master++) {
  53243. netAdjustment += deltaSet.deltas[master] * blendVector[master];
  53244. }
  53245. return netAdjustment;
  53246. };
  53247. GlyphVariationProcessor.prototype.getBlendVector = function getBlendVector(itemStore, outerIndex) {
  53248. var varData = itemStore.itemVariationData[outerIndex];
  53249. if (this.blendVectors.has(varData)) {
  53250. return this.blendVectors.get(varData);
  53251. }
  53252. var normalizedCoords = this.normalizedCoords;
  53253. var blendVector = [];
  53254. // outer loop steps through master designs to be blended
  53255. for (var master = 0; master < varData.regionIndexCount; master++) {
  53256. var scalar = 1;
  53257. var regionIndex = varData.regionIndexes[master];
  53258. var axes = itemStore.variationRegionList.variationRegions[regionIndex];
  53259. // inner loop steps through axes in this region
  53260. for (var j = 0; j < axes.length; j++) {
  53261. var axis = axes[j];
  53262. var axisScalar = void 0;
  53263. // compute the scalar contribution of this axis
  53264. // ignore invalid ranges
  53265. if (axis.startCoord > axis.peakCoord || axis.peakCoord > axis.endCoord) {
  53266. axisScalar = 1;
  53267. } else if (axis.startCoord < 0 && axis.endCoord > 0 && axis.peakCoord !== 0) {
  53268. axisScalar = 1;
  53269. // peak of 0 means ignore this axis
  53270. } else if (axis.peakCoord === 0) {
  53271. axisScalar = 1;
  53272. // ignore this region if coords are out of range
  53273. } else if (normalizedCoords[j] < axis.startCoord || normalizedCoords[j] > axis.endCoord) {
  53274. axisScalar = 0;
  53275. // calculate a proportional factor
  53276. } else {
  53277. if (normalizedCoords[j] === axis.peakCoord) {
  53278. axisScalar = 1;
  53279. } else if (normalizedCoords[j] < axis.peakCoord) {
  53280. axisScalar = (normalizedCoords[j] - axis.startCoord + _Number$EPSILON) / (axis.peakCoord - axis.startCoord + _Number$EPSILON);
  53281. } else {
  53282. axisScalar = (axis.endCoord - normalizedCoords[j] + _Number$EPSILON) / (axis.endCoord - axis.peakCoord + _Number$EPSILON);
  53283. }
  53284. }
  53285. // take product of all the axis scalars
  53286. scalar *= axisScalar;
  53287. }
  53288. blendVector[master] = scalar;
  53289. }
  53290. this.blendVectors.set(varData, blendVector);
  53291. return blendVector;
  53292. };
  53293. return GlyphVariationProcessor;
  53294. }();
  53295. var Subset = function () {
  53296. function Subset(font) {
  53297. _classCallCheck(this, Subset);
  53298. this.font = font;
  53299. this.glyphs = [];
  53300. this.mapping = {};
  53301. // always include the missing glyph
  53302. this.includeGlyph(0);
  53303. }
  53304. Subset.prototype.includeGlyph = function includeGlyph(glyph) {
  53305. if ((typeof glyph === 'undefined' ? 'undefined' : _typeof(glyph)) === 'object') {
  53306. glyph = glyph.id;
  53307. }
  53308. if (this.mapping[glyph] == null) {
  53309. this.glyphs.push(glyph);
  53310. this.mapping[glyph] = this.glyphs.length - 1;
  53311. }
  53312. return this.mapping[glyph];
  53313. };
  53314. Subset.prototype.encodeStream = function encodeStream() {
  53315. var _this = this;
  53316. var s = new r.EncodeStream();
  53317. process.nextTick(function () {
  53318. _this.encode(s);
  53319. return s.end();
  53320. });
  53321. return s;
  53322. };
  53323. return Subset;
  53324. }();
  53325. // Flags for simple glyphs
  53326. var ON_CURVE$1 = 1 << 0;
  53327. var X_SHORT_VECTOR$1 = 1 << 1;
  53328. var Y_SHORT_VECTOR$1 = 1 << 2;
  53329. var REPEAT$1 = 1 << 3;
  53330. var SAME_X$1 = 1 << 4;
  53331. var SAME_Y$1 = 1 << 5;
  53332. var Point$1 = function () {
  53333. function Point() {
  53334. _classCallCheck(this, Point);
  53335. }
  53336. Point.size = function size(val) {
  53337. return val >= 0 && val <= 255 ? 1 : 2;
  53338. };
  53339. Point.encode = function encode(stream, value) {
  53340. if (value >= 0 && value <= 255) {
  53341. stream.writeUInt8(value);
  53342. } else {
  53343. stream.writeInt16BE(value);
  53344. }
  53345. };
  53346. return Point;
  53347. }();
  53348. var Glyf = new r.Struct({
  53349. numberOfContours: r.int16, // if negative, this is a composite glyph
  53350. xMin: r.int16,
  53351. yMin: r.int16,
  53352. xMax: r.int16,
  53353. yMax: r.int16,
  53354. endPtsOfContours: new r.Array(r.uint16, 'numberOfContours'),
  53355. instructions: new r.Array(r.uint8, r.uint16),
  53356. flags: new r.Array(r.uint8, 0),
  53357. xPoints: new r.Array(Point$1, 0),
  53358. yPoints: new r.Array(Point$1, 0)
  53359. });
  53360. /**
  53361. * Encodes TrueType glyph outlines
  53362. */
  53363. var TTFGlyphEncoder = function () {
  53364. function TTFGlyphEncoder() {
  53365. _classCallCheck(this, TTFGlyphEncoder);
  53366. }
  53367. TTFGlyphEncoder.prototype.encodeSimple = function encodeSimple(path) {
  53368. var instructions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  53369. var endPtsOfContours = [];
  53370. var xPoints = [];
  53371. var yPoints = [];
  53372. var flags = [];
  53373. var same = 0;
  53374. var lastX = 0,
  53375. lastY = 0,
  53376. lastFlag = 0;
  53377. var pointCount = 0;
  53378. for (var i = 0; i < path.commands.length; i++) {
  53379. var c = path.commands[i];
  53380. for (var j = 0; j < c.args.length; j += 2) {
  53381. var x = c.args[j];
  53382. var y = c.args[j + 1];
  53383. var flag = 0;
  53384. // If the ending point of a quadratic curve is the midpoint
  53385. // between the control point and the control point of the next
  53386. // quadratic curve, we can omit the ending point.
  53387. if (c.command === 'quadraticCurveTo' && j === 2) {
  53388. var next = path.commands[i + 1];
  53389. if (next && next.command === 'quadraticCurveTo') {
  53390. var midX = (lastX + next.args[0]) / 2;
  53391. var midY = (lastY + next.args[1]) / 2;
  53392. if (x === midX && y === midY) {
  53393. continue;
  53394. }
  53395. }
  53396. }
  53397. // All points except control points are on curve.
  53398. if (!(c.command === 'quadraticCurveTo' && j === 0)) {
  53399. flag |= ON_CURVE$1;
  53400. }
  53401. flag = this._encodePoint(x, lastX, xPoints, flag, X_SHORT_VECTOR$1, SAME_X$1);
  53402. flag = this._encodePoint(y, lastY, yPoints, flag, Y_SHORT_VECTOR$1, SAME_Y$1);
  53403. if (flag === lastFlag && same < 255) {
  53404. flags[flags.length - 1] |= REPEAT$1;
  53405. same++;
  53406. } else {
  53407. if (same > 0) {
  53408. flags.push(same);
  53409. same = 0;
  53410. }
  53411. flags.push(flag);
  53412. lastFlag = flag;
  53413. }
  53414. lastX = x;
  53415. lastY = y;
  53416. pointCount++;
  53417. }
  53418. if (c.command === 'closePath') {
  53419. endPtsOfContours.push(pointCount - 1);
  53420. }
  53421. }
  53422. // Close the path if the last command didn't already
  53423. if (path.commands.length > 1 && path.commands[path.commands.length - 1].command !== 'closePath') {
  53424. endPtsOfContours.push(pointCount - 1);
  53425. }
  53426. var bbox = path.bbox;
  53427. var glyf = {
  53428. numberOfContours: endPtsOfContours.length,
  53429. xMin: bbox.minX,
  53430. yMin: bbox.minY,
  53431. xMax: bbox.maxX,
  53432. yMax: bbox.maxY,
  53433. endPtsOfContours: endPtsOfContours,
  53434. instructions: instructions,
  53435. flags: flags,
  53436. xPoints: xPoints,
  53437. yPoints: yPoints
  53438. };
  53439. var size = Glyf.size(glyf);
  53440. var tail = 4 - size % 4;
  53441. var stream = new r.EncodeStream(size + tail);
  53442. Glyf.encode(stream, glyf);
  53443. // Align to 4-byte length
  53444. if (tail !== 0) {
  53445. stream.fill(0, tail);
  53446. }
  53447. return stream.buffer;
  53448. };
  53449. TTFGlyphEncoder.prototype._encodePoint = function _encodePoint(value, last, points, flag, shortFlag, sameFlag) {
  53450. var diff = value - last;
  53451. if (value === last) {
  53452. flag |= sameFlag;
  53453. } else {
  53454. if (-255 <= diff && diff <= 255) {
  53455. flag |= shortFlag;
  53456. if (diff < 0) {
  53457. diff = -diff;
  53458. } else {
  53459. flag |= sameFlag;
  53460. }
  53461. }
  53462. points.push(diff);
  53463. }
  53464. return flag;
  53465. };
  53466. return TTFGlyphEncoder;
  53467. }();
  53468. var TTFSubset = function (_Subset) {
  53469. _inherits(TTFSubset, _Subset);
  53470. function TTFSubset(font) {
  53471. _classCallCheck(this, TTFSubset);
  53472. var _this = _possibleConstructorReturn(this, _Subset.call(this, font));
  53473. _this.glyphEncoder = new TTFGlyphEncoder();
  53474. return _this;
  53475. }
  53476. TTFSubset.prototype._addGlyph = function _addGlyph(gid) {
  53477. var glyph = this.font.getGlyph(gid);
  53478. var glyf = glyph._decode();
  53479. // get the offset to the glyph from the loca table
  53480. var curOffset = this.font.loca.offsets[gid];
  53481. var nextOffset = this.font.loca.offsets[gid + 1];
  53482. var stream = this.font._getTableStream('glyf');
  53483. stream.pos += curOffset;
  53484. var buffer = stream.readBuffer(nextOffset - curOffset);
  53485. // if it is a compound glyph, include its components
  53486. if (glyf && glyf.numberOfContours < 0) {
  53487. buffer = new Buffer(buffer);
  53488. for (var _iterator = glyf.components, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  53489. var _ref;
  53490. if (_isArray) {
  53491. if (_i >= _iterator.length) break;
  53492. _ref = _iterator[_i++];
  53493. } else {
  53494. _i = _iterator.next();
  53495. if (_i.done) break;
  53496. _ref = _i.value;
  53497. }
  53498. var component = _ref;
  53499. gid = this.includeGlyph(component.glyphID);
  53500. buffer.writeUInt16BE(gid, component.pos);
  53501. }
  53502. } else if (glyf && this.font._variationProcessor) {
  53503. // If this is a TrueType variation glyph, re-encode the path
  53504. buffer = this.glyphEncoder.encodeSimple(glyph.path, glyf.instructions);
  53505. }
  53506. this.glyf.push(buffer);
  53507. this.loca.offsets.push(this.offset);
  53508. this.hmtx.metrics.push({
  53509. advance: glyph.advanceWidth,
  53510. bearing: glyph._getMetrics().leftBearing
  53511. });
  53512. this.offset += buffer.length;
  53513. return this.glyf.length - 1;
  53514. };
  53515. TTFSubset.prototype.encode = function encode(stream) {
  53516. // tables required by PDF spec:
  53517. // head, hhea, loca, maxp, cvt , prep, glyf, hmtx, fpgm
  53518. //
  53519. // additional tables required for standalone fonts:
  53520. // name, cmap, OS/2, post
  53521. this.glyf = [];
  53522. this.offset = 0;
  53523. this.loca = {
  53524. offsets: []
  53525. };
  53526. this.hmtx = {
  53527. metrics: [],
  53528. bearings: []
  53529. };
  53530. // include all the glyphs
  53531. // not using a for loop because we need to support adding more
  53532. // glyphs to the array as we go, and CoffeeScript caches the length.
  53533. var i = 0;
  53534. while (i < this.glyphs.length) {
  53535. this._addGlyph(this.glyphs[i++]);
  53536. }
  53537. var maxp = cloneDeep(this.font.maxp);
  53538. maxp.numGlyphs = this.glyf.length;
  53539. this.loca.offsets.push(this.offset);
  53540. tables.loca.preEncode.call(this.loca);
  53541. var head = cloneDeep(this.font.head);
  53542. head.indexToLocFormat = this.loca.version;
  53543. var hhea = cloneDeep(this.font.hhea);
  53544. hhea.numberOfMetrics = this.hmtx.metrics.length;
  53545. // map = []
  53546. // for index in [0...256]
  53547. // if index < @numGlyphs
  53548. // map[index] = index
  53549. // else
  53550. // map[index] = 0
  53551. //
  53552. // cmapTable =
  53553. // version: 0
  53554. // length: 262
  53555. // language: 0
  53556. // codeMap: map
  53557. //
  53558. // cmap =
  53559. // version: 0
  53560. // numSubtables: 1
  53561. // tables: [
  53562. // platformID: 1
  53563. // encodingID: 0
  53564. // table: cmapTable
  53565. // ]
  53566. // TODO: subset prep, cvt, fpgm?
  53567. Directory.encode(stream, {
  53568. tables: {
  53569. head: head,
  53570. hhea: hhea,
  53571. loca: this.loca,
  53572. maxp: maxp,
  53573. 'cvt ': this.font['cvt '],
  53574. prep: this.font.prep,
  53575. glyf: this.glyf,
  53576. hmtx: this.hmtx,
  53577. fpgm: this.font.fpgm
  53578. // name: clone @font.name
  53579. // 'OS/2': clone @font['OS/2']
  53580. // post: clone @font.post
  53581. // cmap: cmap
  53582. }
  53583. });
  53584. };
  53585. return TTFSubset;
  53586. }(Subset);
  53587. var CFFSubset = function (_Subset) {
  53588. _inherits(CFFSubset, _Subset);
  53589. function CFFSubset(font) {
  53590. _classCallCheck(this, CFFSubset);
  53591. var _this = _possibleConstructorReturn(this, _Subset.call(this, font));
  53592. _this.cff = _this.font['CFF '];
  53593. if (!_this.cff) {
  53594. throw new Error('Not a CFF Font');
  53595. }
  53596. return _this;
  53597. }
  53598. CFFSubset.prototype.subsetCharstrings = function subsetCharstrings() {
  53599. this.charstrings = [];
  53600. var gsubrs = {};
  53601. for (var _iterator = this.glyphs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  53602. var _ref;
  53603. if (_isArray) {
  53604. if (_i >= _iterator.length) break;
  53605. _ref = _iterator[_i++];
  53606. } else {
  53607. _i = _iterator.next();
  53608. if (_i.done) break;
  53609. _ref = _i.value;
  53610. }
  53611. var gid = _ref;
  53612. this.charstrings.push(this.cff.getCharString(gid));
  53613. var glyph = this.font.getGlyph(gid);
  53614. var path = glyph.path; // this causes the glyph to be parsed
  53615. for (var subr in glyph._usedGsubrs) {
  53616. gsubrs[subr] = true;
  53617. }
  53618. }
  53619. this.gsubrs = this.subsetSubrs(this.cff.globalSubrIndex, gsubrs);
  53620. };
  53621. CFFSubset.prototype.subsetSubrs = function subsetSubrs(subrs, used) {
  53622. var res = [];
  53623. for (var i = 0; i < subrs.length; i++) {
  53624. var subr = subrs[i];
  53625. if (used[i]) {
  53626. this.cff.stream.pos = subr.offset;
  53627. res.push(this.cff.stream.readBuffer(subr.length));
  53628. } else {
  53629. res.push(new Buffer([11])); // return
  53630. }
  53631. }
  53632. return res;
  53633. };
  53634. CFFSubset.prototype.subsetFontdict = function subsetFontdict(topDict) {
  53635. topDict.FDArray = [];
  53636. topDict.FDSelect = {
  53637. version: 0,
  53638. fds: []
  53639. };
  53640. var used_fds = {};
  53641. var used_subrs = [];
  53642. for (var _iterator2 = this.glyphs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  53643. var _ref2;
  53644. if (_isArray2) {
  53645. if (_i2 >= _iterator2.length) break;
  53646. _ref2 = _iterator2[_i2++];
  53647. } else {
  53648. _i2 = _iterator2.next();
  53649. if (_i2.done) break;
  53650. _ref2 = _i2.value;
  53651. }
  53652. var gid = _ref2;
  53653. var fd = this.cff.fdForGlyph(gid);
  53654. if (fd == null) {
  53655. continue;
  53656. }
  53657. if (!used_fds[fd]) {
  53658. topDict.FDArray.push(_Object$assign({}, this.cff.topDict.FDArray[fd]));
  53659. used_subrs.push({});
  53660. }
  53661. used_fds[fd] = true;
  53662. topDict.FDSelect.fds.push(topDict.FDArray.length - 1);
  53663. var glyph = this.font.getGlyph(gid);
  53664. var path = glyph.path; // this causes the glyph to be parsed
  53665. for (var subr in glyph._usedSubrs) {
  53666. used_subrs[used_subrs.length - 1][subr] = true;
  53667. }
  53668. }
  53669. for (var i = 0; i < topDict.FDArray.length; i++) {
  53670. var dict = topDict.FDArray[i];
  53671. delete dict.FontName;
  53672. if (dict.Private && dict.Private.Subrs) {
  53673. dict.Private = _Object$assign({}, dict.Private);
  53674. dict.Private.Subrs = this.subsetSubrs(dict.Private.Subrs, used_subrs[i]);
  53675. }
  53676. }
  53677. return;
  53678. };
  53679. CFFSubset.prototype.createCIDFontdict = function createCIDFontdict(topDict) {
  53680. var used_subrs = {};
  53681. for (var _iterator3 = this.glyphs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  53682. var _ref3;
  53683. if (_isArray3) {
  53684. if (_i3 >= _iterator3.length) break;
  53685. _ref3 = _iterator3[_i3++];
  53686. } else {
  53687. _i3 = _iterator3.next();
  53688. if (_i3.done) break;
  53689. _ref3 = _i3.value;
  53690. }
  53691. var gid = _ref3;
  53692. var glyph = this.font.getGlyph(gid);
  53693. var path = glyph.path; // this causes the glyph to be parsed
  53694. for (var subr in glyph._usedSubrs) {
  53695. used_subrs[subr] = true;
  53696. }
  53697. }
  53698. var privateDict = _Object$assign({}, this.cff.topDict.Private);
  53699. privateDict.Subrs = this.subsetSubrs(this.cff.topDict.Private.Subrs, used_subrs);
  53700. topDict.FDArray = [{ Private: privateDict }];
  53701. return topDict.FDSelect = {
  53702. version: 3,
  53703. nRanges: 1,
  53704. ranges: [{ first: 0, fd: 0 }],
  53705. sentinel: this.charstrings.length
  53706. };
  53707. };
  53708. CFFSubset.prototype.addString = function addString(string) {
  53709. if (!string) {
  53710. return null;
  53711. }
  53712. if (!this.strings) {
  53713. this.strings = [];
  53714. }
  53715. this.strings.push(string);
  53716. return standardStrings.length + this.strings.length - 1;
  53717. };
  53718. CFFSubset.prototype.encode = function encode(stream) {
  53719. this.subsetCharstrings();
  53720. var charset = {
  53721. version: this.charstrings.length > 255 ? 2 : 1,
  53722. ranges: [{ first: 1, nLeft: this.charstrings.length - 2 }]
  53723. };
  53724. var topDict = _Object$assign({}, this.cff.topDict);
  53725. topDict.Private = null;
  53726. topDict.charset = charset;
  53727. topDict.Encoding = null;
  53728. topDict.CharStrings = this.charstrings;
  53729. var _arr = ['version', 'Notice', 'Copyright', 'FullName', 'FamilyName', 'Weight', 'PostScript', 'BaseFontName', 'FontName'];
  53730. for (var _i4 = 0; _i4 < _arr.length; _i4++) {
  53731. var key = _arr[_i4];
  53732. topDict[key] = this.addString(this.cff.string(topDict[key]));
  53733. }
  53734. topDict.ROS = [this.addString('Adobe'), this.addString('Identity'), 0];
  53735. topDict.CIDCount = this.charstrings.length;
  53736. if (this.cff.isCIDFont) {
  53737. this.subsetFontdict(topDict);
  53738. } else {
  53739. this.createCIDFontdict(topDict);
  53740. }
  53741. var top = {
  53742. version: 1,
  53743. hdrSize: this.cff.hdrSize,
  53744. offSize: this.cff.length,
  53745. header: this.cff.header,
  53746. nameIndex: [this.cff.postscriptName],
  53747. topDictIndex: [topDict],
  53748. stringIndex: this.strings,
  53749. globalSubrIndex: this.gsubrs
  53750. };
  53751. CFFTop.encode(stream, top);
  53752. };
  53753. return CFFSubset;
  53754. }(Subset);
  53755. var _class;
  53756. function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
  53757. var desc = {};
  53758. Object['ke' + 'ys'](descriptor).forEach(function (key) {
  53759. desc[key] = descriptor[key];
  53760. });
  53761. desc.enumerable = !!desc.enumerable;
  53762. desc.configurable = !!desc.configurable;
  53763. if ('value' in desc || desc.initializer) {
  53764. desc.writable = true;
  53765. }
  53766. desc = decorators.slice().reverse().reduce(function (desc, decorator) {
  53767. return decorator(target, property, desc) || desc;
  53768. }, desc);
  53769. if (context && desc.initializer !== void 0) {
  53770. desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
  53771. desc.initializer = undefined;
  53772. }
  53773. if (desc.initializer === void 0) {
  53774. Object['define' + 'Property'](target, property, desc);
  53775. desc = null;
  53776. }
  53777. return desc;
  53778. }
  53779. /**
  53780. * This is the base class for all SFNT-based font formats in fontkit.
  53781. * It supports TrueType, and PostScript glyphs, and several color glyph formats.
  53782. */
  53783. var TTFFont = (_class = function () {
  53784. TTFFont.probe = function probe(buffer) {
  53785. var format = buffer.toString('ascii', 0, 4);
  53786. return format === 'true' || format === 'OTTO' || format === String.fromCharCode(0, 1, 0, 0);
  53787. };
  53788. function TTFFont(stream) {
  53789. var variationCoords = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  53790. _classCallCheck(this, TTFFont);
  53791. this.stream = stream;
  53792. this.variationCoords = variationCoords;
  53793. this._directoryPos = this.stream.pos;
  53794. this._tables = {};
  53795. this._glyphs = {};
  53796. this._decodeDirectory();
  53797. // define properties for each table to lazily parse
  53798. for (var tag in this.directory.tables) {
  53799. var table = this.directory.tables[tag];
  53800. if (tables[tag] && table.length > 0) {
  53801. _Object$defineProperty(this, tag, {
  53802. get: this._getTable.bind(this, table)
  53803. });
  53804. }
  53805. }
  53806. }
  53807. TTFFont.prototype._getTable = function _getTable(table) {
  53808. if (!(table.tag in this._tables)) {
  53809. try {
  53810. this._tables[table.tag] = this._decodeTable(table);
  53811. } catch (e) {
  53812. if (fontkit.logErrors) {
  53813. console.error('Error decoding table ' + table.tag);
  53814. console.error(e.stack);
  53815. }
  53816. }
  53817. }
  53818. return this._tables[table.tag];
  53819. };
  53820. TTFFont.prototype._getTableStream = function _getTableStream(tag) {
  53821. var table = this.directory.tables[tag];
  53822. if (table) {
  53823. this.stream.pos = table.offset;
  53824. return this.stream;
  53825. }
  53826. return null;
  53827. };
  53828. TTFFont.prototype._decodeDirectory = function _decodeDirectory() {
  53829. return this.directory = Directory.decode(this.stream, { _startOffset: 0 });
  53830. };
  53831. TTFFont.prototype._decodeTable = function _decodeTable(table) {
  53832. var pos = this.stream.pos;
  53833. var stream = this._getTableStream(table.tag);
  53834. var result = tables[table.tag].decode(stream, this, table.length);
  53835. this.stream.pos = pos;
  53836. return result;
  53837. };
  53838. /**
  53839. * The unique PostScript name for this font
  53840. * @type {string}
  53841. */
  53842. /**
  53843. * Gets a string from the font's `name` table
  53844. * `lang` is a BCP-47 language code.
  53845. * @return {string}
  53846. */
  53847. TTFFont.prototype.getName = function getName(key) {
  53848. var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'en';
  53849. var record = this.name.records[key];
  53850. if (record) {
  53851. return record[lang];
  53852. }
  53853. return null;
  53854. };
  53855. /**
  53856. * The font's full name, e.g. "Helvetica Bold"
  53857. * @type {string}
  53858. */
  53859. /**
  53860. * Returns whether there is glyph in the font for the given unicode code point.
  53861. *
  53862. * @param {number} codePoint
  53863. * @return {boolean}
  53864. */
  53865. TTFFont.prototype.hasGlyphForCodePoint = function hasGlyphForCodePoint(codePoint) {
  53866. return !!this._cmapProcessor.lookup(codePoint);
  53867. };
  53868. /**
  53869. * Maps a single unicode code point to a Glyph object.
  53870. * Does not perform any advanced substitutions (there is no context to do so).
  53871. *
  53872. * @param {number} codePoint
  53873. * @return {Glyph}
  53874. */
  53875. TTFFont.prototype.glyphForCodePoint = function glyphForCodePoint(codePoint) {
  53876. return this.getGlyph(this._cmapProcessor.lookup(codePoint), [codePoint]);
  53877. };
  53878. /**
  53879. * Returns an array of Glyph objects for the given string.
  53880. * This is only a one-to-one mapping from characters to glyphs.
  53881. * For most uses, you should use font.layout (described below), which
  53882. * provides a much more advanced mapping supporting AAT and OpenType shaping.
  53883. *
  53884. * @param {string} string
  53885. * @return {Glyph[]}
  53886. */
  53887. TTFFont.prototype.glyphsForString = function glyphsForString(string) {
  53888. var glyphs = [];
  53889. var len = string.length;
  53890. var idx = 0;
  53891. var last = -1;
  53892. var state = -1;
  53893. while (idx <= len) {
  53894. var code = 0;
  53895. var nextState = 0;
  53896. if (idx < len) {
  53897. // Decode the next codepoint from UTF 16
  53898. code = string.charCodeAt(idx++);
  53899. if (0xd800 <= code && code <= 0xdbff && idx < len) {
  53900. var next = string.charCodeAt(idx);
  53901. if (0xdc00 <= next && next <= 0xdfff) {
  53902. idx++;
  53903. code = ((code & 0x3ff) << 10) + (next & 0x3ff) + 0x10000;
  53904. }
  53905. }
  53906. // Compute the next state: 1 if the next codepoint is a variation selector, 0 otherwise.
  53907. nextState = 0xfe00 <= code && code <= 0xfe0f || 0xe0100 <= code && code <= 0xe01ef ? 1 : 0;
  53908. } else {
  53909. idx++;
  53910. }
  53911. if (state === 0 && nextState === 1) {
  53912. // Variation selector following normal codepoint.
  53913. glyphs.push(this.getGlyph(this._cmapProcessor.lookup(last, code), [last, code]));
  53914. } else if (state === 0 && nextState === 0) {
  53915. // Normal codepoint following normal codepoint.
  53916. glyphs.push(this.glyphForCodePoint(last));
  53917. }
  53918. last = code;
  53919. state = nextState;
  53920. }
  53921. return glyphs;
  53922. };
  53923. /**
  53924. * Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string.
  53925. *
  53926. * @param {string} string
  53927. * @param {string[]} [userFeatures]
  53928. * @param {string} [script]
  53929. * @param {string} [language]
  53930. * @param {string} [direction]
  53931. * @return {GlyphRun}
  53932. */
  53933. TTFFont.prototype.layout = function layout(string, userFeatures, script, language, direction) {
  53934. return this._layoutEngine.layout(string, userFeatures, script, language, direction);
  53935. };
  53936. /**
  53937. * Returns an array of strings that map to the given glyph id.
  53938. * @param {number} gid - glyph id
  53939. */
  53940. TTFFont.prototype.stringsForGlyph = function stringsForGlyph(gid) {
  53941. return this._layoutEngine.stringsForGlyph(gid);
  53942. };
  53943. /**
  53944. * An array of all [OpenType feature tags](https://www.microsoft.com/typography/otspec/featuretags.htm)
  53945. * (or mapped AAT tags) supported by the font.
  53946. * The features parameter is an array of OpenType feature tags to be applied in addition to the default set.
  53947. * If this is an AAT font, the OpenType feature tags are mapped to AAT features.
  53948. *
  53949. * @type {string[]}
  53950. */
  53951. TTFFont.prototype.getAvailableFeatures = function getAvailableFeatures(script, language) {
  53952. return this._layoutEngine.getAvailableFeatures(script, language);
  53953. };
  53954. TTFFont.prototype._getBaseGlyph = function _getBaseGlyph(glyph) {
  53955. var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  53956. if (!this._glyphs[glyph]) {
  53957. if (this.directory.tables.glyf) {
  53958. this._glyphs[glyph] = new TTFGlyph(glyph, characters, this);
  53959. } else if (this.directory.tables['CFF '] || this.directory.tables.CFF2) {
  53960. this._glyphs[glyph] = new CFFGlyph(glyph, characters, this);
  53961. }
  53962. }
  53963. return this._glyphs[glyph] || null;
  53964. };
  53965. /**
  53966. * Returns a glyph object for the given glyph id.
  53967. * You can pass the array of code points this glyph represents for
  53968. * your use later, and it will be stored in the glyph object.
  53969. *
  53970. * @param {number} glyph
  53971. * @param {number[]} characters
  53972. * @return {Glyph}
  53973. */
  53974. TTFFont.prototype.getGlyph = function getGlyph(glyph) {
  53975. var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  53976. if (!this._glyphs[glyph]) {
  53977. if (this.directory.tables.sbix) {
  53978. this._glyphs[glyph] = new SBIXGlyph(glyph, characters, this);
  53979. } else if (this.directory.tables.COLR && this.directory.tables.CPAL) {
  53980. this._glyphs[glyph] = new COLRGlyph(glyph, characters, this);
  53981. } else {
  53982. this._getBaseGlyph(glyph, characters);
  53983. }
  53984. }
  53985. return this._glyphs[glyph] || null;
  53986. };
  53987. /**
  53988. * Returns a Subset for this font.
  53989. * @return {Subset}
  53990. */
  53991. TTFFont.prototype.createSubset = function createSubset() {
  53992. if (this.directory.tables['CFF ']) {
  53993. return new CFFSubset(this);
  53994. }
  53995. return new TTFSubset(this);
  53996. };
  53997. /**
  53998. * Returns an object describing the available variation axes
  53999. * that this font supports. Keys are setting tags, and values
  54000. * contain the axis name, range, and default value.
  54001. *
  54002. * @type {object}
  54003. */
  54004. /**
  54005. * Returns a new font with the given variation settings applied.
  54006. * Settings can either be an instance name, or an object containing
  54007. * variation tags as specified by the `variationAxes` property.
  54008. *
  54009. * @param {object} settings
  54010. * @return {TTFFont}
  54011. */
  54012. TTFFont.prototype.getVariation = function getVariation(settings) {
  54013. if (!(this.directory.tables.fvar && (this.directory.tables.gvar && this.directory.tables.glyf || this.directory.tables.CFF2))) {
  54014. throw new Error('Variations require a font with the fvar, gvar and glyf, or CFF2 tables.');
  54015. }
  54016. if (typeof settings === 'string') {
  54017. settings = this.namedVariations[settings];
  54018. }
  54019. if ((typeof settings === 'undefined' ? 'undefined' : _typeof(settings)) !== 'object') {
  54020. throw new Error('Variation settings must be either a variation name or settings object.');
  54021. }
  54022. // normalize the coordinates
  54023. var coords = this.fvar.axis.map(function (axis, i) {
  54024. var axisTag = axis.axisTag.trim();
  54025. if (axisTag in settings) {
  54026. return Math.max(axis.minValue, Math.min(axis.maxValue, settings[axisTag]));
  54027. } else {
  54028. return axis.defaultValue;
  54029. }
  54030. });
  54031. var stream = new r.DecodeStream(this.stream.buffer);
  54032. stream.pos = this._directoryPos;
  54033. var font = new TTFFont(stream, coords);
  54034. font._tables = this._tables;
  54035. return font;
  54036. };
  54037. // Standardized format plugin API
  54038. TTFFont.prototype.getFont = function getFont(name) {
  54039. return this.getVariation(name);
  54040. };
  54041. _createClass(TTFFont, [{
  54042. key: 'postscriptName',
  54043. get: function get() {
  54044. var name = this.name.records.postscriptName;
  54045. if (name) {
  54046. var lang = _Object$keys(name)[0];
  54047. return name[lang];
  54048. }
  54049. return null;
  54050. }
  54051. }, {
  54052. key: 'fullName',
  54053. get: function get() {
  54054. return this.getName('fullName');
  54055. }
  54056. /**
  54057. * The font's family name, e.g. "Helvetica"
  54058. * @type {string}
  54059. */
  54060. }, {
  54061. key: 'familyName',
  54062. get: function get() {
  54063. return this.getName('fontFamily');
  54064. }
  54065. /**
  54066. * The font's sub-family, e.g. "Bold".
  54067. * @type {string}
  54068. */
  54069. }, {
  54070. key: 'subfamilyName',
  54071. get: function get() {
  54072. return this.getName('fontSubfamily');
  54073. }
  54074. /**
  54075. * The font's copyright information
  54076. * @type {string}
  54077. */
  54078. }, {
  54079. key: 'copyright',
  54080. get: function get() {
  54081. return this.getName('copyright');
  54082. }
  54083. /**
  54084. * The font's version number
  54085. * @type {string}
  54086. */
  54087. }, {
  54088. key: 'version',
  54089. get: function get() {
  54090. return this.getName('version');
  54091. }
  54092. /**
  54093. * The font’s [ascender](https://en.wikipedia.org/wiki/Ascender_(typography))
  54094. * @type {number}
  54095. */
  54096. }, {
  54097. key: 'ascent',
  54098. get: function get() {
  54099. return this.hhea.ascent;
  54100. }
  54101. /**
  54102. * The font’s [descender](https://en.wikipedia.org/wiki/Descender)
  54103. * @type {number}
  54104. */
  54105. }, {
  54106. key: 'descent',
  54107. get: function get() {
  54108. return this.hhea.descent;
  54109. }
  54110. /**
  54111. * The amount of space that should be included between lines
  54112. * @type {number}
  54113. */
  54114. }, {
  54115. key: 'lineGap',
  54116. get: function get() {
  54117. return this.hhea.lineGap;
  54118. }
  54119. /**
  54120. * The offset from the normal underline position that should be used
  54121. * @type {number}
  54122. */
  54123. }, {
  54124. key: 'underlinePosition',
  54125. get: function get() {
  54126. return this.post.underlinePosition;
  54127. }
  54128. /**
  54129. * The weight of the underline that should be used
  54130. * @type {number}
  54131. */
  54132. }, {
  54133. key: 'underlineThickness',
  54134. get: function get() {
  54135. return this.post.underlineThickness;
  54136. }
  54137. /**
  54138. * If this is an italic font, the angle the cursor should be drawn at to match the font design
  54139. * @type {number}
  54140. */
  54141. }, {
  54142. key: 'italicAngle',
  54143. get: function get() {
  54144. return this.post.italicAngle;
  54145. }
  54146. /**
  54147. * The height of capital letters above the baseline.
  54148. * See [here](https://en.wikipedia.org/wiki/Cap_height) for more details.
  54149. * @type {number}
  54150. */
  54151. }, {
  54152. key: 'capHeight',
  54153. get: function get() {
  54154. var os2 = this['OS/2'];
  54155. return os2 ? os2.capHeight : this.ascent;
  54156. }
  54157. /**
  54158. * The height of lower case letters in the font.
  54159. * See [here](https://en.wikipedia.org/wiki/X-height) for more details.
  54160. * @type {number}
  54161. */
  54162. }, {
  54163. key: 'xHeight',
  54164. get: function get() {
  54165. var os2 = this['OS/2'];
  54166. return os2 ? os2.xHeight : 0;
  54167. }
  54168. /**
  54169. * The number of glyphs in the font.
  54170. * @type {number}
  54171. */
  54172. }, {
  54173. key: 'numGlyphs',
  54174. get: function get() {
  54175. return this.maxp.numGlyphs;
  54176. }
  54177. /**
  54178. * The size of the font’s internal coordinate grid
  54179. * @type {number}
  54180. */
  54181. }, {
  54182. key: 'unitsPerEm',
  54183. get: function get() {
  54184. return this.head.unitsPerEm;
  54185. }
  54186. /**
  54187. * The font’s bounding box, i.e. the box that encloses all glyphs in the font.
  54188. * @type {BBox}
  54189. */
  54190. }, {
  54191. key: 'bbox',
  54192. get: function get() {
  54193. return _Object$freeze(new BBox(this.head.xMin, this.head.yMin, this.head.xMax, this.head.yMax));
  54194. }
  54195. }, {
  54196. key: '_cmapProcessor',
  54197. get: function get() {
  54198. return new CmapProcessor(this.cmap);
  54199. }
  54200. /**
  54201. * An array of all of the unicode code points supported by the font.
  54202. * @type {number[]}
  54203. */
  54204. }, {
  54205. key: 'characterSet',
  54206. get: function get() {
  54207. return this._cmapProcessor.getCharacterSet();
  54208. }
  54209. }, {
  54210. key: '_layoutEngine',
  54211. get: function get() {
  54212. return new LayoutEngine(this);
  54213. }
  54214. }, {
  54215. key: 'availableFeatures',
  54216. get: function get() {
  54217. return this._layoutEngine.getAvailableFeatures();
  54218. }
  54219. }, {
  54220. key: 'variationAxes',
  54221. get: function get() {
  54222. var res = {};
  54223. if (!this.fvar) {
  54224. return res;
  54225. }
  54226. for (var _iterator = this.fvar.axis, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  54227. var _ref;
  54228. if (_isArray) {
  54229. if (_i >= _iterator.length) break;
  54230. _ref = _iterator[_i++];
  54231. } else {
  54232. _i = _iterator.next();
  54233. if (_i.done) break;
  54234. _ref = _i.value;
  54235. }
  54236. var axis = _ref;
  54237. res[axis.axisTag.trim()] = {
  54238. name: axis.name.en,
  54239. min: axis.minValue,
  54240. default: axis.defaultValue,
  54241. max: axis.maxValue
  54242. };
  54243. }
  54244. return res;
  54245. }
  54246. /**
  54247. * Returns an object describing the named variation instances
  54248. * that the font designer has specified. Keys are variation names
  54249. * and values are the variation settings for this instance.
  54250. *
  54251. * @type {object}
  54252. */
  54253. }, {
  54254. key: 'namedVariations',
  54255. get: function get() {
  54256. var res = {};
  54257. if (!this.fvar) {
  54258. return res;
  54259. }
  54260. for (var _iterator2 = this.fvar.instance, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  54261. var _ref2;
  54262. if (_isArray2) {
  54263. if (_i2 >= _iterator2.length) break;
  54264. _ref2 = _iterator2[_i2++];
  54265. } else {
  54266. _i2 = _iterator2.next();
  54267. if (_i2.done) break;
  54268. _ref2 = _i2.value;
  54269. }
  54270. var instance = _ref2;
  54271. var settings = {};
  54272. for (var i = 0; i < this.fvar.axis.length; i++) {
  54273. var axis = this.fvar.axis[i];
  54274. settings[axis.axisTag.trim()] = instance.coord[i];
  54275. }
  54276. res[instance.name.en] = settings;
  54277. }
  54278. return res;
  54279. }
  54280. }, {
  54281. key: '_variationProcessor',
  54282. get: function get() {
  54283. if (!this.fvar) {
  54284. return null;
  54285. }
  54286. var variationCoords = this.variationCoords;
  54287. // Ignore if no variation coords and not CFF2
  54288. if (!variationCoords && !this.CFF2) {
  54289. return null;
  54290. }
  54291. if (!variationCoords) {
  54292. variationCoords = this.fvar.axis.map(function (axis) {
  54293. return axis.defaultValue;
  54294. });
  54295. }
  54296. return new GlyphVariationProcessor(this, variationCoords);
  54297. }
  54298. }]);
  54299. return TTFFont;
  54300. }(), (_applyDecoratedDescriptor(_class.prototype, 'bbox', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'bbox'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_cmapProcessor', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_cmapProcessor'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'characterSet', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'characterSet'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_layoutEngine', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_layoutEngine'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'variationAxes', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'variationAxes'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'namedVariations', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, 'namedVariations'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, '_variationProcessor', [cache], _Object$getOwnPropertyDescriptor(_class.prototype, '_variationProcessor'), _class.prototype)), _class);
  54301. var WOFFDirectoryEntry = new r.Struct({
  54302. tag: new r.String(4),
  54303. offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
  54304. compLength: r.uint32,
  54305. length: r.uint32,
  54306. origChecksum: r.uint32
  54307. });
  54308. var WOFFDirectory = new r.Struct({
  54309. tag: new r.String(4), // should be 'wOFF'
  54310. flavor: r.uint32,
  54311. length: r.uint32,
  54312. numTables: r.uint16,
  54313. reserved: new r.Reserved(r.uint16),
  54314. totalSfntSize: r.uint32,
  54315. majorVersion: r.uint16,
  54316. minorVersion: r.uint16,
  54317. metaOffset: r.uint32,
  54318. metaLength: r.uint32,
  54319. metaOrigLength: r.uint32,
  54320. privOffset: r.uint32,
  54321. privLength: r.uint32,
  54322. tables: new r.Array(WOFFDirectoryEntry, 'numTables')
  54323. });
  54324. WOFFDirectory.process = function () {
  54325. var tables = {};
  54326. for (var _iterator = this.tables, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  54327. var _ref;
  54328. if (_isArray) {
  54329. if (_i >= _iterator.length) break;
  54330. _ref = _iterator[_i++];
  54331. } else {
  54332. _i = _iterator.next();
  54333. if (_i.done) break;
  54334. _ref = _i.value;
  54335. }
  54336. var table = _ref;
  54337. tables[table.tag] = table;
  54338. }
  54339. this.tables = tables;
  54340. };
  54341. var WOFFFont = function (_TTFFont) {
  54342. _inherits(WOFFFont, _TTFFont);
  54343. function WOFFFont() {
  54344. _classCallCheck(this, WOFFFont);
  54345. return _possibleConstructorReturn(this, _TTFFont.apply(this, arguments));
  54346. }
  54347. WOFFFont.probe = function probe(buffer) {
  54348. return buffer.toString('ascii', 0, 4) === 'wOFF';
  54349. };
  54350. WOFFFont.prototype._decodeDirectory = function _decodeDirectory() {
  54351. this.directory = WOFFDirectory.decode(this.stream, { _startOffset: 0 });
  54352. };
  54353. WOFFFont.prototype._getTableStream = function _getTableStream(tag) {
  54354. var table = this.directory.tables[tag];
  54355. if (table) {
  54356. this.stream.pos = table.offset;
  54357. if (table.compLength < table.length) {
  54358. this.stream.pos += 2; // skip deflate header
  54359. var outBuffer = new Buffer(table.length);
  54360. var buf = inflate(this.stream.readBuffer(table.compLength - 2), outBuffer);
  54361. return new r.DecodeStream(buf);
  54362. } else {
  54363. return this.stream;
  54364. }
  54365. }
  54366. return null;
  54367. };
  54368. return WOFFFont;
  54369. }(TTFFont);
  54370. /**
  54371. * Represents a TrueType glyph in the WOFF2 format, which compresses glyphs differently.
  54372. */
  54373. var WOFF2Glyph = function (_TTFGlyph) {
  54374. _inherits(WOFF2Glyph, _TTFGlyph);
  54375. function WOFF2Glyph() {
  54376. _classCallCheck(this, WOFF2Glyph);
  54377. return _possibleConstructorReturn(this, _TTFGlyph.apply(this, arguments));
  54378. }
  54379. WOFF2Glyph.prototype._decode = function _decode() {
  54380. // We have to decode in advance (in WOFF2Font), so just return the pre-decoded data.
  54381. return this._font._transformedGlyphs[this.id];
  54382. };
  54383. WOFF2Glyph.prototype._getCBox = function _getCBox() {
  54384. return this.path.bbox;
  54385. };
  54386. return WOFF2Glyph;
  54387. }(TTFGlyph);
  54388. var Base128 = {
  54389. decode: function decode(stream) {
  54390. var result = 0;
  54391. var iterable = [0, 1, 2, 3, 4];
  54392. for (var j = 0; j < iterable.length; j++) {
  54393. var i = iterable[j];
  54394. var code = stream.readUInt8();
  54395. // If any of the top seven bits are set then we're about to overflow.
  54396. if (result & 0xe0000000) {
  54397. throw new Error('Overflow');
  54398. }
  54399. result = result << 7 | code & 0x7f;
  54400. if ((code & 0x80) === 0) {
  54401. return result;
  54402. }
  54403. }
  54404. throw new Error('Bad base 128 number');
  54405. }
  54406. };
  54407. var knownTags = ['cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ', 'fpgm', 'glyf', 'loca', 'prep', 'CFF ', 'VORG', 'EBDT', 'EBLC', 'gasp', 'hdmx', 'kern', 'LTSH', 'PCLT', 'VDMX', 'vhea', 'vmtx', 'BASE', 'GDEF', 'GPOS', 'GSUB', 'EBSC', 'JSTF', 'MATH', 'CBDT', 'CBLC', 'COLR', 'CPAL', 'SVG ', 'sbix', 'acnt', 'avar', 'bdat', 'bloc', 'bsln', 'cvar', 'fdsc', 'feat', 'fmtx', 'fvar', 'gvar', 'hsty', 'just', 'lcar', 'mort', 'morx', 'opbd', 'prop', 'trak', 'Zapf', 'Silf', 'Glat', 'Gloc', 'Feat', 'Sill'];
  54408. var WOFF2DirectoryEntry = new r.Struct({
  54409. flags: r.uint8,
  54410. customTag: new r.Optional(new r.String(4), function (t) {
  54411. return (t.flags & 0x3f) === 0x3f;
  54412. }),
  54413. tag: function tag(t) {
  54414. return t.customTag || knownTags[t.flags & 0x3f];
  54415. }, // || (() => { throw new Error(`Bad tag: ${flags & 0x3f}`); })(); },
  54416. length: Base128,
  54417. transformVersion: function transformVersion(t) {
  54418. return t.flags >>> 6 & 0x03;
  54419. },
  54420. transformed: function transformed(t) {
  54421. return t.tag === 'glyf' || t.tag === 'loca' ? t.transformVersion === 0 : t.transformVersion !== 0;
  54422. },
  54423. transformLength: new r.Optional(Base128, function (t) {
  54424. return t.transformed;
  54425. })
  54426. });
  54427. var WOFF2Directory = new r.Struct({
  54428. tag: new r.String(4), // should be 'wOF2'
  54429. flavor: r.uint32,
  54430. length: r.uint32,
  54431. numTables: r.uint16,
  54432. reserved: new r.Reserved(r.uint16),
  54433. totalSfntSize: r.uint32,
  54434. totalCompressedSize: r.uint32,
  54435. majorVersion: r.uint16,
  54436. minorVersion: r.uint16,
  54437. metaOffset: r.uint32,
  54438. metaLength: r.uint32,
  54439. metaOrigLength: r.uint32,
  54440. privOffset: r.uint32,
  54441. privLength: r.uint32,
  54442. tables: new r.Array(WOFF2DirectoryEntry, 'numTables')
  54443. });
  54444. WOFF2Directory.process = function () {
  54445. var tables = {};
  54446. for (var i = 0; i < this.tables.length; i++) {
  54447. var table = this.tables[i];
  54448. tables[table.tag] = table;
  54449. }
  54450. return this.tables = tables;
  54451. };
  54452. /**
  54453. * Subclass of TTFFont that represents a TTF/OTF font compressed by WOFF2
  54454. * See spec here: http://www.w3.org/TR/WOFF2/
  54455. */
  54456. var WOFF2Font = function (_TTFFont) {
  54457. _inherits(WOFF2Font, _TTFFont);
  54458. function WOFF2Font() {
  54459. _classCallCheck(this, WOFF2Font);
  54460. return _possibleConstructorReturn(this, _TTFFont.apply(this, arguments));
  54461. }
  54462. WOFF2Font.probe = function probe(buffer) {
  54463. return buffer.toString('ascii', 0, 4) === 'wOF2';
  54464. };
  54465. WOFF2Font.prototype._decodeDirectory = function _decodeDirectory() {
  54466. this.directory = WOFF2Directory.decode(this.stream);
  54467. this._dataPos = this.stream.pos;
  54468. };
  54469. WOFF2Font.prototype._decompress = function _decompress() {
  54470. // decompress data and setup table offsets if we haven't already
  54471. if (!this._decompressed) {
  54472. this.stream.pos = this._dataPos;
  54473. var buffer = this.stream.readBuffer(this.directory.totalCompressedSize);
  54474. var decompressedSize = 0;
  54475. for (var tag in this.directory.tables) {
  54476. var entry = this.directory.tables[tag];
  54477. entry.offset = decompressedSize;
  54478. decompressedSize += entry.transformLength != null ? entry.transformLength : entry.length;
  54479. }
  54480. var decompressed = brotli(buffer, decompressedSize);
  54481. if (!decompressed) {
  54482. throw new Error('Error decoding compressed data in WOFF2');
  54483. }
  54484. this.stream = new r.DecodeStream(new Buffer(decompressed));
  54485. this._decompressed = true;
  54486. }
  54487. };
  54488. WOFF2Font.prototype._decodeTable = function _decodeTable(table) {
  54489. this._decompress();
  54490. return _TTFFont.prototype._decodeTable.call(this, table);
  54491. };
  54492. // Override this method to get a glyph and return our
  54493. // custom subclass if there is a glyf table.
  54494. WOFF2Font.prototype._getBaseGlyph = function _getBaseGlyph(glyph) {
  54495. var characters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  54496. if (!this._glyphs[glyph]) {
  54497. if (this.directory.tables.glyf && this.directory.tables.glyf.transformed) {
  54498. if (!this._transformedGlyphs) {
  54499. this._transformGlyfTable();
  54500. }
  54501. return this._glyphs[glyph] = new WOFF2Glyph(glyph, characters, this);
  54502. } else {
  54503. return _TTFFont.prototype._getBaseGlyph.call(this, glyph, characters);
  54504. }
  54505. }
  54506. };
  54507. WOFF2Font.prototype._transformGlyfTable = function _transformGlyfTable() {
  54508. this._decompress();
  54509. this.stream.pos = this.directory.tables.glyf.offset;
  54510. var table = GlyfTable.decode(this.stream);
  54511. var glyphs = [];
  54512. for (var index = 0; index < table.numGlyphs; index++) {
  54513. var glyph = {};
  54514. var nContours = table.nContours.readInt16BE();
  54515. glyph.numberOfContours = nContours;
  54516. if (nContours > 0) {
  54517. // simple glyph
  54518. var nPoints = [];
  54519. var totalPoints = 0;
  54520. for (var i = 0; i < nContours; i++) {
  54521. var _r = read255UInt16(table.nPoints);
  54522. totalPoints += _r;
  54523. nPoints.push(totalPoints);
  54524. }
  54525. glyph.points = decodeTriplet(table.flags, table.glyphs, totalPoints);
  54526. for (var _i = 0; _i < nContours; _i++) {
  54527. glyph.points[nPoints[_i] - 1].endContour = true;
  54528. }
  54529. var instructionSize = read255UInt16(table.glyphs);
  54530. } else if (nContours < 0) {
  54531. // composite glyph
  54532. var haveInstructions = TTFGlyph.prototype._decodeComposite.call({ _font: this }, glyph, table.composites);
  54533. if (haveInstructions) {
  54534. var instructionSize = read255UInt16(table.glyphs);
  54535. }
  54536. }
  54537. glyphs.push(glyph);
  54538. }
  54539. this._transformedGlyphs = glyphs;
  54540. };
  54541. return WOFF2Font;
  54542. }(TTFFont);
  54543. var Substream = function () {
  54544. function Substream(length) {
  54545. _classCallCheck(this, Substream);
  54546. this.length = length;
  54547. this._buf = new r.Buffer(length);
  54548. }
  54549. Substream.prototype.decode = function decode(stream, parent) {
  54550. return new r.DecodeStream(this._buf.decode(stream, parent));
  54551. };
  54552. return Substream;
  54553. }();
  54554. // This struct represents the entire glyf table
  54555. var GlyfTable = new r.Struct({
  54556. version: r.uint32,
  54557. numGlyphs: r.uint16,
  54558. indexFormat: r.uint16,
  54559. nContourStreamSize: r.uint32,
  54560. nPointsStreamSize: r.uint32,
  54561. flagStreamSize: r.uint32,
  54562. glyphStreamSize: r.uint32,
  54563. compositeStreamSize: r.uint32,
  54564. bboxStreamSize: r.uint32,
  54565. instructionStreamSize: r.uint32,
  54566. nContours: new Substream('nContourStreamSize'),
  54567. nPoints: new Substream('nPointsStreamSize'),
  54568. flags: new Substream('flagStreamSize'),
  54569. glyphs: new Substream('glyphStreamSize'),
  54570. composites: new Substream('compositeStreamSize'),
  54571. bboxes: new Substream('bboxStreamSize'),
  54572. instructions: new Substream('instructionStreamSize')
  54573. });
  54574. var WORD_CODE = 253;
  54575. var ONE_MORE_BYTE_CODE2 = 254;
  54576. var ONE_MORE_BYTE_CODE1 = 255;
  54577. var LOWEST_U_CODE = 253;
  54578. function read255UInt16(stream) {
  54579. var code = stream.readUInt8();
  54580. if (code === WORD_CODE) {
  54581. return stream.readUInt16BE();
  54582. }
  54583. if (code === ONE_MORE_BYTE_CODE1) {
  54584. return stream.readUInt8() + LOWEST_U_CODE;
  54585. }
  54586. if (code === ONE_MORE_BYTE_CODE2) {
  54587. return stream.readUInt8() + LOWEST_U_CODE * 2;
  54588. }
  54589. return code;
  54590. }
  54591. function withSign(flag, baseval) {
  54592. return flag & 1 ? baseval : -baseval;
  54593. }
  54594. function decodeTriplet(flags, glyphs, nPoints) {
  54595. var y = void 0;
  54596. var x = y = 0;
  54597. var res = [];
  54598. for (var i = 0; i < nPoints; i++) {
  54599. var dx = 0,
  54600. dy = 0;
  54601. var flag = flags.readUInt8();
  54602. var onCurve = !(flag >> 7);
  54603. flag &= 0x7f;
  54604. if (flag < 10) {
  54605. dx = 0;
  54606. dy = withSign(flag, ((flag & 14) << 7) + glyphs.readUInt8());
  54607. } else if (flag < 20) {
  54608. dx = withSign(flag, ((flag - 10 & 14) << 7) + glyphs.readUInt8());
  54609. dy = 0;
  54610. } else if (flag < 84) {
  54611. var b0 = flag - 20;
  54612. var b1 = glyphs.readUInt8();
  54613. dx = withSign(flag, 1 + (b0 & 0x30) + (b1 >> 4));
  54614. dy = withSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f));
  54615. } else if (flag < 120) {
  54616. var b0 = flag - 84;
  54617. dx = withSign(flag, 1 + (b0 / 12 << 8) + glyphs.readUInt8());
  54618. dy = withSign(flag >> 1, 1 + (b0 % 12 >> 2 << 8) + glyphs.readUInt8());
  54619. } else if (flag < 124) {
  54620. var b1 = glyphs.readUInt8();
  54621. var b2 = glyphs.readUInt8();
  54622. dx = withSign(flag, (b1 << 4) + (b2 >> 4));
  54623. dy = withSign(flag >> 1, ((b2 & 0x0f) << 8) + glyphs.readUInt8());
  54624. } else {
  54625. dx = withSign(flag, glyphs.readUInt16BE());
  54626. dy = withSign(flag >> 1, glyphs.readUInt16BE());
  54627. }
  54628. x += dx;
  54629. y += dy;
  54630. res.push(new Point(onCurve, false, x, y));
  54631. }
  54632. return res;
  54633. }
  54634. var TTCHeader = new r.VersionedStruct(r.uint32, {
  54635. 0x00010000: {
  54636. numFonts: r.uint32,
  54637. offsets: new r.Array(r.uint32, 'numFonts')
  54638. },
  54639. 0x00020000: {
  54640. numFonts: r.uint32,
  54641. offsets: new r.Array(r.uint32, 'numFonts'),
  54642. dsigTag: r.uint32,
  54643. dsigLength: r.uint32,
  54644. dsigOffset: r.uint32
  54645. }
  54646. });
  54647. var TrueTypeCollection = function () {
  54648. TrueTypeCollection.probe = function probe(buffer) {
  54649. return buffer.toString('ascii', 0, 4) === 'ttcf';
  54650. };
  54651. function TrueTypeCollection(stream) {
  54652. _classCallCheck(this, TrueTypeCollection);
  54653. this.stream = stream;
  54654. if (stream.readString(4) !== 'ttcf') {
  54655. throw new Error('Not a TrueType collection');
  54656. }
  54657. this.header = TTCHeader.decode(stream);
  54658. }
  54659. TrueTypeCollection.prototype.getFont = function getFont(name) {
  54660. for (var _iterator = this.header.offsets, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  54661. var _ref;
  54662. if (_isArray) {
  54663. if (_i >= _iterator.length) break;
  54664. _ref = _iterator[_i++];
  54665. } else {
  54666. _i = _iterator.next();
  54667. if (_i.done) break;
  54668. _ref = _i.value;
  54669. }
  54670. var offset = _ref;
  54671. var stream = new r.DecodeStream(this.stream.buffer);
  54672. stream.pos = offset;
  54673. var font = new TTFFont(stream);
  54674. if (font.postscriptName === name) {
  54675. return font;
  54676. }
  54677. }
  54678. return null;
  54679. };
  54680. _createClass(TrueTypeCollection, [{
  54681. key: 'fonts',
  54682. get: function get() {
  54683. var fonts = [];
  54684. for (var _iterator2 = this.header.offsets, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  54685. var _ref2;
  54686. if (_isArray2) {
  54687. if (_i2 >= _iterator2.length) break;
  54688. _ref2 = _iterator2[_i2++];
  54689. } else {
  54690. _i2 = _iterator2.next();
  54691. if (_i2.done) break;
  54692. _ref2 = _i2.value;
  54693. }
  54694. var offset = _ref2;
  54695. var stream = new r.DecodeStream(this.stream.buffer);
  54696. stream.pos = offset;
  54697. fonts.push(new TTFFont(stream));
  54698. }
  54699. return fonts;
  54700. }
  54701. }]);
  54702. return TrueTypeCollection;
  54703. }();
  54704. var DFontName = new r.String(r.uint8);
  54705. var DFontData = new r.Struct({
  54706. len: r.uint32,
  54707. buf: new r.Buffer('len')
  54708. });
  54709. var Ref = new r.Struct({
  54710. id: r.uint16,
  54711. nameOffset: r.int16,
  54712. attr: r.uint8,
  54713. dataOffset: r.uint24,
  54714. handle: r.uint32
  54715. });
  54716. var Type = new r.Struct({
  54717. name: new r.String(4),
  54718. maxTypeIndex: r.uint16,
  54719. refList: new r.Pointer(r.uint16, new r.Array(Ref, function (t) {
  54720. return t.maxTypeIndex + 1;
  54721. }), { type: 'parent' })
  54722. });
  54723. var TypeList = new r.Struct({
  54724. length: r.uint16,
  54725. types: new r.Array(Type, function (t) {
  54726. return t.length + 1;
  54727. })
  54728. });
  54729. var DFontMap = new r.Struct({
  54730. reserved: new r.Reserved(r.uint8, 24),
  54731. typeList: new r.Pointer(r.uint16, TypeList),
  54732. nameListOffset: new r.Pointer(r.uint16, 'void')
  54733. });
  54734. var DFontHeader = new r.Struct({
  54735. dataOffset: r.uint32,
  54736. map: new r.Pointer(r.uint32, DFontMap),
  54737. dataLength: r.uint32,
  54738. mapLength: r.uint32
  54739. });
  54740. var DFont = function () {
  54741. DFont.probe = function probe(buffer) {
  54742. var stream = new r.DecodeStream(buffer);
  54743. try {
  54744. var header = DFontHeader.decode(stream);
  54745. } catch (e) {
  54746. return false;
  54747. }
  54748. for (var _iterator = header.map.typeList.types, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _getIterator(_iterator);;) {
  54749. var _ref;
  54750. if (_isArray) {
  54751. if (_i >= _iterator.length) break;
  54752. _ref = _iterator[_i++];
  54753. } else {
  54754. _i = _iterator.next();
  54755. if (_i.done) break;
  54756. _ref = _i.value;
  54757. }
  54758. var type = _ref;
  54759. if (type.name === 'sfnt') {
  54760. return true;
  54761. }
  54762. }
  54763. return false;
  54764. };
  54765. function DFont(stream) {
  54766. _classCallCheck(this, DFont);
  54767. this.stream = stream;
  54768. this.header = DFontHeader.decode(this.stream);
  54769. for (var _iterator2 = this.header.map.typeList.types, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _getIterator(_iterator2);;) {
  54770. var _ref2;
  54771. if (_isArray2) {
  54772. if (_i2 >= _iterator2.length) break;
  54773. _ref2 = _iterator2[_i2++];
  54774. } else {
  54775. _i2 = _iterator2.next();
  54776. if (_i2.done) break;
  54777. _ref2 = _i2.value;
  54778. }
  54779. var type = _ref2;
  54780. for (var _iterator3 = type.refList, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _getIterator(_iterator3);;) {
  54781. var _ref3;
  54782. if (_isArray3) {
  54783. if (_i3 >= _iterator3.length) break;
  54784. _ref3 = _iterator3[_i3++];
  54785. } else {
  54786. _i3 = _iterator3.next();
  54787. if (_i3.done) break;
  54788. _ref3 = _i3.value;
  54789. }
  54790. var ref = _ref3;
  54791. if (ref.nameOffset >= 0) {
  54792. this.stream.pos = ref.nameOffset + this.header.map.nameListOffset;
  54793. ref.name = DFontName.decode(this.stream);
  54794. } else {
  54795. ref.name = null;
  54796. }
  54797. }
  54798. if (type.name === 'sfnt') {
  54799. this.sfnt = type;
  54800. }
  54801. }
  54802. }
  54803. DFont.prototype.getFont = function getFont(name) {
  54804. if (!this.sfnt) {
  54805. return null;
  54806. }
  54807. for (var _iterator4 = this.sfnt.refList, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _getIterator(_iterator4);;) {
  54808. var _ref4;
  54809. if (_isArray4) {
  54810. if (_i4 >= _iterator4.length) break;
  54811. _ref4 = _iterator4[_i4++];
  54812. } else {
  54813. _i4 = _iterator4.next();
  54814. if (_i4.done) break;
  54815. _ref4 = _i4.value;
  54816. }
  54817. var ref = _ref4;
  54818. var pos = this.header.dataOffset + ref.dataOffset + 4;
  54819. var stream = new r.DecodeStream(this.stream.buffer.slice(pos));
  54820. var font = new TTFFont(stream);
  54821. if (font.postscriptName === name) {
  54822. return font;
  54823. }
  54824. }
  54825. return null;
  54826. };
  54827. _createClass(DFont, [{
  54828. key: 'fonts',
  54829. get: function get() {
  54830. var fonts = [];
  54831. for (var _iterator5 = this.sfnt.refList, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _getIterator(_iterator5);;) {
  54832. var _ref5;
  54833. if (_isArray5) {
  54834. if (_i5 >= _iterator5.length) break;
  54835. _ref5 = _iterator5[_i5++];
  54836. } else {
  54837. _i5 = _iterator5.next();
  54838. if (_i5.done) break;
  54839. _ref5 = _i5.value;
  54840. }
  54841. var ref = _ref5;
  54842. var pos = this.header.dataOffset + ref.dataOffset + 4;
  54843. var stream = new r.DecodeStream(this.stream.buffer.slice(pos));
  54844. fonts.push(new TTFFont(stream));
  54845. }
  54846. return fonts;
  54847. }
  54848. }]);
  54849. return DFont;
  54850. }();
  54851. // Register font formats
  54852. fontkit.registerFormat(TTFFont);
  54853. fontkit.registerFormat(WOFFFont);
  54854. fontkit.registerFormat(WOFF2Font);
  54855. fontkit.registerFormat(TrueTypeCollection);
  54856. fontkit.registerFormat(DFont);
  54857. module.exports = fontkit;
  54858. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer, __webpack_require__(36)))
  54859. /***/ }),
  54860. /* 84 */
  54861. /***/ (function(module, exports, __webpack_require__) {
  54862. // Generated by CoffeeScript 1.7.1
  54863. (function() {
  54864. var key, val, _ref, _ref1;
  54865. exports.EncodeStream = __webpack_require__(85);
  54866. exports.DecodeStream = __webpack_require__(86);
  54867. exports.Array = __webpack_require__(108);
  54868. exports.LazyArray = __webpack_require__(111);
  54869. exports.Bitfield = __webpack_require__(112);
  54870. exports.Boolean = __webpack_require__(113);
  54871. exports.Buffer = __webpack_require__(114);
  54872. exports.Enum = __webpack_require__(115);
  54873. exports.Optional = __webpack_require__(116);
  54874. exports.Reserved = __webpack_require__(117);
  54875. exports.String = __webpack_require__(118);
  54876. exports.Struct = __webpack_require__(119);
  54877. exports.VersionedStruct = __webpack_require__(120);
  54878. _ref = __webpack_require__(109);
  54879. for (key in _ref) {
  54880. val = _ref[key];
  54881. exports[key] = val;
  54882. }
  54883. _ref1 = __webpack_require__(121);
  54884. for (key in _ref1) {
  54885. val = _ref1[key];
  54886. exports[key] = val;
  54887. }
  54888. }).call(this);
  54889. /***/ }),
  54890. /* 85 */
  54891. /***/ (function(module, exports, __webpack_require__) {
  54892. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
  54893. (function() {
  54894. var DecodeStream, EncodeStream, iconv, stream,
  54895. __hasProp = {}.hasOwnProperty,
  54896. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
  54897. stream = __webpack_require__(31);
  54898. DecodeStream = __webpack_require__(86);
  54899. try {
  54900. iconv = __webpack_require__(87);
  54901. } catch (_error) {}
  54902. EncodeStream = (function(_super) {
  54903. var key;
  54904. __extends(EncodeStream, _super);
  54905. function EncodeStream(bufferSize) {
  54906. if (bufferSize == null) {
  54907. bufferSize = 65536;
  54908. }
  54909. EncodeStream.__super__.constructor.apply(this, arguments);
  54910. this.buffer = new Buffer(bufferSize);
  54911. this.bufferOffset = 0;
  54912. this.pos = 0;
  54913. }
  54914. for (key in Buffer.prototype) {
  54915. if (key.slice(0, 5) === 'write') {
  54916. (function(key) {
  54917. var bytes;
  54918. bytes = +DecodeStream.TYPES[key.replace(/write|[BL]E/g, '')];
  54919. return EncodeStream.prototype[key] = function(value) {
  54920. this.ensure(bytes);
  54921. this.buffer[key](value, this.bufferOffset);
  54922. this.bufferOffset += bytes;
  54923. return this.pos += bytes;
  54924. };
  54925. })(key);
  54926. }
  54927. }
  54928. EncodeStream.prototype._read = function() {};
  54929. EncodeStream.prototype.ensure = function(bytes) {
  54930. if (this.bufferOffset + bytes > this.buffer.length) {
  54931. return this.flush();
  54932. }
  54933. };
  54934. EncodeStream.prototype.flush = function() {
  54935. if (this.bufferOffset > 0) {
  54936. this.push(new Buffer(this.buffer.slice(0, this.bufferOffset)));
  54937. return this.bufferOffset = 0;
  54938. }
  54939. };
  54940. EncodeStream.prototype.writeBuffer = function(buffer) {
  54941. this.flush();
  54942. this.push(buffer);
  54943. return this.pos += buffer.length;
  54944. };
  54945. EncodeStream.prototype.writeString = function(string, encoding) {
  54946. var buf, byte, i, _i, _ref;
  54947. if (encoding == null) {
  54948. encoding = 'ascii';
  54949. }
  54950. switch (encoding) {
  54951. case 'utf16le':
  54952. case 'ucs2':
  54953. case 'utf8':
  54954. case 'ascii':
  54955. return this.writeBuffer(new Buffer(string, encoding));
  54956. case 'utf16be':
  54957. buf = new Buffer(string, 'utf16le');
  54958. for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) {
  54959. byte = buf[i];
  54960. buf[i] = buf[i + 1];
  54961. buf[i + 1] = byte;
  54962. }
  54963. return this.writeBuffer(buf);
  54964. default:
  54965. if (iconv) {
  54966. return this.writeBuffer(iconv.encode(string, encoding));
  54967. } else {
  54968. throw new Error('Install iconv-lite to enable additional string encodings.');
  54969. }
  54970. }
  54971. };
  54972. EncodeStream.prototype.writeUInt24BE = function(val) {
  54973. this.ensure(3);
  54974. this.buffer[this.bufferOffset++] = val >>> 16 & 0xff;
  54975. this.buffer[this.bufferOffset++] = val >>> 8 & 0xff;
  54976. this.buffer[this.bufferOffset++] = val & 0xff;
  54977. return this.pos += 3;
  54978. };
  54979. EncodeStream.prototype.writeUInt24LE = function(val) {
  54980. this.ensure(3);
  54981. this.buffer[this.bufferOffset++] = val & 0xff;
  54982. this.buffer[this.bufferOffset++] = val >>> 8 & 0xff;
  54983. this.buffer[this.bufferOffset++] = val >>> 16 & 0xff;
  54984. return this.pos += 3;
  54985. };
  54986. EncodeStream.prototype.writeInt24BE = function(val) {
  54987. if (val >= 0) {
  54988. return this.writeUInt24BE(val);
  54989. } else {
  54990. return this.writeUInt24BE(val + 0xffffff + 1);
  54991. }
  54992. };
  54993. EncodeStream.prototype.writeInt24LE = function(val) {
  54994. if (val >= 0) {
  54995. return this.writeUInt24LE(val);
  54996. } else {
  54997. return this.writeUInt24LE(val + 0xffffff + 1);
  54998. }
  54999. };
  55000. EncodeStream.prototype.fill = function(val, length) {
  55001. var buf;
  55002. if (length < this.buffer.length) {
  55003. this.ensure(length);
  55004. this.buffer.fill(val, this.bufferOffset, this.bufferOffset + length);
  55005. this.bufferOffset += length;
  55006. return this.pos += length;
  55007. } else {
  55008. buf = new Buffer(length);
  55009. buf.fill(val);
  55010. return this.writeBuffer(buf);
  55011. }
  55012. };
  55013. EncodeStream.prototype.end = function() {
  55014. this.flush();
  55015. return this.push(null);
  55016. };
  55017. return EncodeStream;
  55018. })(stream.Readable);
  55019. module.exports = EncodeStream;
  55020. }).call(this);
  55021. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  55022. /***/ }),
  55023. /* 86 */
  55024. /***/ (function(module, exports, __webpack_require__) {
  55025. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
  55026. (function() {
  55027. var DecodeStream, iconv;
  55028. try {
  55029. iconv = __webpack_require__(87);
  55030. } catch (_error) {}
  55031. DecodeStream = (function() {
  55032. var key;
  55033. function DecodeStream(buffer) {
  55034. this.buffer = buffer;
  55035. this.pos = 0;
  55036. this.length = this.buffer.length;
  55037. }
  55038. DecodeStream.TYPES = {
  55039. UInt8: 1,
  55040. UInt16: 2,
  55041. UInt24: 3,
  55042. UInt32: 4,
  55043. Int8: 1,
  55044. Int16: 2,
  55045. Int24: 3,
  55046. Int32: 4,
  55047. Float: 4,
  55048. Double: 8
  55049. };
  55050. for (key in Buffer.prototype) {
  55051. if (key.slice(0, 4) === 'read') {
  55052. (function(key) {
  55053. var bytes;
  55054. bytes = DecodeStream.TYPES[key.replace(/read|[BL]E/g, '')];
  55055. return DecodeStream.prototype[key] = function() {
  55056. var ret;
  55057. ret = this.buffer[key](this.pos);
  55058. this.pos += bytes;
  55059. return ret;
  55060. };
  55061. })(key);
  55062. }
  55063. }
  55064. DecodeStream.prototype.readString = function(length, encoding) {
  55065. var buf, byte, i, _i, _ref;
  55066. if (encoding == null) {
  55067. encoding = 'ascii';
  55068. }
  55069. switch (encoding) {
  55070. case 'utf16le':
  55071. case 'ucs2':
  55072. case 'utf8':
  55073. case 'ascii':
  55074. return this.buffer.toString(encoding, this.pos, this.pos += length);
  55075. case 'utf16be':
  55076. buf = new Buffer(this.readBuffer(length));
  55077. for (i = _i = 0, _ref = buf.length - 1; _i < _ref; i = _i += 2) {
  55078. byte = buf[i];
  55079. buf[i] = buf[i + 1];
  55080. buf[i + 1] = byte;
  55081. }
  55082. return buf.toString('utf16le');
  55083. default:
  55084. buf = this.readBuffer(length);
  55085. if (iconv) {
  55086. try {
  55087. return iconv.decode(buf, encoding);
  55088. } catch (_error) {}
  55089. }
  55090. return buf;
  55091. }
  55092. };
  55093. DecodeStream.prototype.readBuffer = function(length) {
  55094. return this.buffer.slice(this.pos, this.pos += length);
  55095. };
  55096. DecodeStream.prototype.readUInt24BE = function() {
  55097. return (this.readUInt16BE() << 8) + this.readUInt8();
  55098. };
  55099. DecodeStream.prototype.readUInt24LE = function() {
  55100. return this.readUInt16LE() + (this.readUInt8() << 16);
  55101. };
  55102. DecodeStream.prototype.readInt24BE = function() {
  55103. return (this.readInt16BE() << 8) + this.readUInt8();
  55104. };
  55105. DecodeStream.prototype.readInt24LE = function() {
  55106. return this.readUInt16LE() + (this.readInt8() << 16);
  55107. };
  55108. return DecodeStream;
  55109. })();
  55110. module.exports = DecodeStream;
  55111. }).call(this);
  55112. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  55113. /***/ }),
  55114. /* 87 */
  55115. /***/ (function(module, exports, __webpack_require__) {
  55116. /* WEBPACK VAR INJECTION */(function(process) {"use strict";
  55117. // Some environments don't have global Buffer (e.g. React Native).
  55118. // Solution would be installing npm modules "buffer" and "stream" explicitly.
  55119. var Buffer = __webpack_require__(2).Buffer;
  55120. var bomHandling = __webpack_require__(88),
  55121. iconv = module.exports;
  55122. // All codecs and aliases are kept here, keyed by encoding name/alias.
  55123. // They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.
  55124. iconv.encodings = null;
  55125. // Characters emitted in case of error.
  55126. iconv.defaultCharUnicode = '�';
  55127. iconv.defaultCharSingleByte = '?';
  55128. // Public API.
  55129. iconv.encode = function encode(str, encoding, options) {
  55130. str = "" + (str || ""); // Ensure string.
  55131. var encoder = iconv.getEncoder(encoding, options);
  55132. var res = encoder.write(str);
  55133. var trail = encoder.end();
  55134. return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;
  55135. }
  55136. iconv.decode = function decode(buf, encoding, options) {
  55137. if (typeof buf === 'string') {
  55138. if (!iconv.skipDecodeWarning) {
  55139. console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');
  55140. iconv.skipDecodeWarning = true;
  55141. }
  55142. buf = new Buffer("" + (buf || ""), "binary"); // Ensure buffer.
  55143. }
  55144. var decoder = iconv.getDecoder(encoding, options);
  55145. var res = decoder.write(buf);
  55146. var trail = decoder.end();
  55147. return trail ? (res + trail) : res;
  55148. }
  55149. iconv.encodingExists = function encodingExists(enc) {
  55150. try {
  55151. iconv.getCodec(enc);
  55152. return true;
  55153. } catch (e) {
  55154. return false;
  55155. }
  55156. }
  55157. // Legacy aliases to convert functions
  55158. iconv.toEncoding = iconv.encode;
  55159. iconv.fromEncoding = iconv.decode;
  55160. // Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.
  55161. iconv._codecDataCache = {};
  55162. iconv.getCodec = function getCodec(encoding) {
  55163. if (!iconv.encodings)
  55164. iconv.encodings = __webpack_require__(89); // Lazy load all encoding definitions.
  55165. // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.
  55166. var enc = (''+encoding).toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, "");
  55167. // Traverse iconv.encodings to find actual codec.
  55168. var codecOptions = {};
  55169. while (true) {
  55170. var codec = iconv._codecDataCache[enc];
  55171. if (codec)
  55172. return codec;
  55173. var codecDef = iconv.encodings[enc];
  55174. switch (typeof codecDef) {
  55175. case "string": // Direct alias to other encoding.
  55176. enc = codecDef;
  55177. break;
  55178. case "object": // Alias with options. Can be layered.
  55179. for (var key in codecDef)
  55180. codecOptions[key] = codecDef[key];
  55181. if (!codecOptions.encodingName)
  55182. codecOptions.encodingName = enc;
  55183. enc = codecDef.type;
  55184. break;
  55185. case "function": // Codec itself.
  55186. if (!codecOptions.encodingName)
  55187. codecOptions.encodingName = enc;
  55188. // The codec function must load all tables and return object with .encoder and .decoder methods.
  55189. // It'll be called only once (for each different options object).
  55190. codec = new codecDef(codecOptions, iconv);
  55191. iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.
  55192. return codec;
  55193. default:
  55194. throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
  55195. }
  55196. }
  55197. }
  55198. iconv.getEncoder = function getEncoder(encoding, options) {
  55199. var codec = iconv.getCodec(encoding),
  55200. encoder = new codec.encoder(options, codec);
  55201. if (codec.bomAware && options && options.addBOM)
  55202. encoder = new bomHandling.PrependBOM(encoder, options);
  55203. return encoder;
  55204. }
  55205. iconv.getDecoder = function getDecoder(encoding, options) {
  55206. var codec = iconv.getCodec(encoding),
  55207. decoder = new codec.decoder(options, codec);
  55208. if (codec.bomAware && !(options && options.stripBOM === false))
  55209. decoder = new bomHandling.StripBOM(decoder, options);
  55210. return decoder;
  55211. }
  55212. // Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.
  55213. var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;
  55214. if (nodeVer) {
  55215. // Load streaming support in Node v0.10+
  55216. var nodeVerArr = nodeVer.split(".").map(Number);
  55217. if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {
  55218. __webpack_require__(106)(iconv);
  55219. }
  55220. // Load Node primitive extensions.
  55221. __webpack_require__(107)(iconv);
  55222. }
  55223. if (false) {
  55224. console.error("iconv-lite warning: javascript files are loaded not with utf-8 encoding. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.");
  55225. }
  55226. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36)))
  55227. /***/ }),
  55228. /* 88 */
  55229. /***/ (function(module, exports) {
  55230. "use strict";
  55231. var BOMChar = '\uFEFF';
  55232. exports.PrependBOM = PrependBOMWrapper
  55233. function PrependBOMWrapper(encoder, options) {
  55234. this.encoder = encoder;
  55235. this.addBOM = true;
  55236. }
  55237. PrependBOMWrapper.prototype.write = function(str) {
  55238. if (this.addBOM) {
  55239. str = BOMChar + str;
  55240. this.addBOM = false;
  55241. }
  55242. return this.encoder.write(str);
  55243. }
  55244. PrependBOMWrapper.prototype.end = function() {
  55245. return this.encoder.end();
  55246. }
  55247. //------------------------------------------------------------------------------
  55248. exports.StripBOM = StripBOMWrapper;
  55249. function StripBOMWrapper(decoder, options) {
  55250. this.decoder = decoder;
  55251. this.pass = false;
  55252. this.options = options || {};
  55253. }
  55254. StripBOMWrapper.prototype.write = function(buf) {
  55255. var res = this.decoder.write(buf);
  55256. if (this.pass || !res)
  55257. return res;
  55258. if (res[0] === BOMChar) {
  55259. res = res.slice(1);
  55260. if (typeof this.options.stripBOM === 'function')
  55261. this.options.stripBOM();
  55262. }
  55263. this.pass = true;
  55264. return res;
  55265. }
  55266. StripBOMWrapper.prototype.end = function() {
  55267. return this.decoder.end();
  55268. }
  55269. /***/ }),
  55270. /* 89 */
  55271. /***/ (function(module, exports, __webpack_require__) {
  55272. "use strict";
  55273. // Update this array if you add/rename/remove files in this directory.
  55274. // We support Browserify by skipping automatic module discovery and requiring modules directly.
  55275. var modules = [
  55276. __webpack_require__(90),
  55277. __webpack_require__(91),
  55278. __webpack_require__(92),
  55279. __webpack_require__(93),
  55280. __webpack_require__(94),
  55281. __webpack_require__(95),
  55282. __webpack_require__(96),
  55283. __webpack_require__(97),
  55284. ];
  55285. // Put all encoding/alias/codec definitions to single object and export it.
  55286. for (var i = 0; i < modules.length; i++) {
  55287. var module = modules[i];
  55288. for (var enc in module)
  55289. if (Object.prototype.hasOwnProperty.call(module, enc))
  55290. exports[enc] = module[enc];
  55291. }
  55292. /***/ }),
  55293. /* 90 */
  55294. /***/ (function(module, exports, __webpack_require__) {
  55295. "use strict";
  55296. var Buffer = __webpack_require__(2).Buffer;
  55297. // Export Node.js internal encodings.
  55298. module.exports = {
  55299. // Encodings
  55300. utf8: { type: "_internal", bomAware: true},
  55301. cesu8: { type: "_internal", bomAware: true},
  55302. unicode11utf8: "utf8",
  55303. ucs2: { type: "_internal", bomAware: true},
  55304. utf16le: "ucs2",
  55305. binary: { type: "_internal" },
  55306. iso88591: "binary",
  55307. base64: { type: "_internal" },
  55308. hex: { type: "_internal" },
  55309. // Codec.
  55310. _internal: InternalCodec,
  55311. };
  55312. //------------------------------------------------------------------------------
  55313. function InternalCodec(codecOptions, iconv) {
  55314. this.enc = codecOptions.encodingName;
  55315. this.bomAware = codecOptions.bomAware;
  55316. if (this.enc === "base64")
  55317. this.encoder = InternalEncoderBase64;
  55318. else if (this.enc === "cesu8") {
  55319. this.enc = "utf8"; // Use utf8 for decoding.
  55320. this.encoder = InternalEncoderCesu8;
  55321. // Add decoder for versions of Node not supporting CESU-8
  55322. if (new Buffer('eda0bdedb2a9', 'hex').toString() !== '💩') {
  55323. this.decoder = InternalDecoderCesu8;
  55324. this.defaultCharUnicode = iconv.defaultCharUnicode;
  55325. }
  55326. }
  55327. }
  55328. InternalCodec.prototype.encoder = InternalEncoder;
  55329. InternalCodec.prototype.decoder = InternalDecoder;
  55330. //------------------------------------------------------------------------------
  55331. // We use node.js internal decoder. Its signature is the same as ours.
  55332. var StringDecoder = __webpack_require__(49).StringDecoder;
  55333. if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.
  55334. StringDecoder.prototype.end = function() {};
  55335. function InternalDecoder(options, codec) {
  55336. StringDecoder.call(this, codec.enc);
  55337. }
  55338. InternalDecoder.prototype = StringDecoder.prototype;
  55339. //------------------------------------------------------------------------------
  55340. // Encoder is mostly trivial
  55341. function InternalEncoder(options, codec) {
  55342. this.enc = codec.enc;
  55343. }
  55344. InternalEncoder.prototype.write = function(str) {
  55345. return new Buffer(str, this.enc);
  55346. }
  55347. InternalEncoder.prototype.end = function() {
  55348. }
  55349. //------------------------------------------------------------------------------
  55350. // Except base64 encoder, which must keep its state.
  55351. function InternalEncoderBase64(options, codec) {
  55352. this.prevStr = '';
  55353. }
  55354. InternalEncoderBase64.prototype.write = function(str) {
  55355. str = this.prevStr + str;
  55356. var completeQuads = str.length - (str.length % 4);
  55357. this.prevStr = str.slice(completeQuads);
  55358. str = str.slice(0, completeQuads);
  55359. return new Buffer(str, "base64");
  55360. }
  55361. InternalEncoderBase64.prototype.end = function() {
  55362. return new Buffer(this.prevStr, "base64");
  55363. }
  55364. //------------------------------------------------------------------------------
  55365. // CESU-8 encoder is also special.
  55366. function InternalEncoderCesu8(options, codec) {
  55367. }
  55368. InternalEncoderCesu8.prototype.write = function(str) {
  55369. var buf = new Buffer(str.length * 3), bufIdx = 0;
  55370. for (var i = 0; i < str.length; i++) {
  55371. var charCode = str.charCodeAt(i);
  55372. // Naive implementation, but it works because CESU-8 is especially easy
  55373. // to convert from UTF-16 (which all JS strings are encoded in).
  55374. if (charCode < 0x80)
  55375. buf[bufIdx++] = charCode;
  55376. else if (charCode < 0x800) {
  55377. buf[bufIdx++] = 0xC0 + (charCode >>> 6);
  55378. buf[bufIdx++] = 0x80 + (charCode & 0x3f);
  55379. }
  55380. else { // charCode will always be < 0x10000 in javascript.
  55381. buf[bufIdx++] = 0xE0 + (charCode >>> 12);
  55382. buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);
  55383. buf[bufIdx++] = 0x80 + (charCode & 0x3f);
  55384. }
  55385. }
  55386. return buf.slice(0, bufIdx);
  55387. }
  55388. InternalEncoderCesu8.prototype.end = function() {
  55389. }
  55390. //------------------------------------------------------------------------------
  55391. // CESU-8 decoder is not implemented in Node v4.0+
  55392. function InternalDecoderCesu8(options, codec) {
  55393. this.acc = 0;
  55394. this.contBytes = 0;
  55395. this.accBytes = 0;
  55396. this.defaultCharUnicode = codec.defaultCharUnicode;
  55397. }
  55398. InternalDecoderCesu8.prototype.write = function(buf) {
  55399. var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes,
  55400. res = '';
  55401. for (var i = 0; i < buf.length; i++) {
  55402. var curByte = buf[i];
  55403. if ((curByte & 0xC0) !== 0x80) { // Leading byte
  55404. if (contBytes > 0) { // Previous code is invalid
  55405. res += this.defaultCharUnicode;
  55406. contBytes = 0;
  55407. }
  55408. if (curByte < 0x80) { // Single-byte code
  55409. res += String.fromCharCode(curByte);
  55410. } else if (curByte < 0xE0) { // Two-byte code
  55411. acc = curByte & 0x1F;
  55412. contBytes = 1; accBytes = 1;
  55413. } else if (curByte < 0xF0) { // Three-byte code
  55414. acc = curByte & 0x0F;
  55415. contBytes = 2; accBytes = 1;
  55416. } else { // Four or more are not supported for CESU-8.
  55417. res += this.defaultCharUnicode;
  55418. }
  55419. } else { // Continuation byte
  55420. if (contBytes > 0) { // We're waiting for it.
  55421. acc = (acc << 6) | (curByte & 0x3f);
  55422. contBytes--; accBytes++;
  55423. if (contBytes === 0) {
  55424. // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)
  55425. if (accBytes === 2 && acc < 0x80 && acc > 0)
  55426. res += this.defaultCharUnicode;
  55427. else if (accBytes === 3 && acc < 0x800)
  55428. res += this.defaultCharUnicode;
  55429. else
  55430. // Actually add character.
  55431. res += String.fromCharCode(acc);
  55432. }
  55433. } else { // Unexpected continuation byte
  55434. res += this.defaultCharUnicode;
  55435. }
  55436. }
  55437. }
  55438. this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;
  55439. return res;
  55440. }
  55441. InternalDecoderCesu8.prototype.end = function() {
  55442. var res = 0;
  55443. if (this.contBytes > 0)
  55444. res += this.defaultCharUnicode;
  55445. return res;
  55446. }
  55447. /***/ }),
  55448. /* 91 */
  55449. /***/ (function(module, exports, __webpack_require__) {
  55450. "use strict";
  55451. var Buffer = __webpack_require__(2).Buffer;
  55452. // Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js
  55453. // == UTF16-BE codec. ==========================================================
  55454. exports.utf16be = Utf16BECodec;
  55455. function Utf16BECodec() {
  55456. }
  55457. Utf16BECodec.prototype.encoder = Utf16BEEncoder;
  55458. Utf16BECodec.prototype.decoder = Utf16BEDecoder;
  55459. Utf16BECodec.prototype.bomAware = true;
  55460. // -- Encoding
  55461. function Utf16BEEncoder() {
  55462. }
  55463. Utf16BEEncoder.prototype.write = function(str) {
  55464. var buf = new Buffer(str, 'ucs2');
  55465. for (var i = 0; i < buf.length; i += 2) {
  55466. var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;
  55467. }
  55468. return buf;
  55469. }
  55470. Utf16BEEncoder.prototype.end = function() {
  55471. }
  55472. // -- Decoding
  55473. function Utf16BEDecoder() {
  55474. this.overflowByte = -1;
  55475. }
  55476. Utf16BEDecoder.prototype.write = function(buf) {
  55477. if (buf.length == 0)
  55478. return '';
  55479. var buf2 = new Buffer(buf.length + 1),
  55480. i = 0, j = 0;
  55481. if (this.overflowByte !== -1) {
  55482. buf2[0] = buf[0];
  55483. buf2[1] = this.overflowByte;
  55484. i = 1; j = 2;
  55485. }
  55486. for (; i < buf.length-1; i += 2, j+= 2) {
  55487. buf2[j] = buf[i+1];
  55488. buf2[j+1] = buf[i];
  55489. }
  55490. this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;
  55491. return buf2.slice(0, j).toString('ucs2');
  55492. }
  55493. Utf16BEDecoder.prototype.end = function() {
  55494. }
  55495. // == UTF-16 codec =============================================================
  55496. // Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.
  55497. // Defaults to UTF-16LE, as it's prevalent and default in Node.
  55498. // http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le
  55499. // Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});
  55500. // Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).
  55501. exports.utf16 = Utf16Codec;
  55502. function Utf16Codec(codecOptions, iconv) {
  55503. this.iconv = iconv;
  55504. }
  55505. Utf16Codec.prototype.encoder = Utf16Encoder;
  55506. Utf16Codec.prototype.decoder = Utf16Decoder;
  55507. // -- Encoding (pass-through)
  55508. function Utf16Encoder(options, codec) {
  55509. options = options || {};
  55510. if (options.addBOM === undefined)
  55511. options.addBOM = true;
  55512. this.encoder = codec.iconv.getEncoder('utf-16le', options);
  55513. }
  55514. Utf16Encoder.prototype.write = function(str) {
  55515. return this.encoder.write(str);
  55516. }
  55517. Utf16Encoder.prototype.end = function() {
  55518. return this.encoder.end();
  55519. }
  55520. // -- Decoding
  55521. function Utf16Decoder(options, codec) {
  55522. this.decoder = null;
  55523. this.initialBytes = [];
  55524. this.initialBytesLen = 0;
  55525. this.options = options || {};
  55526. this.iconv = codec.iconv;
  55527. }
  55528. Utf16Decoder.prototype.write = function(buf) {
  55529. if (!this.decoder) {
  55530. // Codec is not chosen yet. Accumulate initial bytes.
  55531. this.initialBytes.push(buf);
  55532. this.initialBytesLen += buf.length;
  55533. if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)
  55534. return '';
  55535. // We have enough bytes -> detect endianness.
  55536. var buf = Buffer.concat(this.initialBytes),
  55537. encoding = detectEncoding(buf, this.options.defaultEncoding);
  55538. this.decoder = this.iconv.getDecoder(encoding, this.options);
  55539. this.initialBytes.length = this.initialBytesLen = 0;
  55540. }
  55541. return this.decoder.write(buf);
  55542. }
  55543. Utf16Decoder.prototype.end = function() {
  55544. if (!this.decoder) {
  55545. var buf = Buffer.concat(this.initialBytes),
  55546. encoding = detectEncoding(buf, this.options.defaultEncoding);
  55547. this.decoder = this.iconv.getDecoder(encoding, this.options);
  55548. var res = this.decoder.write(buf),
  55549. trail = this.decoder.end();
  55550. return trail ? (res + trail) : res;
  55551. }
  55552. return this.decoder.end();
  55553. }
  55554. function detectEncoding(buf, defaultEncoding) {
  55555. var enc = defaultEncoding || 'utf-16le';
  55556. if (buf.length >= 2) {
  55557. // Check BOM.
  55558. if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM
  55559. enc = 'utf-16be';
  55560. else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM
  55561. enc = 'utf-16le';
  55562. else {
  55563. // No BOM found. Try to deduce encoding from initial content.
  55564. // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.
  55565. // So, we count ASCII as if it was LE or BE, and decide from that.
  55566. var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions
  55567. _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.
  55568. for (var i = 0; i < _len; i += 2) {
  55569. if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;
  55570. if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;
  55571. }
  55572. if (asciiCharsBE > asciiCharsLE)
  55573. enc = 'utf-16be';
  55574. else if (asciiCharsBE < asciiCharsLE)
  55575. enc = 'utf-16le';
  55576. }
  55577. }
  55578. return enc;
  55579. }
  55580. /***/ }),
  55581. /* 92 */
  55582. /***/ (function(module, exports, __webpack_require__) {
  55583. "use strict";
  55584. var Buffer = __webpack_require__(2).Buffer;
  55585. // UTF-7 codec, according to https://tools.ietf.org/html/rfc2152
  55586. // See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3
  55587. exports.utf7 = Utf7Codec;
  55588. exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7
  55589. function Utf7Codec(codecOptions, iconv) {
  55590. this.iconv = iconv;
  55591. };
  55592. Utf7Codec.prototype.encoder = Utf7Encoder;
  55593. Utf7Codec.prototype.decoder = Utf7Decoder;
  55594. Utf7Codec.prototype.bomAware = true;
  55595. // -- Encoding
  55596. var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g;
  55597. function Utf7Encoder(options, codec) {
  55598. this.iconv = codec.iconv;
  55599. }
  55600. Utf7Encoder.prototype.write = function(str) {
  55601. // Naive implementation.
  55602. // Non-direct chars are encoded as "+<base64>-"; single "+" char is encoded as "+-".
  55603. return new Buffer(str.replace(nonDirectChars, function(chunk) {
  55604. return "+" + (chunk === '+' ? '' :
  55605. this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, ''))
  55606. + "-";
  55607. }.bind(this)));
  55608. }
  55609. Utf7Encoder.prototype.end = function() {
  55610. }
  55611. // -- Decoding
  55612. function Utf7Decoder(options, codec) {
  55613. this.iconv = codec.iconv;
  55614. this.inBase64 = false;
  55615. this.base64Accum = '';
  55616. }
  55617. var base64Regex = /[A-Za-z0-9\/+]/;
  55618. var base64Chars = [];
  55619. for (var i = 0; i < 256; i++)
  55620. base64Chars[i] = base64Regex.test(String.fromCharCode(i));
  55621. var plusChar = '+'.charCodeAt(0),
  55622. minusChar = '-'.charCodeAt(0),
  55623. andChar = '&'.charCodeAt(0);
  55624. Utf7Decoder.prototype.write = function(buf) {
  55625. var res = "", lastI = 0,
  55626. inBase64 = this.inBase64,
  55627. base64Accum = this.base64Accum;
  55628. // The decoder is more involved as we must handle chunks in stream.
  55629. for (var i = 0; i < buf.length; i++) {
  55630. if (!inBase64) { // We're in direct mode.
  55631. // Write direct chars until '+'
  55632. if (buf[i] == plusChar) {
  55633. res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
  55634. lastI = i+1;
  55635. inBase64 = true;
  55636. }
  55637. } else { // We decode base64.
  55638. if (!base64Chars[buf[i]]) { // Base64 ended.
  55639. if (i == lastI && buf[i] == minusChar) {// "+-" -> "+"
  55640. res += "+";
  55641. } else {
  55642. var b64str = base64Accum + buf.slice(lastI, i).toString();
  55643. res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
  55644. }
  55645. if (buf[i] != minusChar) // Minus is absorbed after base64.
  55646. i--;
  55647. lastI = i+1;
  55648. inBase64 = false;
  55649. base64Accum = '';
  55650. }
  55651. }
  55652. }
  55653. if (!inBase64) {
  55654. res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
  55655. } else {
  55656. var b64str = base64Accum + buf.slice(lastI).toString();
  55657. var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
  55658. base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
  55659. b64str = b64str.slice(0, canBeDecoded);
  55660. res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
  55661. }
  55662. this.inBase64 = inBase64;
  55663. this.base64Accum = base64Accum;
  55664. return res;
  55665. }
  55666. Utf7Decoder.prototype.end = function() {
  55667. var res = "";
  55668. if (this.inBase64 && this.base64Accum.length > 0)
  55669. res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be");
  55670. this.inBase64 = false;
  55671. this.base64Accum = '';
  55672. return res;
  55673. }
  55674. // UTF-7-IMAP codec.
  55675. // RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)
  55676. // Differences:
  55677. // * Base64 part is started by "&" instead of "+"
  55678. // * Direct characters are 0x20-0x7E, except "&" (0x26)
  55679. // * In Base64, "," is used instead of "/"
  55680. // * Base64 must not be used to represent direct characters.
  55681. // * No implicit shift back from Base64 (should always end with '-')
  55682. // * String must end in non-shifted position.
  55683. // * "-&" while in base64 is not allowed.
  55684. exports.utf7imap = Utf7IMAPCodec;
  55685. function Utf7IMAPCodec(codecOptions, iconv) {
  55686. this.iconv = iconv;
  55687. };
  55688. Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;
  55689. Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;
  55690. Utf7IMAPCodec.prototype.bomAware = true;
  55691. // -- Encoding
  55692. function Utf7IMAPEncoder(options, codec) {
  55693. this.iconv = codec.iconv;
  55694. this.inBase64 = false;
  55695. this.base64Accum = new Buffer(6);
  55696. this.base64AccumIdx = 0;
  55697. }
  55698. Utf7IMAPEncoder.prototype.write = function(str) {
  55699. var inBase64 = this.inBase64,
  55700. base64Accum = this.base64Accum,
  55701. base64AccumIdx = this.base64AccumIdx,
  55702. buf = new Buffer(str.length*5 + 10), bufIdx = 0;
  55703. for (var i = 0; i < str.length; i++) {
  55704. var uChar = str.charCodeAt(i);
  55705. if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.
  55706. if (inBase64) {
  55707. if (base64AccumIdx > 0) {
  55708. bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
  55709. base64AccumIdx = 0;
  55710. }
  55711. buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
  55712. inBase64 = false;
  55713. }
  55714. if (!inBase64) {
  55715. buf[bufIdx++] = uChar; // Write direct character
  55716. if (uChar === andChar) // Ampersand -> '&-'
  55717. buf[bufIdx++] = minusChar;
  55718. }
  55719. } else { // Non-direct character
  55720. if (!inBase64) {
  55721. buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.
  55722. inBase64 = true;
  55723. }
  55724. if (inBase64) {
  55725. base64Accum[base64AccumIdx++] = uChar >> 8;
  55726. base64Accum[base64AccumIdx++] = uChar & 0xFF;
  55727. if (base64AccumIdx == base64Accum.length) {
  55728. bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx);
  55729. base64AccumIdx = 0;
  55730. }
  55731. }
  55732. }
  55733. }
  55734. this.inBase64 = inBase64;
  55735. this.base64AccumIdx = base64AccumIdx;
  55736. return buf.slice(0, bufIdx);
  55737. }
  55738. Utf7IMAPEncoder.prototype.end = function() {
  55739. var buf = new Buffer(10), bufIdx = 0;
  55740. if (this.inBase64) {
  55741. if (this.base64AccumIdx > 0) {
  55742. bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx);
  55743. this.base64AccumIdx = 0;
  55744. }
  55745. buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.
  55746. this.inBase64 = false;
  55747. }
  55748. return buf.slice(0, bufIdx);
  55749. }
  55750. // -- Decoding
  55751. function Utf7IMAPDecoder(options, codec) {
  55752. this.iconv = codec.iconv;
  55753. this.inBase64 = false;
  55754. this.base64Accum = '';
  55755. }
  55756. var base64IMAPChars = base64Chars.slice();
  55757. base64IMAPChars[','.charCodeAt(0)] = true;
  55758. Utf7IMAPDecoder.prototype.write = function(buf) {
  55759. var res = "", lastI = 0,
  55760. inBase64 = this.inBase64,
  55761. base64Accum = this.base64Accum;
  55762. // The decoder is more involved as we must handle chunks in stream.
  55763. // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).
  55764. for (var i = 0; i < buf.length; i++) {
  55765. if (!inBase64) { // We're in direct mode.
  55766. // Write direct chars until '&'
  55767. if (buf[i] == andChar) {
  55768. res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars.
  55769. lastI = i+1;
  55770. inBase64 = true;
  55771. }
  55772. } else { // We decode base64.
  55773. if (!base64IMAPChars[buf[i]]) { // Base64 ended.
  55774. if (i == lastI && buf[i] == minusChar) { // "&-" -> "&"
  55775. res += "&";
  55776. } else {
  55777. var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');
  55778. res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
  55779. }
  55780. if (buf[i] != minusChar) // Minus may be absorbed after base64.
  55781. i--;
  55782. lastI = i+1;
  55783. inBase64 = false;
  55784. base64Accum = '';
  55785. }
  55786. }
  55787. }
  55788. if (!inBase64) {
  55789. res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars.
  55790. } else {
  55791. var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');
  55792. var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.
  55793. base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.
  55794. b64str = b64str.slice(0, canBeDecoded);
  55795. res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be");
  55796. }
  55797. this.inBase64 = inBase64;
  55798. this.base64Accum = base64Accum;
  55799. return res;
  55800. }
  55801. Utf7IMAPDecoder.prototype.end = function() {
  55802. var res = "";
  55803. if (this.inBase64 && this.base64Accum.length > 0)
  55804. res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be");
  55805. this.inBase64 = false;
  55806. this.base64Accum = '';
  55807. return res;
  55808. }
  55809. /***/ }),
  55810. /* 93 */
  55811. /***/ (function(module, exports, __webpack_require__) {
  55812. "use strict";
  55813. var Buffer = __webpack_require__(2).Buffer;
  55814. // Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that
  55815. // correspond to encoded bytes (if 128 - then lower half is ASCII).
  55816. exports._sbcs = SBCSCodec;
  55817. function SBCSCodec(codecOptions, iconv) {
  55818. if (!codecOptions)
  55819. throw new Error("SBCS codec is called without the data.")
  55820. // Prepare char buffer for decoding.
  55821. if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))
  55822. throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)");
  55823. if (codecOptions.chars.length === 128) {
  55824. var asciiString = "";
  55825. for (var i = 0; i < 128; i++)
  55826. asciiString += String.fromCharCode(i);
  55827. codecOptions.chars = asciiString + codecOptions.chars;
  55828. }
  55829. this.decodeBuf = new Buffer(codecOptions.chars, 'ucs2');
  55830. // Encoding buffer.
  55831. var encodeBuf = new Buffer(65536);
  55832. encodeBuf.fill(iconv.defaultCharSingleByte.charCodeAt(0));
  55833. for (var i = 0; i < codecOptions.chars.length; i++)
  55834. encodeBuf[codecOptions.chars.charCodeAt(i)] = i;
  55835. this.encodeBuf = encodeBuf;
  55836. }
  55837. SBCSCodec.prototype.encoder = SBCSEncoder;
  55838. SBCSCodec.prototype.decoder = SBCSDecoder;
  55839. function SBCSEncoder(options, codec) {
  55840. this.encodeBuf = codec.encodeBuf;
  55841. }
  55842. SBCSEncoder.prototype.write = function(str) {
  55843. var buf = new Buffer(str.length);
  55844. for (var i = 0; i < str.length; i++)
  55845. buf[i] = this.encodeBuf[str.charCodeAt(i)];
  55846. return buf;
  55847. }
  55848. SBCSEncoder.prototype.end = function() {
  55849. }
  55850. function SBCSDecoder(options, codec) {
  55851. this.decodeBuf = codec.decodeBuf;
  55852. }
  55853. SBCSDecoder.prototype.write = function(buf) {
  55854. // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
  55855. var decodeBuf = this.decodeBuf;
  55856. var newBuf = new Buffer(buf.length*2);
  55857. var idx1 = 0, idx2 = 0;
  55858. for (var i = 0; i < buf.length; i++) {
  55859. idx1 = buf[i]*2; idx2 = i*2;
  55860. newBuf[idx2] = decodeBuf[idx1];
  55861. newBuf[idx2+1] = decodeBuf[idx1+1];
  55862. }
  55863. return newBuf.toString('ucs2');
  55864. }
  55865. SBCSDecoder.prototype.end = function() {
  55866. }
  55867. /***/ }),
  55868. /* 94 */
  55869. /***/ (function(module, exports) {
  55870. "use strict";
  55871. // Manually added data to be used by sbcs codec in addition to generated one.
  55872. module.exports = {
  55873. // Not supported by iconv, not sure why.
  55874. "10029": "maccenteuro",
  55875. "maccenteuro": {
  55876. "type": "_sbcs",
  55877. "chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ"
  55878. },
  55879. "808": "cp808",
  55880. "ibm808": "cp808",
  55881. "cp808": {
  55882. "type": "_sbcs",
  55883. "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ "
  55884. },
  55885. // Aliases of generated encodings.
  55886. "ascii8bit": "ascii",
  55887. "usascii": "ascii",
  55888. "ansix34": "ascii",
  55889. "ansix341968": "ascii",
  55890. "ansix341986": "ascii",
  55891. "csascii": "ascii",
  55892. "cp367": "ascii",
  55893. "ibm367": "ascii",
  55894. "isoir6": "ascii",
  55895. "iso646us": "ascii",
  55896. "iso646irv": "ascii",
  55897. "us": "ascii",
  55898. "latin1": "iso88591",
  55899. "latin2": "iso88592",
  55900. "latin3": "iso88593",
  55901. "latin4": "iso88594",
  55902. "latin5": "iso88599",
  55903. "latin6": "iso885910",
  55904. "latin7": "iso885913",
  55905. "latin8": "iso885914",
  55906. "latin9": "iso885915",
  55907. "latin10": "iso885916",
  55908. "csisolatin1": "iso88591",
  55909. "csisolatin2": "iso88592",
  55910. "csisolatin3": "iso88593",
  55911. "csisolatin4": "iso88594",
  55912. "csisolatincyrillic": "iso88595",
  55913. "csisolatinarabic": "iso88596",
  55914. "csisolatingreek" : "iso88597",
  55915. "csisolatinhebrew": "iso88598",
  55916. "csisolatin5": "iso88599",
  55917. "csisolatin6": "iso885910",
  55918. "l1": "iso88591",
  55919. "l2": "iso88592",
  55920. "l3": "iso88593",
  55921. "l4": "iso88594",
  55922. "l5": "iso88599",
  55923. "l6": "iso885910",
  55924. "l7": "iso885913",
  55925. "l8": "iso885914",
  55926. "l9": "iso885915",
  55927. "l10": "iso885916",
  55928. "isoir14": "iso646jp",
  55929. "isoir57": "iso646cn",
  55930. "isoir100": "iso88591",
  55931. "isoir101": "iso88592",
  55932. "isoir109": "iso88593",
  55933. "isoir110": "iso88594",
  55934. "isoir144": "iso88595",
  55935. "isoir127": "iso88596",
  55936. "isoir126": "iso88597",
  55937. "isoir138": "iso88598",
  55938. "isoir148": "iso88599",
  55939. "isoir157": "iso885910",
  55940. "isoir166": "tis620",
  55941. "isoir179": "iso885913",
  55942. "isoir199": "iso885914",
  55943. "isoir203": "iso885915",
  55944. "isoir226": "iso885916",
  55945. "cp819": "iso88591",
  55946. "ibm819": "iso88591",
  55947. "cp28591": "iso88591",
  55948. "28591": "iso88591",
  55949. "cyrillic": "iso88595",
  55950. "arabic": "iso88596",
  55951. "arabic8": "iso88596",
  55952. "ecma114": "iso88596",
  55953. "asmo708": "iso88596",
  55954. "greek" : "iso88597",
  55955. "greek8" : "iso88597",
  55956. "ecma118" : "iso88597",
  55957. "elot928" : "iso88597",
  55958. "hebrew": "iso88598",
  55959. "hebrew8": "iso88598",
  55960. "turkish": "iso88599",
  55961. "turkish8": "iso88599",
  55962. "thai": "iso885911",
  55963. "thai8": "iso885911",
  55964. "celtic": "iso885914",
  55965. "celtic8": "iso885914",
  55966. "isoceltic": "iso885914",
  55967. "tis6200": "tis620",
  55968. "tis62025291": "tis620",
  55969. "tis62025330": "tis620",
  55970. "10000": "macroman",
  55971. "10006": "macgreek",
  55972. "10007": "maccyrillic",
  55973. "10079": "maciceland",
  55974. "10081": "macturkish",
  55975. "cspc8codepage437": "cp437",
  55976. "cspc775baltic": "cp775",
  55977. "cspc850multilingual": "cp850",
  55978. "cspcp852": "cp852",
  55979. "cspc862latinhebrew": "cp862",
  55980. "cpgr": "cp869",
  55981. "msee": "cp1250",
  55982. "mscyrl": "cp1251",
  55983. "msansi": "cp1252",
  55984. "msgreek": "cp1253",
  55985. "msturk": "cp1254",
  55986. "mshebr": "cp1255",
  55987. "msarab": "cp1256",
  55988. "winbaltrim": "cp1257",
  55989. "cp20866": "koi8r",
  55990. "20866": "koi8r",
  55991. "ibm878": "koi8r",
  55992. "cskoi8r": "koi8r",
  55993. "cp21866": "koi8u",
  55994. "21866": "koi8u",
  55995. "ibm1168": "koi8u",
  55996. "strk10482002": "rk1048",
  55997. "tcvn5712": "tcvn",
  55998. "tcvn57121": "tcvn",
  55999. "gb198880": "iso646cn",
  56000. "cn": "iso646cn",
  56001. "csiso14jisc6220ro": "iso646jp",
  56002. "jisc62201969ro": "iso646jp",
  56003. "jp": "iso646jp",
  56004. "cshproman8": "hproman8",
  56005. "r8": "hproman8",
  56006. "roman8": "hproman8",
  56007. "xroman8": "hproman8",
  56008. "ibm1051": "hproman8",
  56009. "mac": "macintosh",
  56010. "csmacintosh": "macintosh",
  56011. };
  56012. /***/ }),
  56013. /* 95 */
  56014. /***/ (function(module, exports) {
  56015. "use strict";
  56016. // Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.
  56017. module.exports = {
  56018. "437": "cp437",
  56019. "737": "cp737",
  56020. "775": "cp775",
  56021. "850": "cp850",
  56022. "852": "cp852",
  56023. "855": "cp855",
  56024. "856": "cp856",
  56025. "857": "cp857",
  56026. "858": "cp858",
  56027. "860": "cp860",
  56028. "861": "cp861",
  56029. "862": "cp862",
  56030. "863": "cp863",
  56031. "864": "cp864",
  56032. "865": "cp865",
  56033. "866": "cp866",
  56034. "869": "cp869",
  56035. "874": "windows874",
  56036. "922": "cp922",
  56037. "1046": "cp1046",
  56038. "1124": "cp1124",
  56039. "1125": "cp1125",
  56040. "1129": "cp1129",
  56041. "1133": "cp1133",
  56042. "1161": "cp1161",
  56043. "1162": "cp1162",
  56044. "1163": "cp1163",
  56045. "1250": "windows1250",
  56046. "1251": "windows1251",
  56047. "1252": "windows1252",
  56048. "1253": "windows1253",
  56049. "1254": "windows1254",
  56050. "1255": "windows1255",
  56051. "1256": "windows1256",
  56052. "1257": "windows1257",
  56053. "1258": "windows1258",
  56054. "28592": "iso88592",
  56055. "28593": "iso88593",
  56056. "28594": "iso88594",
  56057. "28595": "iso88595",
  56058. "28596": "iso88596",
  56059. "28597": "iso88597",
  56060. "28598": "iso88598",
  56061. "28599": "iso88599",
  56062. "28600": "iso885910",
  56063. "28601": "iso885911",
  56064. "28603": "iso885913",
  56065. "28604": "iso885914",
  56066. "28605": "iso885915",
  56067. "28606": "iso885916",
  56068. "windows874": {
  56069. "type": "_sbcs",
  56070. "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  56071. },
  56072. "win874": "windows874",
  56073. "cp874": "windows874",
  56074. "windows1250": {
  56075. "type": "_sbcs",
  56076. "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  56077. },
  56078. "win1250": "windows1250",
  56079. "cp1250": "windows1250",
  56080. "windows1251": {
  56081. "type": "_sbcs",
  56082. "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  56083. },
  56084. "win1251": "windows1251",
  56085. "cp1251": "windows1251",
  56086. "windows1252": {
  56087. "type": "_sbcs",
  56088. "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  56089. },
  56090. "win1252": "windows1252",
  56091. "cp1252": "windows1252",
  56092. "windows1253": {
  56093. "type": "_sbcs",
  56094. "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  56095. },
  56096. "win1253": "windows1253",
  56097. "cp1253": "windows1253",
  56098. "windows1254": {
  56099. "type": "_sbcs",
  56100. "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  56101. },
  56102. "win1254": "windows1254",
  56103. "cp1254": "windows1254",
  56104. "windows1255": {
  56105. "type": "_sbcs",
  56106. "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  56107. },
  56108. "win1255": "windows1255",
  56109. "cp1255": "windows1255",
  56110. "windows1256": {
  56111. "type": "_sbcs",
  56112. "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے"
  56113. },
  56114. "win1256": "windows1256",
  56115. "cp1256": "windows1256",
  56116. "windows1257": {
  56117. "type": "_sbcs",
  56118. "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙"
  56119. },
  56120. "win1257": "windows1257",
  56121. "cp1257": "windows1257",
  56122. "windows1258": {
  56123. "type": "_sbcs",
  56124. "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  56125. },
  56126. "win1258": "windows1258",
  56127. "cp1258": "windows1258",
  56128. "iso88592": {
  56129. "type": "_sbcs",
  56130. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙"
  56131. },
  56132. "cp28592": "iso88592",
  56133. "iso88593": {
  56134. "type": "_sbcs",
  56135. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙"
  56136. },
  56137. "cp28593": "iso88593",
  56138. "iso88594": {
  56139. "type": "_sbcs",
  56140. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙"
  56141. },
  56142. "cp28594": "iso88594",
  56143. "iso88595": {
  56144. "type": "_sbcs",
  56145. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ"
  56146. },
  56147. "cp28595": "iso88595",
  56148. "iso88596": {
  56149. "type": "_sbcs",
  56150. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������"
  56151. },
  56152. "cp28596": "iso88596",
  56153. "iso88597": {
  56154. "type": "_sbcs",
  56155. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�"
  56156. },
  56157. "cp28597": "iso88597",
  56158. "iso88598": {
  56159. "type": "_sbcs",
  56160. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�"
  56161. },
  56162. "cp28598": "iso88598",
  56163. "iso88599": {
  56164. "type": "_sbcs",
  56165. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ"
  56166. },
  56167. "cp28599": "iso88599",
  56168. "iso885910": {
  56169. "type": "_sbcs",
  56170. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ"
  56171. },
  56172. "cp28600": "iso885910",
  56173. "iso885911": {
  56174. "type": "_sbcs",
  56175. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  56176. },
  56177. "cp28601": "iso885911",
  56178. "iso885913": {
  56179. "type": "_sbcs",
  56180. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’"
  56181. },
  56182. "cp28603": "iso885913",
  56183. "iso885914": {
  56184. "type": "_sbcs",
  56185. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ"
  56186. },
  56187. "cp28604": "iso885914",
  56188. "iso885915": {
  56189. "type": "_sbcs",
  56190. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  56191. },
  56192. "cp28605": "iso885915",
  56193. "iso885916": {
  56194. "type": "_sbcs",
  56195. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ"
  56196. },
  56197. "cp28606": "iso885916",
  56198. "cp437": {
  56199. "type": "_sbcs",
  56200. "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56201. },
  56202. "ibm437": "cp437",
  56203. "csibm437": "cp437",
  56204. "cp737": {
  56205. "type": "_sbcs",
  56206. "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ "
  56207. },
  56208. "ibm737": "cp737",
  56209. "csibm737": "cp737",
  56210. "cp775": {
  56211. "type": "_sbcs",
  56212. "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£ØפĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ "
  56213. },
  56214. "ibm775": "cp775",
  56215. "csibm775": "cp775",
  56216. "cp850": {
  56217. "type": "_sbcs",
  56218. "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "
  56219. },
  56220. "ibm850": "cp850",
  56221. "csibm850": "cp850",
  56222. "cp852": {
  56223. "type": "_sbcs",
  56224. "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ "
  56225. },
  56226. "ibm852": "cp852",
  56227. "csibm852": "cp852",
  56228. "cp855": {
  56229. "type": "_sbcs",
  56230. "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ "
  56231. },
  56232. "ibm855": "cp855",
  56233. "csibm855": "cp855",
  56234. "cp856": {
  56235. "type": "_sbcs",
  56236. "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ "
  56237. },
  56238. "ibm856": "cp856",
  56239. "csibm856": "cp856",
  56240. "cp857": {
  56241. "type": "_sbcs",
  56242. "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ "
  56243. },
  56244. "ibm857": "cp857",
  56245. "csibm857": "cp857",
  56246. "cp858": {
  56247. "type": "_sbcs",
  56248. "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "
  56249. },
  56250. "ibm858": "cp858",
  56251. "csibm858": "cp858",
  56252. "cp860": {
  56253. "type": "_sbcs",
  56254. "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56255. },
  56256. "ibm860": "cp860",
  56257. "csibm860": "cp860",
  56258. "cp861": {
  56259. "type": "_sbcs",
  56260. "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56261. },
  56262. "ibm861": "cp861",
  56263. "csibm861": "cp861",
  56264. "cp862": {
  56265. "type": "_sbcs",
  56266. "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56267. },
  56268. "ibm862": "cp862",
  56269. "csibm862": "cp862",
  56270. "cp863": {
  56271. "type": "_sbcs",
  56272. "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56273. },
  56274. "ibm863": "cp863",
  56275. "csibm863": "cp863",
  56276. "cp864": {
  56277. "type": "_sbcs",
  56278. "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�"
  56279. },
  56280. "ibm864": "cp864",
  56281. "csibm864": "cp864",
  56282. "cp865": {
  56283. "type": "_sbcs",
  56284. "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
  56285. },
  56286. "ibm865": "cp865",
  56287. "csibm865": "cp865",
  56288. "cp866": {
  56289. "type": "_sbcs",
  56290. "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ "
  56291. },
  56292. "ibm866": "cp866",
  56293. "csibm866": "cp866",
  56294. "cp869": {
  56295. "type": "_sbcs",
  56296. "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ "
  56297. },
  56298. "ibm869": "cp869",
  56299. "csibm869": "cp869",
  56300. "cp922": {
  56301. "type": "_sbcs",
  56302. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ"
  56303. },
  56304. "ibm922": "cp922",
  56305. "csibm922": "cp922",
  56306. "cp1046": {
  56307. "type": "_sbcs",
  56308. "chars": "ﺈ×÷ﹱˆ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�"
  56309. },
  56310. "ibm1046": "cp1046",
  56311. "csibm1046": "cp1046",
  56312. "cp1124": {
  56313. "type": "_sbcs",
  56314. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ"
  56315. },
  56316. "ibm1124": "cp1124",
  56317. "csibm1124": "cp1124",
  56318. "cp1125": {
  56319. "type": "_sbcs",
  56320. "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ "
  56321. },
  56322. "ibm1125": "cp1125",
  56323. "csibm1125": "cp1125",
  56324. "cp1129": {
  56325. "type": "_sbcs",
  56326. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  56327. },
  56328. "ibm1129": "cp1129",
  56329. "csibm1129": "cp1129",
  56330. "cp1133": {
  56331. "type": "_sbcs",
  56332. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�"
  56333. },
  56334. "ibm1133": "cp1133",
  56335. "csibm1133": "cp1133",
  56336. "cp1161": {
  56337. "type": "_sbcs",
  56338. "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ "
  56339. },
  56340. "ibm1161": "cp1161",
  56341. "csibm1161": "cp1161",
  56342. "cp1162": {
  56343. "type": "_sbcs",
  56344. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  56345. },
  56346. "ibm1162": "cp1162",
  56347. "csibm1162": "cp1162",
  56348. "cp1163": {
  56349. "type": "_sbcs",
  56350. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ"
  56351. },
  56352. "ibm1163": "cp1163",
  56353. "csibm1163": "cp1163",
  56354. "maccroatian": {
  56355. "type": "_sbcs",
  56356. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ"
  56357. },
  56358. "maccyrillic": {
  56359. "type": "_sbcs",
  56360. "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  56361. },
  56362. "macgreek": {
  56363. "type": "_sbcs",
  56364. "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�"
  56365. },
  56366. "maciceland": {
  56367. "type": "_sbcs",
  56368. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  56369. },
  56370. "macroman": {
  56371. "type": "_sbcs",
  56372. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  56373. },
  56374. "macromania": {
  56375. "type": "_sbcs",
  56376. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  56377. },
  56378. "macthai": {
  56379. "type": "_sbcs",
  56380. "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����"
  56381. },
  56382. "macturkish": {
  56383. "type": "_sbcs",
  56384. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ"
  56385. },
  56386. "macukraine": {
  56387. "type": "_sbcs",
  56388. "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤"
  56389. },
  56390. "koi8r": {
  56391. "type": "_sbcs",
  56392. "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  56393. },
  56394. "koi8u": {
  56395. "type": "_sbcs",
  56396. "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  56397. },
  56398. "koi8ru": {
  56399. "type": "_sbcs",
  56400. "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  56401. },
  56402. "koi8t": {
  56403. "type": "_sbcs",
  56404. "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"
  56405. },
  56406. "armscii8": {
  56407. "type": "_sbcs",
  56408. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�"
  56409. },
  56410. "rk1048": {
  56411. "type": "_sbcs",
  56412. "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  56413. },
  56414. "tcvn": {
  56415. "type": "_sbcs",
  56416. "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ"
  56417. },
  56418. "georgianacademy": {
  56419. "type": "_sbcs",
  56420. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  56421. },
  56422. "georgianps": {
  56423. "type": "_sbcs",
  56424. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
  56425. },
  56426. "pt154": {
  56427. "type": "_sbcs",
  56428. "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"
  56429. },
  56430. "viscii": {
  56431. "type": "_sbcs",
  56432. "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ"
  56433. },
  56434. "iso646cn": {
  56435. "type": "_sbcs",
  56436. "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  56437. },
  56438. "iso646jp": {
  56439. "type": "_sbcs",
  56440. "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������"
  56441. },
  56442. "hproman8": {
  56443. "type": "_sbcs",
  56444. "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�"
  56445. },
  56446. "macintosh": {
  56447. "type": "_sbcs",
  56448. "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ"
  56449. },
  56450. "ascii": {
  56451. "type": "_sbcs",
  56452. "chars": "��������������������������������������������������������������������������������������������������������������������������������"
  56453. },
  56454. "tis620": {
  56455. "type": "_sbcs",
  56456. "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����"
  56457. }
  56458. }
  56459. /***/ }),
  56460. /* 96 */
  56461. /***/ (function(module, exports, __webpack_require__) {
  56462. "use strict";
  56463. var Buffer = __webpack_require__(2).Buffer;
  56464. // Multibyte codec. In this scheme, a character is represented by 1 or more bytes.
  56465. // Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.
  56466. // To save memory and loading time, we read table files only when requested.
  56467. exports._dbcs = DBCSCodec;
  56468. var UNASSIGNED = -1,
  56469. GB18030_CODE = -2,
  56470. SEQ_START = -10,
  56471. NODE_START = -1000,
  56472. UNASSIGNED_NODE = new Array(0x100),
  56473. DEF_CHAR = -1;
  56474. for (var i = 0; i < 0x100; i++)
  56475. UNASSIGNED_NODE[i] = UNASSIGNED;
  56476. // Class DBCSCodec reads and initializes mapping tables.
  56477. function DBCSCodec(codecOptions, iconv) {
  56478. this.encodingName = codecOptions.encodingName;
  56479. if (!codecOptions)
  56480. throw new Error("DBCS codec is called without the data.")
  56481. if (!codecOptions.table)
  56482. throw new Error("Encoding '" + this.encodingName + "' has no data.");
  56483. // Load tables.
  56484. var mappingTable = codecOptions.table();
  56485. // Decode tables: MBCS -> Unicode.
  56486. // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.
  56487. // Trie root is decodeTables[0].
  56488. // Values: >= 0 -> unicode character code. can be > 0xFFFF
  56489. // == UNASSIGNED -> unknown/unassigned sequence.
  56490. // == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.
  56491. // <= NODE_START -> index of the next node in our trie to process next byte.
  56492. // <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq.
  56493. this.decodeTables = [];
  56494. this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.
  56495. // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here.
  56496. this.decodeTableSeq = [];
  56497. // Actual mapping tables consist of chunks. Use them to fill up decode tables.
  56498. for (var i = 0; i < mappingTable.length; i++)
  56499. this._addDecodeChunk(mappingTable[i]);
  56500. this.defaultCharUnicode = iconv.defaultCharUnicode;
  56501. // Encode tables: Unicode -> DBCS.
  56502. // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.
  56503. // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.
  56504. // Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).
  56505. // == UNASSIGNED -> no conversion found. Output a default char.
  56506. // <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence.
  56507. this.encodeTable = [];
  56508. // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of
  56509. // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key
  56510. // means end of sequence (needed when one sequence is a strict subsequence of another).
  56511. // Objects are kept separately from encodeTable to increase performance.
  56512. this.encodeTableSeq = [];
  56513. // Some chars can be decoded, but need not be encoded.
  56514. var skipEncodeChars = {};
  56515. if (codecOptions.encodeSkipVals)
  56516. for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {
  56517. var val = codecOptions.encodeSkipVals[i];
  56518. if (typeof val === 'number')
  56519. skipEncodeChars[val] = true;
  56520. else
  56521. for (var j = val.from; j <= val.to; j++)
  56522. skipEncodeChars[j] = true;
  56523. }
  56524. // Use decode trie to recursively fill out encode tables.
  56525. this._fillEncodeTable(0, 0, skipEncodeChars);
  56526. // Add more encoding pairs when needed.
  56527. if (codecOptions.encodeAdd) {
  56528. for (var uChar in codecOptions.encodeAdd)
  56529. if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))
  56530. this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);
  56531. }
  56532. this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];
  56533. if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];
  56534. if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0);
  56535. // Load & create GB18030 tables when needed.
  56536. if (typeof codecOptions.gb18030 === 'function') {
  56537. this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.
  56538. // Add GB18030 decode tables.
  56539. var thirdByteNodeIdx = this.decodeTables.length;
  56540. var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);
  56541. var fourthByteNodeIdx = this.decodeTables.length;
  56542. var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);
  56543. for (var i = 0x81; i <= 0xFE; i++) {
  56544. var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];
  56545. var secondByteNode = this.decodeTables[secondByteNodeIdx];
  56546. for (var j = 0x30; j <= 0x39; j++)
  56547. secondByteNode[j] = NODE_START - thirdByteNodeIdx;
  56548. }
  56549. for (var i = 0x81; i <= 0xFE; i++)
  56550. thirdByteNode[i] = NODE_START - fourthByteNodeIdx;
  56551. for (var i = 0x30; i <= 0x39; i++)
  56552. fourthByteNode[i] = GB18030_CODE
  56553. }
  56554. }
  56555. DBCSCodec.prototype.encoder = DBCSEncoder;
  56556. DBCSCodec.prototype.decoder = DBCSDecoder;
  56557. // Decoder helpers
  56558. DBCSCodec.prototype._getDecodeTrieNode = function(addr) {
  56559. var bytes = [];
  56560. for (; addr > 0; addr >>= 8)
  56561. bytes.push(addr & 0xFF);
  56562. if (bytes.length == 0)
  56563. bytes.push(0);
  56564. var node = this.decodeTables[0];
  56565. for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.
  56566. var val = node[bytes[i]];
  56567. if (val == UNASSIGNED) { // Create new node.
  56568. node[bytes[i]] = NODE_START - this.decodeTables.length;
  56569. this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));
  56570. }
  56571. else if (val <= NODE_START) { // Existing node.
  56572. node = this.decodeTables[NODE_START - val];
  56573. }
  56574. else
  56575. throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16));
  56576. }
  56577. return node;
  56578. }
  56579. DBCSCodec.prototype._addDecodeChunk = function(chunk) {
  56580. // First element of chunk is the hex mbcs code where we start.
  56581. var curAddr = parseInt(chunk[0], 16);
  56582. // Choose the decoding node where we'll write our chars.
  56583. var writeTable = this._getDecodeTrieNode(curAddr);
  56584. curAddr = curAddr & 0xFF;
  56585. // Write all other elements of the chunk to the table.
  56586. for (var k = 1; k < chunk.length; k++) {
  56587. var part = chunk[k];
  56588. if (typeof part === "string") { // String, write as-is.
  56589. for (var l = 0; l < part.length;) {
  56590. var code = part.charCodeAt(l++);
  56591. if (0xD800 <= code && code < 0xDC00) { // Decode surrogate
  56592. var codeTrail = part.charCodeAt(l++);
  56593. if (0xDC00 <= codeTrail && codeTrail < 0xE000)
  56594. writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);
  56595. else
  56596. throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]);
  56597. }
  56598. else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)
  56599. var len = 0xFFF - code + 2;
  56600. var seq = [];
  56601. for (var m = 0; m < len; m++)
  56602. seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.
  56603. writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;
  56604. this.decodeTableSeq.push(seq);
  56605. }
  56606. else
  56607. writeTable[curAddr++] = code; // Basic char
  56608. }
  56609. }
  56610. else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character.
  56611. var charCode = writeTable[curAddr - 1] + 1;
  56612. for (var l = 0; l < part; l++)
  56613. writeTable[curAddr++] = charCode++;
  56614. }
  56615. else
  56616. throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]);
  56617. }
  56618. if (curAddr > 0xFF)
  56619. throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr);
  56620. }
  56621. // Encoder helpers
  56622. DBCSCodec.prototype._getEncodeBucket = function(uCode) {
  56623. var high = uCode >> 8; // This could be > 0xFF because of astral characters.
  56624. if (this.encodeTable[high] === undefined)
  56625. this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.
  56626. return this.encodeTable[high];
  56627. }
  56628. DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {
  56629. var bucket = this._getEncodeBucket(uCode);
  56630. var low = uCode & 0xFF;
  56631. if (bucket[low] <= SEQ_START)
  56632. this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.
  56633. else if (bucket[low] == UNASSIGNED)
  56634. bucket[low] = dbcsCode;
  56635. }
  56636. DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {
  56637. // Get the root of character tree according to first character of the sequence.
  56638. var uCode = seq[0];
  56639. var bucket = this._getEncodeBucket(uCode);
  56640. var low = uCode & 0xFF;
  56641. var node;
  56642. if (bucket[low] <= SEQ_START) {
  56643. // There's already a sequence with - use it.
  56644. node = this.encodeTableSeq[SEQ_START-bucket[low]];
  56645. }
  56646. else {
  56647. // There was no sequence object - allocate a new one.
  56648. node = {};
  56649. if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.
  56650. bucket[low] = SEQ_START - this.encodeTableSeq.length;
  56651. this.encodeTableSeq.push(node);
  56652. }
  56653. // Traverse the character tree, allocating new nodes as needed.
  56654. for (var j = 1; j < seq.length-1; j++) {
  56655. var oldVal = node[uCode];
  56656. if (typeof oldVal === 'object')
  56657. node = oldVal;
  56658. else {
  56659. node = node[uCode] = {}
  56660. if (oldVal !== undefined)
  56661. node[DEF_CHAR] = oldVal
  56662. }
  56663. }
  56664. // Set the leaf to given dbcsCode.
  56665. uCode = seq[seq.length-1];
  56666. node[uCode] = dbcsCode;
  56667. }
  56668. DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {
  56669. var node = this.decodeTables[nodeIdx];
  56670. for (var i = 0; i < 0x100; i++) {
  56671. var uCode = node[i];
  56672. var mbCode = prefix + i;
  56673. if (skipEncodeChars[mbCode])
  56674. continue;
  56675. if (uCode >= 0)
  56676. this._setEncodeChar(uCode, mbCode);
  56677. else if (uCode <= NODE_START)
  56678. this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);
  56679. else if (uCode <= SEQ_START)
  56680. this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);
  56681. }
  56682. }
  56683. // == Encoder ==================================================================
  56684. function DBCSEncoder(options, codec) {
  56685. // Encoder state
  56686. this.leadSurrogate = -1;
  56687. this.seqObj = undefined;
  56688. // Static data
  56689. this.encodeTable = codec.encodeTable;
  56690. this.encodeTableSeq = codec.encodeTableSeq;
  56691. this.defaultCharSingleByte = codec.defCharSB;
  56692. this.gb18030 = codec.gb18030;
  56693. }
  56694. DBCSEncoder.prototype.write = function(str) {
  56695. var newBuf = new Buffer(str.length * (this.gb18030 ? 4 : 3)),
  56696. leadSurrogate = this.leadSurrogate,
  56697. seqObj = this.seqObj, nextChar = -1,
  56698. i = 0, j = 0;
  56699. while (true) {
  56700. // 0. Get next character.
  56701. if (nextChar === -1) {
  56702. if (i == str.length) break;
  56703. var uCode = str.charCodeAt(i++);
  56704. }
  56705. else {
  56706. var uCode = nextChar;
  56707. nextChar = -1;
  56708. }
  56709. // 1. Handle surrogates.
  56710. if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.
  56711. if (uCode < 0xDC00) { // We've got lead surrogate.
  56712. if (leadSurrogate === -1) {
  56713. leadSurrogate = uCode;
  56714. continue;
  56715. } else {
  56716. leadSurrogate = uCode;
  56717. // Double lead surrogate found.
  56718. uCode = UNASSIGNED;
  56719. }
  56720. } else { // We've got trail surrogate.
  56721. if (leadSurrogate !== -1) {
  56722. uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);
  56723. leadSurrogate = -1;
  56724. } else {
  56725. // Incomplete surrogate pair - only trail surrogate found.
  56726. uCode = UNASSIGNED;
  56727. }
  56728. }
  56729. }
  56730. else if (leadSurrogate !== -1) {
  56731. // Incomplete surrogate pair - only lead surrogate found.
  56732. nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.
  56733. leadSurrogate = -1;
  56734. }
  56735. // 2. Convert uCode character.
  56736. var dbcsCode = UNASSIGNED;
  56737. if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence
  56738. var resCode = seqObj[uCode];
  56739. if (typeof resCode === 'object') { // Sequence continues.
  56740. seqObj = resCode;
  56741. continue;
  56742. } else if (typeof resCode == 'number') { // Sequence finished. Write it.
  56743. dbcsCode = resCode;
  56744. } else if (resCode == undefined) { // Current character is not part of the sequence.
  56745. // Try default character for this sequence
  56746. resCode = seqObj[DEF_CHAR];
  56747. if (resCode !== undefined) {
  56748. dbcsCode = resCode; // Found. Write it.
  56749. nextChar = uCode; // Current character will be written too in the next iteration.
  56750. } else {
  56751. // TODO: What if we have no default? (resCode == undefined)
  56752. // Then, we should write first char of the sequence as-is and try the rest recursively.
  56753. // Didn't do it for now because no encoding has this situation yet.
  56754. // Currently, just skip the sequence and write current char.
  56755. }
  56756. }
  56757. seqObj = undefined;
  56758. }
  56759. else if (uCode >= 0) { // Regular character
  56760. var subtable = this.encodeTable[uCode >> 8];
  56761. if (subtable !== undefined)
  56762. dbcsCode = subtable[uCode & 0xFF];
  56763. if (dbcsCode <= SEQ_START) { // Sequence start
  56764. seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];
  56765. continue;
  56766. }
  56767. if (dbcsCode == UNASSIGNED && this.gb18030) {
  56768. // Use GB18030 algorithm to find character(s) to write.
  56769. var idx = findIdx(this.gb18030.uChars, uCode);
  56770. if (idx != -1) {
  56771. var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);
  56772. newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;
  56773. newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;
  56774. newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;
  56775. newBuf[j++] = 0x30 + dbcsCode;
  56776. continue;
  56777. }
  56778. }
  56779. }
  56780. // 3. Write dbcsCode character.
  56781. if (dbcsCode === UNASSIGNED)
  56782. dbcsCode = this.defaultCharSingleByte;
  56783. if (dbcsCode < 0x100) {
  56784. newBuf[j++] = dbcsCode;
  56785. }
  56786. else if (dbcsCode < 0x10000) {
  56787. newBuf[j++] = dbcsCode >> 8; // high byte
  56788. newBuf[j++] = dbcsCode & 0xFF; // low byte
  56789. }
  56790. else {
  56791. newBuf[j++] = dbcsCode >> 16;
  56792. newBuf[j++] = (dbcsCode >> 8) & 0xFF;
  56793. newBuf[j++] = dbcsCode & 0xFF;
  56794. }
  56795. }
  56796. this.seqObj = seqObj;
  56797. this.leadSurrogate = leadSurrogate;
  56798. return newBuf.slice(0, j);
  56799. }
  56800. DBCSEncoder.prototype.end = function() {
  56801. if (this.leadSurrogate === -1 && this.seqObj === undefined)
  56802. return; // All clean. Most often case.
  56803. var newBuf = new Buffer(10), j = 0;
  56804. if (this.seqObj) { // We're in the sequence.
  56805. var dbcsCode = this.seqObj[DEF_CHAR];
  56806. if (dbcsCode !== undefined) { // Write beginning of the sequence.
  56807. if (dbcsCode < 0x100) {
  56808. newBuf[j++] = dbcsCode;
  56809. }
  56810. else {
  56811. newBuf[j++] = dbcsCode >> 8; // high byte
  56812. newBuf[j++] = dbcsCode & 0xFF; // low byte
  56813. }
  56814. } else {
  56815. // See todo above.
  56816. }
  56817. this.seqObj = undefined;
  56818. }
  56819. if (this.leadSurrogate !== -1) {
  56820. // Incomplete surrogate pair - only lead surrogate found.
  56821. newBuf[j++] = this.defaultCharSingleByte;
  56822. this.leadSurrogate = -1;
  56823. }
  56824. return newBuf.slice(0, j);
  56825. }
  56826. // Export for testing
  56827. DBCSEncoder.prototype.findIdx = findIdx;
  56828. // == Decoder ==================================================================
  56829. function DBCSDecoder(options, codec) {
  56830. // Decoder state
  56831. this.nodeIdx = 0;
  56832. this.prevBuf = new Buffer(0);
  56833. // Static data
  56834. this.decodeTables = codec.decodeTables;
  56835. this.decodeTableSeq = codec.decodeTableSeq;
  56836. this.defaultCharUnicode = codec.defaultCharUnicode;
  56837. this.gb18030 = codec.gb18030;
  56838. }
  56839. DBCSDecoder.prototype.write = function(buf) {
  56840. var newBuf = new Buffer(buf.length*2),
  56841. nodeIdx = this.nodeIdx,
  56842. prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,
  56843. seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.
  56844. uCode;
  56845. if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.
  56846. prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);
  56847. for (var i = 0, j = 0; i < buf.length; i++) {
  56848. var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];
  56849. // Lookup in current trie node.
  56850. var uCode = this.decodeTables[nodeIdx][curByte];
  56851. if (uCode >= 0) {
  56852. // Normal character, just use it.
  56853. }
  56854. else if (uCode === UNASSIGNED) { // Unknown char.
  56855. // TODO: Callback with seq.
  56856. //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
  56857. i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).
  56858. uCode = this.defaultCharUnicode.charCodeAt(0);
  56859. }
  56860. else if (uCode === GB18030_CODE) {
  56861. var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);
  56862. var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);
  56863. var idx = findIdx(this.gb18030.gbChars, ptr);
  56864. uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];
  56865. }
  56866. else if (uCode <= NODE_START) { // Go to next trie node.
  56867. nodeIdx = NODE_START - uCode;
  56868. continue;
  56869. }
  56870. else if (uCode <= SEQ_START) { // Output a sequence of chars.
  56871. var seq = this.decodeTableSeq[SEQ_START - uCode];
  56872. for (var k = 0; k < seq.length - 1; k++) {
  56873. uCode = seq[k];
  56874. newBuf[j++] = uCode & 0xFF;
  56875. newBuf[j++] = uCode >> 8;
  56876. }
  56877. uCode = seq[seq.length-1];
  56878. }
  56879. else
  56880. throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte);
  56881. // Write the character to buffer, handling higher planes using surrogate pair.
  56882. if (uCode > 0xFFFF) {
  56883. uCode -= 0x10000;
  56884. var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);
  56885. newBuf[j++] = uCodeLead & 0xFF;
  56886. newBuf[j++] = uCodeLead >> 8;
  56887. uCode = 0xDC00 + uCode % 0x400;
  56888. }
  56889. newBuf[j++] = uCode & 0xFF;
  56890. newBuf[j++] = uCode >> 8;
  56891. // Reset trie node.
  56892. nodeIdx = 0; seqStart = i+1;
  56893. }
  56894. this.nodeIdx = nodeIdx;
  56895. this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);
  56896. return newBuf.slice(0, j).toString('ucs2');
  56897. }
  56898. DBCSDecoder.prototype.end = function() {
  56899. var ret = '';
  56900. // Try to parse all remaining chars.
  56901. while (this.prevBuf.length > 0) {
  56902. // Skip 1 character in the buffer.
  56903. ret += this.defaultCharUnicode;
  56904. var buf = this.prevBuf.slice(1);
  56905. // Parse remaining as usual.
  56906. this.prevBuf = new Buffer(0);
  56907. this.nodeIdx = 0;
  56908. if (buf.length > 0)
  56909. ret += this.write(buf);
  56910. }
  56911. this.nodeIdx = 0;
  56912. return ret;
  56913. }
  56914. // Binary search for GB18030. Returns largest i such that table[i] <= val.
  56915. function findIdx(table, val) {
  56916. if (table[0] > val)
  56917. return -1;
  56918. var l = 0, r = table.length;
  56919. while (l < r-1) { // always table[l] <= val < table[r]
  56920. var mid = l + Math.floor((r-l+1)/2);
  56921. if (table[mid] <= val)
  56922. l = mid;
  56923. else
  56924. r = mid;
  56925. }
  56926. return l;
  56927. }
  56928. /***/ }),
  56929. /* 97 */
  56930. /***/ (function(module, exports, __webpack_require__) {
  56931. "use strict";
  56932. // Description of supported double byte encodings and aliases.
  56933. // Tables are not require()-d until they are needed to speed up library load.
  56934. // require()-s are direct to support Browserify.
  56935. module.exports = {
  56936. // == Japanese/ShiftJIS ====================================================
  56937. // All japanese encodings are based on JIS X set of standards:
  56938. // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.
  56939. // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes.
  56940. // Has several variations in 1978, 1983, 1990 and 1997.
  56941. // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.
  56942. // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.
  56943. // 2 planes, first is superset of 0208, second - revised 0212.
  56944. // Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)
  56945. // Byte encodings are:
  56946. // * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte
  56947. // encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.
  56948. // Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.
  56949. // * EUC-JP: Up to 3 bytes per character. Used mostly on *nixes.
  56950. // 0x00-0x7F - lower part of 0201
  56951. // 0x8E, 0xA1-0xDF - upper part of 0201
  56952. // (0xA1-0xFE)x2 - 0208 plane (94x94).
  56953. // 0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).
  56954. // * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.
  56955. // Used as-is in ISO2022 family.
  56956. // * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII,
  56957. // 0201-1976 Roman, 0208-1978, 0208-1983.
  56958. // * ISO2022-JP-1: Adds esc seq for 0212-1990.
  56959. // * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.
  56960. // * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.
  56961. // * ISO2022-JP-2004: Adds 0213-2004 Plane 1.
  56962. //
  56963. // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.
  56964. //
  56965. // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html
  56966. 'shiftjis': {
  56967. type: '_dbcs',
  56968. table: function() { return __webpack_require__(98) },
  56969. encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
  56970. encodeSkipVals: [{from: 0xED40, to: 0xF940}],
  56971. },
  56972. 'csshiftjis': 'shiftjis',
  56973. 'mskanji': 'shiftjis',
  56974. 'sjis': 'shiftjis',
  56975. 'windows31j': 'shiftjis',
  56976. 'ms31j': 'shiftjis',
  56977. 'xsjis': 'shiftjis',
  56978. 'windows932': 'shiftjis',
  56979. 'ms932': 'shiftjis',
  56980. '932': 'shiftjis',
  56981. 'cp932': 'shiftjis',
  56982. 'eucjp': {
  56983. type: '_dbcs',
  56984. table: function() { return __webpack_require__(99) },
  56985. encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E},
  56986. },
  56987. // TODO: KDDI extension to Shift_JIS
  56988. // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.
  56989. // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.
  56990. // == Chinese/GBK ==========================================================
  56991. // http://en.wikipedia.org/wiki/GBK
  56992. // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder
  56993. // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936
  56994. 'gb2312': 'cp936',
  56995. 'gb231280': 'cp936',
  56996. 'gb23121980': 'cp936',
  56997. 'csgb2312': 'cp936',
  56998. 'csiso58gb231280': 'cp936',
  56999. 'euccn': 'cp936',
  57000. // Microsoft's CP936 is a subset and approximation of GBK.
  57001. 'windows936': 'cp936',
  57002. 'ms936': 'cp936',
  57003. '936': 'cp936',
  57004. 'cp936': {
  57005. type: '_dbcs',
  57006. table: function() { return __webpack_require__(100) },
  57007. },
  57008. // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.
  57009. 'gbk': {
  57010. type: '_dbcs',
  57011. table: function() { return __webpack_require__(100).concat(__webpack_require__(101)) },
  57012. },
  57013. 'xgbk': 'gbk',
  57014. 'isoir58': 'gbk',
  57015. // GB18030 is an algorithmic extension of GBK.
  57016. // Main source: https://www.w3.org/TR/encoding/#gbk-encoder
  57017. // http://icu-project.org/docs/papers/gb18030.html
  57018. // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml
  57019. // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0
  57020. 'gb18030': {
  57021. type: '_dbcs',
  57022. table: function() { return __webpack_require__(100).concat(__webpack_require__(101)) },
  57023. gb18030: function() { return __webpack_require__(102) },
  57024. encodeSkipVals: [0x80],
  57025. encodeAdd: {'€': 0xA2E3},
  57026. },
  57027. 'chinese': 'gb18030',
  57028. // == Korean ===============================================================
  57029. // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.
  57030. 'windows949': 'cp949',
  57031. 'ms949': 'cp949',
  57032. '949': 'cp949',
  57033. 'cp949': {
  57034. type: '_dbcs',
  57035. table: function() { return __webpack_require__(103) },
  57036. },
  57037. 'cseuckr': 'cp949',
  57038. 'csksc56011987': 'cp949',
  57039. 'euckr': 'cp949',
  57040. 'isoir149': 'cp949',
  57041. 'korean': 'cp949',
  57042. 'ksc56011987': 'cp949',
  57043. 'ksc56011989': 'cp949',
  57044. 'ksc5601': 'cp949',
  57045. // == Big5/Taiwan/Hong Kong ================================================
  57046. // There are lots of tables for Big5 and cp950. Please see the following links for history:
  57047. // http://moztw.org/docs/big5/ http://www.haible.de/bruno/charsets/conversion-tables/Big5.html
  57048. // Variations, in roughly number of defined chars:
  57049. // * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT
  57050. // * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/
  57051. // * Big5-2003 (Taiwan standard) almost superset of cp950.
  57052. // * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.
  57053. // * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard.
  57054. // many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.
  57055. // Plus, it has 4 combining sequences.
  57056. // Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299
  57057. // because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.
  57058. // Implementations are not consistent within browsers; sometimes labeled as just big5.
  57059. // MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.
  57060. // Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31
  57061. // In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.
  57062. // Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt
  57063. // http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt
  57064. //
  57065. // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder
  57066. // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.
  57067. 'windows950': 'cp950',
  57068. 'ms950': 'cp950',
  57069. '950': 'cp950',
  57070. 'cp950': {
  57071. type: '_dbcs',
  57072. table: function() { return __webpack_require__(104) },
  57073. },
  57074. // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.
  57075. 'big5': 'big5hkscs',
  57076. 'big5hkscs': {
  57077. type: '_dbcs',
  57078. table: function() { return __webpack_require__(104).concat(__webpack_require__(105)) },
  57079. encodeSkipVals: [0xa2cc],
  57080. },
  57081. 'cnbig5': 'big5hkscs',
  57082. 'csbig5': 'big5hkscs',
  57083. 'xxbig5': 'big5hkscs',
  57084. };
  57085. /***/ }),
  57086. /* 98 */
  57087. /***/ (function(module, exports) {
  57088. module.exports = [["0","\u0000",128],["a1","。",62],["8140"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×"],["8180","÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],["81b8","∈∋⊆⊇⊂⊃∪∩"],["81c8","∧∨¬⇒⇔∀∃"],["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["81f0","ʼn♯♭♪†‡¶"],["81fc","◯"],["824f","0",9],["8260","A",25],["8281","a",25],["829f","ぁ",82],["8340","ァ",62],["8380","ム",22],["839f","Α",16,"Σ",6],["83bf","α",16,"σ",6],["8440","А",5,"ЁЖ",25],["8470","а",5,"ёж",7],["8480","о",17],["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["8740","①",19,"Ⅰ",9],["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["877e","㍻"],["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["eeef","ⅰ",9,"¬¦'""],["f040","",62],["f080","",124],["f140","",62],["f180","",124],["f240","",62],["f280","",124],["f340","",62],["f380","",124],["f440","",62],["f480","",124],["f540","",62],["f580","",124],["f640","",62],["f680","",124],["f740","",62],["f780","",124],["f840","",62],["f880","",124],["f940",""],["fa40","ⅰ",9,"Ⅰ",9,"¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]]
  57089. /***/ }),
  57090. /* 99 */
  57091. /***/ (function(module, exports) {
  57092. module.exports = [["0","\u0000",127],["8ea1","。",62],["a1a1"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇"],["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],["a2ba","∈∋⊆⊇⊂⊃∪∩"],["a2ca","∧∨¬⇒⇔∀∃"],["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["a2f2","ʼn♯♭♪†‡¶"],["a2fe","◯"],["a3b0","0",9],["a3c1","A",25],["a3e1","a",25],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["ada1","①",19,"Ⅰ",9],["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],["f4a1","堯槇遙瑤凜熙"],["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["fcf1","ⅰ",9,"¬¦'""],["8fa2af","˘ˇ¸˙˝¯˛˚~΄΅"],["8fa2c2","¡¦¿"],["8fa2eb","ºª©®™¤№"],["8fa6e1","ΆΈΉΊΪ"],["8fa6e7","Ό"],["8fa6e9","ΎΫ"],["8fa6ec","Ώ"],["8fa6f1","άέήίϊΐόςύϋΰώ"],["8fa7c2","Ђ",10,"ЎЏ"],["8fa7f2","ђ",10,"ўџ"],["8fa9a1","ÆĐ"],["8fa9a4","Ħ"],["8fa9a6","IJ"],["8fa9a8","ŁĿ"],["8fa9ab","ŊØŒ"],["8fa9af","ŦÞ"],["8fa9c1","æđðħıijĸłŀʼnŋøœßŧþ"],["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],["8fabbd","ġĥíìïîǐ"],["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]]
  57093. /***/ }),
  57094. /* 100 */
  57095. /***/ (function(module, exports) {
  57096. module.exports = [["0","\u0000",127,"€"],["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],["9980","檧檨檪檭",114,"欥欦欨",6],["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],["a1a1"," 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],["a2a1","ⅰ",9],["a2b1","⒈",19,"⑴",19,"①",9],["a2e5","㈠",9],["a2f1","Ⅰ",11],["a3a1","!"#¥%",88," ̄"],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],["a6ee","︻︼︷︸︱"],["a6f4","︳︴"],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],["a8bd","ńň"],["a8c0","ɡ"],["a8c5","ㄅ",36],["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦"],["a959","℡㈱"],["a95c","‐"],["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],["a980","﹢",4,"﹨﹩﹪﹫"],["a996","〇"],["a9a4","─",75],["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],["bb40","籃",9,"籎",36,"籵",5,"籾",9],["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],["bd40","紷",54,"絯",7],["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],["be40","継",12,"綧",6,"綯",42],["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],["bf40","緻",62],["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],["c040","繞",35,"纃",23,"纜纝纞"],["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],["d440","訞",31,"訿",8,"詉",21],["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],["d540","誁",7,"誋",7,"誔",46],["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],["d640","諤",34,"謈",27],["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],["d740","譆",31,"譧",4,"譭",25],["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],["d940","貮",62],["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],["dd40","軥",62],["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],["e240","釦",62],["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],["e340","鉆",45,"鉵",16],["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],["e440","銨",5,"銯",24,"鋉",31],["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],["e540","錊",51,"錿",10],["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],["e640","鍬",34,"鎐",27],["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],["e740","鏎",7,"鏗",54],["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],["ee40","頏",62],["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],["f040","餈",4,"餎餏餑",28,"餯",26],["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],["f140","馌馎馚",10,"馦馧馩",47],["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],["f240","駺",62],["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],["f540","魼",62],["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],["f640","鯜",62],["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],["f740","鰼",62],["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],["f840","鳣",62],["f880","鴢",32],["f940","鵃",62],["f980","鶂",32],["fa40","鶣",62],["fa80","鷢",32],["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]]
  57097. /***/ }),
  57098. /* 101 */
  57099. /***/ (function(module, exports) {
  57100. module.exports = [["a140","",62],["a180","",32],["a240","",62],["a280","",32],["a2ab","",5],["a2e3","€"],["a2ef",""],["a2fd",""],["a340","",62],["a380","",31," "],["a440","",62],["a480","",32],["a4f4","",10],["a540","",62],["a580","",32],["a5f7","",7],["a640","",62],["a680","",32],["a6b9","",7],["a6d9","",6],["a6ec",""],["a6f3",""],["a6f6","",8],["a740","",62],["a780","",32],["a7c2","",14],["a7f2","",12],["a896","",10],["a8bc",""],["a8bf","ǹ"],["a8c1",""],["a8ea","",20],["a958",""],["a95b",""],["a95d",""],["a989","〾⿰",11],["a997","",12],["a9f0","",14],["aaa1","",93],["aba1","",93],["aca1","",93],["ada1","",93],["aea1","",93],["afa1","",93],["d7fa","",4],["f8a1","",93],["f9a1","",93],["faa1","",93],["fba1","",93],["fca1","",93],["fda1","",93],["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]]
  57101. /***/ }),
  57102. /* 102 */
  57103. /***/ (function(module, exports) {
  57104. module.exports = {"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}
  57105. /***/ }),
  57106. /* 103 */
  57107. /***/ (function(module, exports) {
  57108. module.exports = [["0","\u0000",127],["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],["8361","긝",18,"긲긳긵긶긹긻긼"],["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],["8741","놞",9,"놩",15],["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],["8a61","둧",4,"둭",18,"뒁뒂"],["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],["8c41","똀",15,"똒똓똕똖똗똙",4],["8c61","똞",6,"똦",5,"똭",6,"똵",5],["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],["8d41","뛃",16,"뛕",8],["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],["8e61","럂",4,"럈럊",19],["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],["8f41","뢅",7,"뢎",17],["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],["9061","륾",5,"릆릈릋릌릏",15],["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],["9461","봞",5,"봥",6,"봭",12],["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],["9641","뺸",23,"뻒뻓"],["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],["9741","뾃",16,"뾕",8],["9761","뾞",17,"뾱",7],["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],["9841","쁀",16,"쁒",5,"쁙쁚쁛"],["9861","쁝쁞쁟쁡",6,"쁪",15],["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],["9a41","숤숥숦숧숪숬숮숰숳숵",16],["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],["9b61","쌳",17,"썆",7],["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],["9c61","쏿",8,"쐉",6,"쐑",9],["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],["9d41","쒪",13,"쒹쒺쒻쒽",8],["9d61","쓆",25],["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],["a141","좥좦좧좩",18,"좾좿죀죁"],["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬"],["a241","줐줒",5,"줙",18],["a261","줭",6,"줵",18],["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],["a361","즑",6,"즚즜즞",16],["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛!",58,"₩]",32," ̄"],["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],["a481","쨦쨧쨨쨪",28,"ㄱ",93],["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],["a561","쩫",17,"쩾",5,"쪅쪆"],["a581","쪇",16,"쪙",14,"ⅰ",9],["a5b0","Ⅰ",9],["a5c1","Α",16,"Σ",6],["a5e1","α",16,"σ",6],["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],["a761","쬪",22,"쭂쭃쭄"],["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],["a841","쭭",10,"쭺",14],["a861","쮉",18,"쮝",6],["a881","쮤",19,"쮹",11,"ÆЪĦ"],["a8a6","IJ"],["a8a8","ĿŁØŒºÞŦŊ"],["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],["a941","쯅",14,"쯕",10],["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],["aa81","챳챴챶",29,"ぁ",82],["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],["acd1","а",5,"ёж",25],["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],["ae41","췆",5,"췍췎췏췑",16],["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],["af41","츬츭츮츯츲츴츶",19],["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],["b041","캚",5,"캢캦",5,"캮",12],["b061","캻",5,"컂",19],["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],["b161","켥",6,"켮켲",5,"켹",11],["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],["b261","쾎",18,"쾢",5,"쾩"],["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],["b541","킕",14,"킦킧킩킪킫킭",5],["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],["b641","턅",7,"턎",17],["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],["b741","텮",13,"텽",6,"톅톆톇톉톊"],["b761","톋",20,"톢톣톥톦톧"],["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],["b841","퇐",7,"퇙",17],["b861","퇫",8,"퇵퇶퇷퇹",13],["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],["be41","퐸",7,"푁푂푃푅",14],["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],["bf41","풞",10,"풪",14],["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],["c061","픞",25],["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],["c161","햌햍햎햏햑",19,"햦햧"],["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],["c361","홢",4,"홨홪",5,"홲홳홵",11],["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],["c641","힍힎힏힑",6,"힚힜힞",5],["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]]
  57109. /***/ }),
  57110. /* 104 */
  57111. /***/ (function(module, exports) {
  57112. module.exports = [["0","\u0000",127],["a140"," ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢",4,"~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/"],["a240","\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳0",9,"Ⅰ",9,"〡",8,"十卄卅A",25,"a",21],["a340","wxyzΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],["a3a1","ㄐ",25,"˙ˉˊˇˋ"],["a3e1","€"],["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]]
  57113. /***/ }),
  57114. /* 105 */
  57115. /***/ (function(module, exports) {
  57116. module.exports = [["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],["8940","𪎩𡅅"],["8943","攊"],["8946","丽滝鵎釟"],["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],["89a1","琑糼緍楆竉刧"],["89ab","醌碸酞肼"],["89b0","贋胶𠧧"],["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],["89c1","溚舾甙"],["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],["8a40","𧶄唥"],["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],["8aac","䠋𠆩㿺塳𢶍"],["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],["8ac9","𪘁𠸉𢫏𢳉"],["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],["8ca1","𣏹椙橃𣱣泿"],["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],["8cc9","顨杫䉶圽"],["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],["8d40","𠮟"],["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],["9fae","酙隁酜"],["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],["9fc1","𤤙盖鮝个𠳔莾衂"],["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],["9fe7","毺蠘罸"],["9feb","嘠𪙊蹷齓"],["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],["a055","𡠻𦸅"],["a058","詾𢔛"],["a05b","惽癧髗鵄鍮鮏蟵"],["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],["a0a1","嵗𨯂迚𨸹"],["a0a6","僙𡵆礆匲阸𠼻䁥"],["a0ae","矾"],["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],["a3c0","␀",31,"␡"],["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー[]✽ぁ",23],["c740","す",58,"ァアィイ"],["c7a1","ゥ",81,"А",5,"ЁЖ",4],["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],["c8a1","龰冈龱𧘇"],["c8cd","¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],["c8f5","ʃɐɛɔɵœøŋʊɪ"],["f9fe","■"],["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]]
  57117. /***/ }),
  57118. /* 106 */
  57119. /***/ (function(module, exports, __webpack_require__) {
  57120. "use strict";
  57121. var Buffer = __webpack_require__(2).Buffer,
  57122. Transform = __webpack_require__(31).Transform;
  57123. // == Exports ==================================================================
  57124. module.exports = function(iconv) {
  57125. // Additional Public API.
  57126. iconv.encodeStream = function encodeStream(encoding, options) {
  57127. return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);
  57128. }
  57129. iconv.decodeStream = function decodeStream(encoding, options) {
  57130. return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);
  57131. }
  57132. iconv.supportsStreams = true;
  57133. // Not published yet.
  57134. iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;
  57135. iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;
  57136. iconv._collect = IconvLiteDecoderStream.prototype.collect;
  57137. };
  57138. // == Encoder stream =======================================================
  57139. function IconvLiteEncoderStream(conv, options) {
  57140. this.conv = conv;
  57141. options = options || {};
  57142. options.decodeStrings = false; // We accept only strings, so we don't need to decode them.
  57143. Transform.call(this, options);
  57144. }
  57145. IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {
  57146. constructor: { value: IconvLiteEncoderStream }
  57147. });
  57148. IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {
  57149. if (typeof chunk != 'string')
  57150. return done(new Error("Iconv encoding stream needs strings as its input."));
  57151. try {
  57152. var res = this.conv.write(chunk);
  57153. if (res && res.length) this.push(res);
  57154. done();
  57155. }
  57156. catch (e) {
  57157. done(e);
  57158. }
  57159. }
  57160. IconvLiteEncoderStream.prototype._flush = function(done) {
  57161. try {
  57162. var res = this.conv.end();
  57163. if (res && res.length) this.push(res);
  57164. done();
  57165. }
  57166. catch (e) {
  57167. done(e);
  57168. }
  57169. }
  57170. IconvLiteEncoderStream.prototype.collect = function(cb) {
  57171. var chunks = [];
  57172. this.on('error', cb);
  57173. this.on('data', function(chunk) { chunks.push(chunk); });
  57174. this.on('end', function() {
  57175. cb(null, Buffer.concat(chunks));
  57176. });
  57177. return this;
  57178. }
  57179. // == Decoder stream =======================================================
  57180. function IconvLiteDecoderStream(conv, options) {
  57181. this.conv = conv;
  57182. options = options || {};
  57183. options.encoding = this.encoding = 'utf8'; // We output strings.
  57184. Transform.call(this, options);
  57185. }
  57186. IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {
  57187. constructor: { value: IconvLiteDecoderStream }
  57188. });
  57189. IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {
  57190. if (!Buffer.isBuffer(chunk))
  57191. return done(new Error("Iconv decoding stream needs buffers as its input."));
  57192. try {
  57193. var res = this.conv.write(chunk);
  57194. if (res && res.length) this.push(res, this.encoding);
  57195. done();
  57196. }
  57197. catch (e) {
  57198. done(e);
  57199. }
  57200. }
  57201. IconvLiteDecoderStream.prototype._flush = function(done) {
  57202. try {
  57203. var res = this.conv.end();
  57204. if (res && res.length) this.push(res, this.encoding);
  57205. done();
  57206. }
  57207. catch (e) {
  57208. done(e);
  57209. }
  57210. }
  57211. IconvLiteDecoderStream.prototype.collect = function(cb) {
  57212. var res = '';
  57213. this.on('error', cb);
  57214. this.on('data', function(chunk) { res += chunk; });
  57215. this.on('end', function() {
  57216. cb(null, res);
  57217. });
  57218. return this;
  57219. }
  57220. /***/ }),
  57221. /* 107 */
  57222. /***/ (function(module, exports, __webpack_require__) {
  57223. "use strict";
  57224. var Buffer = __webpack_require__(2).Buffer;
  57225. // == Extend Node primitives to use iconv-lite =================================
  57226. module.exports = function (iconv) {
  57227. var original = undefined; // Place to keep original methods.
  57228. // Node authors rewrote Buffer internals to make it compatible with
  57229. // Uint8Array and we cannot patch key functions since then.
  57230. iconv.supportsNodeEncodingsExtension = !(new Buffer(0) instanceof Uint8Array);
  57231. iconv.extendNodeEncodings = function extendNodeEncodings() {
  57232. if (original) return;
  57233. original = {};
  57234. if (!iconv.supportsNodeEncodingsExtension) {
  57235. console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node");
  57236. console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility");
  57237. return;
  57238. }
  57239. var nodeNativeEncodings = {
  57240. 'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true,
  57241. 'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,
  57242. };
  57243. Buffer.isNativeEncoding = function(enc) {
  57244. return enc && nodeNativeEncodings[enc.toLowerCase()];
  57245. }
  57246. // -- SlowBuffer -----------------------------------------------------------
  57247. var SlowBuffer = __webpack_require__(2).SlowBuffer;
  57248. original.SlowBufferToString = SlowBuffer.prototype.toString;
  57249. SlowBuffer.prototype.toString = function(encoding, start, end) {
  57250. encoding = String(encoding || 'utf8').toLowerCase();
  57251. // Use native conversion when possible
  57252. if (Buffer.isNativeEncoding(encoding))
  57253. return original.SlowBufferToString.call(this, encoding, start, end);
  57254. // Otherwise, use our decoding method.
  57255. if (typeof start == 'undefined') start = 0;
  57256. if (typeof end == 'undefined') end = this.length;
  57257. return iconv.decode(this.slice(start, end), encoding);
  57258. }
  57259. original.SlowBufferWrite = SlowBuffer.prototype.write;
  57260. SlowBuffer.prototype.write = function(string, offset, length, encoding) {
  57261. // Support both (string, offset, length, encoding)
  57262. // and the legacy (string, encoding, offset, length)
  57263. if (isFinite(offset)) {
  57264. if (!isFinite(length)) {
  57265. encoding = length;
  57266. length = undefined;
  57267. }
  57268. } else { // legacy
  57269. var swap = encoding;
  57270. encoding = offset;
  57271. offset = length;
  57272. length = swap;
  57273. }
  57274. offset = +offset || 0;
  57275. var remaining = this.length - offset;
  57276. if (!length) {
  57277. length = remaining;
  57278. } else {
  57279. length = +length;
  57280. if (length > remaining) {
  57281. length = remaining;
  57282. }
  57283. }
  57284. encoding = String(encoding || 'utf8').toLowerCase();
  57285. // Use native conversion when possible
  57286. if (Buffer.isNativeEncoding(encoding))
  57287. return original.SlowBufferWrite.call(this, string, offset, length, encoding);
  57288. if (string.length > 0 && (length < 0 || offset < 0))
  57289. throw new RangeError('attempt to write beyond buffer bounds');
  57290. // Otherwise, use our encoding method.
  57291. var buf = iconv.encode(string, encoding);
  57292. if (buf.length < length) length = buf.length;
  57293. buf.copy(this, offset, 0, length);
  57294. return length;
  57295. }
  57296. // -- Buffer ---------------------------------------------------------------
  57297. original.BufferIsEncoding = Buffer.isEncoding;
  57298. Buffer.isEncoding = function(encoding) {
  57299. return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);
  57300. }
  57301. original.BufferByteLength = Buffer.byteLength;
  57302. Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {
  57303. encoding = String(encoding || 'utf8').toLowerCase();
  57304. // Use native conversion when possible
  57305. if (Buffer.isNativeEncoding(encoding))
  57306. return original.BufferByteLength.call(this, str, encoding);
  57307. // Slow, I know, but we don't have a better way yet.
  57308. return iconv.encode(str, encoding).length;
  57309. }
  57310. original.BufferToString = Buffer.prototype.toString;
  57311. Buffer.prototype.toString = function(encoding, start, end) {
  57312. encoding = String(encoding || 'utf8').toLowerCase();
  57313. // Use native conversion when possible
  57314. if (Buffer.isNativeEncoding(encoding))
  57315. return original.BufferToString.call(this, encoding, start, end);
  57316. // Otherwise, use our decoding method.
  57317. if (typeof start == 'undefined') start = 0;
  57318. if (typeof end == 'undefined') end = this.length;
  57319. return iconv.decode(this.slice(start, end), encoding);
  57320. }
  57321. original.BufferWrite = Buffer.prototype.write;
  57322. Buffer.prototype.write = function(string, offset, length, encoding) {
  57323. var _offset = offset, _length = length, _encoding = encoding;
  57324. // Support both (string, offset, length, encoding)
  57325. // and the legacy (string, encoding, offset, length)
  57326. if (isFinite(offset)) {
  57327. if (!isFinite(length)) {
  57328. encoding = length;
  57329. length = undefined;
  57330. }
  57331. } else { // legacy
  57332. var swap = encoding;
  57333. encoding = offset;
  57334. offset = length;
  57335. length = swap;
  57336. }
  57337. encoding = String(encoding || 'utf8').toLowerCase();
  57338. // Use native conversion when possible
  57339. if (Buffer.isNativeEncoding(encoding))
  57340. return original.BufferWrite.call(this, string, _offset, _length, _encoding);
  57341. offset = +offset || 0;
  57342. var remaining = this.length - offset;
  57343. if (!length) {
  57344. length = remaining;
  57345. } else {
  57346. length = +length;
  57347. if (length > remaining) {
  57348. length = remaining;
  57349. }
  57350. }
  57351. if (string.length > 0 && (length < 0 || offset < 0))
  57352. throw new RangeError('attempt to write beyond buffer bounds');
  57353. // Otherwise, use our encoding method.
  57354. var buf = iconv.encode(string, encoding);
  57355. if (buf.length < length) length = buf.length;
  57356. buf.copy(this, offset, 0, length);
  57357. return length;
  57358. // TODO: Set _charsWritten.
  57359. }
  57360. // -- Readable -------------------------------------------------------------
  57361. if (iconv.supportsStreams) {
  57362. var Readable = __webpack_require__(31).Readable;
  57363. original.ReadableSetEncoding = Readable.prototype.setEncoding;
  57364. Readable.prototype.setEncoding = function setEncoding(enc, options) {
  57365. // Use our own decoder, it has the same interface.
  57366. // We cannot use original function as it doesn't handle BOM-s.
  57367. this._readableState.decoder = iconv.getDecoder(enc, options);
  57368. this._readableState.encoding = enc;
  57369. }
  57370. Readable.prototype.collect = iconv._collect;
  57371. }
  57372. }
  57373. // Remove iconv-lite Node primitive extensions.
  57374. iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {
  57375. if (!iconv.supportsNodeEncodingsExtension)
  57376. return;
  57377. if (!original)
  57378. throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.")
  57379. delete Buffer.isNativeEncoding;
  57380. var SlowBuffer = __webpack_require__(2).SlowBuffer;
  57381. SlowBuffer.prototype.toString = original.SlowBufferToString;
  57382. SlowBuffer.prototype.write = original.SlowBufferWrite;
  57383. Buffer.isEncoding = original.BufferIsEncoding;
  57384. Buffer.byteLength = original.BufferByteLength;
  57385. Buffer.prototype.toString = original.BufferToString;
  57386. Buffer.prototype.write = original.BufferWrite;
  57387. if (iconv.supportsStreams) {
  57388. var Readable = __webpack_require__(31).Readable;
  57389. Readable.prototype.setEncoding = original.ReadableSetEncoding;
  57390. delete Readable.prototype.collect;
  57391. }
  57392. original = undefined;
  57393. }
  57394. }
  57395. /***/ }),
  57396. /* 108 */
  57397. /***/ (function(module, exports, __webpack_require__) {
  57398. // Generated by CoffeeScript 1.7.1
  57399. (function() {
  57400. var ArrayT, NumberT, utils;
  57401. NumberT = __webpack_require__(109).Number;
  57402. utils = __webpack_require__(110);
  57403. ArrayT = (function() {
  57404. function ArrayT(type, length, lengthType) {
  57405. this.type = type;
  57406. this.length = length;
  57407. this.lengthType = lengthType != null ? lengthType : 'count';
  57408. }
  57409. ArrayT.prototype.decode = function(stream, parent) {
  57410. var ctx, i, length, pos, res, target, _i;
  57411. pos = stream.pos;
  57412. res = [];
  57413. ctx = parent;
  57414. if (this.length != null) {
  57415. length = utils.resolveLength(this.length, stream, parent);
  57416. }
  57417. if (this.length instanceof NumberT) {
  57418. Object.defineProperties(res, {
  57419. parent: {
  57420. value: parent
  57421. },
  57422. _startOffset: {
  57423. value: pos
  57424. },
  57425. _currentOffset: {
  57426. value: 0,
  57427. writable: true
  57428. },
  57429. _length: {
  57430. value: length
  57431. }
  57432. });
  57433. ctx = res;
  57434. }
  57435. if ((length == null) || this.lengthType === 'bytes') {
  57436. target = length != null ? stream.pos + length : (parent != null ? parent._length : void 0) ? parent._startOffset + parent._length : stream.length;
  57437. while (stream.pos < target) {
  57438. res.push(this.type.decode(stream, ctx));
  57439. }
  57440. } else {
  57441. for (i = _i = 0; _i < length; i = _i += 1) {
  57442. res.push(this.type.decode(stream, ctx));
  57443. }
  57444. }
  57445. return res;
  57446. };
  57447. ArrayT.prototype.size = function(array, ctx) {
  57448. var item, size, _i, _len;
  57449. if (!array) {
  57450. return this.type.size(null, ctx) * utils.resolveLength(this.length, null, ctx);
  57451. }
  57452. size = 0;
  57453. if (this.length instanceof NumberT) {
  57454. size += this.length.size();
  57455. ctx = {
  57456. parent: ctx
  57457. };
  57458. }
  57459. for (_i = 0, _len = array.length; _i < _len; _i++) {
  57460. item = array[_i];
  57461. size += this.type.size(item, ctx);
  57462. }
  57463. return size;
  57464. };
  57465. ArrayT.prototype.encode = function(stream, array, parent) {
  57466. var ctx, i, item, ptr, _i, _len;
  57467. ctx = parent;
  57468. if (this.length instanceof NumberT) {
  57469. ctx = {
  57470. pointers: [],
  57471. startOffset: stream.pos,
  57472. parent: parent
  57473. };
  57474. ctx.pointerOffset = stream.pos + this.size(array, ctx);
  57475. this.length.encode(stream, array.length);
  57476. }
  57477. for (_i = 0, _len = array.length; _i < _len; _i++) {
  57478. item = array[_i];
  57479. this.type.encode(stream, item, ctx);
  57480. }
  57481. if (this.length instanceof NumberT) {
  57482. i = 0;
  57483. while (i < ctx.pointers.length) {
  57484. ptr = ctx.pointers[i++];
  57485. ptr.type.encode(stream, ptr.val);
  57486. }
  57487. }
  57488. };
  57489. return ArrayT;
  57490. })();
  57491. module.exports = ArrayT;
  57492. }).call(this);
  57493. /***/ }),
  57494. /* 109 */
  57495. /***/ (function(module, exports, __webpack_require__) {
  57496. // Generated by CoffeeScript 1.7.1
  57497. (function() {
  57498. var DecodeStream, Fixed, NumberT,
  57499. __hasProp = {}.hasOwnProperty,
  57500. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
  57501. DecodeStream = __webpack_require__(86);
  57502. NumberT = (function() {
  57503. function NumberT(type, endian) {
  57504. this.type = type;
  57505. this.endian = endian != null ? endian : 'BE';
  57506. this.fn = this.type;
  57507. if (this.type[this.type.length - 1] !== '8') {
  57508. this.fn += this.endian;
  57509. }
  57510. }
  57511. NumberT.prototype.size = function() {
  57512. return DecodeStream.TYPES[this.type];
  57513. };
  57514. NumberT.prototype.decode = function(stream) {
  57515. return stream['read' + this.fn]();
  57516. };
  57517. NumberT.prototype.encode = function(stream, val) {
  57518. return stream['write' + this.fn](val);
  57519. };
  57520. return NumberT;
  57521. })();
  57522. exports.Number = NumberT;
  57523. exports.uint8 = new NumberT('UInt8');
  57524. exports.uint16be = exports.uint16 = new NumberT('UInt16', 'BE');
  57525. exports.uint16le = new NumberT('UInt16', 'LE');
  57526. exports.uint24be = exports.uint24 = new NumberT('UInt24', 'BE');
  57527. exports.uint24le = new NumberT('UInt24', 'LE');
  57528. exports.uint32be = exports.uint32 = new NumberT('UInt32', 'BE');
  57529. exports.uint32le = new NumberT('UInt32', 'LE');
  57530. exports.int8 = new NumberT('Int8');
  57531. exports.int16be = exports.int16 = new NumberT('Int16', 'BE');
  57532. exports.int16le = new NumberT('Int16', 'LE');
  57533. exports.int24be = exports.int24 = new NumberT('Int24', 'BE');
  57534. exports.int24le = new NumberT('Int24', 'LE');
  57535. exports.int32be = exports.int32 = new NumberT('Int32', 'BE');
  57536. exports.int32le = new NumberT('Int32', 'LE');
  57537. exports.floatbe = exports.float = new NumberT('Float', 'BE');
  57538. exports.floatle = new NumberT('Float', 'LE');
  57539. exports.doublebe = exports.double = new NumberT('Double', 'BE');
  57540. exports.doublele = new NumberT('Double', 'LE');
  57541. Fixed = (function(_super) {
  57542. __extends(Fixed, _super);
  57543. function Fixed(size, endian, fracBits) {
  57544. if (fracBits == null) {
  57545. fracBits = size >> 1;
  57546. }
  57547. Fixed.__super__.constructor.call(this, "Int" + size, endian);
  57548. this._point = 1 << fracBits;
  57549. }
  57550. Fixed.prototype.decode = function(stream) {
  57551. return Fixed.__super__.decode.call(this, stream) / this._point;
  57552. };
  57553. Fixed.prototype.encode = function(stream, val) {
  57554. return Fixed.__super__.encode.call(this, stream, val * this._point | 0);
  57555. };
  57556. return Fixed;
  57557. })(NumberT);
  57558. exports.Fixed = Fixed;
  57559. exports.fixed16be = exports.fixed16 = new Fixed(16, 'BE');
  57560. exports.fixed16le = new Fixed(16, 'LE');
  57561. exports.fixed32be = exports.fixed32 = new Fixed(32, 'BE');
  57562. exports.fixed32le = new Fixed(32, 'LE');
  57563. }).call(this);
  57564. /***/ }),
  57565. /* 110 */
  57566. /***/ (function(module, exports, __webpack_require__) {
  57567. // Generated by CoffeeScript 1.7.1
  57568. (function() {
  57569. var NumberT, PropertyDescriptor;
  57570. NumberT = __webpack_require__(109).Number;
  57571. exports.resolveLength = function(length, stream, parent) {
  57572. var res;
  57573. if (typeof length === 'number') {
  57574. res = length;
  57575. } else if (typeof length === 'function') {
  57576. res = length.call(parent, parent);
  57577. } else if (parent && typeof length === 'string') {
  57578. res = parent[length];
  57579. } else if (stream && length instanceof NumberT) {
  57580. res = length.decode(stream);
  57581. }
  57582. if (isNaN(res)) {
  57583. throw new Error('Not a fixed size');
  57584. }
  57585. return res;
  57586. };
  57587. PropertyDescriptor = (function() {
  57588. function PropertyDescriptor(opts) {
  57589. var key, val;
  57590. if (opts == null) {
  57591. opts = {};
  57592. }
  57593. this.enumerable = true;
  57594. this.configurable = true;
  57595. for (key in opts) {
  57596. val = opts[key];
  57597. this[key] = val;
  57598. }
  57599. }
  57600. return PropertyDescriptor;
  57601. })();
  57602. exports.PropertyDescriptor = PropertyDescriptor;
  57603. }).call(this);
  57604. /***/ }),
  57605. /* 111 */
  57606. /***/ (function(module, exports, __webpack_require__) {
  57607. // Generated by CoffeeScript 1.7.1
  57608. (function() {
  57609. var ArrayT, LazyArray, LazyArrayT, NumberT, inspect, utils,
  57610. __hasProp = {}.hasOwnProperty,
  57611. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
  57612. ArrayT = __webpack_require__(108);
  57613. NumberT = __webpack_require__(109).Number;
  57614. utils = __webpack_require__(110);
  57615. inspect = __webpack_require__(72).inspect;
  57616. LazyArrayT = (function(_super) {
  57617. __extends(LazyArrayT, _super);
  57618. function LazyArrayT() {
  57619. return LazyArrayT.__super__.constructor.apply(this, arguments);
  57620. }
  57621. LazyArrayT.prototype.decode = function(stream, parent) {
  57622. var length, pos, res;
  57623. pos = stream.pos;
  57624. length = utils.resolveLength(this.length, stream, parent);
  57625. if (this.length instanceof NumberT) {
  57626. parent = {
  57627. parent: parent,
  57628. _startOffset: pos,
  57629. _currentOffset: 0,
  57630. _length: length
  57631. };
  57632. }
  57633. res = new LazyArray(this.type, length, stream, parent);
  57634. stream.pos += length * this.type.size(null, parent);
  57635. return res;
  57636. };
  57637. LazyArrayT.prototype.size = function(val, ctx) {
  57638. if (val instanceof LazyArray) {
  57639. val = val.toArray();
  57640. }
  57641. return LazyArrayT.__super__.size.call(this, val, ctx);
  57642. };
  57643. LazyArrayT.prototype.encode = function(stream, val, ctx) {
  57644. if (val instanceof LazyArray) {
  57645. val = val.toArray();
  57646. }
  57647. return LazyArrayT.__super__.encode.call(this, stream, val, ctx);
  57648. };
  57649. return LazyArrayT;
  57650. })(ArrayT);
  57651. LazyArray = (function() {
  57652. function LazyArray(type, length, stream, ctx) {
  57653. this.type = type;
  57654. this.length = length;
  57655. this.stream = stream;
  57656. this.ctx = ctx;
  57657. this.base = this.stream.pos;
  57658. this.items = [];
  57659. }
  57660. LazyArray.prototype.get = function(index) {
  57661. var pos;
  57662. if (index < 0 || index >= this.length) {
  57663. return void 0;
  57664. }
  57665. if (this.items[index] == null) {
  57666. pos = this.stream.pos;
  57667. this.stream.pos = this.base + this.type.size(null, this.ctx) * index;
  57668. this.items[index] = this.type.decode(this.stream, this.ctx);
  57669. this.stream.pos = pos;
  57670. }
  57671. return this.items[index];
  57672. };
  57673. LazyArray.prototype.toArray = function() {
  57674. var i, _i, _ref, _results;
  57675. _results = [];
  57676. for (i = _i = 0, _ref = this.length; _i < _ref; i = _i += 1) {
  57677. _results.push(this.get(i));
  57678. }
  57679. return _results;
  57680. };
  57681. LazyArray.prototype.inspect = function() {
  57682. return inspect(this.toArray());
  57683. };
  57684. return LazyArray;
  57685. })();
  57686. module.exports = LazyArrayT;
  57687. }).call(this);
  57688. /***/ }),
  57689. /* 112 */
  57690. /***/ (function(module, exports) {
  57691. // Generated by CoffeeScript 1.7.1
  57692. (function() {
  57693. var Bitfield;
  57694. Bitfield = (function() {
  57695. function Bitfield(type, flags) {
  57696. this.type = type;
  57697. this.flags = flags != null ? flags : [];
  57698. }
  57699. Bitfield.prototype.decode = function(stream) {
  57700. var flag, i, res, val, _i, _len, _ref;
  57701. val = this.type.decode(stream);
  57702. res = {};
  57703. _ref = this.flags;
  57704. for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
  57705. flag = _ref[i];
  57706. if (flag != null) {
  57707. res[flag] = !!(val & (1 << i));
  57708. }
  57709. }
  57710. return res;
  57711. };
  57712. Bitfield.prototype.size = function() {
  57713. return this.type.size();
  57714. };
  57715. Bitfield.prototype.encode = function(stream, keys) {
  57716. var flag, i, val, _i, _len, _ref;
  57717. val = 0;
  57718. _ref = this.flags;
  57719. for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
  57720. flag = _ref[i];
  57721. if (flag != null) {
  57722. if (keys[flag]) {
  57723. val |= 1 << i;
  57724. }
  57725. }
  57726. }
  57727. return this.type.encode(stream, val);
  57728. };
  57729. return Bitfield;
  57730. })();
  57731. module.exports = Bitfield;
  57732. }).call(this);
  57733. /***/ }),
  57734. /* 113 */
  57735. /***/ (function(module, exports) {
  57736. // Generated by CoffeeScript 1.7.1
  57737. (function() {
  57738. var BooleanT;
  57739. BooleanT = (function() {
  57740. function BooleanT(type) {
  57741. this.type = type;
  57742. }
  57743. BooleanT.prototype.decode = function(stream, parent) {
  57744. return !!this.type.decode(stream, parent);
  57745. };
  57746. BooleanT.prototype.size = function(val, parent) {
  57747. return this.type.size(val, parent);
  57748. };
  57749. BooleanT.prototype.encode = function(stream, val, parent) {
  57750. return this.type.encode(stream, +val, parent);
  57751. };
  57752. return BooleanT;
  57753. })();
  57754. module.exports = BooleanT;
  57755. }).call(this);
  57756. /***/ }),
  57757. /* 114 */
  57758. /***/ (function(module, exports, __webpack_require__) {
  57759. // Generated by CoffeeScript 1.7.1
  57760. (function() {
  57761. var BufferT, NumberT, utils;
  57762. utils = __webpack_require__(110);
  57763. NumberT = __webpack_require__(109).Number;
  57764. BufferT = (function() {
  57765. function BufferT(length) {
  57766. this.length = length;
  57767. }
  57768. BufferT.prototype.decode = function(stream, parent) {
  57769. var length;
  57770. length = utils.resolveLength(this.length, stream, parent);
  57771. return stream.readBuffer(length);
  57772. };
  57773. BufferT.prototype.size = function(val, parent) {
  57774. if (!val) {
  57775. return utils.resolveLength(this.length, null, parent);
  57776. }
  57777. return val.length;
  57778. };
  57779. BufferT.prototype.encode = function(stream, buf, parent) {
  57780. if (this.length instanceof NumberT) {
  57781. this.length.encode(stream, buf.length);
  57782. }
  57783. return stream.writeBuffer(buf);
  57784. };
  57785. return BufferT;
  57786. })();
  57787. module.exports = BufferT;
  57788. }).call(this);
  57789. /***/ }),
  57790. /* 115 */
  57791. /***/ (function(module, exports) {
  57792. // Generated by CoffeeScript 1.7.1
  57793. (function() {
  57794. var Enum;
  57795. Enum = (function() {
  57796. function Enum(type, options) {
  57797. this.type = type;
  57798. this.options = options != null ? options : [];
  57799. }
  57800. Enum.prototype.decode = function(stream) {
  57801. var index;
  57802. index = this.type.decode(stream);
  57803. return this.options[index] || index;
  57804. };
  57805. Enum.prototype.size = function() {
  57806. return this.type.size();
  57807. };
  57808. Enum.prototype.encode = function(stream, val) {
  57809. var index;
  57810. index = this.options.indexOf(val);
  57811. if (index === -1) {
  57812. throw new Error("Unknown option in enum: " + val);
  57813. }
  57814. return this.type.encode(stream, index);
  57815. };
  57816. return Enum;
  57817. })();
  57818. module.exports = Enum;
  57819. }).call(this);
  57820. /***/ }),
  57821. /* 116 */
  57822. /***/ (function(module, exports) {
  57823. // Generated by CoffeeScript 1.7.1
  57824. (function() {
  57825. var Optional;
  57826. Optional = (function() {
  57827. function Optional(type, condition) {
  57828. this.type = type;
  57829. this.condition = condition != null ? condition : true;
  57830. }
  57831. Optional.prototype.decode = function(stream, parent) {
  57832. var condition;
  57833. condition = this.condition;
  57834. if (typeof condition === 'function') {
  57835. condition = condition.call(parent, parent);
  57836. }
  57837. if (condition) {
  57838. return this.type.decode(stream, parent);
  57839. }
  57840. };
  57841. Optional.prototype.size = function(val, parent) {
  57842. var condition;
  57843. condition = this.condition;
  57844. if (typeof condition === 'function') {
  57845. condition = condition.call(parent, parent);
  57846. }
  57847. if (condition) {
  57848. return this.type.size(val, parent);
  57849. } else {
  57850. return 0;
  57851. }
  57852. };
  57853. Optional.prototype.encode = function(stream, val, parent) {
  57854. var condition;
  57855. condition = this.condition;
  57856. if (typeof condition === 'function') {
  57857. condition = condition.call(parent, parent);
  57858. }
  57859. if (condition) {
  57860. return this.type.encode(stream, val, parent);
  57861. }
  57862. };
  57863. return Optional;
  57864. })();
  57865. module.exports = Optional;
  57866. }).call(this);
  57867. /***/ }),
  57868. /* 117 */
  57869. /***/ (function(module, exports, __webpack_require__) {
  57870. // Generated by CoffeeScript 1.7.1
  57871. (function() {
  57872. var Reserved, utils;
  57873. utils = __webpack_require__(110);
  57874. Reserved = (function() {
  57875. function Reserved(type, count) {
  57876. this.type = type;
  57877. this.count = count != null ? count : 1;
  57878. }
  57879. Reserved.prototype.decode = function(stream, parent) {
  57880. stream.pos += this.size(null, parent);
  57881. return void 0;
  57882. };
  57883. Reserved.prototype.size = function(data, parent) {
  57884. var count;
  57885. count = utils.resolveLength(this.count, null, parent);
  57886. return this.type.size() * count;
  57887. };
  57888. Reserved.prototype.encode = function(stream, val, parent) {
  57889. return stream.fill(0, this.size(val, parent));
  57890. };
  57891. return Reserved;
  57892. })();
  57893. module.exports = Reserved;
  57894. }).call(this);
  57895. /***/ }),
  57896. /* 118 */
  57897. /***/ (function(module, exports, __webpack_require__) {
  57898. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.7.1
  57899. (function() {
  57900. var NumberT, StringT, utils;
  57901. NumberT = __webpack_require__(109).Number;
  57902. utils = __webpack_require__(110);
  57903. StringT = (function() {
  57904. function StringT(length, encoding) {
  57905. this.length = length;
  57906. this.encoding = encoding != null ? encoding : 'ascii';
  57907. }
  57908. StringT.prototype.decode = function(stream, parent) {
  57909. var buffer, encoding, length, pos, string;
  57910. length = (function() {
  57911. if (this.length != null) {
  57912. return utils.resolveLength(this.length, stream, parent);
  57913. } else {
  57914. buffer = stream.buffer, length = stream.length, pos = stream.pos;
  57915. while (pos < length && buffer[pos] !== 0x00) {
  57916. ++pos;
  57917. }
  57918. return pos - stream.pos;
  57919. }
  57920. }).call(this);
  57921. encoding = this.encoding;
  57922. if (typeof encoding === 'function') {
  57923. encoding = encoding.call(parent, parent) || 'ascii';
  57924. }
  57925. string = stream.readString(length, encoding);
  57926. if ((this.length == null) && stream.pos < stream.length) {
  57927. stream.pos++;
  57928. }
  57929. return string;
  57930. };
  57931. StringT.prototype.size = function(val, parent) {
  57932. var encoding, size;
  57933. if (!val) {
  57934. return utils.resolveLength(this.length, null, parent);
  57935. }
  57936. encoding = this.encoding;
  57937. if (typeof encoding === 'function') {
  57938. encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii';
  57939. }
  57940. if (encoding === 'utf16be') {
  57941. encoding = 'utf16le';
  57942. }
  57943. size = Buffer.byteLength(val, encoding);
  57944. if (this.length instanceof NumberT) {
  57945. size += this.length.size();
  57946. }
  57947. if (this.length == null) {
  57948. size++;
  57949. }
  57950. return size;
  57951. };
  57952. StringT.prototype.encode = function(stream, val, parent) {
  57953. var encoding;
  57954. encoding = this.encoding;
  57955. if (typeof encoding === 'function') {
  57956. encoding = encoding.call(parent != null ? parent.val : void 0, parent != null ? parent.val : void 0) || 'ascii';
  57957. }
  57958. if (this.length instanceof NumberT) {
  57959. this.length.encode(stream, Buffer.byteLength(val, encoding));
  57960. }
  57961. stream.writeString(val, encoding);
  57962. if (this.length == null) {
  57963. return stream.writeUInt8(0x00);
  57964. }
  57965. };
  57966. return StringT;
  57967. })();
  57968. module.exports = StringT;
  57969. }).call(this);
  57970. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  57971. /***/ }),
  57972. /* 119 */
  57973. /***/ (function(module, exports, __webpack_require__) {
  57974. // Generated by CoffeeScript 1.7.1
  57975. (function() {
  57976. var Struct, utils;
  57977. utils = __webpack_require__(110);
  57978. Struct = (function() {
  57979. function Struct(fields) {
  57980. this.fields = fields != null ? fields : {};
  57981. }
  57982. Struct.prototype.decode = function(stream, parent, length) {
  57983. var res, _ref;
  57984. if (length == null) {
  57985. length = 0;
  57986. }
  57987. res = this._setup(stream, parent, length);
  57988. this._parseFields(stream, res, this.fields);
  57989. if ((_ref = this.process) != null) {
  57990. _ref.call(res, stream);
  57991. }
  57992. return res;
  57993. };
  57994. Struct.prototype._setup = function(stream, parent, length) {
  57995. var res;
  57996. res = {};
  57997. Object.defineProperties(res, {
  57998. parent: {
  57999. value: parent
  58000. },
  58001. _startOffset: {
  58002. value: stream.pos
  58003. },
  58004. _currentOffset: {
  58005. value: 0,
  58006. writable: true
  58007. },
  58008. _length: {
  58009. value: length
  58010. }
  58011. });
  58012. return res;
  58013. };
  58014. Struct.prototype._parseFields = function(stream, res, fields) {
  58015. var key, type, val;
  58016. for (key in fields) {
  58017. type = fields[key];
  58018. if (typeof type === 'function') {
  58019. val = type.call(res, res);
  58020. } else {
  58021. val = type.decode(stream, res);
  58022. }
  58023. if (val !== void 0) {
  58024. if (val instanceof utils.PropertyDescriptor) {
  58025. Object.defineProperty(res, key, val);
  58026. } else {
  58027. res[key] = val;
  58028. }
  58029. }
  58030. res._currentOffset = stream.pos - res._startOffset;
  58031. }
  58032. };
  58033. Struct.prototype.size = function(val, parent, includePointers) {
  58034. var ctx, key, size, type, _ref;
  58035. if (val == null) {
  58036. val = {};
  58037. }
  58038. if (includePointers == null) {
  58039. includePointers = true;
  58040. }
  58041. ctx = {
  58042. parent: parent,
  58043. val: val,
  58044. pointerSize: 0
  58045. };
  58046. size = 0;
  58047. _ref = this.fields;
  58048. for (key in _ref) {
  58049. type = _ref[key];
  58050. if (type.size != null) {
  58051. size += type.size(val[key], ctx);
  58052. }
  58053. }
  58054. if (includePointers) {
  58055. size += ctx.pointerSize;
  58056. }
  58057. return size;
  58058. };
  58059. Struct.prototype.encode = function(stream, val, parent) {
  58060. var ctx, i, key, ptr, type, _ref, _ref1;
  58061. if ((_ref = this.preEncode) != null) {
  58062. _ref.call(val, stream);
  58063. }
  58064. ctx = {
  58065. pointers: [],
  58066. startOffset: stream.pos,
  58067. parent: parent,
  58068. val: val,
  58069. pointerSize: 0
  58070. };
  58071. ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
  58072. _ref1 = this.fields;
  58073. for (key in _ref1) {
  58074. type = _ref1[key];
  58075. if (type.encode != null) {
  58076. type.encode(stream, val[key], ctx);
  58077. }
  58078. }
  58079. i = 0;
  58080. while (i < ctx.pointers.length) {
  58081. ptr = ctx.pointers[i++];
  58082. ptr.type.encode(stream, ptr.val, ptr.parent);
  58083. }
  58084. };
  58085. return Struct;
  58086. })();
  58087. module.exports = Struct;
  58088. }).call(this);
  58089. /***/ }),
  58090. /* 120 */
  58091. /***/ (function(module, exports, __webpack_require__) {
  58092. // Generated by CoffeeScript 1.7.1
  58093. (function() {
  58094. var Struct, VersionedStruct,
  58095. __hasProp = {}.hasOwnProperty,
  58096. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
  58097. Struct = __webpack_require__(119);
  58098. VersionedStruct = (function(_super) {
  58099. __extends(VersionedStruct, _super);
  58100. function VersionedStruct(type, versions) {
  58101. this.type = type;
  58102. this.versions = versions != null ? versions : {};
  58103. if (typeof this.type === 'string') {
  58104. this.versionGetter = new Function('parent', "return parent." + this.type);
  58105. this.versionSetter = new Function('parent', 'version', "return parent." + this.type + " = version");
  58106. }
  58107. }
  58108. VersionedStruct.prototype.decode = function(stream, parent, length) {
  58109. var fields, res, _ref;
  58110. if (length == null) {
  58111. length = 0;
  58112. }
  58113. res = this._setup(stream, parent, length);
  58114. if (typeof this.type === 'string') {
  58115. res.version = this.versionGetter(parent);
  58116. } else {
  58117. res.version = this.type.decode(stream);
  58118. }
  58119. if (this.versions.header) {
  58120. this._parseFields(stream, res, this.versions.header);
  58121. }
  58122. fields = this.versions[res.version];
  58123. if (fields == null) {
  58124. throw new Error("Unknown version " + res.version);
  58125. }
  58126. if (fields instanceof VersionedStruct) {
  58127. return fields.decode(stream, parent);
  58128. }
  58129. this._parseFields(stream, res, fields);
  58130. if ((_ref = this.process) != null) {
  58131. _ref.call(res, stream);
  58132. }
  58133. return res;
  58134. };
  58135. VersionedStruct.prototype.size = function(val, parent, includePointers) {
  58136. var ctx, fields, key, size, type, _ref;
  58137. if (includePointers == null) {
  58138. includePointers = true;
  58139. }
  58140. if (!val) {
  58141. throw new Error('Not a fixed size');
  58142. }
  58143. ctx = {
  58144. parent: parent,
  58145. val: val,
  58146. pointerSize: 0
  58147. };
  58148. size = 0;
  58149. if (typeof this.type !== 'string') {
  58150. size += this.type.size(val.version, ctx);
  58151. }
  58152. if (this.versions.header) {
  58153. _ref = this.versions.header;
  58154. for (key in _ref) {
  58155. type = _ref[key];
  58156. if (type.size != null) {
  58157. size += type.size(val[key], ctx);
  58158. }
  58159. }
  58160. }
  58161. fields = this.versions[val.version];
  58162. if (fields == null) {
  58163. throw new Error("Unknown version " + val.version);
  58164. }
  58165. for (key in fields) {
  58166. type = fields[key];
  58167. if (type.size != null) {
  58168. size += type.size(val[key], ctx);
  58169. }
  58170. }
  58171. if (includePointers) {
  58172. size += ctx.pointerSize;
  58173. }
  58174. return size;
  58175. };
  58176. VersionedStruct.prototype.encode = function(stream, val, parent) {
  58177. var ctx, fields, i, key, ptr, type, _ref, _ref1;
  58178. if ((_ref = this.preEncode) != null) {
  58179. _ref.call(val, stream);
  58180. }
  58181. ctx = {
  58182. pointers: [],
  58183. startOffset: stream.pos,
  58184. parent: parent,
  58185. val: val,
  58186. pointerSize: 0
  58187. };
  58188. ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
  58189. if (typeof this.type !== 'string') {
  58190. this.type.encode(stream, val.version);
  58191. }
  58192. if (this.versions.header) {
  58193. _ref1 = this.versions.header;
  58194. for (key in _ref1) {
  58195. type = _ref1[key];
  58196. if (type.encode != null) {
  58197. type.encode(stream, val[key], ctx);
  58198. }
  58199. }
  58200. }
  58201. fields = this.versions[val.version];
  58202. for (key in fields) {
  58203. type = fields[key];
  58204. if (type.encode != null) {
  58205. type.encode(stream, val[key], ctx);
  58206. }
  58207. }
  58208. i = 0;
  58209. while (i < ctx.pointers.length) {
  58210. ptr = ctx.pointers[i++];
  58211. ptr.type.encode(stream, ptr.val, ptr.parent);
  58212. }
  58213. };
  58214. return VersionedStruct;
  58215. })(Struct);
  58216. module.exports = VersionedStruct;
  58217. }).call(this);
  58218. /***/ }),
  58219. /* 121 */
  58220. /***/ (function(module, exports, __webpack_require__) {
  58221. // Generated by CoffeeScript 1.7.1
  58222. (function() {
  58223. var Pointer, VoidPointer, utils;
  58224. utils = __webpack_require__(110);
  58225. Pointer = (function() {
  58226. function Pointer(offsetType, type, options) {
  58227. var _base, _base1, _base2, _base3;
  58228. this.offsetType = offsetType;
  58229. this.type = type;
  58230. this.options = options != null ? options : {};
  58231. if (this.type === 'void') {
  58232. this.type = null;
  58233. }
  58234. if ((_base = this.options).type == null) {
  58235. _base.type = 'local';
  58236. }
  58237. if ((_base1 = this.options).allowNull == null) {
  58238. _base1.allowNull = true;
  58239. }
  58240. if ((_base2 = this.options).nullValue == null) {
  58241. _base2.nullValue = 0;
  58242. }
  58243. if ((_base3 = this.options).lazy == null) {
  58244. _base3.lazy = false;
  58245. }
  58246. if (this.options.relativeTo) {
  58247. this.relativeToGetter = new Function('ctx', "return ctx." + this.options.relativeTo);
  58248. }
  58249. }
  58250. Pointer.prototype.decode = function(stream, ctx) {
  58251. var c, decodeValue, offset, ptr, relative, val;
  58252. offset = this.offsetType.decode(stream, ctx);
  58253. if (offset === this.options.nullValue && this.options.allowNull) {
  58254. return null;
  58255. }
  58256. relative = (function() {
  58257. switch (this.options.type) {
  58258. case 'local':
  58259. return ctx._startOffset;
  58260. case 'immediate':
  58261. return stream.pos - this.offsetType.size();
  58262. case 'parent':
  58263. return ctx.parent._startOffset;
  58264. default:
  58265. c = ctx;
  58266. while (c.parent) {
  58267. c = c.parent;
  58268. }
  58269. return c._startOffset || 0;
  58270. }
  58271. }).call(this);
  58272. if (this.options.relativeTo) {
  58273. relative += this.relativeToGetter(ctx);
  58274. }
  58275. ptr = offset + relative;
  58276. if (this.type != null) {
  58277. val = null;
  58278. decodeValue = (function(_this) {
  58279. return function() {
  58280. var pos;
  58281. if (val != null) {
  58282. return val;
  58283. }
  58284. pos = stream.pos;
  58285. stream.pos = ptr;
  58286. val = _this.type.decode(stream, ctx);
  58287. stream.pos = pos;
  58288. return val;
  58289. };
  58290. })(this);
  58291. if (this.options.lazy) {
  58292. return new utils.PropertyDescriptor({
  58293. get: decodeValue
  58294. });
  58295. }
  58296. return decodeValue();
  58297. } else {
  58298. return ptr;
  58299. }
  58300. };
  58301. Pointer.prototype.size = function(val, ctx) {
  58302. var parent, type;
  58303. parent = ctx;
  58304. switch (this.options.type) {
  58305. case 'local':
  58306. case 'immediate':
  58307. break;
  58308. case 'parent':
  58309. ctx = ctx.parent;
  58310. break;
  58311. default:
  58312. while (ctx.parent) {
  58313. ctx = ctx.parent;
  58314. }
  58315. }
  58316. type = this.type;
  58317. if (type == null) {
  58318. if (!(val instanceof VoidPointer)) {
  58319. throw new Error("Must be a VoidPointer");
  58320. }
  58321. type = val.type;
  58322. val = val.value;
  58323. }
  58324. if (val && ctx) {
  58325. ctx.pointerSize += type.size(val, parent);
  58326. }
  58327. return this.offsetType.size();
  58328. };
  58329. Pointer.prototype.encode = function(stream, val, ctx) {
  58330. var parent, relative, type;
  58331. parent = ctx;
  58332. if (val == null) {
  58333. this.offsetType.encode(stream, this.options.nullValue);
  58334. return;
  58335. }
  58336. switch (this.options.type) {
  58337. case 'local':
  58338. relative = ctx.startOffset;
  58339. break;
  58340. case 'immediate':
  58341. relative = stream.pos + this.offsetType.size(val, parent);
  58342. break;
  58343. case 'parent':
  58344. ctx = ctx.parent;
  58345. relative = ctx.startOffset;
  58346. break;
  58347. default:
  58348. relative = 0;
  58349. while (ctx.parent) {
  58350. ctx = ctx.parent;
  58351. }
  58352. }
  58353. if (this.options.relativeTo) {
  58354. relative += this.relativeToGetter(parent.val);
  58355. }
  58356. this.offsetType.encode(stream, ctx.pointerOffset - relative);
  58357. type = this.type;
  58358. if (type == null) {
  58359. if (!(val instanceof VoidPointer)) {
  58360. throw new Error("Must be a VoidPointer");
  58361. }
  58362. type = val.type;
  58363. val = val.value;
  58364. }
  58365. ctx.pointers.push({
  58366. type: type,
  58367. val: val,
  58368. parent: parent
  58369. });
  58370. return ctx.pointerOffset += type.size(val, parent);
  58371. };
  58372. return Pointer;
  58373. })();
  58374. VoidPointer = (function() {
  58375. function VoidPointer(type, value) {
  58376. this.type = type;
  58377. this.value = value;
  58378. }
  58379. return VoidPointer;
  58380. })();
  58381. exports.Pointer = Pointer;
  58382. exports.VoidPointer = VoidPointer;
  58383. }).call(this);
  58384. /***/ }),
  58385. /* 122 */
  58386. /***/ (function(module, exports, __webpack_require__) {
  58387. module.exports = { "default": __webpack_require__(123), __esModule: true };
  58388. /***/ }),
  58389. /* 123 */
  58390. /***/ (function(module, exports, __webpack_require__) {
  58391. __webpack_require__(124);
  58392. var $Object = __webpack_require__(142).Object;
  58393. module.exports = function getOwnPropertyDescriptor(it, key){
  58394. return $Object.getOwnPropertyDescriptor(it, key);
  58395. };
  58396. /***/ }),
  58397. /* 124 */
  58398. /***/ (function(module, exports, __webpack_require__) {
  58399. // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  58400. var toIObject = __webpack_require__(125)
  58401. , $getOwnPropertyDescriptor = __webpack_require__(129).f;
  58402. __webpack_require__(140)('getOwnPropertyDescriptor', function(){
  58403. return function getOwnPropertyDescriptor(it, key){
  58404. return $getOwnPropertyDescriptor(toIObject(it), key);
  58405. };
  58406. });
  58407. /***/ }),
  58408. /* 125 */
  58409. /***/ (function(module, exports, __webpack_require__) {
  58410. // to indexed object, toObject with fallback for non-array-like ES3 strings
  58411. var IObject = __webpack_require__(126)
  58412. , defined = __webpack_require__(128);
  58413. module.exports = function(it){
  58414. return IObject(defined(it));
  58415. };
  58416. /***/ }),
  58417. /* 126 */
  58418. /***/ (function(module, exports, __webpack_require__) {
  58419. // fallback for non-array-like ES3 and non-enumerable old V8 strings
  58420. var cof = __webpack_require__(127);
  58421. module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
  58422. return cof(it) == 'String' ? it.split('') : Object(it);
  58423. };
  58424. /***/ }),
  58425. /* 127 */
  58426. /***/ (function(module, exports) {
  58427. var toString = {}.toString;
  58428. module.exports = function(it){
  58429. return toString.call(it).slice(8, -1);
  58430. };
  58431. /***/ }),
  58432. /* 128 */
  58433. /***/ (function(module, exports) {
  58434. // 7.2.1 RequireObjectCoercible(argument)
  58435. module.exports = function(it){
  58436. if(it == undefined)throw TypeError("Can't call method on " + it);
  58437. return it;
  58438. };
  58439. /***/ }),
  58440. /* 129 */
  58441. /***/ (function(module, exports, __webpack_require__) {
  58442. var pIE = __webpack_require__(130)
  58443. , createDesc = __webpack_require__(131)
  58444. , toIObject = __webpack_require__(125)
  58445. , toPrimitive = __webpack_require__(132)
  58446. , has = __webpack_require__(134)
  58447. , IE8_DOM_DEFINE = __webpack_require__(135)
  58448. , gOPD = Object.getOwnPropertyDescriptor;
  58449. exports.f = __webpack_require__(136) ? gOPD : function getOwnPropertyDescriptor(O, P){
  58450. O = toIObject(O);
  58451. P = toPrimitive(P, true);
  58452. if(IE8_DOM_DEFINE)try {
  58453. return gOPD(O, P);
  58454. } catch(e){ /* empty */ }
  58455. if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);
  58456. };
  58457. /***/ }),
  58458. /* 130 */
  58459. /***/ (function(module, exports) {
  58460. exports.f = {}.propertyIsEnumerable;
  58461. /***/ }),
  58462. /* 131 */
  58463. /***/ (function(module, exports) {
  58464. module.exports = function(bitmap, value){
  58465. return {
  58466. enumerable : !(bitmap & 1),
  58467. configurable: !(bitmap & 2),
  58468. writable : !(bitmap & 4),
  58469. value : value
  58470. };
  58471. };
  58472. /***/ }),
  58473. /* 132 */
  58474. /***/ (function(module, exports, __webpack_require__) {
  58475. // 7.1.1 ToPrimitive(input [, PreferredType])
  58476. var isObject = __webpack_require__(133);
  58477. // instead of the ES6 spec version, we didn't implement @@toPrimitive case
  58478. // and the second argument - flag - preferred type is a string
  58479. module.exports = function(it, S){
  58480. if(!isObject(it))return it;
  58481. var fn, val;
  58482. if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
  58483. if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
  58484. if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
  58485. throw TypeError("Can't convert object to primitive value");
  58486. };
  58487. /***/ }),
  58488. /* 133 */
  58489. /***/ (function(module, exports) {
  58490. module.exports = function(it){
  58491. return typeof it === 'object' ? it !== null : typeof it === 'function';
  58492. };
  58493. /***/ }),
  58494. /* 134 */
  58495. /***/ (function(module, exports) {
  58496. var hasOwnProperty = {}.hasOwnProperty;
  58497. module.exports = function(it, key){
  58498. return hasOwnProperty.call(it, key);
  58499. };
  58500. /***/ }),
  58501. /* 135 */
  58502. /***/ (function(module, exports, __webpack_require__) {
  58503. module.exports = !__webpack_require__(136) && !__webpack_require__(137)(function(){
  58504. return Object.defineProperty(__webpack_require__(138)('div'), 'a', {get: function(){ return 7; }}).a != 7;
  58505. });
  58506. /***/ }),
  58507. /* 136 */
  58508. /***/ (function(module, exports, __webpack_require__) {
  58509. // Thank's IE8 for his funny defineProperty
  58510. module.exports = !__webpack_require__(137)(function(){
  58511. return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
  58512. });
  58513. /***/ }),
  58514. /* 137 */
  58515. /***/ (function(module, exports) {
  58516. module.exports = function(exec){
  58517. try {
  58518. return !!exec();
  58519. } catch(e){
  58520. return true;
  58521. }
  58522. };
  58523. /***/ }),
  58524. /* 138 */
  58525. /***/ (function(module, exports, __webpack_require__) {
  58526. var isObject = __webpack_require__(133)
  58527. , document = __webpack_require__(139).document
  58528. // in old IE typeof document.createElement is 'object'
  58529. , is = isObject(document) && isObject(document.createElement);
  58530. module.exports = function(it){
  58531. return is ? document.createElement(it) : {};
  58532. };
  58533. /***/ }),
  58534. /* 139 */
  58535. /***/ (function(module, exports) {
  58536. // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
  58537. var global = module.exports = typeof window != 'undefined' && window.Math == Math
  58538. ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
  58539. if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
  58540. /***/ }),
  58541. /* 140 */
  58542. /***/ (function(module, exports, __webpack_require__) {
  58543. // most Object methods by ES6 should accept primitives
  58544. var $export = __webpack_require__(141)
  58545. , core = __webpack_require__(142)
  58546. , fails = __webpack_require__(137);
  58547. module.exports = function(KEY, exec){
  58548. var fn = (core.Object || {})[KEY] || Object[KEY]
  58549. , exp = {};
  58550. exp[KEY] = exec(fn);
  58551. $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
  58552. };
  58553. /***/ }),
  58554. /* 141 */
  58555. /***/ (function(module, exports, __webpack_require__) {
  58556. var global = __webpack_require__(139)
  58557. , core = __webpack_require__(142)
  58558. , ctx = __webpack_require__(143)
  58559. , hide = __webpack_require__(145)
  58560. , PROTOTYPE = 'prototype';
  58561. var $export = function(type, name, source){
  58562. var IS_FORCED = type & $export.F
  58563. , IS_GLOBAL = type & $export.G
  58564. , IS_STATIC = type & $export.S
  58565. , IS_PROTO = type & $export.P
  58566. , IS_BIND = type & $export.B
  58567. , IS_WRAP = type & $export.W
  58568. , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
  58569. , expProto = exports[PROTOTYPE]
  58570. , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
  58571. , key, own, out;
  58572. if(IS_GLOBAL)source = name;
  58573. for(key in source){
  58574. // contains in native
  58575. own = !IS_FORCED && target && target[key] !== undefined;
  58576. if(own && key in exports)continue;
  58577. // export native or passed
  58578. out = own ? target[key] : source[key];
  58579. // prevent global pollution for namespaces
  58580. exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
  58581. // bind timers to global for call from export context
  58582. : IS_BIND && own ? ctx(out, global)
  58583. // wrap global constructors for prevent change them in library
  58584. : IS_WRAP && target[key] == out ? (function(C){
  58585. var F = function(a, b, c){
  58586. if(this instanceof C){
  58587. switch(arguments.length){
  58588. case 0: return new C;
  58589. case 1: return new C(a);
  58590. case 2: return new C(a, b);
  58591. } return new C(a, b, c);
  58592. } return C.apply(this, arguments);
  58593. };
  58594. F[PROTOTYPE] = C[PROTOTYPE];
  58595. return F;
  58596. // make static versions for prototype methods
  58597. })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
  58598. // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
  58599. if(IS_PROTO){
  58600. (exports.virtual || (exports.virtual = {}))[key] = out;
  58601. // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
  58602. if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
  58603. }
  58604. }
  58605. };
  58606. // type bitmap
  58607. $export.F = 1; // forced
  58608. $export.G = 2; // global
  58609. $export.S = 4; // static
  58610. $export.P = 8; // proto
  58611. $export.B = 16; // bind
  58612. $export.W = 32; // wrap
  58613. $export.U = 64; // safe
  58614. $export.R = 128; // real proto method for `library`
  58615. module.exports = $export;
  58616. /***/ }),
  58617. /* 142 */
  58618. /***/ (function(module, exports) {
  58619. var core = module.exports = {version: '2.4.0'};
  58620. if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
  58621. /***/ }),
  58622. /* 143 */
  58623. /***/ (function(module, exports, __webpack_require__) {
  58624. // optional / simple context binding
  58625. var aFunction = __webpack_require__(144);
  58626. module.exports = function(fn, that, length){
  58627. aFunction(fn);
  58628. if(that === undefined)return fn;
  58629. switch(length){
  58630. case 1: return function(a){
  58631. return fn.call(that, a);
  58632. };
  58633. case 2: return function(a, b){
  58634. return fn.call(that, a, b);
  58635. };
  58636. case 3: return function(a, b, c){
  58637. return fn.call(that, a, b, c);
  58638. };
  58639. }
  58640. return function(/* ...args */){
  58641. return fn.apply(that, arguments);
  58642. };
  58643. };
  58644. /***/ }),
  58645. /* 144 */
  58646. /***/ (function(module, exports) {
  58647. module.exports = function(it){
  58648. if(typeof it != 'function')throw TypeError(it + ' is not a function!');
  58649. return it;
  58650. };
  58651. /***/ }),
  58652. /* 145 */
  58653. /***/ (function(module, exports, __webpack_require__) {
  58654. var dP = __webpack_require__(146)
  58655. , createDesc = __webpack_require__(131);
  58656. module.exports = __webpack_require__(136) ? function(object, key, value){
  58657. return dP.f(object, key, createDesc(1, value));
  58658. } : function(object, key, value){
  58659. object[key] = value;
  58660. return object;
  58661. };
  58662. /***/ }),
  58663. /* 146 */
  58664. /***/ (function(module, exports, __webpack_require__) {
  58665. var anObject = __webpack_require__(147)
  58666. , IE8_DOM_DEFINE = __webpack_require__(135)
  58667. , toPrimitive = __webpack_require__(132)
  58668. , dP = Object.defineProperty;
  58669. exports.f = __webpack_require__(136) ? Object.defineProperty : function defineProperty(O, P, Attributes){
  58670. anObject(O);
  58671. P = toPrimitive(P, true);
  58672. anObject(Attributes);
  58673. if(IE8_DOM_DEFINE)try {
  58674. return dP(O, P, Attributes);
  58675. } catch(e){ /* empty */ }
  58676. if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
  58677. if('value' in Attributes)O[P] = Attributes.value;
  58678. return O;
  58679. };
  58680. /***/ }),
  58681. /* 147 */
  58682. /***/ (function(module, exports, __webpack_require__) {
  58683. var isObject = __webpack_require__(133);
  58684. module.exports = function(it){
  58685. if(!isObject(it))throw TypeError(it + ' is not an object!');
  58686. return it;
  58687. };
  58688. /***/ }),
  58689. /* 148 */
  58690. /***/ (function(module, exports, __webpack_require__) {
  58691. module.exports = { "default": __webpack_require__(149), __esModule: true };
  58692. /***/ }),
  58693. /* 149 */
  58694. /***/ (function(module, exports, __webpack_require__) {
  58695. __webpack_require__(150);
  58696. __webpack_require__(176);
  58697. module.exports = __webpack_require__(178);
  58698. /***/ }),
  58699. /* 150 */
  58700. /***/ (function(module, exports, __webpack_require__) {
  58701. __webpack_require__(151);
  58702. var global = __webpack_require__(139)
  58703. , hide = __webpack_require__(145)
  58704. , Iterators = __webpack_require__(154)
  58705. , TO_STRING_TAG = __webpack_require__(173)('toStringTag');
  58706. for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
  58707. var NAME = collections[i]
  58708. , Collection = global[NAME]
  58709. , proto = Collection && Collection.prototype;
  58710. if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);
  58711. Iterators[NAME] = Iterators.Array;
  58712. }
  58713. /***/ }),
  58714. /* 151 */
  58715. /***/ (function(module, exports, __webpack_require__) {
  58716. 'use strict';
  58717. var addToUnscopables = __webpack_require__(152)
  58718. , step = __webpack_require__(153)
  58719. , Iterators = __webpack_require__(154)
  58720. , toIObject = __webpack_require__(125);
  58721. // 22.1.3.4 Array.prototype.entries()
  58722. // 22.1.3.13 Array.prototype.keys()
  58723. // 22.1.3.29 Array.prototype.values()
  58724. // 22.1.3.30 Array.prototype[@@iterator]()
  58725. module.exports = __webpack_require__(155)(Array, 'Array', function(iterated, kind){
  58726. this._t = toIObject(iterated); // target
  58727. this._i = 0; // next index
  58728. this._k = kind; // kind
  58729. // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
  58730. }, function(){
  58731. var O = this._t
  58732. , kind = this._k
  58733. , index = this._i++;
  58734. if(!O || index >= O.length){
  58735. this._t = undefined;
  58736. return step(1);
  58737. }
  58738. if(kind == 'keys' )return step(0, index);
  58739. if(kind == 'values')return step(0, O[index]);
  58740. return step(0, [index, O[index]]);
  58741. }, 'values');
  58742. // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
  58743. Iterators.Arguments = Iterators.Array;
  58744. addToUnscopables('keys');
  58745. addToUnscopables('values');
  58746. addToUnscopables('entries');
  58747. /***/ }),
  58748. /* 152 */
  58749. /***/ (function(module, exports) {
  58750. module.exports = function(){ /* empty */ };
  58751. /***/ }),
  58752. /* 153 */
  58753. /***/ (function(module, exports) {
  58754. module.exports = function(done, value){
  58755. return {value: value, done: !!done};
  58756. };
  58757. /***/ }),
  58758. /* 154 */
  58759. /***/ (function(module, exports) {
  58760. module.exports = {};
  58761. /***/ }),
  58762. /* 155 */
  58763. /***/ (function(module, exports, __webpack_require__) {
  58764. 'use strict';
  58765. var LIBRARY = __webpack_require__(156)
  58766. , $export = __webpack_require__(141)
  58767. , redefine = __webpack_require__(157)
  58768. , hide = __webpack_require__(145)
  58769. , has = __webpack_require__(134)
  58770. , Iterators = __webpack_require__(154)
  58771. , $iterCreate = __webpack_require__(158)
  58772. , setToStringTag = __webpack_require__(172)
  58773. , getPrototypeOf = __webpack_require__(174)
  58774. , ITERATOR = __webpack_require__(173)('iterator')
  58775. , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
  58776. , FF_ITERATOR = '@@iterator'
  58777. , KEYS = 'keys'
  58778. , VALUES = 'values';
  58779. var returnThis = function(){ return this; };
  58780. module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
  58781. $iterCreate(Constructor, NAME, next);
  58782. var getMethod = function(kind){
  58783. if(!BUGGY && kind in proto)return proto[kind];
  58784. switch(kind){
  58785. case KEYS: return function keys(){ return new Constructor(this, kind); };
  58786. case VALUES: return function values(){ return new Constructor(this, kind); };
  58787. } return function entries(){ return new Constructor(this, kind); };
  58788. };
  58789. var TAG = NAME + ' Iterator'
  58790. , DEF_VALUES = DEFAULT == VALUES
  58791. , VALUES_BUG = false
  58792. , proto = Base.prototype
  58793. , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
  58794. , $default = $native || getMethod(DEFAULT)
  58795. , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
  58796. , $anyNative = NAME == 'Array' ? proto.entries || $native : $native
  58797. , methods, key, IteratorPrototype;
  58798. // Fix native
  58799. if($anyNative){
  58800. IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
  58801. if(IteratorPrototype !== Object.prototype){
  58802. // Set @@toStringTag to native iterators
  58803. setToStringTag(IteratorPrototype, TAG, true);
  58804. // fix for some old engines
  58805. if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);
  58806. }
  58807. }
  58808. // fix Array#{values, @@iterator}.name in V8 / FF
  58809. if(DEF_VALUES && $native && $native.name !== VALUES){
  58810. VALUES_BUG = true;
  58811. $default = function values(){ return $native.call(this); };
  58812. }
  58813. // Define iterator
  58814. if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
  58815. hide(proto, ITERATOR, $default);
  58816. }
  58817. // Plug for library
  58818. Iterators[NAME] = $default;
  58819. Iterators[TAG] = returnThis;
  58820. if(DEFAULT){
  58821. methods = {
  58822. values: DEF_VALUES ? $default : getMethod(VALUES),
  58823. keys: IS_SET ? $default : getMethod(KEYS),
  58824. entries: $entries
  58825. };
  58826. if(FORCED)for(key in methods){
  58827. if(!(key in proto))redefine(proto, key, methods[key]);
  58828. } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  58829. }
  58830. return methods;
  58831. };
  58832. /***/ }),
  58833. /* 156 */
  58834. /***/ (function(module, exports) {
  58835. module.exports = true;
  58836. /***/ }),
  58837. /* 157 */
  58838. /***/ (function(module, exports, __webpack_require__) {
  58839. module.exports = __webpack_require__(145);
  58840. /***/ }),
  58841. /* 158 */
  58842. /***/ (function(module, exports, __webpack_require__) {
  58843. 'use strict';
  58844. var create = __webpack_require__(159)
  58845. , descriptor = __webpack_require__(131)
  58846. , setToStringTag = __webpack_require__(172)
  58847. , IteratorPrototype = {};
  58848. // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
  58849. __webpack_require__(145)(IteratorPrototype, __webpack_require__(173)('iterator'), function(){ return this; });
  58850. module.exports = function(Constructor, NAME, next){
  58851. Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});
  58852. setToStringTag(Constructor, NAME + ' Iterator');
  58853. };
  58854. /***/ }),
  58855. /* 159 */
  58856. /***/ (function(module, exports, __webpack_require__) {
  58857. // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
  58858. var anObject = __webpack_require__(147)
  58859. , dPs = __webpack_require__(160)
  58860. , enumBugKeys = __webpack_require__(170)
  58861. , IE_PROTO = __webpack_require__(167)('IE_PROTO')
  58862. , Empty = function(){ /* empty */ }
  58863. , PROTOTYPE = 'prototype';
  58864. // Create object with fake `null` prototype: use iframe Object with cleared prototype
  58865. var createDict = function(){
  58866. // Thrash, waste and sodomy: IE GC bug
  58867. var iframe = __webpack_require__(138)('iframe')
  58868. , i = enumBugKeys.length
  58869. , lt = '<'
  58870. , gt = '>'
  58871. , iframeDocument;
  58872. iframe.style.display = 'none';
  58873. __webpack_require__(171).appendChild(iframe);
  58874. iframe.src = 'javascript:'; // eslint-disable-line no-script-url
  58875. // createDict = iframe.contentWindow.Object;
  58876. // html.removeChild(iframe);
  58877. iframeDocument = iframe.contentWindow.document;
  58878. iframeDocument.open();
  58879. iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  58880. iframeDocument.close();
  58881. createDict = iframeDocument.F;
  58882. while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];
  58883. return createDict();
  58884. };
  58885. module.exports = Object.create || function create(O, Properties){
  58886. var result;
  58887. if(O !== null){
  58888. Empty[PROTOTYPE] = anObject(O);
  58889. result = new Empty;
  58890. Empty[PROTOTYPE] = null;
  58891. // add "__proto__" for Object.getPrototypeOf polyfill
  58892. result[IE_PROTO] = O;
  58893. } else result = createDict();
  58894. return Properties === undefined ? result : dPs(result, Properties);
  58895. };
  58896. /***/ }),
  58897. /* 160 */
  58898. /***/ (function(module, exports, __webpack_require__) {
  58899. var dP = __webpack_require__(146)
  58900. , anObject = __webpack_require__(147)
  58901. , getKeys = __webpack_require__(161);
  58902. module.exports = __webpack_require__(136) ? Object.defineProperties : function defineProperties(O, Properties){
  58903. anObject(O);
  58904. var keys = getKeys(Properties)
  58905. , length = keys.length
  58906. , i = 0
  58907. , P;
  58908. while(length > i)dP.f(O, P = keys[i++], Properties[P]);
  58909. return O;
  58910. };
  58911. /***/ }),
  58912. /* 161 */
  58913. /***/ (function(module, exports, __webpack_require__) {
  58914. // 19.1.2.14 / 15.2.3.14 Object.keys(O)
  58915. var $keys = __webpack_require__(162)
  58916. , enumBugKeys = __webpack_require__(170);
  58917. module.exports = Object.keys || function keys(O){
  58918. return $keys(O, enumBugKeys);
  58919. };
  58920. /***/ }),
  58921. /* 162 */
  58922. /***/ (function(module, exports, __webpack_require__) {
  58923. var has = __webpack_require__(134)
  58924. , toIObject = __webpack_require__(125)
  58925. , arrayIndexOf = __webpack_require__(163)(false)
  58926. , IE_PROTO = __webpack_require__(167)('IE_PROTO');
  58927. module.exports = function(object, names){
  58928. var O = toIObject(object)
  58929. , i = 0
  58930. , result = []
  58931. , key;
  58932. for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
  58933. // Don't enum bug & hidden keys
  58934. while(names.length > i)if(has(O, key = names[i++])){
  58935. ~arrayIndexOf(result, key) || result.push(key);
  58936. }
  58937. return result;
  58938. };
  58939. /***/ }),
  58940. /* 163 */
  58941. /***/ (function(module, exports, __webpack_require__) {
  58942. // false -> Array#indexOf
  58943. // true -> Array#includes
  58944. var toIObject = __webpack_require__(125)
  58945. , toLength = __webpack_require__(164)
  58946. , toIndex = __webpack_require__(166);
  58947. module.exports = function(IS_INCLUDES){
  58948. return function($this, el, fromIndex){
  58949. var O = toIObject($this)
  58950. , length = toLength(O.length)
  58951. , index = toIndex(fromIndex, length)
  58952. , value;
  58953. // Array#includes uses SameValueZero equality algorithm
  58954. if(IS_INCLUDES && el != el)while(length > index){
  58955. value = O[index++];
  58956. if(value != value)return true;
  58957. // Array#toIndex ignores holes, Array#includes - not
  58958. } else for(;length > index; index++)if(IS_INCLUDES || index in O){
  58959. if(O[index] === el)return IS_INCLUDES || index || 0;
  58960. } return !IS_INCLUDES && -1;
  58961. };
  58962. };
  58963. /***/ }),
  58964. /* 164 */
  58965. /***/ (function(module, exports, __webpack_require__) {
  58966. // 7.1.15 ToLength
  58967. var toInteger = __webpack_require__(165)
  58968. , min = Math.min;
  58969. module.exports = function(it){
  58970. return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
  58971. };
  58972. /***/ }),
  58973. /* 165 */
  58974. /***/ (function(module, exports) {
  58975. // 7.1.4 ToInteger
  58976. var ceil = Math.ceil
  58977. , floor = Math.floor;
  58978. module.exports = function(it){
  58979. return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
  58980. };
  58981. /***/ }),
  58982. /* 166 */
  58983. /***/ (function(module, exports, __webpack_require__) {
  58984. var toInteger = __webpack_require__(165)
  58985. , max = Math.max
  58986. , min = Math.min;
  58987. module.exports = function(index, length){
  58988. index = toInteger(index);
  58989. return index < 0 ? max(index + length, 0) : min(index, length);
  58990. };
  58991. /***/ }),
  58992. /* 167 */
  58993. /***/ (function(module, exports, __webpack_require__) {
  58994. var shared = __webpack_require__(168)('keys')
  58995. , uid = __webpack_require__(169);
  58996. module.exports = function(key){
  58997. return shared[key] || (shared[key] = uid(key));
  58998. };
  58999. /***/ }),
  59000. /* 168 */
  59001. /***/ (function(module, exports, __webpack_require__) {
  59002. var global = __webpack_require__(139)
  59003. , SHARED = '__core-js_shared__'
  59004. , store = global[SHARED] || (global[SHARED] = {});
  59005. module.exports = function(key){
  59006. return store[key] || (store[key] = {});
  59007. };
  59008. /***/ }),
  59009. /* 169 */
  59010. /***/ (function(module, exports) {
  59011. var id = 0
  59012. , px = Math.random();
  59013. module.exports = function(key){
  59014. return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
  59015. };
  59016. /***/ }),
  59017. /* 170 */
  59018. /***/ (function(module, exports) {
  59019. // IE 8- don't enum bug keys
  59020. module.exports = (
  59021. 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
  59022. ).split(',');
  59023. /***/ }),
  59024. /* 171 */
  59025. /***/ (function(module, exports, __webpack_require__) {
  59026. module.exports = __webpack_require__(139).document && document.documentElement;
  59027. /***/ }),
  59028. /* 172 */
  59029. /***/ (function(module, exports, __webpack_require__) {
  59030. var def = __webpack_require__(146).f
  59031. , has = __webpack_require__(134)
  59032. , TAG = __webpack_require__(173)('toStringTag');
  59033. module.exports = function(it, tag, stat){
  59034. if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
  59035. };
  59036. /***/ }),
  59037. /* 173 */
  59038. /***/ (function(module, exports, __webpack_require__) {
  59039. var store = __webpack_require__(168)('wks')
  59040. , uid = __webpack_require__(169)
  59041. , Symbol = __webpack_require__(139).Symbol
  59042. , USE_SYMBOL = typeof Symbol == 'function';
  59043. var $exports = module.exports = function(name){
  59044. return store[name] || (store[name] =
  59045. USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
  59046. };
  59047. $exports.store = store;
  59048. /***/ }),
  59049. /* 174 */
  59050. /***/ (function(module, exports, __webpack_require__) {
  59051. // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
  59052. var has = __webpack_require__(134)
  59053. , toObject = __webpack_require__(175)
  59054. , IE_PROTO = __webpack_require__(167)('IE_PROTO')
  59055. , ObjectProto = Object.prototype;
  59056. module.exports = Object.getPrototypeOf || function(O){
  59057. O = toObject(O);
  59058. if(has(O, IE_PROTO))return O[IE_PROTO];
  59059. if(typeof O.constructor == 'function' && O instanceof O.constructor){
  59060. return O.constructor.prototype;
  59061. } return O instanceof Object ? ObjectProto : null;
  59062. };
  59063. /***/ }),
  59064. /* 175 */
  59065. /***/ (function(module, exports, __webpack_require__) {
  59066. // 7.1.13 ToObject(argument)
  59067. var defined = __webpack_require__(128);
  59068. module.exports = function(it){
  59069. return Object(defined(it));
  59070. };
  59071. /***/ }),
  59072. /* 176 */
  59073. /***/ (function(module, exports, __webpack_require__) {
  59074. 'use strict';
  59075. var $at = __webpack_require__(177)(true);
  59076. // 21.1.3.27 String.prototype[@@iterator]()
  59077. __webpack_require__(155)(String, 'String', function(iterated){
  59078. this._t = String(iterated); // target
  59079. this._i = 0; // next index
  59080. // 21.1.5.2.1 %StringIteratorPrototype%.next()
  59081. }, function(){
  59082. var O = this._t
  59083. , index = this._i
  59084. , point;
  59085. if(index >= O.length)return {value: undefined, done: true};
  59086. point = $at(O, index);
  59087. this._i += point.length;
  59088. return {value: point, done: false};
  59089. });
  59090. /***/ }),
  59091. /* 177 */
  59092. /***/ (function(module, exports, __webpack_require__) {
  59093. var toInteger = __webpack_require__(165)
  59094. , defined = __webpack_require__(128);
  59095. // true -> String#at
  59096. // false -> String#codePointAt
  59097. module.exports = function(TO_STRING){
  59098. return function(that, pos){
  59099. var s = String(defined(that))
  59100. , i = toInteger(pos)
  59101. , l = s.length
  59102. , a, b;
  59103. if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
  59104. a = s.charCodeAt(i);
  59105. return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
  59106. ? TO_STRING ? s.charAt(i) : a
  59107. : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  59108. };
  59109. };
  59110. /***/ }),
  59111. /* 178 */
  59112. /***/ (function(module, exports, __webpack_require__) {
  59113. var anObject = __webpack_require__(147)
  59114. , get = __webpack_require__(179);
  59115. module.exports = __webpack_require__(142).getIterator = function(it){
  59116. var iterFn = get(it);
  59117. if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
  59118. return anObject(iterFn.call(it));
  59119. };
  59120. /***/ }),
  59121. /* 179 */
  59122. /***/ (function(module, exports, __webpack_require__) {
  59123. var classof = __webpack_require__(180)
  59124. , ITERATOR = __webpack_require__(173)('iterator')
  59125. , Iterators = __webpack_require__(154);
  59126. module.exports = __webpack_require__(142).getIteratorMethod = function(it){
  59127. if(it != undefined)return it[ITERATOR]
  59128. || it['@@iterator']
  59129. || Iterators[classof(it)];
  59130. };
  59131. /***/ }),
  59132. /* 180 */
  59133. /***/ (function(module, exports, __webpack_require__) {
  59134. // getting tag from 19.1.3.6 Object.prototype.toString()
  59135. var cof = __webpack_require__(127)
  59136. , TAG = __webpack_require__(173)('toStringTag')
  59137. // ES3 wrong here
  59138. , ARG = cof(function(){ return arguments; }()) == 'Arguments';
  59139. // fallback for IE11 Script Access Denied error
  59140. var tryGet = function(it, key){
  59141. try {
  59142. return it[key];
  59143. } catch(e){ /* empty */ }
  59144. };
  59145. module.exports = function(it){
  59146. var O, T, B;
  59147. return it === undefined ? 'Undefined' : it === null ? 'Null'
  59148. // @@toStringTag case
  59149. : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
  59150. // builtinTag case
  59151. : ARG ? cof(O)
  59152. // ES3 arguments fallback
  59153. : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
  59154. };
  59155. /***/ }),
  59156. /* 181 */
  59157. /***/ (function(module, exports, __webpack_require__) {
  59158. module.exports = { "default": __webpack_require__(182), __esModule: true };
  59159. /***/ }),
  59160. /* 182 */
  59161. /***/ (function(module, exports, __webpack_require__) {
  59162. __webpack_require__(183);
  59163. module.exports = __webpack_require__(142).Object.freeze;
  59164. /***/ }),
  59165. /* 183 */
  59166. /***/ (function(module, exports, __webpack_require__) {
  59167. // 19.1.2.5 Object.freeze(O)
  59168. var isObject = __webpack_require__(133)
  59169. , meta = __webpack_require__(184).onFreeze;
  59170. __webpack_require__(140)('freeze', function($freeze){
  59171. return function freeze(it){
  59172. return $freeze && isObject(it) ? $freeze(meta(it)) : it;
  59173. };
  59174. });
  59175. /***/ }),
  59176. /* 184 */
  59177. /***/ (function(module, exports, __webpack_require__) {
  59178. var META = __webpack_require__(169)('meta')
  59179. , isObject = __webpack_require__(133)
  59180. , has = __webpack_require__(134)
  59181. , setDesc = __webpack_require__(146).f
  59182. , id = 0;
  59183. var isExtensible = Object.isExtensible || function(){
  59184. return true;
  59185. };
  59186. var FREEZE = !__webpack_require__(137)(function(){
  59187. return isExtensible(Object.preventExtensions({}));
  59188. });
  59189. var setMeta = function(it){
  59190. setDesc(it, META, {value: {
  59191. i: 'O' + ++id, // object ID
  59192. w: {} // weak collections IDs
  59193. }});
  59194. };
  59195. var fastKey = function(it, create){
  59196. // return primitive with prefix
  59197. if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  59198. if(!has(it, META)){
  59199. // can't set metadata to uncaught frozen object
  59200. if(!isExtensible(it))return 'F';
  59201. // not necessary to add metadata
  59202. if(!create)return 'E';
  59203. // add missing metadata
  59204. setMeta(it);
  59205. // return object ID
  59206. } return it[META].i;
  59207. };
  59208. var getWeak = function(it, create){
  59209. if(!has(it, META)){
  59210. // can't set metadata to uncaught frozen object
  59211. if(!isExtensible(it))return true;
  59212. // not necessary to add metadata
  59213. if(!create)return false;
  59214. // add missing metadata
  59215. setMeta(it);
  59216. // return hash weak collections IDs
  59217. } return it[META].w;
  59218. };
  59219. // add metadata on freeze-family methods calling
  59220. var onFreeze = function(it){
  59221. if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);
  59222. return it;
  59223. };
  59224. var meta = module.exports = {
  59225. KEY: META,
  59226. NEED: false,
  59227. fastKey: fastKey,
  59228. getWeak: getWeak,
  59229. onFreeze: onFreeze
  59230. };
  59231. /***/ }),
  59232. /* 185 */
  59233. /***/ (function(module, exports, __webpack_require__) {
  59234. module.exports = { "default": __webpack_require__(186), __esModule: true };
  59235. /***/ }),
  59236. /* 186 */
  59237. /***/ (function(module, exports, __webpack_require__) {
  59238. __webpack_require__(187);
  59239. module.exports = __webpack_require__(142).Object.keys;
  59240. /***/ }),
  59241. /* 187 */
  59242. /***/ (function(module, exports, __webpack_require__) {
  59243. // 19.1.2.14 Object.keys(O)
  59244. var toObject = __webpack_require__(175)
  59245. , $keys = __webpack_require__(161);
  59246. __webpack_require__(140)('keys', function(){
  59247. return function keys(it){
  59248. return $keys(toObject(it));
  59249. };
  59250. });
  59251. /***/ }),
  59252. /* 188 */
  59253. /***/ (function(module, exports, __webpack_require__) {
  59254. "use strict";
  59255. exports.__esModule = true;
  59256. var _iterator = __webpack_require__(189);
  59257. var _iterator2 = _interopRequireDefault(_iterator);
  59258. var _symbol = __webpack_require__(192);
  59259. var _symbol2 = _interopRequireDefault(_symbol);
  59260. var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };
  59261. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  59262. exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
  59263. return typeof obj === "undefined" ? "undefined" : _typeof(obj);
  59264. } : function (obj) {
  59265. return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
  59266. };
  59267. /***/ }),
  59268. /* 189 */
  59269. /***/ (function(module, exports, __webpack_require__) {
  59270. module.exports = { "default": __webpack_require__(190), __esModule: true };
  59271. /***/ }),
  59272. /* 190 */
  59273. /***/ (function(module, exports, __webpack_require__) {
  59274. __webpack_require__(176);
  59275. __webpack_require__(150);
  59276. module.exports = __webpack_require__(191).f('iterator');
  59277. /***/ }),
  59278. /* 191 */
  59279. /***/ (function(module, exports, __webpack_require__) {
  59280. exports.f = __webpack_require__(173);
  59281. /***/ }),
  59282. /* 192 */
  59283. /***/ (function(module, exports, __webpack_require__) {
  59284. module.exports = { "default": __webpack_require__(193), __esModule: true };
  59285. /***/ }),
  59286. /* 193 */
  59287. /***/ (function(module, exports, __webpack_require__) {
  59288. __webpack_require__(194);
  59289. __webpack_require__(202);
  59290. __webpack_require__(203);
  59291. __webpack_require__(204);
  59292. module.exports = __webpack_require__(142).Symbol;
  59293. /***/ }),
  59294. /* 194 */
  59295. /***/ (function(module, exports, __webpack_require__) {
  59296. 'use strict';
  59297. // ECMAScript 6 symbols shim
  59298. var global = __webpack_require__(139)
  59299. , has = __webpack_require__(134)
  59300. , DESCRIPTORS = __webpack_require__(136)
  59301. , $export = __webpack_require__(141)
  59302. , redefine = __webpack_require__(157)
  59303. , META = __webpack_require__(184).KEY
  59304. , $fails = __webpack_require__(137)
  59305. , shared = __webpack_require__(168)
  59306. , setToStringTag = __webpack_require__(172)
  59307. , uid = __webpack_require__(169)
  59308. , wks = __webpack_require__(173)
  59309. , wksExt = __webpack_require__(191)
  59310. , wksDefine = __webpack_require__(195)
  59311. , keyOf = __webpack_require__(196)
  59312. , enumKeys = __webpack_require__(197)
  59313. , isArray = __webpack_require__(199)
  59314. , anObject = __webpack_require__(147)
  59315. , toIObject = __webpack_require__(125)
  59316. , toPrimitive = __webpack_require__(132)
  59317. , createDesc = __webpack_require__(131)
  59318. , _create = __webpack_require__(159)
  59319. , gOPNExt = __webpack_require__(200)
  59320. , $GOPD = __webpack_require__(129)
  59321. , $DP = __webpack_require__(146)
  59322. , $keys = __webpack_require__(161)
  59323. , gOPD = $GOPD.f
  59324. , dP = $DP.f
  59325. , gOPN = gOPNExt.f
  59326. , $Symbol = global.Symbol
  59327. , $JSON = global.JSON
  59328. , _stringify = $JSON && $JSON.stringify
  59329. , PROTOTYPE = 'prototype'
  59330. , HIDDEN = wks('_hidden')
  59331. , TO_PRIMITIVE = wks('toPrimitive')
  59332. , isEnum = {}.propertyIsEnumerable
  59333. , SymbolRegistry = shared('symbol-registry')
  59334. , AllSymbols = shared('symbols')
  59335. , OPSymbols = shared('op-symbols')
  59336. , ObjectProto = Object[PROTOTYPE]
  59337. , USE_NATIVE = typeof $Symbol == 'function'
  59338. , QObject = global.QObject;
  59339. // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
  59340. var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
  59341. // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
  59342. var setSymbolDesc = DESCRIPTORS && $fails(function(){
  59343. return _create(dP({}, 'a', {
  59344. get: function(){ return dP(this, 'a', {value: 7}).a; }
  59345. })).a != 7;
  59346. }) ? function(it, key, D){
  59347. var protoDesc = gOPD(ObjectProto, key);
  59348. if(protoDesc)delete ObjectProto[key];
  59349. dP(it, key, D);
  59350. if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);
  59351. } : dP;
  59352. var wrap = function(tag){
  59353. var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
  59354. sym._k = tag;
  59355. return sym;
  59356. };
  59357. var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){
  59358. return typeof it == 'symbol';
  59359. } : function(it){
  59360. return it instanceof $Symbol;
  59361. };
  59362. var $defineProperty = function defineProperty(it, key, D){
  59363. if(it === ObjectProto)$defineProperty(OPSymbols, key, D);
  59364. anObject(it);
  59365. key = toPrimitive(key, true);
  59366. anObject(D);
  59367. if(has(AllSymbols, key)){
  59368. if(!D.enumerable){
  59369. if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
  59370. it[HIDDEN][key] = true;
  59371. } else {
  59372. if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
  59373. D = _create(D, {enumerable: createDesc(0, false)});
  59374. } return setSymbolDesc(it, key, D);
  59375. } return dP(it, key, D);
  59376. };
  59377. var $defineProperties = function defineProperties(it, P){
  59378. anObject(it);
  59379. var keys = enumKeys(P = toIObject(P))
  59380. , i = 0
  59381. , l = keys.length
  59382. , key;
  59383. while(l > i)$defineProperty(it, key = keys[i++], P[key]);
  59384. return it;
  59385. };
  59386. var $create = function create(it, P){
  59387. return P === undefined ? _create(it) : $defineProperties(_create(it), P);
  59388. };
  59389. var $propertyIsEnumerable = function propertyIsEnumerable(key){
  59390. var E = isEnum.call(this, key = toPrimitive(key, true));
  59391. if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;
  59392. return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
  59393. };
  59394. var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
  59395. it = toIObject(it);
  59396. key = toPrimitive(key, true);
  59397. if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;
  59398. var D = gOPD(it, key);
  59399. if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
  59400. return D;
  59401. };
  59402. var $getOwnPropertyNames = function getOwnPropertyNames(it){
  59403. var names = gOPN(toIObject(it))
  59404. , result = []
  59405. , i = 0
  59406. , key;
  59407. while(names.length > i){
  59408. if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);
  59409. } return result;
  59410. };
  59411. var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
  59412. var IS_OP = it === ObjectProto
  59413. , names = gOPN(IS_OP ? OPSymbols : toIObject(it))
  59414. , result = []
  59415. , i = 0
  59416. , key;
  59417. while(names.length > i){
  59418. if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);
  59419. } return result;
  59420. };
  59421. // 19.4.1.1 Symbol([description])
  59422. if(!USE_NATIVE){
  59423. $Symbol = function Symbol(){
  59424. if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');
  59425. var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
  59426. var $set = function(value){
  59427. if(this === ObjectProto)$set.call(OPSymbols, value);
  59428. if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
  59429. setSymbolDesc(this, tag, createDesc(1, value));
  59430. };
  59431. if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});
  59432. return wrap(tag);
  59433. };
  59434. redefine($Symbol[PROTOTYPE], 'toString', function toString(){
  59435. return this._k;
  59436. });
  59437. $GOPD.f = $getOwnPropertyDescriptor;
  59438. $DP.f = $defineProperty;
  59439. __webpack_require__(201).f = gOPNExt.f = $getOwnPropertyNames;
  59440. __webpack_require__(130).f = $propertyIsEnumerable;
  59441. __webpack_require__(198).f = $getOwnPropertySymbols;
  59442. if(DESCRIPTORS && !__webpack_require__(156)){
  59443. redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  59444. }
  59445. wksExt.f = function(name){
  59446. return wrap(wks(name));
  59447. }
  59448. }
  59449. $export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});
  59450. for(var symbols = (
  59451. // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
  59452. 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
  59453. ).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);
  59454. for(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);
  59455. $export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  59456. // 19.4.2.1 Symbol.for(key)
  59457. 'for': function(key){
  59458. return has(SymbolRegistry, key += '')
  59459. ? SymbolRegistry[key]
  59460. : SymbolRegistry[key] = $Symbol(key);
  59461. },
  59462. // 19.4.2.5 Symbol.keyFor(sym)
  59463. keyFor: function keyFor(key){
  59464. if(isSymbol(key))return keyOf(SymbolRegistry, key);
  59465. throw TypeError(key + ' is not a symbol!');
  59466. },
  59467. useSetter: function(){ setter = true; },
  59468. useSimple: function(){ setter = false; }
  59469. });
  59470. $export($export.S + $export.F * !USE_NATIVE, 'Object', {
  59471. // 19.1.2.2 Object.create(O [, Properties])
  59472. create: $create,
  59473. // 19.1.2.4 Object.defineProperty(O, P, Attributes)
  59474. defineProperty: $defineProperty,
  59475. // 19.1.2.3 Object.defineProperties(O, Properties)
  59476. defineProperties: $defineProperties,
  59477. // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  59478. getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  59479. // 19.1.2.7 Object.getOwnPropertyNames(O)
  59480. getOwnPropertyNames: $getOwnPropertyNames,
  59481. // 19.1.2.8 Object.getOwnPropertySymbols(O)
  59482. getOwnPropertySymbols: $getOwnPropertySymbols
  59483. });
  59484. // 24.3.2 JSON.stringify(value [, replacer [, space]])
  59485. $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){
  59486. var S = $Symbol();
  59487. // MS Edge converts symbol values to JSON as {}
  59488. // WebKit converts symbol values to JSON as null
  59489. // V8 throws on boxed symbols
  59490. return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
  59491. })), 'JSON', {
  59492. stringify: function stringify(it){
  59493. if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
  59494. var args = [it]
  59495. , i = 1
  59496. , replacer, $replacer;
  59497. while(arguments.length > i)args.push(arguments[i++]);
  59498. replacer = args[1];
  59499. if(typeof replacer == 'function')$replacer = replacer;
  59500. if($replacer || !isArray(replacer))replacer = function(key, value){
  59501. if($replacer)value = $replacer.call(this, key, value);
  59502. if(!isSymbol(value))return value;
  59503. };
  59504. args[1] = replacer;
  59505. return _stringify.apply($JSON, args);
  59506. }
  59507. });
  59508. // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
  59509. $Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(145)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
  59510. // 19.4.3.5 Symbol.prototype[@@toStringTag]
  59511. setToStringTag($Symbol, 'Symbol');
  59512. // 20.2.1.9 Math[@@toStringTag]
  59513. setToStringTag(Math, 'Math', true);
  59514. // 24.3.3 JSON[@@toStringTag]
  59515. setToStringTag(global.JSON, 'JSON', true);
  59516. /***/ }),
  59517. /* 195 */
  59518. /***/ (function(module, exports, __webpack_require__) {
  59519. var global = __webpack_require__(139)
  59520. , core = __webpack_require__(142)
  59521. , LIBRARY = __webpack_require__(156)
  59522. , wksExt = __webpack_require__(191)
  59523. , defineProperty = __webpack_require__(146).f;
  59524. module.exports = function(name){
  59525. var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  59526. if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});
  59527. };
  59528. /***/ }),
  59529. /* 196 */
  59530. /***/ (function(module, exports, __webpack_require__) {
  59531. var getKeys = __webpack_require__(161)
  59532. , toIObject = __webpack_require__(125);
  59533. module.exports = function(object, el){
  59534. var O = toIObject(object)
  59535. , keys = getKeys(O)
  59536. , length = keys.length
  59537. , index = 0
  59538. , key;
  59539. while(length > index)if(O[key = keys[index++]] === el)return key;
  59540. };
  59541. /***/ }),
  59542. /* 197 */
  59543. /***/ (function(module, exports, __webpack_require__) {
  59544. // all enumerable object keys, includes symbols
  59545. var getKeys = __webpack_require__(161)
  59546. , gOPS = __webpack_require__(198)
  59547. , pIE = __webpack_require__(130);
  59548. module.exports = function(it){
  59549. var result = getKeys(it)
  59550. , getSymbols = gOPS.f;
  59551. if(getSymbols){
  59552. var symbols = getSymbols(it)
  59553. , isEnum = pIE.f
  59554. , i = 0
  59555. , key;
  59556. while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);
  59557. } return result;
  59558. };
  59559. /***/ }),
  59560. /* 198 */
  59561. /***/ (function(module, exports) {
  59562. exports.f = Object.getOwnPropertySymbols;
  59563. /***/ }),
  59564. /* 199 */
  59565. /***/ (function(module, exports, __webpack_require__) {
  59566. // 7.2.2 IsArray(argument)
  59567. var cof = __webpack_require__(127);
  59568. module.exports = Array.isArray || function isArray(arg){
  59569. return cof(arg) == 'Array';
  59570. };
  59571. /***/ }),
  59572. /* 200 */
  59573. /***/ (function(module, exports, __webpack_require__) {
  59574. // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
  59575. var toIObject = __webpack_require__(125)
  59576. , gOPN = __webpack_require__(201).f
  59577. , toString = {}.toString;
  59578. var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  59579. ? Object.getOwnPropertyNames(window) : [];
  59580. var getWindowNames = function(it){
  59581. try {
  59582. return gOPN(it);
  59583. } catch(e){
  59584. return windowNames.slice();
  59585. }
  59586. };
  59587. module.exports.f = function getOwnPropertyNames(it){
  59588. return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
  59589. };
  59590. /***/ }),
  59591. /* 201 */
  59592. /***/ (function(module, exports, __webpack_require__) {
  59593. // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
  59594. var $keys = __webpack_require__(162)
  59595. , hiddenKeys = __webpack_require__(170).concat('length', 'prototype');
  59596. exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){
  59597. return $keys(O, hiddenKeys);
  59598. };
  59599. /***/ }),
  59600. /* 202 */
  59601. /***/ (function(module, exports) {
  59602. /***/ }),
  59603. /* 203 */
  59604. /***/ (function(module, exports, __webpack_require__) {
  59605. __webpack_require__(195)('asyncIterator');
  59606. /***/ }),
  59607. /* 204 */
  59608. /***/ (function(module, exports, __webpack_require__) {
  59609. __webpack_require__(195)('observable');
  59610. /***/ }),
  59611. /* 205 */
  59612. /***/ (function(module, exports, __webpack_require__) {
  59613. module.exports = { "default": __webpack_require__(206), __esModule: true };
  59614. /***/ }),
  59615. /* 206 */
  59616. /***/ (function(module, exports, __webpack_require__) {
  59617. __webpack_require__(207);
  59618. var $Object = __webpack_require__(142).Object;
  59619. module.exports = function defineProperty(it, key, desc){
  59620. return $Object.defineProperty(it, key, desc);
  59621. };
  59622. /***/ }),
  59623. /* 207 */
  59624. /***/ (function(module, exports, __webpack_require__) {
  59625. var $export = __webpack_require__(141);
  59626. // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
  59627. $export($export.S + $export.F * !__webpack_require__(136), 'Object', {defineProperty: __webpack_require__(146).f});
  59628. /***/ }),
  59629. /* 208 */
  59630. /***/ (function(module, exports) {
  59631. "use strict";
  59632. exports.__esModule = true;
  59633. exports.default = function (instance, Constructor) {
  59634. if (!(instance instanceof Constructor)) {
  59635. throw new TypeError("Cannot call a class as a function");
  59636. }
  59637. };
  59638. /***/ }),
  59639. /* 209 */
  59640. /***/ (function(module, exports, __webpack_require__) {
  59641. "use strict";
  59642. exports.__esModule = true;
  59643. var _defineProperty = __webpack_require__(205);
  59644. var _defineProperty2 = _interopRequireDefault(_defineProperty);
  59645. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  59646. exports.default = function () {
  59647. function defineProperties(target, props) {
  59648. for (var i = 0; i < props.length; i++) {
  59649. var descriptor = props[i];
  59650. descriptor.enumerable = descriptor.enumerable || false;
  59651. descriptor.configurable = true;
  59652. if ("value" in descriptor) descriptor.writable = true;
  59653. (0, _defineProperty2.default)(target, descriptor.key, descriptor);
  59654. }
  59655. }
  59656. return function (Constructor, protoProps, staticProps) {
  59657. if (protoProps) defineProperties(Constructor.prototype, protoProps);
  59658. if (staticProps) defineProperties(Constructor, staticProps);
  59659. return Constructor;
  59660. };
  59661. }();
  59662. /***/ }),
  59663. /* 210 */
  59664. /***/ (function(module, exports, __webpack_require__) {
  59665. module.exports = { "default": __webpack_require__(211), __esModule: true };
  59666. /***/ }),
  59667. /* 211 */
  59668. /***/ (function(module, exports, __webpack_require__) {
  59669. __webpack_require__(202);
  59670. __webpack_require__(176);
  59671. __webpack_require__(150);
  59672. __webpack_require__(212);
  59673. __webpack_require__(224);
  59674. module.exports = __webpack_require__(142).Map;
  59675. /***/ }),
  59676. /* 212 */
  59677. /***/ (function(module, exports, __webpack_require__) {
  59678. 'use strict';
  59679. var strong = __webpack_require__(213);
  59680. // 23.1 Map Objects
  59681. module.exports = __webpack_require__(220)('Map', function(get){
  59682. return function Map(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
  59683. }, {
  59684. // 23.1.3.6 Map.prototype.get(key)
  59685. get: function get(key){
  59686. var entry = strong.getEntry(this, key);
  59687. return entry && entry.v;
  59688. },
  59689. // 23.1.3.9 Map.prototype.set(key, value)
  59690. set: function set(key, value){
  59691. return strong.def(this, key === 0 ? 0 : key, value);
  59692. }
  59693. }, strong, true);
  59694. /***/ }),
  59695. /* 213 */
  59696. /***/ (function(module, exports, __webpack_require__) {
  59697. 'use strict';
  59698. var dP = __webpack_require__(146).f
  59699. , create = __webpack_require__(159)
  59700. , redefineAll = __webpack_require__(214)
  59701. , ctx = __webpack_require__(143)
  59702. , anInstance = __webpack_require__(215)
  59703. , defined = __webpack_require__(128)
  59704. , forOf = __webpack_require__(216)
  59705. , $iterDefine = __webpack_require__(155)
  59706. , step = __webpack_require__(153)
  59707. , setSpecies = __webpack_require__(219)
  59708. , DESCRIPTORS = __webpack_require__(136)
  59709. , fastKey = __webpack_require__(184).fastKey
  59710. , SIZE = DESCRIPTORS ? '_s' : 'size';
  59711. var getEntry = function(that, key){
  59712. // fast case
  59713. var index = fastKey(key), entry;
  59714. if(index !== 'F')return that._i[index];
  59715. // frozen object case
  59716. for(entry = that._f; entry; entry = entry.n){
  59717. if(entry.k == key)return entry;
  59718. }
  59719. };
  59720. module.exports = {
  59721. getConstructor: function(wrapper, NAME, IS_MAP, ADDER){
  59722. var C = wrapper(function(that, iterable){
  59723. anInstance(that, C, NAME, '_i');
  59724. that._i = create(null); // index
  59725. that._f = undefined; // first entry
  59726. that._l = undefined; // last entry
  59727. that[SIZE] = 0; // size
  59728. if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);
  59729. });
  59730. redefineAll(C.prototype, {
  59731. // 23.1.3.1 Map.prototype.clear()
  59732. // 23.2.3.2 Set.prototype.clear()
  59733. clear: function clear(){
  59734. for(var that = this, data = that._i, entry = that._f; entry; entry = entry.n){
  59735. entry.r = true;
  59736. if(entry.p)entry.p = entry.p.n = undefined;
  59737. delete data[entry.i];
  59738. }
  59739. that._f = that._l = undefined;
  59740. that[SIZE] = 0;
  59741. },
  59742. // 23.1.3.3 Map.prototype.delete(key)
  59743. // 23.2.3.4 Set.prototype.delete(value)
  59744. 'delete': function(key){
  59745. var that = this
  59746. , entry = getEntry(that, key);
  59747. if(entry){
  59748. var next = entry.n
  59749. , prev = entry.p;
  59750. delete that._i[entry.i];
  59751. entry.r = true;
  59752. if(prev)prev.n = next;
  59753. if(next)next.p = prev;
  59754. if(that._f == entry)that._f = next;
  59755. if(that._l == entry)that._l = prev;
  59756. that[SIZE]--;
  59757. } return !!entry;
  59758. },
  59759. // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
  59760. // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
  59761. forEach: function forEach(callbackfn /*, that = undefined */){
  59762. anInstance(this, C, 'forEach');
  59763. var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3)
  59764. , entry;
  59765. while(entry = entry ? entry.n : this._f){
  59766. f(entry.v, entry.k, this);
  59767. // revert to the last existing entry
  59768. while(entry && entry.r)entry = entry.p;
  59769. }
  59770. },
  59771. // 23.1.3.7 Map.prototype.has(key)
  59772. // 23.2.3.7 Set.prototype.has(value)
  59773. has: function has(key){
  59774. return !!getEntry(this, key);
  59775. }
  59776. });
  59777. if(DESCRIPTORS)dP(C.prototype, 'size', {
  59778. get: function(){
  59779. return defined(this[SIZE]);
  59780. }
  59781. });
  59782. return C;
  59783. },
  59784. def: function(that, key, value){
  59785. var entry = getEntry(that, key)
  59786. , prev, index;
  59787. // change existing entry
  59788. if(entry){
  59789. entry.v = value;
  59790. // create new entry
  59791. } else {
  59792. that._l = entry = {
  59793. i: index = fastKey(key, true), // <- index
  59794. k: key, // <- key
  59795. v: value, // <- value
  59796. p: prev = that._l, // <- previous entry
  59797. n: undefined, // <- next entry
  59798. r: false // <- removed
  59799. };
  59800. if(!that._f)that._f = entry;
  59801. if(prev)prev.n = entry;
  59802. that[SIZE]++;
  59803. // add to index
  59804. if(index !== 'F')that._i[index] = entry;
  59805. } return that;
  59806. },
  59807. getEntry: getEntry,
  59808. setStrong: function(C, NAME, IS_MAP){
  59809. // add .keys, .values, .entries, [@@iterator]
  59810. // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
  59811. $iterDefine(C, NAME, function(iterated, kind){
  59812. this._t = iterated; // target
  59813. this._k = kind; // kind
  59814. this._l = undefined; // previous
  59815. }, function(){
  59816. var that = this
  59817. , kind = that._k
  59818. , entry = that._l;
  59819. // revert to the last existing entry
  59820. while(entry && entry.r)entry = entry.p;
  59821. // get next entry
  59822. if(!that._t || !(that._l = entry = entry ? entry.n : that._t._f)){
  59823. // or finish the iteration
  59824. that._t = undefined;
  59825. return step(1);
  59826. }
  59827. // return step by kind
  59828. if(kind == 'keys' )return step(0, entry.k);
  59829. if(kind == 'values')return step(0, entry.v);
  59830. return step(0, [entry.k, entry.v]);
  59831. }, IS_MAP ? 'entries' : 'values' , !IS_MAP, true);
  59832. // add [@@species], 23.1.2.2, 23.2.2.2
  59833. setSpecies(NAME);
  59834. }
  59835. };
  59836. /***/ }),
  59837. /* 214 */
  59838. /***/ (function(module, exports, __webpack_require__) {
  59839. var hide = __webpack_require__(145);
  59840. module.exports = function(target, src, safe){
  59841. for(var key in src){
  59842. if(safe && target[key])target[key] = src[key];
  59843. else hide(target, key, src[key]);
  59844. } return target;
  59845. };
  59846. /***/ }),
  59847. /* 215 */
  59848. /***/ (function(module, exports) {
  59849. module.exports = function(it, Constructor, name, forbiddenField){
  59850. if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){
  59851. throw TypeError(name + ': incorrect invocation!');
  59852. } return it;
  59853. };
  59854. /***/ }),
  59855. /* 216 */
  59856. /***/ (function(module, exports, __webpack_require__) {
  59857. var ctx = __webpack_require__(143)
  59858. , call = __webpack_require__(217)
  59859. , isArrayIter = __webpack_require__(218)
  59860. , anObject = __webpack_require__(147)
  59861. , toLength = __webpack_require__(164)
  59862. , getIterFn = __webpack_require__(179)
  59863. , BREAK = {}
  59864. , RETURN = {};
  59865. var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){
  59866. var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable)
  59867. , f = ctx(fn, that, entries ? 2 : 1)
  59868. , index = 0
  59869. , length, step, iterator, result;
  59870. if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');
  59871. // fast case for arrays with default iterator
  59872. if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){
  59873. result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
  59874. if(result === BREAK || result === RETURN)return result;
  59875. } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){
  59876. result = call(iterator, f, step.value, entries);
  59877. if(result === BREAK || result === RETURN)return result;
  59878. }
  59879. };
  59880. exports.BREAK = BREAK;
  59881. exports.RETURN = RETURN;
  59882. /***/ }),
  59883. /* 217 */
  59884. /***/ (function(module, exports, __webpack_require__) {
  59885. // call something on iterator step with safe closing on error
  59886. var anObject = __webpack_require__(147);
  59887. module.exports = function(iterator, fn, value, entries){
  59888. try {
  59889. return entries ? fn(anObject(value)[0], value[1]) : fn(value);
  59890. // 7.4.6 IteratorClose(iterator, completion)
  59891. } catch(e){
  59892. var ret = iterator['return'];
  59893. if(ret !== undefined)anObject(ret.call(iterator));
  59894. throw e;
  59895. }
  59896. };
  59897. /***/ }),
  59898. /* 218 */
  59899. /***/ (function(module, exports, __webpack_require__) {
  59900. // check on default Array iterator
  59901. var Iterators = __webpack_require__(154)
  59902. , ITERATOR = __webpack_require__(173)('iterator')
  59903. , ArrayProto = Array.prototype;
  59904. module.exports = function(it){
  59905. return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
  59906. };
  59907. /***/ }),
  59908. /* 219 */
  59909. /***/ (function(module, exports, __webpack_require__) {
  59910. 'use strict';
  59911. var global = __webpack_require__(139)
  59912. , core = __webpack_require__(142)
  59913. , dP = __webpack_require__(146)
  59914. , DESCRIPTORS = __webpack_require__(136)
  59915. , SPECIES = __webpack_require__(173)('species');
  59916. module.exports = function(KEY){
  59917. var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
  59918. if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, {
  59919. configurable: true,
  59920. get: function(){ return this; }
  59921. });
  59922. };
  59923. /***/ }),
  59924. /* 220 */
  59925. /***/ (function(module, exports, __webpack_require__) {
  59926. 'use strict';
  59927. var global = __webpack_require__(139)
  59928. , $export = __webpack_require__(141)
  59929. , meta = __webpack_require__(184)
  59930. , fails = __webpack_require__(137)
  59931. , hide = __webpack_require__(145)
  59932. , redefineAll = __webpack_require__(214)
  59933. , forOf = __webpack_require__(216)
  59934. , anInstance = __webpack_require__(215)
  59935. , isObject = __webpack_require__(133)
  59936. , setToStringTag = __webpack_require__(172)
  59937. , dP = __webpack_require__(146).f
  59938. , each = __webpack_require__(221)(0)
  59939. , DESCRIPTORS = __webpack_require__(136);
  59940. module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){
  59941. var Base = global[NAME]
  59942. , C = Base
  59943. , ADDER = IS_MAP ? 'set' : 'add'
  59944. , proto = C && C.prototype
  59945. , O = {};
  59946. if(!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function(){
  59947. new C().entries().next();
  59948. }))){
  59949. // create collection constructor
  59950. C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
  59951. redefineAll(C.prototype, methods);
  59952. meta.NEED = true;
  59953. } else {
  59954. C = wrapper(function(target, iterable){
  59955. anInstance(target, C, NAME, '_c');
  59956. target._c = new Base;
  59957. if(iterable != undefined)forOf(iterable, IS_MAP, target[ADDER], target);
  59958. });
  59959. each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','),function(KEY){
  59960. var IS_ADDER = KEY == 'add' || KEY == 'set';
  59961. if(KEY in proto && !(IS_WEAK && KEY == 'clear'))hide(C.prototype, KEY, function(a, b){
  59962. anInstance(this, C, KEY);
  59963. if(!IS_ADDER && IS_WEAK && !isObject(a))return KEY == 'get' ? undefined : false;
  59964. var result = this._c[KEY](a === 0 ? 0 : a, b);
  59965. return IS_ADDER ? this : result;
  59966. });
  59967. });
  59968. if('size' in proto)dP(C.prototype, 'size', {
  59969. get: function(){
  59970. return this._c.size;
  59971. }
  59972. });
  59973. }
  59974. setToStringTag(C, NAME);
  59975. O[NAME] = C;
  59976. $export($export.G + $export.W + $export.F, O);
  59977. if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP);
  59978. return C;
  59979. };
  59980. /***/ }),
  59981. /* 221 */
  59982. /***/ (function(module, exports, __webpack_require__) {
  59983. // 0 -> Array#forEach
  59984. // 1 -> Array#map
  59985. // 2 -> Array#filter
  59986. // 3 -> Array#some
  59987. // 4 -> Array#every
  59988. // 5 -> Array#find
  59989. // 6 -> Array#findIndex
  59990. var ctx = __webpack_require__(143)
  59991. , IObject = __webpack_require__(126)
  59992. , toObject = __webpack_require__(175)
  59993. , toLength = __webpack_require__(164)
  59994. , asc = __webpack_require__(222);
  59995. module.exports = function(TYPE, $create){
  59996. var IS_MAP = TYPE == 1
  59997. , IS_FILTER = TYPE == 2
  59998. , IS_SOME = TYPE == 3
  59999. , IS_EVERY = TYPE == 4
  60000. , IS_FIND_INDEX = TYPE == 6
  60001. , NO_HOLES = TYPE == 5 || IS_FIND_INDEX
  60002. , create = $create || asc;
  60003. return function($this, callbackfn, that){
  60004. var O = toObject($this)
  60005. , self = IObject(O)
  60006. , f = ctx(callbackfn, that, 3)
  60007. , length = toLength(self.length)
  60008. , index = 0
  60009. , result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined
  60010. , val, res;
  60011. for(;length > index; index++)if(NO_HOLES || index in self){
  60012. val = self[index];
  60013. res = f(val, index, O);
  60014. if(TYPE){
  60015. if(IS_MAP)result[index] = res; // map
  60016. else if(res)switch(TYPE){
  60017. case 3: return true; // some
  60018. case 5: return val; // find
  60019. case 6: return index; // findIndex
  60020. case 2: result.push(val); // filter
  60021. } else if(IS_EVERY)return false; // every
  60022. }
  60023. }
  60024. return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  60025. };
  60026. };
  60027. /***/ }),
  60028. /* 222 */
  60029. /***/ (function(module, exports, __webpack_require__) {
  60030. // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
  60031. var speciesConstructor = __webpack_require__(223);
  60032. module.exports = function(original, length){
  60033. return new (speciesConstructor(original))(length);
  60034. };
  60035. /***/ }),
  60036. /* 223 */
  60037. /***/ (function(module, exports, __webpack_require__) {
  60038. var isObject = __webpack_require__(133)
  60039. , isArray = __webpack_require__(199)
  60040. , SPECIES = __webpack_require__(173)('species');
  60041. module.exports = function(original){
  60042. var C;
  60043. if(isArray(original)){
  60044. C = original.constructor;
  60045. // cross-realm fallback
  60046. if(typeof C == 'function' && (C === Array || isArray(C.prototype)))C = undefined;
  60047. if(isObject(C)){
  60048. C = C[SPECIES];
  60049. if(C === null)C = undefined;
  60050. }
  60051. } return C === undefined ? Array : C;
  60052. };
  60053. /***/ }),
  60054. /* 224 */
  60055. /***/ (function(module, exports, __webpack_require__) {
  60056. // https://github.com/DavidBruant/Map-Set.prototype.toJSON
  60057. var $export = __webpack_require__(141);
  60058. $export($export.P + $export.R, 'Map', {toJSON: __webpack_require__(225)('Map')});
  60059. /***/ }),
  60060. /* 225 */
  60061. /***/ (function(module, exports, __webpack_require__) {
  60062. // https://github.com/DavidBruant/Map-Set.prototype.toJSON
  60063. var classof = __webpack_require__(180)
  60064. , from = __webpack_require__(226);
  60065. module.exports = function(NAME){
  60066. return function toJSON(){
  60067. if(classof(this) != NAME)throw TypeError(NAME + "#toJSON isn't generic");
  60068. return from(this);
  60069. };
  60070. };
  60071. /***/ }),
  60072. /* 226 */
  60073. /***/ (function(module, exports, __webpack_require__) {
  60074. var forOf = __webpack_require__(216);
  60075. module.exports = function(iter, ITERATOR){
  60076. var result = [];
  60077. forOf(iter, false, result.push, result, ITERATOR);
  60078. return result;
  60079. };
  60080. /***/ }),
  60081. /* 227 */
  60082. /***/ (function(module, exports, __webpack_require__) {
  60083. "use strict";
  60084. exports.__esModule = true;
  60085. var _typeof2 = __webpack_require__(188);
  60086. var _typeof3 = _interopRequireDefault(_typeof2);
  60087. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  60088. exports.default = function (self, call) {
  60089. if (!self) {
  60090. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  60091. }
  60092. return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self;
  60093. };
  60094. /***/ }),
  60095. /* 228 */
  60096. /***/ (function(module, exports, __webpack_require__) {
  60097. "use strict";
  60098. exports.__esModule = true;
  60099. var _setPrototypeOf = __webpack_require__(229);
  60100. var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);
  60101. var _create = __webpack_require__(233);
  60102. var _create2 = _interopRequireDefault(_create);
  60103. var _typeof2 = __webpack_require__(188);
  60104. var _typeof3 = _interopRequireDefault(_typeof2);
  60105. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  60106. exports.default = function (subClass, superClass) {
  60107. if (typeof superClass !== "function" && superClass !== null) {
  60108. throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass)));
  60109. }
  60110. subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {
  60111. constructor: {
  60112. value: subClass,
  60113. enumerable: false,
  60114. writable: true,
  60115. configurable: true
  60116. }
  60117. });
  60118. if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;
  60119. };
  60120. /***/ }),
  60121. /* 229 */
  60122. /***/ (function(module, exports, __webpack_require__) {
  60123. module.exports = { "default": __webpack_require__(230), __esModule: true };
  60124. /***/ }),
  60125. /* 230 */
  60126. /***/ (function(module, exports, __webpack_require__) {
  60127. __webpack_require__(231);
  60128. module.exports = __webpack_require__(142).Object.setPrototypeOf;
  60129. /***/ }),
  60130. /* 231 */
  60131. /***/ (function(module, exports, __webpack_require__) {
  60132. // 19.1.3.19 Object.setPrototypeOf(O, proto)
  60133. var $export = __webpack_require__(141);
  60134. $export($export.S, 'Object', {setPrototypeOf: __webpack_require__(232).set});
  60135. /***/ }),
  60136. /* 232 */
  60137. /***/ (function(module, exports, __webpack_require__) {
  60138. // Works with __proto__ only. Old v8 can't work with null proto objects.
  60139. /* eslint-disable no-proto */
  60140. var isObject = __webpack_require__(133)
  60141. , anObject = __webpack_require__(147);
  60142. var check = function(O, proto){
  60143. anObject(O);
  60144. if(!isObject(proto) && proto !== null)throw TypeError(proto + ": can't set as prototype!");
  60145. };
  60146. module.exports = {
  60147. set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
  60148. function(test, buggy, set){
  60149. try {
  60150. set = __webpack_require__(143)(Function.call, __webpack_require__(129).f(Object.prototype, '__proto__').set, 2);
  60151. set(test, []);
  60152. buggy = !(test instanceof Array);
  60153. } catch(e){ buggy = true; }
  60154. return function setPrototypeOf(O, proto){
  60155. check(O, proto);
  60156. if(buggy)O.__proto__ = proto;
  60157. else set(O, proto);
  60158. return O;
  60159. };
  60160. }({}, false) : undefined),
  60161. check: check
  60162. };
  60163. /***/ }),
  60164. /* 233 */
  60165. /***/ (function(module, exports, __webpack_require__) {
  60166. module.exports = { "default": __webpack_require__(234), __esModule: true };
  60167. /***/ }),
  60168. /* 234 */
  60169. /***/ (function(module, exports, __webpack_require__) {
  60170. __webpack_require__(235);
  60171. var $Object = __webpack_require__(142).Object;
  60172. module.exports = function create(P, D){
  60173. return $Object.create(P, D);
  60174. };
  60175. /***/ }),
  60176. /* 235 */
  60177. /***/ (function(module, exports, __webpack_require__) {
  60178. var $export = __webpack_require__(141)
  60179. // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
  60180. $export($export.S, 'Object', {create: __webpack_require__(159)});
  60181. /***/ }),
  60182. /* 236 */
  60183. /***/ (function(module, exports, __webpack_require__) {
  60184. module.exports = { "default": __webpack_require__(237), __esModule: true };
  60185. /***/ }),
  60186. /* 237 */
  60187. /***/ (function(module, exports, __webpack_require__) {
  60188. __webpack_require__(238);
  60189. var $Object = __webpack_require__(142).Object;
  60190. module.exports = function defineProperties(T, D){
  60191. return $Object.defineProperties(T, D);
  60192. };
  60193. /***/ }),
  60194. /* 238 */
  60195. /***/ (function(module, exports, __webpack_require__) {
  60196. var $export = __webpack_require__(141);
  60197. // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
  60198. $export($export.S + $export.F * !__webpack_require__(136), 'Object', {defineProperties: __webpack_require__(160)});
  60199. /***/ }),
  60200. /* 239 */
  60201. /***/ (function(module, exports, __webpack_require__) {
  60202. var pSlice = Array.prototype.slice;
  60203. var objectKeys = __webpack_require__(240);
  60204. var isArguments = __webpack_require__(241);
  60205. var deepEqual = module.exports = function (actual, expected, opts) {
  60206. if (!opts) opts = {};
  60207. // 7.1. All identical values are equivalent, as determined by ===.
  60208. if (actual === expected) {
  60209. return true;
  60210. } else if (actual instanceof Date && expected instanceof Date) {
  60211. return actual.getTime() === expected.getTime();
  60212. // 7.3. Other pairs that do not both pass typeof value == 'object',
  60213. // equivalence is determined by ==.
  60214. } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
  60215. return opts.strict ? actual === expected : actual == expected;
  60216. // 7.4. For all other Object pairs, including Array objects, equivalence is
  60217. // determined by having the same number of owned properties (as verified
  60218. // with Object.prototype.hasOwnProperty.call), the same set of keys
  60219. // (although not necessarily the same order), equivalent values for every
  60220. // corresponding key, and an identical 'prototype' property. Note: this
  60221. // accounts for both named and indexed properties on Arrays.
  60222. } else {
  60223. return objEquiv(actual, expected, opts);
  60224. }
  60225. }
  60226. function isUndefinedOrNull(value) {
  60227. return value === null || value === undefined;
  60228. }
  60229. function isBuffer (x) {
  60230. if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
  60231. if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
  60232. return false;
  60233. }
  60234. if (x.length > 0 && typeof x[0] !== 'number') return false;
  60235. return true;
  60236. }
  60237. function objEquiv(a, b, opts) {
  60238. var i, key;
  60239. if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
  60240. return false;
  60241. // an identical 'prototype' property.
  60242. if (a.prototype !== b.prototype) return false;
  60243. //~~~I've managed to break Object.keys through screwy arguments passing.
  60244. // Converting to array solves the problem.
  60245. if (isArguments(a)) {
  60246. if (!isArguments(b)) {
  60247. return false;
  60248. }
  60249. a = pSlice.call(a);
  60250. b = pSlice.call(b);
  60251. return deepEqual(a, b, opts);
  60252. }
  60253. if (isBuffer(a)) {
  60254. if (!isBuffer(b)) {
  60255. return false;
  60256. }
  60257. if (a.length !== b.length) return false;
  60258. for (i = 0; i < a.length; i++) {
  60259. if (a[i] !== b[i]) return false;
  60260. }
  60261. return true;
  60262. }
  60263. try {
  60264. var ka = objectKeys(a),
  60265. kb = objectKeys(b);
  60266. } catch (e) {//happens when one is a string literal and the other isn't
  60267. return false;
  60268. }
  60269. // having the same number of owned properties (keys incorporates
  60270. // hasOwnProperty)
  60271. if (ka.length != kb.length)
  60272. return false;
  60273. //the same set of keys (although not necessarily the same order),
  60274. ka.sort();
  60275. kb.sort();
  60276. //~~~cheap key test
  60277. for (i = ka.length - 1; i >= 0; i--) {
  60278. if (ka[i] != kb[i])
  60279. return false;
  60280. }
  60281. //equivalent values for every corresponding key, and
  60282. //~~~possibly expensive deep test
  60283. for (i = ka.length - 1; i >= 0; i--) {
  60284. key = ka[i];
  60285. if (!deepEqual(a[key], b[key], opts)) return false;
  60286. }
  60287. return typeof a === typeof b;
  60288. }
  60289. /***/ }),
  60290. /* 240 */
  60291. /***/ (function(module, exports) {
  60292. exports = module.exports = typeof Object.keys === 'function'
  60293. ? Object.keys : shim;
  60294. exports.shim = shim;
  60295. function shim (obj) {
  60296. var keys = [];
  60297. for (var key in obj) keys.push(key);
  60298. return keys;
  60299. }
  60300. /***/ }),
  60301. /* 241 */
  60302. /***/ (function(module, exports) {
  60303. var supportsArgumentsClass = (function(){
  60304. return Object.prototype.toString.call(arguments)
  60305. })() == '[object Arguments]';
  60306. exports = module.exports = supportsArgumentsClass ? supported : unsupported;
  60307. exports.supported = supported;
  60308. function supported(object) {
  60309. return Object.prototype.toString.call(object) == '[object Arguments]';
  60310. };
  60311. exports.unsupported = unsupported;
  60312. function unsupported(object){
  60313. return object &&
  60314. typeof object == 'object' &&
  60315. typeof object.length == 'number' &&
  60316. Object.prototype.hasOwnProperty.call(object, 'callee') &&
  60317. !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
  60318. false;
  60319. };
  60320. /***/ }),
  60321. /* 242 */
  60322. /***/ (function(module, exports, __webpack_require__) {
  60323. module.exports = { "default": __webpack_require__(243), __esModule: true };
  60324. /***/ }),
  60325. /* 243 */
  60326. /***/ (function(module, exports, __webpack_require__) {
  60327. __webpack_require__(244);
  60328. module.exports = __webpack_require__(142).Object.assign;
  60329. /***/ }),
  60330. /* 244 */
  60331. /***/ (function(module, exports, __webpack_require__) {
  60332. // 19.1.3.1 Object.assign(target, source)
  60333. var $export = __webpack_require__(141);
  60334. $export($export.S + $export.F, 'Object', {assign: __webpack_require__(245)});
  60335. /***/ }),
  60336. /* 245 */
  60337. /***/ (function(module, exports, __webpack_require__) {
  60338. 'use strict';
  60339. // 19.1.2.1 Object.assign(target, source, ...)
  60340. var getKeys = __webpack_require__(161)
  60341. , gOPS = __webpack_require__(198)
  60342. , pIE = __webpack_require__(130)
  60343. , toObject = __webpack_require__(175)
  60344. , IObject = __webpack_require__(126)
  60345. , $assign = Object.assign;
  60346. // should work with symbols and should have deterministic property order (V8 bug)
  60347. module.exports = !$assign || __webpack_require__(137)(function(){
  60348. var A = {}
  60349. , B = {}
  60350. , S = Symbol()
  60351. , K = 'abcdefghijklmnopqrst';
  60352. A[S] = 7;
  60353. K.split('').forEach(function(k){ B[k] = k; });
  60354. return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
  60355. }) ? function assign(target, source){ // eslint-disable-line no-unused-vars
  60356. var T = toObject(target)
  60357. , aLen = arguments.length
  60358. , index = 1
  60359. , getSymbols = gOPS.f
  60360. , isEnum = pIE.f;
  60361. while(aLen > index){
  60362. var S = IObject(arguments[index++])
  60363. , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)
  60364. , length = keys.length
  60365. , j = 0
  60366. , key;
  60367. while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];
  60368. } return T;
  60369. } : $assign;
  60370. /***/ }),
  60371. /* 246 */
  60372. /***/ (function(module, exports, __webpack_require__) {
  60373. module.exports = { "default": __webpack_require__(247), __esModule: true };
  60374. /***/ }),
  60375. /* 247 */
  60376. /***/ (function(module, exports, __webpack_require__) {
  60377. __webpack_require__(248);
  60378. module.exports = __webpack_require__(142).String.fromCodePoint;
  60379. /***/ }),
  60380. /* 248 */
  60381. /***/ (function(module, exports, __webpack_require__) {
  60382. var $export = __webpack_require__(141)
  60383. , toIndex = __webpack_require__(166)
  60384. , fromCharCode = String.fromCharCode
  60385. , $fromCodePoint = String.fromCodePoint;
  60386. // length should be 1, old FF problem
  60387. $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
  60388. // 21.1.2.2 String.fromCodePoint(...codePoints)
  60389. fromCodePoint: function fromCodePoint(x){ // eslint-disable-line no-unused-vars
  60390. var res = []
  60391. , aLen = arguments.length
  60392. , i = 0
  60393. , code;
  60394. while(aLen > i){
  60395. code = +arguments[i++];
  60396. if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');
  60397. res.push(code < 0x10000
  60398. ? fromCharCode(code)
  60399. : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
  60400. );
  60401. } return res.join('');
  60402. }
  60403. });
  60404. /***/ }),
  60405. /* 249 */
  60406. /***/ (function(module, exports, __webpack_require__) {
  60407. module.exports = { "default": __webpack_require__(250), __esModule: true };
  60408. /***/ }),
  60409. /* 250 */
  60410. /***/ (function(module, exports, __webpack_require__) {
  60411. __webpack_require__(176);
  60412. __webpack_require__(251);
  60413. module.exports = __webpack_require__(142).Array.from;
  60414. /***/ }),
  60415. /* 251 */
  60416. /***/ (function(module, exports, __webpack_require__) {
  60417. 'use strict';
  60418. var ctx = __webpack_require__(143)
  60419. , $export = __webpack_require__(141)
  60420. , toObject = __webpack_require__(175)
  60421. , call = __webpack_require__(217)
  60422. , isArrayIter = __webpack_require__(218)
  60423. , toLength = __webpack_require__(164)
  60424. , createProperty = __webpack_require__(252)
  60425. , getIterFn = __webpack_require__(179);
  60426. $export($export.S + $export.F * !__webpack_require__(253)(function(iter){ Array.from(iter); }), 'Array', {
  60427. // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
  60428. from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){
  60429. var O = toObject(arrayLike)
  60430. , C = typeof this == 'function' ? this : Array
  60431. , aLen = arguments.length
  60432. , mapfn = aLen > 1 ? arguments[1] : undefined
  60433. , mapping = mapfn !== undefined
  60434. , index = 0
  60435. , iterFn = getIterFn(O)
  60436. , length, result, step, iterator;
  60437. if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
  60438. // if object isn't iterable or it's array with default iterator - use simple case
  60439. if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
  60440. for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){
  60441. createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
  60442. }
  60443. } else {
  60444. length = toLength(O.length);
  60445. for(result = new C(length); length > index; index++){
  60446. createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
  60447. }
  60448. }
  60449. result.length = index;
  60450. return result;
  60451. }
  60452. });
  60453. /***/ }),
  60454. /* 252 */
  60455. /***/ (function(module, exports, __webpack_require__) {
  60456. 'use strict';
  60457. var $defineProperty = __webpack_require__(146)
  60458. , createDesc = __webpack_require__(131);
  60459. module.exports = function(object, index, value){
  60460. if(index in object)$defineProperty.f(object, index, createDesc(0, value));
  60461. else object[index] = value;
  60462. };
  60463. /***/ }),
  60464. /* 253 */
  60465. /***/ (function(module, exports, __webpack_require__) {
  60466. var ITERATOR = __webpack_require__(173)('iterator')
  60467. , SAFE_CLOSING = false;
  60468. try {
  60469. var riter = [7][ITERATOR]();
  60470. riter['return'] = function(){ SAFE_CLOSING = true; };
  60471. Array.from(riter, function(){ throw 2; });
  60472. } catch(e){ /* empty */ }
  60473. module.exports = function(exec, skipClosing){
  60474. if(!skipClosing && !SAFE_CLOSING)return false;
  60475. var safe = false;
  60476. try {
  60477. var arr = [7]
  60478. , iter = arr[ITERATOR]();
  60479. iter.next = function(){ return {done: safe = true}; };
  60480. arr[ITERATOR] = function(){ return iter; };
  60481. exec(arr);
  60482. } catch(e){ /* empty */ }
  60483. return safe;
  60484. };
  60485. /***/ }),
  60486. /* 254 */
  60487. /***/ (function(module, exports, __webpack_require__) {
  60488. module.exports = { "default": __webpack_require__(255), __esModule: true };
  60489. /***/ }),
  60490. /* 255 */
  60491. /***/ (function(module, exports, __webpack_require__) {
  60492. __webpack_require__(202);
  60493. __webpack_require__(176);
  60494. __webpack_require__(150);
  60495. __webpack_require__(256);
  60496. __webpack_require__(257);
  60497. module.exports = __webpack_require__(142).Set;
  60498. /***/ }),
  60499. /* 256 */
  60500. /***/ (function(module, exports, __webpack_require__) {
  60501. 'use strict';
  60502. var strong = __webpack_require__(213);
  60503. // 23.2 Set Objects
  60504. module.exports = __webpack_require__(220)('Set', function(get){
  60505. return function Set(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };
  60506. }, {
  60507. // 23.2.3.1 Set.prototype.add(value)
  60508. add: function add(value){
  60509. return strong.def(this, value = value === 0 ? 0 : value, value);
  60510. }
  60511. }, strong);
  60512. /***/ }),
  60513. /* 257 */
  60514. /***/ (function(module, exports, __webpack_require__) {
  60515. // https://github.com/DavidBruant/Map-Set.prototype.toJSON
  60516. var $export = __webpack_require__(141);
  60517. $export($export.P + $export.R, 'Set', {toJSON: __webpack_require__(225)('Set')});
  60518. /***/ }),
  60519. /* 258 */
  60520. /***/ (function(module, exports, __webpack_require__) {
  60521. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.9.1
  60522. var CATEGORY_BITS, CATEGORY_MASK, CATEGORY_SHIFT, COMBINING_BITS, COMBINING_MASK, COMBINING_SHIFT, EAW_BITS, EAW_MASK, EAW_SHIFT, NUMBER_BITS, NUMBER_MASK, SCRIPT_BITS, SCRIPT_MASK, SCRIPT_SHIFT, UnicodeTrie, bits, data, fs, log2, trie;
  60523. UnicodeTrie = __webpack_require__(17);
  60524. data = __webpack_require__(259);
  60525. trie = new UnicodeTrie(Buffer("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","base64"));
  60526. log2 = Math.log2 || function(n) {
  60527. return Math.log(n) / Math.LN2;
  60528. };
  60529. bits = function(n) {
  60530. return (log2(n) + 1) | 0;
  60531. };
  60532. CATEGORY_BITS = bits(data.categories.length - 1);
  60533. COMBINING_BITS = bits(data.combiningClasses.length - 1);
  60534. SCRIPT_BITS = bits(data.scripts.length - 1);
  60535. EAW_BITS = bits(data.eaw.length - 1);
  60536. NUMBER_BITS = 10;
  60537. CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;
  60538. COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;
  60539. SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;
  60540. EAW_SHIFT = NUMBER_BITS;
  60541. CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;
  60542. COMBINING_MASK = (1 << COMBINING_BITS) - 1;
  60543. SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;
  60544. EAW_MASK = (1 << EAW_BITS) - 1;
  60545. NUMBER_MASK = (1 << NUMBER_BITS) - 1;
  60546. exports.getCategory = function(codePoint) {
  60547. var val;
  60548. val = trie.get(codePoint);
  60549. return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];
  60550. };
  60551. exports.getCombiningClass = function(codePoint) {
  60552. var val;
  60553. val = trie.get(codePoint);
  60554. return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];
  60555. };
  60556. exports.getScript = function(codePoint) {
  60557. var val;
  60558. val = trie.get(codePoint);
  60559. return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];
  60560. };
  60561. exports.getEastAsianWidth = function(codePoint) {
  60562. var val;
  60563. val = trie.get(codePoint);
  60564. return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];
  60565. };
  60566. exports.getNumericValue = function(codePoint) {
  60567. var denominator, exp, num, numerator, val;
  60568. val = trie.get(codePoint);
  60569. num = val & NUMBER_MASK;
  60570. if (num === 0) {
  60571. return null;
  60572. } else if (num <= 50) {
  60573. return num - 1;
  60574. } else if (num < 0x1e0) {
  60575. numerator = (num >> 4) - 12;
  60576. denominator = (num & 0xf) + 1;
  60577. return numerator / denominator;
  60578. } else if (num < 0x300) {
  60579. val = (num >> 5) - 14;
  60580. exp = (num & 0x1f) + 2;
  60581. while (exp > 0) {
  60582. val *= 10;
  60583. exp--;
  60584. }
  60585. return val;
  60586. } else {
  60587. val = (num >> 2) - 0xbf;
  60588. exp = (num & 3) + 1;
  60589. while (exp > 0) {
  60590. val *= 60;
  60591. exp--;
  60592. }
  60593. return val;
  60594. }
  60595. };
  60596. exports.isAlphabetic = function(codePoint) {
  60597. var ref;
  60598. return (ref = exports.getCategory(codePoint)) === 'Lu' || ref === 'Ll' || ref === 'Lt' || ref === 'Lm' || ref === 'Lo' || ref === 'Nl';
  60599. };
  60600. exports.isDigit = function(codePoint) {
  60601. return exports.getCategory(codePoint) === 'Nd';
  60602. };
  60603. exports.isPunctuation = function(codePoint) {
  60604. var ref;
  60605. return (ref = exports.getCategory(codePoint)) === 'Pc' || ref === 'Pd' || ref === 'Pe' || ref === 'Pf' || ref === 'Pi' || ref === 'Po' || ref === 'Ps';
  60606. };
  60607. exports.isLowerCase = function(codePoint) {
  60608. return exports.getCategory(codePoint) === 'Ll';
  60609. };
  60610. exports.isUpperCase = function(codePoint) {
  60611. return exports.getCategory(codePoint) === 'Lu';
  60612. };
  60613. exports.isTitleCase = function(codePoint) {
  60614. return exports.getCategory(codePoint) === 'Lt';
  60615. };
  60616. exports.isWhiteSpace = function(codePoint) {
  60617. var ref;
  60618. return (ref = exports.getCategory(codePoint)) === 'Zs' || ref === 'Zl' || ref === 'Zp';
  60619. };
  60620. exports.isBaseForm = function(codePoint) {
  60621. var ref;
  60622. return (ref = exports.getCategory(codePoint)) === 'Nd' || ref === 'No' || ref === 'Nl' || ref === 'Lu' || ref === 'Ll' || ref === 'Lt' || ref === 'Lm' || ref === 'Lo' || ref === 'Me' || ref === 'Mc';
  60623. };
  60624. exports.isMark = function(codePoint) {
  60625. var ref;
  60626. return (ref = exports.getCategory(codePoint)) === 'Mn' || ref === 'Me' || ref === 'Mc';
  60627. };
  60628. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  60629. /***/ }),
  60630. /* 259 */
  60631. /***/ (function(module, exports) {
  60632. module.exports = {"categories":["Cc","Zs","Po","Sc","Ps","Pe","Sm","Pd","Nd","Lu","Sk","Pc","Ll","So","Lo","Pi","Cf","No","Pf","Lt","Lm","Mn","Me","Mc","Nl","Zl","Zp","Cs","Co"],"combiningClasses":["Not_Reordered","Above","Above_Right","Below","Attached_Above_Right","Attached_Below","Overlay","Iota_Subscript","Double_Below","Double_Above","Below_Right","Above_Left","CCC10","CCC11","CCC12","CCC13","CCC14","CCC15","CCC16","CCC17","CCC18","CCC19","CCC20","CCC21","CCC22","CCC23","CCC24","CCC25","CCC30","CCC31","CCC32","CCC27","CCC28","CCC29","CCC33","CCC34","CCC35","CCC36","Nukta","Virama","CCC84","CCC91","CCC103","CCC107","CCC118","CCC122","CCC129","CCC130","CCC132","Attached_Above","Below_Left","Left","Kana_Voicing","CCC26","Right"],"scripts":["Common","Latin","Bopomofo","Inherited","Greek","Coptic","Cyrillic","Armenian","Hebrew","Arabic","Syriac","Thaana","Nko","Samaritan","Mandaic","Devanagari","Bengali","Gurmukhi","Gujarati","Oriya","Tamil","Telugu","Kannada","Malayalam","Sinhala","Thai","Lao","Tibetan","Myanmar","Georgian","Hangul","Ethiopic","Cherokee","Canadian_Aboriginal","Ogham","Runic","Tagalog","Hanunoo","Buhid","Tagbanwa","Khmer","Mongolian","Limbu","Tai_Le","New_Tai_Lue","Buginese","Tai_Tham","Balinese","Sundanese","Batak","Lepcha","Ol_Chiki","Braille","Glagolitic","Tifinagh","Han","Hiragana","Katakana","Yi","Lisu","Vai","Bamum","Syloti_Nagri","Phags_Pa","Saurashtra","Kayah_Li","Rejang","Javanese","Cham","Tai_Viet","Meetei_Mayek","null","Linear_B","Lycian","Carian","Old_Italic","Gothic","Old_Permic","Ugaritic","Old_Persian","Deseret","Shavian","Osmanya","Elbasan","Caucasian_Albanian","Linear_A","Cypriot","Imperial_Aramaic","Palmyrene","Nabataean","Hatran","Phoenician","Lydian","Meroitic_Hieroglyphs","Meroitic_Cursive","Kharoshthi","Old_South_Arabian","Old_North_Arabian","Manichaean","Avestan","Inscriptional_Parthian","Inscriptional_Pahlavi","Psalter_Pahlavi","Old_Turkic","Old_Hungarian","Brahmi","Kaithi","Sora_Sompeng","Chakma","Mahajani","Sharada","Khojki","Multani","Khudawadi","Grantha","Tirhuta","Siddham","Modi","Takri","Ahom","Warang_Citi","Pau_Cin_Hau","Cuneiform","Egyptian_Hieroglyphs","Anatolian_Hieroglyphs","Mro","Bassa_Vah","Pahawh_Hmong","Miao","Duployan","SignWriting","Mende_Kikakui"],"eaw":["N","Na","A","W","H","F"]}
  60633. /***/ }),
  60634. /* 260 */
  60635. /***/ (function(module, exports, __webpack_require__) {
  60636. 'use strict';
  60637. function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
  60638. var _slicedToArray = _interopDefault(__webpack_require__(261));
  60639. var _getIterator = _interopDefault(__webpack_require__(148));
  60640. var _defineProperty = _interopDefault(__webpack_require__(265));
  60641. var _regeneratorRuntime = _interopDefault(__webpack_require__(266));
  60642. var _Symbol$iterator = _interopDefault(__webpack_require__(189));
  60643. var _classCallCheck = _interopDefault(__webpack_require__(208));
  60644. var _createClass = _interopDefault(__webpack_require__(209));
  60645. var INITIAL_STATE = 1;
  60646. var FAIL_STATE = 0;
  60647. /**
  60648. * A StateMachine represents a deterministic finite automaton.
  60649. * It can perform matches over a sequence of values, similar to a regular expression.
  60650. */
  60651. var StateMachine = function () {
  60652. function StateMachine(dfa) {
  60653. _classCallCheck(this, StateMachine);
  60654. this.stateTable = dfa.stateTable;
  60655. this.accepting = dfa.accepting;
  60656. this.tags = dfa.tags;
  60657. }
  60658. /**
  60659. * Returns an iterable object that yields pattern matches over the input sequence.
  60660. * Matches are of the form [startIndex, endIndex, tags].
  60661. */
  60662. _createClass(StateMachine, [{
  60663. key: 'match',
  60664. value: function match(str) {
  60665. var self = this;
  60666. return _defineProperty({}, _Symbol$iterator, _regeneratorRuntime.mark(function _callee() {
  60667. var state, startRun, lastAccepting, lastState, p, c;
  60668. return _regeneratorRuntime.wrap(function _callee$(_context) {
  60669. while (1) {
  60670. switch (_context.prev = _context.next) {
  60671. case 0:
  60672. state = INITIAL_STATE;
  60673. startRun = null;
  60674. lastAccepting = null;
  60675. lastState = null;
  60676. p = 0;
  60677. case 5:
  60678. if (!(p < str.length)) {
  60679. _context.next = 21;
  60680. break;
  60681. }
  60682. c = str[p];
  60683. lastState = state;
  60684. state = self.stateTable[state][c];
  60685. if (!(state === FAIL_STATE)) {
  60686. _context.next = 15;
  60687. break;
  60688. }
  60689. if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) {
  60690. _context.next = 13;
  60691. break;
  60692. }
  60693. _context.next = 13;
  60694. return [startRun, lastAccepting, self.tags[lastState]];
  60695. case 13:
  60696. // reset the state as if we started over from the initial state
  60697. state = self.stateTable[INITIAL_STATE][c];
  60698. startRun = null;
  60699. case 15:
  60700. // start a run if not in the failure state
  60701. if (state !== FAIL_STATE && startRun == null) {
  60702. startRun = p;
  60703. }
  60704. // if accepting, mark the potential match end
  60705. if (self.accepting[state]) {
  60706. lastAccepting = p;
  60707. }
  60708. // reset the state to the initial state if we get into the failure state
  60709. if (state === FAIL_STATE) {
  60710. state = INITIAL_STATE;
  60711. }
  60712. case 18:
  60713. p++;
  60714. _context.next = 5;
  60715. break;
  60716. case 21:
  60717. if (!(startRun != null && lastAccepting != null && lastAccepting >= startRun)) {
  60718. _context.next = 24;
  60719. break;
  60720. }
  60721. _context.next = 24;
  60722. return [startRun, lastAccepting, self.tags[state]];
  60723. case 24:
  60724. case 'end':
  60725. return _context.stop();
  60726. }
  60727. }
  60728. }, _callee, this);
  60729. }));
  60730. }
  60731. /**
  60732. * For each match over the input sequence, action functions matching
  60733. * the tag definitions in the input pattern are called with the startIndex,
  60734. * endIndex, and sub-match sequence.
  60735. */
  60736. }, {
  60737. key: 'apply',
  60738. value: function apply(str, actions) {
  60739. var _iteratorNormalCompletion = true;
  60740. var _didIteratorError = false;
  60741. var _iteratorError = undefined;
  60742. try {
  60743. for (var _iterator = _getIterator(this.match(str)), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  60744. var _step$value = _slicedToArray(_step.value, 3);
  60745. var start = _step$value[0];
  60746. var end = _step$value[1];
  60747. var tags = _step$value[2];
  60748. var _iteratorNormalCompletion2 = true;
  60749. var _didIteratorError2 = false;
  60750. var _iteratorError2 = undefined;
  60751. try {
  60752. for (var _iterator2 = _getIterator(tags), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
  60753. var tag = _step2.value;
  60754. if (typeof actions[tag] === 'function') {
  60755. actions[tag](start, end, str.slice(start, end + 1));
  60756. }
  60757. }
  60758. } catch (err) {
  60759. _didIteratorError2 = true;
  60760. _iteratorError2 = err;
  60761. } finally {
  60762. try {
  60763. if (!_iteratorNormalCompletion2 && _iterator2.return) {
  60764. _iterator2.return();
  60765. }
  60766. } finally {
  60767. if (_didIteratorError2) {
  60768. throw _iteratorError2;
  60769. }
  60770. }
  60771. }
  60772. }
  60773. } catch (err) {
  60774. _didIteratorError = true;
  60775. _iteratorError = err;
  60776. } finally {
  60777. try {
  60778. if (!_iteratorNormalCompletion && _iterator.return) {
  60779. _iterator.return();
  60780. }
  60781. } finally {
  60782. if (_didIteratorError) {
  60783. throw _iteratorError;
  60784. }
  60785. }
  60786. }
  60787. }
  60788. }]);
  60789. return StateMachine;
  60790. }();
  60791. module.exports = StateMachine;
  60792. /***/ }),
  60793. /* 261 */
  60794. /***/ (function(module, exports, __webpack_require__) {
  60795. "use strict";
  60796. exports.__esModule = true;
  60797. var _isIterable2 = __webpack_require__(262);
  60798. var _isIterable3 = _interopRequireDefault(_isIterable2);
  60799. var _getIterator2 = __webpack_require__(148);
  60800. var _getIterator3 = _interopRequireDefault(_getIterator2);
  60801. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  60802. exports.default = function () {
  60803. function sliceIterator(arr, i) {
  60804. var _arr = [];
  60805. var _n = true;
  60806. var _d = false;
  60807. var _e = undefined;
  60808. try {
  60809. for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
  60810. _arr.push(_s.value);
  60811. if (i && _arr.length === i) break;
  60812. }
  60813. } catch (err) {
  60814. _d = true;
  60815. _e = err;
  60816. } finally {
  60817. try {
  60818. if (!_n && _i["return"]) _i["return"]();
  60819. } finally {
  60820. if (_d) throw _e;
  60821. }
  60822. }
  60823. return _arr;
  60824. }
  60825. return function (arr, i) {
  60826. if (Array.isArray(arr)) {
  60827. return arr;
  60828. } else if ((0, _isIterable3.default)(Object(arr))) {
  60829. return sliceIterator(arr, i);
  60830. } else {
  60831. throw new TypeError("Invalid attempt to destructure non-iterable instance");
  60832. }
  60833. };
  60834. }();
  60835. /***/ }),
  60836. /* 262 */
  60837. /***/ (function(module, exports, __webpack_require__) {
  60838. module.exports = { "default": __webpack_require__(263), __esModule: true };
  60839. /***/ }),
  60840. /* 263 */
  60841. /***/ (function(module, exports, __webpack_require__) {
  60842. __webpack_require__(150);
  60843. __webpack_require__(176);
  60844. module.exports = __webpack_require__(264);
  60845. /***/ }),
  60846. /* 264 */
  60847. /***/ (function(module, exports, __webpack_require__) {
  60848. var classof = __webpack_require__(180)
  60849. , ITERATOR = __webpack_require__(173)('iterator')
  60850. , Iterators = __webpack_require__(154);
  60851. module.exports = __webpack_require__(142).isIterable = function(it){
  60852. var O = Object(it);
  60853. return O[ITERATOR] !== undefined
  60854. || '@@iterator' in O
  60855. || Iterators.hasOwnProperty(classof(O));
  60856. };
  60857. /***/ }),
  60858. /* 265 */
  60859. /***/ (function(module, exports, __webpack_require__) {
  60860. "use strict";
  60861. exports.__esModule = true;
  60862. var _defineProperty = __webpack_require__(205);
  60863. var _defineProperty2 = _interopRequireDefault(_defineProperty);
  60864. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  60865. exports.default = function (obj, key, value) {
  60866. if (key in obj) {
  60867. (0, _defineProperty2.default)(obj, key, {
  60868. value: value,
  60869. enumerable: true,
  60870. configurable: true,
  60871. writable: true
  60872. });
  60873. } else {
  60874. obj[key] = value;
  60875. }
  60876. return obj;
  60877. };
  60878. /***/ }),
  60879. /* 266 */
  60880. /***/ (function(module, exports, __webpack_require__) {
  60881. module.exports = __webpack_require__(267);
  60882. /***/ }),
  60883. /* 267 */
  60884. /***/ (function(module, exports, __webpack_require__) {
  60885. /* WEBPACK VAR INJECTION */(function(global) {// This method of obtaining a reference to the global object needs to be
  60886. // kept identical to the way it is obtained in runtime.js
  60887. var g =
  60888. typeof global === "object" ? global :
  60889. typeof window === "object" ? window :
  60890. typeof self === "object" ? self : this;
  60891. // Use `getOwnPropertyNames` because not all browsers support calling
  60892. // `hasOwnProperty` on the global `self` object in a worker. See #183.
  60893. var hadRuntime = g.regeneratorRuntime &&
  60894. Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
  60895. // Save the old regeneratorRuntime in case it needs to be restored later.
  60896. var oldRuntime = hadRuntime && g.regeneratorRuntime;
  60897. // Force reevalutation of runtime.js.
  60898. g.regeneratorRuntime = undefined;
  60899. module.exports = __webpack_require__(268);
  60900. if (hadRuntime) {
  60901. // Restore the original runtime.
  60902. g.regeneratorRuntime = oldRuntime;
  60903. } else {
  60904. // Remove the global property added by runtime.js.
  60905. try {
  60906. delete g.regeneratorRuntime;
  60907. } catch(e) {
  60908. g.regeneratorRuntime = undefined;
  60909. }
  60910. }
  60911. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  60912. /***/ }),
  60913. /* 268 */
  60914. /***/ (function(module, exports) {
  60915. /* WEBPACK VAR INJECTION */(function(global) {/**
  60916. * Copyright (c) 2014, Facebook, Inc.
  60917. * All rights reserved.
  60918. *
  60919. * This source code is licensed under the BSD-style license found in the
  60920. * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
  60921. * additional grant of patent rights can be found in the PATENTS file in
  60922. * the same directory.
  60923. */
  60924. !(function(global) {
  60925. "use strict";
  60926. var Op = Object.prototype;
  60927. var hasOwn = Op.hasOwnProperty;
  60928. var undefined; // More compressible than void 0.
  60929. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  60930. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  60931. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  60932. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  60933. var inModule = typeof module === "object";
  60934. var runtime = global.regeneratorRuntime;
  60935. if (runtime) {
  60936. if (inModule) {
  60937. // If regeneratorRuntime is defined globally and we're in a module,
  60938. // make the exports object identical to regeneratorRuntime.
  60939. module.exports = runtime;
  60940. }
  60941. // Don't bother evaluating the rest of this file if the runtime was
  60942. // already defined globally.
  60943. return;
  60944. }
  60945. // Define the runtime globally (as expected by generated code) as either
  60946. // module.exports (if we're in a module) or a new, empty object.
  60947. runtime = global.regeneratorRuntime = inModule ? module.exports : {};
  60948. function wrap(innerFn, outerFn, self, tryLocsList) {
  60949. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  60950. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  60951. var generator = Object.create(protoGenerator.prototype);
  60952. var context = new Context(tryLocsList || []);
  60953. // The ._invoke method unifies the implementations of the .next,
  60954. // .throw, and .return methods.
  60955. generator._invoke = makeInvokeMethod(innerFn, self, context);
  60956. return generator;
  60957. }
  60958. runtime.wrap = wrap;
  60959. // Try/catch helper to minimize deoptimizations. Returns a completion
  60960. // record like context.tryEntries[i].completion. This interface could
  60961. // have been (and was previously) designed to take a closure to be
  60962. // invoked without arguments, but in all the cases we care about we
  60963. // already have an existing method we want to call, so there's no need
  60964. // to create a new function object. We can even get away with assuming
  60965. // the method takes exactly one argument, since that happens to be true
  60966. // in every case, so we don't have to touch the arguments object. The
  60967. // only additional allocation required is the completion record, which
  60968. // has a stable shape and so hopefully should be cheap to allocate.
  60969. function tryCatch(fn, obj, arg) {
  60970. try {
  60971. return { type: "normal", arg: fn.call(obj, arg) };
  60972. } catch (err) {
  60973. return { type: "throw", arg: err };
  60974. }
  60975. }
  60976. var GenStateSuspendedStart = "suspendedStart";
  60977. var GenStateSuspendedYield = "suspendedYield";
  60978. var GenStateExecuting = "executing";
  60979. var GenStateCompleted = "completed";
  60980. // Returning this object from the innerFn has the same effect as
  60981. // breaking out of the dispatch switch statement.
  60982. var ContinueSentinel = {};
  60983. // Dummy constructor functions that we use as the .constructor and
  60984. // .constructor.prototype properties for functions that return Generator
  60985. // objects. For full spec compliance, you may wish to configure your
  60986. // minifier not to mangle the names of these two functions.
  60987. function Generator() {}
  60988. function GeneratorFunction() {}
  60989. function GeneratorFunctionPrototype() {}
  60990. // This is a polyfill for %IteratorPrototype% for environments that
  60991. // don't natively support it.
  60992. var IteratorPrototype = {};
  60993. IteratorPrototype[iteratorSymbol] = function () {
  60994. return this;
  60995. };
  60996. var getProto = Object.getPrototypeOf;
  60997. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  60998. if (NativeIteratorPrototype &&
  60999. NativeIteratorPrototype !== Op &&
  61000. hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  61001. // This environment has a native %IteratorPrototype%; use it instead
  61002. // of the polyfill.
  61003. IteratorPrototype = NativeIteratorPrototype;
  61004. }
  61005. var Gp = GeneratorFunctionPrototype.prototype =
  61006. Generator.prototype = Object.create(IteratorPrototype);
  61007. GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  61008. GeneratorFunctionPrototype.constructor = GeneratorFunction;
  61009. GeneratorFunctionPrototype[toStringTagSymbol] =
  61010. GeneratorFunction.displayName = "GeneratorFunction";
  61011. // Helper for defining the .next, .throw, and .return methods of the
  61012. // Iterator interface in terms of a single ._invoke method.
  61013. function defineIteratorMethods(prototype) {
  61014. ["next", "throw", "return"].forEach(function(method) {
  61015. prototype[method] = function(arg) {
  61016. return this._invoke(method, arg);
  61017. };
  61018. });
  61019. }
  61020. runtime.isGeneratorFunction = function(genFun) {
  61021. var ctor = typeof genFun === "function" && genFun.constructor;
  61022. return ctor
  61023. ? ctor === GeneratorFunction ||
  61024. // For the native GeneratorFunction constructor, the best we can
  61025. // do is to check its .name property.
  61026. (ctor.displayName || ctor.name) === "GeneratorFunction"
  61027. : false;
  61028. };
  61029. runtime.mark = function(genFun) {
  61030. if (Object.setPrototypeOf) {
  61031. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  61032. } else {
  61033. genFun.__proto__ = GeneratorFunctionPrototype;
  61034. if (!(toStringTagSymbol in genFun)) {
  61035. genFun[toStringTagSymbol] = "GeneratorFunction";
  61036. }
  61037. }
  61038. genFun.prototype = Object.create(Gp);
  61039. return genFun;
  61040. };
  61041. // Within the body of any async function, `await x` is transformed to
  61042. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  61043. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  61044. // meant to be awaited.
  61045. runtime.awrap = function(arg) {
  61046. return { __await: arg };
  61047. };
  61048. function AsyncIterator(generator) {
  61049. function invoke(method, arg, resolve, reject) {
  61050. var record = tryCatch(generator[method], generator, arg);
  61051. if (record.type === "throw") {
  61052. reject(record.arg);
  61053. } else {
  61054. var result = record.arg;
  61055. var value = result.value;
  61056. if (value &&
  61057. typeof value === "object" &&
  61058. hasOwn.call(value, "__await")) {
  61059. return Promise.resolve(value.__await).then(function(value) {
  61060. invoke("next", value, resolve, reject);
  61061. }, function(err) {
  61062. invoke("throw", err, resolve, reject);
  61063. });
  61064. }
  61065. return Promise.resolve(value).then(function(unwrapped) {
  61066. // When a yielded Promise is resolved, its final value becomes
  61067. // the .value of the Promise<{value,done}> result for the
  61068. // current iteration. If the Promise is rejected, however, the
  61069. // result for this iteration will be rejected with the same
  61070. // reason. Note that rejections of yielded Promises are not
  61071. // thrown back into the generator function, as is the case
  61072. // when an awaited Promise is rejected. This difference in
  61073. // behavior between yield and await is important, because it
  61074. // allows the consumer to decide what to do with the yielded
  61075. // rejection (swallow it and continue, manually .throw it back
  61076. // into the generator, abandon iteration, whatever). With
  61077. // await, by contrast, there is no opportunity to examine the
  61078. // rejection reason outside the generator function, so the
  61079. // only option is to throw it from the await expression, and
  61080. // let the generator function handle the exception.
  61081. result.value = unwrapped;
  61082. resolve(result);
  61083. }, reject);
  61084. }
  61085. }
  61086. if (typeof global.process === "object" && global.process.domain) {
  61087. invoke = global.process.domain.bind(invoke);
  61088. }
  61089. var previousPromise;
  61090. function enqueue(method, arg) {
  61091. function callInvokeWithMethodAndArg() {
  61092. return new Promise(function(resolve, reject) {
  61093. invoke(method, arg, resolve, reject);
  61094. });
  61095. }
  61096. return previousPromise =
  61097. // If enqueue has been called before, then we want to wait until
  61098. // all previous Promises have been resolved before calling invoke,
  61099. // so that results are always delivered in the correct order. If
  61100. // enqueue has not been called before, then it is important to
  61101. // call invoke immediately, without waiting on a callback to fire,
  61102. // so that the async generator function has the opportunity to do
  61103. // any necessary setup in a predictable way. This predictability
  61104. // is why the Promise constructor synchronously invokes its
  61105. // executor callback, and why async functions synchronously
  61106. // execute code before the first await. Since we implement simple
  61107. // async functions in terms of async generators, it is especially
  61108. // important to get this right, even though it requires care.
  61109. previousPromise ? previousPromise.then(
  61110. callInvokeWithMethodAndArg,
  61111. // Avoid propagating failures to Promises returned by later
  61112. // invocations of the iterator.
  61113. callInvokeWithMethodAndArg
  61114. ) : callInvokeWithMethodAndArg();
  61115. }
  61116. // Define the unified helper method that is used to implement .next,
  61117. // .throw, and .return (see defineIteratorMethods).
  61118. this._invoke = enqueue;
  61119. }
  61120. defineIteratorMethods(AsyncIterator.prototype);
  61121. AsyncIterator.prototype[asyncIteratorSymbol] = function () {
  61122. return this;
  61123. };
  61124. runtime.AsyncIterator = AsyncIterator;
  61125. // Note that simple async functions are implemented on top of
  61126. // AsyncIterator objects; they just return a Promise for the value of
  61127. // the final result produced by the iterator.
  61128. runtime.async = function(innerFn, outerFn, self, tryLocsList) {
  61129. var iter = new AsyncIterator(
  61130. wrap(innerFn, outerFn, self, tryLocsList)
  61131. );
  61132. return runtime.isGeneratorFunction(outerFn)
  61133. ? iter // If outerFn is a generator, return the full iterator.
  61134. : iter.next().then(function(result) {
  61135. return result.done ? result.value : iter.next();
  61136. });
  61137. };
  61138. function makeInvokeMethod(innerFn, self, context) {
  61139. var state = GenStateSuspendedStart;
  61140. return function invoke(method, arg) {
  61141. if (state === GenStateExecuting) {
  61142. throw new Error("Generator is already running");
  61143. }
  61144. if (state === GenStateCompleted) {
  61145. if (method === "throw") {
  61146. throw arg;
  61147. }
  61148. // Be forgiving, per 25.3.3.3.3 of the spec:
  61149. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  61150. return doneResult();
  61151. }
  61152. context.method = method;
  61153. context.arg = arg;
  61154. while (true) {
  61155. var delegate = context.delegate;
  61156. if (delegate) {
  61157. var delegateResult = maybeInvokeDelegate(delegate, context);
  61158. if (delegateResult) {
  61159. if (delegateResult === ContinueSentinel) continue;
  61160. return delegateResult;
  61161. }
  61162. }
  61163. if (context.method === "next") {
  61164. // Setting context._sent for legacy support of Babel's
  61165. // function.sent implementation.
  61166. context.sent = context._sent = context.arg;
  61167. } else if (context.method === "throw") {
  61168. if (state === GenStateSuspendedStart) {
  61169. state = GenStateCompleted;
  61170. throw context.arg;
  61171. }
  61172. context.dispatchException(context.arg);
  61173. } else if (context.method === "return") {
  61174. context.abrupt("return", context.arg);
  61175. }
  61176. state = GenStateExecuting;
  61177. var record = tryCatch(innerFn, self, context);
  61178. if (record.type === "normal") {
  61179. // If an exception is thrown from innerFn, we leave state ===
  61180. // GenStateExecuting and loop back for another invocation.
  61181. state = context.done
  61182. ? GenStateCompleted
  61183. : GenStateSuspendedYield;
  61184. if (record.arg === ContinueSentinel) {
  61185. continue;
  61186. }
  61187. return {
  61188. value: record.arg,
  61189. done: context.done
  61190. };
  61191. } else if (record.type === "throw") {
  61192. state = GenStateCompleted;
  61193. // Dispatch the exception by looping back around to the
  61194. // context.dispatchException(context.arg) call above.
  61195. context.method = "throw";
  61196. context.arg = record.arg;
  61197. }
  61198. }
  61199. };
  61200. }
  61201. // Call delegate.iterator[context.method](context.arg) and handle the
  61202. // result, either by returning a { value, done } result from the
  61203. // delegate iterator, or by modifying context.method and context.arg,
  61204. // setting context.delegate to null, and returning the ContinueSentinel.
  61205. function maybeInvokeDelegate(delegate, context) {
  61206. var method = delegate.iterator[context.method];
  61207. if (method === undefined) {
  61208. // A .throw or .return when the delegate iterator has no .throw
  61209. // method always terminates the yield* loop.
  61210. context.delegate = null;
  61211. if (context.method === "throw") {
  61212. if (delegate.iterator.return) {
  61213. // If the delegate iterator has a return method, give it a
  61214. // chance to clean up.
  61215. context.method = "return";
  61216. context.arg = undefined;
  61217. maybeInvokeDelegate(delegate, context);
  61218. if (context.method === "throw") {
  61219. // If maybeInvokeDelegate(context) changed context.method from
  61220. // "return" to "throw", let that override the TypeError below.
  61221. return ContinueSentinel;
  61222. }
  61223. }
  61224. context.method = "throw";
  61225. context.arg = new TypeError(
  61226. "The iterator does not provide a 'throw' method");
  61227. }
  61228. return ContinueSentinel;
  61229. }
  61230. var record = tryCatch(method, delegate.iterator, context.arg);
  61231. if (record.type === "throw") {
  61232. context.method = "throw";
  61233. context.arg = record.arg;
  61234. context.delegate = null;
  61235. return ContinueSentinel;
  61236. }
  61237. var info = record.arg;
  61238. if (! info) {
  61239. context.method = "throw";
  61240. context.arg = new TypeError("iterator result is not an object");
  61241. context.delegate = null;
  61242. return ContinueSentinel;
  61243. }
  61244. if (info.done) {
  61245. // Assign the result of the finished delegate to the temporary
  61246. // variable specified by delegate.resultName (see delegateYield).
  61247. context[delegate.resultName] = info.value;
  61248. // Resume execution at the desired location (see delegateYield).
  61249. context.next = delegate.nextLoc;
  61250. // If context.method was "throw" but the delegate handled the
  61251. // exception, let the outer generator proceed normally. If
  61252. // context.method was "next", forget context.arg since it has been
  61253. // "consumed" by the delegate iterator. If context.method was
  61254. // "return", allow the original .return call to continue in the
  61255. // outer generator.
  61256. if (context.method !== "return") {
  61257. context.method = "next";
  61258. context.arg = undefined;
  61259. }
  61260. } else {
  61261. // Re-yield the result returned by the delegate method.
  61262. return info;
  61263. }
  61264. // The delegate iterator is finished, so forget it and continue with
  61265. // the outer generator.
  61266. context.delegate = null;
  61267. return ContinueSentinel;
  61268. }
  61269. // Define Generator.prototype.{next,throw,return} in terms of the
  61270. // unified ._invoke helper method.
  61271. defineIteratorMethods(Gp);
  61272. Gp[toStringTagSymbol] = "Generator";
  61273. // A Generator should always return itself as the iterator object when the
  61274. // @@iterator function is called on it. Some browsers' implementations of the
  61275. // iterator prototype chain incorrectly implement this, causing the Generator
  61276. // object to not be returned from this call. This ensures that doesn't happen.
  61277. // See https://github.com/facebook/regenerator/issues/274 for more details.
  61278. Gp[iteratorSymbol] = function() {
  61279. return this;
  61280. };
  61281. Gp.toString = function() {
  61282. return "[object Generator]";
  61283. };
  61284. function pushTryEntry(locs) {
  61285. var entry = { tryLoc: locs[0] };
  61286. if (1 in locs) {
  61287. entry.catchLoc = locs[1];
  61288. }
  61289. if (2 in locs) {
  61290. entry.finallyLoc = locs[2];
  61291. entry.afterLoc = locs[3];
  61292. }
  61293. this.tryEntries.push(entry);
  61294. }
  61295. function resetTryEntry(entry) {
  61296. var record = entry.completion || {};
  61297. record.type = "normal";
  61298. delete record.arg;
  61299. entry.completion = record;
  61300. }
  61301. function Context(tryLocsList) {
  61302. // The root entry object (effectively a try statement without a catch
  61303. // or a finally block) gives us a place to store values thrown from
  61304. // locations where there is no enclosing try statement.
  61305. this.tryEntries = [{ tryLoc: "root" }];
  61306. tryLocsList.forEach(pushTryEntry, this);
  61307. this.reset(true);
  61308. }
  61309. runtime.keys = function(object) {
  61310. var keys = [];
  61311. for (var key in object) {
  61312. keys.push(key);
  61313. }
  61314. keys.reverse();
  61315. // Rather than returning an object with a next method, we keep
  61316. // things simple and return the next function itself.
  61317. return function next() {
  61318. while (keys.length) {
  61319. var key = keys.pop();
  61320. if (key in object) {
  61321. next.value = key;
  61322. next.done = false;
  61323. return next;
  61324. }
  61325. }
  61326. // To avoid creating an additional object, we just hang the .value
  61327. // and .done properties off the next function object itself. This
  61328. // also ensures that the minifier will not anonymize the function.
  61329. next.done = true;
  61330. return next;
  61331. };
  61332. };
  61333. function values(iterable) {
  61334. if (iterable) {
  61335. var iteratorMethod = iterable[iteratorSymbol];
  61336. if (iteratorMethod) {
  61337. return iteratorMethod.call(iterable);
  61338. }
  61339. if (typeof iterable.next === "function") {
  61340. return iterable;
  61341. }
  61342. if (!isNaN(iterable.length)) {
  61343. var i = -1, next = function next() {
  61344. while (++i < iterable.length) {
  61345. if (hasOwn.call(iterable, i)) {
  61346. next.value = iterable[i];
  61347. next.done = false;
  61348. return next;
  61349. }
  61350. }
  61351. next.value = undefined;
  61352. next.done = true;
  61353. return next;
  61354. };
  61355. return next.next = next;
  61356. }
  61357. }
  61358. // Return an iterator with no values.
  61359. return { next: doneResult };
  61360. }
  61361. runtime.values = values;
  61362. function doneResult() {
  61363. return { value: undefined, done: true };
  61364. }
  61365. Context.prototype = {
  61366. constructor: Context,
  61367. reset: function(skipTempReset) {
  61368. this.prev = 0;
  61369. this.next = 0;
  61370. // Resetting context._sent for legacy support of Babel's
  61371. // function.sent implementation.
  61372. this.sent = this._sent = undefined;
  61373. this.done = false;
  61374. this.delegate = null;
  61375. this.method = "next";
  61376. this.arg = undefined;
  61377. this.tryEntries.forEach(resetTryEntry);
  61378. if (!skipTempReset) {
  61379. for (var name in this) {
  61380. // Not sure about the optimal order of these conditions:
  61381. if (name.charAt(0) === "t" &&
  61382. hasOwn.call(this, name) &&
  61383. !isNaN(+name.slice(1))) {
  61384. this[name] = undefined;
  61385. }
  61386. }
  61387. }
  61388. },
  61389. stop: function() {
  61390. this.done = true;
  61391. var rootEntry = this.tryEntries[0];
  61392. var rootRecord = rootEntry.completion;
  61393. if (rootRecord.type === "throw") {
  61394. throw rootRecord.arg;
  61395. }
  61396. return this.rval;
  61397. },
  61398. dispatchException: function(exception) {
  61399. if (this.done) {
  61400. throw exception;
  61401. }
  61402. var context = this;
  61403. function handle(loc, caught) {
  61404. record.type = "throw";
  61405. record.arg = exception;
  61406. context.next = loc;
  61407. if (caught) {
  61408. // If the dispatched exception was caught by a catch block,
  61409. // then let that catch block handle the exception normally.
  61410. context.method = "next";
  61411. context.arg = undefined;
  61412. }
  61413. return !! caught;
  61414. }
  61415. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  61416. var entry = this.tryEntries[i];
  61417. var record = entry.completion;
  61418. if (entry.tryLoc === "root") {
  61419. // Exception thrown outside of any try block that could handle
  61420. // it, so set the completion value of the entire function to
  61421. // throw the exception.
  61422. return handle("end");
  61423. }
  61424. if (entry.tryLoc <= this.prev) {
  61425. var hasCatch = hasOwn.call(entry, "catchLoc");
  61426. var hasFinally = hasOwn.call(entry, "finallyLoc");
  61427. if (hasCatch && hasFinally) {
  61428. if (this.prev < entry.catchLoc) {
  61429. return handle(entry.catchLoc, true);
  61430. } else if (this.prev < entry.finallyLoc) {
  61431. return handle(entry.finallyLoc);
  61432. }
  61433. } else if (hasCatch) {
  61434. if (this.prev < entry.catchLoc) {
  61435. return handle(entry.catchLoc, true);
  61436. }
  61437. } else if (hasFinally) {
  61438. if (this.prev < entry.finallyLoc) {
  61439. return handle(entry.finallyLoc);
  61440. }
  61441. } else {
  61442. throw new Error("try statement without catch or finally");
  61443. }
  61444. }
  61445. }
  61446. },
  61447. abrupt: function(type, arg) {
  61448. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  61449. var entry = this.tryEntries[i];
  61450. if (entry.tryLoc <= this.prev &&
  61451. hasOwn.call(entry, "finallyLoc") &&
  61452. this.prev < entry.finallyLoc) {
  61453. var finallyEntry = entry;
  61454. break;
  61455. }
  61456. }
  61457. if (finallyEntry &&
  61458. (type === "break" ||
  61459. type === "continue") &&
  61460. finallyEntry.tryLoc <= arg &&
  61461. arg <= finallyEntry.finallyLoc) {
  61462. // Ignore the finally entry if control is not jumping to a
  61463. // location outside the try/catch block.
  61464. finallyEntry = null;
  61465. }
  61466. var record = finallyEntry ? finallyEntry.completion : {};
  61467. record.type = type;
  61468. record.arg = arg;
  61469. if (finallyEntry) {
  61470. this.method = "next";
  61471. this.next = finallyEntry.finallyLoc;
  61472. return ContinueSentinel;
  61473. }
  61474. return this.complete(record);
  61475. },
  61476. complete: function(record, afterLoc) {
  61477. if (record.type === "throw") {
  61478. throw record.arg;
  61479. }
  61480. if (record.type === "break" ||
  61481. record.type === "continue") {
  61482. this.next = record.arg;
  61483. } else if (record.type === "return") {
  61484. this.rval = this.arg = record.arg;
  61485. this.method = "return";
  61486. this.next = "end";
  61487. } else if (record.type === "normal" && afterLoc) {
  61488. this.next = afterLoc;
  61489. }
  61490. return ContinueSentinel;
  61491. },
  61492. finish: function(finallyLoc) {
  61493. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  61494. var entry = this.tryEntries[i];
  61495. if (entry.finallyLoc === finallyLoc) {
  61496. this.complete(entry.completion, entry.afterLoc);
  61497. resetTryEntry(entry);
  61498. return ContinueSentinel;
  61499. }
  61500. }
  61501. },
  61502. "catch": function(tryLoc) {
  61503. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  61504. var entry = this.tryEntries[i];
  61505. if (entry.tryLoc === tryLoc) {
  61506. var record = entry.completion;
  61507. if (record.type === "throw") {
  61508. var thrown = record.arg;
  61509. resetTryEntry(entry);
  61510. }
  61511. return thrown;
  61512. }
  61513. }
  61514. // The context.catch method must only be called with a location
  61515. // argument that corresponds to a known catch block.
  61516. throw new Error("illegal catch attempt");
  61517. },
  61518. delegateYield: function(iterable, resultName, nextLoc) {
  61519. this.delegate = {
  61520. iterator: values(iterable),
  61521. resultName: resultName,
  61522. nextLoc: nextLoc
  61523. };
  61524. if (this.method === "next") {
  61525. // Deliberately forget the last sent value so that we don't
  61526. // accidentally pass it on to the delegate.
  61527. this.arg = undefined;
  61528. }
  61529. return ContinueSentinel;
  61530. }
  61531. };
  61532. })(
  61533. // Among the various tricks for obtaining a reference to the global
  61534. // object, this seems to be the most reliable technique that does not
  61535. // use indirect eval (which violates Content Security Policy).
  61536. typeof global === "object" ? global :
  61537. typeof window === "object" ? window :
  61538. typeof self === "object" ? self : this
  61539. );
  61540. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  61541. /***/ }),
  61542. /* 269 */
  61543. /***/ (function(module, exports, __webpack_require__) {
  61544. module.exports = { "default": __webpack_require__(270), __esModule: true };
  61545. /***/ }),
  61546. /* 270 */
  61547. /***/ (function(module, exports, __webpack_require__) {
  61548. __webpack_require__(271);
  61549. module.exports = Math.pow(2, -52);
  61550. /***/ }),
  61551. /* 271 */
  61552. /***/ (function(module, exports, __webpack_require__) {
  61553. // 20.1.2.1 Number.EPSILON
  61554. var $export = __webpack_require__(141);
  61555. $export($export.S, 'Number', {EPSILON: Math.pow(2, -52)});
  61556. /***/ }),
  61557. /* 272 */
  61558. /***/ (function(module, exports, __webpack_require__) {
  61559. /* WEBPACK VAR INJECTION */(function(Buffer) {var clone = (function() {
  61560. 'use strict';
  61561. /**
  61562. * Clones (copies) an Object using deep copying.
  61563. *
  61564. * This function supports circular references by default, but if you are certain
  61565. * there are no circular references in your object, you can save some CPU time
  61566. * by calling clone(obj, false).
  61567. *
  61568. * Caution: if `circular` is false and `parent` contains circular references,
  61569. * your program may enter an infinite loop and crash.
  61570. *
  61571. * @param `parent` - the object to be cloned
  61572. * @param `circular` - set to true if the object to be cloned may contain
  61573. * circular references. (optional - true by default)
  61574. * @param `depth` - set to a number if the object is only to be cloned to
  61575. * a particular depth. (optional - defaults to Infinity)
  61576. * @param `prototype` - sets the prototype to be used when cloning an object.
  61577. * (optional - defaults to parent prototype).
  61578. */
  61579. function clone(parent, circular, depth, prototype) {
  61580. var filter;
  61581. if (typeof circular === 'object') {
  61582. depth = circular.depth;
  61583. prototype = circular.prototype;
  61584. filter = circular.filter;
  61585. circular = circular.circular
  61586. }
  61587. // maintain two arrays for circular references, where corresponding parents
  61588. // and children have the same index
  61589. var allParents = [];
  61590. var allChildren = [];
  61591. var useBuffer = typeof Buffer != 'undefined';
  61592. if (typeof circular == 'undefined')
  61593. circular = true;
  61594. if (typeof depth == 'undefined')
  61595. depth = Infinity;
  61596. // recurse this function so we don't reset allParents and allChildren
  61597. function _clone(parent, depth) {
  61598. // cloning null always returns null
  61599. if (parent === null)
  61600. return null;
  61601. if (depth == 0)
  61602. return parent;
  61603. var child;
  61604. var proto;
  61605. if (typeof parent != 'object') {
  61606. return parent;
  61607. }
  61608. if (clone.__isArray(parent)) {
  61609. child = [];
  61610. } else if (clone.__isRegExp(parent)) {
  61611. child = new RegExp(parent.source, __getRegExpFlags(parent));
  61612. if (parent.lastIndex) child.lastIndex = parent.lastIndex;
  61613. } else if (clone.__isDate(parent)) {
  61614. child = new Date(parent.getTime());
  61615. } else if (useBuffer && Buffer.isBuffer(parent)) {
  61616. child = new Buffer(parent.length);
  61617. parent.copy(child);
  61618. return child;
  61619. } else {
  61620. if (typeof prototype == 'undefined') {
  61621. proto = Object.getPrototypeOf(parent);
  61622. child = Object.create(proto);
  61623. }
  61624. else {
  61625. child = Object.create(prototype);
  61626. proto = prototype;
  61627. }
  61628. }
  61629. if (circular) {
  61630. var index = allParents.indexOf(parent);
  61631. if (index != -1) {
  61632. return allChildren[index];
  61633. }
  61634. allParents.push(parent);
  61635. allChildren.push(child);
  61636. }
  61637. for (var i in parent) {
  61638. var attrs;
  61639. if (proto) {
  61640. attrs = Object.getOwnPropertyDescriptor(proto, i);
  61641. }
  61642. if (attrs && attrs.set == null) {
  61643. continue;
  61644. }
  61645. child[i] = _clone(parent[i], depth - 1);
  61646. }
  61647. return child;
  61648. }
  61649. return _clone(parent, depth);
  61650. }
  61651. /**
  61652. * Simple flat clone using prototype, accepts only objects, usefull for property
  61653. * override on FLAT configuration object (no nested props).
  61654. *
  61655. * USE WITH CAUTION! This may not behave as you wish if you do not know how this
  61656. * works.
  61657. */
  61658. clone.clonePrototype = function clonePrototype(parent) {
  61659. if (parent === null)
  61660. return null;
  61661. var c = function () {};
  61662. c.prototype = parent;
  61663. return new c();
  61664. };
  61665. // private utility functions
  61666. function __objToStr(o) {
  61667. return Object.prototype.toString.call(o);
  61668. };
  61669. clone.__objToStr = __objToStr;
  61670. function __isDate(o) {
  61671. return typeof o === 'object' && __objToStr(o) === '[object Date]';
  61672. };
  61673. clone.__isDate = __isDate;
  61674. function __isArray(o) {
  61675. return typeof o === 'object' && __objToStr(o) === '[object Array]';
  61676. };
  61677. clone.__isArray = __isArray;
  61678. function __isRegExp(o) {
  61679. return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
  61680. };
  61681. clone.__isRegExp = __isRegExp;
  61682. function __getRegExpFlags(re) {
  61683. var flags = '';
  61684. if (re.global) flags += 'g';
  61685. if (re.ignoreCase) flags += 'i';
  61686. if (re.multiline) flags += 'm';
  61687. return flags;
  61688. };
  61689. clone.__getRegExpFlags = __getRegExpFlags;
  61690. return clone;
  61691. })();
  61692. if (typeof module === 'object' && module.exports) {
  61693. module.exports = clone;
  61694. }
  61695. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  61696. /***/ }),
  61697. /* 273 */
  61698. /***/ (function(module, exports, __webpack_require__) {
  61699. module.exports = __webpack_require__(274).BrotliDecompressBuffer;
  61700. /***/ }),
  61701. /* 274 */
  61702. /***/ (function(module, exports, __webpack_require__) {
  61703. /* Copyright 2013 Google Inc. All Rights Reserved.
  61704. Licensed under the Apache License, Version 2.0 (the "License");
  61705. you may not use this file except in compliance with the License.
  61706. You may obtain a copy of the License at
  61707. http://www.apache.org/licenses/LICENSE-2.0
  61708. Unless required by applicable law or agreed to in writing, software
  61709. distributed under the License is distributed on an "AS IS" BASIS,
  61710. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  61711. See the License for the specific language governing permissions and
  61712. limitations under the License.
  61713. */
  61714. var BrotliInput = __webpack_require__(275).BrotliInput;
  61715. var BrotliOutput = __webpack_require__(275).BrotliOutput;
  61716. var BrotliBitReader = __webpack_require__(276);
  61717. var BrotliDictionary = __webpack_require__(277);
  61718. var HuffmanCode = __webpack_require__(281).HuffmanCode;
  61719. var BrotliBuildHuffmanTable = __webpack_require__(281).BrotliBuildHuffmanTable;
  61720. var Context = __webpack_require__(282);
  61721. var Prefix = __webpack_require__(283);
  61722. var Transform = __webpack_require__(284);
  61723. var kDefaultCodeLength = 8;
  61724. var kCodeLengthRepeatCode = 16;
  61725. var kNumLiteralCodes = 256;
  61726. var kNumInsertAndCopyCodes = 704;
  61727. var kNumBlockLengthCodes = 26;
  61728. var kLiteralContextBits = 6;
  61729. var kDistanceContextBits = 2;
  61730. var HUFFMAN_TABLE_BITS = 8;
  61731. var HUFFMAN_TABLE_MASK = 0xff;
  61732. /* Maximum possible Huffman table size for an alphabet size of 704, max code
  61733. * length 15 and root table bits 8. */
  61734. var HUFFMAN_MAX_TABLE_SIZE = 1080;
  61735. var CODE_LENGTH_CODES = 18;
  61736. var kCodeLengthCodeOrder = new Uint8Array([
  61737. 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  61738. ]);
  61739. var NUM_DISTANCE_SHORT_CODES = 16;
  61740. var kDistanceShortCodeIndexOffset = new Uint8Array([
  61741. 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2
  61742. ]);
  61743. var kDistanceShortCodeValueOffset = new Int8Array([
  61744. 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3
  61745. ]);
  61746. var kMaxHuffmanTableSize = new Uint16Array([
  61747. 256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,
  61748. 854, 886, 920, 952, 984, 1016, 1048, 1080
  61749. ]);
  61750. function DecodeWindowBits(br) {
  61751. var n;
  61752. if (br.readBits(1) === 0) {
  61753. return 16;
  61754. }
  61755. n = br.readBits(3);
  61756. if (n > 0) {
  61757. return 17 + n;
  61758. }
  61759. n = br.readBits(3);
  61760. if (n > 0) {
  61761. return 8 + n;
  61762. }
  61763. return 17;
  61764. }
  61765. /* Decodes a number in the range [0..255], by reading 1 - 11 bits. */
  61766. function DecodeVarLenUint8(br) {
  61767. if (br.readBits(1)) {
  61768. var nbits = br.readBits(3);
  61769. if (nbits === 0) {
  61770. return 1;
  61771. } else {
  61772. return br.readBits(nbits) + (1 << nbits);
  61773. }
  61774. }
  61775. return 0;
  61776. }
  61777. function MetaBlockLength() {
  61778. this.meta_block_length = 0;
  61779. this.input_end = 0;
  61780. this.is_uncompressed = 0;
  61781. this.is_metadata = false;
  61782. }
  61783. function DecodeMetaBlockLength(br) {
  61784. var out = new MetaBlockLength;
  61785. var size_nibbles;
  61786. var size_bytes;
  61787. var i;
  61788. out.input_end = br.readBits(1);
  61789. if (out.input_end && br.readBits(1)) {
  61790. return out;
  61791. }
  61792. size_nibbles = br.readBits(2) + 4;
  61793. if (size_nibbles === 7) {
  61794. out.is_metadata = true;
  61795. if (br.readBits(1) !== 0)
  61796. throw new Error('Invalid reserved bit');
  61797. size_bytes = br.readBits(2);
  61798. if (size_bytes === 0)
  61799. return out;
  61800. for (i = 0; i < size_bytes; i++) {
  61801. var next_byte = br.readBits(8);
  61802. if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0)
  61803. throw new Error('Invalid size byte');
  61804. out.meta_block_length |= next_byte << (i * 8);
  61805. }
  61806. } else {
  61807. for (i = 0; i < size_nibbles; ++i) {
  61808. var next_nibble = br.readBits(4);
  61809. if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0)
  61810. throw new Error('Invalid size nibble');
  61811. out.meta_block_length |= next_nibble << (i * 4);
  61812. }
  61813. }
  61814. ++out.meta_block_length;
  61815. if (!out.input_end && !out.is_metadata) {
  61816. out.is_uncompressed = br.readBits(1);
  61817. }
  61818. return out;
  61819. }
  61820. /* Decodes the next Huffman code from bit-stream. */
  61821. function ReadSymbol(table, index, br) {
  61822. var start_index = index;
  61823. var nbits;
  61824. br.fillBitWindow();
  61825. index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK;
  61826. nbits = table[index].bits - HUFFMAN_TABLE_BITS;
  61827. if (nbits > 0) {
  61828. br.bit_pos_ += HUFFMAN_TABLE_BITS;
  61829. index += table[index].value;
  61830. index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1);
  61831. }
  61832. br.bit_pos_ += table[index].bits;
  61833. return table[index].value;
  61834. }
  61835. function ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) {
  61836. var symbol = 0;
  61837. var prev_code_len = kDefaultCodeLength;
  61838. var repeat = 0;
  61839. var repeat_code_len = 0;
  61840. var space = 32768;
  61841. var table = [];
  61842. for (var i = 0; i < 32; i++)
  61843. table.push(new HuffmanCode(0, 0));
  61844. BrotliBuildHuffmanTable(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES);
  61845. while (symbol < num_symbols && space > 0) {
  61846. var p = 0;
  61847. var code_len;
  61848. br.readMoreInput();
  61849. br.fillBitWindow();
  61850. p += (br.val_ >>> br.bit_pos_) & 31;
  61851. br.bit_pos_ += table[p].bits;
  61852. code_len = table[p].value & 0xff;
  61853. if (code_len < kCodeLengthRepeatCode) {
  61854. repeat = 0;
  61855. code_lengths[symbol++] = code_len;
  61856. if (code_len !== 0) {
  61857. prev_code_len = code_len;
  61858. space -= 32768 >> code_len;
  61859. }
  61860. } else {
  61861. var extra_bits = code_len - 14;
  61862. var old_repeat;
  61863. var repeat_delta;
  61864. var new_len = 0;
  61865. if (code_len === kCodeLengthRepeatCode) {
  61866. new_len = prev_code_len;
  61867. }
  61868. if (repeat_code_len !== new_len) {
  61869. repeat = 0;
  61870. repeat_code_len = new_len;
  61871. }
  61872. old_repeat = repeat;
  61873. if (repeat > 0) {
  61874. repeat -= 2;
  61875. repeat <<= extra_bits;
  61876. }
  61877. repeat += br.readBits(extra_bits) + 3;
  61878. repeat_delta = repeat - old_repeat;
  61879. if (symbol + repeat_delta > num_symbols) {
  61880. throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols');
  61881. }
  61882. for (var x = 0; x < repeat_delta; x++)
  61883. code_lengths[symbol + x] = repeat_code_len;
  61884. symbol += repeat_delta;
  61885. if (repeat_code_len !== 0) {
  61886. space -= repeat_delta << (15 - repeat_code_len);
  61887. }
  61888. }
  61889. }
  61890. if (space !== 0) {
  61891. throw new Error("[ReadHuffmanCodeLengths] space = " + space);
  61892. }
  61893. for (; symbol < num_symbols; symbol++)
  61894. code_lengths[symbol] = 0;
  61895. }
  61896. function ReadHuffmanCode(alphabet_size, tables, table, br) {
  61897. var table_size = 0;
  61898. var simple_code_or_skip;
  61899. var code_lengths = new Uint8Array(alphabet_size);
  61900. br.readMoreInput();
  61901. /* simple_code_or_skip is used as follows:
  61902. 1 for simple code;
  61903. 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */
  61904. simple_code_or_skip = br.readBits(2);
  61905. if (simple_code_or_skip === 1) {
  61906. /* Read symbols, codes & code lengths directly. */
  61907. var i;
  61908. var max_bits_counter = alphabet_size - 1;
  61909. var max_bits = 0;
  61910. var symbols = new Int32Array(4);
  61911. var num_symbols = br.readBits(2) + 1;
  61912. while (max_bits_counter) {
  61913. max_bits_counter >>= 1;
  61914. ++max_bits;
  61915. }
  61916. for (i = 0; i < num_symbols; ++i) {
  61917. symbols[i] = br.readBits(max_bits) % alphabet_size;
  61918. code_lengths[symbols[i]] = 2;
  61919. }
  61920. code_lengths[symbols[0]] = 1;
  61921. switch (num_symbols) {
  61922. case 1:
  61923. break;
  61924. case 3:
  61925. if ((symbols[0] === symbols[1]) ||
  61926. (symbols[0] === symbols[2]) ||
  61927. (symbols[1] === symbols[2])) {
  61928. throw new Error('[ReadHuffmanCode] invalid symbols');
  61929. }
  61930. break;
  61931. case 2:
  61932. if (symbols[0] === symbols[1]) {
  61933. throw new Error('[ReadHuffmanCode] invalid symbols');
  61934. }
  61935. code_lengths[symbols[1]] = 1;
  61936. break;
  61937. case 4:
  61938. if ((symbols[0] === symbols[1]) ||
  61939. (symbols[0] === symbols[2]) ||
  61940. (symbols[0] === symbols[3]) ||
  61941. (symbols[1] === symbols[2]) ||
  61942. (symbols[1] === symbols[3]) ||
  61943. (symbols[2] === symbols[3])) {
  61944. throw new Error('[ReadHuffmanCode] invalid symbols');
  61945. }
  61946. if (br.readBits(1)) {
  61947. code_lengths[symbols[2]] = 3;
  61948. code_lengths[symbols[3]] = 3;
  61949. } else {
  61950. code_lengths[symbols[0]] = 2;
  61951. }
  61952. break;
  61953. }
  61954. } else { /* Decode Huffman-coded code lengths. */
  61955. var i;
  61956. var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES);
  61957. var space = 32;
  61958. var num_codes = 0;
  61959. /* Static Huffman code for the code length code lengths */
  61960. var huff = [
  61961. new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2),
  61962. new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 1),
  61963. new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2),
  61964. new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 5)
  61965. ];
  61966. for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) {
  61967. var code_len_idx = kCodeLengthCodeOrder[i];
  61968. var p = 0;
  61969. var v;
  61970. br.fillBitWindow();
  61971. p += (br.val_ >>> br.bit_pos_) & 15;
  61972. br.bit_pos_ += huff[p].bits;
  61973. v = huff[p].value;
  61974. code_length_code_lengths[code_len_idx] = v;
  61975. if (v !== 0) {
  61976. space -= (32 >> v);
  61977. ++num_codes;
  61978. }
  61979. }
  61980. if (!(num_codes === 1 || space === 0))
  61981. throw new Error('[ReadHuffmanCode] invalid num_codes or space');
  61982. ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br);
  61983. }
  61984. table_size = BrotliBuildHuffmanTable(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size);
  61985. if (table_size === 0) {
  61986. throw new Error("[ReadHuffmanCode] BuildHuffmanTable failed: ");
  61987. }
  61988. return table_size;
  61989. }
  61990. function ReadBlockLength(table, index, br) {
  61991. var code;
  61992. var nbits;
  61993. code = ReadSymbol(table, index, br);
  61994. nbits = Prefix.kBlockLengthPrefixCode[code].nbits;
  61995. return Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits);
  61996. }
  61997. function TranslateShortCodes(code, ringbuffer, index) {
  61998. var val;
  61999. if (code < NUM_DISTANCE_SHORT_CODES) {
  62000. index += kDistanceShortCodeIndexOffset[code];
  62001. index &= 3;
  62002. val = ringbuffer[index] + kDistanceShortCodeValueOffset[code];
  62003. } else {
  62004. val = code - NUM_DISTANCE_SHORT_CODES + 1;
  62005. }
  62006. return val;
  62007. }
  62008. function MoveToFront(v, index) {
  62009. var value = v[index];
  62010. var i = index;
  62011. for (; i; --i) v[i] = v[i - 1];
  62012. v[0] = value;
  62013. }
  62014. function InverseMoveToFrontTransform(v, v_len) {
  62015. var mtf = new Uint8Array(256);
  62016. var i;
  62017. for (i = 0; i < 256; ++i) {
  62018. mtf[i] = i;
  62019. }
  62020. for (i = 0; i < v_len; ++i) {
  62021. var index = v[i];
  62022. v[i] = mtf[index];
  62023. if (index) MoveToFront(mtf, index);
  62024. }
  62025. }
  62026. /* Contains a collection of huffman trees with the same alphabet size. */
  62027. function HuffmanTreeGroup(alphabet_size, num_htrees) {
  62028. this.alphabet_size = alphabet_size;
  62029. this.num_htrees = num_htrees;
  62030. this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]);
  62031. this.htrees = new Uint32Array(num_htrees);
  62032. }
  62033. HuffmanTreeGroup.prototype.decode = function(br) {
  62034. var i;
  62035. var table_size;
  62036. var next = 0;
  62037. for (i = 0; i < this.num_htrees; ++i) {
  62038. this.htrees[i] = next;
  62039. table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br);
  62040. next += table_size;
  62041. }
  62042. };
  62043. function DecodeContextMap(context_map_size, br) {
  62044. var out = { num_htrees: null, context_map: null };
  62045. var use_rle_for_zeros;
  62046. var max_run_length_prefix = 0;
  62047. var table;
  62048. var i;
  62049. br.readMoreInput();
  62050. var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1;
  62051. var context_map = out.context_map = new Uint8Array(context_map_size);
  62052. if (num_htrees <= 1) {
  62053. return out;
  62054. }
  62055. use_rle_for_zeros = br.readBits(1);
  62056. if (use_rle_for_zeros) {
  62057. max_run_length_prefix = br.readBits(4) + 1;
  62058. }
  62059. table = [];
  62060. for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {
  62061. table[i] = new HuffmanCode(0, 0);
  62062. }
  62063. ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br);
  62064. for (i = 0; i < context_map_size;) {
  62065. var code;
  62066. br.readMoreInput();
  62067. code = ReadSymbol(table, 0, br);
  62068. if (code === 0) {
  62069. context_map[i] = 0;
  62070. ++i;
  62071. } else if (code <= max_run_length_prefix) {
  62072. var reps = 1 + (1 << code) + br.readBits(code);
  62073. while (--reps) {
  62074. if (i >= context_map_size) {
  62075. throw new Error("[DecodeContextMap] i >= context_map_size");
  62076. }
  62077. context_map[i] = 0;
  62078. ++i;
  62079. }
  62080. } else {
  62081. context_map[i] = code - max_run_length_prefix;
  62082. ++i;
  62083. }
  62084. }
  62085. if (br.readBits(1)) {
  62086. InverseMoveToFrontTransform(context_map, context_map_size);
  62087. }
  62088. return out;
  62089. }
  62090. function DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) {
  62091. var ringbuffer = tree_type * 2;
  62092. var index = tree_type;
  62093. var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br);
  62094. var block_type;
  62095. if (type_code === 0) {
  62096. block_type = ringbuffers[ringbuffer + (indexes[index] & 1)];
  62097. } else if (type_code === 1) {
  62098. block_type = ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1;
  62099. } else {
  62100. block_type = type_code - 2;
  62101. }
  62102. if (block_type >= max_block_type) {
  62103. block_type -= max_block_type;
  62104. }
  62105. block_types[tree_type] = block_type;
  62106. ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type;
  62107. ++indexes[index];
  62108. }
  62109. function CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) {
  62110. var rb_size = ringbuffer_mask + 1;
  62111. var rb_pos = pos & ringbuffer_mask;
  62112. var br_pos = br.pos_ & BrotliBitReader.IBUF_MASK;
  62113. var nbytes;
  62114. /* For short lengths copy byte-by-byte */
  62115. if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {
  62116. while (len-- > 0) {
  62117. br.readMoreInput();
  62118. ringbuffer[rb_pos++] = br.readBits(8);
  62119. if (rb_pos === rb_size) {
  62120. output.write(ringbuffer, rb_size);
  62121. rb_pos = 0;
  62122. }
  62123. }
  62124. return;
  62125. }
  62126. if (br.bit_end_pos_ < 32) {
  62127. throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32');
  62128. }
  62129. /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */
  62130. while (br.bit_pos_ < 32) {
  62131. ringbuffer[rb_pos] = (br.val_ >>> br.bit_pos_);
  62132. br.bit_pos_ += 8;
  62133. ++rb_pos;
  62134. --len;
  62135. }
  62136. /* Copy remaining bytes from br.buf_ to ringbuffer. */
  62137. nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3;
  62138. if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {
  62139. var tail = BrotliBitReader.IBUF_MASK + 1 - br_pos;
  62140. for (var x = 0; x < tail; x++)
  62141. ringbuffer[rb_pos + x] = br.buf_[br_pos + x];
  62142. nbytes -= tail;
  62143. rb_pos += tail;
  62144. len -= tail;
  62145. br_pos = 0;
  62146. }
  62147. for (var x = 0; x < nbytes; x++)
  62148. ringbuffer[rb_pos + x] = br.buf_[br_pos + x];
  62149. rb_pos += nbytes;
  62150. len -= nbytes;
  62151. /* If we wrote past the logical end of the ringbuffer, copy the tail of the
  62152. ringbuffer to its beginning and flush the ringbuffer to the output. */
  62153. if (rb_pos >= rb_size) {
  62154. output.write(ringbuffer, rb_size);
  62155. rb_pos -= rb_size;
  62156. for (var x = 0; x < rb_pos; x++)
  62157. ringbuffer[x] = ringbuffer[rb_size + x];
  62158. }
  62159. /* If we have more to copy than the remaining size of the ringbuffer, then we
  62160. first fill the ringbuffer from the input and then flush the ringbuffer to
  62161. the output */
  62162. while (rb_pos + len >= rb_size) {
  62163. nbytes = rb_size - rb_pos;
  62164. if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {
  62165. throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');
  62166. }
  62167. output.write(ringbuffer, rb_size);
  62168. len -= nbytes;
  62169. rb_pos = 0;
  62170. }
  62171. /* Copy straight from the input onto the ringbuffer. The ringbuffer will be
  62172. flushed to the output at a later time. */
  62173. if (br.input_.read(ringbuffer, rb_pos, len) < len) {
  62174. throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');
  62175. }
  62176. /* Restore the state of the bit reader. */
  62177. br.reset();
  62178. }
  62179. /* Advances the bit reader position to the next byte boundary and verifies
  62180. that any skipped bits are set to zero. */
  62181. function JumpToByteBoundary(br) {
  62182. var new_bit_pos = (br.bit_pos_ + 7) & ~7;
  62183. var pad_bits = br.readBits(new_bit_pos - br.bit_pos_);
  62184. return pad_bits == 0;
  62185. }
  62186. function BrotliDecompressedSize(buffer) {
  62187. var input = new BrotliInput(buffer);
  62188. var br = new BrotliBitReader(input);
  62189. DecodeWindowBits(br);
  62190. var out = DecodeMetaBlockLength(br);
  62191. return out.meta_block_length;
  62192. }
  62193. exports.BrotliDecompressedSize = BrotliDecompressedSize;
  62194. function BrotliDecompressBuffer(buffer, output_size) {
  62195. var input = new BrotliInput(buffer);
  62196. if (output_size == null) {
  62197. output_size = BrotliDecompressedSize(buffer);
  62198. }
  62199. var output_buffer = new Uint8Array(output_size);
  62200. var output = new BrotliOutput(output_buffer);
  62201. BrotliDecompress(input, output);
  62202. if (output.pos < output.buffer.length) {
  62203. output.buffer = output.buffer.subarray(0, output.pos);
  62204. }
  62205. return output.buffer;
  62206. }
  62207. exports.BrotliDecompressBuffer = BrotliDecompressBuffer;
  62208. function BrotliDecompress(input, output) {
  62209. var i;
  62210. var pos = 0;
  62211. var input_end = 0;
  62212. var window_bits = 0;
  62213. var max_backward_distance;
  62214. var max_distance = 0;
  62215. var ringbuffer_size;
  62216. var ringbuffer_mask;
  62217. var ringbuffer;
  62218. var ringbuffer_end;
  62219. /* This ring buffer holds a few past copy distances that will be used by */
  62220. /* some special distance codes. */
  62221. var dist_rb = [ 16, 15, 11, 4 ];
  62222. var dist_rb_idx = 0;
  62223. /* The previous 2 bytes used for context. */
  62224. var prev_byte1 = 0;
  62225. var prev_byte2 = 0;
  62226. var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)];
  62227. var block_type_trees;
  62228. var block_len_trees;
  62229. var br;
  62230. /* We need the slack region for the following reasons:
  62231. - always doing two 8-byte copies for fast backward copying
  62232. - transforms
  62233. - flushing the input ringbuffer when decoding uncompressed blocks */
  62234. var kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE;
  62235. br = new BrotliBitReader(input);
  62236. /* Decode window size. */
  62237. window_bits = DecodeWindowBits(br);
  62238. max_backward_distance = (1 << window_bits) - 16;
  62239. ringbuffer_size = 1 << window_bits;
  62240. ringbuffer_mask = ringbuffer_size - 1;
  62241. ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + BrotliDictionary.maxDictionaryWordLength);
  62242. ringbuffer_end = ringbuffer_size;
  62243. block_type_trees = [];
  62244. block_len_trees = [];
  62245. for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {
  62246. block_type_trees[x] = new HuffmanCode(0, 0);
  62247. block_len_trees[x] = new HuffmanCode(0, 0);
  62248. }
  62249. while (!input_end) {
  62250. var meta_block_remaining_len = 0;
  62251. var is_uncompressed;
  62252. var block_length = [ 1 << 28, 1 << 28, 1 << 28 ];
  62253. var block_type = [ 0 ];
  62254. var num_block_types = [ 1, 1, 1 ];
  62255. var block_type_rb = [ 0, 1, 0, 1, 0, 1 ];
  62256. var block_type_rb_index = [ 0 ];
  62257. var distance_postfix_bits;
  62258. var num_direct_distance_codes;
  62259. var distance_postfix_mask;
  62260. var num_distance_codes;
  62261. var context_map = null;
  62262. var context_modes = null;
  62263. var num_literal_htrees;
  62264. var dist_context_map = null;
  62265. var num_dist_htrees;
  62266. var context_offset = 0;
  62267. var context_map_slice = null;
  62268. var literal_htree_index = 0;
  62269. var dist_context_offset = 0;
  62270. var dist_context_map_slice = null;
  62271. var dist_htree_index = 0;
  62272. var context_lookup_offset1 = 0;
  62273. var context_lookup_offset2 = 0;
  62274. var context_mode;
  62275. var htree_command;
  62276. for (i = 0; i < 3; ++i) {
  62277. hgroup[i].codes = null;
  62278. hgroup[i].htrees = null;
  62279. }
  62280. br.readMoreInput();
  62281. var _out = DecodeMetaBlockLength(br);
  62282. meta_block_remaining_len = _out.meta_block_length;
  62283. if (pos + meta_block_remaining_len > output.buffer.length) {
  62284. /* We need to grow the output buffer to fit the additional data. */
  62285. var tmp = new Uint8Array( pos + meta_block_remaining_len );
  62286. tmp.set( output.buffer );
  62287. output.buffer = tmp;
  62288. }
  62289. input_end = _out.input_end;
  62290. is_uncompressed = _out.is_uncompressed;
  62291. if (_out.is_metadata) {
  62292. JumpToByteBoundary(br);
  62293. for (; meta_block_remaining_len > 0; --meta_block_remaining_len) {
  62294. br.readMoreInput();
  62295. /* Read one byte and ignore it. */
  62296. br.readBits(8);
  62297. }
  62298. continue;
  62299. }
  62300. if (meta_block_remaining_len === 0) {
  62301. continue;
  62302. }
  62303. if (is_uncompressed) {
  62304. br.bit_pos_ = (br.bit_pos_ + 7) & ~7;
  62305. CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos,
  62306. ringbuffer, ringbuffer_mask, br);
  62307. pos += meta_block_remaining_len;
  62308. continue;
  62309. }
  62310. for (i = 0; i < 3; ++i) {
  62311. num_block_types[i] = DecodeVarLenUint8(br) + 1;
  62312. if (num_block_types[i] >= 2) {
  62313. ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
  62314. ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
  62315. block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);
  62316. block_type_rb_index[i] = 1;
  62317. }
  62318. }
  62319. br.readMoreInput();
  62320. distance_postfix_bits = br.readBits(2);
  62321. num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits);
  62322. distance_postfix_mask = (1 << distance_postfix_bits) - 1;
  62323. num_distance_codes = (num_direct_distance_codes + (48 << distance_postfix_bits));
  62324. context_modes = new Uint8Array(num_block_types[0]);
  62325. for (i = 0; i < num_block_types[0]; ++i) {
  62326. br.readMoreInput();
  62327. context_modes[i] = (br.readBits(2) << 1);
  62328. }
  62329. var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br);
  62330. num_literal_htrees = _o1.num_htrees;
  62331. context_map = _o1.context_map;
  62332. var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br);
  62333. num_dist_htrees = _o2.num_htrees;
  62334. dist_context_map = _o2.context_map;
  62335. hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees);
  62336. hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]);
  62337. hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees);
  62338. for (i = 0; i < 3; ++i) {
  62339. hgroup[i].decode(br);
  62340. }
  62341. context_map_slice = 0;
  62342. dist_context_map_slice = 0;
  62343. context_mode = context_modes[block_type[0]];
  62344. context_lookup_offset1 = Context.lookupOffsets[context_mode];
  62345. context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];
  62346. htree_command = hgroup[1].htrees[0];
  62347. while (meta_block_remaining_len > 0) {
  62348. var cmd_code;
  62349. var range_idx;
  62350. var insert_code;
  62351. var copy_code;
  62352. var insert_length;
  62353. var copy_length;
  62354. var distance_code;
  62355. var distance;
  62356. var context;
  62357. var j;
  62358. var copy_dst;
  62359. br.readMoreInput();
  62360. if (block_length[1] === 0) {
  62361. DecodeBlockType(num_block_types[1],
  62362. block_type_trees, 1, block_type, block_type_rb,
  62363. block_type_rb_index, br);
  62364. block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br);
  62365. htree_command = hgroup[1].htrees[block_type[1]];
  62366. }
  62367. --block_length[1];
  62368. cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br);
  62369. range_idx = cmd_code >> 6;
  62370. if (range_idx >= 2) {
  62371. range_idx -= 2;
  62372. distance_code = -1;
  62373. } else {
  62374. distance_code = 0;
  62375. }
  62376. insert_code = Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7);
  62377. copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7);
  62378. insert_length = Prefix.kInsertLengthPrefixCode[insert_code].offset +
  62379. br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits);
  62380. copy_length = Prefix.kCopyLengthPrefixCode[copy_code].offset +
  62381. br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits);
  62382. prev_byte1 = ringbuffer[pos-1 & ringbuffer_mask];
  62383. prev_byte2 = ringbuffer[pos-2 & ringbuffer_mask];
  62384. for (j = 0; j < insert_length; ++j) {
  62385. br.readMoreInput();
  62386. if (block_length[0] === 0) {
  62387. DecodeBlockType(num_block_types[0],
  62388. block_type_trees, 0, block_type, block_type_rb,
  62389. block_type_rb_index, br);
  62390. block_length[0] = ReadBlockLength(block_len_trees, 0, br);
  62391. context_offset = block_type[0] << kLiteralContextBits;
  62392. context_map_slice = context_offset;
  62393. context_mode = context_modes[block_type[0]];
  62394. context_lookup_offset1 = Context.lookupOffsets[context_mode];
  62395. context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];
  62396. }
  62397. context = (Context.lookup[context_lookup_offset1 + prev_byte1] |
  62398. Context.lookup[context_lookup_offset2 + prev_byte2]);
  62399. literal_htree_index = context_map[context_map_slice + context];
  62400. --block_length[0];
  62401. prev_byte2 = prev_byte1;
  62402. prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br);
  62403. ringbuffer[pos & ringbuffer_mask] = prev_byte1;
  62404. if ((pos & ringbuffer_mask) === ringbuffer_mask) {
  62405. output.write(ringbuffer, ringbuffer_size);
  62406. }
  62407. ++pos;
  62408. }
  62409. meta_block_remaining_len -= insert_length;
  62410. if (meta_block_remaining_len <= 0) break;
  62411. if (distance_code < 0) {
  62412. var context;
  62413. br.readMoreInput();
  62414. if (block_length[2] === 0) {
  62415. DecodeBlockType(num_block_types[2],
  62416. block_type_trees, 2, block_type, block_type_rb,
  62417. block_type_rb_index, br);
  62418. block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br);
  62419. dist_context_offset = block_type[2] << kDistanceContextBits;
  62420. dist_context_map_slice = dist_context_offset;
  62421. }
  62422. --block_length[2];
  62423. context = (copy_length > 4 ? 3 : copy_length - 2) & 0xff;
  62424. dist_htree_index = dist_context_map[dist_context_map_slice + context];
  62425. distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br);
  62426. if (distance_code >= num_direct_distance_codes) {
  62427. var nbits;
  62428. var postfix;
  62429. var offset;
  62430. distance_code -= num_direct_distance_codes;
  62431. postfix = distance_code & distance_postfix_mask;
  62432. distance_code >>= distance_postfix_bits;
  62433. nbits = (distance_code >> 1) + 1;
  62434. offset = ((2 + (distance_code & 1)) << nbits) - 4;
  62435. distance_code = num_direct_distance_codes +
  62436. ((offset + br.readBits(nbits)) <<
  62437. distance_postfix_bits) + postfix;
  62438. }
  62439. }
  62440. /* Convert the distance code to the actual distance by possibly looking */
  62441. /* up past distnaces from the ringbuffer. */
  62442. distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx);
  62443. if (distance < 0) {
  62444. throw new Error('[BrotliDecompress] invalid distance');
  62445. }
  62446. if (pos < max_backward_distance &&
  62447. max_distance !== max_backward_distance) {
  62448. max_distance = pos;
  62449. } else {
  62450. max_distance = max_backward_distance;
  62451. }
  62452. copy_dst = pos & ringbuffer_mask;
  62453. if (distance > max_distance) {
  62454. if (copy_length >= BrotliDictionary.minDictionaryWordLength &&
  62455. copy_length <= BrotliDictionary.maxDictionaryWordLength) {
  62456. var offset = BrotliDictionary.offsetsByLength[copy_length];
  62457. var word_id = distance - max_distance - 1;
  62458. var shift = BrotliDictionary.sizeBitsByLength[copy_length];
  62459. var mask = (1 << shift) - 1;
  62460. var word_idx = word_id & mask;
  62461. var transform_idx = word_id >> shift;
  62462. offset += word_idx * copy_length;
  62463. if (transform_idx < Transform.kNumTransforms) {
  62464. var len = Transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx);
  62465. copy_dst += len;
  62466. pos += len;
  62467. meta_block_remaining_len -= len;
  62468. if (copy_dst >= ringbuffer_end) {
  62469. output.write(ringbuffer, ringbuffer_size);
  62470. for (var _x = 0; _x < (copy_dst - ringbuffer_end); _x++)
  62471. ringbuffer[_x] = ringbuffer[ringbuffer_end + _x];
  62472. }
  62473. } else {
  62474. throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
  62475. " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
  62476. }
  62477. } else {
  62478. throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
  62479. " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
  62480. }
  62481. } else {
  62482. if (distance_code > 0) {
  62483. dist_rb[dist_rb_idx & 3] = distance;
  62484. ++dist_rb_idx;
  62485. }
  62486. if (copy_length > meta_block_remaining_len) {
  62487. throw new Error("Invalid backward reference. pos: " + pos + " distance: " + distance +
  62488. " len: " + copy_length + " bytes left: " + meta_block_remaining_len);
  62489. }
  62490. for (j = 0; j < copy_length; ++j) {
  62491. ringbuffer[pos & ringbuffer_mask] = ringbuffer[(pos - distance) & ringbuffer_mask];
  62492. if ((pos & ringbuffer_mask) === ringbuffer_mask) {
  62493. output.write(ringbuffer, ringbuffer_size);
  62494. }
  62495. ++pos;
  62496. --meta_block_remaining_len;
  62497. }
  62498. }
  62499. /* When we get here, we must have inserted at least one literal and */
  62500. /* made a copy of at least length two, therefore accessing the last 2 */
  62501. /* bytes is valid. */
  62502. prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask];
  62503. prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask];
  62504. }
  62505. /* Protect pos from overflow, wrap it around at every GB of input data */
  62506. pos &= 0x3fffffff;
  62507. }
  62508. output.write(ringbuffer, pos & ringbuffer_mask);
  62509. }
  62510. exports.BrotliDecompress = BrotliDecompress;
  62511. BrotliDictionary.init();
  62512. /***/ }),
  62513. /* 275 */
  62514. /***/ (function(module, exports) {
  62515. function BrotliInput(buffer) {
  62516. this.buffer = buffer;
  62517. this.pos = 0;
  62518. }
  62519. BrotliInput.prototype.read = function(buf, i, count) {
  62520. if (this.pos + count > this.buffer.length) {
  62521. count = this.buffer.length - this.pos;
  62522. }
  62523. for (var p = 0; p < count; p++)
  62524. buf[i + p] = this.buffer[this.pos + p];
  62525. this.pos += count;
  62526. return count;
  62527. }
  62528. exports.BrotliInput = BrotliInput;
  62529. function BrotliOutput(buf) {
  62530. this.buffer = buf;
  62531. this.pos = 0;
  62532. }
  62533. BrotliOutput.prototype.write = function(buf, count) {
  62534. if (this.pos + count > this.buffer.length)
  62535. throw new Error('Output buffer is not large enough');
  62536. this.buffer.set(buf.subarray(0, count), this.pos);
  62537. this.pos += count;
  62538. return count;
  62539. };
  62540. exports.BrotliOutput = BrotliOutput;
  62541. /***/ }),
  62542. /* 276 */
  62543. /***/ (function(module, exports) {
  62544. /* Copyright 2013 Google Inc. All Rights Reserved.
  62545. Licensed under the Apache License, Version 2.0 (the "License");
  62546. you may not use this file except in compliance with the License.
  62547. You may obtain a copy of the License at
  62548. http://www.apache.org/licenses/LICENSE-2.0
  62549. Unless required by applicable law or agreed to in writing, software
  62550. distributed under the License is distributed on an "AS IS" BASIS,
  62551. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  62552. See the License for the specific language governing permissions and
  62553. limitations under the License.
  62554. Bit reading helpers
  62555. */
  62556. var BROTLI_READ_SIZE = 4096;
  62557. var BROTLI_IBUF_SIZE = (2 * BROTLI_READ_SIZE + 32);
  62558. var BROTLI_IBUF_MASK = (2 * BROTLI_READ_SIZE - 1);
  62559. var kBitMask = new Uint32Array([
  62560. 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,
  62561. 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215
  62562. ]);
  62563. /* Input byte buffer, consist of a ringbuffer and a "slack" region where */
  62564. /* bytes from the start of the ringbuffer are copied. */
  62565. function BrotliBitReader(input) {
  62566. this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE);
  62567. this.input_ = input; /* input callback */
  62568. this.reset();
  62569. }
  62570. BrotliBitReader.READ_SIZE = BROTLI_READ_SIZE;
  62571. BrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK;
  62572. BrotliBitReader.prototype.reset = function() {
  62573. this.buf_ptr_ = 0; /* next input will write here */
  62574. this.val_ = 0; /* pre-fetched bits */
  62575. this.pos_ = 0; /* byte position in stream */
  62576. this.bit_pos_ = 0; /* current bit-reading position in val_ */
  62577. this.bit_end_pos_ = 0; /* bit-reading end position from LSB of val_ */
  62578. this.eos_ = 0; /* input stream is finished */
  62579. this.readMoreInput();
  62580. for (var i = 0; i < 4; i++) {
  62581. this.val_ |= this.buf_[this.pos_] << (8 * i);
  62582. ++this.pos_;
  62583. }
  62584. return this.bit_end_pos_ > 0;
  62585. };
  62586. /* Fills up the input ringbuffer by calling the input callback.
  62587. Does nothing if there are at least 32 bytes present after current position.
  62588. Returns 0 if either:
  62589. - the input callback returned an error, or
  62590. - there is no more input and the position is past the end of the stream.
  62591. After encountering the end of the input stream, 32 additional zero bytes are
  62592. copied to the ringbuffer, therefore it is safe to call this function after
  62593. every 32 bytes of input is read.
  62594. */
  62595. BrotliBitReader.prototype.readMoreInput = function() {
  62596. if (this.bit_end_pos_ > 256) {
  62597. return;
  62598. } else if (this.eos_) {
  62599. if (this.bit_pos_ > this.bit_end_pos_)
  62600. throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_);
  62601. } else {
  62602. var dst = this.buf_ptr_;
  62603. var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE);
  62604. if (bytes_read < 0) {
  62605. throw new Error('Unexpected end of input');
  62606. }
  62607. if (bytes_read < BROTLI_READ_SIZE) {
  62608. this.eos_ = 1;
  62609. /* Store 32 bytes of zero after the stream end. */
  62610. for (var p = 0; p < 32; p++)
  62611. this.buf_[dst + bytes_read + p] = 0;
  62612. }
  62613. if (dst === 0) {
  62614. /* Copy the head of the ringbuffer to the slack region. */
  62615. for (var p = 0; p < 32; p++)
  62616. this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p];
  62617. this.buf_ptr_ = BROTLI_READ_SIZE;
  62618. } else {
  62619. this.buf_ptr_ = 0;
  62620. }
  62621. this.bit_end_pos_ += bytes_read << 3;
  62622. }
  62623. };
  62624. /* Guarantees that there are at least 24 bits in the buffer. */
  62625. BrotliBitReader.prototype.fillBitWindow = function() {
  62626. while (this.bit_pos_ >= 8) {
  62627. this.val_ >>>= 8;
  62628. this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24;
  62629. ++this.pos_;
  62630. this.bit_pos_ = this.bit_pos_ - 8 >>> 0;
  62631. this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0;
  62632. }
  62633. };
  62634. /* Reads the specified number of bits from Read Buffer. */
  62635. BrotliBitReader.prototype.readBits = function(n_bits) {
  62636. if (32 - this.bit_pos_ < n_bits) {
  62637. this.fillBitWindow();
  62638. }
  62639. var val = ((this.val_ >>> this.bit_pos_) & kBitMask[n_bits]);
  62640. this.bit_pos_ += n_bits;
  62641. return val;
  62642. };
  62643. module.exports = BrotliBitReader;
  62644. /***/ }),
  62645. /* 277 */
  62646. /***/ (function(module, exports, __webpack_require__) {
  62647. /* Copyright 2013 Google Inc. All Rights Reserved.
  62648. Licensed under the Apache License, Version 2.0 (the "License");
  62649. you may not use this file except in compliance with the License.
  62650. You may obtain a copy of the License at
  62651. http://www.apache.org/licenses/LICENSE-2.0
  62652. Unless required by applicable law or agreed to in writing, software
  62653. distributed under the License is distributed on an "AS IS" BASIS,
  62654. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  62655. See the License for the specific language governing permissions and
  62656. limitations under the License.
  62657. Collection of static dictionary words.
  62658. */
  62659. var data = __webpack_require__(278);
  62660. exports.init = function() {
  62661. exports.dictionary = data.init();
  62662. };
  62663. exports.offsetsByLength = new Uint32Array([
  62664. 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032,
  62665. 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,
  62666. 115968, 118528, 119872, 121280, 122016,
  62667. ]);
  62668. exports.sizeBitsByLength = new Uint8Array([
  62669. 0, 0, 0, 0, 10, 10, 11, 11, 10, 10,
  62670. 10, 10, 10, 9, 9, 8, 7, 7, 8, 7,
  62671. 7, 6, 6, 5, 5,
  62672. ]);
  62673. exports.minDictionaryWordLength = 4;
  62674. exports.maxDictionaryWordLength = 24;
  62675. /***/ }),
  62676. /* 278 */
  62677. /***/ (function(module, exports, __webpack_require__) {
  62678. var base64 = __webpack_require__(279);
  62679. var fs = __webpack_require__(56);
  62680. /**
  62681. * The normal dictionary-data.js is quite large, which makes it
  62682. * unsuitable for browser usage. In order to make it smaller,
  62683. * we read dictionary.bin, which is a compressed version of
  62684. * the dictionary, and on initial load, Brotli decompresses
  62685. * it's own dictionary. 😜
  62686. */
  62687. exports.init = function() {
  62688. var BrotliDecompressBuffer = __webpack_require__(274).BrotliDecompressBuffer;
  62689. var compressed = base64.toByteArray(__webpack_require__(280));
  62690. return BrotliDecompressBuffer(compressed);
  62691. };
  62692. /***/ }),
  62693. /* 279 */
  62694. /***/ (function(module, exports) {
  62695. 'use strict'
  62696. exports.byteLength = byteLength
  62697. exports.toByteArray = toByteArray
  62698. exports.fromByteArray = fromByteArray
  62699. var lookup = []
  62700. var revLookup = []
  62701. var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
  62702. var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  62703. for (var i = 0, len = code.length; i < len; ++i) {
  62704. lookup[i] = code[i]
  62705. revLookup[code.charCodeAt(i)] = i
  62706. }
  62707. revLookup['-'.charCodeAt(0)] = 62
  62708. revLookup['_'.charCodeAt(0)] = 63
  62709. function placeHoldersCount (b64) {
  62710. var len = b64.length
  62711. if (len % 4 > 0) {
  62712. throw new Error('Invalid string. Length must be a multiple of 4')
  62713. }
  62714. // the number of equal signs (place holders)
  62715. // if there are two placeholders, than the two characters before it
  62716. // represent one byte
  62717. // if there is only one, then the three characters before it represent 2 bytes
  62718. // this is just a cheap hack to not do indexOf twice
  62719. return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
  62720. }
  62721. function byteLength (b64) {
  62722. // base64 is 4/3 + up to two characters of the original data
  62723. return (b64.length * 3 / 4) - placeHoldersCount(b64)
  62724. }
  62725. function toByteArray (b64) {
  62726. var i, l, tmp, placeHolders, arr
  62727. var len = b64.length
  62728. placeHolders = placeHoldersCount(b64)
  62729. arr = new Arr((len * 3 / 4) - placeHolders)
  62730. // if there are placeholders, only get up to the last complete 4 chars
  62731. l = placeHolders > 0 ? len - 4 : len
  62732. var L = 0
  62733. for (i = 0; i < l; i += 4) {
  62734. tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
  62735. arr[L++] = (tmp >> 16) & 0xFF
  62736. arr[L++] = (tmp >> 8) & 0xFF
  62737. arr[L++] = tmp & 0xFF
  62738. }
  62739. if (placeHolders === 2) {
  62740. tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
  62741. arr[L++] = tmp & 0xFF
  62742. } else if (placeHolders === 1) {
  62743. tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
  62744. arr[L++] = (tmp >> 8) & 0xFF
  62745. arr[L++] = tmp & 0xFF
  62746. }
  62747. return arr
  62748. }
  62749. function tripletToBase64 (num) {
  62750. return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
  62751. }
  62752. function encodeChunk (uint8, start, end) {
  62753. var tmp
  62754. var output = []
  62755. for (var i = start; i < end; i += 3) {
  62756. tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
  62757. output.push(tripletToBase64(tmp))
  62758. }
  62759. return output.join('')
  62760. }
  62761. function fromByteArray (uint8) {
  62762. var tmp
  62763. var len = uint8.length
  62764. var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
  62765. var output = ''
  62766. var parts = []
  62767. var maxChunkLength = 16383 // must be multiple of 3
  62768. // go through the array every three bytes, we'll deal with trailing stuff later
  62769. for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
  62770. parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
  62771. }
  62772. // pad the end with zeros, but make sure to not forget the extra bytes
  62773. if (extraBytes === 1) {
  62774. tmp = uint8[len - 1]
  62775. output += lookup[tmp >> 2]
  62776. output += lookup[(tmp << 4) & 0x3F]
  62777. output += '=='
  62778. } else if (extraBytes === 2) {
  62779. tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
  62780. output += lookup[tmp >> 10]
  62781. output += lookup[(tmp >> 4) & 0x3F]
  62782. output += lookup[(tmp << 2) & 0x3F]
  62783. output += '='
  62784. }
  62785. parts.push(output)
  62786. return parts.join('')
  62787. }
  62788. /***/ }),
  62789. /* 280 */
  62790. /***/ (function(module, exports) {
  62791. module.exports="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";
  62792. /***/ }),
  62793. /* 281 */
  62794. /***/ (function(module, exports) {
  62795. function HuffmanCode(bits, value) {
  62796. this.bits = bits; /* number of bits used for this symbol */
  62797. this.value = value; /* symbol value or table offset */
  62798. }
  62799. exports.HuffmanCode = HuffmanCode;
  62800. var MAX_LENGTH = 15;
  62801. /* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the
  62802. bit-wise reversal of the len least significant bits of key. */
  62803. function GetNextKey(key, len) {
  62804. var step = 1 << (len - 1);
  62805. while (key & step) {
  62806. step >>= 1;
  62807. }
  62808. return (key & (step - 1)) + step;
  62809. }
  62810. /* Stores code in table[0], table[step], table[2*step], ..., table[end] */
  62811. /* Assumes that end is an integer multiple of step */
  62812. function ReplicateValue(table, i, step, end, code) {
  62813. do {
  62814. end -= step;
  62815. table[i + end] = new HuffmanCode(code.bits, code.value);
  62816. } while (end > 0);
  62817. }
  62818. /* Returns the table width of the next 2nd level table. count is the histogram
  62819. of bit lengths for the remaining symbols, len is the code length of the next
  62820. processed symbol */
  62821. function NextTableBitSize(count, len, root_bits) {
  62822. var left = 1 << (len - root_bits);
  62823. while (len < MAX_LENGTH) {
  62824. left -= count[len];
  62825. if (left <= 0) break;
  62826. ++len;
  62827. left <<= 1;
  62828. }
  62829. return len - root_bits;
  62830. }
  62831. exports.BrotliBuildHuffmanTable = function(root_table, table, root_bits, code_lengths, code_lengths_size) {
  62832. var start_table = table;
  62833. var code; /* current table entry */
  62834. var len; /* current code length */
  62835. var symbol; /* symbol index in original or sorted table */
  62836. var key; /* reversed prefix code */
  62837. var step; /* step size to replicate values in current table */
  62838. var low; /* low bits for current root entry */
  62839. var mask; /* mask for low bits */
  62840. var table_bits; /* key length of current table */
  62841. var table_size; /* size of current table */
  62842. var total_size; /* sum of root table size and 2nd level table sizes */
  62843. var sorted; /* symbols sorted by code length */
  62844. var count = new Int32Array(MAX_LENGTH + 1); /* number of codes of each length */
  62845. var offset = new Int32Array(MAX_LENGTH + 1); /* offsets in sorted table for each length */
  62846. sorted = new Int32Array(code_lengths_size);
  62847. /* build histogram of code lengths */
  62848. for (symbol = 0; symbol < code_lengths_size; symbol++) {
  62849. count[code_lengths[symbol]]++;
  62850. }
  62851. /* generate offsets into sorted symbol table by code length */
  62852. offset[1] = 0;
  62853. for (len = 1; len < MAX_LENGTH; len++) {
  62854. offset[len + 1] = offset[len] + count[len];
  62855. }
  62856. /* sort symbols by length, by symbol order within each length */
  62857. for (symbol = 0; symbol < code_lengths_size; symbol++) {
  62858. if (code_lengths[symbol] !== 0) {
  62859. sorted[offset[code_lengths[symbol]]++] = symbol;
  62860. }
  62861. }
  62862. table_bits = root_bits;
  62863. table_size = 1 << table_bits;
  62864. total_size = table_size;
  62865. /* special case code with only one value */
  62866. if (offset[MAX_LENGTH] === 1) {
  62867. for (key = 0; key < total_size; ++key) {
  62868. root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff);
  62869. }
  62870. return total_size;
  62871. }
  62872. /* fill in root table */
  62873. key = 0;
  62874. symbol = 0;
  62875. for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {
  62876. for (; count[len] > 0; --count[len]) {
  62877. code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff);
  62878. ReplicateValue(root_table, table + key, step, table_size, code);
  62879. key = GetNextKey(key, len);
  62880. }
  62881. }
  62882. /* fill in 2nd level tables and add pointers to root table */
  62883. mask = total_size - 1;
  62884. low = -1;
  62885. for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) {
  62886. for (; count[len] > 0; --count[len]) {
  62887. if ((key & mask) !== low) {
  62888. table += table_size;
  62889. table_bits = NextTableBitSize(count, len, root_bits);
  62890. table_size = 1 << table_bits;
  62891. total_size += table_size;
  62892. low = key & mask;
  62893. root_table[start_table + low] = new HuffmanCode((table_bits + root_bits) & 0xff, ((table - start_table) - low) & 0xffff);
  62894. }
  62895. code = new HuffmanCode((len - root_bits) & 0xff, sorted[symbol++] & 0xffff);
  62896. ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code);
  62897. key = GetNextKey(key, len);
  62898. }
  62899. }
  62900. return total_size;
  62901. }
  62902. /***/ }),
  62903. /* 282 */
  62904. /***/ (function(module, exports) {
  62905. /* Copyright 2013 Google Inc. All Rights Reserved.
  62906. Licensed under the Apache License, Version 2.0 (the "License");
  62907. you may not use this file except in compliance with the License.
  62908. You may obtain a copy of the License at
  62909. http://www.apache.org/licenses/LICENSE-2.0
  62910. Unless required by applicable law or agreed to in writing, software
  62911. distributed under the License is distributed on an "AS IS" BASIS,
  62912. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  62913. See the License for the specific language governing permissions and
  62914. limitations under the License.
  62915. Lookup table to map the previous two bytes to a context id.
  62916. There are four different context modeling modes defined here:
  62917. CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,
  62918. CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,
  62919. CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,
  62920. CONTEXT_SIGNED: second-order context model tuned for signed integers.
  62921. The context id for the UTF8 context model is calculated as follows. If p1
  62922. and p2 are the previous two bytes, we calcualte the context as
  62923. context = kContextLookup[p1] | kContextLookup[p2 + 256].
  62924. If the previous two bytes are ASCII characters (i.e. < 128), this will be
  62925. equivalent to
  62926. context = 4 * context1(p1) + context2(p2),
  62927. where context1 is based on the previous byte in the following way:
  62928. 0 : non-ASCII control
  62929. 1 : \t, \n, \r
  62930. 2 : space
  62931. 3 : other punctuation
  62932. 4 : " '
  62933. 5 : %
  62934. 6 : ( < [ {
  62935. 7 : ) > ] }
  62936. 8 : , ; :
  62937. 9 : .
  62938. 10 : =
  62939. 11 : number
  62940. 12 : upper-case vowel
  62941. 13 : upper-case consonant
  62942. 14 : lower-case vowel
  62943. 15 : lower-case consonant
  62944. and context2 is based on the second last byte:
  62945. 0 : control, space
  62946. 1 : punctuation
  62947. 2 : upper-case letter, number
  62948. 3 : lower-case letter
  62949. If the last byte is ASCII, and the second last byte is not (in a valid UTF8
  62950. stream it will be a continuation byte, value between 128 and 191), the
  62951. context is the same as if the second last byte was an ASCII control or space.
  62952. If the last byte is a UTF8 lead byte (value >= 192), then the next byte will
  62953. be a continuation byte and the context id is 2 or 3 depending on the LSB of
  62954. the last byte and to a lesser extent on the second last byte if it is ASCII.
  62955. If the last byte is a UTF8 continuation byte, the second last byte can be:
  62956. - continuation byte: the next byte is probably ASCII or lead byte (assuming
  62957. 4-byte UTF8 characters are rare) and the context id is 0 or 1.
  62958. - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1
  62959. - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3
  62960. The possible value combinations of the previous two bytes, the range of
  62961. context ids and the type of the next byte is summarized in the table below:
  62962. |--------\-----------------------------------------------------------------|
  62963. | \ Last byte |
  62964. | Second \---------------------------------------------------------------|
  62965. | last byte \ ASCII | cont. byte | lead byte |
  62966. | \ (0-127) | (128-191) | (192-) |
  62967. |=============|===================|=====================|==================|
  62968. | ASCII | next: ASCII/lead | not valid | next: cont. |
  62969. | (0-127) | context: 4 - 63 | | context: 2 - 3 |
  62970. |-------------|-------------------|---------------------|------------------|
  62971. | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |
  62972. | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |
  62973. |-------------|-------------------|---------------------|------------------|
  62974. | lead byte | not valid | next: ASCII/lead | not valid |
  62975. | (192-207) | | context: 0 - 1 | |
  62976. |-------------|-------------------|---------------------|------------------|
  62977. | lead byte | not valid | next: cont. | not valid |
  62978. | (208-) | | context: 2 - 3 | |
  62979. |-------------|-------------------|---------------------|------------------|
  62980. The context id for the signed context mode is calculated as:
  62981. context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].
  62982. For any context modeling modes, the context ids can be calculated by |-ing
  62983. together two lookups from one table using context model dependent offsets:
  62984. context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].
  62985. where offset1 and offset2 are dependent on the context mode.
  62986. */
  62987. var CONTEXT_LSB6 = 0;
  62988. var CONTEXT_MSB6 = 1;
  62989. var CONTEXT_UTF8 = 2;
  62990. var CONTEXT_SIGNED = 3;
  62991. /* Common context lookup table for all context modes. */
  62992. exports.lookup = new Uint8Array([
  62993. /* CONTEXT_UTF8, last byte. */
  62994. /* ASCII range. */
  62995. 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,
  62996. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  62997. 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
  62998. 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
  62999. 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
  63000. 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
  63001. 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
  63002. 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,
  63003. /* UTF8 continuation byte range. */
  63004. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  63005. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  63006. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  63007. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  63008. /* UTF8 lead byte range. */
  63009. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  63010. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  63011. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  63012. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  63013. /* CONTEXT_UTF8 second last byte. */
  63014. /* ASCII range. */
  63015. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63016. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63017. 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  63018. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
  63019. 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63020. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
  63021. 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  63022. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
  63023. /* UTF8 continuation byte range. */
  63024. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63025. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63026. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63027. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63028. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63029. /* UTF8 lead byte range. */
  63030. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63031. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63032. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63033. /* CONTEXT_SIGNED, second last byte. */
  63034. 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  63035. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63036. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63037. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  63038. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  63039. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  63040. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  63041. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  63042. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  63043. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  63044. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  63045. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  63046. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  63047. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  63048. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  63049. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,
  63050. /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */
  63051. 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  63052. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  63053. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  63054. 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
  63055. 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
  63056. 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
  63057. 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
  63058. 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
  63059. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  63060. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  63061. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  63062. 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
  63063. 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
  63064. 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
  63065. 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
  63066. 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,
  63067. /* CONTEXT_LSB6, last byte. */
  63068. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  63069. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  63070. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  63071. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  63072. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  63073. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  63074. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  63075. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  63076. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  63077. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  63078. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  63079. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  63080. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  63081. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  63082. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  63083. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  63084. /* CONTEXT_MSB6, last byte. */
  63085. 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
  63086. 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
  63087. 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,
  63088. 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
  63089. 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,
  63090. 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
  63091. 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
  63092. 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
  63093. 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,
  63094. 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
  63095. 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
  63096. 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
  63097. 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,
  63098. 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
  63099. 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,
  63100. 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
  63101. /* CONTEXT_{M,L}SB6, second last byte, */
  63102. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63103. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63104. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63105. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63106. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63107. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63108. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63109. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63110. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63111. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63112. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63113. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63114. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63115. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63116. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63117. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  63118. ]);
  63119. exports.lookupOffsets = new Uint16Array([
  63120. /* CONTEXT_LSB6 */
  63121. 1024, 1536,
  63122. /* CONTEXT_MSB6 */
  63123. 1280, 1536,
  63124. /* CONTEXT_UTF8 */
  63125. 0, 256,
  63126. /* CONTEXT_SIGNED */
  63127. 768, 512,
  63128. ]);
  63129. /***/ }),
  63130. /* 283 */
  63131. /***/ (function(module, exports) {
  63132. /* Copyright 2013 Google Inc. All Rights Reserved.
  63133. Licensed under the Apache License, Version 2.0 (the "License");
  63134. you may not use this file except in compliance with the License.
  63135. You may obtain a copy of the License at
  63136. http://www.apache.org/licenses/LICENSE-2.0
  63137. Unless required by applicable law or agreed to in writing, software
  63138. distributed under the License is distributed on an "AS IS" BASIS,
  63139. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  63140. See the License for the specific language governing permissions and
  63141. limitations under the License.
  63142. Lookup tables to map prefix codes to value ranges. This is used during
  63143. decoding of the block lengths, literal insertion lengths and copy lengths.
  63144. */
  63145. /* Represents the range of values belonging to a prefix code: */
  63146. /* [offset, offset + 2^nbits) */
  63147. function PrefixCodeRange(offset, nbits) {
  63148. this.offset = offset;
  63149. this.nbits = nbits;
  63150. }
  63151. exports.kBlockLengthPrefixCode = [
  63152. new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2),
  63153. new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3),
  63154. new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4),
  63155. new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5),
  63156. new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8),
  63157. new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12),
  63158. new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)
  63159. ];
  63160. exports.kInsertLengthPrefixCode = [
  63161. new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0),
  63162. new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1),
  63163. new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3),
  63164. new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5),
  63165. new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9),
  63166. new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24),
  63167. ];
  63168. exports.kCopyLengthPrefixCode = [
  63169. new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0),
  63170. new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0),
  63171. new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2),
  63172. new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4),
  63173. new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7),
  63174. new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24),
  63175. ];
  63176. exports.kInsertRangeLut = [
  63177. 0, 0, 8, 8, 0, 16, 8, 16, 16,
  63178. ];
  63179. exports.kCopyRangeLut = [
  63180. 0, 8, 0, 8, 16, 0, 16, 8, 16,
  63181. ];
  63182. /***/ }),
  63183. /* 284 */
  63184. /***/ (function(module, exports, __webpack_require__) {
  63185. /* Copyright 2013 Google Inc. All Rights Reserved.
  63186. Licensed under the Apache License, Version 2.0 (the "License");
  63187. you may not use this file except in compliance with the License.
  63188. You may obtain a copy of the License at
  63189. http://www.apache.org/licenses/LICENSE-2.0
  63190. Unless required by applicable law or agreed to in writing, software
  63191. distributed under the License is distributed on an "AS IS" BASIS,
  63192. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  63193. See the License for the specific language governing permissions and
  63194. limitations under the License.
  63195. Transformations on dictionary words.
  63196. */
  63197. var BrotliDictionary = __webpack_require__(277);
  63198. var kIdentity = 0;
  63199. var kOmitLast1 = 1;
  63200. var kOmitLast2 = 2;
  63201. var kOmitLast3 = 3;
  63202. var kOmitLast4 = 4;
  63203. var kOmitLast5 = 5;
  63204. var kOmitLast6 = 6;
  63205. var kOmitLast7 = 7;
  63206. var kOmitLast8 = 8;
  63207. var kOmitLast9 = 9;
  63208. var kUppercaseFirst = 10;
  63209. var kUppercaseAll = 11;
  63210. var kOmitFirst1 = 12;
  63211. var kOmitFirst2 = 13;
  63212. var kOmitFirst3 = 14;
  63213. var kOmitFirst4 = 15;
  63214. var kOmitFirst5 = 16;
  63215. var kOmitFirst6 = 17;
  63216. var kOmitFirst7 = 18;
  63217. var kOmitFirst8 = 19;
  63218. var kOmitFirst9 = 20;
  63219. function Transform(prefix, transform, suffix) {
  63220. this.prefix = new Uint8Array(prefix.length);
  63221. this.transform = transform;
  63222. this.suffix = new Uint8Array(suffix.length);
  63223. for (var i = 0; i < prefix.length; i++)
  63224. this.prefix[i] = prefix.charCodeAt(i);
  63225. for (var i = 0; i < suffix.length; i++)
  63226. this.suffix[i] = suffix.charCodeAt(i);
  63227. }
  63228. var kTransforms = [
  63229. new Transform( "", kIdentity, "" ),
  63230. new Transform( "", kIdentity, " " ),
  63231. new Transform( " ", kIdentity, " " ),
  63232. new Transform( "", kOmitFirst1, "" ),
  63233. new Transform( "", kUppercaseFirst, " " ),
  63234. new Transform( "", kIdentity, " the " ),
  63235. new Transform( " ", kIdentity, "" ),
  63236. new Transform( "s ", kIdentity, " " ),
  63237. new Transform( "", kIdentity, " of " ),
  63238. new Transform( "", kUppercaseFirst, "" ),
  63239. new Transform( "", kIdentity, " and " ),
  63240. new Transform( "", kOmitFirst2, "" ),
  63241. new Transform( "", kOmitLast1, "" ),
  63242. new Transform( ", ", kIdentity, " " ),
  63243. new Transform( "", kIdentity, ", " ),
  63244. new Transform( " ", kUppercaseFirst, " " ),
  63245. new Transform( "", kIdentity, " in " ),
  63246. new Transform( "", kIdentity, " to " ),
  63247. new Transform( "e ", kIdentity, " " ),
  63248. new Transform( "", kIdentity, "\"" ),
  63249. new Transform( "", kIdentity, "." ),
  63250. new Transform( "", kIdentity, "\">" ),
  63251. new Transform( "", kIdentity, "\n" ),
  63252. new Transform( "", kOmitLast3, "" ),
  63253. new Transform( "", kIdentity, "]" ),
  63254. new Transform( "", kIdentity, " for " ),
  63255. new Transform( "", kOmitFirst3, "" ),
  63256. new Transform( "", kOmitLast2, "" ),
  63257. new Transform( "", kIdentity, " a " ),
  63258. new Transform( "", kIdentity, " that " ),
  63259. new Transform( " ", kUppercaseFirst, "" ),
  63260. new Transform( "", kIdentity, ". " ),
  63261. new Transform( ".", kIdentity, "" ),
  63262. new Transform( " ", kIdentity, ", " ),
  63263. new Transform( "", kOmitFirst4, "" ),
  63264. new Transform( "", kIdentity, " with " ),
  63265. new Transform( "", kIdentity, "'" ),
  63266. new Transform( "", kIdentity, " from " ),
  63267. new Transform( "", kIdentity, " by " ),
  63268. new Transform( "", kOmitFirst5, "" ),
  63269. new Transform( "", kOmitFirst6, "" ),
  63270. new Transform( " the ", kIdentity, "" ),
  63271. new Transform( "", kOmitLast4, "" ),
  63272. new Transform( "", kIdentity, ". The " ),
  63273. new Transform( "", kUppercaseAll, "" ),
  63274. new Transform( "", kIdentity, " on " ),
  63275. new Transform( "", kIdentity, " as " ),
  63276. new Transform( "", kIdentity, " is " ),
  63277. new Transform( "", kOmitLast7, "" ),
  63278. new Transform( "", kOmitLast1, "ing " ),
  63279. new Transform( "", kIdentity, "\n\t" ),
  63280. new Transform( "", kIdentity, ":" ),
  63281. new Transform( " ", kIdentity, ". " ),
  63282. new Transform( "", kIdentity, "ed " ),
  63283. new Transform( "", kOmitFirst9, "" ),
  63284. new Transform( "", kOmitFirst7, "" ),
  63285. new Transform( "", kOmitLast6, "" ),
  63286. new Transform( "", kIdentity, "(" ),
  63287. new Transform( "", kUppercaseFirst, ", " ),
  63288. new Transform( "", kOmitLast8, "" ),
  63289. new Transform( "", kIdentity, " at " ),
  63290. new Transform( "", kIdentity, "ly " ),
  63291. new Transform( " the ", kIdentity, " of " ),
  63292. new Transform( "", kOmitLast5, "" ),
  63293. new Transform( "", kOmitLast9, "" ),
  63294. new Transform( " ", kUppercaseFirst, ", " ),
  63295. new Transform( "", kUppercaseFirst, "\"" ),
  63296. new Transform( ".", kIdentity, "(" ),
  63297. new Transform( "", kUppercaseAll, " " ),
  63298. new Transform( "", kUppercaseFirst, "\">" ),
  63299. new Transform( "", kIdentity, "=\"" ),
  63300. new Transform( " ", kIdentity, "." ),
  63301. new Transform( ".com/", kIdentity, "" ),
  63302. new Transform( " the ", kIdentity, " of the " ),
  63303. new Transform( "", kUppercaseFirst, "'" ),
  63304. new Transform( "", kIdentity, ". This " ),
  63305. new Transform( "", kIdentity, "," ),
  63306. new Transform( ".", kIdentity, " " ),
  63307. new Transform( "", kUppercaseFirst, "(" ),
  63308. new Transform( "", kUppercaseFirst, "." ),
  63309. new Transform( "", kIdentity, " not " ),
  63310. new Transform( " ", kIdentity, "=\"" ),
  63311. new Transform( "", kIdentity, "er " ),
  63312. new Transform( " ", kUppercaseAll, " " ),
  63313. new Transform( "", kIdentity, "al " ),
  63314. new Transform( " ", kUppercaseAll, "" ),
  63315. new Transform( "", kIdentity, "='" ),
  63316. new Transform( "", kUppercaseAll, "\"" ),
  63317. new Transform( "", kUppercaseFirst, ". " ),
  63318. new Transform( " ", kIdentity, "(" ),
  63319. new Transform( "", kIdentity, "ful " ),
  63320. new Transform( " ", kUppercaseFirst, ". " ),
  63321. new Transform( "", kIdentity, "ive " ),
  63322. new Transform( "", kIdentity, "less " ),
  63323. new Transform( "", kUppercaseAll, "'" ),
  63324. new Transform( "", kIdentity, "est " ),
  63325. new Transform( " ", kUppercaseFirst, "." ),
  63326. new Transform( "", kUppercaseAll, "\">" ),
  63327. new Transform( " ", kIdentity, "='" ),
  63328. new Transform( "", kUppercaseFirst, "," ),
  63329. new Transform( "", kIdentity, "ize " ),
  63330. new Transform( "", kUppercaseAll, "." ),
  63331. new Transform( "\xc2\xa0", kIdentity, "" ),
  63332. new Transform( " ", kIdentity, "," ),
  63333. new Transform( "", kUppercaseFirst, "=\"" ),
  63334. new Transform( "", kUppercaseAll, "=\"" ),
  63335. new Transform( "", kIdentity, "ous " ),
  63336. new Transform( "", kUppercaseAll, ", " ),
  63337. new Transform( "", kUppercaseFirst, "='" ),
  63338. new Transform( " ", kUppercaseFirst, "," ),
  63339. new Transform( " ", kUppercaseAll, "=\"" ),
  63340. new Transform( " ", kUppercaseAll, ", " ),
  63341. new Transform( "", kUppercaseAll, "," ),
  63342. new Transform( "", kUppercaseAll, "(" ),
  63343. new Transform( "", kUppercaseAll, ". " ),
  63344. new Transform( " ", kUppercaseAll, "." ),
  63345. new Transform( "", kUppercaseAll, "='" ),
  63346. new Transform( " ", kUppercaseAll, ". " ),
  63347. new Transform( " ", kUppercaseFirst, "=\"" ),
  63348. new Transform( " ", kUppercaseAll, "='" ),
  63349. new Transform( " ", kUppercaseFirst, "='" )
  63350. ];
  63351. exports.kTransforms = kTransforms;
  63352. exports.kNumTransforms = kTransforms.length;
  63353. function ToUpperCase(p, i) {
  63354. if (p[i] < 0xc0) {
  63355. if (p[i] >= 97 && p[i] <= 122) {
  63356. p[i] ^= 32;
  63357. }
  63358. return 1;
  63359. }
  63360. /* An overly simplified uppercasing model for utf-8. */
  63361. if (p[i] < 0xe0) {
  63362. p[i + 1] ^= 32;
  63363. return 2;
  63364. }
  63365. /* An arbitrary transform for three byte characters. */
  63366. p[i + 2] ^= 5;
  63367. return 3;
  63368. }
  63369. exports.transformDictionaryWord = function(dst, idx, word, len, transform) {
  63370. var prefix = kTransforms[transform].prefix;
  63371. var suffix = kTransforms[transform].suffix;
  63372. var t = kTransforms[transform].transform;
  63373. var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);
  63374. var i = 0;
  63375. var start_idx = idx;
  63376. var uppercase;
  63377. if (skip > len) {
  63378. skip = len;
  63379. }
  63380. var prefix_pos = 0;
  63381. while (prefix_pos < prefix.length) {
  63382. dst[idx++] = prefix[prefix_pos++];
  63383. }
  63384. word += skip;
  63385. len -= skip;
  63386. if (t <= kOmitLast9) {
  63387. len -= t;
  63388. }
  63389. for (i = 0; i < len; i++) {
  63390. dst[idx++] = BrotliDictionary.dictionary[word + i];
  63391. }
  63392. uppercase = idx - len;
  63393. if (t === kUppercaseFirst) {
  63394. ToUpperCase(dst, uppercase);
  63395. } else if (t === kUppercaseAll) {
  63396. while (len > 0) {
  63397. var step = ToUpperCase(dst, uppercase);
  63398. uppercase += step;
  63399. len -= step;
  63400. }
  63401. }
  63402. var suffix_pos = 0;
  63403. while (suffix_pos < suffix.length) {
  63404. dst[idx++] = suffix[suffix_pos++];
  63405. }
  63406. return idx - start_idx;
  63407. }
  63408. /***/ }),
  63409. /* 285 */
  63410. /***/ (function(module, exports, __webpack_require__) {
  63411. /* WEBPACK VAR INJECTION */(function(__dirname) {// Generated by CoffeeScript 1.12.6
  63412. (function() {
  63413. var AFMFont, PDFFont, StandardFont, fs,
  63414. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  63415. hasProp = {}.hasOwnProperty;
  63416. AFMFont = __webpack_require__(286);
  63417. PDFFont = __webpack_require__(82);
  63418. fs = __webpack_require__(56);
  63419. StandardFont = (function(superClass) {
  63420. var STANDARD_FONTS;
  63421. extend(StandardFont, superClass);
  63422. function StandardFont(document, name1, id) {
  63423. var ref;
  63424. this.document = document;
  63425. this.name = name1;
  63426. this.id = id;
  63427. this.font = new AFMFont(STANDARD_FONTS[this.name]());
  63428. ref = this.font, this.ascender = ref.ascender, this.descender = ref.descender, this.bbox = ref.bbox, this.lineGap = ref.lineGap;
  63429. }
  63430. StandardFont.prototype.embed = function() {
  63431. this.dictionary.data = {
  63432. Type: 'Font',
  63433. BaseFont: this.name,
  63434. Subtype: 'Type1',
  63435. Encoding: 'WinAnsiEncoding'
  63436. };
  63437. return this.dictionary.end();
  63438. };
  63439. StandardFont.prototype.encode = function(text) {
  63440. var advances, encoded, glyph, glyphs, i, j, len, positions;
  63441. encoded = this.font.encodeText(text);
  63442. glyphs = this.font.glyphsForString('' + text);
  63443. advances = this.font.advancesForGlyphs(glyphs);
  63444. positions = [];
  63445. for (i = j = 0, len = glyphs.length; j < len; i = ++j) {
  63446. glyph = glyphs[i];
  63447. positions.push({
  63448. xAdvance: advances[i],
  63449. yAdvance: 0,
  63450. xOffset: 0,
  63451. yOffset: 0,
  63452. advanceWidth: this.font.widthOfGlyph(glyph)
  63453. });
  63454. }
  63455. return [encoded, positions];
  63456. };
  63457. StandardFont.prototype.widthOfString = function(string, size) {
  63458. var advance, advances, glyphs, j, len, scale, width;
  63459. glyphs = this.font.glyphsForString('' + string);
  63460. advances = this.font.advancesForGlyphs(glyphs);
  63461. width = 0;
  63462. for (j = 0, len = advances.length; j < len; j++) {
  63463. advance = advances[j];
  63464. width += advance;
  63465. }
  63466. scale = size / 1000;
  63467. return width * scale;
  63468. };
  63469. StandardFont.isStandardFont = function(name) {
  63470. return name in STANDARD_FONTS;
  63471. };
  63472. STANDARD_FONTS = {
  63473. "Courier": function() {
  63474. return fs.readFileSync(__dirname + "/../font/data/Courier.afm", 'utf8');
  63475. },
  63476. "Courier-Bold": function() {
  63477. return fs.readFileSync(__dirname + "/../font/data/Courier-Bold.afm", 'utf8');
  63478. },
  63479. "Courier-Oblique": function() {
  63480. return fs.readFileSync(__dirname + "/../font/data/Courier-Oblique.afm", 'utf8');
  63481. },
  63482. "Courier-BoldOblique": function() {
  63483. return fs.readFileSync(__dirname + "/../font/data/Courier-BoldOblique.afm", 'utf8');
  63484. },
  63485. "Helvetica": function() {
  63486. return fs.readFileSync(__dirname + "/../font/data/Helvetica.afm", 'utf8');
  63487. },
  63488. "Helvetica-Bold": function() {
  63489. return fs.readFileSync(__dirname + "/../font/data/Helvetica-Bold.afm", 'utf8');
  63490. },
  63491. "Helvetica-Oblique": function() {
  63492. return fs.readFileSync(__dirname + "/../font/data/Helvetica-Oblique.afm", 'utf8');
  63493. },
  63494. "Helvetica-BoldOblique": function() {
  63495. return fs.readFileSync(__dirname + "/../font/data/Helvetica-BoldOblique.afm", 'utf8');
  63496. },
  63497. "Times-Roman": function() {
  63498. return fs.readFileSync(__dirname + "/../font/data/Times-Roman.afm", 'utf8');
  63499. },
  63500. "Times-Bold": function() {
  63501. return fs.readFileSync(__dirname + "/../font/data/Times-Bold.afm", 'utf8');
  63502. },
  63503. "Times-Italic": function() {
  63504. return fs.readFileSync(__dirname + "/../font/data/Times-Italic.afm", 'utf8');
  63505. },
  63506. "Times-BoldItalic": function() {
  63507. return fs.readFileSync(__dirname + "/../font/data/Times-BoldItalic.afm", 'utf8');
  63508. },
  63509. "Symbol": function() {
  63510. return fs.readFileSync(__dirname + "/../font/data/Symbol.afm", 'utf8');
  63511. },
  63512. "ZapfDingbats": function() {
  63513. return fs.readFileSync(__dirname + "/../font/data/ZapfDingbats.afm", 'utf8');
  63514. }
  63515. };
  63516. return StandardFont;
  63517. })(PDFFont);
  63518. module.exports = StandardFont;
  63519. }).call(this);
  63520. /* WEBPACK VAR INJECTION */}.call(exports, "/"))
  63521. /***/ }),
  63522. /* 286 */
  63523. /***/ (function(module, exports, __webpack_require__) {
  63524. // Generated by CoffeeScript 1.12.6
  63525. (function() {
  63526. var AFMFont, fs;
  63527. fs = __webpack_require__(56);
  63528. AFMFont = (function() {
  63529. var WIN_ANSI_MAP, characters;
  63530. AFMFont.open = function(filename) {
  63531. return new AFMFont(fs.readFileSync(filename, 'utf8'));
  63532. };
  63533. function AFMFont(contents) {
  63534. var e, i;
  63535. this.contents = contents;
  63536. this.attributes = {};
  63537. this.glyphWidths = {};
  63538. this.boundingBoxes = {};
  63539. this.kernPairs = {};
  63540. this.parse();
  63541. this.charWidths = (function() {
  63542. var j, results;
  63543. results = [];
  63544. for (i = j = 0; j <= 255; i = ++j) {
  63545. results.push(this.glyphWidths[characters[i]]);
  63546. }
  63547. return results;
  63548. }).call(this);
  63549. this.bbox = (function() {
  63550. var j, len, ref, results;
  63551. ref = this.attributes['FontBBox'].split(/\s+/);
  63552. results = [];
  63553. for (j = 0, len = ref.length; j < len; j++) {
  63554. e = ref[j];
  63555. results.push(+e);
  63556. }
  63557. return results;
  63558. }).call(this);
  63559. this.ascender = +(this.attributes['Ascender'] || 0);
  63560. this.descender = +(this.attributes['Descender'] || 0);
  63561. this.lineGap = (this.bbox[3] - this.bbox[1]) - (this.ascender - this.descender);
  63562. }
  63563. AFMFont.prototype.parse = function() {
  63564. var a, j, key, len, line, match, name, ref, section, value;
  63565. section = '';
  63566. ref = this.contents.split('\n');
  63567. for (j = 0, len = ref.length; j < len; j++) {
  63568. line = ref[j];
  63569. if (match = line.match(/^Start(\w+)/)) {
  63570. section = match[1];
  63571. continue;
  63572. } else if (match = line.match(/^End(\w+)/)) {
  63573. section = '';
  63574. continue;
  63575. }
  63576. switch (section) {
  63577. case 'FontMetrics':
  63578. match = line.match(/(^\w+)\s+(.*)/);
  63579. key = match[1];
  63580. value = match[2];
  63581. if (a = this.attributes[key]) {
  63582. if (!Array.isArray(a)) {
  63583. a = this.attributes[key] = [a];
  63584. }
  63585. a.push(value);
  63586. } else {
  63587. this.attributes[key] = value;
  63588. }
  63589. break;
  63590. case 'CharMetrics':
  63591. if (!/^CH?\s/.test(line)) {
  63592. continue;
  63593. }
  63594. name = line.match(/\bN\s+(\.?\w+)\s*;/)[1];
  63595. this.glyphWidths[name] = +line.match(/\bWX\s+(\d+)\s*;/)[1];
  63596. break;
  63597. case 'KernPairs':
  63598. match = line.match(/^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/);
  63599. if (match) {
  63600. this.kernPairs[match[1] + '\0' + match[2]] = parseInt(match[3]);
  63601. }
  63602. }
  63603. }
  63604. };
  63605. WIN_ANSI_MAP = {
  63606. 402: 131,
  63607. 8211: 150,
  63608. 8212: 151,
  63609. 8216: 145,
  63610. 8217: 146,
  63611. 8218: 130,
  63612. 8220: 147,
  63613. 8221: 148,
  63614. 8222: 132,
  63615. 8224: 134,
  63616. 8225: 135,
  63617. 8226: 149,
  63618. 8230: 133,
  63619. 8364: 128,
  63620. 8240: 137,
  63621. 8249: 139,
  63622. 8250: 155,
  63623. 710: 136,
  63624. 8482: 153,
  63625. 338: 140,
  63626. 339: 156,
  63627. 732: 152,
  63628. 352: 138,
  63629. 353: 154,
  63630. 376: 159,
  63631. 381: 142,
  63632. 382: 158
  63633. };
  63634. AFMFont.prototype.encodeText = function(text) {
  63635. var char, i, j, ref, res;
  63636. res = [];
  63637. for (i = j = 0, ref = text.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  63638. char = text.charCodeAt(i);
  63639. char = WIN_ANSI_MAP[char] || char;
  63640. res.push(char.toString(16));
  63641. }
  63642. return res;
  63643. };
  63644. AFMFont.prototype.glyphsForString = function(string) {
  63645. var charCode, glyphs, i, j, ref;
  63646. glyphs = [];
  63647. for (i = j = 0, ref = string.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  63648. charCode = string.charCodeAt(i);
  63649. glyphs.push(this.characterToGlyph(charCode));
  63650. }
  63651. return glyphs;
  63652. };
  63653. AFMFont.prototype.characterToGlyph = function(character) {
  63654. return characters[WIN_ANSI_MAP[character] || character] || '.notdef';
  63655. };
  63656. AFMFont.prototype.widthOfGlyph = function(glyph) {
  63657. return this.glyphWidths[glyph] || 0;
  63658. };
  63659. AFMFont.prototype.getKernPair = function(left, right) {
  63660. return this.kernPairs[left + '\0' + right] || 0;
  63661. };
  63662. AFMFont.prototype.advancesForGlyphs = function(glyphs) {
  63663. var advances, index, j, left, len, right;
  63664. advances = [];
  63665. for (index = j = 0, len = glyphs.length; j < len; index = ++j) {
  63666. left = glyphs[index];
  63667. right = glyphs[index + 1];
  63668. advances.push(this.widthOfGlyph(left) + this.getKernPair(left, right));
  63669. }
  63670. return advances;
  63671. };
  63672. characters = '.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n.notdef .notdef .notdef .notdef\n\nspace exclam quotedbl numbersign\ndollar percent ampersand quotesingle\nparenleft parenright asterisk plus\ncomma hyphen period slash\nzero one two three\nfour five six seven\neight nine colon semicolon\nless equal greater question\n\nat A B C\nD E F G\nH I J K\nL M N O\nP Q R S\nT U V W\nX Y Z bracketleft\nbackslash bracketright asciicircum underscore\n\ngrave a b c\nd e f g\nh i j k\nl m n o\np q r s\nt u v w\nx y z braceleft\nbar braceright asciitilde .notdef\n\nEuro .notdef quotesinglbase florin\nquotedblbase ellipsis dagger daggerdbl\ncircumflex perthousand Scaron guilsinglleft\nOE .notdef Zcaron .notdef\n.notdef quoteleft quoteright quotedblleft\nquotedblright bullet endash emdash\ntilde trademark scaron guilsinglright\noe .notdef zcaron ydieresis\n\nspace exclamdown cent sterling\ncurrency yen brokenbar section\ndieresis copyright ordfeminine guillemotleft\nlogicalnot hyphen registered macron\ndegree plusminus twosuperior threesuperior\nacute mu paragraph periodcentered\ncedilla onesuperior ordmasculine guillemotright\nonequarter onehalf threequarters questiondown\n\nAgrave Aacute Acircumflex Atilde\nAdieresis Aring AE Ccedilla\nEgrave Eacute Ecircumflex Edieresis\nIgrave Iacute Icircumflex Idieresis\nEth Ntilde Ograve Oacute\nOcircumflex Otilde Odieresis multiply\nOslash Ugrave Uacute Ucircumflex\nUdieresis Yacute Thorn germandbls\n\nagrave aacute acircumflex atilde\nadieresis aring ae ccedilla\negrave eacute ecircumflex edieresis\nigrave iacute icircumflex idieresis\neth ntilde ograve oacute\nocircumflex otilde odieresis divide\noslash ugrave uacute ucircumflex\nudieresis yacute thorn ydieresis'.split(/\s+/);
  63673. return AFMFont;
  63674. })();
  63675. module.exports = AFMFont;
  63676. }).call(this);
  63677. /***/ }),
  63678. /* 287 */
  63679. /***/ (function(module, exports, __webpack_require__) {
  63680. // Generated by CoffeeScript 1.12.6
  63681. (function() {
  63682. var EmbeddedFont, PDFFont, PDFObject,
  63683. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  63684. hasProp = {}.hasOwnProperty,
  63685. slice = [].slice;
  63686. PDFFont = __webpack_require__(82);
  63687. PDFObject = __webpack_require__(57);
  63688. EmbeddedFont = (function(superClass) {
  63689. var toHex;
  63690. extend(EmbeddedFont, superClass);
  63691. function EmbeddedFont(document, font, id) {
  63692. this.document = document;
  63693. this.font = font;
  63694. this.id = id;
  63695. this.subset = this.font.createSubset();
  63696. this.unicode = [[0]];
  63697. this.widths = [this.font.getGlyph(0).advanceWidth];
  63698. this.name = this.font.postscriptName;
  63699. this.scale = 1000 / this.font.unitsPerEm;
  63700. this.ascender = this.font.ascent * this.scale;
  63701. this.descender = this.font.descent * this.scale;
  63702. this.lineGap = this.font.lineGap * this.scale;
  63703. this.bbox = this.font.bbox;
  63704. this.layoutCache = Object.create(null);
  63705. }
  63706. EmbeddedFont.prototype.layoutRun = function(text, features) {
  63707. var i, j, key, len, position, ref, run;
  63708. run = this.font.layout(text, features);
  63709. ref = run.positions;
  63710. for (i = j = 0, len = ref.length; j < len; i = ++j) {
  63711. position = ref[i];
  63712. for (key in position) {
  63713. position[key] *= this.scale;
  63714. }
  63715. position.advanceWidth = run.glyphs[i].advanceWidth * this.scale;
  63716. }
  63717. return run;
  63718. };
  63719. EmbeddedFont.prototype.layoutCached = function(text) {
  63720. var cached, run;
  63721. if (cached = this.layoutCache[text]) {
  63722. return cached;
  63723. }
  63724. run = this.layoutRun(text);
  63725. this.layoutCache[text] = run;
  63726. return run;
  63727. };
  63728. EmbeddedFont.prototype.layout = function(text, features, onlyWidth) {
  63729. var advanceWidth, glyphs, index, last, positions, ref, run;
  63730. if (onlyWidth == null) {
  63731. onlyWidth = false;
  63732. }
  63733. if (features) {
  63734. return this.layoutRun(text, features);
  63735. }
  63736. glyphs = onlyWidth ? null : [];
  63737. positions = onlyWidth ? null : [];
  63738. advanceWidth = 0;
  63739. last = 0;
  63740. index = 0;
  63741. while (index <= text.length) {
  63742. if ((index === text.length && last < index) || ((ref = text.charAt(index)) === ' ' || ref === '\t')) {
  63743. run = this.layoutCached(text.slice(last, ++index));
  63744. if (!onlyWidth) {
  63745. glyphs.push.apply(glyphs, run.glyphs);
  63746. positions.push.apply(positions, run.positions);
  63747. }
  63748. advanceWidth += run.advanceWidth;
  63749. last = index;
  63750. } else {
  63751. index++;
  63752. }
  63753. }
  63754. return {
  63755. glyphs: glyphs,
  63756. positions: positions,
  63757. advanceWidth: advanceWidth
  63758. };
  63759. };
  63760. EmbeddedFont.prototype.encode = function(text, features) {
  63761. var base, base1, gid, glyph, glyphs, i, j, len, positions, ref, res;
  63762. ref = this.layout(text, features), glyphs = ref.glyphs, positions = ref.positions;
  63763. res = [];
  63764. for (i = j = 0, len = glyphs.length; j < len; i = ++j) {
  63765. glyph = glyphs[i];
  63766. gid = this.subset.includeGlyph(glyph.id);
  63767. res.push(('0000' + gid.toString(16)).slice(-4));
  63768. if ((base = this.widths)[gid] == null) {
  63769. base[gid] = glyph.advanceWidth * this.scale;
  63770. }
  63771. if ((base1 = this.unicode)[gid] == null) {
  63772. base1[gid] = glyph.codePoints;
  63773. }
  63774. }
  63775. return [res, positions];
  63776. };
  63777. EmbeddedFont.prototype.widthOfString = function(string, size, features) {
  63778. var scale, width;
  63779. width = this.layout(string, features, true).advanceWidth;
  63780. scale = size / 1000;
  63781. return width * scale;
  63782. };
  63783. EmbeddedFont.prototype.embed = function() {
  63784. var bbox, descendantFont, descriptor, familyClass, flags, fontFile, i, isCFF, name, ref, tag;
  63785. isCFF = this.subset.cff != null;
  63786. fontFile = this.document.ref();
  63787. if (isCFF) {
  63788. fontFile.data.Subtype = 'CIDFontType0C';
  63789. }
  63790. this.subset.encodeStream().pipe(fontFile);
  63791. familyClass = (((ref = this.font['OS/2']) != null ? ref.sFamilyClass : void 0) || 0) >> 8;
  63792. flags = 0;
  63793. if (this.font.post.isFixedPitch) {
  63794. flags |= 1 << 0;
  63795. }
  63796. if ((1 <= familyClass && familyClass <= 7)) {
  63797. flags |= 1 << 1;
  63798. }
  63799. flags |= 1 << 2;
  63800. if (familyClass === 10) {
  63801. flags |= 1 << 3;
  63802. }
  63803. if (this.font.head.macStyle.italic) {
  63804. flags |= 1 << 6;
  63805. }
  63806. tag = ((function() {
  63807. var j, results;
  63808. results = [];
  63809. for (i = j = 0; j < 6; i = ++j) {
  63810. results.push(String.fromCharCode(Math.random() * 26 + 65));
  63811. }
  63812. return results;
  63813. })()).join('');
  63814. name = tag + '+' + this.font.postscriptName;
  63815. bbox = this.font.bbox;
  63816. descriptor = this.document.ref({
  63817. Type: 'FontDescriptor',
  63818. FontName: name,
  63819. Flags: flags,
  63820. FontBBox: [bbox.minX * this.scale, bbox.minY * this.scale, bbox.maxX * this.scale, bbox.maxY * this.scale],
  63821. ItalicAngle: this.font.italicAngle,
  63822. Ascent: this.ascender,
  63823. Descent: this.descender,
  63824. CapHeight: (this.font.capHeight || this.font.ascent) * this.scale,
  63825. XHeight: (this.font.xHeight || 0) * this.scale,
  63826. StemV: 0
  63827. });
  63828. if (isCFF) {
  63829. descriptor.data.FontFile3 = fontFile;
  63830. } else {
  63831. descriptor.data.FontFile2 = fontFile;
  63832. }
  63833. descriptor.end();
  63834. descendantFont = this.document.ref({
  63835. Type: 'Font',
  63836. Subtype: isCFF ? 'CIDFontType0' : 'CIDFontType2',
  63837. BaseFont: name,
  63838. CIDSystemInfo: {
  63839. Registry: new String('Adobe'),
  63840. Ordering: new String('Identity'),
  63841. Supplement: 0
  63842. },
  63843. FontDescriptor: descriptor,
  63844. W: [0, this.widths]
  63845. });
  63846. descendantFont.end();
  63847. this.dictionary.data = {
  63848. Type: 'Font',
  63849. Subtype: 'Type0',
  63850. BaseFont: name,
  63851. Encoding: 'Identity-H',
  63852. DescendantFonts: [descendantFont],
  63853. ToUnicode: this.toUnicodeCmap()
  63854. };
  63855. return this.dictionary.end();
  63856. };
  63857. toHex = function() {
  63858. var code, codePoints, codes;
  63859. codePoints = 1 <= arguments.length ? slice.call(arguments, 0) : [];
  63860. codes = (function() {
  63861. var j, len, results;
  63862. results = [];
  63863. for (j = 0, len = codePoints.length; j < len; j++) {
  63864. code = codePoints[j];
  63865. results.push(('0000' + code.toString(16)).slice(-4));
  63866. }
  63867. return results;
  63868. })();
  63869. return codes.join('');
  63870. };
  63871. EmbeddedFont.prototype.toUnicodeCmap = function() {
  63872. var cmap, codePoints, encoded, entries, j, k, len, len1, ref, value;
  63873. cmap = this.document.ref();
  63874. entries = [];
  63875. ref = this.unicode;
  63876. for (j = 0, len = ref.length; j < len; j++) {
  63877. codePoints = ref[j];
  63878. encoded = [];
  63879. for (k = 0, len1 = codePoints.length; k < len1; k++) {
  63880. value = codePoints[k];
  63881. if (value > 0xffff) {
  63882. value -= 0x10000;
  63883. encoded.push(toHex(value >>> 10 & 0x3ff | 0xd800));
  63884. value = 0xdc00 | value & 0x3ff;
  63885. }
  63886. encoded.push(toHex(value));
  63887. }
  63888. entries.push("<" + (encoded.join(' ')) + ">");
  63889. }
  63890. cmap.end("/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n /Registry (Adobe)\n /Ordering (UCS)\n /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000><ffff>\nendcodespacerange\n1 beginbfrange\n<0000> <" + (toHex(entries.length - 1)) + "> [" + (entries.join(' ')) + "]\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend");
  63891. return cmap;
  63892. };
  63893. return EmbeddedFont;
  63894. })(PDFFont);
  63895. module.exports = EmbeddedFont;
  63896. }).call(this);
  63897. /***/ }),
  63898. /* 288 */
  63899. /***/ (function(module, exports, __webpack_require__) {
  63900. // Generated by CoffeeScript 1.12.6
  63901. (function() {
  63902. var LineWrapper, number;
  63903. LineWrapper = __webpack_require__(289);
  63904. number = __webpack_require__(57).number;
  63905. module.exports = {
  63906. initText: function() {
  63907. this.x = 0;
  63908. this.y = 0;
  63909. return this._lineGap = 0;
  63910. },
  63911. lineGap: function(_lineGap) {
  63912. this._lineGap = _lineGap;
  63913. return this;
  63914. },
  63915. moveDown: function(lines) {
  63916. if (lines == null) {
  63917. lines = 1;
  63918. }
  63919. this.y += this.currentLineHeight(true) * lines + this._lineGap;
  63920. return this;
  63921. },
  63922. moveUp: function(lines) {
  63923. if (lines == null) {
  63924. lines = 1;
  63925. }
  63926. this.y -= this.currentLineHeight(true) * lines + this._lineGap;
  63927. return this;
  63928. },
  63929. _text: function(text, x, y, options, lineCallback) {
  63930. var j, len, line, ref, wrapper;
  63931. options = this._initOptions(x, y, options);
  63932. text = text == null ? '' : '' + text;
  63933. if (options.wordSpacing) {
  63934. text = text.replace(/\s{2,}/g, ' ');
  63935. }
  63936. if (options.width) {
  63937. wrapper = this._wrapper;
  63938. if (!wrapper) {
  63939. wrapper = new LineWrapper(this, options);
  63940. wrapper.on('line', lineCallback);
  63941. }
  63942. this._wrapper = options.continued ? wrapper : null;
  63943. this._textOptions = options.continued ? options : null;
  63944. wrapper.wrap(text, options);
  63945. } else {
  63946. ref = text.split('\n');
  63947. for (j = 0, len = ref.length; j < len; j++) {
  63948. line = ref[j];
  63949. lineCallback(line, options);
  63950. }
  63951. }
  63952. return this;
  63953. },
  63954. text: function(text, x, y, options) {
  63955. return this._text(text, x, y, options, this._line.bind(this));
  63956. },
  63957. widthOfString: function(string, options) {
  63958. if (options == null) {
  63959. options = {};
  63960. }
  63961. return this._font.widthOfString(string, this._fontSize, options.features) + (options.characterSpacing || 0) * (string.length - 1);
  63962. },
  63963. heightOfString: function(text, options) {
  63964. var height, lineGap, ref, x, y;
  63965. if (options == null) {
  63966. options = {};
  63967. }
  63968. ref = this, x = ref.x, y = ref.y;
  63969. options = this._initOptions(options);
  63970. options.height = 2e308;
  63971. lineGap = options.lineGap || this._lineGap || 0;
  63972. this._text(text, this.x, this.y, options, (function(_this) {
  63973. return function(line, options) {
  63974. return _this.y += _this.currentLineHeight(true) + lineGap;
  63975. };
  63976. })(this));
  63977. height = this.y - y;
  63978. this.x = x;
  63979. this.y = y;
  63980. return height;
  63981. },
  63982. list: function(list, x, y, options, wrapper) {
  63983. var flatten, i, indent, itemIndent, items, level, levels, midLine, r;
  63984. options = this._initOptions(x, y, options);
  63985. midLine = Math.round((this._font.ascender / 1000 * this._fontSize) / 2);
  63986. r = options.bulletRadius || Math.round((this._font.ascender / 1000 * this._fontSize) / 3);
  63987. indent = options.textIndent || r * 5;
  63988. itemIndent = options.bulletIndent || r * 8;
  63989. level = 1;
  63990. items = [];
  63991. levels = [];
  63992. flatten = function(list) {
  63993. var i, item, j, len, results;
  63994. results = [];
  63995. for (i = j = 0, len = list.length; j < len; i = ++j) {
  63996. item = list[i];
  63997. if (Array.isArray(item)) {
  63998. level++;
  63999. flatten(item);
  64000. results.push(level--);
  64001. } else {
  64002. items.push(item);
  64003. results.push(levels.push(level));
  64004. }
  64005. }
  64006. return results;
  64007. };
  64008. flatten(list);
  64009. wrapper = new LineWrapper(this, options);
  64010. wrapper.on('line', this._line.bind(this));
  64011. level = 1;
  64012. i = 0;
  64013. wrapper.on('firstLine', (function(_this) {
  64014. return function() {
  64015. var diff, l;
  64016. if ((l = levels[i++]) !== level) {
  64017. diff = itemIndent * (l - level);
  64018. _this.x += diff;
  64019. wrapper.lineWidth -= diff;
  64020. level = l;
  64021. }
  64022. _this.circle(_this.x - indent + r, _this.y + midLine, r);
  64023. return _this.fill();
  64024. };
  64025. })(this));
  64026. wrapper.on('sectionStart', (function(_this) {
  64027. return function() {
  64028. var pos;
  64029. pos = indent + itemIndent * (level - 1);
  64030. _this.x += pos;
  64031. return wrapper.lineWidth -= pos;
  64032. };
  64033. })(this));
  64034. wrapper.on('sectionEnd', (function(_this) {
  64035. return function() {
  64036. var pos;
  64037. pos = indent + itemIndent * (level - 1);
  64038. _this.x -= pos;
  64039. return wrapper.lineWidth += pos;
  64040. };
  64041. })(this));
  64042. wrapper.wrap(items.join('\n'), options);
  64043. return this;
  64044. },
  64045. _initOptions: function(x, y, options) {
  64046. var key, ref, val;
  64047. if (x == null) {
  64048. x = {};
  64049. }
  64050. if (options == null) {
  64051. options = {};
  64052. }
  64053. if (typeof x === 'object') {
  64054. options = x;
  64055. x = null;
  64056. }
  64057. options = (function() {
  64058. var k, opts, v;
  64059. opts = {};
  64060. for (k in options) {
  64061. v = options[k];
  64062. opts[k] = v;
  64063. }
  64064. return opts;
  64065. })();
  64066. if (this._textOptions) {
  64067. ref = this._textOptions;
  64068. for (key in ref) {
  64069. val = ref[key];
  64070. if (key !== 'continued') {
  64071. if (options[key] == null) {
  64072. options[key] = val;
  64073. }
  64074. }
  64075. }
  64076. }
  64077. if (x != null) {
  64078. this.x = x;
  64079. }
  64080. if (y != null) {
  64081. this.y = y;
  64082. }
  64083. if (options.lineBreak !== false) {
  64084. if (options.width == null) {
  64085. options.width = this.page.width - this.x - this.page.margins.right;
  64086. }
  64087. }
  64088. options.columns || (options.columns = 0);
  64089. if (options.columnGap == null) {
  64090. options.columnGap = 18;
  64091. }
  64092. return options;
  64093. },
  64094. _line: function(text, options, wrapper) {
  64095. var lineGap;
  64096. if (options == null) {
  64097. options = {};
  64098. }
  64099. this._fragment(text, this.x, this.y, options);
  64100. lineGap = options.lineGap || this._lineGap || 0;
  64101. if (!wrapper) {
  64102. return this.x += this.widthOfString(text);
  64103. } else {
  64104. return this.y += this.currentLineHeight(true) + lineGap;
  64105. }
  64106. },
  64107. _fragment: function(text, x, y, options) {
  64108. var addSegment, align, base, characterSpacing, commands, d, encoded, encodedWord, flush, hadOffset, i, j, key, last, len, len1, lineWidth, lineY, m, mode, name, pos, positions, positionsWord, ref, ref1, ref2, renderedWidth, scale, space, spaceWidth, textWidth, val, word, wordSpacing, words;
  64109. text = ('' + text).replace(/\n/g, '');
  64110. if (text.length === 0) {
  64111. return;
  64112. }
  64113. align = options.align || 'left';
  64114. wordSpacing = options.wordSpacing || 0;
  64115. characterSpacing = options.characterSpacing || 0;
  64116. if (options.width) {
  64117. switch (align) {
  64118. case 'right':
  64119. textWidth = this.widthOfString(text.replace(/\s+$/, ''), options);
  64120. x += options.lineWidth - textWidth;
  64121. break;
  64122. case 'center':
  64123. x += options.lineWidth / 2 - options.textWidth / 2;
  64124. break;
  64125. case 'justify':
  64126. words = text.trim().split(/\s+/);
  64127. textWidth = this.widthOfString(text.replace(/\s+/g, ''), options);
  64128. spaceWidth = this.widthOfString(' ') + characterSpacing;
  64129. wordSpacing = Math.max(0, (options.lineWidth - textWidth) / Math.max(1, words.length - 1) - spaceWidth);
  64130. }
  64131. }
  64132. renderedWidth = options.textWidth + (wordSpacing * (options.wordCount - 1)) + (characterSpacing * (text.length - 1));
  64133. if (options.link) {
  64134. this.link(x, y, renderedWidth, this.currentLineHeight(), options.link);
  64135. }
  64136. if (options.underline || options.strike) {
  64137. this.save();
  64138. if (!options.stroke) {
  64139. this.strokeColor.apply(this, this._fillColor);
  64140. }
  64141. lineWidth = this._fontSize < 10 ? 0.5 : Math.floor(this._fontSize / 10);
  64142. this.lineWidth(lineWidth);
  64143. d = options.underline ? 1 : 2;
  64144. lineY = y + this.currentLineHeight() / d;
  64145. if (options.underline) {
  64146. lineY -= lineWidth;
  64147. }
  64148. this.moveTo(x, lineY);
  64149. this.lineTo(x + renderedWidth, lineY);
  64150. this.stroke();
  64151. this.restore();
  64152. }
  64153. this.save();
  64154. this.transform(1, 0, 0, -1, 0, this.page.height);
  64155. y = this.page.height - y - (this._font.ascender / 1000 * this._fontSize);
  64156. if ((base = this.page.fonts)[name = this._font.id] == null) {
  64157. base[name] = this._font.ref();
  64158. }
  64159. this.addContent("BT");
  64160. this.addContent("1 0 0 1 " + (number(x)) + " " + (number(y)) + " Tm");
  64161. this.addContent("/" + this._font.id + " " + (number(this._fontSize)) + " Tf");
  64162. mode = options.fill && options.stroke ? 2 : options.stroke ? 1 : 0;
  64163. if (mode) {
  64164. this.addContent(mode + " Tr");
  64165. }
  64166. if (characterSpacing) {
  64167. this.addContent((number(characterSpacing)) + " Tc");
  64168. }
  64169. if (wordSpacing) {
  64170. words = text.trim().split(/\s+/);
  64171. wordSpacing += this.widthOfString(' ') + characterSpacing;
  64172. wordSpacing *= 1000 / this._fontSize;
  64173. encoded = [];
  64174. positions = [];
  64175. for (j = 0, len = words.length; j < len; j++) {
  64176. word = words[j];
  64177. ref = this._font.encode(word, options.features), encodedWord = ref[0], positionsWord = ref[1];
  64178. encoded.push.apply(encoded, encodedWord);
  64179. positions.push.apply(positions, positionsWord);
  64180. space = {};
  64181. ref1 = positions[positions.length - 1];
  64182. for (key in ref1) {
  64183. val = ref1[key];
  64184. space[key] = val;
  64185. }
  64186. space.xAdvance += wordSpacing;
  64187. positions[positions.length - 1] = space;
  64188. }
  64189. } else {
  64190. ref2 = this._font.encode(text, options.features), encoded = ref2[0], positions = ref2[1];
  64191. }
  64192. scale = this._fontSize / 1000;
  64193. commands = [];
  64194. last = 0;
  64195. hadOffset = false;
  64196. addSegment = (function(_this) {
  64197. return function(cur) {
  64198. var advance, hex;
  64199. if (last < cur) {
  64200. hex = encoded.slice(last, cur).join('');
  64201. advance = positions[cur - 1].xAdvance - positions[cur - 1].advanceWidth;
  64202. commands.push("<" + hex + "> " + (number(-advance)));
  64203. }
  64204. return last = cur;
  64205. };
  64206. })(this);
  64207. flush = (function(_this) {
  64208. return function(i) {
  64209. addSegment(i);
  64210. if (commands.length > 0) {
  64211. _this.addContent("[" + (commands.join(' ')) + "] TJ");
  64212. return commands.length = 0;
  64213. }
  64214. };
  64215. })(this);
  64216. for (i = m = 0, len1 = positions.length; m < len1; i = ++m) {
  64217. pos = positions[i];
  64218. if (pos.xOffset || pos.yOffset) {
  64219. flush(i);
  64220. this.addContent("1 0 0 1 " + (number(x + pos.xOffset * scale)) + " " + (number(y + pos.yOffset * scale)) + " Tm");
  64221. flush(i + 1);
  64222. hadOffset = true;
  64223. } else {
  64224. if (hadOffset) {
  64225. this.addContent("1 0 0 1 " + (number(x)) + " " + (number(y)) + " Tm");
  64226. hadOffset = false;
  64227. }
  64228. if (pos.xAdvance - pos.advanceWidth !== 0) {
  64229. addSegment(i + 1);
  64230. }
  64231. }
  64232. x += pos.xAdvance * scale;
  64233. }
  64234. flush(i);
  64235. this.addContent("ET");
  64236. return this.restore();
  64237. }
  64238. };
  64239. }).call(this);
  64240. /***/ }),
  64241. /* 289 */
  64242. /***/ (function(module, exports, __webpack_require__) {
  64243. // Generated by CoffeeScript 1.12.6
  64244. (function() {
  64245. var EventEmitter, LineBreaker, LineWrapper,
  64246. extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  64247. hasProp = {}.hasOwnProperty;
  64248. EventEmitter = __webpack_require__(32).EventEmitter;
  64249. LineBreaker = __webpack_require__(16);
  64250. LineWrapper = (function(superClass) {
  64251. extend(LineWrapper, superClass);
  64252. function LineWrapper(document, options) {
  64253. var ref;
  64254. this.document = document;
  64255. this.indent = options.indent || 0;
  64256. this.characterSpacing = options.characterSpacing || 0;
  64257. this.wordSpacing = options.wordSpacing === 0;
  64258. this.columns = options.columns || 1;
  64259. this.columnGap = (ref = options.columnGap) != null ? ref : 18;
  64260. this.lineWidth = (options.width - (this.columnGap * (this.columns - 1))) / this.columns;
  64261. this.spaceLeft = this.lineWidth;
  64262. this.startX = this.document.x;
  64263. this.startY = this.document.y;
  64264. this.column = 1;
  64265. this.ellipsis = options.ellipsis;
  64266. this.continuedX = 0;
  64267. this.features = options.features;
  64268. if (options.height != null) {
  64269. this.height = options.height;
  64270. this.maxY = this.startY + options.height;
  64271. } else {
  64272. this.maxY = this.document.page.maxY();
  64273. }
  64274. this.on('firstLine', (function(_this) {
  64275. return function(options) {
  64276. var indent;
  64277. indent = _this.continuedX || _this.indent;
  64278. _this.document.x += indent;
  64279. _this.lineWidth -= indent;
  64280. return _this.once('line', function() {
  64281. _this.document.x -= indent;
  64282. _this.lineWidth += indent;
  64283. if (options.continued && !_this.continuedX) {
  64284. _this.continuedX = _this.indent;
  64285. }
  64286. if (!options.continued) {
  64287. return _this.continuedX = 0;
  64288. }
  64289. });
  64290. };
  64291. })(this));
  64292. this.on('lastLine', (function(_this) {
  64293. return function(options) {
  64294. var align;
  64295. align = options.align;
  64296. if (align === 'justify') {
  64297. options.align = 'left';
  64298. }
  64299. _this.lastLine = true;
  64300. return _this.once('line', function() {
  64301. _this.document.y += options.paragraphGap || 0;
  64302. options.align = align;
  64303. return _this.lastLine = false;
  64304. });
  64305. };
  64306. })(this));
  64307. }
  64308. LineWrapper.prototype.wordWidth = function(word) {
  64309. return this.document.widthOfString(word, this) + this.characterSpacing + this.wordSpacing;
  64310. };
  64311. LineWrapper.prototype.eachWord = function(text, fn) {
  64312. var bk, breaker, fbk, l, last, lbk, shouldContinue, w, word, wordWidths;
  64313. breaker = new LineBreaker(text);
  64314. last = null;
  64315. wordWidths = Object.create(null);
  64316. while (bk = breaker.nextBreak()) {
  64317. word = text.slice((last != null ? last.position : void 0) || 0, bk.position);
  64318. w = wordWidths[word] != null ? wordWidths[word] : wordWidths[word] = this.wordWidth(word);
  64319. if (w > this.lineWidth + this.continuedX) {
  64320. lbk = last;
  64321. fbk = {};
  64322. while (word.length) {
  64323. l = word.length;
  64324. while (w > this.spaceLeft) {
  64325. w = this.wordWidth(word.slice(0, --l));
  64326. }
  64327. fbk.required = l < word.length;
  64328. shouldContinue = fn(word.slice(0, l), w, fbk, lbk);
  64329. lbk = {
  64330. required: false
  64331. };
  64332. word = word.slice(l);
  64333. w = this.wordWidth(word);
  64334. if (shouldContinue === false) {
  64335. break;
  64336. }
  64337. }
  64338. } else {
  64339. shouldContinue = fn(word, w, bk, last);
  64340. }
  64341. if (shouldContinue === false) {
  64342. break;
  64343. }
  64344. last = bk;
  64345. }
  64346. };
  64347. LineWrapper.prototype.wrap = function(text, options) {
  64348. var buffer, emitLine, lc, nextY, textWidth, wc, y;
  64349. if (options.indent != null) {
  64350. this.indent = options.indent;
  64351. }
  64352. if (options.characterSpacing != null) {
  64353. this.characterSpacing = options.characterSpacing;
  64354. }
  64355. if (options.wordSpacing != null) {
  64356. this.wordSpacing = options.wordSpacing;
  64357. }
  64358. if (options.ellipsis != null) {
  64359. this.ellipsis = options.ellipsis;
  64360. }
  64361. nextY = this.document.y + this.document.currentLineHeight(true);
  64362. if (this.document.y > this.maxY || nextY > this.maxY) {
  64363. this.nextSection();
  64364. }
  64365. buffer = '';
  64366. textWidth = 0;
  64367. wc = 0;
  64368. lc = 0;
  64369. y = this.document.y;
  64370. emitLine = (function(_this) {
  64371. return function() {
  64372. options.textWidth = textWidth + _this.wordSpacing * (wc - 1);
  64373. options.wordCount = wc;
  64374. options.lineWidth = _this.lineWidth;
  64375. y = _this.document.y;
  64376. _this.emit('line', buffer, options, _this);
  64377. return lc++;
  64378. };
  64379. })(this);
  64380. this.emit('sectionStart', options, this);
  64381. this.eachWord(text, (function(_this) {
  64382. return function(word, w, bk, last) {
  64383. var lh, shouldContinue;
  64384. if ((last == null) || last.required) {
  64385. _this.emit('firstLine', options, _this);
  64386. _this.spaceLeft = _this.lineWidth;
  64387. }
  64388. if (w <= _this.spaceLeft) {
  64389. buffer += word;
  64390. textWidth += w;
  64391. wc++;
  64392. }
  64393. if (bk.required || w > _this.spaceLeft) {
  64394. if (bk.required) {
  64395. _this.emit('lastLine', options, _this);
  64396. }
  64397. lh = _this.document.currentLineHeight(true);
  64398. if ((_this.height != null) && _this.ellipsis && _this.document.y + lh * 2 > _this.maxY && _this.column >= _this.columns) {
  64399. if (_this.ellipsis === true) {
  64400. _this.ellipsis = '…';
  64401. }
  64402. buffer = buffer.replace(/\s+$/, '');
  64403. textWidth = _this.wordWidth(buffer + _this.ellipsis);
  64404. while (textWidth > _this.lineWidth) {
  64405. buffer = buffer.slice(0, -1).replace(/\s+$/, '');
  64406. textWidth = _this.wordWidth(buffer + _this.ellipsis);
  64407. }
  64408. buffer = buffer + _this.ellipsis;
  64409. }
  64410. if (bk.required && w > _this.spaceLeft) {
  64411. buffer = word;
  64412. textWidth = w;
  64413. wc = 1;
  64414. }
  64415. emitLine();
  64416. if (_this.document.y + lh > _this.maxY) {
  64417. shouldContinue = _this.nextSection();
  64418. if (!shouldContinue) {
  64419. wc = 0;
  64420. buffer = '';
  64421. return false;
  64422. }
  64423. }
  64424. if (bk.required) {
  64425. _this.spaceLeft = _this.lineWidth;
  64426. buffer = '';
  64427. textWidth = 0;
  64428. return wc = 0;
  64429. } else {
  64430. _this.spaceLeft = _this.lineWidth - w;
  64431. buffer = word;
  64432. textWidth = w;
  64433. return wc = 1;
  64434. }
  64435. } else {
  64436. return _this.spaceLeft -= w;
  64437. }
  64438. };
  64439. })(this));
  64440. if (wc > 0) {
  64441. this.emit('lastLine', options, this);
  64442. emitLine();
  64443. }
  64444. this.emit('sectionEnd', options, this);
  64445. if (options.continued === true) {
  64446. if (lc > 1) {
  64447. this.continuedX = 0;
  64448. }
  64449. this.continuedX += options.textWidth;
  64450. return this.document.y = y;
  64451. } else {
  64452. return this.document.x = this.startX;
  64453. }
  64454. };
  64455. LineWrapper.prototype.nextSection = function(options) {
  64456. var ref;
  64457. this.emit('sectionEnd', options, this);
  64458. if (++this.column > this.columns) {
  64459. if (this.height != null) {
  64460. return false;
  64461. }
  64462. this.document.addPage();
  64463. this.column = 1;
  64464. this.startY = this.document.page.margins.top;
  64465. this.maxY = this.document.page.maxY();
  64466. this.document.x = this.startX;
  64467. if (this.document._fillColor) {
  64468. (ref = this.document).fillColor.apply(ref, this.document._fillColor);
  64469. }
  64470. this.emit('pageBreak', options, this);
  64471. } else {
  64472. this.document.x += this.lineWidth + this.columnGap;
  64473. this.document.y = this.startY;
  64474. this.emit('columnBreak', options, this);
  64475. }
  64476. this.emit('sectionStart', options, this);
  64477. return true;
  64478. };
  64479. return LineWrapper;
  64480. })(EventEmitter);
  64481. module.exports = LineWrapper;
  64482. }).call(this);
  64483. /***/ }),
  64484. /* 290 */
  64485. /***/ (function(module, exports, __webpack_require__) {
  64486. // Generated by CoffeeScript 1.12.6
  64487. (function() {
  64488. var PDFImage;
  64489. PDFImage = __webpack_require__(291);
  64490. module.exports = {
  64491. initImages: function() {
  64492. this._imageRegistry = {};
  64493. return this._imageCount = 0;
  64494. },
  64495. image: function(src, x, y, options) {
  64496. var base, bh, bp, bw, h, hp, image, ip, name, ref, ref1, ref2, ref3, w, wp;
  64497. if (options == null) {
  64498. options = {};
  64499. }
  64500. if (typeof x === 'object') {
  64501. options = x;
  64502. x = null;
  64503. }
  64504. x = (ref = x != null ? x : options.x) != null ? ref : this.x;
  64505. y = (ref1 = y != null ? y : options.y) != null ? ref1 : this.y;
  64506. if (typeof src === 'string') {
  64507. image = this._imageRegistry[src];
  64508. }
  64509. if (!image) {
  64510. if (src.width && src.height) {
  64511. image = src;
  64512. } else {
  64513. image = this.openImage(src);
  64514. }
  64515. }
  64516. if (!image.obj) {
  64517. image.embed(this);
  64518. }
  64519. if ((base = this.page.xobjects)[name = image.label] == null) {
  64520. base[name] = image.obj;
  64521. }
  64522. w = options.width || image.width;
  64523. h = options.height || image.height;
  64524. if (options.width && !options.height) {
  64525. wp = w / image.width;
  64526. w = image.width * wp;
  64527. h = image.height * wp;
  64528. } else if (options.height && !options.width) {
  64529. hp = h / image.height;
  64530. w = image.width * hp;
  64531. h = image.height * hp;
  64532. } else if (options.scale) {
  64533. w = image.width * options.scale;
  64534. h = image.height * options.scale;
  64535. } else if (options.fit) {
  64536. ref2 = options.fit, bw = ref2[0], bh = ref2[1];
  64537. bp = bw / bh;
  64538. ip = image.width / image.height;
  64539. if (ip > bp) {
  64540. w = bw;
  64541. h = bw / ip;
  64542. } else {
  64543. h = bh;
  64544. w = bh * ip;
  64545. }
  64546. } else if (options.cover) {
  64547. ref3 = options.cover, bw = ref3[0], bh = ref3[1];
  64548. bp = bw / bh;
  64549. ip = image.width / image.height;
  64550. if (ip > bp) {
  64551. h = bh;
  64552. w = bh * ip;
  64553. } else {
  64554. w = bw;
  64555. h = bw / ip;
  64556. }
  64557. }
  64558. if (options.fit || options.cover) {
  64559. if (options.align === 'center') {
  64560. x = x + bw / 2 - w / 2;
  64561. } else if (options.align === 'right') {
  64562. x = x + bw - w;
  64563. }
  64564. if (options.valign === 'center') {
  64565. y = y + bh / 2 - h / 2;
  64566. } else if (options.valign === 'bottom') {
  64567. y = y + bh - h;
  64568. }
  64569. }
  64570. if (this.y === y) {
  64571. this.y += h;
  64572. }
  64573. this.save();
  64574. this.transform(w, 0, 0, -h, x, y + h);
  64575. this.addContent("/" + image.label + " Do");
  64576. this.restore();
  64577. return this;
  64578. },
  64579. openImage: function(src) {
  64580. var image;
  64581. if (typeof src === 'string') {
  64582. image = this._imageRegistry[src];
  64583. }
  64584. if (!image) {
  64585. image = PDFImage.open(src, 'I' + (++this._imageCount));
  64586. if (typeof src === 'string') {
  64587. this._imageRegistry[src] = image;
  64588. }
  64589. }
  64590. return image;
  64591. }
  64592. };
  64593. }).call(this);
  64594. /***/ }),
  64595. /* 291 */
  64596. /***/ (function(module, exports, __webpack_require__) {
  64597. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  64598. /*
  64599. PDFImage - embeds images in PDF documents
  64600. By Devon Govett
  64601. */
  64602. (function() {
  64603. var Data, JPEG, PDFImage, PNG, fs;
  64604. fs = __webpack_require__(56);
  64605. Data = __webpack_require__(292);
  64606. JPEG = __webpack_require__(293);
  64607. PNG = __webpack_require__(294);
  64608. PDFImage = (function() {
  64609. function PDFImage() {}
  64610. PDFImage.open = function(src, label) {
  64611. var data, match;
  64612. if (Buffer.isBuffer(src)) {
  64613. data = src;
  64614. } else if (src instanceof ArrayBuffer) {
  64615. data = new Buffer(new Uint8Array(src));
  64616. } else {
  64617. if (match = /^data:.+;base64,(.*)$/.exec(src)) {
  64618. data = new Buffer(match[1], 'base64');
  64619. } else {
  64620. data = fs.readFileSync(src);
  64621. if (!data) {
  64622. return;
  64623. }
  64624. }
  64625. }
  64626. if (data[0] === 0xff && data[1] === 0xd8) {
  64627. return new JPEG(data, label);
  64628. } else if (data[0] === 0x89 && data.toString('ascii', 1, 4) === 'PNG') {
  64629. return new PNG(data, label);
  64630. } else {
  64631. throw new Error('Unknown image format.');
  64632. }
  64633. };
  64634. return PDFImage;
  64635. })();
  64636. module.exports = PDFImage;
  64637. }).call(this);
  64638. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  64639. /***/ }),
  64640. /* 292 */
  64641. /***/ (function(module, exports) {
  64642. // Generated by CoffeeScript 1.12.6
  64643. (function() {
  64644. var Data;
  64645. Data = (function() {
  64646. function Data(data) {
  64647. this.data = data != null ? data : [];
  64648. this.pos = 0;
  64649. this.length = this.data.length;
  64650. }
  64651. Data.prototype.readByte = function() {
  64652. return this.data[this.pos++];
  64653. };
  64654. Data.prototype.writeByte = function(byte) {
  64655. return this.data[this.pos++] = byte;
  64656. };
  64657. Data.prototype.byteAt = function(index) {
  64658. return this.data[index];
  64659. };
  64660. Data.prototype.readBool = function() {
  64661. return !!this.readByte();
  64662. };
  64663. Data.prototype.writeBool = function(val) {
  64664. return this.writeByte(val ? 1 : 0);
  64665. };
  64666. Data.prototype.readUInt32 = function() {
  64667. var b1, b2, b3, b4;
  64668. b1 = this.readByte() * 0x1000000;
  64669. b2 = this.readByte() << 16;
  64670. b3 = this.readByte() << 8;
  64671. b4 = this.readByte();
  64672. return b1 + b2 + b3 + b4;
  64673. };
  64674. Data.prototype.writeUInt32 = function(val) {
  64675. this.writeByte((val >>> 24) & 0xff);
  64676. this.writeByte((val >> 16) & 0xff);
  64677. this.writeByte((val >> 8) & 0xff);
  64678. return this.writeByte(val & 0xff);
  64679. };
  64680. Data.prototype.readInt32 = function() {
  64681. var int;
  64682. int = this.readUInt32();
  64683. if (int >= 0x80000000) {
  64684. return int - 0x100000000;
  64685. } else {
  64686. return int;
  64687. }
  64688. };
  64689. Data.prototype.writeInt32 = function(val) {
  64690. if (val < 0) {
  64691. val += 0x100000000;
  64692. }
  64693. return this.writeUInt32(val);
  64694. };
  64695. Data.prototype.readUInt16 = function() {
  64696. var b1, b2;
  64697. b1 = this.readByte() << 8;
  64698. b2 = this.readByte();
  64699. return b1 | b2;
  64700. };
  64701. Data.prototype.writeUInt16 = function(val) {
  64702. this.writeByte((val >> 8) & 0xff);
  64703. return this.writeByte(val & 0xff);
  64704. };
  64705. Data.prototype.readInt16 = function() {
  64706. var int;
  64707. int = this.readUInt16();
  64708. if (int >= 0x8000) {
  64709. return int - 0x10000;
  64710. } else {
  64711. return int;
  64712. }
  64713. };
  64714. Data.prototype.writeInt16 = function(val) {
  64715. if (val < 0) {
  64716. val += 0x10000;
  64717. }
  64718. return this.writeUInt16(val);
  64719. };
  64720. Data.prototype.readString = function(length) {
  64721. var i, j, ref, ret;
  64722. ret = [];
  64723. for (i = j = 0, ref = length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  64724. ret[i] = String.fromCharCode(this.readByte());
  64725. }
  64726. return ret.join('');
  64727. };
  64728. Data.prototype.writeString = function(val) {
  64729. var i, j, ref, results;
  64730. results = [];
  64731. for (i = j = 0, ref = val.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  64732. results.push(this.writeByte(val.charCodeAt(i)));
  64733. }
  64734. return results;
  64735. };
  64736. Data.prototype.stringAt = function(pos, length) {
  64737. this.pos = pos;
  64738. return this.readString(length);
  64739. };
  64740. Data.prototype.readShort = function() {
  64741. return this.readInt16();
  64742. };
  64743. Data.prototype.writeShort = function(val) {
  64744. return this.writeInt16(val);
  64745. };
  64746. Data.prototype.readLongLong = function() {
  64747. var b1, b2, b3, b4, b5, b6, b7, b8;
  64748. b1 = this.readByte();
  64749. b2 = this.readByte();
  64750. b3 = this.readByte();
  64751. b4 = this.readByte();
  64752. b5 = this.readByte();
  64753. b6 = this.readByte();
  64754. b7 = this.readByte();
  64755. b8 = this.readByte();
  64756. if (b1 & 0x80) {
  64757. return ((b1 ^ 0xff) * 0x100000000000000 + (b2 ^ 0xff) * 0x1000000000000 + (b3 ^ 0xff) * 0x10000000000 + (b4 ^ 0xff) * 0x100000000 + (b5 ^ 0xff) * 0x1000000 + (b6 ^ 0xff) * 0x10000 + (b7 ^ 0xff) * 0x100 + (b8 ^ 0xff) + 1) * -1;
  64758. }
  64759. return b1 * 0x100000000000000 + b2 * 0x1000000000000 + b3 * 0x10000000000 + b4 * 0x100000000 + b5 * 0x1000000 + b6 * 0x10000 + b7 * 0x100 + b8;
  64760. };
  64761. Data.prototype.writeLongLong = function(val) {
  64762. var high, low;
  64763. high = Math.floor(val / 0x100000000);
  64764. low = val & 0xffffffff;
  64765. this.writeByte((high >> 24) & 0xff);
  64766. this.writeByte((high >> 16) & 0xff);
  64767. this.writeByte((high >> 8) & 0xff);
  64768. this.writeByte(high & 0xff);
  64769. this.writeByte((low >> 24) & 0xff);
  64770. this.writeByte((low >> 16) & 0xff);
  64771. this.writeByte((low >> 8) & 0xff);
  64772. return this.writeByte(low & 0xff);
  64773. };
  64774. Data.prototype.readInt = function() {
  64775. return this.readInt32();
  64776. };
  64777. Data.prototype.writeInt = function(val) {
  64778. return this.writeInt32(val);
  64779. };
  64780. Data.prototype.slice = function(start, end) {
  64781. return this.data.slice(start, end);
  64782. };
  64783. Data.prototype.read = function(bytes) {
  64784. var buf, i, j, ref;
  64785. buf = [];
  64786. for (i = j = 0, ref = bytes; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {
  64787. buf.push(this.readByte());
  64788. }
  64789. return buf;
  64790. };
  64791. Data.prototype.write = function(bytes) {
  64792. var byte, j, len, results;
  64793. results = [];
  64794. for (j = 0, len = bytes.length; j < len; j++) {
  64795. byte = bytes[j];
  64796. results.push(this.writeByte(byte));
  64797. }
  64798. return results;
  64799. };
  64800. return Data;
  64801. })();
  64802. module.exports = Data;
  64803. }).call(this);
  64804. /***/ }),
  64805. /* 293 */
  64806. /***/ (function(module, exports, __webpack_require__) {
  64807. // Generated by CoffeeScript 1.12.6
  64808. (function() {
  64809. var JPEG, fs,
  64810. indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
  64811. fs = __webpack_require__(56);
  64812. JPEG = (function() {
  64813. var MARKERS;
  64814. MARKERS = [0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC5, 0xFFC6, 0xFFC7, 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF];
  64815. function JPEG(data, label) {
  64816. var channels, marker, pos;
  64817. this.data = data;
  64818. this.label = label;
  64819. if (this.data.readUInt16BE(0) !== 0xFFD8) {
  64820. throw "SOI not found in JPEG";
  64821. }
  64822. pos = 2;
  64823. while (pos < this.data.length) {
  64824. marker = this.data.readUInt16BE(pos);
  64825. pos += 2;
  64826. if (indexOf.call(MARKERS, marker) >= 0) {
  64827. break;
  64828. }
  64829. pos += this.data.readUInt16BE(pos);
  64830. }
  64831. if (indexOf.call(MARKERS, marker) < 0) {
  64832. throw "Invalid JPEG.";
  64833. }
  64834. pos += 2;
  64835. this.bits = this.data[pos++];
  64836. this.height = this.data.readUInt16BE(pos);
  64837. pos += 2;
  64838. this.width = this.data.readUInt16BE(pos);
  64839. pos += 2;
  64840. channels = this.data[pos++];
  64841. this.colorSpace = (function() {
  64842. switch (channels) {
  64843. case 1:
  64844. return 'DeviceGray';
  64845. case 3:
  64846. return 'DeviceRGB';
  64847. case 4:
  64848. return 'DeviceCMYK';
  64849. }
  64850. })();
  64851. this.obj = null;
  64852. }
  64853. JPEG.prototype.embed = function(document) {
  64854. if (this.obj) {
  64855. return;
  64856. }
  64857. this.obj = document.ref({
  64858. Type: 'XObject',
  64859. Subtype: 'Image',
  64860. BitsPerComponent: this.bits,
  64861. Width: this.width,
  64862. Height: this.height,
  64863. ColorSpace: this.colorSpace,
  64864. Filter: 'DCTDecode'
  64865. });
  64866. if (this.colorSpace === 'DeviceCMYK') {
  64867. this.obj.data['Decode'] = [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0];
  64868. }
  64869. this.obj.end(this.data);
  64870. return this.data = null;
  64871. };
  64872. return JPEG;
  64873. })();
  64874. module.exports = JPEG;
  64875. }).call(this);
  64876. /***/ }),
  64877. /* 294 */
  64878. /***/ (function(module, exports, __webpack_require__) {
  64879. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.12.6
  64880. (function() {
  64881. var PNG, PNGImage, zlib;
  64882. zlib = __webpack_require__(59);
  64883. PNG = __webpack_require__(295);
  64884. PNGImage = (function() {
  64885. function PNGImage(data, label) {
  64886. this.label = label;
  64887. this.image = new PNG(data);
  64888. this.width = this.image.width;
  64889. this.height = this.image.height;
  64890. this.imgData = this.image.imgData;
  64891. this.obj = null;
  64892. }
  64893. PNGImage.prototype.embed = function(document) {
  64894. var k, len1, mask, palette, params, rgb, val, x;
  64895. this.document = document;
  64896. if (this.obj) {
  64897. return;
  64898. }
  64899. this.obj = this.document.ref({
  64900. Type: 'XObject',
  64901. Subtype: 'Image',
  64902. BitsPerComponent: this.image.bits,
  64903. Width: this.width,
  64904. Height: this.height,
  64905. Filter: 'FlateDecode'
  64906. });
  64907. if (!this.image.hasAlphaChannel) {
  64908. params = this.document.ref({
  64909. Predictor: 15,
  64910. Colors: this.image.colors,
  64911. BitsPerComponent: this.image.bits,
  64912. Columns: this.width
  64913. });
  64914. this.obj.data['DecodeParms'] = params;
  64915. params.end();
  64916. }
  64917. if (this.image.palette.length === 0) {
  64918. this.obj.data['ColorSpace'] = this.image.colorSpace;
  64919. } else {
  64920. palette = this.document.ref();
  64921. palette.end(new Buffer(this.image.palette));
  64922. this.obj.data['ColorSpace'] = ['Indexed', 'DeviceRGB', (this.image.palette.length / 3) - 1, palette];
  64923. }
  64924. if (this.image.transparency.grayscale) {
  64925. val = this.image.transparency.greyscale;
  64926. return this.obj.data['Mask'] = [val, val];
  64927. } else if (this.image.transparency.rgb) {
  64928. rgb = this.image.transparency.rgb;
  64929. mask = [];
  64930. for (k = 0, len1 = rgb.length; k < len1; k++) {
  64931. x = rgb[k];
  64932. mask.push(x, x);
  64933. }
  64934. return this.obj.data['Mask'] = mask;
  64935. } else if (this.image.transparency.indexed) {
  64936. return this.loadIndexedAlphaChannel();
  64937. } else if (this.image.hasAlphaChannel) {
  64938. return this.splitAlphaChannel();
  64939. } else {
  64940. return this.finalize();
  64941. }
  64942. };
  64943. PNGImage.prototype.finalize = function() {
  64944. var sMask;
  64945. if (this.alphaChannel) {
  64946. sMask = this.document.ref({
  64947. Type: 'XObject',
  64948. Subtype: 'Image',
  64949. Height: this.height,
  64950. Width: this.width,
  64951. BitsPerComponent: 8,
  64952. Filter: 'FlateDecode',
  64953. ColorSpace: 'DeviceGray',
  64954. Decode: [0, 1]
  64955. });
  64956. sMask.end(this.alphaChannel);
  64957. this.obj.data['SMask'] = sMask;
  64958. }
  64959. this.obj.end(this.imgData);
  64960. this.image = null;
  64961. return this.imgData = null;
  64962. };
  64963. PNGImage.prototype.splitAlphaChannel = function() {
  64964. return this.image.decodePixels((function(_this) {
  64965. return function(pixels) {
  64966. var a, alphaChannel, colorByteSize, done, i, imgData, len, p, pixelCount;
  64967. colorByteSize = _this.image.colors * _this.image.bits / 8;
  64968. pixelCount = _this.width * _this.height;
  64969. imgData = new Buffer(pixelCount * colorByteSize);
  64970. alphaChannel = new Buffer(pixelCount);
  64971. i = p = a = 0;
  64972. len = pixels.length;
  64973. while (i < len) {
  64974. imgData[p++] = pixels[i++];
  64975. imgData[p++] = pixels[i++];
  64976. imgData[p++] = pixels[i++];
  64977. alphaChannel[a++] = pixels[i++];
  64978. }
  64979. done = 0;
  64980. zlib.deflate(imgData, function(err, imgData1) {
  64981. _this.imgData = imgData1;
  64982. if (err) {
  64983. throw err;
  64984. }
  64985. if (++done === 2) {
  64986. return _this.finalize();
  64987. }
  64988. });
  64989. return zlib.deflate(alphaChannel, function(err, alphaChannel1) {
  64990. _this.alphaChannel = alphaChannel1;
  64991. if (err) {
  64992. throw err;
  64993. }
  64994. if (++done === 2) {
  64995. return _this.finalize();
  64996. }
  64997. });
  64998. };
  64999. })(this));
  65000. };
  65001. PNGImage.prototype.loadIndexedAlphaChannel = function(fn) {
  65002. var transparency;
  65003. transparency = this.image.transparency.indexed;
  65004. return this.image.decodePixels((function(_this) {
  65005. return function(pixels) {
  65006. var alphaChannel, i, j, k, ref;
  65007. alphaChannel = new Buffer(_this.width * _this.height);
  65008. i = 0;
  65009. for (j = k = 0, ref = pixels.length; k < ref; j = k += 1) {
  65010. alphaChannel[i++] = transparency[pixels[j]];
  65011. }
  65012. return zlib.deflate(alphaChannel, function(err, alphaChannel1) {
  65013. _this.alphaChannel = alphaChannel1;
  65014. if (err) {
  65015. throw err;
  65016. }
  65017. return _this.finalize();
  65018. });
  65019. };
  65020. })(this));
  65021. };
  65022. return PNGImage;
  65023. })();
  65024. module.exports = PNGImage;
  65025. }).call(this);
  65026. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  65027. /***/ }),
  65028. /* 295 */
  65029. /***/ (function(module, exports, __webpack_require__) {
  65030. /* WEBPACK VAR INJECTION */(function(Buffer) {// Generated by CoffeeScript 1.4.0
  65031. /*
  65032. # MIT LICENSE
  65033. # Copyright (c) 2011 Devon Govett
  65034. #
  65035. # Permission is hereby granted, free of charge, to any person obtaining a copy of this
  65036. # software and associated documentation files (the "Software"), to deal in the Software
  65037. # without restriction, including without limitation the rights to use, copy, modify, merge,
  65038. # publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  65039. # to whom the Software is furnished to do so, subject to the following conditions:
  65040. #
  65041. # The above copyright notice and this permission notice shall be included in all copies or
  65042. # substantial portions of the Software.
  65043. #
  65044. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
  65045. # BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  65046. # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  65047. # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  65048. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  65049. */
  65050. (function() {
  65051. var PNG, fs, zlib;
  65052. fs = __webpack_require__(56);
  65053. zlib = __webpack_require__(59);
  65054. module.exports = PNG = (function() {
  65055. PNG.decode = function(path, fn) {
  65056. return fs.readFile(path, function(err, file) {
  65057. var png;
  65058. png = new PNG(file);
  65059. return png.decode(function(pixels) {
  65060. return fn(pixels);
  65061. });
  65062. });
  65063. };
  65064. PNG.load = function(path) {
  65065. var file;
  65066. file = fs.readFileSync(path);
  65067. return new PNG(file);
  65068. };
  65069. function PNG(data) {
  65070. var chunkSize, colors, i, index, key, section, short, text, _i, _j, _ref;
  65071. this.data = data;
  65072. this.pos = 8;
  65073. this.palette = [];
  65074. this.imgData = [];
  65075. this.transparency = {};
  65076. this.text = {};
  65077. while (true) {
  65078. chunkSize = this.readUInt32();
  65079. section = ((function() {
  65080. var _i, _results;
  65081. _results = [];
  65082. for (i = _i = 0; _i < 4; i = ++_i) {
  65083. _results.push(String.fromCharCode(this.data[this.pos++]));
  65084. }
  65085. return _results;
  65086. }).call(this)).join('');
  65087. switch (section) {
  65088. case 'IHDR':
  65089. this.width = this.readUInt32();
  65090. this.height = this.readUInt32();
  65091. this.bits = this.data[this.pos++];
  65092. this.colorType = this.data[this.pos++];
  65093. this.compressionMethod = this.data[this.pos++];
  65094. this.filterMethod = this.data[this.pos++];
  65095. this.interlaceMethod = this.data[this.pos++];
  65096. break;
  65097. case 'PLTE':
  65098. this.palette = this.read(chunkSize);
  65099. break;
  65100. case 'IDAT':
  65101. for (i = _i = 0; _i < chunkSize; i = _i += 1) {
  65102. this.imgData.push(this.data[this.pos++]);
  65103. }
  65104. break;
  65105. case 'tRNS':
  65106. this.transparency = {};
  65107. switch (this.colorType) {
  65108. case 3:
  65109. this.transparency.indexed = this.read(chunkSize);
  65110. short = 255 - this.transparency.indexed.length;
  65111. if (short > 0) {
  65112. for (i = _j = 0; 0 <= short ? _j < short : _j > short; i = 0 <= short ? ++_j : --_j) {
  65113. this.transparency.indexed.push(255);
  65114. }
  65115. }
  65116. break;
  65117. case 0:
  65118. this.transparency.grayscale = this.read(chunkSize)[0];
  65119. break;
  65120. case 2:
  65121. this.transparency.rgb = this.read(chunkSize);
  65122. }
  65123. break;
  65124. case 'tEXt':
  65125. text = this.read(chunkSize);
  65126. index = text.indexOf(0);
  65127. key = String.fromCharCode.apply(String, text.slice(0, index));
  65128. this.text[key] = String.fromCharCode.apply(String, text.slice(index + 1));
  65129. break;
  65130. case 'IEND':
  65131. this.colors = (function() {
  65132. switch (this.colorType) {
  65133. case 0:
  65134. case 3:
  65135. case 4:
  65136. return 1;
  65137. case 2:
  65138. case 6:
  65139. return 3;
  65140. }
  65141. }).call(this);
  65142. this.hasAlphaChannel = (_ref = this.colorType) === 4 || _ref === 6;
  65143. colors = this.colors + (this.hasAlphaChannel ? 1 : 0);
  65144. this.pixelBitlength = this.bits * colors;
  65145. this.colorSpace = (function() {
  65146. switch (this.colors) {
  65147. case 1:
  65148. return 'DeviceGray';
  65149. case 3:
  65150. return 'DeviceRGB';
  65151. }
  65152. }).call(this);
  65153. this.imgData = new Buffer(this.imgData);
  65154. return;
  65155. default:
  65156. this.pos += chunkSize;
  65157. }
  65158. this.pos += 4;
  65159. if (this.pos > this.data.length) {
  65160. throw new Error("Incomplete or corrupt PNG file");
  65161. }
  65162. }
  65163. return;
  65164. }
  65165. PNG.prototype.read = function(bytes) {
  65166. var i, _i, _results;
  65167. _results = [];
  65168. for (i = _i = 0; 0 <= bytes ? _i < bytes : _i > bytes; i = 0 <= bytes ? ++_i : --_i) {
  65169. _results.push(this.data[this.pos++]);
  65170. }
  65171. return _results;
  65172. };
  65173. PNG.prototype.readUInt32 = function() {
  65174. var b1, b2, b3, b4;
  65175. b1 = this.data[this.pos++] << 24;
  65176. b2 = this.data[this.pos++] << 16;
  65177. b3 = this.data[this.pos++] << 8;
  65178. b4 = this.data[this.pos++];
  65179. return b1 | b2 | b3 | b4;
  65180. };
  65181. PNG.prototype.readUInt16 = function() {
  65182. var b1, b2;
  65183. b1 = this.data[this.pos++] << 8;
  65184. b2 = this.data[this.pos++];
  65185. return b1 | b2;
  65186. };
  65187. PNG.prototype.decodePixels = function(fn) {
  65188. var _this = this;
  65189. return zlib.inflate(this.imgData, function(err, data) {
  65190. var byte, c, col, i, left, length, p, pa, paeth, pb, pc, pixelBytes, pixels, pos, row, scanlineLength, upper, upperLeft, _i, _j, _k, _l, _m;
  65191. if (err) {
  65192. throw err;
  65193. }
  65194. pixelBytes = _this.pixelBitlength / 8;
  65195. scanlineLength = pixelBytes * _this.width;
  65196. pixels = new Buffer(scanlineLength * _this.height);
  65197. length = data.length;
  65198. row = 0;
  65199. pos = 0;
  65200. c = 0;
  65201. while (pos < length) {
  65202. switch (data[pos++]) {
  65203. case 0:
  65204. for (i = _i = 0; _i < scanlineLength; i = _i += 1) {
  65205. pixels[c++] = data[pos++];
  65206. }
  65207. break;
  65208. case 1:
  65209. for (i = _j = 0; _j < scanlineLength; i = _j += 1) {
  65210. byte = data[pos++];
  65211. left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
  65212. pixels[c++] = (byte + left) % 256;
  65213. }
  65214. break;
  65215. case 2:
  65216. for (i = _k = 0; _k < scanlineLength; i = _k += 1) {
  65217. byte = data[pos++];
  65218. col = (i - (i % pixelBytes)) / pixelBytes;
  65219. upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
  65220. pixels[c++] = (upper + byte) % 256;
  65221. }
  65222. break;
  65223. case 3:
  65224. for (i = _l = 0; _l < scanlineLength; i = _l += 1) {
  65225. byte = data[pos++];
  65226. col = (i - (i % pixelBytes)) / pixelBytes;
  65227. left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
  65228. upper = row && pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
  65229. pixels[c++] = (byte + Math.floor((left + upper) / 2)) % 256;
  65230. }
  65231. break;
  65232. case 4:
  65233. for (i = _m = 0; _m < scanlineLength; i = _m += 1) {
  65234. byte = data[pos++];
  65235. col = (i - (i % pixelBytes)) / pixelBytes;
  65236. left = i < pixelBytes ? 0 : pixels[c - pixelBytes];
  65237. if (row === 0) {
  65238. upper = upperLeft = 0;
  65239. } else {
  65240. upper = pixels[(row - 1) * scanlineLength + col * pixelBytes + (i % pixelBytes)];
  65241. upperLeft = col && pixels[(row - 1) * scanlineLength + (col - 1) * pixelBytes + (i % pixelBytes)];
  65242. }
  65243. p = left + upper - upperLeft;
  65244. pa = Math.abs(p - left);
  65245. pb = Math.abs(p - upper);
  65246. pc = Math.abs(p - upperLeft);
  65247. if (pa <= pb && pa <= pc) {
  65248. paeth = left;
  65249. } else if (pb <= pc) {
  65250. paeth = upper;
  65251. } else {
  65252. paeth = upperLeft;
  65253. }
  65254. pixels[c++] = (byte + paeth) % 256;
  65255. }
  65256. break;
  65257. default:
  65258. throw new Error("Invalid filter algorithm: " + data[pos - 1]);
  65259. }
  65260. row++;
  65261. }
  65262. return fn(pixels);
  65263. });
  65264. };
  65265. PNG.prototype.decodePalette = function() {
  65266. var c, i, length, palette, pos, ret, transparency, _i, _ref, _ref1;
  65267. palette = this.palette;
  65268. transparency = this.transparency.indexed || [];
  65269. ret = new Buffer(transparency.length + palette.length);
  65270. pos = 0;
  65271. length = palette.length;
  65272. c = 0;
  65273. for (i = _i = 0, _ref = palette.length; _i < _ref; i = _i += 3) {
  65274. ret[pos++] = palette[i];
  65275. ret[pos++] = palette[i + 1];
  65276. ret[pos++] = palette[i + 2];
  65277. ret[pos++] = (_ref1 = transparency[c++]) != null ? _ref1 : 255;
  65278. }
  65279. return ret;
  65280. };
  65281. PNG.prototype.copyToImageData = function(imageData, pixels) {
  65282. var alpha, colors, data, i, input, j, k, length, palette, v, _ref;
  65283. colors = this.colors;
  65284. palette = null;
  65285. alpha = this.hasAlphaChannel;
  65286. if (this.palette.length) {
  65287. palette = (_ref = this._decodedPalette) != null ? _ref : this._decodedPalette = this.decodePalette();
  65288. colors = 4;
  65289. alpha = true;
  65290. }
  65291. data = (imageData != null ? imageData.data : void 0) || imageData;
  65292. length = data.length;
  65293. input = palette || pixels;
  65294. i = j = 0;
  65295. if (colors === 1) {
  65296. while (i < length) {
  65297. k = palette ? pixels[i / 4] * 4 : j;
  65298. v = input[k++];
  65299. data[i++] = v;
  65300. data[i++] = v;
  65301. data[i++] = v;
  65302. data[i++] = alpha ? input[k++] : 255;
  65303. j = k;
  65304. }
  65305. } else {
  65306. while (i < length) {
  65307. k = palette ? pixels[i / 4] * 4 : j;
  65308. data[i++] = input[k++];
  65309. data[i++] = input[k++];
  65310. data[i++] = input[k++];
  65311. data[i++] = alpha ? input[k++] : 255;
  65312. j = k;
  65313. }
  65314. }
  65315. };
  65316. PNG.prototype.decode = function(fn) {
  65317. var ret,
  65318. _this = this;
  65319. ret = new Buffer(this.width * this.height * 4);
  65320. return this.decodePixels(function(pixels) {
  65321. _this.copyToImageData(ret, pixels);
  65322. return fn(ret);
  65323. });
  65324. };
  65325. return PNG;
  65326. })();
  65327. }).call(this);
  65328. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  65329. /***/ }),
  65330. /* 296 */
  65331. /***/ (function(module, exports) {
  65332. // Generated by CoffeeScript 1.12.6
  65333. (function() {
  65334. module.exports = {
  65335. annotate: function(x, y, w, h, options) {
  65336. var key, ref, val;
  65337. options.Type = 'Annot';
  65338. options.Rect = this._convertRect(x, y, w, h);
  65339. options.Border = [0, 0, 0];
  65340. if (options.Subtype !== 'Link') {
  65341. if (options.C == null) {
  65342. options.C = this._normalizeColor(options.color || [0, 0, 0]);
  65343. }
  65344. }
  65345. delete options.color;
  65346. if (typeof options.Dest === 'string') {
  65347. options.Dest = new String(options.Dest);
  65348. }
  65349. for (key in options) {
  65350. val = options[key];
  65351. options[key[0].toUpperCase() + key.slice(1)] = val;
  65352. }
  65353. ref = this.ref(options);
  65354. this.page.annotations.push(ref);
  65355. ref.end();
  65356. return this;
  65357. },
  65358. note: function(x, y, w, h, contents, options) {
  65359. if (options == null) {
  65360. options = {};
  65361. }
  65362. options.Subtype = 'Text';
  65363. options.Contents = new String(contents);
  65364. options.Name = 'Comment';
  65365. if (options.color == null) {
  65366. options.color = [243, 223, 92];
  65367. }
  65368. return this.annotate(x, y, w, h, options);
  65369. },
  65370. link: function(x, y, w, h, url, options) {
  65371. if (options == null) {
  65372. options = {};
  65373. }
  65374. options.Subtype = 'Link';
  65375. options.A = this.ref({
  65376. S: 'URI',
  65377. URI: new String(url)
  65378. });
  65379. options.A.end();
  65380. return this.annotate(x, y, w, h, options);
  65381. },
  65382. _markup: function(x, y, w, h, options) {
  65383. var ref1, x1, x2, y1, y2;
  65384. if (options == null) {
  65385. options = {};
  65386. }
  65387. ref1 = this._convertRect(x, y, w, h), x1 = ref1[0], y1 = ref1[1], x2 = ref1[2], y2 = ref1[3];
  65388. options.QuadPoints = [x1, y2, x2, y2, x1, y1, x2, y1];
  65389. options.Contents = new String;
  65390. return this.annotate(x, y, w, h, options);
  65391. },
  65392. highlight: function(x, y, w, h, options) {
  65393. if (options == null) {
  65394. options = {};
  65395. }
  65396. options.Subtype = 'Highlight';
  65397. if (options.color == null) {
  65398. options.color = [241, 238, 148];
  65399. }
  65400. return this._markup(x, y, w, h, options);
  65401. },
  65402. underline: function(x, y, w, h, options) {
  65403. if (options == null) {
  65404. options = {};
  65405. }
  65406. options.Subtype = 'Underline';
  65407. return this._markup(x, y, w, h, options);
  65408. },
  65409. strike: function(x, y, w, h, options) {
  65410. if (options == null) {
  65411. options = {};
  65412. }
  65413. options.Subtype = 'StrikeOut';
  65414. return this._markup(x, y, w, h, options);
  65415. },
  65416. lineAnnotation: function(x1, y1, x2, y2, options) {
  65417. if (options == null) {
  65418. options = {};
  65419. }
  65420. options.Subtype = 'Line';
  65421. options.Contents = new String;
  65422. options.L = [x1, this.page.height - y1, x2, this.page.height - y2];
  65423. return this.annotate(x1, y1, x2, y2, options);
  65424. },
  65425. rectAnnotation: function(x, y, w, h, options) {
  65426. if (options == null) {
  65427. options = {};
  65428. }
  65429. options.Subtype = 'Square';
  65430. options.Contents = new String;
  65431. return this.annotate(x, y, w, h, options);
  65432. },
  65433. ellipseAnnotation: function(x, y, w, h, options) {
  65434. if (options == null) {
  65435. options = {};
  65436. }
  65437. options.Subtype = 'Circle';
  65438. options.Contents = new String;
  65439. return this.annotate(x, y, w, h, options);
  65440. },
  65441. textAnnotation: function(x, y, w, h, text, options) {
  65442. if (options == null) {
  65443. options = {};
  65444. }
  65445. options.Subtype = 'FreeText';
  65446. options.Contents = new String(text);
  65447. options.DA = new String;
  65448. return this.annotate(x, y, w, h, options);
  65449. },
  65450. _convertRect: function(x1, y1, w, h) {
  65451. var m0, m1, m2, m3, m4, m5, ref1, x2, y2;
  65452. y2 = y1;
  65453. y1 += h;
  65454. x2 = x1 + w;
  65455. ref1 = this._ctm, m0 = ref1[0], m1 = ref1[1], m2 = ref1[2], m3 = ref1[3], m4 = ref1[4], m5 = ref1[5];
  65456. x1 = m0 * x1 + m2 * y1 + m4;
  65457. y1 = m1 * x1 + m3 * y1 + m5;
  65458. x2 = m0 * x2 + m2 * y2 + m4;
  65459. y2 = m1 * x2 + m3 * y2 + m5;
  65460. return [x1, y1, x2, y2];
  65461. }
  65462. };
  65463. }).call(this);
  65464. /***/ }),
  65465. /* 297 */
  65466. /***/ (function(module, exports) {
  65467. /* jslint node: true */
  65468. 'use strict';
  65469. module.exports = {
  65470. '4A0': [4767.87, 6740.79],
  65471. '2A0': [3370.39, 4767.87],
  65472. A0: [2383.94, 3370.39],
  65473. A1: [1683.78, 2383.94],
  65474. A2: [1190.55, 1683.78],
  65475. A3: [841.89, 1190.55],
  65476. A4: [595.28, 841.89],
  65477. A5: [419.53, 595.28],
  65478. A6: [297.64, 419.53],
  65479. A7: [209.76, 297.64],
  65480. A8: [147.40, 209.76],
  65481. A9: [104.88, 147.40],
  65482. A10: [73.70, 104.88],
  65483. B0: [2834.65, 4008.19],
  65484. B1: [2004.09, 2834.65],
  65485. B2: [1417.32, 2004.09],
  65486. B3: [1000.63, 1417.32],
  65487. B4: [708.66, 1000.63],
  65488. B5: [498.90, 708.66],
  65489. B6: [354.33, 498.90],
  65490. B7: [249.45, 354.33],
  65491. B8: [175.75, 249.45],
  65492. B9: [124.72, 175.75],
  65493. B10: [87.87, 124.72],
  65494. C0: [2599.37, 3676.54],
  65495. C1: [1836.85, 2599.37],
  65496. C2: [1298.27, 1836.85],
  65497. C3: [918.43, 1298.27],
  65498. C4: [649.13, 918.43],
  65499. C5: [459.21, 649.13],
  65500. C6: [323.15, 459.21],
  65501. C7: [229.61, 323.15],
  65502. C8: [161.57, 229.61],
  65503. C9: [113.39, 161.57],
  65504. C10: [79.37, 113.39],
  65505. RA0: [2437.80, 3458.27],
  65506. RA1: [1729.13, 2437.80],
  65507. RA2: [1218.90, 1729.13],
  65508. RA3: [864.57, 1218.90],
  65509. RA4: [609.45, 864.57],
  65510. SRA0: [2551.18, 3628.35],
  65511. SRA1: [1814.17, 2551.18],
  65512. SRA2: [1275.59, 1814.17],
  65513. SRA3: [907.09, 1275.59],
  65514. SRA4: [637.80, 907.09],
  65515. EXECUTIVE: [521.86, 756.00],
  65516. FOLIO: [612.00, 936.00],
  65517. LEGAL: [612.00, 1008.00],
  65518. LETTER: [612.00, 792.00],
  65519. TABLOID: [792.00, 1224.00]
  65520. };
  65521. /***/ }),
  65522. /* 298 */
  65523. /***/ (function(module, exports, __webpack_require__) {
  65524. /* WEBPACK VAR INJECTION */(function(Buffer) {/* jslint node: true */
  65525. 'use strict';
  65526. var PDFImage = __webpack_require__(291);
  65527. function ImageMeasure(pdfKitDoc, imageDictionary) {
  65528. this.pdfKitDoc = pdfKitDoc;
  65529. this.imageDictionary = imageDictionary || {};
  65530. }
  65531. ImageMeasure.prototype.measureImage = function (src) {
  65532. var image, label;
  65533. var that = this;
  65534. if (!this.pdfKitDoc._imageRegistry[src]) {
  65535. label = 'I' + (++this.pdfKitDoc._imageCount);
  65536. try {
  65537. image = PDFImage.open(realImageSrc(src), label);
  65538. } catch (error) {
  65539. image = null;
  65540. }
  65541. if (image === null || image === undefined) {
  65542. throw 'invalid image, images dictionary should contain dataURL entries (or local file paths in node.js)';
  65543. }
  65544. image.embed(this.pdfKitDoc);
  65545. this.pdfKitDoc._imageRegistry[src] = image;
  65546. } else {
  65547. image = this.pdfKitDoc._imageRegistry[src];
  65548. }
  65549. return {width: image.width, height: image.height};
  65550. function realImageSrc(src) {
  65551. var img = that.imageDictionary[src];
  65552. if (!img) {
  65553. return src;
  65554. }
  65555. var index = img.indexOf('base64,');
  65556. if (index < 0) {
  65557. return that.imageDictionary[src];
  65558. }
  65559. return new Buffer(img.substring(index + 7), 'base64');
  65560. }
  65561. };
  65562. module.exports = ImageMeasure;
  65563. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2).Buffer))
  65564. /***/ }),
  65565. /* 299 */
  65566. /***/ (function(module, exports) {
  65567. /* jslint node: true */
  65568. 'use strict';
  65569. function groupDecorations(line) {
  65570. var groups = [], curGroup = null;
  65571. for (var i = 0, l = line.inlines.length; i < l; i++) {
  65572. var inline = line.inlines[i];
  65573. var decoration = inline.decoration;
  65574. if (!decoration) {
  65575. curGroup = null;
  65576. continue;
  65577. }
  65578. var color = inline.decorationColor || inline.color || 'black';
  65579. var style = inline.decorationStyle || 'solid';
  65580. decoration = Array.isArray(decoration) ? decoration : [decoration];
  65581. for (var ii = 0, ll = decoration.length; ii < ll; ii++) {
  65582. var deco = decoration[ii];
  65583. if (!curGroup || deco !== curGroup.decoration ||
  65584. style !== curGroup.decorationStyle || color !== curGroup.decorationColor ||
  65585. deco === 'lineThrough') {
  65586. curGroup = {
  65587. line: line,
  65588. decoration: deco,
  65589. decorationColor: color,
  65590. decorationStyle: style,
  65591. inlines: [inline]
  65592. };
  65593. groups.push(curGroup);
  65594. } else {
  65595. curGroup.inlines.push(inline);
  65596. }
  65597. }
  65598. }
  65599. return groups;
  65600. }
  65601. function drawDecoration(group, x, y, pdfKitDoc) {
  65602. function maxInline() {
  65603. var max = 0;
  65604. for (var i = 0, l = group.inlines.length; i < l; i++) {
  65605. var inl = group.inlines[i];
  65606. max = inl.fontSize > max ? i : max;
  65607. }
  65608. return group.inlines[max];
  65609. }
  65610. function width() {
  65611. var sum = 0;
  65612. for (var i = 0, l = group.inlines.length; i < l; i++) {
  65613. sum += group.inlines[i].width;
  65614. }
  65615. return sum;
  65616. }
  65617. var firstInline = group.inlines[0],
  65618. biggerInline = maxInline(),
  65619. totalWidth = width(),
  65620. lineAscent = group.line.getAscenderHeight(),
  65621. ascent = biggerInline.font.ascender / 1000 * biggerInline.fontSize,
  65622. height = biggerInline.height,
  65623. descent = height - ascent;
  65624. var lw = 0.5 + Math.floor(Math.max(biggerInline.fontSize - 8, 0) / 2) * 0.12;
  65625. switch (group.decoration) {
  65626. case 'underline':
  65627. y += lineAscent + descent * 0.45;
  65628. break;
  65629. case 'overline':
  65630. y += lineAscent - (ascent * 0.85);
  65631. break;
  65632. case 'lineThrough':
  65633. y += lineAscent - (ascent * 0.25);
  65634. break;
  65635. default:
  65636. throw 'Unkown decoration : ' + group.decoration;
  65637. }
  65638. pdfKitDoc.save();
  65639. if (group.decorationStyle === 'double') {
  65640. var gap = Math.max(0.5, lw * 2);
  65641. pdfKitDoc.fillColor(group.decorationColor)
  65642. .rect(x + firstInline.x, y - lw / 2, totalWidth, lw / 2).fill()
  65643. .rect(x + firstInline.x, y + gap - lw / 2, totalWidth, lw / 2).fill();
  65644. } else if (group.decorationStyle === 'dashed') {
  65645. var nbDashes = Math.ceil(totalWidth / (3.96 + 2.84));
  65646. var rdx = x + firstInline.x;
  65647. pdfKitDoc.rect(rdx, y, totalWidth, lw).clip();
  65648. pdfKitDoc.fillColor(group.decorationColor);
  65649. for (var i = 0; i < nbDashes; i++) {
  65650. pdfKitDoc.rect(rdx, y - lw / 2, 3.96, lw).fill();
  65651. rdx += 3.96 + 2.84;
  65652. }
  65653. } else if (group.decorationStyle === 'dotted') {
  65654. var nbDots = Math.ceil(totalWidth / (lw * 3));
  65655. var rx = x + firstInline.x;
  65656. pdfKitDoc.rect(rx, y, totalWidth, lw).clip();
  65657. pdfKitDoc.fillColor(group.decorationColor);
  65658. for (var ii = 0; ii < nbDots; ii++) {
  65659. pdfKitDoc.rect(rx, y - lw / 2, lw, lw).fill();
  65660. rx += (lw * 3);
  65661. }
  65662. } else if (group.decorationStyle === 'wavy') {
  65663. var sh = 0.7, sv = 1;
  65664. var nbWaves = Math.ceil(totalWidth / (sh * 2)) + 1;
  65665. var rwx = x + firstInline.x - 1;
  65666. pdfKitDoc.rect(x + firstInline.x, y - sv, totalWidth, y + sv).clip();
  65667. pdfKitDoc.lineWidth(0.24);
  65668. pdfKitDoc.moveTo(rwx, y);
  65669. for (var iii = 0; iii < nbWaves; iii++) {
  65670. pdfKitDoc.bezierCurveTo(rwx + sh, y - sv, rwx + sh * 2, y - sv, rwx + sh * 3, y)
  65671. .bezierCurveTo(rwx + sh * 4, y + sv, rwx + sh * 5, y + sv, rwx + sh * 6, y);
  65672. rwx += sh * 6;
  65673. }
  65674. pdfKitDoc.stroke(group.decorationColor);
  65675. } else {
  65676. pdfKitDoc.fillColor(group.decorationColor)
  65677. .rect(x + firstInline.x, y - lw / 2, totalWidth, lw)
  65678. .fill();
  65679. }
  65680. pdfKitDoc.restore();
  65681. }
  65682. function drawDecorations(line, x, y, pdfKitDoc) {
  65683. var groups = groupDecorations(line);
  65684. for (var i = 0, l = groups.length; i < l; i++) {
  65685. drawDecoration(groups[i], x, y, pdfKitDoc);
  65686. }
  65687. }
  65688. function drawBackground(line, x, y, pdfKitDoc) {
  65689. var height = line.getHeight();
  65690. for (var i = 0, l = line.inlines.length; i < l; i++) {
  65691. var inline = line.inlines[i];
  65692. if (inline.background) {
  65693. var justifyShift = (inline.justifyShift || 0);
  65694. pdfKitDoc.fillColor(inline.background)
  65695. .rect(x + inline.x - justifyShift, y, inline.width + justifyShift, height)
  65696. .fill();
  65697. }
  65698. }
  65699. }
  65700. module.exports = {
  65701. drawBackground: drawBackground,
  65702. drawDecorations: drawDecorations
  65703. };
  65704. /***/ }),
  65705. /* 300 */
  65706. /***/ (function(module, exports, __webpack_require__) {
  65707. var __WEBPACK_AMD_DEFINE_RESULT__;/* FileSaver.js
  65708. * A saveAs() FileSaver implementation.
  65709. * 1.3.2
  65710. * 2016-06-16 18:25:19
  65711. *
  65712. * By Eli Grey, http://eligrey.com
  65713. * License: MIT
  65714. * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
  65715. */
  65716. /*global self */
  65717. /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
  65718. /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
  65719. var saveAs = saveAs || (function(view) {
  65720. "use strict";
  65721. // IE <10 is explicitly unsupported
  65722. if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
  65723. return;
  65724. }
  65725. var
  65726. doc = view.document
  65727. // only get URL when necessary in case Blob.js hasn't overridden it yet
  65728. , get_URL = function() {
  65729. return view.URL || view.webkitURL || view;
  65730. }
  65731. , save_link = doc ? doc.createElementNS("http://www.w3.org/1999/xhtml", "a") : []
  65732. , can_use_save_link = "download" in save_link
  65733. , click = function(node) {
  65734. var event = new MouseEvent("click");
  65735. node.dispatchEvent(event);
  65736. }
  65737. , is_safari = /constructor/i.test(view.HTMLElement) || view.safari
  65738. , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
  65739. , throw_outside = function(ex) {
  65740. (view.setImmediate || view.setTimeout)(function() {
  65741. throw ex;
  65742. }, 0);
  65743. }
  65744. , force_saveable_type = "application/octet-stream"
  65745. // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
  65746. , arbitrary_revoke_timeout = 1000 * 40 // in ms
  65747. , revoke = function(file) {
  65748. var revoker = function() {
  65749. if (typeof file === "string") { // file is an object URL
  65750. get_URL().revokeObjectURL(file);
  65751. } else { // file is a File
  65752. file.remove();
  65753. }
  65754. };
  65755. setTimeout(revoker, arbitrary_revoke_timeout);
  65756. }
  65757. , dispatch = function(filesaver, event_types, event) {
  65758. event_types = [].concat(event_types);
  65759. var i = event_types.length;
  65760. while (i--) {
  65761. var listener = filesaver["on" + event_types[i]];
  65762. if (typeof listener === "function") {
  65763. try {
  65764. listener.call(filesaver, event || filesaver);
  65765. } catch (ex) {
  65766. throw_outside(ex);
  65767. }
  65768. }
  65769. }
  65770. }
  65771. , auto_bom = function(blob) {
  65772. // prepend BOM for UTF-8 XML and text/* types (including HTML)
  65773. // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
  65774. if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
  65775. return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
  65776. }
  65777. return blob;
  65778. }
  65779. , FileSaver = function(blob, name, no_auto_bom) {
  65780. if (!no_auto_bom) {
  65781. blob = auto_bom(blob);
  65782. }
  65783. // First try a.download, then web filesystem, then object URLs
  65784. var
  65785. filesaver = this
  65786. , type = blob.type
  65787. , force = type === force_saveable_type
  65788. , object_url
  65789. , dispatch_all = function() {
  65790. dispatch(filesaver, "writestart progress write writeend".split(" "));
  65791. }
  65792. // on any filesys errors revert to saving with object URLs
  65793. , fs_error = function() {
  65794. if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
  65795. // Safari doesn't allow downloading of blob urls
  65796. var reader = new FileReader();
  65797. reader.onloadend = function() {
  65798. var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
  65799. var popup = view.open(url, '_blank');
  65800. if(!popup) view.location.href = url;
  65801. url=undefined; // release reference before dispatching
  65802. filesaver.readyState = filesaver.DONE;
  65803. dispatch_all();
  65804. };
  65805. reader.readAsDataURL(blob);
  65806. filesaver.readyState = filesaver.INIT;
  65807. return;
  65808. }
  65809. // don't create more object URLs than needed
  65810. if (!object_url) {
  65811. object_url = get_URL().createObjectURL(blob);
  65812. }
  65813. if (force) {
  65814. view.location.href = object_url;
  65815. } else {
  65816. var opened = view.open(object_url, "_blank");
  65817. if (!opened) {
  65818. // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
  65819. view.location.href = object_url;
  65820. }
  65821. }
  65822. filesaver.readyState = filesaver.DONE;
  65823. dispatch_all();
  65824. revoke(object_url);
  65825. }
  65826. ;
  65827. filesaver.readyState = filesaver.INIT;
  65828. if (can_use_save_link) {
  65829. object_url = get_URL().createObjectURL(blob);
  65830. setTimeout(function() {
  65831. save_link.href = object_url;
  65832. save_link.download = name;
  65833. click(save_link);
  65834. dispatch_all();
  65835. revoke(object_url);
  65836. filesaver.readyState = filesaver.DONE;
  65837. });
  65838. return;
  65839. }
  65840. fs_error();
  65841. }
  65842. , FS_proto = FileSaver.prototype
  65843. , saveAs = function(blob, name, no_auto_bom) {
  65844. return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
  65845. }
  65846. ;
  65847. // IE 10+ (native saveAs)
  65848. if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
  65849. return function(blob, name, no_auto_bom) {
  65850. name = name || blob.name || "download";
  65851. if (!no_auto_bom) {
  65852. blob = auto_bom(blob);
  65853. }
  65854. return navigator.msSaveOrOpenBlob(blob, name);
  65855. };
  65856. }
  65857. FS_proto.abort = function(){};
  65858. FS_proto.readyState = FS_proto.INIT = 0;
  65859. FS_proto.WRITING = 1;
  65860. FS_proto.DONE = 2;
  65861. FS_proto.error =
  65862. FS_proto.onwritestart =
  65863. FS_proto.onprogress =
  65864. FS_proto.onwrite =
  65865. FS_proto.onabort =
  65866. FS_proto.onerror =
  65867. FS_proto.onwriteend =
  65868. null;
  65869. return saveAs;
  65870. }(
  65871. typeof self !== "undefined" && self
  65872. || typeof window !== "undefined" && window
  65873. || this.content
  65874. ));
  65875. // `self` is undefined in Firefox for Android content script context
  65876. // while `this` is nsIContentFrameMessageManager
  65877. // with an attribute `content` that corresponds to the window
  65878. if (typeof module !== "undefined" && module.exports) {
  65879. module.exports.saveAs = saveAs;
  65880. } else if (("function" !== "undefined" && __webpack_require__(301) !== null) && (__webpack_require__(302) !== null)) {
  65881. !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {
  65882. return saveAs;
  65883. }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  65884. }
  65885. /***/ }),
  65886. /* 301 */
  65887. /***/ (function(module, exports) {
  65888. module.exports = function() { throw new Error("define cannot be used indirect"); };
  65889. /***/ }),
  65890. /* 302 */
  65891. /***/ (function(module, exports) {
  65892. /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {module.exports = __webpack_amd_options__;
  65893. /* WEBPACK VAR INJECTION */}.call(exports, {}))
  65894. /***/ })
  65895. /******/ ])
  65896. });
  65897. ;
  65898. this.pdfMake = this.pdfMake || {}; this.pdfMake.vfs = {
  65899. "Roboto-Italic.ttf": "AAEAAAASAQAABAAgR0RFRtRX1FkAAgp8AAACREdQT1NKcuCzAAIMwAAAUiRHU1VCw4aZEQACXuQAABfoT1MvMqCnsO0AAAGoAAAAYGNtYXBAbb9DAAAafAAABoBjdnQgJEEG5QAAI5QAAABMZnBnbWf0XKsAACD8AAABvGdhc3AACAATAAIKcAAAAAxnbHlmoLsktAAALagAAdn2aGRteCEe/AUAABWQAAAE7GhlYWT4gasAAAABLAAAADZoaGVhDKYSegAAAWQAAAAkaG10eHJO1ygAAAIIAAATiGxvY2EXM5zBAAAj4AAACcZtYXhwBxICWwAAAYgAAAAgbmFtZTlLZFAAAgegAAACrnBvc3T/YQBkAAIKUAAAACBwcmVwdKCP7AAAIrgAAADbAAEAAAACAAAcadIiXw889QAbCAAAAAAAxPARLgAAAADQ206M+jj91QlMCHMAAgAJAAIAAAAAAAAAAQAAB2z+DAAACRb6OP52CUwIAAGzAAAAAAAAAAAAAAAABOIAAQAABOIAkAAWAFYABQABAAAAAAAOAAACAAFzAAYAAQADBAsBkAAFAAAFmgUzAAABHwWaBTMAAAPRAGYCAAAAAgAAAAAAAAAAAOAACv9QACF/AAAAIQAAAABHT09HAAEAAP/9BgD+AABmB5oCACAAAZ8AAAAABDoFsAAgACAAAgOWAGQACgAAAAoAAAH2AAAB9gAAAgkAQwKFAMgE0QBSBGYASgW5ALsE3QA6AWQAqgKxAG0Cvf+PA2IAawRwAEwBkP+PAi4AGQIVADUDPf+PBGYAaARmAPkEZgAXBGYANARmAAUEZgByBGYAcARmAJ0EZgBBBGYAlAHrACsBrv+bA/wAQQRMAHAEGAA6A7QApQcCAEQFGv+vBN8AOwUXAHQFIQA7BHMAOwRUADsFUwB5BZIAOwImAEkEUgAKBOcAOwQ3ADsG0AA7BZIAOwVgAHcE7wA7BWAAbwTRADoEpQAnBKsAqAUSAGcE+gCkBuwAwwTn/9QEswCoBK//6wIZ//8DOQC/Ahn/egNIAE8Div+BAnAAzwRDADMEZQAfBBoARgRqAEsEJgBFArwAdARlAAQEUAAfAewALwHk/xQD+QAgAewALwbXAB4EUgAfBHcARQRl/9cEcwBJAqoAHwQKAC4CkwBDBFEAWwPMAG4F3wCAA+P/xAO2/6UD4//tAqoAOAHuACECqv+MBVEAaQHu//EESABSBIz/8wWSABIEvQBTAeb/9wTM/90DSADbBiMAYgOCAMMDrgBZBFYAgQYkAGEDmADjAvAA6AQvACUC4gBcAuIAbgJ5ANUEb//lA9UAewIQAKUB9v/IAuIA3wORAMADrQAPBbkAuQYPALQGEwCeA7b/0wdL/4QELQAoBWAAIASgADgEpwAeBpcAEwSWAFwEeABEBG8AOQSD/+AFeQA1AfUALgRbAC0EOAAiAiIAIwVqADUEbwAkB3AAVAcWAEcB9wAzBWcAUQKu/0kFXgBnBHkAQgVvAGcE1wBaAf7/CQQhAD4DsQEXA3wBJgOZAOMDWgEHAewBDgKiAQECI/+vA7MA3QLvAMICUv/pAAr9agAK/esACv0LAAr99QAK/NsB6vy7AgcBIQP2APMCEQClBFsAQwWD/7EFUQBpBSD/xAR4AAwFkwBEBHj/2gWZAFQFaACGBTMACgRsAEgEo//wA+0AhARvAEMEOQApBA8AggRvACQEdQBzAo0AhQRW/7cD2AA/BKkAYARv/9wENgBOBG8ASgQWAIcERQBnBYIAQQV5AE8GbgBmBIcAUQQrAGcGIgBmBdsAoQVFAHgIWf/MCGwAQwZaALQFkgBCBO4ANAXg/4sHFf+sBKUAJQWSAEMFiP/KBOoAkwYHAFsFtgBBBVoAzgdXAEIHjgBCBe0AiQbAAEUE6AA2BUUAdAb6AEkE+//oBFQARgR5ADADSwAtBLn/jQX7/6UD+wAhBIUALwQ7AC8Ehv/IBcsAMASEAC8EhQAvA8QAYAWqAEwEowAvBEIAewZQAC8GdQAkBNsAVgYQADAEQQAwBDYANAZfADAETP+/BFAAHwQ2AE4Gn//DBrkALwRwAB8EhQAvBtwAbwYGAE8EPwAuBv4ASQXUACwEt/+6BC//ogbfAFoF5wBOBqcAJgW+ACkIyQBIB58ALgQN/84Dx//KBVEAaQRyAEIE7QCtA+4AhAVRAGoEbwBEBtUAdAX/AFIG3ABvBgYATwUUAGYEMABNBOEAQAAK/OgACv0LAAr+FwAK/jsACvo4AAr6TwQ/AC4E/gA6BHD/1wRLADUDfwAkBMAAQwPwACQE7AA2BGYALQZkALsFYwB0B50AOgWSACQH/ABCBskAJAXKAHEEuABfBv8ArAU9AFcFTwDEBFIAmAVQAOwGCgCKBKMABwTsADUEQwAtBZAAQwRvACQFZwBRBI4APASO//wEnf/4Azr/6QTaADEGawAyBrkATAYvAK0FDQBoBDIArwPyAKAHj//fBk3/2gfIADsGeAAjBNoAagQHAEwFiwCaBQMAfQVFAGoDEgDyA/8AAAf0AAAD/wAAB/QAAAKuAAACBAAAAVwAAARmAAACKQAAAZ8AAADVAAAACgAAAi0AGQItABkFIgCnBhkAmQOU/18BlwCuAZcAiQGV/5gBlwDUAsgAtgLPAJUCtv+UBFEAdwR2//YCpwCgA7EAOQU7ADkA+QAaB3kAlwJeAF8CXgACA5H/7wLiAGEDUAB+BIz/8wYuAAoGaAA5CD8AOgc0ACIGBgAfBGYAUQW3AEMEDABJBFwACgUp//IFMP/lBcQAzAO7AEsIBQA1BOUA6gT6AIIGAQC1BqwAkgalAI8GQwC+BHYATQVtACQElf+sBHkAqwSqAEEIBQBNAgb/GgRpADEETABwA/z/1AQZABkD8wBBAkQAeAKFAHAB/v/jBNcAdARWAFgEcgB0BqoAdAaqAHQE0gB0BnIAKQAKAAAH/v+rCDUAXAQKAGIEhQBBAff/DwGP/70DkgETA4wBEgONARED4ADNA/kAzgPfACID2wDSA5IBEQH4APwEbP+lBDkAHQRkAEcEZwAdA9IAHQO4AB0EkgBMBMcAHQHjACoDvP/2BD0AHQOiAB0F3gAdBMcAHQShAEoERQAdBKEARQQzAB0ECgARBBAAbQRkAEUETwB6BfAAlQQ9/7YEFQB0BA3/3ALiAB0C4gBrAuL/6QLi//sC4v/wAuIAFgLiAB4C4gAvAuIACwLiADYDhACTAqoBCwQk/5oEqABLBS0AQwUHAEQD/gAlBR8ARAP6ACUECgASBB0ABgQlADQDnQAdBE//sAShAEoET/+wA3j/0wSzAB0D2//VBUgAUQT6AH4E1gAMBVIAbARkAEcHE//EByEAHQVUAG0EsgAdBEIAHwUH/4kF5/+vBCgAEQTQAB8ENwAeBKb/xAQJAFgFCgAdBFIAWgYqAB0GgwAdBQAAUAXNAB8ENwAfBGMAIAZOAB0Ebv/fA/z/+gYh/68EYQAeBOwAHgUZAGkFoABQBEcAdASO/7YGOgBsBFIAWgRSAB0FoQAvBK8AQQQoABEEoQBKBB3//wPPAB4H7gAdBJH/3QRlAB8EHABDBHoARwRzACQDaACpBHT/1wSDAEYEJgBFBGUANQVhAIEFjACEBXIARAW9AIUFwACFA8IAuwRpADkDnQAdBEH/gQS0/9MC4gCQAuIAYQLiAIkC4gCRAuIAogLiAH4C4gCpBFP/1QQYACsGewBJBJ8APwTkAGQCAP8JAf//CQH2AC4B9v96AfYALgH2//EEOQAdAfYAAAIuABkFPwAvBT8ALwRuAD0EqwCoApP/9AUa/68FGv+vBRr/rwUa/68FGv+vBRr/rwUa/68FFwB0BHMAOwRzADsEcwA7BHMAOwImAEkCJgBJAiYASQImAEkFkgA7BWAAdwVgAHcFYAB3BWAAdwVgAHcFEgBnBRIAZwUSAGcFEgBnBLMAqARDADMEQwAzBEMAMwRDADMEQwAzBEMAMwRDADMEGgBGBCYARQQmAEUEJgBFBCYARQH1AC4B9QAuAfUALgH1AC4EUgAfBHcARQR3AEUEdwBFBHcARQR3AEUEUQBbBFEAWwRRAFsEUQBbA7b/pQO2/6UFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFFwB0BBoARgUXAHQEGgBGBRcAdAQaAEYFFwB0BBoARgUhADsFAABLBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQVTAHkEZQAEBVMAeQRlAAQFUwB5BGUABAVTAHkEZQAEBZIAOwRQAB8CJgBJAfUAEQImAEkB9QAaAiYASQH1AC4CJv+OAez/cAImAEkGeABJA9AALwRSAAoB/v8JBOcAOwP5ACAENwA7AewALwQ3ADsB7P+jBDcAOwKCAC8ENwA7AsgALwWSADsEUgAfBZIAOwRSAB8FkgA7BFIAHwRSAB8FYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUE0QA6AqoAHwTRADoCqv+fBNEAOgKqAB8EpQAnBAoALgSlACcECgAuBKUAJwQKAC4EpQAnBAoALgSlACcECgAuBKsAqAKTAEMEqwCoApMAQwSrAKgCuwBDBRIAZwRRAFsFEgBnBFEAWwUSAGcEUQBbBRIAZwRRAFsFEgBnBFEAWwUSAGcEUQBbBuwAwwXfAIAEswCoA7b/pQSzAKgEr//rA+P/7QSv/+sD4//tBK//6wPj/+0HS/+EBpcAEwVgACAEbwA5BGf/sARn/7AEEABtBGz/pQRs/6UEbP+lBGz/pQRs/6UEbP+lBGz/pQRkAEcD0gAdA9IAHQPSAB0D0gAdAeMAKgHjACoB4wAqAeMAKgTHAB0EoQBKBKEASgShAEoEoQBKBKEASgRkAEUEZABFBGQARQRkAEUEFQB0BGz/pQRs/6UEbP+lBGQARwRkAEcEZABHBGQARwRnAB0D0gAdA9IAHQPSAB0D0gAdA9IAHQSSAEwEkgBMBJIATASSAEwExwAdAeMADwHjABgB4wAqAeP/egHjACoDvP/2BD0AHQOiAB0DogAdA6IAHQOiAB0ExwAdBMcAHQTHAB0EoQBKBKEASgShAEoEMwAdBDMAHQQzAB0ECgARBAoAEQQKABEECgARBBAAbQQQAG0EEABtBGQARQRkAEUEZABFBGQARQRkAEUEZABFBfAAlQQVAHQEFQB0BA3/3AQN/9wEDf/cBRr/rwTXAGMF9gBxAooAdwV0AGoFF//uBUcAHgKNACAFGv+vBN8AOwRzADsEr//rBZIAOwImAEkE5wA7BtAAOwWSADsFYAB3BO8AOwSrAKgEswCoBOf/1AImAEkEswCoBGwASAQ5ACkEbwAkAo0AhQRFAGcEWwAtBHcARQRv/+UDzABuA+P/xAKNAGcERQBnBHcARQRFAGcGbgBmBHMAOwRbAEMEpQAnAiYASQImAEkEUgAKBQcARATnADsE6gCTBRr/rwTfADsEWwBDBHMAOwWSAEMG0AA7BZIAOwVgAHcFkwBEBO8AOwUXAHQEqwCoBOf/1ARDADMEJgBFBIUALwR3AEUEZf/XBBoARgO2/6UD4//EBCYARQNLAC0ECgAuAewALwH1AC4B5P8UBDsALwO2/6UG7ADDBd8AgAbsAMMF3wCABuwAwwXfAIAEswCoA7b/pQFkAKoChQDIBBIAQwH+/wkBlwCJBtAAOwbXAB4FGv+vBEMAMwRzADsFkgBDBCYARQSFAC8FaACGBXkATwTtAK0D7gCECC0ARQkWAHcEpQAlA/sAIQUXAHQEGgBGBLMAqAPtAIQCJgBJBxX/rAX7/6UCJgBJBRr/rwRDADMFGv+vBEMAMwdL/4QGlwATBHMAOwQmAEUFZwBRBCEAPgQhAD4HFf+sBfv/pQSlACUD+wAhBZIAQwSFAC8FkgBDBIUALwVgAHcEdwBFBVEAaQRyAEIFUQBpBHIAQgVFAHQENgA0BOoAkwO2/6UE6gCTA7b/pQTqAJMDtv+lBVoAzgRCAHsGwABFBhAAMATn/9QD4//EBGoASwWI/8oEhv/IBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBRr/rwRDADMFGv+vBEMAMwUa/68EQwAzBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQRzADsEJgBFBHMAOwQmAEUEcwA7BCYARQImAEkB9QAuAiYADgHs//EFYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUFYAB3BHcARQVgAHcEdwBFBWAAdwR3AEUFYAB3BHcARQVeAGcEeQBCBV4AZwR5AEIFXgBnBHkAQgVeAGcEeQBCBV4AZwR5AEIFEgBnBFEAWwUSAGcEUQBbBW8AZwTXAFoFbwBnBNcAWgVvAGcE1wBaBW8AZwTXAFoFbwBnBNcAWgSzAKgDtv+lBLMAqAO2/6UEswCoA7b/pQSIAEsEiAAABQcARAQ7AC8FkgA7BIQALwSrAKgDxABgBOf/1APj/8QFWgDOBEIAewVaAM4EQgB7BFsAQwNLAC0HFf+sBfv/pQYKAIoEowAHBFAAHwToACsE6AArBFsAEANL/+YFGwBYBBIAOQWSAEMEhQAvBZIAOwSEAC8G0AA7BcsAMAWI/8oEhv/IBLMAqAPtAF0E5//UA+P/xAQ5ACkEVP/XBhkAmQRmABcEZgA0BGYABQRmAHIEegCUBI4AfAVTAHkEZQAEBZIAOwRSAB8FGv+vBEMAMwRzADsEJgBFAib/3wH1/40FYAB3BHcARQTRADoCqgAfBRIAZwRRAFsEj/+yBN8AOwRlAB8FIQA7BGoASwUhADsEagBLBZIAOwRQAB8E5wA7A/kAIATnADsD+QAgBDcAOwHs//IG0AA7BtcAHgWSADsEUgAfBO8AOwRl/9cE0QA6Aqr/7gSlACcECgAuBKsAqAKTAEME+gCkA8wAbgT6AKQDzABuBuwAwwXfAIAEr//rA+P/7QWm/wwEbP+lBA7/4QUD//0CHwABBKsAHQRR/5sE4AAWBGz/pQQ5AB0D0gAdBA3/3ATHAB0B4wAqBD0AHQXeAB0EoQBKBEUAHQQQAG0EFQB0BD3/tgHjACoEFQB0A9IAHQOdAB0ECgARAeMAKgHjACoDvP/2BD0AHQQJAFgEbP+lBDkAHQOdAB0D0gAdBNAAHwXeAB0ExwAdBKEASgSzAB0ERQAdBGQARwQQAG0EPf+2BCgAEQTHAB0EZABIBBUAdAWhAC8E0AAfBAkAWAVIAFEFGv+vBEMAMwRzADsEJgBFAAAAAQAABOQJCgQAAAICAgMFBQYFAgMDBAUCAgIEBQUFBQUFBQUFBQICBAUFBAgGBQYGBQUGBgIFBgUIBgYGBgUFBQYGCAYFBQIEAgQEAwUFBQUFAwUFAgIEAggFBQUFAwUDBQQHBAQEAwIDBgIFBQYFAgUEBwQEBQcEAwUDAwMFBAICAwQEBgcHBAgFBgUFBwUFBQUGAgUFAgYFCAgCBgMGBQYFAgUEBAQEAgMCBAMDAAAAAAACAgQCBQYGBgUGBQYGBgUFBAUFBQUFAwUEBQUFBQUFBgYHBQUHBwYJCQcGBgcIBQYGBgcGBggJBwgGBggGBQUEBQcEBQUFBwUFBAYFBQcHBQcFBQcFBQUHCAUFCAcFCAcFBQgHBwYKCQUEBgUGBAYFCAcIBwYFBQAAAAAAAAUGBQUEBQQGBQcGCQYJCAcFCAYGBQYHBQYFBgUGBQUFBAUHCAcGBQQJBwkHBQUGBgYDBQkFCQMCAgUCAgEAAgIGBwQCAgICAwMDBQUDBAYBCAMDBAMEBQcHCQgHBQYFBQYGBgQJBgYHCAcHBQYFBQUJAgUFBAUEAwMCBQUFCAgFBwAJCQUFAgIEBAQEBAQEBAIFBQUFBAQFBQIEBQQHBQUFBQUFBQUFBwUFBQMDAwMDAwMDAwMEAwUFBgYEBgQFBQUEBQUFBAUEBgYFBgUICAYFBQYHBQUFBQUGBQcHBgcFBQcFBAcFBgYGBQUHBQUGBQUFBQQJBQUFBQUEBQUFBQYGBgYGBAUEBQUDAwMDAwMDBQUHBQYCAgICAgIFAgIGBgUFAwYGBgYGBgYGBQUFBQICAgIGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQICAgIFBQUFBQUFBQUFBAQGBQYFBgUGBQYFBgUGBQYGBQUFBQUFBQUFBQYFBgUGBQYFBgUCAgICAgICAgIHBAUCBgQFAgUCBQMFAwYFBgUGBQUGBQYFBgUFAwUDBQMFBQUFBQUFBQUFBQMFAwUDBgUGBQYFBgUGBQYFCAcFBAUFBAUEBQQIBwYFBQUFBQUF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c3dzd3N/c4dzkXObc7Jz0XPvdA50LnQ6dEZ0d3S4dR11QnVOdV51cnZGdmJ2f3aSdqZ273d6eBx4qXi1eXh503pZewR7ZnvpfEd8uH1dfcl+W368fyR/Pn9Yf3J/jH//gCeAYYB9gLKBO4GBgfiCOYJHglWCjoKbgsKC24Lng0qDo4Q3hMKFQ4YXhheHlIfxiCKIgIiviMWJKIl6ibqKLIqFisWLCItIi2KLqIwejHqMx40TjU+Nto4EjiKOWI6cjsSPFo9Uj7OQA5BhkLWRI5FPkYuRvpISkleSi5LIkxuTRpOVlAaUSJSolQiVNZW+liCWN5aBlz6XuZgtmHyYwpkEmUyZzJo4mq+a2psQm4ibuZwHnDqcepzunVCdu54enoyfA597n9KgDaBpoMGhN6G8ofqiS6KUotijE6Nbo5uj5aRApEyknaURpZyl+aZIptCnM6eYp/iooqiuqQGpTamiqeuqZarSqzerq6xHrM6tb63irk+uqK8Tr5yvpLAQsH6w6bFysdWyQLKSsvSzWrOFs9q0BLRdtKG0tbTJtNu077UBtRi1LLWOtba2RLa0tw23FbcdtyW3MLc4t0S3sLewt7i4KLiYuPq5QLmoub+51rntugS6HLovuju6R7peunC6h7qaurG6w7rauu27BLsbuy27RLtbu267hbuXu667wbvTu+q7/LwSvCO8NrxJvFW8Ybx4vIq8oLyzvMm82rzxvQm9Gr0xvUO9Wb1qvX29lL2mvby9z73hvfO+Cr4gvje+Sb62v2S/dr+Iv5q/q7+9v8+/4b/ywATAEMAiwDPARcBXwGnAe8DvwX3Bj8GgwbLBw8HVwefB+cILwhfCKcI7wk/CYcJzwoXCl8KpwrvCxsLRwuPC78L7ww3DH8MrwzfDScNbw2fDc8OIw5TDoMOsw77D0MPcw+jD+sQLxBfEKcQ6xEzEXsRxxITElsSoxLTEwMTSxOPE9cUHxRnFKsU2xULFTsVaxWzFfcWJxZXFocWtxb/Fy8Xdxe7GAMYRxiPGNcZIxlvGbsaBxuLHUcdjx3XHh8eYx6vHvcfPx+HH88gFyBbILchEyFvIcsiVyLjIyMjfyPHJB8kYySvJPslKyVbJbcl/yZDJosm4ycnJ28nuygDKF8opyjvKTcpgynfKicqayq3Kv8rQyuLLSctby2zLfsuQy6HLssvDy9XMT8xg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AdMAAAEHAKEBFwAeAAkAsAcvsBPcMDEA////3AAABA4GIAImAdMAAAEGAJ5VHwAJALAHL7AO3DAxAP///68AAASLBj8CJgAlAAAABgCtBAD//wBjAAAFFQY/ACYAKWQAAAcArf9CAAD//wBxAAAF2wZBACYALGQAAAcArf9QAAL//wB3AAACZQZAACYALWQAAAcArf9WAAH//wBq/+cFIQY/ACYAMxQAAAcArf9JAAD////uAAAFlgY/ACYAPWQAAAcArf7NAAD//wAeAAAE7gY/ACYAuRQAAAcArf9MAAD//wAg//QDGwZ0AiYAwgAAAQcArv8t/+wAHACwAEVYsA4vG7EOGD5ZsBvcsBHQsBsQsCTQMDH///+vAAAEiwWwAgYAJQAA//8AOwAABKAFsAIGACYAAP//ADsAAASxBbACBgApAAD////rAAAEzgWwAgYAPgAA//8AOwAABXcFsAIGACwAAP//AEkAAAIBBbACBgAtAAD//wA7AAAFUAWwAgYALwAA//8AOwAABrcFsAIGADEAAP//ADsAAAV3BbACBgAyAAD//wB3/+cFDQXIAgYAMwAA//8AOwAABPMFsAIGADQAAP//AKgAAAUJBbACBgA4AAD//wCoAAAFMgWwAgYAPQAA////1AAABSsFsAIGADwAAP//AEkAAAMKBwkCJgAtAAABBwBq/7gBQgAMALACL7AZ3LAE0DAx//8AqAAABTIG/QImAD0AAAEHAGoA/QE2AAwAsAEvsB7csAnQMDH//wBI/+cEMgY6AiYAugAAAQcArQFo//sACQCwFS+wKNwwMQD//wAp/+cD5QY5AiYAvgAAAQcArQEh//oACQCwGi+wK9wwMQD//wAk/mED8wY6AiYAwAAAAQcArQE7//sACQCwAy+wFdwwMQD//wCF//QCZQYlAiYAwgAAAQYArSTmAAkAsAAvsBHcMDEA//8AZ//lBAoGdAImAMoAAAEGAK4c7AASALALL7Ar3LAW0LArELAa0DAx//8ALQAABFcEOgIGAI0AAP//AEX/6AQfBFICBgBTAAD////l/mAEJQQ6AgYAdgAA//8AbgAAA+0EOgIGAFoAAP///8QAAAP0BDoCBgBcAAD//wBn//QC3gWzAiYAwgAAAQYAaozsAAwAsAAvsCTcsA/QMDH//wBn/+UD+gWzAiYAygAAAQYAanvs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3LAi0DAx//8Ak//mBUAG+gImAN0AAAEHAHAA7AFKAAkAsAEvsBHcMDEA////pf5FA+wFuAImAF0AAAEGAHAvCAAJALABL7AQ3DAxAP//AJP/5gVABwkCJgDdAAABBwBqARsBQgAMALABL7Am3LAR0DAx////pf5FA+wFxwImAF0AAAEGAGpeAAAMALABL7Al3LAQ0DAx//8Ak//mBUAHQQImAN0AAAEHAKUBXQFCABYAsABFWLABLxuxARw+WbAT3LAX0DAx////pf5FBF4F/wImAF0AAAEHAKUAoAAAABYAsABFWLABLxuxARg+WbAS3LAW0DAx//8AzgAABUQHCQImAOAAAAEHAGoBRAFCABYAsABFWLASLxuxEhw+WbAo3LAc0DAx//8AewAABAAFswImAPgAAAEGAGpp7AAMALAIL7Ao3LAT0DAx//8ARQAABpYHCQAmAOUPAAAnAC0ElQAAAQcAagIIAUIAFgCwAEVYsAovG7EKHD5ZsCHcsC3QMDH//wAwAAAFqQWzACYA/QAAACcAjAQKAAABBwBqAWr/7AAWALAARViwCi8bsQoYPlmwIdywLdAwMf///9T+RQUrBbACJgA8AAAABwGvA5UAAP///8T+RQP0BDoCJgBcAAAABwGvAqoAAP//AEv/6AR1BgACBgBIAAD////K/kUFZQWwAiYA3AAAAAcBrwQkAAD////I/kUESgQ6AiYA8QAAAAcBrwM7AAD///+v/p8EiwWwAiYAJQAAAAcArATcAAD//wAz/p8DzwRRAiYARQAAAAcArAQpAAD///+vAAAEiwe5AiYAJQAAAQcAqgUBAUYACQCwBC+wGNwwMQD//wAz/+gDzwaDAiYARQAAAQcAqgRzABAACQCwGC+wOdwwMQD///+vAAAF7QfDAiYAJQAAAQcBtwDyAS4AFgCwAEVYsAUvG7EFHD5ZsA7csBTQMDH//wAz/+gFXwaOAiYARQAAAQYBt2T5ABYAsABFWLAYLxuxGBg+WbAv3LA10DAx////rwAABIsHvwImACUAAAEHAbYA+AE9ABYAsABFWLAFLxuxBRw+WbAM3LAT0DAx//8AM//oA/0GiQImAEUAAAEGAbZqBwAWALAARViwGC8bsRgYPlmwL9ywNNAwMf///68AAAVsB+oCJgAlAAABBwG1APMBGwAWALAARViwBS8bsQUcPlmwDNywINAwMf//ADP/6ATeBrUCJgBFAAABBgG1ZeYAFgCwAEVYsBgvG7EYGD5ZsC/csDPQMDH///+vAAAEiwfZAiYAJQAAAQcBtADvAQYAFgCwAEVYsAQvG7EEHD5ZsA7csBXQMDH//wAz/+gD9wakAiYARQAAAQYBtGHRABYAsABFWLAYLxuxGBg+WbAt3LA20DAx////r/6fBIsHNgImACUAAAAnAJ0A+QE2AQcArATcAAAAEwCwAEVYsAQvG7EEHD5ZsBDcMDEA//8AM/6fA88GAAImAEUAAAAmAJ1rAAEHAKwEKQAAABMAsABFWLAYLxuxGBg+WbAx3DAxAP///68AAASLB7cCJgAlAAABBwGzARcBLQAMALAEL7AO3LAa0DAx//8AM//oA+UGggImAEUAAAEHAbMAif/4AAwAsBgvsC/csDvQMDH///+vAAAEiwe3AiYAJQAAAQcBuAEXAS0ADACwBC+wDtywGtAwMf//ADP/6APlBoICJgBFAAABBwG4AIn/+AAMALAYL7Av3LA70DAx////rwAABIsIQAImACUAAAEHAbIBHgE9AAwAsAQvsA7csBfQMDH//wAz/+gD1QcKAiYARQAAAQcBsgCQAAcADACwGC+wL9ywONAwMf///68AAASSCBQCJgAlAAABBwGxAR8BRQAMALAEL7AO3LAX0DAx//8AM//oBAQG3gImAEUAAAEHAbEAkQAPAAwAsBgvsC/csDjQMDH///+v/p8EiwcPAiYAJQAAACcAoAEuATcBBwCsBNwAAAATALAARViwBC8bsQQcPlmwDtwwMQD//wAz/p8D7AXZAiYARQAAACcAoACgAAEBBwCsBCkAAAATALAARViwGC8bsRgYPlmwL9wwMQD//wA7/qkEsQWwAiYAKQAAAAcArASdAAr//wBF/p8D4ARRAiYASQAAAAcArAR0AAD//wA7AAAEsQfFAiYAKQAAAQcAqgTPAVIACQCwBi+wGdwwMQD//wBF/+oD4AaDAiYASQAAAQcAqgRYABAACQCwCC+wLdwwMQD//wA7AAAEsQctAiYAKQAAAQcApADPAUYACQCwBi+wFtwwMQD//wBF/+oEBgXrAiYASQAAAQYApFgEAAkAsAgvsCrcMDEA//8AOwAABbsHzwImACkAAAEHAbcAwAE6ABYAsABFWLAGLxuxBhw+WbAR3LAV0DAx//8ARf/qBUQGjgImAEkAAAEGAbdJ+QAWALAARViwCC8bsQgYPlmwI9ywKdAwMf//ADsAAASxB8sCJgApAAABBwG2AMYBSQAWALAARViwBi8bsQYcPlmwD9ywFNAwMf//AEX/6gPiBokCJgBJAAABBgG2TwcAFgCwAEVYsAgvG7EIGD5ZsCPcsCjQMDH//wA7AAAFOgf2AiYAKQAAAQcBtQDBAScAFgCwAEVYsAYvG7EGHD5ZsA/csCHQMDH//wBF/+oEwwa1AiYASQAAAQYBtUrmABYAsABFWLAILxuxCBg+WbAh3LA10DAx//8AOwAABLEH5QImACkAAAEHAbQAvQESABYAsABFWLAGLxuxBhw+WbAP3LAW0DAx//8ARf/qA+AGpAImAEkAAAEGAbRG0QAWALAARViwCC8bsQgYPlmwI9ywKtAwMf//ADv+qQSxB0ICJgApAAAAJwCdAMcBQgEHAKwEnQAKABMAsABFWLAGLxuxBhw+WbAR3DAxAP//AEX+nwPgBgACJgBJAAAAJgCdUAABBwCsBHQAAAATALAARViwCC8bsQgYPlmwJdwwMQD//wBJAAACuwfFAiYALQAAAQcAqgOFAVIACQCwAi+wEdwwMQD//wAuAAACaQaBAiYAjAAAAQcAqgMzAA4ACQCwAi+wEdwwMQD//wAO/qgCAQWwAiYALQAAAAcArANTAAn////x/qkB4wXHAiYATQAAAAcArAM2AAr//wB3/p8FDQXIAiYAMwAAAAcArATxAAD//wBF/p8EHwRSAiYAUwAAAAcArASEAAD//wB3/+cFDQe7AiYAMwAAAQcAqgUiAUgACQCwCi+wMNwwMQD//wBF/+gEHwaDAiYAUwAAAQcAqgRhABAACQCwAC+wMNwwMQD//wB3/+cGDgfFAiYAMwAAAQcBtwETATAAFgCwAEVYsAovG7EKHD5ZsCbcsCzQMDH//wBF/+gFTQaOAiYAUwAAAQYBt1L5ABYAsABFWLAALxuxABg+WbAm3LAs0DAx//8Ad//nBQ0HwQImADMAAAEHAbYBGQE/ABYAsABFWLAKLxuxChw+WbAm3LAr0DAx//8ARf/oBB8GiQImAFMAAAEGAbZYBwAWALAARViwAC8bsQAYPlmwJtywK9AwMf//AHf/5wWNB+wCJgAzAAABBwG1ARQBHQAWALAARViwCi8bsQocPlmwJtywKtAwMf//AEX/6ATMBrUCJgBTAAABBgG1U+YAFgCwAEVYsAAvG7EAGD5ZsCTcsDjQMDH//wB3/+cFDQfbAiYAMwAAAQcBtAEQAQgAFgCwAEVYsAovG7EKHD5ZsCTcsC3QMDH//wBF/+gEHwakAiYAUwAAAQYBtE/RABYAsABFWLAALxuxABg+WbAk3LAt0DAx//8Ad/6fBQ0HOAImADMAAAAnAJ0BGgE4AQcArATxAAAAEwCwAEVYsAovG7EKHD5ZsCjcMDEA//8ARf6fBB8GAAImAFMAAAAmAJ1ZAAEHAKwEhAAAABMAsABFWLAALxuxABg+WbAo3DAxAP//AGf/6QYbBy8CJgCXAAABBwB1Ag8BMQATALAARViwCi8bsQocPlmwK9wwMQD//wBC/+cE/wX+AiYAmAAAAQcAdQFmAAAAEwCwAEVYsAAvG7EAGD5ZsCjcMDEA//8AZ//pBhsHLwImAJcAAAEHAEQBhQExABMAsABFWLAKLxuxChw+WbAq3DAxAP//AEL/5wT/Bf4CJgCYAAABBwBEANwAAAATALAARViwAC8bsQAYPlmwJ9wwMQD//wBn/+kGGwe0AiYAlwAAAQcAqgUdAUEAEwCwAEVYsAovG7EKHD5ZsCncMDEA//8AQv/nBP8GgwImAJgAAAEHAKoEdAAQABMAsABFWLAALxuxABg+WbAm3DAxAP//AGf/6QYbBxwCJgCXAAABBwCkAR0BNQATALAARViwCi8bsQocPlmwLNwwMQD//wBC/+cE/wXrAiYAmAAAAQYApHQEABMAsABFWLAALxuxABg+WbAp3DAxAP//AGf+nwYbBjcCJgCXAAAABwCsBOMAAP//AEL+lgT/BLACJgCYAAAABwCsBHb/9///AGf+nwUgBbACJgA5AAAABwCsBMgAAP//AFv+nwQeBDoCJgBZAAAABwCsBDAAAP//AGf/5wUgB7kCJgA5AAABBwCqBPwBRgAJALAAL7Ag3DAxAP//AFv/6AQeBoMCJgBZAAABBwCqBGUAEAAJALAGL7Ah3DAxAP//AGf/6AaaB0ACJgCZAAABBwB1AgkBQgATALAARViwGi8bsRocPlmwHdwwMQD//wBa/+gFTgXqAiYAmgAAAQcAdQFg/+wAEwCwAEVYsBYvG7EWGD5ZsB7cMDEA//8AZ//oBpoHQAImAJkAAAEHAEQBfwFCABMAsABFWLASLxuxEhw+WbAc3DAxAP//AFr/6AVOBeoCJgCaAAABBwBEANb/7AATALAARViwDS8bsQ0YPlmwHdwwMQD//wBn/+gGmgfFAiYAmQAAAQcAqgUXAVIAEwCwAEVYsBovG7EaHD5ZsCjcMDEA//8AWv/oBU4GbwImAJoAAAEHAKoEbv/8ABMAsABFWLANLxuxDRg+WbAc3DAxAP//AGf/6AaaBy0CJgCZAAABBwCkARcBRgATALAARViwGi8bsRocPlmwHtwwMQD//wBa/+gFTgXXAiYAmgAAAQYApG7wABMAsABFWLAWLxuxFhg+WbAf3DAxAP//AGf+lwaaBgICJgCZAAAABwCsBOH/+P//AFr+nwVOBJECJgCaAAAABwCsBDYAAP//AKj+nwUyBbACJgA9AAAABwCsBJcAAP///6X+AgPsBDoCJgBdAAAABwCsBNr/Y///AKgAAAUyB7kCJgA9AAABBwCqBMsBRgAJALABL7AW3DAxAP///6X+RQPsBoMCJgBdAAABBwCqBCwAEAAJALABL7Ad3DAxAP//AKgAAAUyByECJgA9AAABBwCkAMsBOgAJALABL7AT3DAxAP///6X+RQPsBesCJgBdAAABBgCkLAQACQCwAS+wGtwwMQAAAgBL/+gFEQYAABkAJQB8ALAWL7AARViwDy8bsQ8YPlmwAEVYsAMvG7EDED5ZsABFWLAGLxuxBhA+WbIPFgFdsi8WAV2yFAMWERI5sBQvsBjQsgEBCitYIdgb9FmyBAYPERI5shEPBhESObAS0LAGELIdAQorWCHYG/RZsA8QsiIBCitYIdgb9FkwMQEjAyM3BicmJicmNzYSNhcWFxMjNzM3MwczAQYWFxY3EyYnJgYGBPa11qUTgLyWsgcDCBSO0H21YTD8G/0ctRq2+/ADbGidelY8nmujVQTS+y50jAQE4787UqUBCoQDBIABB5eXl/xOj54CB6UB9JQEA4fz//8AAP7NBREGAAAmAEgAAAAnAd4B+QJHAAcAQwB//2T//wBE/pgFagWwAiYB4wAAAAcBsAQC/////wAv/pkEVwQ6AiYA8AAAAAcBsANGAAD//wA7/pkFdwWwAiYALAAAAAcBsARlAAD//wAv/pkENgQ6AiYA8wAAAAcBsANmAAD//wCo/pkFCQWwAiYAOAAAAAcBsAItAAD//wBg/pkD6AQ6AiYA9QAAAAcBsAG4AAD////U/pkFKwWwAiYAPAAAAAcBsAPDAAD////E/pkD9AQ6AiYAXAAAAAcBsALYAAD//wDO/pkFRAWwAiYA4AAAAAcBsAQkAAD//wB7/pkEAAQ7AiYA+AAAAAcBsAMkAAD//wDO/pkFRAWwAiYA4AAAAAcBsALnAAD//wB7/pkEAAQ7AiYA+AAAAAcBsAHmAAD//wBD/pkEpQWwAiYAsAAAAAcBsADnAAD//wAt/pkDgwQ6AiYA6wAAAAcBsADOAAD///+s/pkHdQWwAiYA2QAAAAcBsAYwAAD///+l/pkGDgQ6AiYA7QAAAAcBsAT0AAD//wCK/lUFxQXIAiYBPwAAAAcBsALj/7z//wAH/lkERwRTAiYBQAAAAAcBsAHn/8D//wAfAAAD4wYAAgYATAAAAAIAKwAABIEFsAASABsAbrIVHB0REjmwFRCwANAAsABFWLAPLxuxDxw+WbAARViwCS8bsQkQPlmyDg8JERI5sA4vsgsBCitYIdgb9FmwANCyAg8JERI5sAIvsA4QsBHQsAIQshMBCitYIdgb9FmwCRCyFAEKK1gh2Bv0WTAxASMHBRYWBwYEIyETIzczNzMHMwEDBTI2NzYmJwKV5CoBNtjsERD+2On957/KG8kjvCPl/rxgAUqNwBEOfHwEUPIBAeK/x/QEUJfJyf3Z/d0BnoN2iAQAAgArAAAEgQWwABIAGwBxshUcHRESObAVELAA0ACwAEVYsBAvG7EQHD5ZsABFWLAJLxuxCRA+WbISEAkREjmwEi+yAAEKK1gh2Bv0WbIDEAkREjmwAy+wABCwC9CwEhCwDdCwCRCyFQEKK1gh2Bv0WbADELIbAQorWCHYG/RZMDEBIwcFFhYHBgQjIRMjNzM3MwczAQMFMjY3NiYnApXkKgE22OwREP7Y6f3nv8obySO8I+X+vGABSo3AEQ58fARQ8gEB4r/H9ARQl8nJ/dn93QGeg3aIBAAAAQAQAAAEpQWwAA0AULILDg8REjkAsABFWLAILxuxCBw+WbAARViwAi8bsQIQPlmyDQgCERI5sA0vsgABCitYIdgb9FmwBNCwDRCwBtCwCBCyCgEKK1gh2Bv0WTAxASEDIxMjNzMTIQchAyECev78dr13qhupbANlHP1YUQEFAqz9VAKslwJtnv4xAAAB/+YAAAODBDoADQBQsgsODxESOQCwAEVYsAgvG7EIGD5ZsABFWLACLxuxAhA+WbINCAIREjmwDS+yAAEKK1gh2Bv0WbAE0LANELAG0LAIELIKAQorWCHYG/RZMDEBIQMjEyM3MxMhByEDIQJQ/uZTtlOaG5lPApoc/h00ARsB3/4hAd+XAcSZ/tUAAAEAWAAABX4FsAAUAG0AsABFWLASLxuxEhw+WbAARViwBC8bsQQcPlmwAEVYsAsvG7ELED5ZsABFWLAILxuxCBA+WbITEgsREjmwEy+wENCyDQEKK1gh2Bv0WbAB0LALELAC0LACL7IKAQorWCHYG/RZsgYKAhESOTAxASMDMwEzAQEjASMDIxMjNzM3MwczAsf4LokCXff9YQG81v5ysnG8u7YbtSi7J/kEN/73AoL9Nf0bAo79cgQ3l+LiAAABADkAAAQyBgAAFABmALARL7AARViwBC8bsQQYPlmwAEVYsAsvG7ELED5ZsABFWLAILxuxCBA+WbIQEQsREjmwEC+wE9CyAQEKK1gh2Bv0WbALELAC0LACL7IKAQorWCHYG/RZsgYKAhESObABELAN0DAxASMDMwEzAQEjASMDIxMjNzM3MwczAqnoYXIBfOT+MgE3yP71gle2080bzR21HegEwf3NAaz+Cv28AfX+CwTBl6io//8AQ/6aBW4HGwImANsAAAAnAKABawFDAQcAEARQ/70AEwCwAEVYsAgvG7EIHD5ZsA3cMDEA//8AL/6aBEUFxQImAO8AAAAnAKAApf/tAQcAEANb/70AEwCwAEVYsAgvG7EIGD5ZsA3cMDEA//8AO/6aBXcFsAImACwAAAAHABAEWf+9//8AL/6aBEQEOgImAPMAAAAHABADWv+9//8AO/6aBrcFsAImADEAAAAHABAFjP+9//8AMP6aBYsEOgImAPIAAAAHABAEof+9////yv6aBWUFsAImANwAAAAHABAERv+9////yP6aBEcEOgImAPEAAAAHABADXf+9AAEAqAAABTIFsAAOAFayCg8QERI5ALAARViwCC8bsQgcPlmwAEVYsAsvG7ELHD5ZsABFWLACLxuxAhA+WbIGAggREjmwBi+yBQEKK1gh2Bv0WbAA0LIKCAIREjmwBhCwDtAwMQEjAyMTIzczATMTATMBMwN82Vu7WtUblf7mzO8B7+D91ZACCf33AgmXAxD9JgLa/PAAAAEAXf5gBBoEOgAOAGOyAQ8QERI5ALAARViwCS8bsQkYPlmwAEVYsAsvG7ELGD5ZsABFWLADLxuxAxI+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsgYBCitYIdgb9FmyCgsAERI5sA3QsA7QMDEFIwMjEyM3MwMzEwEzATMCx99GtUbWG72xsYkBnMD+Cr4L/msBlZcDrvzcAyT8UgAB/9QAAAUrBbAAEQBiALAARViwDC8bsQwcPlmwAEVYsA4vG7EOHD5ZsABFWLAFLxuxBRA+WbAARViwAy8bsQMQPlmyCQwFERI5fLAJLxiwENCyAAEKK1gh2Bv0WbIEBQwREjmwCNCyDQwFERI5MDEBIwEjAQEjASM3MwEzEwEzATMDsaQBOtP+/v5K6AIKlxuR/trQ/QGp6P4TjgKe/WICN/3JAp6XAnv90wIt/YUAAAH/xAAAA/QEOgARAGoAsABFWLAMLxuxDBg+WbAARViwDi8bsQ4YPlmwAEVYsAUvG7EFED5ZsABFWLADLxuxAxA+WbIJBQwREjl8sAkvGLIIAQorWCHYG/RZsAHQsgQFDBESObINDAUREjmwCRCwEdB8sBEvGDAxASMTIwMBIwEjNzMDMxMBMwEzAw+x7MWz/s/dAYKhG57bxqcBJt7+mZ0B4f4fAZT+bAHhlwHC/nYBiv4+//8AKf/nA+UETQIGAL4AAP///9cAAASkBbACJgAqAAAABwHe/0T+f///AJkCiwXXAyIARgGXiABmZkAA//8AFwAABCsFxwIGABYAAP//ADT/6AQhBccCBgAXAAD//wAFAAAEHQWwAgYAGAAA//8Acv/nBGoFsAIGABkAAP//AJT//gQTBcgABgAdAAD//wB8/+cEPwXJAAYAFBQA//8Aef/qBQYHVQImACsAAAEHAHUB9wFXABMAsABFWLAMLxuxDBw+WbAk3DAxAP//AAT+TwQoBf4CJgBLAAABBwB1AU0AAAATALAARViwBC8bsQQYPlmwLNwwMQD//wA7AAAFdwc0AiYAMgAAAQcARAGdATYAEwCwAEVYsAYvG7EGHD5ZsAvcMDEA//8AHwAAA+MF/gImAFIAAAEHAEQA0gAAABMAsABFWLADLxuxAxg+WbAU3DAxAP///68AAASLByACJgAlAAABBwCrBIABMgAWALAARViwBC8bsQQcPlmwDNywENAwMf//ADP/6APPBesCJgBFAAABBwCrA/L//QAWALAARViwGC8bsRgYPlmwLdywMdAwMf//ADsAAASxBywCJgApAAABBwCrBE4BPgAWALAARViwBi8bsQYcPlmwDdywEdAwMf//AEX/6gPgBesCJgBJAAABBwCrA9f//QAWALAARViwCC8bsQgYPlmwIdywJdAwMf///98AAAKKBywCJgAtAAABBwCrAwQBPgAWALAARViwAi8bsQIcPlmwBdywCdAwMf///40AAAI4BekCJgCMAAABBwCrArL/+wAWALAARViwAi8bsQIYPlmwBdywCdAwMf//AHf/5wUNByICJgAzAAABBwCrBKEBNAAWALAARViwCi8bsQocPlmwJNywKNAwMf//AEX/6AQfBesCJgBTAAABBwCrA+D//QAWALAARViwAC8bsQAYPlmwJNywKNAwMf//ADoAAATCByACJgA2AAABBwCrBEMBMgAWALAARViwBC8bsQQcPlmwGdywHdAwMf//AB8AAALUBesCJgBWAAABBwCrA0n//QAWALAARViwCi8bsQoYPlmwEtywDdAwMf//AGf/5wUgByACJgA5AAABBwCrBHsBMgAWALAARViwCi8bsQocPlmwFNywGNAwMf//AFv/6AQeBesCJgBZAAABBwCrA+T//QAWALAARViwBy8bsQcYPlmwFdywGdAwMf///7IAAAU8Bj8AJgDPZAAABwCt/pEAAP//ADv+qQSgBbACJgAmAAAABwCsBJgACv//AB/+lgP+BgACJgBGAAAABwCsBIb/9///ADv+qQTVBbACJgAoAAAABwCsBJcACv//AEv+nwR1BgACJgBIAAAABwCsBJkAAP//ADv+CQTVBbACJgAoAAAABwGiAR/+qv//AEv9/wR1BgACJgBIAAAABwGiASH+oP//ADv+qQV3BbACJgAsAAAABwCsBPoACv//AB/+qQPjBgACJgBMAAAABwCsBH8ACv//ADsAAAVQBy4CJgAvAAABBwB1AbABMAATALAARViwBS8bsQUcPlmwDtwwMQD//wAgAAAEIgc/AiYATwAAAQcAdQF9AUEACQCwBS+wD9wwMQD//wA7/vgFUAWwAiYALwAAAAcArATSAFn//wAg/uUEGgYAAiYATwAAAAcArARQAEb//wA7/qkDsQWwAiYAMAAAAAcArASdAAr////y/qkB7gYAAiYAUAAAAAcArAM3AAr//wA7/qkGtwWwAiYAMQAAAAcArAWnAAr//wAe/qkGagRSAiYAUQAAAAcArAWrAAr//wA7/qkFdwWwAiYAMgAAAAcArAT+AAr//wAf/qkD4wRSAiYAUgAAAAcArARmAAr//wA7AAAE8wdAAiYANAAAAQcAdQG0AUIAEwCwAEVYsAMvG7EDHD5ZsBbcMDEA////1/5gBDYF9QImAFQAAAEHAHUBkf/3ABMAsABFWLANLxuxDRg+WbAh3DAxAP//ADr+qQTCBbACJgA2AAAABwCsBJUACv///+7+qQLUBFQCJgBWAAAABwCsAzMACv//ACf+nwSjBccCJgA3AAAABwCsBKQAAP//AC7+lwO2BFACJgBXAAAABwCsBG3/+P//AKj+nwUJBbACJgA4AAAABwCsBJYAAP//AEP+nwKUBUACJgBYAAAABwCsA/oAAP//AKQAAAVhBy0CJgA6AAABBwCkAOEBRgATALAARViwAS8bsQEcPlmwCtwwMQD//wBuAAAD7QXiAiYAWgAAAQYApBv7ABMAsABFWLABLxuxARg+WbAK3DAxAP//AKT+qQVhBbACJgA6AAAABwCsBMoACv//AG7+qQPtBDoCJgBaAAAABwCsBDgACv//AMP+qQdBBbACJgA7AAAABwCsBc0ACv//AID+qQX+BDoCJgBbAAAABwCsBSwACv///+v+qQTOBbACJgA+AAAABwCsBJgACv///+3+qQPOBDoCJgBeAAAABwCsBEIACv///wz/5wVTBdYAJgAzRgAABwFa/hoAAP///6UAAAPjBRwCJgG6AAAABwCt/6v+3f///+EAAAQrBR8AJgG+PAAABwCt/sD+4P////0AAATWBRwAJgHBPAAABwCt/tz+3f//AAEAAAHmBR4AJgHCPAAABwCt/uD+3///AB3/6gRYBRwAJgHICgAABwCt/vz+3f///5sAAAShBRwAJgHSPAAABwCt/nr+3f//ABYAAAR0BRsAJgHzCgAABwCt/xT+3P///6UAAAPjBI0CBgG6AAD//wAdAAAD5wSNAgYBuwAA//8AHQAAA+8EjQIGAb4AAP///9wAAAQOBI0CBgHTAAD//wAdAAAEmgSNAgYBwQAA//8AKgAAAaoEjQIGAcIAAP//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DAAGiA7uDu4MRg6gCiIO7g7uD5oKigaSDGYMRgrYCqwNUg8QCl4L4gsQDBYGmA22DbYNtgwgCxAKUAxMDbAMTAsQBqYN5gtwD5oLcAasBrIGvAbCBsgMTAbOBtgNtgb+BxQHKgcwB0YHTAdSB4QHigeQDcANwAe+Du4H4AgCDVIIMA7uDu4LJg7uDu4IRg3ADcAIeAiCCIwIpg1ICLgNsAjSCOgLEAkyCUwJaAloCxAJYgloCWgJaAtwDCAK2AxMCxAN5g1IDqAOoA1ICtIK0grSCtIK0gmKCbAJugnECeIJ9AoGChgK/g+aD5oPmg+aDGYLcAtwC3ALcAtwC3ALcAr+DAAMAAwADAAO7g7uDu4O7g7uD5oPmg+aD5oPmgxGDEYMRgxGDxAL4gviC+IL4gviC+IL4gwWDBYMFgwWDbYMIAwgDCAMIAwgDEwMTAtwC+ILcAviC3AL4gr+Cv4K/gr+D5oMAAwWDAAMFgwADBYMAAwWDAAMFg7uDbYO7g7uDu4O7g7uDEYOoAoiCiIKIgoiDu4Ntg7uDbYO7g22DbYPmgwgD5oMIA+aDCAKUApQClAMZgxmDGYMRgxGDEYMRgxGDEYKrA8QDEwPEApeCl4KXgtwDAAO7g7uD5oPEAtwCoAMAApeDu4O7g6gDu4O7g+aCooMZg8QDVIO7g8QDbYMIAxMDCAMAA3mDu4O7gxGDqAOoAsmC3AKgA3mDAAO7g7uD5oKigr+DGYNUgviDBYMIAsQDEwNsAwWDUgMTAqsCqwKrA8QDEwK0grSCtIO7g22C3AL4gwADBYK2AxMCv4PEAxMDu4NUg2wDu4LcAviC3AL4gwADBYMFgwWDVINsA+aDCAMIAsQCyYMTAsmDEwLJgxMDVINsAtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gwADBYMAAwWDAAMFgwADBYMAAwWDAAMFgwADBYMAAwWDu4O7g+aDCAPmgwgD5oMIA+aDCAPmgwgD5oMIA+aDCAMIAxGDEYPEAxMDxAMTA8QDEwOoA7uDGYNUg2wDeYNSA1SDbANtg3ADeYOoA7uDu4PEA+aAAIAhwAGAAYAAAALAAsAAQATABMAAgAlACoAAwAsADUACQA4AD4AEwBFAEYAGgBJAEoAHABMAEwAHgBRAFQAHwBWAFYAIwBaAFoAJABcAF0AJQCKAIoAJwCcAJwAKACwALQAKQC2ALgALgC6ALoAMQC8AL0AMgC/AMAANADCAMQANgDGAMsAOQDRANEAPwDTAN0AQADfAN8ASwDhAOMATADlAOcATwDpAO0AUgDwAPAAVwD1APcAWAD6APsAWwD9AP8AXQEDAQQAYAEJAQkAYgEMAQwAYwEXARkAZAErAS0AZwEwATAAagEyATIAawFJAUkAbAFsAW0AbQFvAXEAbwG6AboAcgG9Ab0AcwHEAcUAdAHIAcgAdgHKAcsAdwHNAc0AeQIoAigAegIqAisAewJHAkgAfQJKAkoAfwJMAm0AgAJvAnIAogJ3AnwApgKBAokArAKLAosAtQKNAo0AtgKPAo8AtwKRApEAuAKTApwAuQKlAqcAwwKpAqkAxgKrAqsAxwKtAq0AyAKvAq8AyQKyArIAygK0ArQAywK2ArYAzAK4ArgAzQK6AroAzgK8ArwAzwK+AsoA0ALMAswA3QLOAs4A3gLQAtAA3wLbAtsA4ALdAt0A4QLfAt8A4gLhAuEA4wLjAuMA5ALlAuUA5QLnAucA5gLpAukA5wLrAusA6ALtAu0A6QLvAvIA6gL0AvQA7gL2AvYA7wNTA1gA8ANbA2oA9gNtA20BBgNxA3EBBwNzA3MBCAN3A3cBCQN6A3sBCgN9A4YBDAOIA4oBFgOMA5EBGQOTA5QBHwOWA5kBIQOfA6ABJQOiA6IBJwOkA6QBKAOmA6kBKQOsA7EBLQOzA7MBMwO3A7gBNAO9A70BNgO/A8gBNwPLA8wBQQPOA9EBQwPYA9kBRwPdA90BSQPfA+UBSgPqA+sBUQPvBBcBUwQZBBkBfAQbBCgBfQQwBDABiwQzBDMBjAQ1BDUBjQRBBEYBjgRJBEkBlARLBEsBlQRNBE0BlgRPBFABlwRVBFgBmQRbBFsBnQRdBF4BngRgBGABoARkBGQBoQRmBGYBogRqBGoBowSqBKoBpAABABP/IAACAFb/5gG6/8AAAQG6AA4AAwANABQAQQASAGEAEwABAPX/9QABAMMADQACALf/wgDDABAAAQDD/+IAAQDG//IAAQDDAA4AAgDJ/+0A9f/AAAkAvv/mAMH/6wDC/+kAxP/wAMX/5wDJ/+MAy//OAMz/1ADN/9sABQDB/+wAwwAPAMX/6gDJ/8QAy//nAAUASv/pAMH/7gDD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Aor/6wKM/+sCjv/rApD/6wKS/+sClP/rApb/6wKY/+sCmv/rApz/6wKe/+sCoP/rAqL/6wKk/+sCsv74Asb/6wLI/+sCyv/rAtsAFALdABQC3wAUAuL/6gLk/+oC5v/qAuj/6gLq/+oC7P/qAvD/6ANT/1YDW/9WA2v/6wNv/+oDcf/rA3P/6AN2/+oDd//rA3j/6gN//vgDg/9WA44AFAOQ/94Dkf/rA5P/6wOV/+sDlv/oA5j/6wOf/+gDp//oA6//VgOw/94Ds//rA7j/6AO5/+sDvv/rA8D/6APF/1YDxv/eA8f/VgPI/94DzP/rA87/6wPP/+sD2f/rA9v/6wPd/+sD4f/oA+P/6APl/+gD7P/rA+//VgPw/94D8f9WA/L/3gPz/1YD9P/eA/X/VgP2/94D9/9WA/j/3gP5/1YD+v/eA/v/VgP8/94D/f9WA/7/3gP//1YEAP/eBAH/VgQC/94EA/9WBAT/3gQF/1YEBv/eBAj/6wQK/+sEDP/rBA7/6wQQ/+sEEv/rBBT/6wQW/+sEHP/rBB7/6wQg/+sEIv/rBCT/6wQm/+sEKP/rBCr/6wQs/+sELv/rBDD/6wQy/+sENP/qBDb/6gQ4/+oEOv/qBDz/6gQ+/+oEQP/qBEL/6ARE/+gERv/oBE0AFAAfADj/1QA6/+QAO//sAD3/3QDR/9UA1f/VARj/5AEy/9UBOv/VAmb/3QLb/9UC3f/VAt//1QLt/+wC7//dAvH/3QNY/90DZ//dA2r/3QOO/9UDoP/sA6L/7AOk/+wDpv/dA7f/5AO//90EQf/dBEP/3QRF/90ETf/VBGr/3QAaADj/sAA6/+0APf/QANH/sADV/7ABGP/tATL/sAE6/7ACZv/QAtv/sALd/7AC3/+wAu//0ALx/9ADWP/QA2f/0ANq/9ADjv+wA6b/0AO3/+0Dv//QBEH/0ARD/9AERf/QBE3/sARq/9AAEAAu/+4AOf/uAmL/7gJj/+4CZP/uAmX/7gKy/+4C4f/uAuP/7gLl/+4C5//uAun/7gLr/+4Df//uBDP/7gQ1/+4ARwAGABAACwAQAEf/6ABI/+gASf/oAEv/6ABV/+gAk//oAJj/6AC6/+gAx//oAMj/6AD2/+gBAv/oAR3/6AEh/+gBOf/oAUv/6AFM/+gBVv/oAWwAEAFtABABbwAQAXAAEAFxABACbv/o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/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAMD/8wDH/9wAyP/cAMr/3QDr//MA7//zAPD/8wDy//MA8//zAPT/8wD2/9wA9//zAPn/8wD6//MA/f/zAP//8wEC/9wBBP/zARf/1gEZ/+EBHf/cASH/3AE1//MBOf/cAUT/8wFJ//MBS//cAUz/3AFW/9wCbv/cAm//3AJw/9wCcf/cAnL/3AJ3//MCeP/WAnn/1gJ6/9YCe//WAnz/1gJ9/90Cfv/dAn//3QKA/90Cgf/hAoL/4QKK/9wCjP/cAo7/3AKQ/9wCkv/cApT/3AKW/9wCmP/cApr/3AKc/9wCnv/cAqD/3AKi/9wCpP/cAr//8wLB//MCw//zAsT/8wLG/9YCyP/WAsr/1gLi/90C5P/dAub/3QLo/90C6v/dAuz/3QLw/+EDa//cA23/8wNv/90Dcf/WA3P/4QN2/90Dd//WA3j/3QOR/9wDkv/zA5P/1gOU//MDlf/cA5b/4QOY/9wDmf/zA57/8wOf/+EDp//hA67/8wOz/9wDtP/zA7j/4QO5/9wDvv/cA8D/4QPM/9wDzv/cA8//3APV//MD1//zA9n/1gPb/9wD3f/WA+H/4QPj/+ED5f/hA+n/8wPs/9wECP/cBAr/3AQM/9wEDv/cBBD/3AQS/9wEFP/cBBb/3AQc/9YEHv/WBCD/1gQi/9YEJP/WBCb/1gQo/9YEKv/cBCz/3AQu/9wEMP/WBDL/3AQ0/90ENv/dBDj/3QQ6/90EPP/dBD7/3QRA/90EQv/hBET/4QRG/+EESv/zBEz/8wRW//MEY//zBGX/8wRn//MAcQAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADH//AAyP/wAMr/7wD2//ABAv/wARn/3AEd//ABIf/wATn/8AFL//ABTP/wAVb/8AFs/9oBbf/aAW//2gFw/9oBcf/aAm7/8AJv//ACcP/wAnH/8AJy//ACff/vAn7/7wJ//+8CgP/vAoH/3AKC/9wCiv/wAoz/8AKO//ACkP/wApL/8AKU//AClv/wApj/8AKa//ACnP/wAp7/8AKg//ACov/wAqT/8ALi/+8C5P/vAub/7wLo/+8C6v/vAuz/7wLw/9wDa//wA2//7wNz/9wDdv/v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//UA1f/xANn/9ADc//UA3f/zARj/9AEy//EBOv/xAVH/9QJm//AC2//xAt3/8QLf//EC7//wAvH/8ANY//ADZ//wA2j/9ANq//ADgv/zA47/8QOP//QDpv/wA7f/9AO///ADwv/0A9D/9APg//MD4v/zA+T/8wPq//QD7f/1BEH/8ARD//AERf/wBE3/8QRP//QEV//0BGj/9QRq//AAWQAlAA8AOP/mADr/5gA8AA4APf/mALEADwCzAA8A0f/mANMADgDV/+YA2QAOANwADgDdAAsA4P/lAPEADwD4/+gBAwAPAQwADwEY/+YBMv/mATr/5gFRAA4CTAAPAk0ADwJOAA8CTwAPAlAADwJRAA8CUgAPAmb/5gKDAA8ChQAPAocADwLb/+YC3f/mAt//5gLv/+YC8f/mA1MADwNY/+YDWwAPA2f/5gNoAA4Dav/mA4IACwODAA8Djv/mA48ADgOm/+YDrwAPA7f/5gO//+YDwgAOA8UADwPHAA8D0AAOA+AACwPiAAsD5AALA+b/5QPn/+gD6gAOA+0ADgPuAA8D7wAPA/EADwPzAA8D9QAPA/cADwP5AA8D+wAPA/0ADwP/AA8EAQAPBAMADwQFAA8EQf/mBEP/5gRF/+YETf/mBE8ADgRR/+UEUv/oBFP/5QRU/+gEVwAOBGgADgRpAA8Eav/mAC4AOP/jADz/5QA9/+QA0f/jANP/5QDV/+MA2f/lANz/5QDd/+kA8f/qAQP/6gEy/+MBOv/jAVH/5QJm/+QC2//jAt3/4wLf/+MC7//kAvH/5ANY/+QDZ//kA2j/5QNq/+QDgv/pA47/4wOP/+UDpv/kA7//5APC/+UD0P/lA+D/6QPi/+kD5P/pA+r/5QPt/+UD7v/qBEH/5ARD/+QERf/kBE3/4wRP/+UEV//lBGj/5QRp/+oEav/kACEAOP/iADz/5ADR/+IA0//kANX/4gDZ/+QA3P/kAN3/6QDx/+sBA//rATL/4gE6/+IBUf/kAtv/4gLd/+IC3//iA2j/5AOC/+kDjv/iA4//5APC/+QD0P/kA+D/6QPi/+kD5P/pA+r/5APt/+QD7v/rBE3/4gRP/+QEV//kBGj/5ARp/+sAFwA4/+sAPf/zANH/6wDV/+sBMv/rATr/6wJm//MC2//rAt3/6wLf/+sC7//zAvH/8wNY//MDZ//zA2r/8wOO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ABgEJwQnAAMEKAQoABgEMAQwABgEMwQzAAwENQQ1AAwEQQRBAA8EQgRCABkEQwRDAA8ERAREABkERQRFAA8ERgRGABkESQRJAAkESwRLAAIETQRNAAYETwRPAA4EUARQABsEVQRVAAcEVgRWAAgEVwRXAA4EWARYABsEWwRbABcEXQRdAB8EXgReAAcEYARgAAkEZARkAAIEZgRmAAIEagRqAA8EqgSqAAMAAgFtAAYABgAHAAsACwAHABAAEAATABEAEQAXABIAEgATACUAJQARACcAJwAFACsAKwAFAC4ALgAcADMAMwAFADUANQAFADcANwAZADgAOAAKADkAOQAGADoAOgANADsAOwAJADwAPAASAD0APQAOAD4APgAUAEUARQAaAEcASQAVAEsASwAVAFEAUgAYAFMAUwAIAFQAVAAYAFUAVQAVAFcAVwAbAFkAWQALAFoAWgACAFwAXAAWAF0AXQACAF4AXgAMAIMAgwAFAJIAkgAFAJMAkwAVAJcAlwAFAJgAmAAVAJoAmgALALEAsQARALIAsgAFALMAswARALoAugAVALwAvAACAMAAwAAYAMcAyAAVAMoAygALANEA0QAKANIA0gAFANMA0wABANUA1QAKANkA2QASANwA3AABAN0A3QAQAOAA4AAPAOsA6wAYAO0A7QAWAO8A8AAYAPEA8QAEAPIA9AAYAPYA9gAVAPcA9wAYAPgA+AADAPkA+gAYAP0A/QAYAP8A/wAYAQIBAgAVAQMBAwAEAQQBBAAYAQcBBwAFAQwBDAARARYBFgAFARcBFwAIARgBGAANARkBGQACARoBGgAFARwBHAAFAR0BHQAVAR4BHgAFASABIAAFASEBIQAVATIBMgAKATUBNQAYATgBOAAFATkBOQAVAToBOgAKAUQBRAAYAUkBSQAYAUsBTAAVAVEBUQABAVUBVQAFAVYBVgAVAWkBagAXAWwBbQAHAW4BbgATAW8BcQAHAXIBcgATAXYBdwATAigCKQAFAisCLAAFAkYCRgAXAkwCUgARAlMCUwAFAl0CYQAFAmICZQAGAmYCZgAOAmcCbQAaAm4CcgAVAncCdwAYAngCfAAIAn0CgAALAoECggACAoMCgwARAoQChAAaAoUChQARAoYChgAaAocChwARAogCiAAaAokCiQAFAooCigAVAosCiwAFAowCjAAVAo0CjQAFAo4CjgAVAo8CjwAFApACkAAVApICkgAVApQClAAVApYClgAVApgCmAAVApoCmgAVApwCnAAVAp0CnQAFAp4CngAVAp8CnwAFAqACoAAVAqECoQAFAqICogAVAqMCowAFAqQCpAAVArICsgAcAr8CvwAYAsECwQAYAsMCxAAYAsUCxQAFAsYCxgAIAscCxwAFAsgCyAAIAskCyQAFAsoCygAIAtEC0QAZAtIC0gAbAtMC0wAZAtQC1AAbAtUC1QAZAtYC1gAbAtcC1wAZAtgC2AAbAtkC2QAZAtoC2gAbAtsC2wAKAt0C3QAKAt8C3wAKAuEC4QAGAuIC4gALAuMC4wAGAuQC5AALAuUC5QAGAuYC5gALAucC5wAGAugC6AALAukC6QAGAuoC6gALAusC6wAGAuwC7AALAu0C7QAJAu8C7wAOAvAC8AACAvEC8QAOAvIC8gAUAvMC8wAMAvQC9AAUAvUC9QAMAvYC9gAUAvcC9wAMAvoC+gAFA1MDUwARA1cDVwAFA1gDWAAOA1sDWwARA14DXgAUA2QDZAAFA2cDZwAOA2gDaAASA2oDagAOA2sDawAVA20DbQAYA28DbwALA3EDcQAIA3MDcwACA3YDdgALA3cDdwAIA3gDeAALA38DfwAcA4IDggAQA4MDgwARA4oDigAFA40DjQAFA44DjgAKA48DjwASA5ADkAAaA5EDkQAVA5IDkgAYA5MDkwAIA5QDlAAYA5UDlQAVA5YDlgACA5cDlwAWA5gDmAAVA5kDmQAYA5oDmgAbA54DngAYA58DnwACA6ADoAAJA6IDogAJA6QDpAAJA6YDpgAOA6cDpwACA6gDqQAHA6wDrAAHA64DrgAYA68DrwARA7ADsAAaA7MDswAVA7QDtAAYA7cDtwANA7gDuAACA7kDuQAVA7oDugAFA70DvQAFA74DvgAVA78DvwAOA8ADwAACA8IDwgASA8MDwwAWA8UDxQARA8YDxgAaA8cDxwARA8gDyAAaA8wDzAAVA84DzwAVA9AD0AASA9ED0QAWA9UD1QAYA9cD1wAYA9gD2AAFA9kD2QAIA9oD2gAFA9sD2wAVA9wD3AAFA90D3QAIA+AD4AAQA+ED4QACA+ID4gAQA+MD4wACA+QD5AAQA+UD5QACA+YD5gAPA+cD5wADA+kD6QAYA+oD6gASA+sD6wAWA+wD7AAVA+0D7QABA+4D7gAEA+8D7wARA/AD8AAaA/ED8QARA/ID8gAaA/MD8wARA/QD9AAaA/UD9QARA/YD9gAaA/cD9wARA/gD+AAaA/kD+QARA/oD+gAaA/sD+wARA/wD/AAaA/0D/QARA/4D/gAaA/8D/wARBAAEAAAaBAEEAQARBAIEAgAaBAMEAwARBAQEBAAaBAUEBQARBAYEBgAaBAgECAAVBAoECgAVBAwEDAAVBA4EDgAVBBAEEAAVBBIEEgAVBBQEFAAVBBYEFgAVBBsEGwAFBBwEHAAIBB0EHQAFBB4EHgAIBB8EHwAFBCAEIAAIBCEEIQAFBCIEIgAIBCMEIwAFBCQEJAAIBCUEJQAFBCYEJgAIBCcEJwAFBCgEKAAIBCkEKQAFBCoEKgAVBCsEKwAFBCwELAAVBC0ELQAFBC4ELgAVBC8ELwAFBDAEMAAIBDEEMQAFBDIEMgAVBDMEMwAGBDQENAALBDUENQAGBDYENgALBDgEOAALBDoEOgALBDwEPAALBD4EPgALBEAEQAALBEEEQQAOBEIEQgACBEMEQwAOBEQERAACBEUERQAOBEYERgACBEoESgAYBEwETAAYBE0ETQAKBE8ETwASBFAEUAAWBFEEUQAPBFIEUgADBFMEUwAPBFQEVAADBFYEVgAYBFcEVwASBFgEWAAWBGMEYwAYBGUEZQAYBGcEZwAYBGgEaAABBGkEaQAEBGoEagAOBHAEcAAXBKoEqgAFAAEAAAAKAgYG8AAEREZMVAAaY3lybABIZ3JlawB2bGF0bgCkAAQAAAAA//8AEgAAAAoAFAAeACgANABBAEsAVQBfAGkAcwB9AIcAkQCbAKUArwAEAAAAAP//ABIAAQALABUAHwApADUAQgBMAFYAYABqAHQAfgCIAJIAnACmALAABAAAAAD//wASAAIADAAWACAAKgA2AEMATQBXAGEAawB1AH8AiQCTAJ0ApwCxACgABkFaRSAAVENSVCAAfk1PTCAAqE5BViAA1FJPTSABAFRVUiABLAAA//8AEwADAA0AFwAhACsAMgA3AEQATgBYAGIAbAB2AIAAigCUAJ4AqACyAAD//wASAAQADgAYACIALAA4AEUATwBZAGMAbQB3AIEAiwCVAJ8AqQCzAAD//wASAAUADwAZACMALQA5AEYAUABaAGQAbgB4AIIAjACWAKAAqgC0AAD//wATAAYAEAAaACQALgA6AD4ARwBRAFsAZQBvAHkAgwCNAJcAoQCrALUAAP//ABMABwARABsAJQAvADsAPwBIAFIAXABmAHAAegCEAI4AmACiAKwAtgAA//8AEwAIABIAHAAmADAAPABAAEkAUwBdAGcAcQB7AIUAjwCZAKMArQC3AAD//wATAAkAEwAdACcAMQAzAD0ASgBUAF4AaAByAHwAhgCQAJoApACuALgAuWMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGMyc2MEWGNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmNjbXAEXmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRsaWcEZmRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGRub20EbGZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmxpZ2EEfGxpZ2EEhGxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxvY2wEkGxvY2wElmxvY2wEnG51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqHBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5AAAAAEAAAAAAAIAAgADAAAAAQAHAAAAAQAYAAAAAwAVABYAFwAAAAIACAAJAAAAAQAJAAAAAQAUAAAAAQAEAAAAAQAGAAAAAQAFAAAAAQAZAAAAAQARAAAAAQATAAAAAQABAAAAAQAKAAAAAQALAAAAAQAMAAAAAQANAAAAAQAOAAAAAQAPAAAAAQAQAAAAAQASABsAOAPGBrQHYA3wDfAOBg4oDl4OhA6yDsYO2g7uDwAPGg9cD3oPmA/KD/wQLhBCEHoQbBB6EKYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCRAI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTdAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYB/wTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNgE2QTbAhoE3AIOBNcCEwINBNoCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkcCSAJKAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CrwKyArQCtgK4AroCvAK+AsACwgLFAscCyQLLAs0CzwLRAtMC1QLZAtsC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvIC9AL2A1MDVANVA1YDVwNYA1kDWwNcA10DXgNfA2ADYQNiA2QDZQNmA2cDaANpA2oDegN7A3wDfQN+A38DgAOBA4IDgwOEA4UDhgOHA4gDiQOKA4sDjAONA44DjwO7A70DvwPUA9oD4ARJBEsETwRXBFkEXgRqAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAv0DMAI7AfoEygTLAfsB/AH9Af4B/wIABM4EzwTRBNQE3QICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZA08DGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNQA1EDUgTJBMwEzQTQBNIE0wIBBNUEwQTCBMMExATFBMYExwTIBNYE2ATZAhgE2wIaBNwC/AIOBNcCEwINBNoCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSwJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoQChgKIAooCjAKOApACkgKUApYCmAKaApwCngKgAqICpAKmAqgCqgKsAq4CswK1ArcCuQK7Ar0CvwLBAsMCxgLIAsoCzALOAtAC0gLUAtYC2gLcAt4C4ALiAuQC5gLoAuoC7ALuAvAC8wL1AvcDkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwO8A74DwAPOA9UD2wPhBEcESgRMBFAEWARaBFsEXwRrAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAAAaAAEAAQBNAAMAAAABABIAAQB4AAEAAAAaAAEAAQBOAAMAAAABABIAAQBgAAEAAAAaAAEAAQKuAAMAAAABABIAAQBIAAEAAAAaAAEAAQObAAMAAAABABIAAQAwAAEAAAAaAAEAAQOdAAMAAAABABIAAQAYAAEAAAAaAAEAAQQaAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCTAACAKcCTQACAKgCTwACAKkD8QACAKoEewACAKsD7wACAKwAAQAEBIgAAgCsAAEABAKJAAIAqAACAAYADASKAAIArASMAAIBogAGAA4AFAAaACAAJgAsAlQAAgCnAlUAAgCoBAsAAgCpBAkAAgCqBH0AAgCrBAcAAgCsAAIABgAMBHcAAgCoAqMAAgGiAAEABASOAAIArAAGAA4AFAAaACAAJgAsAlgAAgCnAlkAAgCoAqcAAgCpBBcAAgCqBH8AAgCrBBkAAgCsAAMACAAOABQEkAACAKgEkgACAKwCtAACAaIAAwAIAA4AFAK2AAIAqASUAAIArAK4AAIBogACAAYADAOtAAIAqASWAAIArAAFAAwAEgAYAB4AJAR5AAIApwK+AAIAqAJcAAIAqQSYAAIArALAAAIBogAGAA4AFAAaACAAJgAsAl0AAgCnAl4AAgCoAmAAAgCpBB0AAgCqBIEAAgCrBBsAAgCsAAEABASaAAIAqAAEAAoAEAAWABwCywACAKgEgwACAKsEnAACAKwCzQACAaIAAwAIAA4AFALRAAIAqASeAAIArALXAAIBogACAAYADASgAAIArALbAAIBogAGAA4AFAAaACAAJgAsAmIAAgCnAmMAAgCoAuEAAgCpBDUAAgCqBIUAAgCrBDMAAgCsAAIABgAMBKIAAgCpBKQAAgCsAAMACAAOABQDoAACAKcDogACAKgEpgACAKwABQAMABIAGAAeACQDpgACAKcCZgACAKgERQACAKkEQwACAKoEQQACAKwAAgAGAAwC8gACAKgEqAACAKwABgAOABQAGgAgACYALAJnAAIApwJoAAIAqAJqAAIAqQPyAAIAqgR8AAIAqwPwAAIArAABAAQEiQACAKwAAQAEAooAAgCoAAIABgAMBIsAAgCsBI0AAgGiAAYADgAUABoAIAAmACwCbwACAKcCcAACAKgEDAACAKkECgACAKoEfgACAKsECAACAKwAAQAEBHgAAgCoAAEABASPAAIArAABAAQEGgACAKwAAwAIAA4AFASRAAIAqASTAAIArAK1AAIBogADAAgADgAUArcAAgCoBJUAAgCsArkAAgGiAAIABgAMA64AAgCoBJcAAgCsAAUADAASABgAHgAkBHoAAgCnAr8AAgCoAncAAgCpBJkAAgCsAsEAAgGiAAYADgAUABoAIAAmACwCeAACAKcCeQACAKgCewACAKkEHgACAKoEggACAKsEHAACAKwAAQAEBJsAAgCoAAQACgAQABYAHALMAAIAqASEAAIAqwSdAAIArALOAAIBogADAAgADgAUAtIAAgCoBJ8AAgCsAtgAAgGiAAIABgAMBKEAAgCsAtwAAgGiAAYADgAUABoAIAAmACwCfQACAKcCfgACAKgC4gACAKkENgACAKoEhgACAKsENAACAKwAAgAGAAwEowACAKkEpQACAKwAAwAIAA4AFAOhAAIApwOjAAIAqASnAAIArAAFAAwAEgAYAB4AJAOnAAIApwKBAAIAqARGAAIAqQREAAIAqgRCAAIArAACAAYADALzAAIAqASpAAIArAABAAQC+AACAKgAAQAEAvoAAgCoAAEABAL5AAIAqAABAAQC+wACAKgABQAMABIAGAAeACQCcwACAKcCdAACAKgCqAACAKkEGAACAKoEgAACAKsABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQELAACAKcEKgACAKgEMAACAKkELgACAKoEMgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwABQAMABIAGAAeACQEOgACAKcEOAACAKgEPgACAKkEPAACAKoEQAACAKwAAQAEBIcAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLVAtYAAQAAAAEACAACAA4ABATeBN8E4AThAAEABAKHAogCmQKaAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiECIgGuAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAiIAAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIwRxBHIEcwR0BHUEdgABAAAAAQAIAAIAFgAIBHYCIwRxBHIEcwR0Aa0EdQABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAAAaAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwJDAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKuA5sDnQQa",
  65900. "Roboto-Medium.ttf": "AAEAAAARAQAABAAQR1BPU32qcYwAAgioAABZDEdTVUJMnCjgAAJhtAAAGWhPUy8yoQuxtgAAAZgAAABgY21hcEAmSHIAABpsAAASyGN2dCAElytKAAAvvAAAAFZmcGdte/lhqwAALTQAAAG8Z2FzcAAIABMAAgicAAAADGdseWaunmLpAAA53AABy8xoZG14PT88IAAAFYAAAATsaGVhZPh7qwgAAAEcAAAANmhoZWEK7wqbAAABVAAAACRobXR4JPNE9QAAAfgAABOIbG9jYd3eZq0AADAUAAAJxm1heHAHEgL1AAABeAAAACBuYW1lPWNvTAACBagAAALUcG9zdP9tAGQAAgh8AAAAIHByZXAbsfg2AAAu8AAAAMwAAQAAAAIAABFApG1fDzz1ABsIAAAAAADE8BEuAAAAANDbTpT6JP3VCVwIcwAAAAkAAgAAAAAAAAABAAAHbP4MAAAJa/ok/kEJXAABAAAAAAAAAAAAAAAAAAAE4gABAAAE4gCPABYATgAFAAEAAAAAAA4AAAIAAhYABgABAAMElQH0AAUAAAWaBTMAAAEfBZoFMwAAA9EAZgIAAAACAAAAAAAAAAAA4AAK/1AAIX8AAAAhAAAAAEdPT0cAQAAA//0GAP4AAGYHmgIAIAABnwAAAAAEOgWwACAAIAACA4wAZAAAAAAAAAAAAf4AAAH+AAACJQCPApgAZQTiAGAEjABkBeAAYwUdAFYBWgBSAsoAgALSACgDiQAbBHUARAHCABwCoABHAjwAhwMqAAIEjABpBIwAqASMAFEEjABPBIwANASMAIEEjAB1BIwARQSMAGgEjABdAh8AggHnAC4EEQA/BHoAkQQqAIAD5AA8BygAWwVTABIFDACUBTkAZgU6AJQEhgCUBGUAlAVyAGoFrwCUAkIAowRxAC0FCwCUBFQAlAcBAJQFrgCUBYYAZgUdAJQFhgBgBP4AlATUAEoE2wAtBTcAfQUtABIHCgAwBRAAKQTgAAcE0QBQAjEAhANYABQCMQAMA2sANQOcAAMClAAxBFQAWgSBAHwEMABPBIQATwRLAFMC1gAtBIkAUgRxAHkCCwB9AgH/tQQtAH0CCwCMBvYAfARzAHkEjgBPBIEAfASLAE8C0AB8BCEASwKpAAgEcgB3A/UAFgXyACEEBgAfA+UADAQGAFICrwA4AgIArgKvABsFUQB1Ah4AhgR9AGQEtQBeBZ0AXQTgABkB/ACIBPgAWgOFAF0GRABXA5EAjQPiAFcEbQB/BkQAVwPbAIcDCgB/BEoAXwL2ADwC9gA3ApsAcAS7AJID7QBFAkIAjgIQAG0C9gCAA6cAdwPiAF0F0ABZBisAUAZXAGcD5ABCB4X/9gREAE0FhABpBMoAlATnAIgGwQBIBKcAZwSRAEMEiABPBJcAggWwAB8CGgCPBJgAjgRkACICTwAhBZMAkASIAH4HtABkBzoAWwIMAIsFiABRAtD/5AWKAFgEngBPBaQAfQTyAHcCJv+1BDwAWQPmAJQDsAByA9wAhwN8AHUCCwCBArIAeAJNACkD2AB6Ax8ASQJsAIIAAPyOAAD9XgAA/HMAAP0+AAD8DAAA/RwCXQDGBDwAZwJCAI4EdQCbBb8AGQV6AFsFOAAgBJAAbAWxAJsEkABHBe8ASgWqAEQFWwBrBIQAVgTGAJYEDgAgBIgAVARgAGAEGgBhBIgAfgShAHMCqgCpBGoAFgQTAGQE8wAtBIgAgAQ3AFIEkABSBC0APwRgAIAF0ABEBckATwaUAGYEswB2BHv/4QZxADMF/gAiBVkAaAiIAC0IjwCbBlsAMQWqAJIFCACQBgYAJAeiABYE1gBJBagAlAWpAC0FCgA5Bl8ATwX5AJIFiQCOB5sAmAf5AJgGGgAYBvkAmwUHAJAFUABrB1QAoAT3ACAEfQBbBI8AjwNaAIUE9gAnBnYAHgQWAE0EmACGBG4AjwSaACEGAwCPBJcAhgSYAIYD9QAjBdMAVATTAIYEZgBfBo4AhgbsAH4FFwAfBm8AjwRoAI8EPABRBoQAkQRwACcEcf/bBDwAVAbRAB4G5ACGBIn/7gSYAIYHSQCIBk8AcARn/+AHKACYBgEAhgUMABwEYAAKB0IArAY2AJ0G7QCABeYAggkyAKMH+QCPBCAAKAPwADMFegBfBIgATwUaABAEDgAgBXoAXwSIAE8HRQCIBkQAdAdJAIgGTwBwBRoAZgRKAFwE/wBtAAD8ZgAA/HMAAP17AAD9pQAA+iQAAPpNBGf/4AUTAJQEhgB8BGoAjwOhAH4EtwCbBCAAfgUsAJAEqwCOBpUANAWkAD0H0ACUBaoAfghHAJsG9QB+BioAZwT/AGEHMQAtBXAAJgV0AIAEcwB0BYcAhQYkABYEw//LBSEAkAR4AI4FrwCbBIgAfgWIAFEEpgBbBKYAXQTHADQDUwAtBQcAUgbxAGgG3QBeBlMAPAUoAC8EewBIBD4AdAe+AEIGnQBAB/0AlAaeAHcFBABdBCwAVQWqACEFHQBEBVUAgQMsAGcEFAAACCkAAAQUAAAIKQAAArkAAAIKAAABXAAABH8AAAIwAAABogAAANEAAAAAAAACoQBHAqEARwUpAJ0GMACBA50ABAHAAGMBvAAzAc4AMgGoAEoDFABsAxsAQAMIADIEXQBABJkAXALLAIgD+gCKBaYAigFsAEcHpwBKAnIAbAJpAFQDnAAtAvYANQNcAGkEtQBfBnAAIQa4AJgIkwCUB4gANQaMAHwEjABeBfUAIQQ0ACgEogAhBV4ATwV9ACgF5ABwA+IATAguAJAFCQBtBRQAlgY1AFkG3QBUBtEAWwaiAFgEkQBiBZYApgTZAEAEgwCeBLIAOwhFAF4CLf+vBI4AZQR6AJEEEQA8BCoAgAQMACQCWwChApgAYwHxAEUFGwAtBKgAGAS8AC0HIwAtByMALQURAC0GtwBLAAAAAAgwAFkINQBcBDMAOgSTAE8CEP+wAbMAXAOhAHUDoQB1A6EAdQQLAHUECwB1BAv/TAQLAHoDoQB1AgUAlASeAAkEYAB2BIAATwR6AHYD4AB2A8UAdgSmAFQE3gB2AfwAhQPVACQEWwB2A7kAdgYGAHYE3QB2BMAATwRtAHYEwABMBFwAdgQ0AD4EOwAkBIQAZwR7AAkGBwAoBF4AFQQ8AAUEKgBBAvYASwL2AIAC9gA8AvYANwL2ADUC9gBPAvYATQL2ADYC9gBLAvYARgO5AJACsgCWBDsACgS7AFYFRACbBSgAmwQwAIEFOQCbBC0AgQQ0AD4EZgA4BE0ADgO5AHYEewAJBMAATwR7AAkDmABCBNgAdgQZAEQFnQBQBVQAUATkAF8FkQAkBIAATwdUACQHVwB2BZcAJATXAHYEcQB2BVkAJwY6ABoERgBCBOQAdgRcAHYEywAkBEYAHwVdAHYEjABBBoQAdgcKAHYFWgAKBiAAdgRnAHYEgAA8BpIAdgSIAEMEIgAKBpIAGgSdAHYFGgB2BW4AJAXwAE8EWgAFBMQAFQaVACQEjABBBIwAdgX+AAoE0gBPBEYAQgTAAE8EZgA4A/cARgg2AHYE6wAoBIgAfAQ9AFAEmABPA6QAWwShAEwElAB8BJ8ATwRLAFMEiQBRBXoAawWiAGsFhgCbBeAAawXiAGsEGwCXBIIAbgO5AHYEVwAPBL4ANQL2AEsC9gA1AvYATwL2AE0C9gA2AvYASwL2AEYEawBmBC4AQwaYAE8EtABzBOsAYgIm/7UCJv+1AhsAjwIb//sCGwCPBGAAdgH+AAACoABHBVj/9wVY//cEj//UBNsALQKp/+gFUwASBVMAEgVTABIFUwASBVMAEgVTABIFUwASBTkAZgSGAJQEhgCUBIYAlASGAJQCQv/IAkIAowJC/8sCQv+/Ba4AlAWGAGYFhgBmBYYAZgWGAGYFhgBmBTcAfQU3AH0FNwB9BTcAfQTgAAcEVABaBFQAWgRUAFoEVABaBFQAWgRUAFoEVABaBDAATwRLAFMESwBTBEsAUwRLAFMCGv+0AhoAjwIa/7cCGv+rBHMAeQSOAE8EjgBPBI4ATwSOAE8EjgBPBHIAdwRyAHcEcgB3BHIAdwPlAAwD5QAMBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBTkAZgQwAE8FOQBmBDAATwU5AGYEMABPBTkAZgQwAE8FOgCUBRoATwSGAJQESwBTBIYAlARLAFMEhgCUBEsAUwSGAJQESwBTBIYAlARLAFMFcgBqBIkAUgVyAGoEiQBSBXIAagSJAFIFcgBqBIkAUgWvAJQEcQB5AkL/swIa/58CQv+5Ahr/pQJC/98CGv/LAkIAFwILAAACQgCdBrMAowQMAH0EcQAtAib/tQULAJQELQB9BFQAlAILAIoEVACUAgsAVQRUAJQCoQCMBFQAlALnAIwFrgCUBHMAeQWuAJQEcwB5Ba4AlARzAHkEc/+lBYYAZgSOAE8FhgBmBI4ATwWGAGYEjgBPBP4AlALQAHwE/gCUAtAATwT+AJQC0AA4BNQASgQhAEsE1ABKBCEASwTUAEoEIQBLBNQASgQhAEsE1ABKBCEASwTbAC0CqQAIBNsALQKpAAgE2wAtAtEACAU3AH0EcgB3BTcAfQRyAHcFNwB9BHIAdwU3AH0EcgB3BTcAfQRyAHcFNwB9BHIAdwcKADAF8gAhBOAABwPlAAwE4AAHBNEAUAQGAFIE0QBQBAYAUgTRAFAEBgBSB4X/9gbBAEgFhABpBIgATwR6/6YEev+mBDsAJASeAAkEngAJBJ4ACQSeAAkEngAJBJ4ACQSeAAkEgABPA+AAdgPgAHYD4AB2A+AAdgH8/6YB/ACDAfz/qQH8/50E3QB2BMAATwTAAE8EwABPBMAATwTAAE8EhABnBIQAZwSEAGcEhABnBDwABQSeAAkEngAJBJ4ACQSAAE8EgABPBIAATwSAAE8EegBqA+AAdgPgAHYD4AB2A+AAdgPgAHYEpgBUBKYAVASmAFQEpgBUBN4AdgH8/5EB/P+XAfz/vQH8ABUB/AB8A9UAJARbAHYDuQB2A7kAdgO5AHYDuQB2BN0AdgTdAHYE3QB2BMAATwTAAE8EwABPBFwAdgRcAHYEXAB2BDQAPgQ0AD4ENAA+BDQAPgQ7ACQEOwAkBDsAJASEAGcEhABnBIQAZwSEAGcEhABnBIQAZwYHACgEPAAFBDwABQQqAEEEKgBBBCoAQQVTABIE6v9KBhP/UwKm/1YFmv+nBUT+4QVv/7ICqv+HBVMAEgUMAJQEhgCUBNEAUAWvAJQCQgCjBQsAlAcBAJQFrgCUBYYAZgUdAJQE2wAtBOAABwUQACkCQv+/BOAABwSEAFYEYABgBIgAfgKqAKkEYACABJgAjgSOAE8EuwCSA/UAFgQGAB8Cqv/MBGAAgASOAE8EYACABpQAZgSGAJQEdQCbBNQASgJCAKMCQv+/BHEALQUoAJsFCwCUBQoAOQVTABIFDACUBHUAmwSGAJQFqACUBwEAlAWvAJQFhgBmBbEAmwUdAJQFOQBmBNsALQUQACkEVABaBEsAUwSYAIYEjgBPBIEAfAQwAE8D5QAMBAYAHwRLAFMDWgCFBCEASwILAH0CGv+rAgH/tQRuAI8D5QAMBwoAMAXyACEHCgAwBfIAIQcKADAF8gAhBOAABwPlAAwBWgBSApgAZQRKAI8CJv+xAbwAMwcBAJQG9gB8BVMAEgRUAFoEhgCUBagAlARLAFMEmACGBaoARAXJAE8FGgAQBA7/8QhzAE8JawBmBNYASQQWAE0FOQBmBDAATwTgAAcEDgAgAkIAoweiABYGdgAeAkIAowVTABIEVABaBVMAEgRUAFoHhf/2BsEASASGAJQESwBTBYgAUQQ8AFkEPABZB6IAFgZ2AB4E1gBJBBYATQWoAJQEmACGBagAlASYAIYFhgBmBI4ATwV6AF8EiABPBXoAXwSIAE8FUABrBDwAUQUKADkD5QAMBQoAOQPlAAwFCgA5A+UADAWJAI4EZgBfBvkAmwZvAI8FEAApBAYAHwSEAE8FqQAtBJoAIQVTABIEVABaBVMAEgRUAFoFUwASBFQAWgVTABAEVP+aBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBVMAEgRUAFoFUwASBFQAWgVTABIEVABaBVMAEgRUAFoFUwASBFQAWgSGAJQESwBTBIYAlARLAFMEhgCUBEsAUwSGAJQESwBTBIb/1QRL/44EhgCUBEsAUwSGAJQESwBTBIYAlARLAFMCQgCjAhoAjwJCAJQCCwB4BYYAZgSOAE8FhgBmBI4ATwWGAGYEjgBPBYYAJwSO/6MFhgBmBI4ATwWGAGYEjgBPBYYAZgSOAE8FigBYBJ4ATwWKAFgEngBPBYoAWASeAE8FigBYBJ4ATwWKAFgEngBPBTcAfQRyAHcFNwB9BHIAdwWkAH0E8gB3BaQAfQTyAHcFpAB9BPIAdwWkAH0E8gB3BaQAfQTyAHcE4AAHA+UADATgAAcD5QAMBOAABwPlAAwEogBPBKIATwUoAJsEbgCPBa8AlASXAIYE2wAtA/UAIwUQACkEBgAfBYkAjgRmAF8FiQCOBGYAXwR1AJsDWgCFB6IAFgZ2AB4GJAAWBMP/ywRxAHkFB//QBQf/0AR1//ADWv/iBTz/4wRE/64FqACUBJgAhgWvAJQElwCGBwEAlAYDAI8FqQAtBJoAIQTgAAcEDgAgBRAAKQQGAB8EYABgBGUAAgYwAIEEjABRBIwATwSMADQEjACBBKAAXQS0AH0FcgBqBIkAUgWuAJQEcwB5BVMAEgRUAA0EhgBIBEsAAQJC/vYCGv7iBYYAZgSOABYE/gAyAtD/bgU3AHEEcgAPBN/+rAUMAJQEgQB8BToAlASEAE8FOgCUBIQATwWvAJQEcQB5BQsAlAQtAH0FCwCUBC0AfQRUAJQCCwB4BwEAlAb2AHwFrgCUBHMAeQUdAJQEgQB8BP4AlALQAHIE1ABKBCEASwTbAC0CqQAIBS0AEgP1ABYFLQASA/UAFgcKADAF8gAhBNEAUAQGAFIFzP4cBJ4ACQQc/yoFGv83Ajj/OQTK/5MEeP7oBO7/pASeAAkEYAB2A+AAdgQqAEEE3gB2AfwAhQRbAHYGBgB2BMAATwRtAHYEOwAkBDwABQReABUB/P+dBDwABQPgAHYDuQB2BDQAPgH8AIUB/P+dA9UAJARbAHYERgAfBJ4ACQRgAHYDuQB2A+AAdgTkAHYGBgB2BN4AdgTAAE8E2AB2BG0AdgSAAE8EOwAkBF4AFQRGAEIE3gB2BIAATwQ8AAUF/gAKBOQAdgRGAB8FnQBQBVMAEgRUAFoEhgCUBEsAUwIaAHgAAAABAAAE5AkLBAAAAgICAwYFBwYCAwMEBQIDAwQFBQUFBQUFBQUFAgIFBQUECAYGBgYFBQYGAwUGBQgGBgYGBgUFBgYIBgUFAgQCBAQDBQUFBQUDBQUCAgUCCAUFBQUDBQMFBAcFBAUDAgMGAgUFBgUCBgQHBAQFBwQDBQMDAwUEAwIDBAQHBwcECAUGBQYIBQUFBQYCBQUDBgUJCAIGAwYFBgYCBQQEBAQCAwMEBAMAAAAAAAADBQMFBgYGBQYFBwYGBQUFBQUFBQUDBQUGBQUFBQUHBwcFBQcHBgoKBwYGBwkFBgYGBwcGCQkHCAYGCAYFBQQGBwUFBQUHBQUEBwUFBwgGBwUFBwUFBQgIBQUIBwUIBwYFCAcIBwoJBQQGBQYFBgUIBwgHBgUGAAAAAAAABQYFBQQFBQYFBwYJBgkIBwYIBgYFBgcFBgUGBQYFBQUEBggIBwYFBQkHCQcGBQYGBgQFCQUJAwICBQICAQADAwYHBAICAgIDBAMFBQMEBgIJAwMEAwQFBwgKCAcFBwUFBgYHBAkGBgcICAcFBgUFBQkCBQUFBQUDAwIGBQUICAYIAAkJBQUCAgQEBAUFBQUEAgUFBQUEBAUFAgQFBAcFBQUFBQUFBQUHBQUFAwMDAwMDAwMDAwQDBQUGBgUGBQUFBQQFBQUEBQUGBgYGBQgIBgUFBgcFBgUFBQYFBwgGBwUFBwUFBwUGBgcFBQcFBQcFBQUFBAkGBQUFBAUFBQUFBgYGBwcFBQQFBQMDAwMDAwMFBQcFBgICAgICBQIDBgYFBQMGBgYGBgYGBgUFBQUDAwMDBgYGBgYGBgYGBgUFBQUFBQUFBQUFBQUCAgICBQUFBQUFBQUFBQQEBgUGBQYFBgUGBQYFBgUGBgUFBQUFBQUFBQUGBQYFBgUGBQYFAwIDAgMCAwIDCAUFAgYFBQIFAgUDBQMGBQYFBgUFBgUGBQYFBgMGAwYDBQUFBQUFBQUFBQUDBQMFAwYFBgUGBQYFBgUGBQgHBQQFBQUFBQUFCAgGBQUFBQUFBQUFBQUFBAQEBAICAgIFBQUF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AAADfwAABBsAAAQbAAAA3AAABBwAAAQiAAADhwAABCMAAAQkAAAA3QAABCUAAAQlAAADjgAABCYAAAQvAAAA3wAABDAAAAQwAAADjwAABDEAAAQ0AAAA6QAABDUAAAQ1AAADkAAABDYAAAQ4AAAA7QAABDkAAAQ5AAADkQAABDoAAAQ9AAAA8AAABD4AAAQ+AAADkgAABD8AAAQ/AAAA9AAABEAAAARBAAADkwAABEIAAARCAAAA9QAABEMAAARDAAADlQAABEQAAAREAAAA9gAABEUAAARFAAADlgAABEYAAARPAAAA9wAABFAAAARQAAADsgAABFEAAARRAAADlwAABFIAAARSAAABAQAABFMAAARTAAADmAAABFQAAARUAAABAgAABFUAAARYAAADmQAABFkAAARbAAABAwAABFwAAARcAAADnQAABF0AAARdAAADswAABF4AAAReAAADngAABF8AAARhAAABBgAABGIAAARiAAAEXAAABGMAAARvAAABCQAABHAAAARxAAADtAAABHIAAAR1AAABFgAABHYAAAR3AAADtgAABHgAAAR4AAADuQAABHkAAAR5AAADuAAABHoAAASGAAABGgAABIgAAASJAAABJwAABIoAAASLAAAEYQAABIwAAASMAAAEWwAABI0AAASRAAABKQAABJIAAASTAAAEXQAABJQAAASVAAABLgAABJYAAASXAAAEVgAABJgAAASZAAADugAABJoAAASbAAAESAAABJwAAASdAAABMAAABJ4AAASfAAAEXwAABKAAAAShAAABMgAABKIAAASjAAAESgAABKQAAASpAAABNAAABKoAAASrAAADvAAABKwAAAStAAAETAAABK4AAASvAAADvgAABLAAAASxAAAEaQAABLIAAASzAAAETgAABLQAAAS1AAABOgAABLYAAAS3AAAEUAAABLgAAAS6AAABPAAABLsAAAS7AAAEWgAABLwAAAS9AAABPwAABL4AAAS/AAAEWAAABMAAAATCAAADwAAABMMAAATEAAABQQAABMUAAATGAAAEZwAABMcAAATIAAABQwAABMkAAATKAAAEYwAABMsAAATMAAAEUgAABM0AAATOAAAEZQAABM8AAATXAAADwwAABNgAAATYAAABRQAABNkAAATZAAADzQAABNoAAATaAAADzAAABNsAAATfAAADzgAABOAAAAThAAABRgAABOIAAAT1AAAD0wAABPYAAAT3AAAEVAAABPgAAAT5AAAD5wAABPoAAAT7AAABSAAABPwAAAT9AAAD6QAABP4AAAT/AAAEawAABQAAAAUAAAABSgAABQEAAAUBAAAD6wAABQIAAAUQAAABSwAABREAAAURAAAEbQAABRIAAAUTAAAD7AAAHgAAAB4BAAADrgAAHj4AAB4/AAADrAAAHoAAAB6FAAADnwAAHqAAAB7xAAAD7gAAHvIAAB7zAAADpQAAHvQAAB75AAAEQAAAH00AAB9NAAAEqQAAIAAAACALAAABWwAAIBAAACARAAABZwAAIBMAACAUAAABaQAAIBUAACAVAAAEbwAAIBcAACAeAAABawAAICAAACAiAAABcwAAICUAACAnAAABdgAAIDAAACAwAAABeQAAIDIAACAzAAADpwAAIDkAACA6AAABegAAIDwAACA8AAADqQAAIEQAACBEAAABfAAAIHQAACB0AAABfQAAIH8AACB/AAABfgAAIKMAACCjAAAEbgAAIKQAACCkAAABfwAAIKYAACCqAAABgAAAIKsAACCrAAAERwAAIKwAACCsAAABhQAAILEAACCxAAABhgAAILkAACC6AAABhwAAILwAACC9AAABiQAAIQUAACEFAAABiwAAIRMAACETAAABjAAAIRYAACEWAAABjQAAISIAACEiAAABjgAAISYAACEmAAAAuQAAIS4AACEuAAABjwAAIVsAACFeAAABkAAAIgIAACICAAABlAAAIgYAACIGAAAAsQAAIg8AACIPAAABlQAAIhEAACISAAABlgAAIhoAACIaAAABmAAAIh4AACIeAAABmQAAIisAACIrAAABmgAAIkgAACJIAAABmwAAImAAACJgAAABnAAAImQAACJlAAABnQAAJcoAACXKAAABnwAA7gEAAO4CAAABoAAA9sMAAPbDAAABogAA+wEAAPsEAAABpAAA/v8AAP7/AAABqgAA//wAAP/9AAABq7AALEuwCVBYsQEBjlm4Af+FsIQdsQkDX14tsAEsICBFaUSwAWAtsAIssAEqIS2wAywgRrADJUZSWCNZIIogiklkiiBGIGhhZLAEJUYgaGFkUlgjZYpZLyCwAFNYaSCwAFRYIbBAWRtpILAAVFghsEBlWVk6LbAELCBGsAQlRlJY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seix/7IWsi6yRbJcsnOyi7KdsrSyy7LisvmzEbMoszqzUbNps4Czl7Ops7+z1bPstAS0ELQctDO0RbRbtHK0iLSetLW0zbTetPW1B7UdtS61RrVdtW+1hbWcta61xbXcte22BLYbtoW3J7c5t0u3Yrd4t4+3pre4t8m327fruAK4E7gquEC4V7huuNu5crmJuZq5sbnHud659LoLuiK6LrpAule6abqAupK6qbrAute67rr5uwS7G7snuzO7Srthu227ebuQu6e7s7u/u9S76bv1vAG8GLwqvDa8QrxZvGq8f7yWvKe8vrzVvO29Bb0XvSm9Nb1BvVO9ZL12vYi9n721vcG9zb3ZveW9974IvhS+IL4svji+T75bvnK+iL6avrC+x77evvG/BL8cvy+/jb/vwAbAHcA0wErAYsB5wJDAp8C+wNDA4cD4wQrBIcE4wWjBmMGowb/B1sHswf3CFcItwjnCRcJcwnPCicKgwrfCzcLkwvzDDsMlwzfDTcNew3bDjcOkw7rD0sPpw//EFsR9xI/EpcS8xM3E3sT0xQrFIcWOxaTFusXRxejF9MYKxhzGM8ZKxlXGa8aCxo7GpMawxsXG0cboxvTHC8ccxzPHRsdYx2THdceHx53Hqce6x8bH3Mfox/7ID8gmyDnITMityMTI2sjxyQjJH8k1yUDJTMlYyWTJcMl8yYjJo8mrybPJu8nDycvJ08nbyePJ68nzyfvKA8oLyhPKK8pDylXKZ8p5yorKpMqsyrTKvMrEyszK5Mr7yw3LH8sxy0nLYMvOy9bL7sv2y/7MFcwszDTMPMxEzEzMY8xrzHPMe8yDzIvMk8ybzKPMq8yzzMrM0szazS7NNs0+zVXNbM10zXzNlM2czbPNyc3gzffODs4lzjjOS85iznPOh86mzrLOxM7MzuPO9c8Bzw3PJM87z1LPac9xz3nPkc+pz7XPwc/Nz9nP5c/xz/nQAdAJ0CDQN9A/0FbQbdCF0JzQpNCs0MPQ2dDx0PnRENEo0UDRWNFv0YbRnNG00czR5NH80gTSDNIk0jvSU9Jq0nzSjdKl0rzS1NLs0wTTG9M301PTX9Nr03PTf9OL05fTo9O108fT4NPy1AvUHdQw1ELUVdRn1HfUhtSZ1KvUvtTQ1OPU9dUI1RrVKtU61UbVUtVk1XbViNWZ1bLVxNXd1e/WAtYU1ifWOdZJ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CRCwBtCwBi+wAdCwAS8wMf//AI//8gPIBbAAJgAFAAAABwAFAiUAAP///7H+SwJzBd8CJgCbAAABBwCe/z//3gAJALAAL7AR3DAxAP//ADMEAAFlBgACBgFtAAD//wCUAAAGagc2AiYAMQAAAQcAdQKQATYAEwCwAEVYsAIvG7ECHz5ZsBHcMDEA//8AfAAABnkGAAImAFEAAAEHAHUCoAAAAAkAsAMvsCDcMDEA//8AEv5tBUIFsAImACUAAAAHAKYBegAD//8AWv5xA/sETgImAEUAAAAHAKYArQAH//8AlAAABEwHPQImACkAAAEHAEQA6AE9ABMAsABFWLAGLxuxBh8+WbAN3DAxAP//AJQAAAUNBz0CJgDbAAABBwBEAUoBPQATALAARViwCC8bsQgfPlmwC9wwMQD//wBT/+wECwYAAiYASQAAAQcARAChAAAAEwCwAEVYsAgvG7EIGz5ZsB/cMDEA//8AhgAABBIF8wImAO8AAAEHAEQAxP/zABMAsABFWLAILxuxCBs+WbAL3DAxAP//AEQAAAVcBbACBgC4AAD//wBP/iIFfgQ6AgYAzAAA//8AEAAABPMG/AImARgAAAEHAKsESQEOABYAsABFWLAPLxuxDx8+WbAR3LAV0DAx////8QAABBgF0AImARkAAAEHAKsD5f/iABYAsABFWLARLxuxERs+WbAT3LAX0DAx//8AT/5LCGQETgAmAFMAAAAHAF0EjgAA//8AZv5LCVwFxAAmADMAAAAHAF0FhgAA//8ASf46BH8FwwImANoAAAAHAbABkv+g//8ATf47A8QETQImAO4AAAAHAbABOf+h//8AZv4+BOsFxAImACcAAAAHAbAB1v+k//8AT/4+A/UETgImAEcAAAAHAbABSv+k//8ABwAABNYFsAIGAD0AAP//ACD+XwP1BDoCBgC8AAD//wCjAAABnwWwAgYALQAA//8AFgAAB5sHIwImANkAAAEHAKACHQE9ABMAsABFWLANLxuxDR8+WbAZ3DAxAP//AB4AAAZcBdkCJgDtAAABBwCgAYf/8wATALAARViwDS8bsQ0bPlmwGdwwMQD//wCjAAABnwWwAgYALQAA//8AEgAABUIHHAImACUAAAEHAKAA9gE2ABMAsABFWLAELxuxBB8+WbAO3DAxAP//AFr/7AP7BeYCJgBFAAABBwCg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ALAARViwBy8bsQcfPlmxDwn0sBXQMDEA//8AU//sBMgGfAImAEkAAAEGAbc97AAMALAIL7Ag3LAl0DAx////1QAABEwHtQImACkAAAEHAbYAiQEyABcAsABFWLAGLxuxBh8+WbEPCfSwFNAwMQD///+O/+wECwZ5AiYASQAAAQYBtkL2AAwAsAgvsB7csCXQMDH//wCUAAAEkgflAiYAKQAAAQcBtQCIARoADACwBi+wDNywE9AwMf//AFP/7ARLBqkCJgBJAAABBgG1Qd4ADACwCC+wHtywJdAwMf//AJQAAARMB90CJgApAAABBwG0AIkBDAAMALAGL7AM3LAT0DAx//8AU//sBAsGoQImAEkAAAEGAbRC0AAMALAIL7Ae3LAl0DAx//8AlP6eBEwHPgImACkAAAAnAJ0AiAE9AAcArATLAAr//wBT/pQECwYBAiYASQAAACYAnUEAAAcArASPAAD//wCjAAACEQfCAiYALQAAAQcAqgN4AUMACQCwAi+wBNwwMQD//wCPAAAB/QZ+AiYAjAAAAQcAqgNk//8ACQCwAi+wBNwwMQD//wCU/poBpwWwAiYALQAAAAcArAN4AAb//wB4/p4BkAXVAiYATQAAAAcArANcAAr//wBm/pQFHgXEAiYAMwAAAAcArAUdAAD//wBP/pIEPQROAiYAUwAAAAcArASd//7//wBm/+wFHge7AiYAMwAAAQcAqgUcATwACQCwFC+wH9wwMQD//wBP/+wEPQaFAiYAUwAAAQcAqgSYAAYACQCwBC+wG9wwMQD//wBm/+wFYQexAiYAMwAAAQcBtwDWASEADACwFC+wIdywJtAwMf//AE//7ATdBnwCJgBTAAABBgG3UuwADACwBC+wHdywItAwMf//ACf/7AUeB64CJgAzAAABBwG2ANsBKwAMALAUL7Af3LAm0DAx////o//sBD0GeQImAFMAAAEGAbZX9gAMALAEL7Ab3LAi0DAx//8AZv/sBR4H3gImADMAAAEHAbUA2gETAAwAsBQvsB/csCbQMDH//wBP/+wEYAapAiYAUwAAAQYBtVbeAAwAsAQvsBvcsCLQMDH//wBm/+wFHgfWAiYAMwAAAQcBtADbAQUADACwFC+wH9ywJtAwMf//AE//7AQ9BqECJgBTAAABBgG0V9AADACwBC+wG9ywItAwMf//AGb+lAUe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GzIcqB5aIBg63iFOIuA5MiUuOt463jb2Ot463iX4J5I5oChwKTIpwCoeKvg5KCuCOZAsTCx2Ldw23DBiMKAx0jOQNtwyVDLaMwQzWjOQN0A3+DakOCQztjbcOco5KDqMOow5KDaeM+A2njaeNp41UjV4NYI1jDWqNbw1zjXgNso7ijuKO4o7ijg+N0A3QDdAN0A3QDdAN0A2yjfYN9g32DfYOt463jreOt463juKO4o7ijuKO4o4HjgeOB44HjsAN7Y3tje2N7Y3tje2N7Y37jfuN+437jmWN/g3+Df4N/g3+DgkOCQ3QDe2N0A3tjdAN7Y2yjbKNso2yjuKN9g37jfYN+432DfuN9g37jfYN+463jmWOt463jreOt463jgeOow16jXqNeo16jreOZY63jmWOt45ljmWO4o3+DuKN/g7ijf4Nhg2GDYYOD44Pjg+OB44HjgeOB44HjgeNng7ADgkOwA2KjYqNio3QDfYOt463juKOwA3QDZMN9g2KjreOt46jDreOt47ijZWOD47ADkyOt47ADmWN/g4JDf4N9g5yjreOt44HjqMOow29jdANkw5yjfYOt463juKNlY2yjg+OTI3tjfuN/g23DgkOZA37jkoOCQ2eDZ4Nng7ADgkNp42njaeOt45ljdAN7Y32DfuNqQ4JDbKOwA4JDreOTI5kDreN0A3tjdAN7Y32DfuN+437jkyOZA7ijf4N/g23Db2OCQ29jgkNvY4JDkyOZA3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y3QDe2N0A3tjdAN7Y32DfuN9g37jfYN+432DfuN9g37jfYN+432DfuN9g37jreOt47ijf4O4o3+DuKN/g7ijf4O4o3+DuKN/g7ijf4N/g4HjgeOwA4JDsAOCQ7ADgkOow63jg+OTI5kDnKOSg5MjmQOZY5oDnKOow63jreOwA7igACAIsABAAEAAAABgAGAAEACwAMAAIAEwATAAQAJQAqAAUALAA2AAsAOAA/ABYARQBGAB4ASQBKACAATABMACIATwBPACMAUQBUACQAVgBWACgAWABYACkAWgBdACoAXwBfAC4AigCKAC8AnACcADAAsAC0ADEAtgC4ADYAugC6ADkAvAC8ADoAvwDAADsAwgDCAD0AxADEAD4AxgDNAD8A0QDRAEcA0wDdAEgA3wDfAFMA4QDjAFQA5QDuAFcA8ADwAGEA9QD3AGIA+gD7AGUA/QD/AGcBAgEEAGoBCQEJAG0BDAEMAG4BFwEZAG8BIQEhAHIBKwEtAHMBMAEwAHYBMgEyAHcBSQFJAHgBbAFtAHkBbwFxAHsBugG6AH4BvQG9AH8BxAHFAIAByAHIAIIBygHLAIMBzQHNAIUCKAIoAIYCKgIrAIcCRgJHAIkCSQJJAIsCSwJsAIwCbgJxAK4CdgJ7ALICgAKIALgCigKKAMECjAKMAMICjgKOAMMCkAKQAMQCkgKbAMUCpAKmAM8CqAKoANICqgKqANMCrAKsANQCrgKuANUCsQKxANYCswKzANcCtQK1ANgCtwK3ANkCuQK5ANoCuwK7ANsCvQLJANwCywLLAOkCzQLNAOoCzwLPAOsC2gLaAOwC3ALcAO0C3gLeAO4C4ALgAO8C4gLiAPAC5ALkAPEC5gLmAPIC6ALoAPMC6gLqAPQC7ALsAPUC7gLxAPYC8wLzAPoC9QL1APsDUgNXAPwDWgNpAQIDbANsARIDcANwARMDcgNyARQDdgN2ARUDeQN6ARYDfAOFARgDhwOJASIDiwOQASUDkgOTASsDlQOYAS0DngOfATEDoQOhATMDowOjATQDpQOoATUDqwOwATkDsgOyAT8DtgO3AUADvAO8AUIDvgPHAUMDygPLAU0DzQPQAU8D1wPYAVMD3APcAVUD3gPkAVYD6QPqAV0D7gQWAV8EGAQYAYgEGgQnAYkELwQvAZcEMgQyAZgENAQ0AZkEQARFAZoESARIAaAESgRKAaEETARMAaIETgRPAaMEVARXAaUEWgRaAakEXARdAaoEXwRfAawEYwRjAa0EZQRlAa4EaQRpAa8EqQSpAbAACgA4/8QA0f/EANX/xAEy/8QBOv/EAtr/xALc/8QC3v/EA43/xARM/8QAFQA6ABQAOwAmAD0AFgEYABQCZQAWAuwAJgLuABYC8AAWA1cAFgNmABYDaQAWA58AJgOhACYDowAmA6UAFgO2ABQDvgAWBEAAFgRCABYERAAWBGkAFgABABP/CADOABD+7gAS/u4AJf9AAC7/MAA4ABQARf/eAEf/6wBI/+sASf/rAEv/6wBT/+sAVf/rAFb/5gBZ/+oAWv/oAF3/6ACT/+sAmP/rAJr/6gCx/0AAs/9AALr/6wC8/+gAx//rAMj/6wDK/+oA0QAUANUAFAD2/+sBAv/rAQz/QAEX/+sBGf/oAR3/6wEh/+sBMgAUATn/6wE6ABQBS//rAUz/6wFW/+sBbv7uAXL+7gF2/u4Bd/7uAbr/wAJL/0ACTP9AAk3/QAJO/0ACT/9AAlD/QAJR/0ACZv/eAmf/3gJo/94Caf/eAmr/3gJr/94CbP/eAm3/6wJu/+sCb//rAnD/6wJx/+sCd//rAnj/6wJ5/+sCev/rAnv/6wJ8/+oCff/qAn7/6gJ//+oCgP/oAoH/6AKC/0ACg//eAoT/QAKF/94Chv9AAof/3gKJ/+sCi//rAo3/6wKP/+sCkf/rApP/6wKV/+sCl//rApn/6wKb/+sCnf/rAp//6wKh/+sCo//rArH/MALF/+sCx//rAsn/6wLaABQC3AAUAt4AFALh/+oC4//qAuX/6gLn/+oC6f/qAuv/6gLv/+gDUv9AA1r/QANq/+sDbv/qA3D/6wNy/+gDdf/qA3b/6wN3/+oDfv8wA4L/QAONABQDj//eA5D/6wOS/+sDlP/rA5X/6AOX/+sDnv/oA6b/6AOu/0ADr//eA7L/6wO3/+gDuP/rA73/6wO//+gDxP9AA8X/3gPG/0ADx//eA8v/6wPN/+sDzv/rA9j/6wPa/+sD3P/rA+D/6APi/+gD5P/oA+v/6wPu/0AD7//eA/D/QAPx/94D8v9AA/P/3gP0/0AD9f/eA/b/QAP3/94D+P9AA/n/3gP6/0AD+//eA/z/QAP9/94D/v9AA///3gQA/0AEAf/eBAL/QAQD/94EBP9ABAX/3gQH/+sECf/rBAv/6wQN/+sED//rBBH/6wQT/+sEFf/rBBv/6wQd/+sEH//rBCH/6wQj/+sEJf/rBCf/6wQp/+sEK//rBC3/6wQv/+sEMf/rBDP/6gQ1/+oEN//qBDn/6gQ7/+oEPf/qBD//6gRB/+gEQ//oBEX/6ARMABQAIAA4/98AOv/kADv/7AA9/90A0f/fANX/3wEY/+QBMv/fATr/3wG6AA4CZf/dAtr/3wLc/98C3v/fAuz/7ALu/90C8P/dA1f/3QNm/90Daf/dA43/3wOf/+wDof/sA6P/7AOl/90Dtv/kA77/3QRA/90EQv/dBET/3QRM/98Eaf/dABoAOP/OADr/7QA9/9AA0f/OANX/zgEY/+0BMv/OATr/zgJl/9AC2v/OAtz/zgLe/84C7v/QAvD/0ANX/9ADZv/QA2n/0AON/84Dpf/QA7b/7QO+/9AEQP/QBEL/0ARE/9AETP/OBGn/0AAQAC7/7gA5/+4CYf/uAmL/7gJj/+4CZP/uArH/7gLg/+4C4v/uAuT/7gLm/+4C6P/uAur/7gN+/+4EMv/uBDT/7gBKAAYAEAALABAADQAUAEEAEgBH/+gASP/oAEn/6ABL/+gAVf/oAGEAEwCT/+gAmP/oALr/6ADH/+gAyP/oAPb/6AEC/+gBHf/oASH/6AE5/+gBS//oAUz/6AFW/+gBbAAQAW0AEAFvABABcAAQAXEAEAJt/+gCbv/oAm//6AJw/+gCcf/oAon/6AKL/+gCjf/oAo//6AKR/+gCk//oApX/6AKX/+gCmf/oApv/6AKd/+gCn//oAqH/6AKj/+gDav/oA5D/6AOU/+gDl//oA6cAEAOoABADqwAQA7L/6AO4/+gDvf/oA8v/6APN/+gDzv/oA9r/6APr/+gEB//oBAn/6AQL/+gEDf/oBA//6AQR/+gEE//oBBX/6AQp/+gEK//oBC3/6AQx/+gAAgD1/9YBbf+YAD0AR//sAEj/7ABJ/+wAS//sAFX/7ACT/+wAmP/sALr/7ADH/+wAyP/sAPb/7AEC/+wBHf/sASH/7AE5/+wBS//sAUz/7AFW/+wCbf/sAm7/7AJv/+wCcP/sAnH/7AKJ/+wCi//sAo3/7AKP/+wCkf/sApP/7AKV/+wCl//sApn/7AKb/+wCnf/sAp//7AKh/+wCo//sA2r/7AOQ/+wDlP/sA5f/7AOy/+wDuP/sA73/7APL/+wDzf/sA87/7APa/+wD6//sBAf/7AQJ/+wEC//sBA3/7AQP/+wEEf/sBBP/7AQV/+wEKf/sBCv/7AQt/+wEMf/sABgAU//iARf/4gFtABgCd//iAnj/4gJ5/+ICev/iAnv/4gLF/+ICx//iAsn/4gNw/+IDdv/iA5L/4gPY/+ID3P/iBBv/4gQd/+IEH//iBCH/4gQj/+IEJf/iBCf/4gQv/+IABgAQ/4QAEv+EAW7/hAFy/4QBdv+EAXf/hAAQAC7/7AA5/+wCYf/sAmL/7AJj/+wCZP/sArH/7ALg/+wC4v/sAuT/7ALm/+wC6P/sAur/7AN+/+wEMv/sBDT/7AAeAAb/8gAL//IAWv/zAF3/8wC8//MA9f/1ARn/8wFs//IBbf/yAW//8gFw//IBcf/yAoD/8wKB//MC7//zA3L/8wOV//MDnv/zA6b/8wOn//IDqP/yA6v/8gO3//MDv//zA+D/8wPi//MD5P/zBEH/8wRD//MERf/zAD4AJ//zACv/8wAz//MANf/zAIP/8wCS//MAl//zALL/8wDDAA0A0v/zAQf/8wEW//MBGv/zARz/8wEe//MBIP/zATj/8wFV//MCKP/zAin/8wIr//MCLP/zAlL/8wJc//MCXf/zAl7/8wJf//MCYP/zAoj/8wKK//MCjP/zAo7/8wKc//MCnv/zAqD/8wKi//MCxP/zAsb/8wLI//MC+f/zA1b/8wNj//MDif/zA4z/8wO5//MDvP/zA9f/8wPZ//MD2//zBBr/8wQc//MEHv/zBCD/8wQi//MEJP/zBCb/8wQo//MEKv/zBCz/8wQu//MEMP/zBKn/8wA/ACf/5gAr/+YAM//mADX/5gCD/+YAkv/mAJf/5gCy/+YAt//CAMMAEADS/+YBB//mARb/5gEa/+YBHP/mAR7/5gEg/+YBOP/mAVX/5gIo/+YCKf/mAiv/5gIs/+YCUv/mAlz/5gJd/+YCXv/mAl//5gJg/+YCiP/mAor/5gKM/+YCjv/mApz/5gKe/+YCoP/mAqL/5gLE/+YCxv/mAsj/5gL5/+YDVv/mA2P/5gOJ/+YDjP/mA7n/5gO8/+YD1//mA9n/5gPb/+YEGv/mBBz/5gQe/+YEIP/mBCL/5gQk/+YEJv/mBCj/5gQq/+YELP/mBC7/5gQw/+YEqf/mADcAJf/kADz/0gA9/9MAsf/kALP/5ADD/+IA2f/SAQz/5AJL/+QCTP/kAk3/5AJO/+QCT//kAlD/5AJR/+QCZf/TAoL/5AKE/+QChv/kAu7/0wLw/9MDUv/kA1f/0wNa/+QDZv/TA2f/0gNp/9MDgv/kA47/0gOl/9MDrv/kA77/0wPB/9IDxP/kA8b/5APP/9ID6f/SA+7/5APw/+QD8v/kA/T/5AP2/+QD+P/kA/r/5AP8/+QD/v/kBAD/5AQC/+QEBP/kBED/0wRC/9MERP/TBE7/0gRW/9IEaf/TACcAEP9GABL/RgAl/80Asf/NALP/zQDG//IBDP/NAW7/RgFy/0YBdv9GAXf/RgJL/80CTP/NAk3/zQJO/80CT//NAlD/zQJR/80Cgv/NAoT/zQKG/80DUv/NA1r/zQOC/80Drv/NA8T/zQPG/80D7v/NA/D/zQPy/80D9P/NA/b/zQP4/80D+v/NA/z/zQP+/80EAP/NBAL/zQQE/80AAQDDAA4ArwBH/9wASP/cAEn/3ABL/9wAUf/BAFL/wQBT/9YAVP/BAFX/3ABZ/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAL7/5gDA/8EAwf/rAML/6QDE//AAxf/nAMf/3ADI/9wAyf/jAMr/3QDL/84AzP/UAM3/2wDr/8EA7//BAPD/wQDy/8EA8//BAPT/wQD2/9wA9//BAPn/wQD6/8EA/f/BAP//wQEC/9wBBP/BARf/1gEZ/+EBHf/cASH/3AE1/8EBOf/cAUT/wQFJ/8EBS//cAUz/3AFW/9wCbf/cAm7/3AJv/9wCcP/cAnH/3AJ2/8ECd//WAnj/1gJ5/9YCev/WAnv/1gJ8/90Cff/dAn7/3QJ//90CgP/hAoH/4QKJ/9wCi//cAo3/3AKP/9wCkf/cApP/3AKV/9wCl//cApn/3AKb/9wCnf/cAp//3AKh/9wCo//cAr7/wQLA/8ECwv/BAsP/wQLF/9YCx//WAsn/1gLh/90C4//dAuX/3QLn/90C6f/dAuv/3QLv/+EDav/cA2z/wQNu/90DcP/WA3L/4QN1/90Ddv/WA3f/3QOQ/9wDkf/BA5L/1gOT/8EDlP/cA5X/4QOX/9wDmP/BA53/wQOe/+EDpv/hA63/wQOy/9wDs//BA7f/4QO4/9wDvf/cA7//4QPL/9wDzf/cA87/3APU/8ED1v/BA9j/1gPa/9wD3P/WA+D/4QPi/+ED5P/hA+j/wQPr/9wEB//cBAn/3AQL/9wEDf/cBA//3AQR/9wEE//cBBX/3AQb/9YEHf/WBB//1gQh/9YEI//WBCX/1gQn/9YEKf/cBCv/3AQt/9wEL//WBDH/3AQz/90ENf/dBDf/3QQ5/90EO//dBD3/3QQ//90EQf/hBEP/4QRF/+EESf/BBEv/wQRV/8EEYv/BBGT/wQRm/8EAdgAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADB/+wAwwAPAMX/6gDH//AAyP/wAMn/zgDK/+8Ay//nAPb/8AEC//ABGf/cAR3/8AEh//ABOf/wAUv/8AFM//ABVv/wAWz/2gFt/9oBb//aAXD/2gFx/9oCbf/wAm7/8AJv//ACcP/wAnH/8AJ8/+8Cff/vAn7/7wJ//+8CgP/cAoH/3AKJ//ACi//wAo3/8AKP//ACkf/wApP/8AKV//ACl//wApn/8AKb//ACnf/wAp//8AKh//ACo//wAuH/7wLj/+8C5f/vAuf/7wLp/+8C6//vAu//3ANq//ADbv/vA3L/3AN1/+8Dd//vA5D/8AOU//ADlf/cA5f/8AOe/9wDpv/cA6f/2gOo/9oDq//aA7L/8AO3/9wDuP/wA73/8AO//9wDy//wA83/8APO//AD2v/wA+D/3APi/9wD5P/cA+v/8AQH//AECf/wBAv/8AQN//AED//wBBH/8AQT//AEFf/wBCn/8AQr//AELf/wBDH/8AQz/+8ENf/vBDf/7wQ5/+8EO//vBD3/7wQ//+8EQf/cBEP/3ARF/9wARAAQAAwAEgAMAEf/5wBI/+cASf/nAEv/5wBV/+cAk//nAJj/5wC6/+cAwwAPAMf/5wDI/+cA9v/nAQL/5wEd/+cBIf/nATn/5wFL/+cBTP/nAVb/5wFuAAwBcgAMAXYADAF3AAwCbf/nAm7/5wJv/+cCcP/nAnH/5wKJ/+cCi//nAo3/5wKP/+cCkf/nApP/5wKV/+cCl//nApn/5wKb/+cCnf/nAp//5wKh/+cCo//nA2r/5wOQ/+cDlP/nA5f/5wOy/+cDuP/nA73/5wPL/+cDzf/nA87/5wPa/+cD6//nBAf/5wQJ/+cEC//nBA3/5wQP/+cEEf/nBBP/5wQV/+cEKf/nBCv/5wQt/+cEMf/nAAYAyf/qAOz/7gD1/9UA/f/tATP/7AFY/+wAAQD1/8AAAQDJACAAfgAGAAwACwAMAEf/6ABI/+gASf/oAEoADABL/+gAU//qAFX/6ABaAAsAXQALAJP/6ACY/+gAuv/oALwACwDD/5AAxQALAMf/6ADI/+gAyQAMAPb/6AEC/+gBF//qARkACwEd/+gBIf/oATn/6AFL/+gBTP/oAVb/6AFsAAwBbQAMAW8ADAFwAAwBcQAMAbr/vwG8/+4BwP/sAcj/7QHK/+wBzP/1Ac0ADgHPAA0B0gANAm3/6AJu/+gCb//oAnD/6AJx/+gCd//qAnj/6gJ5/+oCev/qAnv/6gKAAAsCgQALAon/6AKL/+gCjf/oAo//6AKR/+gCk//oApX/6AKX/+gCmf/oApv/6AKd/+gCn//oAqH/6AKj/+gCxf/qAsf/6gLJ/+oC7wALA2r/6ANw/+oDcgALA3b/6gOQ/+gDkv/qA5T/6AOVAAsDl//oA54ACwOmAAsDpwAMA6gADAOrAAwDsv/oA7cACwO4/+gDvf/oA78ACwPL/+gDzf/oA87/6APY/+oD2v/oA9z/6gPgAAsD4gALA+QACwPr/+gEB//oBAn/6AQL/+gEDf/oBA//6AQR/+gEE//oBBX/6AQb/+oEHf/qBB//6gQh/+oEI//qBCX/6gQn/+oEKf/oBCv/6AQt/+gEL//qBDH/6ARBAAsEQwALBEUACwABAPX/4gANAFz/7QBe/+0A7f/tAPX/wALy/+0C9P/tAvb/7QOW/+0Dwv/tA9D/7QPq/+0ET//tBFf/7QAMAFz/8gBe//IA7f/yAvL/8gL0//IC9v/yA5b/8gPC//ID0P/yA+r/8gRP//IEV//yAB8AWv/0AFz/8gBd//QAXv/zALz/9ADt//IBGf/0AoD/9AKB//QC7//0AvL/8wL0//MC9v/zA3L/9AOV//QDlv/yA57/9AOm//QDt//0A7//9APC//ID0P/yA+D/9APi//QD5P/0A+r/8gRB//QEQ//0BEX/9ARP//IEV//yAF0ABv/KAAv/ygA4/9IAOv/UADz/9AA9/9MAWv/mAFz/7wBd/+YAvP/mANH/0gDV/9IA2f/0AN3/7QDg/+EA5f/UAO3/7wD1/8kA/f/RAQj/5QEY/9QBGf/mAR//4wEy/9IBM//EATr/0gE8/+EBTf/UAU7/9QFP/+cBV/9kAVj/yQFs/8oBbf/KAW//ygFw/8oBcf/KAmX/0wKA/+YCgf/mAtr/0gLc/9IC3v/SAu7/0wLv/+YC8P/TA1f/0wNm/9MDZ//0A2n/0wNy/+YDgf/tA43/0gOO//QDlf/mA5b/7wOe/+YDpf/TA6b/5gOn/8oDqP/KA6v/ygO2/9QDt//mA77/0wO//+YDwf/0A8L/7wPP//QD0P/vA9//7QPg/+YD4f/tA+L/5gPj/+0D5P/mA+X/4QPp//QD6v/vBED/0wRB/+YEQv/TBEP/5gRE/9MERf/mBEz/0gRO//QET//vBFD/4QRS/+EEVv/0BFf/7wRp/9MAbAAG/8AAC//AADj/nQA6/8cAPP/wAD3/qwBR/9IAUv/SAFT/0gDA/9IA0f+dANP/9QDV/50A2f/wANz/9QDd/+oA4P/lAOX/wQDr/9IA7//SAPD/0gDy/9IA8//SAPT/0gD1/80A9//SAPn/0gD6/9IA/f/SAP//0gEE/9IBGP/HATL/nQEz/8wBNf/SATr/nQE8/+UBP//fAUT/0gFJ/9IBTf/OAU//6gFR//UBV/+eAVj/zgFs/8ABbf/AAW//wAFw/8ABcf/AAmX/qwJ2/9ICvv/SAsD/0gLC/9ICw//SAtr/nQLc/50C3v+dAu7/qwLw/6sDV/+rA2b/qwNn//ADaf+rA2z/0gOB/+oDjf+dA47/8AOR/9IDk//SA5j/0gOd/9IDpf+rA6f/wAOo/8ADq//AA63/0gOz/9IDtv/HA77/qwPB//ADz//wA9T/0gPW/9ID3//qA+H/6gPj/+oD5f/lA+j/0gPp//AD7P/1BED/qwRC/6sERP+rBEn/0gRL/9IETP+dBE7/8ARQ/+UEUv/lBFX/0gRW//AEYv/SBGT/0gRm/9IEZ//1BGn/qwBvAAb/sQAL/7EAOP+eADr/xQA8//IAPf+oAFH/zwBS/88AVP/PAFz/7wDA/88A0f+eANX/ngDZ//IA3f/sAOD/4QDl/8IA6//PAO3/7wDv/88A8P/PAPL/zwDz/88A9P/PAPX/xgD3/88A+f/PAPr/zwD9/88A///PAQT/zwEY/8UBMv+eATP/wAE1/88BOv+eATz/4QE//98BRP/PAUn/zwFN/80BT//oAVf/nwFY/8YBbP+xAW3/sQFv/7EBcP+xAXH/sQJl/6gCdv/PAr7/zwLA/88Cwv/PAsP/zwLa/54C3P+eAt7/ngLu/6gC8P+oA1f/qANm/6gDZ//yA2n/qANs/88Dgf/sA43/ngOO//IDkf/PA5P/zwOW/+8DmP/PA53/zwOl/6gDp/+xA6j/sQOr/7EDrf/PA7P/zwO2/8UDvv+oA8H/8gPC/+8Dz//yA9D/7wPU/88D1v/PA9//7APh/+wD4//sA+X/4QPo/88D6f/yA+r/7wRA/6gEQv+oBET/qARJ/88ES//PBEz/ngRO//IET//vBFD/4QRS/+EEVf/PBFb/8gRX/+8EYv/PBGT/zwRm/88Eaf+oAE0AOP++AFH/4QBS/+EAVP/hAFr/7wBd/+8AvP/vAMD/4QDR/74A1f++AOX/yQDr/+EA7//hAPD/4QDy/+EA8//hAPT/4QD1/98A9//hAPn/4QD6/+EA/f/hAP//4QEE/+EBCP/tARn/7wEf/+sBMv++ATP/3wE1/+EBOv++AT//6QFE/+EBSf/hAU7/9QFY/+ACdv/hAoD/7wKB/+8Cvv/hAsD/4QLC/+ECw//hAtr/vgLc/74C3v++Au//7wNs/+EDcv/vA43/vgOR/+EDk//hA5X/7wOY/+EDnf/hA57/7wOm/+8Drf/hA7P/4QO3/+8Dv//vA9T/4QPW/+ED4P/vA+L/7wPk/+8D6P/hBEH/7wRD/+8ERf/vBEn/4QRL/+EETP++BFX/4QRi/+EEZP/hBGb/4QBkADj/5gA6/+cAPP/yAD3/5wBR/9YAUv/WAFT/1gBc//EAwP/WANH/5gDV/+YA2f/yAN3/7gDg/+gA5f/mAOv/1gDt//EA7//WAPD/1gDy/9YA8//WAPT/1gD1/9AA9//WAPn/1gD6/9YA/f/WAP//1gEE/9YBGP/nATL/5gEz/84BNf/WATr/5gE8/+gBRP/WAUn/1gFN/+cBT//tAVf/5gFY/9ACZf/nAnb/1gK+/9YCwP/WAsL/1gLD/9YC2v/mAtz/5gLe/+YC7v/nAvD/5wNX/+cDZv/nA2f/8gNp/+cDbP/WA4H/7gON/+YDjv/yA5H/1gOT/9YDlv/xA5j/1gOd/9YDpf/nA63/1gOz/9YDtv/nA77/5wPB//IDwv/xA8//8gPQ//ED1P/WA9b/1gPf/+4D4f/uA+P/7gPl/+gD6P/WA+n/8gPq//EEQP/nBEL/5wRE/+cESf/WBEv/1gRM/+YETv/yBE//8QRQ/+gEUv/oBFX/1gRW//IEV//xBGL/1gRk/9YEZv/WBGn/5wCTACUAEAAn/+gAK//oADP/6AA1/+gAOP/gADr/4AA9/98Ag//oAJL/6ACX/+gAsQAQALL/6ACzABAA0f/gANL/6ADTABAA1f/gANgAFADcABAA4P/hAOX/4ADsABMA8QAQAPj/4AEDABABB//oAQwAEAEW/+gBGP/gARr/6AEc/+gBHv/oASD/6AEy/+ABOP/oATr/4AE8/+EBPf/gAUD/4QFF/+kBTf/fAU//3gFRABABVf/oAVf/3wFZ//ICKP/oAin/6AIr/+gCLP/oAksAEAJMABACTQAQAk4AEAJPABACUAAQAlEAEAJS/+gCXP/oAl3/6AJe/+gCX//oAmD/6AJl/98CggAQAoQAEAKGABACiP/oAor/6AKM/+gCjv/oApz/6AKe/+gCoP/oAqL/6ALE/+gCxv/oAsj/6ALa/+AC3P/gAt7/4ALu/98C8P/fAvn/6ANSABADVv/oA1f/3wNaABADY//oA2b/3wNp/98DggAQA4n/6AOM/+gDjf/gA6X/3wOuABADtv/gA7n/6AO8/+gDvv/fA8QAEAPGABAD1//oA9n/6APb/+gD5f/hA+b/4APsABAD7QAQA+4AEAPwABAD8gAQA/QAEAP2ABAD+AAQA/oAEAP8ABAD/gAQBAAAEAQCABAEBAAQBBr/6AQc/+gEHv/oBCD/6AQi/+gEJP/oBCb/6AQo/+gEKv/oBCz/6AQu/+gEMP/oBED/3wRC/98ERP/fBEz/4ARQ/+EEUf/gBFL/4QRT/+AEZwAQBGgAEARp/98Eqf/oADIAG//yADj/8QA6//QAPP/0AD3/8ADR//EA0//1ANX/8QDZ//QA3P/1AN3/8wDl//EBGP/0ATL/8QE6//EBTf/yAU//8gFR//UBV//yAmX/8ALa//EC3P/xAt7/8QLu//AC8P/wA1f/8ANm//ADZ//0A2n/8AOB//MDjf/xA47/9AOl//ADtv/0A77/8APB//QDz//0A9//8wPh//MD4//zA+n/9APs//UEQP/wBEL/8ARE//AETP/xBE7/9ARW//QEZ//1BGn/8ABmACUADwA4/+YAOv/mADwADgA9/+YAsQAPALMADwDR/+YA0wAOANX/5gDYABMA2QAOANwADgDdAAsA4P/lAOX/5gDm//QA7AASAPEADwD1/+cA+P/oAP3/5wEDAA8BDAAPARj/5gEy/+YBM//nATr/5gE8/+UBPf/oAU3/5gFP/+YBUQAOAVf/5gFY/+cCSwAPAkwADwJNAA8CTgAPAk8ADwJQAA8CUQAPAmX/5gKCAA8ChAAPAoYADwLa/+YC3P/mAt7/5gLu/+YC8P/mA1IADwNX/+YDWgAPA2b/5gNnAA4Daf/mA4EACwOCAA8Djf/mA44ADgOl/+YDrgAPA7b/5gO+/+YDwQAOA8QADwPGAA8DzwAOA98ACwPhAAsD4wALA+X/5QPm/+gD6QAOA+wADgPtAA8D7gAPA/AADwPyAA8D9AAPA/YADwP4AA8D+gAPA/wADwP+AA8EAAAPBAIADwQEAA8EQP/mBEL/5gRE/+YETP/mBE4ADgRQ/+UEUf/oBFL/5QRT/+gEVgAOBGcADgRoAA8Eaf/mADcABv+/AAv/vwA4/58AOv/JAD3/rQDR/58A1f+fAN3/7ADg/+YA5f/EAPX/zQD9/9UBGP/JATL/nwEz/8wBOv+fATz/5gE//98BTf/RAU//7AFX/6EBWP/PAWz/vwFt/78Bb/+/AXD/vwFx/78CZf+tAtr/nwLc/58C3v+fAu7/rQLw/60DV/+tA2b/rQNp/60Dgf/sA43/nwOl/60Dp/+/A6j/vwOr/78Dtv/JA77/rQPf/+wD4f/sA+P/7APl/+YEQP+tBEL/rQRE/60ETP+fBFD/5gRS/+YEaf+tADAAOP/jADz/5QA9/+QA0f/jANP/5QDV/+MA2P/iANn/5QDc/+UA3f/pAPH/6gED/+oBMv/jATr/4wFR/+UBV//kAmX/5ALa/+MC3P/jAt7/4wLu/+QC8P/kA1f/5ANm/+QDZ//lA2n/5AOB/+kDjf/jA47/5QOl/+QDvv/kA8H/5QPP/+UD3//pA+H/6QPj/+kD6f/lA+z/5QPt/+oEQP/kBEL/5ARE/+QETP/jBE7/5QRW/+UEZ//lBGj/6gRp/+QAIwA4/+IAPP/kANH/4gDT/+QA1f/iANj/4QDZ/+QA3P/kAN3/6QDs/+QA8f/rAQP/6wEy/+IBOv/iAVH/5ALa/+IC3P/iAt7/4gNn/+QDgf/pA43/4gOO/+QDwf/kA8//5APf/+kD4f/pA+P/6QPp/+QD7P/kA+3/6wRM/+IETv/kBFb/5ARn/+QEaP/rABcAOP/rAD3/8wDR/+sA1f/rATL/6wE6/+sCZf/zAtr/6wLc/+sC3v/rAu7/8wLw//MDV//zA2b/8wNp//MDjf/rA6X/8wO+//MEQP/zBEL/8wRE//METP/rBGn/8wA2AFH/7wBS/+8AVP/vAFz/8ADA/+8A6//vAOz/7gDt//AA7//vAPD/7wDy/+8A8//vAPT/7wD1/+4A9//vAPn/7wD6/+8A/f/vAP//7wEE/+8BCP/0AR//8QEz/+8BNf/vAUT/7wFJ/+8BWP/vAnb/7wK+/+8CwP/vAsL/7wLD/+8DbP/vA5H/7wOT/+8Dlv/wA5j/7wOd/+8Drf/vA7P/7wPC//AD0P/wA9T/7wPW/+8D6P/vA+r/8ARJ/+8ES//vBE//8ARV/+8EV//wBGL/7wRk/+8EZv/vACIABv/yAAv/8gBa//UAXf/1ALz/9QD1//QA/f/0AQj/9QEZ//UBM//1AVj/9QFs//IBbf/yAW//8gFw//IBcf/yAoD/9QKB//UC7//1A3L/9QOV//UDnv/1A6b/9QOn//IDqP/yA6v/8gO3//UDv//1A+D/9QPi//UD5P/1BEH/9QRD//UERf/1ADIAUf/uAFL/7gBU/+4AwP/uAOv/7gDsABQA7//uAPD/7gDy/+4A8//uAPT/7gD1/+0A9//uAPj/7QD5/+4A+v/uAPv/0AD9/+4A///uAQT/7gEz/+0BNf/uAT3/7QFE/+4BSf/uAVj/7QJ2/+4Cvv/uAsD/7gLC/+4Cw//uA2z/7gOR/+4Dk//uA5j/7gOd/+4Drf/uA7P/7gPU/+4D1v/uA+b/7QPo/+4ESf/uBEv/7gRR/+0EU//tBFX/7gRi/+4EZP/uBGb/7gAKAAb/9QAL//UBbP/1AW3/9QFv//UBcP/1AXH/9QOn//UDqP/1A6v/9QBZAEf/8ABI//AASf/wAEv/8ABT/8cAVf/wAJP/8ACY//AAuv/wAMf/8ADI//AA9v/wAQL/8AEX/8cBG//rAR3/8AEh//ABOf/wAUv/8AFM//ABVv/wAbz/6wHA/+kByP/rAcr/6wJt//ACbv/wAm//8AJw//ACcf/wAnf/xwJ4/8cCef/HAnr/xwJ7/8cCif/wAov/8AKN//ACj//wApH/8AKT//AClf/wApf/8AKZ//ACm//wAp3/8AKf//ACof/wAqP/8ALF/8cCx//HAsn/xwNq//ADcP/HA3b/xwOQ//ADkv/HA5T/8AOX//ADsv/wA7j/8AO9//ADy//wA83/8APO//AD2P/HA9r/8APc/8cD6//wBAf/8AQJ//AEC//wBA3/8AQP//AEEf/wBBP/8AQV//AEG//HBB3/xwQf/8cEIf/HBCP/xwQl/8cEJ//HBCn/8AQr//AELf/wBC//xwQx//AAoQAGAA0ACwANAEX/8ABH/8AASP/AAEn/wABKAA0AS//AAFP/4gBV/8AAWgALAF0ACwCT/8AAmP/AALr/wAC8AAsAxv/WAMf/wADI/8AAy//VAOz/yADx/9cA9v/AAQL/wAED/9cBF//iARkACwEb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AD4AEgBFAEcAGQBJAEkAHABMAEwAHQBRAFQAHgBWAFYAIgBaAFoAIwBcAF4AJACKAIoAJwCwALMAKAC8ALwALADAAMAALQDGAMYALgDTANQALwDWANYAMQDZANkAMgDbAN0AMwDfAN8ANgDhAOEANwDjAOMAOADlAOUAOQDrAOsAOgDtAO0AOwD2APYAPAD7APsAPQD9AP4APgEDAQQAQAEJAQkAQgEMAQwAQwEXARkARAErAS0ARwEwATAASgEyATIASwFJAUkATAFsAXIATQF2AXcAVAIoAigAVgIqAisAVwJGAkcAWQJJAkkAWwJLAnEAXAJ2AnsAgwKAApAAiQKSApsAmgKkAqYApAKoAqgApwKqAqoAqAKsAqwAqQKuAq4AqgKxArEAqwKzArMArAK1ArUArQK3ArcArgK5ArkArwK7ArsAsAK9AskAsQLLAssAvgLNAs0AvwLPAs8AwALaAtoAwQLcAtwAwgLeAt4AwwLgAuAAxALiAuIAxQLkAuQAxgLmAuYAxwLoAugAyALqAuoAyQLsAuwAygLuAvYAywNSA1cA1ANaA2kA2gNsA2wA6gNwA3AA6wNyA3IA7AN2A3YA7QN5A3oA7gN8A4UA8AOHA4kA+gOLA5AA/QOSA5gBAwOeA58BCgOhA6EBDAOjA6MBDQOlA6gBDgOrA7ABEgOyA7IBGAO2A7cBGQO8A8cBGwPKA8sBJwPNA9ABKQPXA9gBLQPcA9wBLwPeA+QBMAPpA+oBNwPuBBYBOQQYBBgBYgQaBCcBYwQvBC8BcQQyBDIBcgQ0BDQBcwRABEUBdARIBEgBegRKBEoBewRMBEwBfAROBE8BfQRUBFcBfwRaBFoBgwRcBF0BhARfBF8BhgRjBGMBhwRlBGUBiARpBGkBiQSpBKkBigACAU4AEAAQAAEAEgASAAEAJQAlAAIAJgAmAAMAJwAnAAQAKAAoAAUAKQApAAYALAAtAAcALgAuAAgALwAvAAkAMAAwAAoAMQAyAAcAMwAzAAUANAA0AAsAOAA4AAwAOQA5AAgAOgA6AA0AOwA7AA4APAA8AA8APQA9ABAAPgA+ABEARQBFABIARgBGABMARwBHABQASQBJABUATABMABYAUQBSABYAUwBTABcAVABUABMAVgBWABgAWgBaABkAXABcABoAXQBdABkAXgBeABsAigCKABMAsACwABwAsQCxAAIAsgCyAAUAswCzAAIAvAC8ABkAwADAABYAxgDGABMA0wDUAB0A1gDWAAcA2QDZAA8A2wDcAAcA3QDdAB4A3wDfAAcA4QDhAAcA4wDjAB0A5QDlAB0A6wDrAB8A7QDtABoA9gD2ABMA+wD7ACAA/QD9ACAA/gD+ABMBAwEEACABCQEJACABDAEMAAIBFwEXABcBGAEYAA0BGQEZABkBKwErABMBLAEsABwBLQEtAB8BMAEwAAkBMgEyAAkBSQFJAB8BbgFuAAEBcgFyAAEBdgF3AAECKAIoAAQCKgIrAAUCRgJHAAUCSQJJAAwCSwJRAAICUgJSAAQCUwJWAAYCVwJbAAcCXAJgAAUCYQJkAAgCZQJlABACZgJsABICbQJtABQCbgJxABUCdgJ2ABYCdwJ7ABcCgAKBABkCggKCAAICgwKDABIChAKEAAIChQKFABIChgKGAAIChwKHABICiAKIAAQCiQKJABQCigKKAAQCiwKLABQCjAKMAAQCjQKNABQCjgKOAAQCjwKPABQCkAKQAAUCkgKSAAYCkwKTABUClAKUAAYClQKVABUClgKWAAYClwKXABUCmAKYAAYCmQKZABUCmgKaAAYCmwKbABUCpAKkAAcCpQKlABYCpgKmAAcCqAKoAAcCqgKqAAcCrAKsAAcCrgKuAAcCsQKxAAgCswKzAAkCtQK1AAoCtwK3AAoCuQK5AAoCuwK7AAoCvQK9AAcCvgK+ABYCvwK/AAcCwALAABYCwQLBAAcCwgLDABYCxALEAAUCxQLFABcCxgLGAAUCxwLHABcCyALIAAUCyQLJABcCywLLABgCzQLNABgCzwLPABgC2gLaAAwC3ALcAAwC3gLeAAwC4ALgAAgC4gLiAAgC5ALkAAgC5gLmAAgC6ALoAAgC6gLqAAgC7ALsAA4C7gLuABAC7wLvABkC8ALwABAC8QLxABEC8gLyABsC8wLzABEC9AL0ABsC9QL1ABEC9gL2ABsDUgNSAAIDUwNTAAYDVANVAAcDVgNWAAUDVwNXABADWgNaAAIDWwNbAAMDXANcAAYDXQNdABEDXgNfAAcDYANgAAkDYQNiAAcDYwNjAAUDZANkAAsDZQNlAAwDZgNmABADZwNnAA8DaANoAAcDaQNpABADbANsABYDcANwABcDcgNyABkDdgN2ABcDeQN5AAYDegN6ABwDfAN9AAcDfgN+AAgDfwOAAAkDgQOBAB4DggOCAAIDgwODAAMDhAOEABwDhQOFAAYDhwOIAAcDiQOJAAUDiwOLAAsDjAOMAAQDjQONAAwDjgOOAA8DjwOPABIDkAOQABUDkgOSABcDkwOTABMDlAOUABQDlQOVABkDlgOWABoDlwOXABUDmAOYAB8DngOeABkDnwOfAA4DoQOhAA4DowOjAA4DpQOlABADpgOmABkDrAOsAAcDrQOtABYDrgOuAAIDrwOvABIDsAOwAAYDsgOyABUDtgO2AA0DtwO3ABkDvAO8AAQDvQO9ABQDvgO+ABADvwO/ABkDwAPAAAcDwQPBAA8DwgPCABoDwwPDAAcDxAPEAAIDxQPFABIDxgPGAAIDxwPHABIDygPKAAYDywPLABUDzQPOABUDzwPPAA8D0APQABoD1wPXAAUD2APYABcD3APcABcD3gPeABMD3wPfAB4D4APgABkD4QPhAB4D4gPiABkD4wPjAB4D5APkABkD6QPpAA8D6gPqABoD7gPuAAID7wPvABID8APwAAID8QPxABID8gPyAAID8wPzABID9AP0AAID9QP1ABID9gP2AAID9wP3ABID+AP4AAID+QP5ABID+gP6AAID+wP7ABID/AP8AAID/QP9ABID/gP+AAID/wP/ABIEAAQAAAIEAQQBABIEAgQCAAIEAwQDABIEBAQEAAIEBQQFABIEBgQGAAYEBwQHABUECAQIAAYECQQJABUECgQKAAYECwQLABUEDAQMAAYEDQQNABUEDgQOAAYEDwQPABUEEAQQAAYEEQQRABUEEgQSAAYEEwQTABUEFAQUAAYEFQQVABUEFgQWAAcEGAQYAAcEGgQaAAUEGwQbABcEHAQcAAUEHQQdABcEHgQeAAUEHwQfABcEIAQgAAUEIQQhABcEIgQiAAUEIwQjABcEJAQkAAUEJQQlABcEJgQmAAUEJwQnABcELwQvABcEMgQyAAgENAQ0AAgEQARAABAEQQRBABkEQgRCABAEQwRDABkERAREABAERQRFABkESARIAAkESgRKAAcETARMAAwETgROAA8ETwRPABoEVARUABwEVQRVAB8EVgRWAA8EVwRXABoEWgRaABYEXARcAB0EXQRdABwEXwRfAAkEYwRjAAcEZQRlAAcEaQRpABAEqQSpAAUAAgFtAAYABgABAAsACwABABAAEAAWABEAEQAZABIAEgAWACUAJQACACcAJwAIACsAKwAIAC4ALgAaADMAMwAIADUANQAIADcANwAbADgAOAAJADkAOQAKADoAOgALADsAOwAMADwAPAAXAD0APQANAD4APgAYAEUARQADAEcASQAEAEsASwAEAFEAUgAFAFMAUwAGAFQAVAAFAFUAVQAEAFcAVwAHAFkAWQAOAFoAWgAPAFwAXAAcAF0AXQAPAF4AXgAQAIMAgwAIAJIAkgAIAJMAkwAEAJcAlwAIAJgAmAAEAJoAmgAOALEAsQACALIAsgAIALMAswACALoAugAEALwAvAAPAMAAwAAFAMcAyAAEAMoAygAOANEA0QAJANIA0gAIANMA0wARANUA1QAJANkA2QAXANwA3AARAN0A3QAVAOAA4AASAOsA6wAFAO0A7QAcAO8A8AAFAPEA8QATAPIA9AAFAPYA9gAEAPcA9wAFAPgA+AAUAPkA+gAFAP0A/QAFAP8A/wAFAQIBAgAEAQMBAwATAQQBBAAFAQcBBwAIAQwBDAACARYBFgAIARcBFwAGARgBGAALARkBGQAPARoBGgAIARwBHAAIAR0BHQAEAR4BHgAIASABIAAIASEBIQAEATIBMgAJATUBNQAFATgBOAAIATkBOQAEAToBOgAJAUQBRAAFAUkBSQAFAUsBTAAEAVEBUQARAVUBVQAIAVYBVgAEAWkBagAZAWwBbQABAW4BbgAWAW8BcQABAXIBcgAWAXYBdwAWAigCKQAIAisCLAAIAkUCRQAZAksCUQACAlICUgAIAlwCYAAIAmECZAAKAmUCZQANAmYCbAADAm0CcQAEAnYCdgAFAncCewAGAnwCfwAOAoACgQAPAoICggACAoMCgwADAoQChAACAoUChQADAoYChgACAocChwADAogCiAAIAokCiQAEAooCigAIAosCiwAEAowCjAAIAo0CjQAEAo4CjgAIAo8CjwAEApECkQAEApMCkwAEApUClQAEApcClwAEApkCmQAEApsCmwAEApwCnAAIAp0CnQAEAp4CngAIAp8CnwAEAqACoAAIAqECoQAEAqICogAIAqMCowAEArECsQAaAr4CvgAFAsACwAAFAsICwwAFAsQCxAAIAsUCxQAGAsYCxgAIAscCxwAGAsgCyAAIAskCyQAGAtAC0AAbAtEC0QAH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ALgAuWMyc2MEWGMyc2MEXmMyc2MEZGMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamMyc2MEamNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGNjbXAEcGRsaWcEeGRsaWcEfmRsaWcEhGRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRsaWcEimRub20EkGRub20ElmRub20EnGRub20EomRub20EomRub20EomRub20EomRub20EomRub20EomRub20EomZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGZyYWMEqGxpZ2EEsmxpZ2EEumxudW0EwGxudW0ExmxudW0EzGxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxudW0E0mxvY2wE2GxvY2wE3mxvY2wE5G51bXIE6m51bXIE8G51bXIE9m51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G51bXIE/G9udW0FAm9udW0FCG9udW0FDm9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFG9udW0FFHBudW0FGnBudW0FIHBudW0FJnBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHBudW0FLHNtY3AFMnNtY3AFOHNtY3AFPnNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNtY3AFRHNzMDEFSnNzMDEFUHNzMDEFVnNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDEFXHNzMDIFYnNzMDIFaHNzMDIFbnNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDIFdHNzMDMFenNzMDMFgHNzMDMFhnNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDMFjHNzMDQFknNzMDQFmHNzMDQFnnNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDQFpHNzMDUFqnNzMDUFsHNzMDUFtnNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDUFvHNzMDYFwnNzMDYFyHNzMDYFznNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDYF1HNzMDcF2nNzMDcF4HNzMDcF5nNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HNzMDcF7HRudW0F8nRudW0F+HRudW0F/nRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBHRudW0GBAAAAAEAAQAAAAEAAwAAAAEAAgAAAAEAAAAAAAIACAAJAAAAAQAOAAAAAQAQAAAAAQAPAAAAAQANAAAAAQBDAAAAAQBFAAAAAQBEAAAAAQBCAAAAAwA/AEAAQQAAAAIAEQASAAAAAQASAAAAAQA8AAAAAQA+AAAAAQA9AAAAAQA7AAAAAQAKAAAAAQAMAAAAAQALAAAAAQBHAAAAAQBJAAAAAQBIAAAAAQBGAAAAAQAwAAAAAQAyAAAAAQAxAAAAAQAvAAAAAQA4AAAAAQA6AAAAAQA5AAAAAQA3AAAAAQAFAAAAAQAHAAAAAQAGAAAAAQAEAAAAAQAUAAAAAQAWAAAAAQAVAAAAAQATAAAAAQAYAAAAAQAaAAAAAQAZAAAAAQAXAAAAAQAcAAAAAQAeAAAAAQAdAAAAAQAbAAAAAQAgAAAAAQAiAAAAAQAhAAAAAQAfAAAAAQAkAAAAAQAmAAAAAQAlAAAAAQAjAAAAAQAoAAAAAQAqAAAAAQApAAAAAQAnAAAAAQAsAAAAAQAuAAAAAQAtAAAAAQArAAAAAQA0AAAAAQA2AAAAAQA1AAAAAQAzAEsAmACYAJgAmAQmBCYEJgQmBxQHwA5QDlAOZg6IDogOiA6IDr4O5A8SDxIPEg8SDyYPJg8mDyYPOg86DzoPOg9OD04PTg9OD2APYA9gD2APeg96D3oPeg+8D7wPvA+8D9oP2g/aD9oP+A/4D/gP+BAqECoQKhAqEFwQXBBcEFwQjhCiENoQzBDMEMwQzBDaENoQ2hDaEQYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCQwI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTcAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvsC/AL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYAxkDGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMwAzEDMgMzAzQDNQM2AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRQNEA0YDRwNIA0kDSgNLA0wDTQNOA08DUANRBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+BL8EwATBBMIEwwTEBMUB/wTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNcE2ATaAhoE2wIOBNYCEwINBNkCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkYCRwJJAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAoIChAKGAogCigKMAo4CkAKSApQClgKYApoCnAKeAqACogKkAqYCqAKqAqwCrgKxArMCtQK3ArkCuwK9Ar8CwQLEAsYCyALKAswCzgLQAtIC1ALYAtoC3ALeAuAC4gLkAuYC6ALqAuwC7gLwAvEC8wL1A1IDUwNUA1UDVgNXA1gDWgNbA1wDXQNeA18DYANhA2MDZANlA2YDZwNoA2kDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgO6A7wDvgPTA9kD3wRIBEoETgRWBFgEXQRpAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAvwDLwI7AfoEyQTKAfsB/AH9Af4B/wIABM0EzgTQBNME3AICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYA04DGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMwAzEDMgMzAzQDNQM2AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRQNEA0YDRwNIA0kDSgNLA0wDTQNPA1ADUQTIBMsEzATPBNEE0gIBBNQEwATBBMIEwwTEBMUExgTHBNUE1wTYAhgE2gIaBNsC+wIOBNYCEwINBNkCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSgJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CsgK0ArYCuAK6ArwCvgLAAsICxQLHAskCywLNAs8C0QLTAtUC2QLbAt0C3wLhAuMC5QLnAukC6wLtAu8C8gL0AvYDjwOQA5EDkgOTA5QDlQOWA5cDmAOZA5oDmwOcA50DngO7A70DvwPNA9QD2gPgBEYESQRLBE8EVwRZBFoEXgRqAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAABKAAEAAQBNAAMAAAABABIAAQB4AAEAAABKAAEAAQBOAAMAAAABABIAAQBgAAEAAABKAAEAAQKtAAMAAAABABIAAQBIAAEAAABKAAEAAQOaAAMAAAABABIAAQAwAAEAAABKAAEAAQOcAAMAAAABABIAAQAYAAEAAABKAAEAAQQZAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCSwACAKcCTAACAKgCTgACAKkD8AACAKoEegACAKsD7gACAKwAAQAEBIcAAgCsAAEABAKIAAIAqAACAAYADASJAAIArASLAAIBogAGAA4AFAAaACAAJgAsAlMAAgCnAlQAAgCoBAoAAgCpBAgAAgCqBHwAAgCrBAYAAgCsAAIABgAMBHYAAgCoAqIAAgGiAAEABASNAAIArAAGAA4AFAAaACAAJgAsAlcAAgCnAlgAAgCoAqYAAgCpBBYAAgCqBH4AAgCrBBgAAgCsAAMACAAOABQEjwACAKgEkQACAKwCswACAaIAAwAIAA4AFAK1AAIAqASTAAIArAK3AAIBogACAAYADAOsAAIAqASVAAIArAAFAAwAEgAYAB4AJAR4AAIApwK9AAIAqAJbAAIAqQSXAAIArAK/AAIBogAGAA4AFAAaACAAJgAsAlwAAgCnAl0AAgCoAl8AAgCpBBwAAgCqBIAAAgCrBBoAAgCsAAEABASZAAIAqAAEAAoAEAAWABwCygACAKgEggACAKsEmwACAKwCzAACAaIAAwAIAA4AFALQAAIAqASdAAIArALWAAIBogACAAYADASfAAIArALaAAIBogAGAA4AFAAaACAAJgAsAmEAAgCnAmIAAgCoAuAAAgCpBDQAAgCqBIQAAgCrBDIAAgCsAAIABgAMBKEAAgCpBKMAAgCsAAMACAAOABQDnwACAKcDoQACAKgEpQACAKwABQAMABIAGAAeACQDpQACAKcCZQACAKgERAACAKkEQgACAKoEQAACAKwAAgAGAAwC8QACAKgEpwACAKwABgAOABQAGgAgACYALAJmAAIApwJnAAIAqAJpAAIAqQPxAAIAqgR7AAIAqwPvAAIArAABAAQEiAACAKwAAQAEAokAAgCoAAIABgAMBIoAAgCsBIwAAgGiAAYADgAUABoAIAAmACwCbgACAKcCbwACAKgECwACAKkECQACAKoEfQACAKsEBwACAKwAAQAEBHcAAgCoAAEABASOAAIArAABAAQEGQACAKwAAwAIAA4AFASQAAIAqASSAAIArAK0AAIBogADAAgADgAUArYAAgCoBJQAAgCsArgAAgGiAAIABgAMA60AAgCoBJYAAgCsAAUADAASABgAHgAkBHkAAgCnAr4AAgCoAnYAAgCpBJgAAgCsAsAAAgGiAAYADgAUABoAIAAmACwCdwACAKcCeAACAKgCegACAKkEHQACAKoEgQACAKsEGwACAKwAAQAEBJoAAgCoAAQACgAQABYAHALLAAIAqASDAAIAqwScAAIArALNAAIBogADAAgADgAUAtEAAgCoBJ4AAgCsAtcAAgGiAAIABgAMBKAAAgCsAtsAAgGiAAYADgAUABoAIAAmACwCfAACAKcCfQACAKgC4QACAKkENQACAKoEhQACAKsEMwACAKwAAgAGAAwEogACAKkEpAACAKwAAwAIAA4AFAOgAAIApwOiAAIAqASmAAIArAAFAAwAEgAYAB4AJAOmAAIApwKAAAIAqARFAAIAqQRDAAIAqgRBAAIArAACAAYADALyAAIAqASoAAIArAABAAQC9wACAKgAAQAEAvkAAgCoAAEABAL4AAIAqAABAAQC+gACAKgABQAMABIAGAAeACQCcgACAKcCcwACAKgCpwACAKkEFwACAKoEfwACAKsABQAMABIAGAAeACQEKgACAKcEKAACAKgELgACAKkELAACAKoEMAACAKwABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQEOAACAKcENgACAKgEPAACAKkEOgACAKoEPgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwAAQAEBIYAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLUAtUAAQAAAAEACAACAA4ABATdBN4E3wTgAAEABAKGAocCmAKZAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiEBrgIjAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAa4AAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIgRwBHEEcgRzBHQEdQABAAAAAQAIAAIAFgAIBHUCIgRwBHEEcgRzAa0EdAABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAABKAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwThAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKtA5oDnAQZ",
  65901. "Roboto-MediumItalic.ttf": "AAEAAAARAQAABAAQR1BPUyEcbY8AAhQcAABZakdTVULEnLdcAAJtiAAAGXxPUy8yoQuw+wAAAZgAAABgY21hcNhuDxIAABpsAAAGXGN2dCAElytKAAAjUAAAAFZmcGdte/lhqwAAIMgAAAG8Z2FzcAAIABMAAhQQAAAADGdseWZgubUGAAAtcAAB42poZG14LxpP7wAAFYAAAATsaGVhZPi2qwsAAAEcAAAANmhoZWEM2xKRAAABVAAAACRobXR4rRqYNAAAAfgAABOIbG9jYSKZqcwAACOoAAAJxm1heHAHEgLZAAABeAAAACBuYW1lRuRz4wACENwAAAMUcG9zdP9hAGQAAhPwAAAAIHByZXAbsfg2AAAihAAAAMwAAQAAAAIAALDh6v1fDzz1ABsIAAAAAADE8BEuAAAAANDbTpf6Qf3VCXgIcwACAAkAAgAAAAAAAAABAAAHbP4MAAAJN/pB/mwJeAgAAbMAAAAAAAAAAAAAAAAE4gABAAAE4gCPABYAVgAFAAEAAAAAAA4AAAIAAfIABgABAAMEGQH0AAUAAAWaBTMAAAEfBZoFMwAAA9EAZgIAAAACAAAAAAAAAAAA4AAK/1AAIX8AAAAhAAAAAEdPT0cAAQAA//0GAP4AAGYHmgIAIAABnwAAAAAEOgWwACAAIAACA5YAZAAKAAAACgAAAfkAAAH5AAACHwA3Ao4AoQTHADsEcwBCBb0AtQUAAC0BWgCQAr8AaALG/5QDeABnBF0APQG//4kClgA2AjUAMAMc/38EcwBgBHMA7wRzAAsEcwAmBHMACQRzAFoEcwBjBHMAhgRzADsEcwCOAhkAKwHi/5oD/AAyBGIAYgQUAC8D0ACVBvsAMgU0/6QE7wAnBRsAZQUcACcEbQAnBE0AJwVSAGsFjQAnAjsANQRZAAME7gAnBD0AJwbVACcFjAAnBWYAawUAACcFZgBkBOIAJwS5ACQEwACcBRkAWwUPAJsG3gC3BPP/wwTFAKEEtv/lAir/7wNIAKwCKv96A1sARAOK/3kCigDKBD0AIgRoABAEGgA4BGsAOwQ0ADsCygBfBHD/9wRZAA0CBQAfAfz/DAQXABECBQAfBssAEARbAA0EdQA5BGj/xwRyADsCxAAQBAsAHAKfADsEWgBKA+EAZAXOAHcD8f+5A9H/tQPx/+cCpAAwAf0AIAKk/5kFMgBbAfkAAAIY/+YEZQBMBJv/9gV8AAgExQBQAff/7ATc/9wDdADRBh4AXgOAAL4DzgBJBFUAgAKWADYGHgBeA8cA7wL9AOQEMwAbAukAVgLpAGcCkQDIBKH/3QPZAH0COwCeAgr/0wLpAOEDlQC+A84AAgWtALkGBgCxBjAAlgPQ/9IFNP+kBTT/pAU0/6QFNP+kBTT/pAU0/6QHVf+HBRsAZQRtACcEbQAnBG0AJwRtACcCOwA1AjsANQI7ADUCOwA1BTr//wWMACcFZgBrBWYAawVmAGsFZgBrBWYAawQtACMFZAAVBRkAWwUZAFsFGQBbBRkAWwTFAKEErwAnBMsAGwQ9ACIEPQAiBD0AIgQ9ACIEPQAiBD0AIgaXAA8EGgA4BDQAOwQ0ADsENAA7BDQAOwIUACICFAAiAhQAIgIUACIEjQBGBFsADQR1ADkEdQA5BHUAOQR1ADkEdQA5BHgAPQRvACoEWgBKBFoASgRaAEoEWgBKA9H/tQR+/80D0f+1BTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBRsAZQQaADgFGwBlBBoAOAUbAGUEGgA4BRsAZQQaADgFHAAnBQEAOwU6//8EiQA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADwEbQAnBDQAOwVSAGsEcP/3BVIAawRw//cFUgBrBHD/9wVSAGsEcP/3BY0AJwRZAA0FjgAuBHcAKwI7ADUCFAAUAjsANQIUAB8COwA1AhQAIgI7/44CBf92AjsANQIUACIGlAA1BAEAHwRZAAMCIP8PBO4AJwQXABEEfwAhBD0AJwIFAB8EPQAnAgX/ogQ9ACcCmwAfBD0AJwLhAB8ETAAhAkcAHwWMACcEWwANBYwAJwRbAA0FjAAnBFsADQRbAA0FcgAjBG8AEQVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQeDAFAHDQBCBOIAJwLEABAE4gAnAsT/nATiACcCxAAQBLkAJAQLABwEuQAkBAsAHAS5ACQECwAcBLkAJAQLABwEwACcAp8AOwTAAJwCxwA7BMAAnAKf/+IFGQBbBFoASgUZAFsEWgBKBRkAWwRaAEoFGQBbBFoASgUZAFsEWgBKBRkAWwRaAEoG3gC3Bc4AdwTFAKED0f+1BMUAoQS2/+UD8f/nBLb/5QPx/+cEtv/lA/H/5wIGAB4FaABOAsT/SgVpAFsEhQA2BYMAWwTWAEoCIP8PBVIAawRw//cFjAAnBFsADQU0/6QEPQAiB1X/hwaXAA8FZAAVBG8AKgU0/6QEPQAiBG0AJwQ0ADsCO//JAhT/fgVmAGsEdQA5BOIAJwLEAAcFGQBbBFoASgS5ACQECwAcBMAAnAKfADsCIP8PBCUANgG5AIoD0gECA54BDQPIAO8DawD+AgUBAgKnAPoCRf+oA8QA3gMRAKwCY//uAAr9VAAK/dcACvz2AAr91gAK/L8ACvygAlUBLgQlAOgFNP+kAjsAngTR/74F8f/GAp//ygV6ABgFKf9YBVAAHQKgAAsFNP+kBO8AJwRdAC4Fnf+qBG0AJwS2/+UFjQAnBVoAXgI7ADUE7gAnBRr/sgbVACcFjAAnBHcAAAVmAGsFjwAuBQAAJwR3/9wEwACcBMUAoQXLAFIE8//DBYkAdQU8AAkCOwA1BMUAoQRrAD4ESAAoBG8AEQKgAG4ESABXBGsAPgSr/+UD+QB3BG8AOARIACgEBQBmBG8AEQSHAGwCoABuBH8AIQRS/6gEof/dA+EAZAP+AD4EdQA5BNcAXQRv/8sEIQA7BHcAOAQXAG4ESABXBa0AMgPx/7kFpwA/BmsAVAKgAEwESABXBHUAOQRIAFcGawBUBJkAUARjAG0Ex/8kBkoAVwRtACcEbQAnBdoAkQRdAC4FOgBnBLkAJAI7ADUCOwA1BFkAAwhQ/8oIVwAuBjQAoATuACcFhwAnBO0AmwWJACUFNP+kBOsAIwTvACcEXQAuBeL/hARtACcHcf+lBLsAHgWHACcFhwAnBQoALgWI/8oG1QAnBY0AJwVmAGsFjwAuBQAAJwUbAGUEwACcBO0AmwY4AFYE8//DBdUAJQVoAMUHawArB8YAKwX1AIkGzQAuBOoAIwUxAE8HJgAyBNv/sAQ9ACIEZQBDBHYAIgNKABgE2v+FBDQAOwZO/60EAQAWBH8AGQR/ABkEVgAiBIH/vwXfACIEfgAZBHUAOQR/ABkEaP/HBBoAOAPhAFMD0f+1BbAAPQPx/7kEuAAZBE4AcAZmABkGwQASBPoATwZIACIEUAAiBCUAIwZcACQEWP+2BDQAOwQ0ADsEWQANA0oAGAQlADsECwAcAgUAHwIUACIB/P8MBqf/vQa5ABkEcAANBFYAIgR/ABkD0f+1BH8AGQcbAGAGKQBEBOoAIwRPACEG+wArBd0AGQTv/64ESP+cBxQAPgYQADAGwgAUBcMAFgj1ADUHxgAiBAr/qgPc/7UFiQB1BacAPwVaAGIEbwA2BP0AqAP5AHcE/QCoA/kAdwk3AGsIRgA5BVoAZgRvADgHFwBiBh4ASwcbAGAGKQBEBP0AVgQzAEUE4wA4AAr85gAK/Q4ACv4rAAr+PAAK+kEACvpvBYcAJwR/ABkE6gAjBE8AIQT2ACcEbf/HBFIAIgOPABEEXf/8A0r/ywSdAC4ECgARB3H/pQZO/60EuwAeBAEAFgUKAC4EVgAiBQ4AIwSRACEFHgA3BC4AGQZsAKQFgwBsBY0AJwR+ABkHngAnBYkAEQgRAC4GygARBgUAZQTjAEsFGwBlBBoAOATAAJwD4QBTBMUAoQP5AHcExQChA/kAVATz/8MD8f+5BwQAnQVQAFYFaADFBE4AcAVUALkEWwCFBWcA5wRZAA0F/wBiBKj/9AX/AGIEqP/0AjsANQdx/6UGTv+tBQQAIwRgACEFiP/KBIH/vwWNAC4EbwARBY0AJwR+ABkFaADFBE4AcAbVACcF3wAiAjsANQU0/6QEPQAiBTT/pAQ9ACIHVf+HBpcADwRtACcENAA7BWgASAQlADYFaABIBCUANgdx/6UGTv+tBLsAHgQBABYEjAAvBIz/8AWHACcEfwAZBYcAJwR/ABkFZgBrBHUAOQVaAGIEbwA2BVoAYgRvADYFMQBPBCUAIwTtAJsD0f+1BO0AmwPR/7UE7QCbA9H/tQVoAMUETgBwBF0ALgNKABgGzQAuBkgAIgSsADMDQwAJBPP/wwPx/7kE8//DA/H/uQTqADAEawA7BsYARQayAEcGLACqBQoAYQRjAJIEJwCMB43/3gZ0/94HygAnBnUACwTnAEwEFgA9BYkAkAUAAHMFNgBWBEgAKAWI/8oEgf+/BTT/pAQ9ACIE7wAnBGgAEAUcACcEawA7BRwAJwRrADsFjQAnBFkADQTuACcEFwARBO4AJwQXABEEPQAnAgX/5AbVACcGywAQBtUAJwbLABAFjAAnBFsADQUAACcEaP/HBOIAJwLE/94EuQAkBAsAHATAAJwCnwA7BQ8AmwPhAGQFDwCbA+EAZAbeALcFzgB3Bt4AtwXOAHcG3gC3Bc4AdwbeALcFzgB3BLb/5QPx/+cFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIFNP+kBD0AIgU0/6QEPQAiBTT/pAQ9ACIEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7BG0AJwQ0ADsEbQAnBDQAOwRtACcENAA7AjsANQIUACICO///AgX/5AVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQVmAGsEdQA5BWYAawR1ADkFZgBrBHUAOQVmAGsEdQA5BWkAWwSFADYFaQBbBIUANgVpAFsEhQA2BWkAWwSFADYFaQBbBIUANgUZAFsEWgBKBRkAWwRaAEoFgwBbBNYASgWDAFsE1gBKBYMAWwTWAEoFgwBbBNYASgWDAFsE1gBKBMUAoQPR/7UExQChA9H/tQTFAKED0f+1BMUAoQPR/7UFrP6zAx4A7AP/AAAH9AAAA/8AAAf0AAACrgAAAgQAAAFcAAAEZgAAAikAAAGfAAAA1QAAAAoAAAKXADYClwA2BQsAnAYKAIIGCgCCA4v/TgG9AK4BuQCKAcr/pAGlAM0DBgC3Aw0AlwL7/6EERQBpBID/+wLAAJ4D5QAzBYUAMwFrADYHdgCdAVoAkAKOAKECaQBdAmD/+QQ+ADcDiv/hAukAYwNMAG4ETf/DBJv/9gZJAA0GjgArCFsAJwdYACoGZAAQBIn/9ARzAE4F0QBCBB4AOwSIABAFP//kBV3/5gXBAMIDzgAxB/kAIwTsAO0E9wB9Bg8AtgayAIIGpwCIBnkAtQR4AEUFdQAfBL7/pwRqAJwEmAA0CA8ASQIm/xcEdQAwBGIAYgP8/9UEFAAXA/cAOgJTAGkCjgBmAez/zwT+AF8EjgBLBKIAXwb2AF8G9gBfBPQAXwaNABcACgAAB/v/qQg1AFwDhv/XBGP/pwSmADoEY/+nA6YACgQ2AC0ETgARBB4ADgQXABQFGwAuBBoAFAUKAC4FJgAuBKEAOwQl/4cCpwEGBL0ACgLpADMC6QAIAukAIwLpABYC6QAKAun/8QLp//QC6f/jAukAbQLpABcEBP/ZBXwAQwU1AHAEyAAAA6YAkwXjAIwEYwBwBGsAOQQlAGIEHgAOBEUACgSmADcEVQAKBKYAOgTCAAoF4gAKA6YACgREAAoDwv/yAfcAGATDAAoEjAA/A7IACgPMAAoEYgAKBGcAOQRIAAoEhf+bAf8A6wOPAQQD9gDcA/YAEwP2ANgD9gDXA48BBAOPAQUDjwEEBEb/pAQlAG0EZwA5BXAAYgQdAFUEegAqAgr/BwGw/7IEFP/WByb/wQcpAAoFdgBiBLwACgRZAAsFOv+DBhT/qQQvAAwEyAALBEUACgSw/8EELwByBT4ACgRzAF0GXAAKBt4ACgU7AEoF+wALBE8ACwRnABMGagAKBG//0gQM//UGav+pBIQACgT9AAoFTgBiBcwAQARDAG0Eqf+kBmwAYgRzAF0EcwAKBdoANwS3ADQELwAMBKYAOgROAAQD4wAeCAEACgTP/9kEbwAQBCYANwR/ADsDkgCkBIcANAR7/8cEhgA7BDQAOwRwADAFWgBvBYEAcQVmAC4FvQByBb8AcgQFAKsEaQAfA6YACgRA/38EpP/RAukAigLpAGQC6QB9AukAiQLpAJYC6QB7AukApgRT/9QEGAAnBm8AOgSaAEcEzwBOAiD/DwIg/w8CFQAiAhX/fQIVACIESAAKBGL/lwRi/5cEJQBiBIX/mwSF/5sEhf+bBIX/mwSF/5sEhf+bBIX/mwRnADkDzAAKA8wACgPMAAoDzAAKAfcAGAH3ABgB9wAYAfcAGATCAAoEpgA6BKYAOgSmADoEpgA6BKYAOgRrADkEmwB0BIcAjgRzAFoEcwAJBHMAJgRzAAsEawA5BGsAOQRrADkEJQBtBIX/mwSF/5sEhf+bBGcAOQRnADkEZwA5BGcAOQRiAAoDzAAKA8wACgPMAAoDzAAKA8wACgSMAD8EjAA/BIwAPwSMAD8EwwAKAfcADQH3ABgB9wAYAff/igH3ABgDwv/yBEQACgOmAAoDpgAKA6YACgOmAAoEwgAKBMIACgTCAAoEpgA6BKYAOgSmADoERQAKBEUACgRFAAoEHgAOBB4ADgQeAA4EHgAOBCUAYgQlAGIEJQBiBGsAOQRrADkEawA5BGsAOQRrADkEawA6BeMAjAQlAG0EJQBtBBT/1gQU/9YEFP/WBIX/mwQI/20E//94AjP/ewSw/9IEYf8sBNL/4gSF/5sESAAKA8wACgQU/9YEwwAKAfcAGAREAAoF4gAKBKYAOgRVAAoEJQBiBCUAbQRG/6QB9wAYBCUAbQPMAAoDpgAKBB4ADgH3ABgB9wAYA8L/8gREAAoELwByBIX/mwRIAAoDpgAKA8wACgTIAAsF4gAKBMMACgSmADoEvQAKBFUACgRnADkEJQBiBEb/pAQvAA0EwwAKBGcAOgQlAG0F2gA3BMgACwQvAHIFfABDBTT/pAQ9ACIEbQAnBDQAOwIU/+QAAAABAAAE5AkKBAAAAgICAwUFBgYCAwMEBQIDAgQFBQUFBQUFBQUFAgIEBQUECAYGBgYFBQYGAwUGBQgGBgYGBgUFBgYIBgUFAgQCBAQDBQUFBQUDBQUCAgUCCAUFBQUDBQMFBAcEBAQDAgMGAgIFBQYFAgUEBwQEBQMHBAMFAwMDBQQDAgMEBAYHBwQGBgYGBgYIBgUFBQUDAwMDBgYGBgYGBgUGBgYGBgUFBQUFBQUFBQcFBQUFBQICAgIFBQUFBQUFBQUFBQUFBAUEBgUGBQYFBgUGBQYFBgUGBgYFBQUFBQUFBQUFBQYFBgUGBQYFBgUGBQMCAwIDAgMCAwIHBQUCBgUFBQIFAgUDBQMFAwYFBgUGBQUGBQYFBgUGBQgIBgMGAwYDBQUFBQUFBQUFAwUDBQMGBQYFBgUGBQYFBgUIBwUEBQUEBQQFBAIGAwYFBgUCBgUGBQYFCAcGBQYFBQUDAgYFBgMGBQUFBQMCBQIEBAQEAgMDBAMDAAAAAAAAAwUGAwUHAwYGBgMGBgUGBQUGBgMGBggGBQYGBgUFBQcGBgYDBQUFBQMFBQUEBQUFBQUDBQUFBAQFBQUFBQUFBgQGBwMFBQUHBQUFBwUFBwUGBQMDBQkJBwYGBgYGBgYFBwUIBQYGBgYIBgYGBgYFBgcGBwYICQcIBgYIBQUFBQQFBQcFBQUFBQcFBQUFBQQEBgQFBQcIBgcFBQcFBQUFBAUFAgICBwgFBQUEBQgHBgUIBwYFCAcIBgoJBQQGBgYFBgQGBAoJBgUIBwgHBgUGAAAAAAAABgUGBQYFBQQFBAUFCAcFBQYFBgUGBQcGBgUJBgkIBwYGBQUEBQQFBAYECAYGBQYFBgUHBQcFAwgHBgUGBQYFBgUGBQgHAwYFBgUIBwUFBgUGBQgHBQUFBQYFBgUGBQYFBgUGBQYEBgQGBAYFBQQIBwUEBgQGBAYFCAgHBgUFCQcJBwYFBgYGBQYFBgUGBQYFBgUGBQYFBgUFAggICAgGBQYFBgMFBQUDBgQGBAgHCAcIBwgHBQQGBQYFBgUGBQYFBgUGBQYF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RvpHAkcKRzFHXkdmR25HdkgASAhIEEg9SEVITUiPSJdIx0jPSQ1JFUkdSZtJo0oDSnJKhUqYSqpKvErOSt9K9Et+S/lMLUytTT5Nm03qTnFOok6qTwVPDU8VT4xPlE/sUE9Qt1EnUW9RulIqUjJSlFMPUyJTNFNGU1hTalPqVERUUFTPVOZU+VVhVXhV91ZtVnVWiFaQVw5XhVfgV/dYDlggWF9YZ1jDWMtY01ksWTRZoVopWmRadlp+Wspa0lraWuJa6lryWvpbAltHW8JbylwCXElciVzVXTBdmF3pXmle9V9VX11f22BcYINg3GDkYVNh6WIkYjZiiGLRYxxjdWN9Y61jtWQLZDhkQGTgZOhlIGVoZahl8GZLZrFnAGdzZ/5oXWh0aIZpBWkcaYVpjWmVaahpsGopaqBrCmshazhrSWuIa/lsZWzSbUBty25YbqVu9G9hb9BwSHC6cUxx3HJ5cyhzMHM4c7V0JXRpdK50xnTedOp09nVqddh2s3eIeBh4qHkFeV95k3mweel6AHoXevJ7YXt8e5d8BHxzfM99S317faV95n4ofoR+037ffut+938Dfw9/G391f8yALICKgNyBM4E/gUuBmIHpgk+CqYNUg++D+4QHhBOEH4QnhC+Ee4TLhNeE44UshXKFfoWKheGGMYZ2hn6HAIeNh5mHpYeth7+H0YgziI6ImoimiQmJZ4lziX+Ji4mXiaOJr4m3icmJ24nuigGKCYoRiiOKNIqniq+KworUiueK+osNix+Lhovni/6MFIwnjDqMTYxfjGeMb4yCjJSMp4y5jMuM3IzvjQGNFI0sjT+NUY1djWmNhY2hjbCNwI3MjdiOMo6JjtyO5I9Oj+eQY5DakU2Ru5Iukp2TEJOCk+OUOpSTlOqVb5V3lYOVj5WblaeVs5W/lcuV15Xjle+V+5YHlhmWK5Y3lkOWT5ZblnKWhJaQlpyWqJa0lsaW2JbklvCW/JcIlxSXIJcyl0OXT5dbl3KXiZegl7eXypfdl+mX9ZgBmA2YGZglmDeYSZhhmHiYkJinmL+Y1pjumQWZIJk6mVKZaZl8mY6ZoZmzmcaZ2Jnzmg6aGpommjiaSppcmm2ahZqcmrSay5rjmvqbEpspm0SbXptwm4Kbjpuam6abspvEm9ab7pwFnB2cNJxMnGOce5ySnK2cx5zenPWdDJ0jnTqdUZ1o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A/wDXgAA////pP5sBK4FsAImACUAAAAHAXABbwAD//8AIv5wA9wEUAImAEUAAAAHAXAAqQAH//8AJ/6bBLwFsAImACYAAAAHAXYElwAK//8AEP6IBA8GAAImAEYAAAAHAXYEpf/3//8AJ/6bBOAFsAImACgAAAAHAXYEcwAK//8AO/6RBIgGAAImAEgAAAAHAXYEkAAA//8AJ/35BOAFsAImACgAAAAHA6sBAf6S//8AO/35BIgGAAImAEgAAAAHA6sBHv6S//8AJ/6bBYcFsAImACwAAAAHAXYFAAAK//8ADf6bA/kGAAImAEwAAAAHAXYEfwAK//8AJwAABXEHNgImAC8AAAEHAHcBpQE2AAkAsAQvsA/cMDEA//8AEQAABHUHPQImAE8AAAEHAHcBowE9AAkAsAQvsA/cMDEA//8AJ/7cBXEFsAImAC8AAAAHAXYE0QBL//8AEf7HBEoGAAImAE8AAAAHAXYEYAA2//8AJ/6bA8MFsAImADAAAAAHAXYElwAK////5P6bAhcGAAImAFAAAAAHAXYDRAAK//8AJwAABs4HNgImADEAAAEHAHcCvgE2ABMAsABFWLACLxuxAh8+WbAR3DAxAP//ABAAAAZoBgACJgBRAAABBwB3ApgAAAAJALADL7Ak3DAxAP//ACf+mwbOBbACJgAxAAAABwF2BasACv//ABD+mwZoBFICJgBRAAAABwF2Ba4ACv//ACf+lwWGBbACJgAyAAAABwF2BQIABv//AA3+mwP6BFICJgBSAAAABwF2BGwACv//ACcAAAUEB0ICJgA0AAABBwB3AasBQgAJALADL7AW3DAxAP///8f+YARtBfcCJgBUAAABBwB3AZv/9wAJALANL7Ah3DAxAP//ACf+mwTYBbACJgA2AAAABwF2BJgACv///97+mwLvBFMCJgBWAAAABwF2Az4ACv//ACT+kQS7BccCJgA3AAAABwF2BLAAAP//ABz+iAPEBFACJgBXAAAABwF2BGL/9///AJz+lAUiBbACJgA4AAAABwF2BJ8AA///ADv+kQKuBUECJgBYAAAABwF2A/UAAP//AJsAAAWBBzcCJgA6AAABBwFuAN0BQwAJALABL7AR3DAxAP//AGQAAAQNBewCJgBaAAABBgFuFvgACQCwAS+wEdwwMQD//wCb/psFgQWwAiYAOgAAAAcBdgTV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AesB7AHtAe4B7wHwAfEB8gJSAlQCWAJaAlwCXgJiAmQCagJsAnACcgJ0AnYCegJ8An4CgAKaAqICpAKqArADhwOOA5MDlgACAAAAAgAKO9oAAQNsAAQAAAGxBtI6+jr6BvwHUjfeI2I7mDuqOHYHWDiWOJY43jTeDqg4ljiWO6omhAqSCxQ1MDjeNI43uDdKOOQPYgt+OFQ2GjiMC8AM6gz0N643rji4NhoO1g3qOW4OTDeoOW4OZjfeN9433jfeN9433juYOHY4djh2OHY4ljiWOJY4ljuqOJY7qjuqO6o7qjuqON443jjeON445DhUOFQ4VDhUOFQ4VDiMOIw4jDiMN644uDi4OLg4uDi4OW42GjluN944VDfeOFQ33jhUO5g7mDuYO5g7qjuqOHY4jDh2OIw4djiMOHY4jDh2OIw4ljeuOJY4ljiWOJY4ljjeNN4OqA6oDqgOqDiWN644ljeuOJY3rjeuO6o4uDuqOLg7qji4DtYO1g7WNTA1MDUwON443jjeON443jjeN7g45DluOOQPYg9iD2I33jhUNTAO6Dr6N944djiWOJY7qjjkN94jYjZ+N944dg9iOJY7qjiWNN433jiWOJYPhDuqJoQQfjUwOOQRfDdKElo4ljjkN64S+DluEv43rhW8OW4Xlji4GKgYwhjIGM4ayBrOGwQbNji4OHY4dhu0Nn44ljiWON4dKh7cIJo03jY0OJY33iHQI2I2fiNsOHY3SiW6OJY03jiWOJY4ljuqJoQ7mDUwNjQ3SjiWOJYmpihAND4pHingKm44VCrMK6Y3QCwwOIw3qCz6LSQ4uDYaLoo5bjYaN6gxEDFOMoA0aDYaMwI4jDiMN0AziDOyNAg5bjQ+NGg33ji4NI45bjSOOW40tDYaNn43QDZ+N0o3qDTeNN403jTeOJY7mDUwOOQ5bjjkN0o3qDeuOJY3SjeoOJY4ljiWN944VDfeOFQ4djiMOIw4jDdKN6g7qji4OLg2GjY0OW42NDluNjQ5bjZ+N0A3QDdKN6g33jhUOJY3rje4N7g3uDfeOFQ33jhUN944VDfeOFQ33jhUN944VDfeOFQ33jhUN944VDfeOFQ33jhUN944VDh2OIw4djiMOHY4jDh2OIw4djiMOHY4jDh2OIw4djiMOJY4ljuqOLg7qji4O6o4uDuqOLg7qji4O6o4uDuqOLg4uDjeON445DluOOQ5bjjkOW445DluO6o6+jmIOvo6+jr6Ovo6+jsAOwo7HDsuO0A7XjtoO3I7mDuqO6oAAQGxAAQABgALAAwAEwAlACYAJwAoACkAKgAsAC0ALgAvADAAMQAyADMANAA1ADYAOAA5ADoAOwA8AD0APgA/AEUARgBJAEoATABPAFEAUgBTAFQAVgBYAFoAWwBcAF0AXwCDAIQAhQCGAIcAiACKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJwAnQCeAJ8AoACjAKQApQCmAKcAqACrAKwArQCuALQAtQC2ALcAuAC5AMAAwQDCAMMAxADFAMYAxwDIAMkAywDNAM8A0QDTANUA1gDXANgA2QDaANsA3ADdAN4A5wDoAOsA7QDvAPEA8wD3APkA/AD+AQABAgEGAQcBCAEJAQoBCwEMAQ8BEAERARIBEwEUARgBGgEcASUBJwEpASsBLQEvATEBMwE1ATcBOQE6ATsBPAE+AUABTgFPAWIBZQFmAXkBewF8AX0BfgF/AYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZIBkwGUAZUBlgGXAZgBmgGbAZ4BoQGjAaYBpwGpAa0BrgGvAbEBsgGzAbQBtQG2AbgBuQG8AcMBxAHFAcYByQHKAcsBzAHNAc4BzwHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3QHeAd8B4AHhAeMB5AHlAeYB6AHpAesB7AHtAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6Af0CAQIDAgUCBgIHAggCCQIMAg0CDwIQAhECEwIUAhYCFwIcAh0CIQIlAiYCKQI2AjcCOAI5AjoCRAJRAlICUwJUAlgCWQJcAl4CYAJiAmQCbAJuAnACcQJyAnQCdQJ9AoICgwKEAosCjwKRApICkwKUApUCmAKZApsCnQKeAp8CqAKpAq0CrwKwArECsgKzArQCtQK4ArkCvQK+Ar8C1gLXAuYC5wL4AvoC/AMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDLAMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDQwNGA0gDVANVA1YDVwNYA1kDWgNbA1wDcANxA3MDdAN1A34DfwPZA9sD3APeA+ED4gPpA+wEMQQzBDQACgA4/8QBJf/EASf/xAFi/8QBxf/EAc7/xAHl/8QCYv/EAm7/xAJ2/8QAFQA6ABQAOwAmAD0AFgCgABYBNwAmATkAFgE7ABYBfwAWAZUAFgGbABYCNwAUAjkAFAJwABYCcgAWAvgAJgL6ACYC/AAmA1QAFgNWABYDWAAWA1oAFgABABP/CADOABD+7gAS/u4AJf9AAC7/MAA4ABQARf/eAEf/6wBI/+sASf/rAEv/6wBT/+sAVf/rAFb/5gBZ/+oAWv/oAF3/6ACD/0AAhP9AAIX/QACG/0AAh/9AAIj/QACj/94ApP/eAKX/3gCm/94Ap//eAKj/3gCq/+sAq//rAKz/6wCt/+sArv/rALX/6wC2/+sAt//rALj/6wC5/+sAvP/qAL3/6gC+/+oAv//qAMD/6ADC/+gAw/9AAMT/3gDF/0AAxv/eAMf/QADI/94Ayv/rAMz/6wDO/+sA0P/rANL/6wDW/+sA2P/rANr/6wDc/+sA3v/rAOD/6wDi/+sA5P/rAOb/6wD3/zABEP/rARL/6wEU/+sBFv/rASUAFAEnABQBLP/qAS7/6gEw/+oBMv/qATT/6gE2/+oBOv/oAUb/6wFI/+oBTv9AAU//3gFiABQBef9AAYL/QAGF/0ABjP9AAZz/6wGg/+oBof/rAaP/6AGt/+gBr//rAbL/6wGz/+sBtf/qAbv/6gG8/+sBvf/qAcUAFAHL/zABzgAUAdP/QAHlABQB8//eAfj/6wIB/+sCBP/rAgb/6AIH/+sCE//rAhT/6wIX/+sCIf/oAin/QAI2/+sCOP/oAjr/6AI8/+sCQP/rAkT/6wJiABQCa//rAm3/6wJuABQCcf/oAnYAFAKS/0ACk//eApT/QAKV/94Cmf/rApv/6wKd/+sCqf/rAqv/6wKt/+sCsf/oArP/6AK1/+gCw//rAsT/6wLF/+sCz//rAtb/QALX/94DAv9AAwP/3gME/0ADBf/eAwb/QAMH/94DCP9AAwn/3gMK/0ADC//eAwz/QAMN/94DDv9AAw//3gMQ/0ADEf/eAxL/QAMT/94DFP9AAxX/3gMW/0ADF//eAxj/QAMZ/94DG//rAx3/6wMf/+sDIf/rAyP/6wMl/+sDJ//rAyn/6wMv/+sDMf/rAzP/6wM1/+sDN//rAzn/6wM7/+sDPf/rAz//6wNB/+sDQ//rA0X/6wNH/+oDSf/qA0v/6gNN/+oDT//qA1H/6gNT/+oDVf/oA1f/6ANZ/+gDW//oA3L+7gN2/u4Dev7uA3v+7gPs/8AAIAA4/98AOv/kADv/7AA9/90AoP/dASX/3wEn/98BN//sATn/3QE7/90BYv/fAX//3QGV/90Bm//dAcX/3wHO/98B5f/fAjf/5AI5/+QCYv/fAm7/3wJw/90Ccv/dAnb/3wL4/+wC+v/sAvz/7ANU/90DVv/dA1j/3QNa/90D7AAOABoAOP/OADr/7QA9/9AAoP/QASX/zgEn/84BOf/QATv/0AFi/84Bf//QAZX/0AGb/9ABxf/OAc7/zgHl/84CN//tAjn/7QJi/84Cbv/OAnD/0AJy/9ACdv/OA1T/0ANW/9ADWP/QA1r/0AAQAC7/7gA5/+4AnP/uAJ3/7gCe/+4An//uAPf/7gEr/+4BLf/uAS//7gEx/+4BM//uATX/7gHL/+4DRv/uA0j/7gBKAAYAEAALABAADQAUAEEAEgBH/+gASP/oAEn/6ABL/+gAVf/oAGEAEwCq/+gAq//oAKz/6ACt/+gArv/oAMr/6ADM/+gAzv/oAND/6ADS/+gA1v/oANj/6ADa/+gA3P/oAN7/6ADg/+gA4v/oAOT/6ADm/+gBFv/oAUb/6AFmABABnP/oAaH/6AGy/+gBs//oAfj/6AIE/+gCB//oAhP/6AIU/+gCF//oAjz/6AJA/+gCRP/oAmv/6AJt/+gCmf/oApv/6AKd/+gCq//oAsP/6ALE/+gCxf/oAs//6AMb/+gDHf/oAx//6AMh/+gDI//oAyX/6AMn/+gDKf/oAz3/6AM//+gDQf/oA0X/6ANwABADcQAQA3MAEAN0ABADdQAQA34AEAN/ABAAAgIF/9YDcf+YAD0AR//sAEj/7ABJ/+wAS//sAFX/7ACq/+wAq//sAKz/7ACt/+wArv/sAMr/7ADM/+wAzv/sAND/7ADS/+wA1v/sANj/7ADa/+wA3P/sAN7/7ADg/+wA4v/sAOT/7ADm/+wBFv/sAUb/7AGc/+wBof/sAbL/7AGz/+wB+P/sAgT/7AIH/+wCE//sAhT/7AIX/+wCPP/sAkD/7AJE/+wCa//sAm3/7AKZ/+wCm//sAp3/7AKr/+wCw//sAsT/7ALF/+wCz//sAxv/7AMd/+wDH//sAyH/7AMj/+wDJf/sAyf/7AMp/+wDPf/sAz//7ANB/+wDRf/sABgAU//iALX/4gC2/+IAt//iALj/4gC5/+IBEP/iARL/4gEU/+IBr//iAbz/4gIB/+ICNv/iAqn/4gKt/+IDL//iAzH/4gMz/+IDNf/iAzf/4gM5/+IDO//iA0P/4gNxABgABgAQ/4QAEv+EA3L/hAN2/4QDev+EA3v/hAAQAC7/7AA5/+wAnP/sAJ3/7ACe/+wAn//sAPf/7AEr/+wBLf/sAS//7AEx/+wBM//sATX/7AHL/+wDRv/sA0j/7AALAFv/zAPW/9cD1/+4A9j/7gPZ/70D3P/yA97/8gPm//ED6v/zA+wAEwP3/7cABABKABQAWAAyAFsAEQNxABAAHgAG//IAC//yAFr/8wBd//MAwP/zAML/8wE6//MBZv/yAaP/8wGt//MCBf/1Agb/8wIh//MCOP/zAjr/8wJx//MCsf/zArP/8wK1//MDVf/zA1f/8wNZ//MDW//zA3D/8gNx//IDc//yA3T/8gN1//IDfv/yA3//8gAIAFv/5QGW/8sBuP/kA9z/7APe/+wD5v/rA+r/7QPsAA0APgAn//MAK//zADP/8wA1//MAiv/zAJX/8wCW//MAl//zAJj/8wCZ//MAm//zAMn/8wDL//MAzf/zAM//8wDf//MA4f/zAOP/8wDl//MBD//zARH/8wET//MBFf/zAUX/8wFS//MBfv/zAYn/8wGQ//MBqwANAcf/8wHh//MB5P/zAiP/8wI1//MCO//zAj3/8wI///MCQf/zAkP/8wJq//MCbP/zAqj/8wKq//MCrP/zAs7/8wMu//MDMP/zAzL/8wM0//MDNv/zAzj/8wM6//MDPP/zAz7/8wNA//MDQv/zA0T/8wNc//MEMf/zBDL/8wQ0//MENf/zAD8AJ//mACv/5gAz/+YANf/mAIr/5gCV/+YAlv/mAJf/5gCY/+YAmf/mAJv/5gDJ/+YAy//mAM3/5gDP/+YA3//mAOH/5gDj/+YA5f/mAQ//5gER/+YBE//mARX/5gFF/+YBUv/mAX7/5gGJ/+YBkP/mAZb/wgGrABABx//mAeH/5gHk/+YCI//mAjX/5gI7/+YCPf/mAj//5gJB/+YCQ//mAmr/5gJs/+YCqP/mAqr/5gKs/+YCzv/mAy7/5gMw/+YDMv/mAzT/5gM2/+YDOP/mAzr/5gM8/+YDPv/mA0D/5gNC/+YDRP/mA1z/5gQx/+YEMv/mBDT/5gQ1/+YANwAl/+QAPP/SAD3/0wCD/+QAhP/kAIX/5ACG/+QAh//kAIj/5ACg/9MAw//kAMX/5ADH/+QBOf/TATv/0wFO/+QBef/kAX//0wGC/+QBhf/kAYz/5AGV/9MBl//SAZv/0wGr/+IB0//kAdn/0gHo/9ICKf/kAlj/0gJw/9MCcv/TAnT/0gKD/9ICkv/kApT/5AKe/9ICvv/SAtb/5AMC/+QDBP/kAwb/5AMI/+QDCv/kAwz/5AMO/+QDEP/kAxL/5AMU/+QDFv/kAxj/5ANU/9MDVv/TA1j/0wNa/9MAJwAQ/0YAEv9GACX/zQCD/80AhP/NAIX/zQCG/80Ah//NAIj/zQDD/80Axf/NAMf/zQFO/80Bef/NAYL/zQGF/80BjP/NAbH/8gHT/80CKf/NApL/zQKU/80C1v/NAwL/zQME/80DBv/NAwj/zQMK/80DDP/NAw7/zQMQ/80DEv/NAxT/zQMW/80DGP/NA3L/RgN2/0YDev9GA3v/RgABAasADgCvAEf/3ABI/9wASf/cAEv/3ABR/8EAUv/BAFP/1gBU/8EAVf/cAFn/3QBa/+EAXf/hAKr/3ACr/9wArP/cAK3/3ACu/9wAtP/BALX/1gC2/9YAt//WALj/1gC5/9YAvP/dAL3/3QC+/90Av//dAMD/4QDC/+EAyv/cAMz/3ADO/9wA0P/cANL/3ADW/9wA2P/cANr/3ADc/9wA3v/cAOD/3ADi/9wA5P/cAOb/3AEH/8EBCf/BAQv/wQEM/8EBEP/WARL/1gEU/9YBFv/cASz/3QEu/90BMP/dATL/3QE0/90BNv/dATr/4QFG/9wBSP/dAZz/3AGe/8EBoP/dAaH/3AGj/+EBpf/mAaf/wQGo/+sBqf/pAa3/4QGu//ABr//WAbD/5wGy/9wBs//cAbT/4wG1/90Btv/OAbj/1AG5/9sBu//dAbz/1gG9/90B9v/BAfj/3AH7/8EB/P/BAf3/wQH//8ECAP/BAgH/1gIC/8ECA//BAgT/3AIG/+ECB//cAgn/wQIL/8ECDP/BAg//wQIR/8ECE//cAhT/3AIW/8ECF//cAh3/wQIf/8ECIP/BAiH/4QI2/9YCOP/hAjr/4QI8/9wCQP/cAkT/3AJN/8ECXf/BAmX/wQJn/8ECa//cAm3/3AJx/+ECiv/BAoz/wQKQ/8ECmf/cApv/3AKd/9wCpf/BAqf/wQKp/9YCq//cAq3/1gKx/+ECs//hArX/4QK5/8ECu//BAr3/wQLD/9wCxP/cAsX/3ALP/9wC5//BAxv/3AMd/9wDH//cAyH/3AMj/9wDJf/cAyf/3AMp/9wDL//WAzH/1gMz/9YDNf/WAzf/1gM5/9YDO//WAz3/3AM//9wDQf/cA0P/1gNF/9wDR//dA0n/3QNL/90DTf/dA0//3QNR/90DU//dA1X/4QNX/+EDWf/hA1v/4QB2AAb/2gAL/9oAR//wAEj/8ABJ//AAS//wAFX/8ABZ/+8AWv/cAF3/3ACq//AAq//wAKz/8ACt//AArv/wALz/7wC9/+8Avv/vAL//7wDA/9wAwv/cAMr/8ADM//AAzv/wAND/8ADS//AA1v/wANj/8ADa//AA3P/wAN7/8ADg//AA4v/wAOT/8ADm//ABFv/wASz/7wEu/+8BMP/vATL/7wE0/+8BNv/vATr/3AFG//ABSP/vAWb/2gGc//ABoP/vAaH/8AGj/9wBqP/sAasADwGt/9wBsP/qAbL/8AGz//ABtP/OAbX/7wG2/+cBu//vAb3/7wH4//ACBP/wAgb/3AIH//ACE//wAhT/8AIX//ACIf/cAjj/3AI6/9wCPP/wAkD/8AJE//ACa//wAm3/8AJx/9wCmf/wApv/8AKd//ACq//wArH/3AKz/9wCtf/cAsP/8ALE//ACxf/wAs//8AMb//ADHf/wAx//8AMh//ADI//wAyX/8AMn//ADKf/wAz3/8AM///ADQf/wA0X/8ANH/+8DSf/vA0v/7wNN/+8DT//vA1H/7wNT/+8DVf/cA1f/3ANZ/9wDW//cA3D/2gNx/9oDc//aA3T/2gN1/9oDfv/aA3//2gBEABAADAASAAwAR//nAEj/5wBJ/+cAS//nAFX/5wCq/+cAq//nAKz/5wCt/+cArv/nAMr/5wDM/+cAzv/nAND/5wDS/+cA1v/nANj/5wDa/+cA3P/nAN7/5wDg/+cA4v/nAOT/5wDm/+cBFv/nAUb/5wGc/+cBof/nAasADwGy/+cBs//nAfj/5wIE/+cCB//nAhP/5wIU/+cCF//nAjz/5wJA/+cCRP/nAmv/5wJt/+cCmf/nApv/5wKd/+cCq//nAsP/5wLE/+cCxf/nAs//5wMb/+cDHf/nAx//5wMh/+cDI//nAyX/5wMn/+cDKf/nAz3/5wM//+cDQf/nA0X/5wNyAAwDdgAMA3oADAN7AAwABgG0/+oB9//uAgX/1QIP/+0CY//sAtH/7AABAgX/wAABAbQAIAB+AAYADAALAAwAR//oAEj/6ABJ/+gASgAMAEv/6ABT/+oAVf/oAFoACwBdAAsAqv/oAKv/6ACs/+gArf/oAK7/6AC1/+oAtv/qALf/6gC4/+oAuf/qAMAACwDCAAsAyv/oAMz/6ADO/+gA0P/oANL/6ADW/+gA2P/oANr/6ADc/+gA3v/oAOD/6ADi/+gA5P/oAOb/6AEQ/+oBEv/qART/6gEW/+gBOgALAUb/6AFmAAwBnP/oAaH/6AGjAAsBq/+QAa0ACwGv/+oBsAALAbL/6AGz/+gBtAAMAbz/6gH4/+gCAf/qAgT/6AIGAAsCB//oAhP/6AIU/+gCF//oAiEACwI2/+oCOAALAjoACwI8/+gCQP/oAkT/6AJr/+gCbf/oAnEACwKZ/+gCm//oAp3/6AKp/+oCq//oAq3/6gKxAAsCswALArUACwLD/+gCxP/oAsX/6ALP/+gDG//oAx3/6AMf/+gDIf/oAyP/6AMl/+gDJ//oAyn/6AMv/+oDMf/qAzP/6gM1/+oDN//qAzn/6gM7/+oDPf/oAz//6ANB/+gDQ//qA0X/6ANVAAsDVwALA1kACwNbAAsDcAAMA3EADANzAAwDdAAMA3UADAN+AAwDfwAMA9cADQPZAA4D2v/1A9z/7APe/+0D5v/sA+r/7gPs/78D9wANAAECBf/iAA0AXP/tAF7/7QE9/+0BP//tAUH/7QH5/+0CBf/AAgj/7QJZ/+0Cdf/tAoT/7QKf/+0Cv//tAAwAXP/yAF7/8gE9//IBP//yAUH/8gH5//ICCP/yAln/8gJ1//IChP/yAp//8gK///IAHwBa//QAXP/yAF3/9ABe//MAwP/0AML/9AE6//QBPf/zAT//8wFB//MBo//0Aa3/9AH5//ICBv/0Agj/8gIh//QCOP/0Ajr/9AJZ//ICcf/0AnX/8gKE//ICn//yArH/9AKz//QCtf/0Ar//8gNV//QDV//0A1n/9ANb//QAXQAG/8oAC//KADj/0gA6/9QAPP/0AD3/0wBa/+YAXP/vAF3/5gCg/9MAwP/mAML/5gEl/9IBJ//SATn/0wE6/+YBO//TAWL/0gFm/8oBf//TAZX/0wGX//QBm//TAaP/5gGt/+YBxf/SAc7/0gHR/+0B2f/0AeX/0gHm/+0B6P/0Aer/4QHv/9QB+f/vAgX/yQIG/+YCCP/vAg//0QIh/+YCJP/lAjf/1AI4/+YCOf/UAjr/5gJC/+MCWP/0Aln/7wJi/9ICY//EAm7/0gJw/9MCcf/mAnL/0wJ0//QCdf/vAnb/0gJ4/+ECev/hAoP/9AKE/+8Cjf/hAp7/9AKf/+8CsP/tArH/5gKy/+0Cs//mArT/7QK1/+YCtv/hAr7/9AK//+8Cxv/UAsf/9QLI/+cC0P9kAtH/yQNU/9MDVf/mA1b/0wNX/+YDWP/TA1n/5gNa/9MDW//mA3D/ygNx/8oDc//KA3T/ygN1/8oDfv/KA3//ygBsAAb/wAAL/8AAOP+dADr/xwA8//AAPf+rAFH/0gBS/9IAVP/SAKD/qwC0/9IBB//SAQn/0gEL/9IBDP/SASX/nQEn/50BOf+rATv/qwFi/50BZv/AAX//qwGV/6sBl//wAZv/qwGe/9IBp//SAcX/nQHM//UBzv+dAdH/6gHZ//AB3v/1AeX/nQHm/+oB6P/wAer/5QHv/8EB9v/SAfv/0gH8/9IB/f/SAf//0gIA/9ICAv/SAgP/0gIF/80CCf/SAgv/0gIM/9ICD//SAhH/0gIW/9ICHf/SAh//0gIg/9ICN//HAjn/xwJN/9ICWP/wAl3/0gJi/50CY//MAmX/0gJn/9ICbv+dAnD/qwJy/6sCdP/wAnb/nQJ4/+UCev/lAn7/3wKD//ACh//1Aor/0gKM/9ICjf/lApD/0gKe//ACpf/SAqf/0gKw/+oCsv/qArT/6gK2/+UCuf/SArv/0gK9/9ICvv/wAsb/zgLI/+oCyv/1AtD/ngLR/84C1P/1Auf/0gNU/6sDVv+rA1j/qwNa/6sDcP/AA3H/wANz/8ADdP/AA3X/wAN+/8ADf//AAG8ABv+xAAv/sQA4/54AOv/FADz/8gA9/6gAUf/PAFL/zwBU/88AXP/vAKD/qAC0/88BB//PAQn/zwEL/88BDP/PASX/ngEn/54BOf+oATv/qAFi/54BZv+xAX//qAGV/6gBl//yAZv/qAGe/88Bp//PAcX/ngHO/54B0f/sAdn/8gHl/54B5v/sAej/8gHq/+EB7//CAfb/zwH5/+8B+//PAfz/zwH9/88B///PAgD/zwIC/88CA//PAgX/xgII/+8CCf/PAgv/zwIM/88CD//PAhH/zwIW/88CHf/PAh//zwIg/88CN//FAjn/xQJN/88CWP/yAln/7wJd/88CYv+eAmP/wAJl/88CZ//PAm7/ngJw/6gCcv+oAnT/8gJ1/+8Cdv+eAnj/4QJ6/+ECfv/fAoP/8gKE/+8Civ/PAoz/zwKN/+ECkP/PAp7/8gKf/+8Cpf/PAqf/zwKw/+wCsv/sArT/7AK2/+ECuf/PArv/zwK9/88Cvv/yAr//7wLG/80CyP/oAtD/nwLR/8YC5//PA1T/qANW/6gDWP+oA1r/qANw/7EDcf+xA3P/sQN0/7EDdf+xA37/sQN//7EATQA4/74AUf/hAFL/4QBU/+EAWv/vAF3/7wC0/+EAwP/vAML/7wEH/+EBCf/hAQv/4QEM/+EBJf++ASf/vgE6/+8BYv++AZ7/4QGj/+8Bp//hAa3/7wHF/74Bzv++AeX/vgHv/8kB9v/hAfv/4QH8/+EB/f/hAf//4QIA/+ECAv/hAgP/4QIF/98CBv/vAgn/4QIL/+ECDP/hAg//4QIR/+ECFv/hAh3/4QIf/+ECIP/hAiH/7wIk/+0COP/vAjr/7wJC/+sCTf/hAl3/4QJi/74CY//fAmX/4QJn/+ECbv++AnH/7wJ2/74Cfv/pAor/4QKM/+ECkP/hAqX/4QKn/+ECsf/vArP/7wK1/+8Cuf/hArv/4QK9/+ECx//1AtH/4ALn/+EDVf/vA1f/7wNZ/+8DW//vAGQAOP/mADr/5wA8//IAPf/nAFH/1gBS/9YAVP/WAFz/8QCg/+cAtP/WAQf/1gEJ/9YBC//WAQz/1gEl/+YBJ//mATn/5wE7/+cBYv/mAX//5wGV/+cBl//yAZv/5wGe/9YBp//WAcX/5gHO/+YB0f/uAdn/8gHl/+YB5v/uAej/8gHq/+gB7//mAfb/1gH5//EB+//WAfz/1gH9/9YB///WAgD/1gIC/9YCA//WAgX/0AII//ECCf/WAgv/1gIM/9YCD//WAhH/1gIW/9YCHf/WAh//1gIg/9YCN//nAjn/5wJN/9YCWP/yAln/8QJd/9YCYv/mAmP/zgJl/9YCZ//WAm7/5gJw/+cCcv/nAnT/8gJ1//ECdv/mAnj/6AJ6/+gCg//yAoT/8QKK/9YCjP/WAo3/6AKQ/9YCnv/yAp//8QKl/9YCp//WArD/7gKy/+4CtP/uArb/6AK5/9YCu//WAr3/1gK+//ICv//xAsb/5wLI/+0C0P/mAtH/0ALn/9YDVP/nA1b/5wNY/+cDWv/nAAICLQALAtD/5gCTACUAEAAn/+gAK//oADP/6AA1/+gAOP/gADr/4AA9/98AgwAQAIQAEACFABAAhgAQAIcAEACIABAAiv/oAJX/6ACW/+gAl//oAJj/6ACZ/+gAm//oAKD/3wDDABAAxQAQAMcAEADJ/+gAy//oAM3/6ADP/+gA3//oAOH/6ADj/+gA5f/oAQ//6AER/+gBE//oARX/6AEl/+ABJ//gATn/3wE7/98BRf/oAU4AEAFS/+gBYv/gAXkAEAF+/+gBf//fAYIAEAGFABABif/oAYwAEAGQ/+gBlf/fAZv/3wHF/+ABx//oAcwAEAHO/+AB0wAQAdcAFAHeABAB4f/oAeT/6AHl/+AB6v/hAe//4AH3ABMB/gAQAgr/4AIcABACI//oAikAEAI1/+gCN//gAjn/4AI7/+gCPf/oAj//6AJB/+gCQ//oAmL/4AJq/+gCbP/oAm7/4AJw/98Ccv/fAnb/4AJ4/+ECef/gAnr/4QJ7/+ACf//hAocAEAKIABACjf/hAo7/4AKSABAClAAQApr/6QKo/+gCqv/oAqz/6AK2/+ECt//gAsb/3wLI/94CygAQAs7/6ALQ/98C0v/yAtQAEALVABAC1gAQAwIAEAMEABADBgAQAwgAEAMKABADDAAQAw4AEAMQABADEgAQAxQAEAMWABADGAAQAy7/6AMw/+gDMv/oAzT/6AM2/+gDOP/oAzr/6AM8/+gDPv/oA0D/6ANC/+gDRP/oA1T/3wNW/98DWP/fA1r/3wNc/+gEMf/oBDL/6AQ0/+gENf/oADIAG//yADj/8QA6//QAPP/0AD3/8ACg//ABJf/xASf/8QE5//ABO//wAWL/8QF///ABlf/wAZf/9AGb//ABxf/xAcz/9QHO//EB0f/zAdn/9AHe//UB5f/xAeb/8wHo//QB7//xAjf/9AI5//QCWP/0AmL/8QJu//ECcP/wAnL/8AJ0//QCdv/xAoP/9AKH//UCnv/0ArD/8wKy//MCtP/zAr7/9ALG//ICyP/yAsr/9QLQ//IC1P/1A1T/8ANW//ADWP/wA1r/8AAIAFgADgCJ/tcBq/+YAbH/xwHX/xIB9/9SAsL/zwPs/4AAZgAlAA8AOP/mADr/5gA8AA4APf/mAIMADwCEAA8AhQAPAIYADwCHAA8AiAAPAKD/5gDDAA8AxQAPAMcADwEl/+YBJ//mATn/5gE7/+YBTgAPAWL/5gF5AA8Bf//mAYIADwGFAA8BjAAPAZX/5gGXAA4Bm//mAcX/5gHMAA4Bzv/mAdEACwHTAA8B1wATAdkADgHeAA4B5f/mAeYACwHoAA4B6v/lAe//5gHw//QB9wASAf4ADwIF/+cCCv/oAg//5wIcAA8CKQAPAjf/5gI5/+YCWAAOAmL/5gJj/+cCbv/mAnD/5gJy/+YCdAAOAnb/5gJ4/+UCef/oAnr/5QJ7/+gCgwAOAocADgKIAA8Cjf/lAo7/6AKSAA8ClAAPAp4ADgKwAAsCsgALArQACwK2/+UCt//oAr4ADgLG/+YCyP/mAsoADgLQ/+YC0f/nAtQADgLVAA8C1gAPAwIADwMEAA8DBgAPAwgADwMKAA8DDAAPAw4ADwMQAA8DEgAPAxQADwMWAA8DGAAPA1T/5gNW/+YDWP/mA1r/5gA3AAb/vwAL/78AOP+fADr/yQA9/60AoP+tASX/nwEn/58BOf+tATv/rQFi/58BZv+/AX//rQGV/60Bm/+tAcX/nwHO/58B0f/sAeX/nwHm/+wB6v/mAe//xAIF/80CD//VAjf/yQI5/8kCYv+fAmP/zAJu/58CcP+tAnL/rQJ2/58CeP/mAnr/5gJ+/98Cjf/mArD/7AKy/+wCtP/sArb/5gLG/9ECyP/sAtD/oQLR/88DVP+tA1b/rQNY/60DWv+tA3D/vwNx/78Dc/+/A3T/vwN1/78Dfv+/A3//vwAwADj/4wA8/+UAPf/kAKD/5AEl/+MBJ//jATn/5AE7/+QBYv/jAX//5AGV/+QBl//lAZv/5AHF/+MBzP/lAc7/4wHR/+kB1//iAdn/5QHe/+UB5f/jAeb/6QHo/+UB/v/qAhz/6gJY/+UCYv/jAm7/4wJw/+QCcv/kAnT/5QJ2/+MCg//lAof/5QKI/+oCnv/lArD/6QKy/+kCtP/pAr7/5QLK/+UC0P/kAtT/5QLV/+oDVP/kA1b/5ANY/+QDWv/kACMAOP/iADz/5AEl/+IBJ//iAWL/4gGX/+QBxf/iAcz/5AHO/+IB0f/pAdf/4QHZ/+QB3v/kAeX/4gHm/+kB6P/kAff/5AH+/+sCHP/rAlj/5AJi/+ICbv/iAnT/5AJ2/+ICg//kAof/5AKI/+sCnv/kArD/6QKy/+kCtP/pAr7/5ALK/+QC1P/kAtX/6wAXADj/6wA9//MAoP/zASX/6wEn/+sBOf/zATv/8wFi/+sBf//zAZX/8wGb//MBxf/rAc7/6wHl/+sCYv/rAm7/6wJw//MCcv/zAnb/6wNU//MDVv/zA1j/8wNa//MANgBR/+8AUv/vAFT/7wBc//AAtP/vAQf/7wEJ/+8BC//vAQz/7wGe/+8Bp//vAfb/7wH3/+4B+f/wAfv/7wH8/+8B/f/vAf//7wIA/+8CAv/vAgP/7wIF/+4CCP/wAgn/7wIL/+8CDP/vAg//7wIR/+8CFv/vAh3/7wIf/+8CIP/vAiT/9AJC//ECTf/vAln/8AJd/+8CY//vAmX/7wJn/+8Cdf/wAoT/8AKK/+8CjP/vApD/7wKf//ACpf/vAqf/7wK5/+8Cu//vAr3/7wK///AC0f/vAuf/7wAiAAb/8gAL//IAWv/1AF3/9QDA//UAwv/1ATr/9QFm//IBo//1Aa3/9QIF//QCBv/1Ag//9AIh//UCJP/1Ajj/9QI6//UCY//1AnH/9QKx//UCs//1ArX/9QLR//UDVf/1A1f/9QNZ//UDW//1A3D/8gNx//IDc//yA3T/8gN1//IDfv/yA3//8gAyAFH/7gBS/+4AVP/uALT/7gEH/+4BCf/uAQv/7gEM/+4Bnv/uAaf/7gH2/+4B9wAUAfv/7gH8/+4B/f/uAf//7gIA/+4CAv/uAgP/7gIF/+0CCf/uAgr/7QIL/+4CDP/uAg3/0AIP/+4CEf/uAhb/7gId/+4CH//uAiD/7gJN/+4CXf/uAmP/7QJl/+4CZ//uAnn/7QJ7/+0Civ/uAoz/7gKO/+0CkP/uAqX/7gKn/+4Ct//tArn/7gK7/+4Cvf/uAtH/7QLn/+4ACgAG//UAC//1AWb/9QNw//UDcf/1A3P/9QN0//UDdf/1A37/9QN///UAWQBH//AASP/wAEn/8ABL//AAU//HAFX/8ACq//AAq//wAKz/8ACt//AArv/wALX/xwC2/8cAt//HALj/xwC5/8cAyv/wAMz/8ADO//AA0P/wANL/8ADW//AA2P/wANr/8ADc//AA3v/wAOD/8ADi//AA5P/wAOb/8AEQ/8cBEv/HART/xwEW//ABRv/wAZz/8AGh//ABr//HAbL/8AGz//ABvP/HAfj/8AIB/8cCBP/wAgf/8AIT//ACFP/wAhf/8AI2/8cCPP/wAj7/6wJA//ACRP/wAmv/8AJt//ACmf/wApv/8AKd//ACqf/HAqv/8AKt/8cCw//wAsT/8ALF//ACz//wAxv/8AMd//ADH//wAyH/8AMj//ADJf/wAyf/8AMp//ADL//HAzH/xwMz/8cDNf/HAzf/xwM5/8cDO//HAz3/8AM///ADQf/wA0P/xwNF//AD3P/rA97/6wPm/+kD6v/rAKEABgANAAsADQBF//AAR//AAEj/wABJ/8AASgANAEv/wABT/+IAVf/AAFoACwBdAAsAo//wAKT/8ACl//AApv/wAKf/8ACo//AAqv/AAKv/wACs/8AArf/AAK7/wAC1/+IAtv/iALf/4gC4/+IAuf/iAMAACwDCAAsAxP/wAMb/8ADI//AAyv/AAMz/wADO/8AA0P/AANL/wADW/8AA2P/AANr/wADc/8AA3v/AAOD/wADi/8AA5P/AAOb/wAEQ/+IBEv/iART/4gEW/8ABOgALAUb/wAFP//ABZgANAZz/wAGh/8ABowALAa0ACwGv/+IBsf/WAbL/wAGz/8ABtv/VAbz/4gHz//AB9//IAfj/wAH+/9cCAf/iAgT/wAIGAAsCB//AAhP/wAIU/8ACF//AAhz/1wIhAAsCNv/iAjgACwI6AAsCPP/AAj7/7AJA/8ACQgAMAkT/wAJr/8ACbf/AAnEACwKI/9cCk//wApX/8AKZ/8ACm//AAp3/wAKp/+ICq//AAq3/4gKxAAsCswALArUACwLD/8ACxP/AAsX/wALHAAsCyQALAs//wALV/9cC1//wAwP/8AMF//ADB//wAwn/8AML//ADDf/wAw//8AMR//ADE//wAxX/8AMX//ADGf/wAxv/wAMd/8ADH//AAyH/wAMj/8ADJf/AAyf/wAMp/8ADL//iAzH/4gMz/+IDNf/iAzf/4gM5/+IDO//iAz3/wAM//8ADQf/AA0P/4gNF/8ADVQALA1cACwNZAAsDWwALA3AADQNxAA0DcwANA3QADQN1AA0DfgANA38ADQPXAA0D2QAOA9r/9QPc/+wD3v/tA+b/7APq/+4D7P+/A/cADQAPAfcAFAH+ABACBf/wAgr/8AIP//ACEgAWAhwAEAJj/+YCef/wAnv/3AKIABACjv/wArf/8ALR//AC1QAQAEwAR//uAEj/7gBJ/+4AS//uAFX/7gCq/+4Aq//uAKz/7gCt/+4Arv/uAMr/7gDM/+4Azv/uAND/7gDS/+4A1v/uANj/7gDa/+4A3P/uAN7/7gDg/+4A4v/uAOT/7gDm/+4BFv/uAUb/7gGc/+4Bof/uAbL/7gGz/+4B9wASAfj/7gH+AA4CBP/uAgX/4wIH/+4CCv/jAg3/uAIP/+MCE//uAhT/7gIX/+4CHAAOAjz/7gJA/+4CRP/uAmP/ugJr/+4Cbf/uAnn/4wJ7/9kCiAAOAo7/4wKZ/+4Cm//uAp3/7gKr/+4Ct//jAsP/7gLE/+4Cxf/uAs//7gLR/+MC1QAOAxv/7gMd/+4DH//uAyH/7gMj/+4DJf/uAyf/7gMp/+4DPf/uAz//7gNB/+4DRf/uACAAWv/AAF3/wADA/8AAwv/AATr/wAGj/8ABrf/AAgX/gAIG/8ACCv/uAg//8AIh/8ACJP/bAjj/wAI6/8ACQv/cAmP/RwJx/8ACef/uAnv/7gKO/+4Csf/AArP/wAK1/8ACt//uAscABwLJ//QC0f9/A1X/wANX/8ADWf/AA1v/wAAhAFr/9ABc//AAXf/0AMD/9ADC//QBOv/0AaP/9AGt//QB9//vAfn/8AH+//MCBv/0Agj/8AIP/+4CHP/zAiH/9AI4//QCOv/0Aln/8AJx//QCdf/wAoT/8AKI//MCn//wArH/9AKz//QCtf/0Ar//8ALV//MDVf/0A1f/9ANZ//QDW//0AAoABv/WAAv/1gFm/9YDcP/WA3H/1gNz/9YDdP/WA3X/1gN+/9YDf//WABUAXP/gAfn/4AIF/3YCCP/gAgr/wgIP/9MCJP/ZAkL/2wJZ/+ACY/8eAnX/4AJ5/8ICe//tAoT/4AKO/8ICn//gArf/wgK//+ACx//wAsn/8gLR/1YADQIF/2QCCv/SAg//2QIk/9kCQv/bAmP/HgJ5/9ICe//tAo7/0gK3/9ICx//wAsn/8gLR/1YACgHv/8MCBf/PAg//1AJj/84Cev/nAn7/3wLG/9ECyP/sAtD/oALR/9EACQIF/2oCD//GAiT/2QJC/9sCY/8eAnv/7QLH//ACyf/yAtH/VgAJAA0AFABBABEAVv/iAGEAEwPc/9kD3v/ZA+b/2QPq/9kD7P+0AAoABv/XAAv/1wFm/9cDcP/XA3H/1wNz/9cDdP/XA3X/1wN+/9cDf//XABQAW//BAZb/xQG0/7QB9P/XAgX/uQIP/+kCJP+yAj7/0gJC/8gCY/+gAnv/xQKa/+QCx//MAsn/zALR/8sC0v/vA9z/5wPe/+cD5v/mA+r/6AA6AAT/xABW/78AW//RAG7/bAB+/24Aif9DAKn/rAC7/6EBlv+4AaX/fgGp/3sBsP+bAbH/eQG0/7IBtv9+Abj/fQG5/3wB1/+vAe8ADwH0/+QB9f+gAff/dAH6/4ACBf+yAg7/fQIP/7ICEP+AAhL/eQIVACgCIv99AiT/fwI+/2YCQv/aAlH/gQJT/5gCX/99AmP/swJp/6ACe/98An7/mgJ//2wCmv/mAsL/awLH/5ICyf+tAs3/ewLQAA8C0f+RAtL/8gPW//ED2f/xA9r/vAPc/7kD3v+5A+b/uQPq/7kD7P+vA/b/7QAGAbT/6gH3/+4CBf/WAg//7QJj/+wC0f/sABIB1/+uAe8AEgH1/+AB9/+tAfr/1gIO/98CEv/SAiL/4AI+/84CUf/dAlP/4gJf/+ACaf/gAnv/6QJ//9oCwv+9As3/3wLQABEAMABW/34AW/+dAG7+8QB+/vQAif6rAKn/XgC7/0sBlv9yAaX/DwGp/woBsP9BAbH/BwG0/2gBtv8PAbj/DgG5/wwB1/9jAe8ABQH0/70B9f9JAff+/gH6/xMCBf9oAg7/DgIP/2gCEP8TAhL/BwIVADACIv8OAiT/EQI+/ucCQv+sAlH/FQJT/zwCX/8OAmP/agJp/0kCe/8MAn7/PwJ//vECmv/AAsL+7wLH/zECyf9fAs3/CgLQAAUC0f8wAtL/1QACAff/aAI+/+4AFwGW/9QBqP/tAasAEQG0/+ABtv/nAbj/5QG5/+4B1wASAfT/6QIF/9cCY//XAnv/0wJ+/9YCf//FApr/5wLGAA0CyAAMAtH/1gLS//ID3P/pA97/5wPm/+cD6v/pAAECPv/xAAICBf/WA3H/iAAJAA0ADwBBAAwAVv/rAGEADgPc/+cD3v/nA+b/5wPq/+kD7P/LAB0AI/+vAFj/7wBb/98BR//u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AX4BfgAFAX8BfwAQAYIBggACAYMBgwADAYQBhAAcAYUBhQACAYYBhgAGAYcBhwARAYgBiAAHAYkBiQAFAYoBigAHAYsBiwAJAYwBjAACAY0BjgAHAZABkAAFAZIBkgALAZQBlAAMAZUBlQAQAZcBlwAPAZoBmgAHAZsBmwAQAZ4BngAWAaMBowAZAacBpwAWAa0BrQAZAa8BrwAXAbEBsQATAbwBvAAXAcMBxAAGAcYBxgAcAckBygAHAcsBywAIAcwBzQAdAc8BzwAJAdEB0QAeAdIB0gAHAdMB0wACAdUB1QADAdYB1gAcAdgB2AAGAdkB2QAPAdsB2wAHAd0B3QAJAd4B4AAHAeEB4QAFAeMB4wALAeQB5AAEAeUB5QAMAeYB5gAeAegB6AAPAekB6QAHAesB6wAHAe0B7QAdAe8B7wAdAfMB8wASAfYB9gAfAfgB+AAVAfkB+QAaAgECAQAXAgMCAwATAgQCBAAUAgYCBgAZAgcCBwATAggCCAAaAg0CDQAgAg8CDwAgAhACEAATAhMCFAAVAhYCFgAfAhwCHQAgAiECIQAZAiUCJQAdAiYCJgAgAikCKQACAjYCNgAXAjcCNwANAjgCOAAZAjkCOQANAjoCOgAZAlECUQATAlICUgAcAlMCUwAfAlQCVAAcAlgCWAAPAlkCWQAaAlwCXAAJAl4CXgAJAmACYAAJAmICYgAJAmQCZAAHAmwCbAAEAm0CbQAUAm4CbgAMAnACcAAQAnECcQAZAnICcgAQAnQCdAAPAnUCdQAaAn0CfQAWAoICggAHAoMCgwAPAoQChAAaAosCiwAHAo8CjwAHApECkQAHApICkgACApMCkwASApQClAACApUClQASApgCmAAGApkCmQAVApsCmwAVAp0CnQAVAp4CngAPAp8CnwAaAqgCqAAFAqkCqQAXAq0CrQAXAq8CrwATArACsAAeArECsQAZArICsgAeArMCswAZArQCtAAeArUCtQAZArgCuAAcArkCuQAfAr0CvQAfAr4CvgAPAr8CvwAaAtYC1gACAtcC1wASAuYC5gAHAucC5wAWAvgC+AAOAvoC+gAOAvwC/AAOAwIDAgACAwMDAwASAwQDBAACAwUDBQASAwYDBgACAwcDBwASAwgDCAACAwkDCQASAwoDCgACAwsDCwASAwwDDAACAw0DDQASAw4DDgACAw8DDwASAxADEAACAxEDEQASAxIDEgACAxMDEwASAxQDFAACAxUDFQASAxYDFgACAxcDFwASAxgDGAACAxkDGQASAxoDGgAGAxsDGwAVAxwDHAAGAx0DHQAVAx4DHgAGAx8DHwAVAyADIAAGAyEDIQAVAyIDIgAGAyMDIwAVAyQDJAAGAyUDJQAVAyYDJgAGAycDJwAVAygDKAAGAykDKQAVAyoDKgAHAywDLAAHAy4DLgAFAy8DLwAXAzADMAAFAzEDMQAXAzIDMgAFAzMDMwAXAzQDNAAFAzUDNQAXAzYDNgAFAzcDNwAXAzgDOAAFAzkDOQAXAzoDOgAFAzsDOwAXA0MDQwAXA0YDRgAIA0gDSAAIA1QDVAAQA1UDVQAZA1YDVgAQA1cDVwAZA1gDWAAQA1kDWQAZA1oDWgAQA1sDWwAZA1wDXAAFA3IDcgABA3YDdgABA3oDewABBDEEMQAEBDMENAAFAAEABgQwAAEAAAAAAAAAAAABAAAAAAAAAAAAFgAZABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAAAAAACAAAAAAAGgAAAAAAAAAAAAgAAAAIAAAAGwAJAAoACwAMABcADQAYAAAAAAAAAAAAAAAAAAMAAAAEAAQABAAAAAQAAAAAAAAAAAAAAAUABQAGAAUABAAAAAcAAAAOAA8AAAAcAA8AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgAAAAIAAoACgAKAAoADQAAAAAAAwADAAMAAwADAAMAAAAEAAQABAAEAAQAAAAAAAAAAAAAAAUABgAGAAYABgAGAAAAAAAOAA4ADgAOAA8AAAAPAAIAAwACAAMAAgADAAgABAAIAAQACAAEAAgABAAAAAQAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQACAAEAAgABAAIAAQACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABQAAAAUABQAAAAAACAAGAAgABgAIAAYACAAEAAAAAAAAAAAAAAAAABsABwAbAAcAGwAHABsABwAJAAAACQAAAAAAAAAKAA4ACgAOAAoADgAKAA4ACgAOAAoADgAMAAAADQAPAA0AGAAQABgAEAAYABAAAAAAAAAACAAEAAAADgAAAAAAAAAAAAAAAgADAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAHAAkAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAACAANAAAAAAACAAAAAAACAAAAGAAAAAgAAAAAAAIAAAAAAAAACAAAAAAAAAAAAA0AAAAXAAAAAAAAAA0ABAAAAAUAAAAOAAQAAAAPAAAAAAAAAAUAAAAAAAAAAAAAAA8AAAAGAAAAAAAEAAQAAAAOAAAAAAAAAAAAAAAOAAYADgAAAAAAAAAAAAAAAAAAAAkAAAAIAAAAAAAAABoAEQAAAAkAAAAAABUAAAACAAAAAAAAAAAAAAAXAAAAAAAAAAAAEQAAAAAACAAAAAAACAAJABUAAAAXAAAAEgAAAAAAAAAAAAAAAAAAAAAAAwAAAAAABQAAAAQAHAAAAAUABQAFABMABQAFAAYABQAFAAQAAAAPAAQAHAAFABQABQAFAAAAAAAFAAAABQAAAAQABAAAAAUABAAHAAAAAAAAABMABQAAAAUABQAPAAAACAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAGAAsADwALAA8ACAAEAAgAAAAIAAQACAAAAAgABAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAABcAHAAAAAAAAAAFAAAAAAAAAAAACQAAAAAABQAAAAUAAAAAAAgABAAIAAQACQAAAA0ADwANAAAAFwAcAAkAAAASABQAAAAAAAAAAAAAAAAAAAAAAAAAFwAcAAAAAAARABMAAAAFAAAABQASABQAAAAFAAAAAgADAAIAAwAAAAAAAAAEAAAABAAAAAQAFwAcAAAAAAAAAAAAAAAFAAAABQAIAAYACAAEAAgABgAAAAAAFQAPABUADwAVAA8AEgAUAAAABQAAAAUAAAAFABcAHAAAAAAAAAAEAAQABAAAAAAAAAAAABEAAAAAAAAACAAEAAAAAAAAAAAAEQATAAIAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAMAAAAAAAAAAAAAAACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwACAAMAAgADAAIAAwAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAACAAGAAgABgAIAAYACAAGAAgABgAIAAYACAAGAAgABAAIAAQACAAEAAgABgAIAAQACgAOAAoADgAAAA4AAAAOAAAADgAAAA4AAAAOAA0ADwANAA8ADQAPAA0ADwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAGQAZAAAAAQABABYAAQABAAEAFgAAAAAAAAAWABYAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAIAAgAAAABAAAACgIGCBAABERGTFQAGmN5cmwASGdyZWsAdmxhdG4ApAAEAAAAAP//ABIAAAAKABQAHgAoADQAQQBLAFUAXwBpAHMAfQCHAJEAmwClAK8ABAAAAAD//wASAAEACwAVAB8AKQA1AEIATABWAGAAagB0AH4AiACSAJwApgCwAAQAAAAA//8AEgACAAwAFgAgACoANgBDAE0AVwBhAGsAdQB/AIkAkwCdAKcAsQAoAAZBWkUgAFRDUlQgAH5NT0wgAKhOQVYgANRST00gAQBUVVIgASwAAP//ABMAAwANABcAIQArADIANwBEAE4AWABiAGwAdgCAAIoAlACeAKgAsgAA//8AEgAEAA4AGAAiACwAOABFAE8AWQBjAG0AdwCBAIsAlQCfAKkAswAA//8AEgAFAA8AGQAjAC0AOQBGAFAAWgBkAG4AeACCAIwAlgCgAKoAtAAA//8AEwAGABAAGgAkAC4AOgA+AEcAUQBbAGUAbwB5AIMAjQCXAKEAqwC1AAD//wATAAcAEQAbACUALwA7AD8ASABSAFwAZgBwAHoAhACOAJgAogCsALYAAP//ABMACAASABwAJgAwADwAQABJAFMAXQBnAHEAewCFAI8AmQCjAK0AtwAA//8AEwAJABMAHQAnADEAMwA9AEoAVABeAGgAcgB8AIYAkACaAKQArgC4ALljMnNjBFhjMnNjBF5jMnNjBGRjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjMnNjBGpjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBjY21wBHBkbGlnBHhkbGlnBH5kbGlnBIRkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbGlnBIpkbm9tBJBkbm9tBJZkbm9tBJxkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJkbm9tBKJmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhmcmFjBKhsaWdhBLJsaWdhBLpsbnVtBMBsbnVtBMZsbnVtBMxsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsbnVtBNJsb2NsBNhsb2NsBN5sb2NsBORudW1yBOpudW1yBPBudW1yBPZudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxudW1yBPxvbnVtBQJvbnVtBQhvbnVtBQ5vbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRvbnVtBRRwbnVtBRpwbnVtBSBwbnVtBSZwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxwbnVtBSxzbWNwBTJzbWNwBThzbWNwBT5zbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzbWNwBURzczAxBUpzczAxBVBzczAxBVZzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAxBVxzczAyBWJzczAyBWhzczAyBW5zczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAyBXRzczAzBXpzczAzBYBzczAzBYZzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczAzBYxzczA0BZJzczA0BZhzczA0BZ5zczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA0BaRzczA1BapzczA1BbBzczA1BbZzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA1BbxzczA2BcJzczA2BchzczA2Bc5zczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA2BdRzczA3BdpzczA3BeBzczA3BeZzczA3BexzczA3BexzczA3BexzczA3BexzczA3BexzczA3BexzczA3Bex0bnVtBfJ0bnVtBfh0bnVtBf50bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgR0bnVtBgQAAAABAAEAAAABAAMAAAABAAIAAAABAAAAAAACAAgACQAAAAEADgAAAAEAEAAAAAEADwAAAAEADQAAAAEAQwAAAAEARQAAAAEARAAAAAEAQgAAAAMAPwBAAEEAAAACABEAEgAAAAEAEgAAAAEAPAAAAAEAPgAAAAEAPQAAAAEAOwAAAAEACgAAAAEADAAAAAEACwAAAAEARwAAAAEASQAAAAEASAAAAAEARgAAAAEAMAAAAAEAMgAAAAEAMQAAAAEALwAAAAEAOAAAAAEAOgAAAAEAOQAAAAEANwAAAAEABQAAAAEABwAAAAEABgAAAAEABAAAAAEAFAAAAAEAFgAAAAEAFQAAAAEAEwAAAAEAGAAAAAEAGgAAAAEAGQAAAAEAFwAAAAEAHAAAAAEAHgAAAAEAHQAAAAEAGwAAAAEAIAAAAAEAIgAAAAEAIQAAAAEAHwAAAAEAJAAAAAEAJgAAAAEAJQAAAAEAIwAAAAEAKAAAAAEAKgAAAAEAKQAAAAEAJwAAAAEALAAAAAEALgAAAAEALQAAAAEAKwAAAAEANAAAAAEANgAAAAEANQAAAAEAMwBLAJgAmACYAJgEJgQmBCYEJgcUB8AOUA5QDmYOiA6IDogOiA6+DuQPEg8SDxIPEg8mDyYPJg8mDzoPOg86DzoPTg9OD04PTg9gD2APYA9gD3oPeg96D3oPvA+8D7wPvA/aD9oP2g/aD/gP+A/4D/gQKhAqECoQKhBcEFwQXBBcEI4QohDuEMwQzBDMEMwQ7hDuEO4Q7hEaAAEAAAABAAgAAgHEAN8DvQPsA+sD6gPpA+gD5wPmA+UD5APjA+ID4QPgA98D3gPdA9wD2wPaA9kD2APXA9YD9gP3BKkDvAO7BFAEUQRSBFMEVARVBFcEWARZBFoEWwRcBF0EXgRfBE4EYARhBGIEYwRkBGUEZgRtBG4EbwRwBEwEcQRyBHMEdAR1BHYEdwR4BE0EeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMERASUBJUElgSXBJgEmQSaBJ0EnARPBJ4EnwSgBKEEogSjBKQEpQSmBKcEqAP+BFYEmwSqBKsErAStBK4ErwSwBLEEsgO6A7kEswS0BLUDuAS2BLcDtwS4A7YEuQPGBLoD0QS7BLwD0gS9A9MD1AS+BL8EwAP5BMED+ATCBMMExATFA/8EAAQBBMYExwQCBMgEAwTJBMoEBATLBAUEBgQHBMwECAQJBM0EzgTPBNAE0QTSBNMECgTcBNQECwQMBA0EDgQPBBAEEQQSBBMEFAQ4BBUEFgTVBBcEGAQZBNYEGgTXBNgEGwQcBB0EHgQfBCAE2QQhBCIE2gQjBNsEJAQlBCcEJgABAN8ACAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4AZgBoAIMAhACFAIYAhwCIAIoAiwCMAI0AjgCPAJAAkQCSAJMAlACVAJYAlwCYAJkAnACdAJ4AnwCgAKIAwwDFAMcAyQDLAM0AzwDRANMA1QDXANkA2wDdAN8A4QDjAOUA5wDrAO0A7wDxAPMA9wD5APwA/gEAAQIBBgEIAQoBDwERARMBFQEXARkBGwEdAR8BIQEjASUBJwEpASsBLQEvATEBMwE1ATcBOQE7ATwBPgFAAU4BYgF5AXsBfAF9AX4BfwGAAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gJSAlQCWAJaAlwCXgJiAmQCagJsAnACcgJ0AnYCegJ8An4CgAKaAqICpAKqArADhwOOA5MDlgABAAAAAQAIAAIBdAC3A+wD6wPqA+kD6APnA+YD5QPkA+MD4gPhA+AD3wPeA90D3APbA9oD2QPYA9cD1gP2A/cEqQRQBFEEUgRTBFQEVQRXBFgEWQRaBFsEXARdBF4EXwROBGAEYQRiBGMEZARlBGYEbQRuBG8EcASmBHEEcgRzBHQEdQR2BHcEeARNBHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBEQElASVBJYElwSYBJkEmgSdBJwETwSeBJ8EoAShBKIEowSkBKUEpwSoA/4EVgSbBMgEAwTJBMoEBATLBAUEBgQHBMwECAQJBM0EzgTPBNAE0QTSBNMECgTcBNQECwQMBA0EDgQPBBAEEQQSBBMEFATAA/kEwQP4BMIEwwTEBMUD/wQABAEExgTHBAIEOAQVBBYE1QQXBBgEGQTWBBoE1wTYBBsEHAQdBB4EHwQgBNkEIQQiBNoEIwTbAAEAtwBFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AowCkAKUApgCnAKgAqgCrAKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC8AL0AvgC/AMAAwgDEAMYAyADKAMwAzgDQANIA1ADWANgA2gDcAN4A4ADiAOQA5gDoAOwA7gDwAPIA9AD4APoA/QD/AQEBAwEHAQkBCwEQARIBFAEWARgBGgEcAR4BIAEiASQBJgEoASoBLAEuATABMgE0ATYBOAE6AT0BPwFBAU8BYwHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIQIiAlMCVQJZAlsCXQJfAmMCZQJrAm0CcQJzAnUCdwJ7An0CfwKBApsCowKlAqsCsQAGAAAABgASACoAQgBaAHIAigADAAAAAQASAAEAkAABAAAASgABAAEATQADAAAAAQASAAEAeAABAAAASgABAAEATgADAAAAAQASAAEAYAABAAAASgABAAEA8gADAAAAAQASAAEASAABAAAASgABAAECGQADAAAAAQASAAEAMAABAAAASgABAAECGwADAAAAAQASAAEAGAABAAAASgABAAEDLQACAAEBcQF1AAAABAAAAAEACAABBh4ANgByAKQArgC4AMoA/AEOARgBSgFkAX4BkAG6AewB9gIYAjICRAJ2AogCogLMAt4DEAMaAyQDNgNoA3IDfAOGA6ADugPMA/YEKAQyBFQEbgSABLIExATeBQgFGgUkBS4FOAVCBWwFlgXABeoGFAAGAA4AFAAaACAAJgAsAIMAAgFxAIQAAgFyAIYAAgFzAwQAAgF0AVQAAgF1AwIAAgF2AAEABALYAAIBdgABAAQAyQACAXIAAgAGAAwC2gACAXYC3AACA6sABgAOABQAGgAgACYALACLAAIBcQCMAAIBcgMeAAIBcwMcAAIBdAFWAAIBdQMaAAIBdgACAAYADAFKAAIBcgDlAAIDqwABAAQC3gACAXYABgAOABQAGgAgACYALACPAAIBcQCQAAIBcgDrAAIBcwMqAAIBdAFYAAIBdQMsAAIBdgADAAgADgAUAuAAAgFyAuIAAgF2APkAAgOrAAMACAAOABQA/AACAXIC5AACAXYA/gACA6sAAgAGAAwC5gACAXIC6AACAXYABQAMABIAGAAeACQBTAACAXEBBgACAXIAlAACAXMC6gACAXYBCAACA6sABgAOABQAGgAgACYALACVAAIBcQCWAAIBcgCYAAIBcwMwAAIBdAFaAAIBdQMuAAIBdgABAAQC7AACAXIABAAKABAAFgAcARcAAgFyAVwAAgF1Au4AAgF2ARkAAgOrAAMACAAOABQBHQACAXIC8AACAXYBYAACA6sAAgAGAAwC8gACAXYBYgACA6sABgAOABQAGgAgACYALACcAAIBcQCdAAIBcgErAAIBcwNIAAIBdAFeAAIBdQNGAAIBdgACAAYADAL0AAIBcwL2AAIBdgADAAgADgAUAvgAAgFxAvoAAgFyAv4AAgF2AAUADAASABgAHgAkA1QAAgFxAKAAAgFyA1oAAgFzA1gAAgF0A1YAAgF2AAIABgAMATwAAgFyAwAAAgF2AAYADgAUABoAIAAmACwAowACAXEApAACAXIApgACAXMDBQACAXQBVQACAXUDAwACAXYAAQAEAtkAAgF2AAEABADKAAIBcgACAAYADALbAAIBdgLdAAIDqwAGAA4AFAAaACAAJgAsAKsAAgFxAKwAAgFyAx8AAgFzAx0AAgF0AVcAAgF1AxsAAgF2AAEABAFLAAIBcgABAAQC3wACAXYAAQAEAy0AAgF2AAMACAAOABQC4QACAXIC4wACAXYA+gACA6sAAwAIAA4AFAD9AAIBcgLlAAIBdgD/AAIDqwACAAYADALnAAIBcgLpAAIBdgAFAAwAEgAYAB4AJAFNAAIBcQEHAAIBcgC0AAIBcwLrAAIBdgEJAAIDqwAGAA4AFAAaACAAJgAsALUAAgFxALYAAgFyALgAAgFzAzEAAgF0AVsAAgF1Ay8AAgF2AAEABALtAAIBcgAEAAoAEAAWABwBGAACAXIBXQACAXUC7wACAXYBGgACA6sAAwAIAA4AFAEeAAIBcgLxAAIBdgFhAAIDqwACAAYADALzAAIBdgFjAAIDqwAGAA4AFAAaACAAJgAsALwAAgFxAL0AAgFyASwAAgFzA0kAAgF0AV8AAgF1A0cAAgF2AAIABgAMAvUAAgFzAvcAAgF2AAMACAAOABQC+QACAXEC+wACAXIC/wACAXYABQAMABIAGAAeACQDVQACAXEAwAACAXIDWwACAXMDWQACAXQDVwACAXYAAgAGAAwBPQACAXIDAQACAXYAAQAEAVAAAgFyAAEABAFSAAIBcgABAAQBUQACAXIAAQAEAVMAAgFyAAUADAASABgAHgAkAK8AAgFxALAAAgFyAOwAAgFzAysAAgF0AVkAAgF1AAUADAASABgAHgAkAz4AAgFxAzwAAgFyA0IAAgFzA0AAAgF0A0QAAgF2AAUADAASABgAHgAkAz8AAgFxAz0AAgFyA0MAAgFzA0EAAgF0A0UAAgF2AAUADAASABgAHgAkA0wAAgFxA0oAAgFyA1AAAgFzA04AAgF0A1IAAgF2AAUADAASABgAHgAkA00AAgFxA0sAAgFyA1EAAgFzA08AAgF0A1MAAgF2AAEABAHBAAIBcgACABEAJQApAAAAKwAtAAUALwA0AAgANgA7AA4APQA+ABQARQBJABYASwBNABsATwBUAB4AVgBbACQAXQBeACoAiQCJACwAmwCbAC0AqQCpAC4AuwC7AC8A9AD0ADABRQFIADEBwAHAADUAAQAAAAEACAABAAYAPwABAAIBIQEiAAEAAAABAAgAAgAOAAQE3QTeBN8E4AABAAQAxwDIANsA3AAEAAAAAQAIAAEAJgACAAoAHAACAAYADAOsAAIASgOxAAIAWAABAAQDsgACAFgAAQACAEoAVwAEAAAAAQAIAAEARAACAAoAFAABAAQDrQACAE0AAQAEA68AAgBNAAQAAAABAAgAAQAeAAIACgAUAAEABAOuAAIAUAABAAQDsAACAFAAAQACAEoDrAABAAAAAQAIAAEABgN5AAEAAQBLAAEAAAABAAgAAQAGAiIAAQABAaEAAQAAAAEACAABAAYDjAABAAEANgABAAAAAQAIAAIAHAACA8EDwAABAAAAAQAIAAIACgACA78DvgABAAIALwBPAAEAAAABAAgAAgAeAAwEMQQzBDIENAQ1BCgEKQQqA/sELAQtBC4AAQAMACcAKAArADMANQBGAEcASABLAFMAVABVAAEAAAABAAgAAgAMAAMELwQwBDAAAQADAEkASwP7AAEAAAABAAgAAgBmAAgERgQ2BDcEOQQ6BEIEQwRFAAEAAAABAAgAAgAWAAgAGwAVABQAHQAZABgAFwAWAAEACAP6BCsEZwRoBGkEagRrBGwAAQAAAAEACAACABYACARnBCsEbARrBGoEaQP6BGgAAQAIABQAFQAWABcAGAAZABsAHQABAAAAAQAIAAIAFgAIABUAFgAXABgAGQAbAB0AFAABAAgENgQ3BDkEOgRCBEMERQRGAAEAAAABAAgAAQAGA3AAAQABABMABgAAAAEACAADAAEAEgABAGYAAAABAAAASgACAAIDgwODAAADxwPQAAEAAQAAAAEACAACADwACgPQA88DzgPNA8wDywPKA8kDyAPHAAEAAAABAAgAAgAaAAoEOwB8AHUAdgQ8BD0EPgQ/BEAEQQACAAEAFAAdAAAAAQAAAAEACAACACYAEAPQA88DzgPNA8wDywPKA8kDyAPHBEkERwRKBEsESAThAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgDyAhkCGwMt",
  65902. "Roboto-Regular.ttf": "AAEAAAASAQAABAAgR0RFRtRX1FkAAg/sAAACREdQT1NKcuCzAAISMAAAUiRHU1VCw4aZEQACZFQAABfoT1MvMqCnsaYAAAGoAAAAYGNtYXBAmkl2AAAafAAAEshjdnQgJEEG5QAAL9wAAABMZnBnbWf0XKsAAC1EAAABvGdhc3AACAATAAIP4AAAAAxnbHlmHN2bBQAAOfAAAdM2aGRteDc4ERcAABWQAAAE7GhlYWT4RqsOAAABLAAAADZoaGVhCroKggAAAWQAAAAkaG10eOiEiIgAAAIIAAATiGxvY2HgyGepAAAwKAAACcZtYXhwBxIC+QAAAYgAAAAgbmFtZTVTY1kAAg0oAAACmHBvc3T/bQBkAAIPwAAAACBwcmVwdKCP7AAALwAAAADbAAEAAAACAACEKlnoXw889QAbCAAAAAAAxPARLgAAAADQ206a+hv91QkwCHMAAAAJAAIAAAAAAAAAAQAAB2z+DAAACUn6G/5KCTAAAQAAAAAAAAAAAAAAAAAABOIAAQAABOIAjwAWAFQABQABAAAAAAAOAAACAAIUAAYAAQADBIUBkAAFAAAFmgUzAAABHwWaBTMAAAPRAGYCAAAAAgAAAAAAAAAAAOAACv9QACF/AAAAIQAAAABHT09HAEAAAP/9BgD+AABmB5oCACAAAZ8AAAAABDoFsAAgACAAAgOMAGQAAAAAAAAAAAH7AAAB+wAAAg8AoAKPAIgE7QB3BH4AbgXcAGkE+QBlAWUAZwK8AIUCyAAmA3IAHASJAE4BkgAdAjUAJQIbAJADTAASBH4AcwR+AKoEfgBdBH4AXgR+ADUEfgCaBH4AhAR+AE0EfgBwBH4AZAHwAIYBsQApBBEASARkAJgELgCGA8cASwcvAGoFOAAcBPsAqQU1AHcFPwCpBIwAqQRsAKkFcwB6BbQAqQItALcEagA1BQQAqQROAKkG/ACpBbQAqQWAAHYFDACpBYAAbQTtAKgEvwBQBMYAMQUwAIwFFwAcBxkAPQUEADkEzgAPBMoAVgIfAJIDSAAoAh8ACQNYAEADnAAEAnkAOQRaAG0EfQCMBDAAXASDAF8EPQBdAscAPAR9AGAEaACMAfEAjQHp/78EDgCNAfEAnAcDAIsEagCMBJAAWwR9AIwEjABfArUAjAQgAF8CnQAJBGkAiAPgACEGAwArA/cAKQPJABYD9wBYArUAQAHzAK8CtQATBXEAgwHzAIsEYABpBKYAWwW0AGkE2AAfAesAkwToAFoDWABmBkkAWwOTAJMDwQBmBG4AfwZKAFoDqgB4Av0AggRGAGEC7wBCAu8APgKCAHsEiACaA+kAQwIWAJMB+wB0Au8AegOjAHoDwABmBdwAVQY1AFAGOQBvA8kARAd6//IERABZBYAAdgS6AKYEwgCLBsEATgSwAH4EkQBHBIgAWwScAJUFmgAdAfoAmwRzAJoETwAiAikAIgWLAKIEiACRB6EAaAdEAGEB/ACgBYcAXQK5/+QFfgBlBJIAWwWQAIwE8wCIAgP/tAQ3AGIDxACpA40AjAOrAHgDagCBAfEAjQKtAHkCKgAyA8YAewL8AF4CWgB+AAD8pwAA/W8AAPyLAAD9XgAA/CcB7/04Ag0AtwQLAHECFwCTBHMAsQWkAB8FcQBnBT4AMgSRAHgFtQCyBJEARQW7AE0FiQBaBVIAcQSFAGQEvQCgBAIALgSIAGAEUABjBCUAbQSIAJEEjgB6ApcAwwRuACUD7ABlBMQAKQSIAJEETQBlBIgAYAQsAFEEXQCPBaMAVwWaAF8GlwB6BKEAeQRC/9oGSABKBf8AKgVkAHsIkQAxCKQAsQaCAD4FtACwBQsAogYEADIHQwAbBL8AUAW0ALEFqQAvBQcATQYsAFMF2QCvBXoAlgeHALAHwACwBhIAEAbrALIFBQCjBWQAkwcnALcFGABZBGwAYQSSAJ0DWwCaBNQALgYgABUEEABYBJ4AnARSAJwEoAAsBe8AnQSdAJwEngCcA9gAKAXNAGQEvQCcBFkAZwZ4AJwGngCRBPcAHgY2AJ0EWACdBE0AZAaHAJ0EZAAvBGj/6ARNAGcGyQAnBuQAnASJ//0EngCcBwgAnAYrAIEEVv/cBysAtwX4AJkE0gAoBEYADwcLAMkGCwC8BtEAkwXhAJYJBAC2B9EAmwQjAFAD2wBMBXEAZwSLAFsFCgAWBAMALgVxAGcEiABbBwEAnAYkAH4HCACcBisAgQUyAHUERwBkBP0AdAAA/GcAAPxxAAD9ZgAA/aQAAPobAAD6LARW/9wFGwCoBIkAjARjAKIDkACRBNsAsQQFAJEFCQCjBH4AmgaMAEQFgwA+B88AqAW0AJEIMQCwBvQAkQXuAHEE0wBtBywANAVcAB8FbwCWBGoAgwVwAIoGLwA/BL3/3gUJAKMEWgCaBbIAsQSIAJEFhwBdBKgAaASoAGkEtwA6A0kAOwT2AFcGlABZBuQAZAZWADYFKwAxBEkAUgQHAHkHwQBEBnUAPwf7AKkGoQCQBPYAdgQdAGUFrQAjBSAARgVkAJYDIABvBBQAAAgpAAAEFAAACCkAAAK5AAACCgAAAVwAAAR/AAACMAAAAaIAAADRAAAAAAAAAjQAJQI0ACUFQACiBj8AkAOmAA0BmQBgAZkAMAGXACQBmQBPAtQAaALbADwCwQAkBGkARgSPAFcCsgCKA8QAlAVaAJQA9gAmB6oARAJmAGwCZgBZA6MAOwLvADYDYAB6BKYAWwZVAB8GkACnCHYAqAdjADkGKwCMBH4AXwXaAB8EIgAqBHQAIAVIAF0FTwAfBecAegPOAGgIOgCiBQEAZwUXAJgGJgBUBtcAZAbPAGMGagBZBI8AagWOAKkErwBFBJIAqATFAD8IOgBiAgz/sASCAGUEZACYBBEAPgQvAIUECAArAkwAtQKPAG4CAwBcBPMAPARuAB8EiwA8BtQAPAbUADwE7gA8BpsAXwAAAAAIMwBbCDUAXAQgADsEngBaAfz/tgGRAGcDpACDA54AgQOfAIED9ABpBA4AaQPz/14D7wBuA6QAgQH9AJ8EhQATBFAAigR8AGAEgACKA+YAigPLAIoErABjBOMAigHoAJcDzwArBFQAigO0AIoGAgCKBOMAigS7AGAEXACKBLsAWQRKAIoEIABDBCYAKAR8AHQEZwAUBhUAMQRUACYEKwANBCMARwLvAFAC7wB6Au8AQgLvAD4C7wA2Au8AWwLvAFYC7wA6Au8ATwLvAEkDlgCPArUAngQ6AB4EwwBkBUwAsQUkALIEEwCSBT0AsgQPAJIEIABDBDMAMAQ8ABYDrwCKBGcAFAS7AGAEZwAUA4kAPgTOAIoD7wA/BWcAYAUXAGAE8gB1BXIAJgR8AGAHQQAnB08AigV0ACgEzQCKBFkAigUkAC4GCwAfBD8ARwTsAIoETgCLBMEAJwQfACIFKACKBGoAPQZRAIoGrACKBR0ACAXxAIoETgCKBHsASwZ2AIoEhwBQBBEACwZHAB8EeQCLBQkAiwU3ACMFwgBgBF8ADQSoACYGYQAmBGoAPQRqAIoFwwACBMoAXgQ/AEcEuwBgBDMAMAPjAEIIIgCKBKsAKAR9AIwEMgBcBJMAWwSMAFsDeQBXBI0AjAScAFsEPQBdBH0AYAWBAH4FrgB+BZMAsgXgAH4F4wB+A9UAoASCAIMDrwCKBFgADwTPAD4C7wBQAu8ANgLvAFsC7wBWAu8AOgLvAE8C7wBJBGsAZQQuAEoGpABgBLkAggUAAHgCBv+0AgT/tAH7AJsB+//6AfsAmwH7AIYEUACKAfsAAAI1ACUFXQAlBV0AJQSGAAAExgAxAp3/9AU4ABwFOAAcBTgAHAU4ABwFOAAcBTgAHAU4ABwFNQB3BIwAqQSMAKkEjACpBIwAqQIt/+ACLQCwAi3/6QIt/9YFtACpBYAAdgWAAHYFgAB2BYAAdgWAAHYFMACMBTAAjAUwAIwFMACMBM4ADwRaAG0EWgBtBFoAbQRaAG0EWgBtBFoAbQRaAG0EMABcBD0AXQQ9AF0EPQBdBD0AXQH6/8YB+gCWAfr/zwH6/7wEagCMBJAAWwSQAFsEkABbBJAAWwSQAFsEaQCIBGkAiARpAIgEaQCIA8kAFgPJABYFOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FNQB3BDAAXAU1AHcEMABcBTUAdwQwAFwFNQB3BDAAXAU/AKkFGQBfBIwAqQQ9AF0EjACpBD0AXQSMAKkEPQBdBIwAqQQ9AF0EjACpBD0AXQVzAHoEfQBgBXMAegR9AGAFcwB6BH0AYAVzAHoEfQBgBbQAqQRoAIwCLf+3Afr/nQIt/7YB+v+cAi3/7AH6/9ICLQAYAfH/+wItAKoGlwC3A9oAjQRqADUCA/+0BQQAqQQOAI0ETgChAfEAkwROAKkB8QBXBE4AqQKHAJwETgCpAs0AnAW0AKkEagCMBbQAqQRqAIwFtACpBGoAjARq/7wFgAB2BJAAWwWAAHYEkABbBYAAdgSQAFsE7QCoArUAjATtAKgCtQBTBO0AqAK1AGMEvwBQBCAAXwS/AFAEIABfBL8AUAQgAF8EvwBQBCAAXwS/AFAEIABfBMYAMQKdAAkExgAxAp0ACQTGADECxQAJBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBxkAPQYDACsEzgAPA8kAFgTOAA8EygBWA/cAWATKAFYD9wBYBMoAVgP3AFgHev/yBsEATgWAAHYEiABbBID/vgSA/74EJgAoBIUAEwSFABMEhQATBIUAEwSFABMEhQATBIUAEwR8AGAD5gCKA+YAigPmAIoD5gCKAej/vgHoAI4B6P/HAej/tATjAIoEuwBgBLsAYAS7AGAEuwBgBLsAYAR8AHQEfAB0BHwAdAR8AHQEKwANBIUAEwSFABMEhQATBHwAYAR8AGAEfABgBHwAYASAAIoD5gCKA+YAigPmAIoD5gCKA+YAigSsAGMErABjBKwAYwSsAGME4wCKAej/lQHo/5QB6P/KAegABgHoAIkDzwArBFQAigO0AIIDtACKA7QAigO0AIoE4wCKBOMAigTjAIoEuwBgBLsAYAS7AGAESgCKBEoAigRKAIoEIABDBCAAQwQgAEMEIABDBCYAKAQmACgEJgAoBHwAdAR8AHQEfAB0BHwAdAR8AHQEfAB0BhUAMQQrAA0EKwANBCMARwQjAEcEIwBHBTgAHATw//AGGP/+ApEABAWU//oFMv94BWb//QKX/5sFOAAcBPsAqQSMAKkEygBWBbQAqQItALcFBACpBvwAqQW0AKkFgAB2BQwAqQTGADEEzgAPBQQAOQIt/9YEzgAPBIUAZARQAGMEiACRApcAwwRdAI8EcwCaBJAAWwSIAJoD4AAhA/cAKQKX/+YEXQCPBJAAWwRdAI8GlwB6BIwAqQRzALEEvwBQAi0AtwIt/9YEagA1BSQAsgUEAKkFBwBNBTgAHAT7AKkEcwCxBIwAqQW0ALEG/ACpBbQAqQWAAHYFtQCyBQwAqQU1AHcExgAxBQQAOQRaAG0EPQBdBJ4AnASQAFsEfQCMBDAAXAPJABYD9wApBD0AXQNbAJoEIABfAfEAjQH6/7wB6f+/BFIAnAPJABYHGQA9BgMAKwcZAD0GAwArBxkAPQYDACsEzgAPA8kAFgFlAGcCjwCIBB4AoAID/7QBmQAwBvwAqQcDAIsFOAAcBFoAbQSMAKkFtACxBD0AXQSeAJwFiQBaBZoAXwUKABYEA//7CFkAWwlJAHYEvwBQBBAAWAU1AHcEMABcBM4ADwQCAC4CLQC3B0MAGwYgABUCLQC3BTgAHARaAG0FOAAcBFoAbQd6//IGwQBOBIwAqQQ9AF0FhwBdBDcAYgQ3AGIHQwAbBiAAFQS/AFAEEABYBbQAsQSeAJwFtACxBJ4AnAWAAHYEkABbBXEAZwSLAFsFcQBnBIsAWwVkAJMETQBkBQcATQPJABYFBwBNA8kAFgUHAE0DyQAWBXoAlgRZAGcG6wCyBjYAnQUEADkD9wApBIMAXwWpAC8EoAAsBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBTgAHARa/8oFOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FOAAcBFoAbQU4ABwEWgBtBIwAqQQ9AF0EjACpBD0AXQSMAKkEPQBdBIwAqQQ9AF0EjP/wBD3/ugSMAKkEPQBdBIwAqQQ9AF0EjACpBD0AXQItALcB+gCbAi0AowHxAIUFgAB2BJAAWwWAAHYEkABbBYAAdgSQAFsFgABHBJD/xAWAAHYEkABbBYAAdgSQAFsFgAB2BJAAWwV+AGUEkgBbBX4AZQSSAFsFfgBlBJIAWwV+AGUEkgBbBX4AZQSSAFsFMACMBGkAiAUwAIwEaQCIBZAAjATzAIgFkACMBPMAiAWQAIwE8wCIBZAAjATzAIgFkACMBPMAiATOAA8DyQAWBM4ADwPJABYEzgAPA8kAFgShAF8EoQBfBSQAsgRSAJwFtACpBJ0AnATGADED2AAoBQQAOQP3ACkFegCWBFkAZwV6AJYEWQBnBHMAsQNbAJoHQwAbBiAAFQYvAD8Evf/eBGgAjAUF/9QFBf/UBHMAAwNb//wFOAALBCf/0wW0ALEEngCcBbQAqQSdAJwG/ACpBe8AnQWpAC8EoAAsBM4ADwQCAC4FBAA5A/cAKQRQAGMEbAASBj8AkAR+AF0EfgBeBH4ANQR+AJoEkgBkBKYAhwVzAHoEfQBgBbQAqQRqAIwFOAAcBFoAOQSMAF8EPQApAi3/CgH6/vAFgAB2BJAAMwTtAFUCtf+LBTAAjARpACsEpv86BPsAqQR9AIwFPwCpBIMAXwU/AKkEgwBfBbQAqQRoAIwFBACpBA4AjQUEAKkEDgCNBE4AqQHxAIYG/ACpBwMAiwW0AKkEagCMBQwAqQR9AIwE7QCoArUAggS/AFAEIABfBMYAMQKdAAkFFwAcA+AAIQUXABwD4AAhBxkAPQYDACsEygBWA/cAWAXG/ngEhQATBCL/nwUf/7wCJP/ABMX/3wRn/1cE/P/4BIUAEwRQAIoD5gCKBCMARwTjAIoB6ACXBFQAigYCAIoEuwBgBFwAigQmACgEKwANBFQAJgHo/7QEKwANA+YAigOvAIoEIABDAegAlwHo/7QDzwArBFQAigQfACIEhQATBFAAigOvAIoD5gCKBOwAigYCAIoE4wCKBLsAYATOAIoEXACKBHwAYAQmACgEVAAmBD8ARwTjAIoEfABgBCsADQXDAAIE7ACKBB8AIgVnAGAFOAAcBFoAbQSMAKkEPQBdAAAAAQAABOQJCgQAAAICAgMGBQcGAgMDBAUCAgIEBQUFBQUFBQUFBQICBQUFBAgGBgYGBQUGBgIFBgUIBgYGBgYFBQYGCAYFBQIEAgQEAwUFBQUFAwUFAgIFAggFBQUFAwUDBQQHBAQEAwIDBgIFBQYFAgYEBwQEBQcEAwUDAwMFBAICAwQEBwcHBAgFBgUFCAUFBQUGAgUFAgYFCQgCBgMGBQYGAgUEBAQEAgMCBAMDAAAAAAACAgUCBQYGBgUGBQYGBgUFBQUFBQUFAwUEBQUFBQUFBgYHBQUHBwYKCgcGBgcIBQYGBgcHBggJBwgGBggGBQUEBQcFBQUFBwUFBAcFBQcHBgcFBQcFBQUICAUFCAcFCAcFBQgHCAcKCQUEBgUGBQYFCAcIBwYFBgAAAAAAAAUGBQUEBQUGBQcGCQYJCAcFCAYGBQYHBQYFBgUGBQUFBAYHCAcGBQUJBwkHBgUGBgYEBQkFCQMCAgUCAgEAAgIGBwQCAgICAwMDBQUDBAYBCQMDBAMEBQcHCggHBQcFBQYGBwQJBgYHCAgHBQYFBQUJAgUFBQUFAwMCBgUFCAgGBwAJCQUFAgIEBAQEBQQEBAIFBQUFBAQFBgIEBQQHBgUFBQUFBQUFBwUFBQMDAwMDAwMDAwMEAwUFBgYFBgUFBQUEBQUFBAUEBgYGBgUICAYFBQYHBQYFBQUGBQcIBgcFBQcFBQcFBgYGBQUHBQUGBQUFBQQJBQUFBQUEBQUFBQYGBgcHBAUEBQUDAwMDAwMDBQUHBQYCAgICAgIFAgIGBgUFAwYGBgYGBgYGBQUFBQICAgIGBgYGBgYGBgYGBQUFBQUFBQUFBQUFBQICAgIFBQUFBQUFBQUFBAQGBQYFBgUGBQYFBgUGBQYGBQUFBQUFBQUFBQYFBgUGBQYFBgUCAgICAgICAgIHBAUCBgUFAgUCBQMFAwYFBgUGBQUGBQYFBgUGAwYDBgMFBQUFBQUFBQUFBQMFAwUDBgUGBQYFBgUGBQYFCAcFBAUFBAUEBQQICAYFBQUFBQUF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sRCxUrG2sc2x5LH7shKyK7JEslCyXLJzsoqyobK6stGy6LL/sxizL7NGs12zdLOLs6Szu7PSs+m0ArQZtDC0R7RdtHO0jLSltLG0vbTUtOu1AbUatTC1RrVdtXa1jLWjtbq10LXmtf+2FrYttkO2XLZztou2ora4ts+25rdJt9+39rgNuCS4OrhRuGi4f7iVuKy43bj0uQq5Ibk4uU+5ZrnOulK6abp/upa6rLrDutq68bsIuxS7K7tCu1S7a7uCu5m7sLvHu9676bv0vAu8F7wjvDq8UbxdvGm8gLyXvKO8r7zEvPm9Bb0RvSi9P71LvVe9br2EvZS9q73Bvdi9774IviG+OL5Pvlu+Z75+vpS+q77Cvtm+7777vwe/E78fvza/TL9Yv2S/cL98v5O/n7+2v8y/47/5wBDAJ8BAwFnAcsCLwOjBTsFlwXzBk8GpwcLB2cHwwgfCHsI1wkvCYsJ5wpDCp8LKwvLDBcMcwzPDScNfw3jDkcOdw6nDwMPXw+3EBcQbxDHESMRhxHjEj8SmxL3E1MTtxQTFG8UxxUrFYcV3xY7F8cYIxh7GNcZMxmLGeMaOxqXHDsckxzrHUcdox3THi8eix7nH0Mfbx/HICMgUyCrINshLyFfIbsh6yJHIqMi/yNjI78j7yRHJKMk+yUrJYMlsyYLJjsmkybrJ0cnqygPKX8p2yozKpMq7ytLK6Mrzyv/LC8sXyyPLL8s7y1fLX8tny2/Ld8t/y4fLj8uXy5/Lp8uvy7fLv8vHy+DL+cwQzCfMPsxUzG/Md8x/zIfMj8yXzK/Mx8zezPXNDM0lzTzNp82vzcjN0M3Yze/OBs4OzhbOHs4mzj3ORc5NzlXOXc5lzm3Odc59zoXOjc6kzqzOtM8Hzw/PF88wz0fPT89Xz3DPeM+Pz6XPvM/Tz+rQAdAa0DPQStBh0GnQcdB90JTQnNCz0MrQ1tDi0PnRENEn0T7RRtFO0WfRgNGM0ZjRpNGw0bzRyNHQ0djR4NH30g7SFtIt0kTSW9J00nzShNKb0rLSy9LT0uzTBdMe0zfTT9Nm03zTldOu08fT4NPo0/DUCdQi1DvUU9Rq1IDUmdSx1MrU49T81RTVMdVO1VrVZtVu1XrVhtWS1Z7VtdXM1eXV/dYW1i7WR9Zf1njWkNar1sXW3tb31xDXKddC11vXdNeN16jXw9fP19vX8tgJ2CDYNthP2GfYgNiY2LHYydji2PrZFdkv2UbZXdlp2XXZgdmN2aTZu9nU2ezaBdod2jbaTtpn2n/amtq02sva4tr52xDbJ9s+21Xba9t324Pbj9ub27Lbydvg2/fcDtwl3DzcU9xq3IDcjNyY3KTcsNzH3N7c9d0L3YHdlt2i3a7dut3G3dLd3t3q3fbeAt4O3hreJt4y3j7eSt5W3mLebt523tTfMt9037PgF+B14JDgq+C34MPgz+Db4Ofg8+E94Y3h5eI74kPiT+JZ4mHiaeJx4nnigeKJ4qDit+LO4uXi/uMX4zDjSeNi43vjlOOt48bj3+P45BHkHeQp5DXkQeRN5FnkZeRx5H3klOSm5LLkvuTK5Nbk4uTu5PrlBuUd5TTlQOVM5VjlZOVw5Xzlk+Wp5bXlweXN5dnl5eXx5f3mCeYV5iHmLeY55kXmUeZZ5mHmaeZx5nnmgeaJ5pHmmeah5qnmsea55tLm6ucC5xnnIecp50LnSudh53fnf+eH54/nl+eu57bnvufG587n1ufe5+bn7uh46MTpIukq6TbpTelj6Wvpd+mD6Y/pmwAAAAUAZAAAAygFsAADAAYACQAMAA8AcbIMEBEREjmwDBCwANCwDBCwBtCwDBCwCdCwDBCwDdAAsABFWLACLxuxAhw+WbAARViwAC8bsQAQPlmyBAIAERI5sgUCABESObIHAgAREjmyCAIAERI5sQoM9LIMAgAREjmyDQIAERI5sAIQsQ4M9DAxISERIQMRAQERAQMhATUBIQMo/TwCxDb+7v66AQzkAgP+/gEC/f0FsPqkBQf9fQJ3+xECeP1eAl6IAl4AAgCg//UBewWwAAMADAAvALAARViwAi8bsQIcPlmwAEVYsAsvG7ELED5ZsgYFCitYIdgb9FmyAQYCERI5MDEBIwMzAzQ2MhYUBiImAVunDcLJN2w4OGw3AZsEFfqtLT09Wjs7AAIAiAQSAiMGAAAEAAkAGQCwAy+yAgoDERI5sAIvsAfQsAMQsAjQMDEBAyMTMwUDIxMzARUebwGMAQ4ebwGMBXj+mgHuiP6aAe4AAgB3AAAE0wWwABsAHwCPALAARViwDC8bsQwcPlmwAEVYsBAvG7EQHD5ZsABFWLACLxuxAhA+WbAARViwGi8bsRoQPlmyHQwCERI5fLAdLxiyAAMKK1gh2Bv0WbAE0LAdELAG0LAdELAL0LALL7IIAworWCHYG/RZsAsQsA7QsAsQsBLQsAgQsBTQsB0QsBbQsAAQsBjQsAgQsB7QMDEBIQMjEyM1IRMhNSETMwMhEzMDMxUjAzMVIwMjAyETIQL9/vhQj1DvAQlF/v4BHVKPUgEIUpBSzOdF4ftQkJ4BCEX++AGa/mYBmokBYosBoP5gAaD+YIv+non+ZgIjAWIAAAEAbv8wBBEGnAArAGYAsABFWLAJLxuxCRw+WbAARViwIi8bsSIQPlmyAiIJERI5sAkQsAzQsAkQsBDQsAkQshMBCitYIdgb9FmwAhCyGQEKK1gh2Bv0WbAiELAf0LAiELAm0LAiELIpAQorWCHYG/RZMDEBNCYnJiY1NDY3NTMVFhYVIzQmIyIGFRQWBBYWFRQGBxUjNSYmNTMUFjMyNgNYgZnVw7+nlai7uIZyd36FATGrUcu3lLrTuZKGg5YBd1x+M0HRoaTSFNvcF+zNjaZ7bmZ5Y3eeaqnOE7+/EefGi5Z+AAUAaf/rBYMFxQANABoAJgA0ADgAeACwAEVYsAMvG7EDHD5ZsABFWLAjLxuxIxA+WbADELAK0LAKL7IRBAorWCHYG/RZsAMQshgECitYIdgb9FmwIxCwHdCwHS+wIxCyKgQKK1gh2Bv0WbAdELIxBAorWCHYG/RZsjUjAxESObA1L7I3AyMREjmwNy8wMRM0NjMyFhUVFAYjIiY1FxQWMzI2NTU0JiIGFQE0NiAWFRUUBiAmNRcUFjMyNjU1NCYjIgYVBScBF2mng4Wlp4GCqopYSkdXVpRWAjunAQaop/78qopYSkhWV0lHWf4HaQLHaQSYg6qriEeEp6eLB05lYlVJTmZmUvzRg6moi0eDqaeLBk9lY1VKT2RjVPNCBHJCAAMAZf/sBPMFxAAeACcAMwCFALAARViwCS8bsQkcPlmwAEVYsBwvG7EcED5ZsABFWLAYLxuxGBA+WbIiHAkREjmyKgkcERI5sgMiKhESObIQKiIREjmyEQkcERI5shMcCRESObIZHAkREjmyFhEZERI5sBwQsh8BCitYIdgb9FmyIR8RERI5sAkQsjEBCitYIdgb9FkwMRM0NjcmJjU0NjMyFhUUBgcHATY1MxQHFyMnBgYjIiQFMjcBBwYVFBYDFBc3NjY1NCYjIgZldaVhQsSolsRZb2sBRESne9DeYUrHZ9X+/gHXk3r+nSGnmSJ2dkQyZExSYAGHabB1dpBHpryvhViVUk/+fYKf/6j5c0JF4ktwAakYe4J2jgPlYJBTMFc+Q1lvAAEAZwQhAP0GAAAEABAAsAMvsgIFAxESObACLzAxEwMjEzP9FYEBlQWR/pAB3wABAIX+KgKVBmsAEQAJALAOL7AELzAxEzQSEjcXBgIDBxATFhcHJicChXnwgSaSuwkBjVV1JoV57AJP4gGgAVRGenD+NP7jVf5+/uSqYHFKrgFUAAABACb+KgI3BmsAEQAJALAOL7AELzAxARQCAgcnNhITNTQCAic3FhISAjd18YQnmrsCWJ1iJ4TvdwJF3/5n/qZJcXYB8QEvINIBaQEeUHFJ/qr+ZAABABwCYQNVBbAADgAgALAARViwBC8bsQQcPlmwANAZsAAvGLAJ0BmwCS8YMDEBJTcFAzMDJRcFEwcDAycBSv7SLgEuCZkKASku/s3GfLq0fQPXWpdwAVj+o26YW/7xXgEg/udbAAABAE4AkgQ0BLYACwAaALAJL7AA0LAJELIGAQorWCHYG/RZsAPQMDEBIRUhESMRITUhETMCngGW/mq6/moBlroDDa/+NAHMrwGpAAEAHf7eATQA2wAIABcAsAkvsgQFCitYIdgb9FmwANCwAC8wMRMnNjc1MxUUBoZpXgS1Y/7eSIOLp5FlygAAAQAlAh8CDQK2AAMAEQCwAi+yAQEKK1gh2Bv0WTAxASE1IQIN/hgB6AIflwABAJD/9QF2ANEACQAbALAARViwBy8bsQcQPlmyAgUKK1gh2Bv0WTAxNzQ2MhYVFAYiJpA5cjs7cjlhMEBAMC4+PgABABL/gwMQBbAAAwATALAAL7AARViwAi8bsQIcPlkwMRcjATOxnwJgnn0GLQAAAgBz/+wECgXEAA0AGwA5ALAARViwCi8bsQocPlmwAEVYsAMvG7EDED5ZsAoQshEBCitYIdgb9FmwAxCyGAEKK1gh2Bv0WTAxARACIyICAzUQEjMyEhMnNCYjIgYHERQWMzI2NwQK3uzp4ATe7eveA7mEj46CAomLiYUDAm3+u/7EATUBM/cBQQE4/tP+xg3r19be/tjs4dTkAAEAqgAAAtkFtwAGADkAsABFWLAFLxuxBRw+WbAARViwAC8bsQAQPlmyBAAFERI5sAQvsgMBCitYIdgb9FmyAgMFERI5MDEhIxEFNSUzAtm6/osCEh0E0YmoxwAAAQBdAAAEMwXEABcATQCwAEVYsBAvG7EQHD5ZsABFWLAALxuxABA+WbIXAQorWCHYG/RZsALQsgMQFxESObAQELIJAQorWCHYG/RZsBAQsAzQshUXEBESOTAxISE1ATY2NTQmIyIGFSM0JDMyFhUUAQEhBDP8RgH4cFWKc4qZuQED2cvs/u7+egLbhQIwf59VcpKdjMn41bHX/tf+WQABAF7/7AP5BcQAJgB4ALAARViwDS8bsQ0cPlmwAEVYsBkvG7EZED5ZsgANGRESObAAL7LPAAFdsp8AAXGyLwABXbJfAAFysA0QsgYBCitYIdgb9FmwDRCwCdCwABCyJgEKK1gh2Bv0WbITJgAREjmwGRCwHNCwGRCyHwEKK1gh2Bv0WTAxATM2NjUQIyIGFSM0NjMyFhUUBgcWFhUUBCAkNTMUFjMyNjU0JicjAYaLg5b/eI+5/cPO6ntqeIP/AP5m/v+6ln6GjpyTiwMyAoZyAQCJca3l2sJfsiwmsH/E5t62c4qMg3+IAgACADUAAARQBbAACgAOAEkAsABFWLAJLxuxCRw+WbAARViwBC8bsQQQPlmyAQkEERI5sAEvsgIBCitYIdgb9FmwBtCwARCwC9CyCAYLERI5sg0JBBESOTAxATMVIxEjESE1ATMBIREHA4bKyrr9aQKMxf2BAcUWAemX/q4BUm0D8fw5AsooAAEAmv/sBC0FsAAdAGEAsABFWLABLxuxARw+WbAARViwDS8bsQ0QPlmwARCyBAEKK1gh2Bv0WbIHDQEREjmwBy+yGgEKK1gh2Bv0WbIFBxoREjmwDRCwEdCwDRCyFAEKK1gh2Bv0WbAHELAd0DAxExMhFSEDNjMyEhUUAiMiJiczFhYzMjY1NCYjIgcHzkoC6v2zLGuIx+rz2sH0Ea8RkHaBk5+EeUUxAtoC1qv+cz/++eDh/v3WvX1/sJuSsTUoAAIAhP/sBBwFsQAUACEATgCwAEVYsAAvG7EAHD5ZsABFWLANLxuxDRA+WbAAELIBAQorWCHYG/RZsgcNABESObAHL7IVAQorWCHYG/RZsA0QshwBCitYIdgb9FkwMQEVIwYEBzYzMhIVFAIjIgA1NRAAJQMiBgcVFBYzMjY1NCYDTyLY/wAUc8e+4/XO0f78AVcBU9JfoB+ieX2PkQWxnQT44YT+9NTh/vIBQf1HAZIBqQX9cHJWRLTcuJWWuQABAE0AAAQlBbAABgAyALAARViwBS8bsQUcPlmwAEVYsAEvG7EBED5ZsAUQsgMBCitYIdgb9FmyAAMFERI5MDEBASMBITUhBCX9pcICWfzsA9gFSPq4BRiYAAADAHD/7AQOBcQAFwAhACsAYQCwAEVYsBUvG7EVHD5ZsABFWLAJLxuxCRA+WbInCRUREjmwJy+yzycBXbIaAQorWCHYG/RZsgMaJxESObIPJxoREjmwCRCyHwEKK1gh2Bv0WbAVELIiAQorWCHYG/RZMDEBFAYHFhYVFAYjIiY1NDY3JiY1NDYzMhYDNCYiBhQWMzI2ASIGFRQWMjY0JgPsc2Jyhf/Q0v2BcmFw7MHA7Zeb+peTg4KU/upth4XehYoENG2qMDG8d73g4bx2vjEwqmy42Nj8oXqamPiOjwQah3RviYnejAAAAgBk//8D+AXEABcAJABYALAARViwCy8bsQscPlmwAEVYsBMvG7ETED5ZsgMTCxESObADL7IAAwsREjmwExCyFAEKK1gh2Bv0WbADELIYAQorWCHYG/RZsAsQsh8BCitYIdgb9FkwMQEGBiMiJiY1NDY2MzISERUQAAUjNTM2NiUyNjc1NCYjIgYVFBYDPjqhYH67Zm/MiNj5/rD+rSQn5fb+7l2dJJ55epSPAoBFVHzhiJLqfP69/uk2/lf+eQWcBOf6clRKtuS7mZXBAP//AIb/9QFtBEQAJgAS9gABBwAS//cDcwAQALAARViwDS8bsQ0YPlkwMf//ACn+3gFVBEQAJwAS/98DcwEGABAMAAAQALAARViwAy8bsQMYPlkwMQABAEgAwwN6BEoABgAWALAARViwBS8bsQUYPlmwAtCwAi8wMQEFFQE1ARUBCAJy/M4DMgKE/cQBe5IBesQAAAIAmAGPA9oDzwADAAcAJQCwBy+wA9CwAy+yAAEKK1gh2Bv0WbAHELIEAQorWCHYG/RZMDEBITUhESE1IQPa/L4DQvy+A0IDLqH9wKAAAAEAhgDEA9wESwAGABYAsABFWLACLxuxAhg+WbAF0LAFLzAxAQE1ARUBNQMb/WsDVvyqAooBA77+hpL+hcAAAgBL//UDdgXEABgAIQBRALAARViwEC8bsRAcPlmwAEVYsCAvG7EgED5ZshsFCitYIdgb9FmyABsQERI5sgQQABESObAQELIJAQorWCHYG/RZsBAQsAzQshUAEBESOTAxATY2Nzc2NTQmIyIGFSM2NjMyFhUUBwcGFQM0NjIWFAYiJgFlAjJNg1RuaWZ8uQLjtr3Tom1JwTdsODhsNwGad4pUh19taXdsW6LHy7GvqmxRmP7DLT09Wjs7AAACAGr+OwbWBZcANQBCAGgAsDIvsABFWLAILxuxCBA+WbAD0LIPMggREjmwDy+yBQgPERI5sAgQsjkCCitYIdgb9FmwFdCwMhCyGwIKK1gh2Bv0WbAIELAq0LAqL7IjAgorWCHYG/RZsA8QskACCitYIdgb9FkwMQEGAiMiJwYGIyImNzYSNjMyFhcDBjMyNjcSACEiBAIHBhIEMzI2NxcGBiMiJAITEhIkMzIEEgEGFjMyNjc3EyYjIgYGygzYtbs1NotKjpITD3m/aVGAUDQTk3GMBhP+uf6yyf7ItAsMkAEn0Vq1PCU+zWn6/pizDAzeAXzv+QFkrvvyDlFYPG8kAS44QHWZAfby/uioVVPozaUBA5QrP/3W5+C0AYUBmMf+iPb4/pPBLCNzJzLhAacBGwETAbfv4P5a/pCOmGZfCQH3He4AAAIAHAAABR0FsAAHAAoARgCwAEVYsAQvG7EEHD5ZsABFWLACLxuxAhA+WbAARViwBi8bsQYQPlmyCQQCERI5sAkvsgABCitYIdgb9FmyCgQCERI5MDEBIQMjATMBIwEhAwPN/Z6JxgIsqAItxf1NAe/4AXz+hAWw+lACGgKpAAMAqQAABIgFsAAOABYAHwBVALAARViwAS8bsQEcPlmwAEVYsAAvG7EAED5ZshcAARESObAXL7IPAQorWCHYG/RZsggPFxESObAAELIQAQorWCHYG/RZsAEQsh8BCitYIdgb9FkwMTMRITIWFRQGBxYWFRQGIwERITI2NRAhJSEyNjU0JiMhqQHc7e90ZHaJ/uj+xwE9hpv+4v7AASJ+l4yP/uQFsMTAZp0rIbmAxOACqf30i3oBB5p+bHhtAAABAHf/7ATYBcQAHABFALAARViwCy8bsQscPlmwAEVYsAMvG7EDED5ZsAsQsA/QsAsQshIBCitYIdgb9FmwAxCyGQEKK1gh2Bv0WbADELAc0DAxAQYEIyAAETU0EiQzMgAXIyYmIyICFRUUEjMyNjcE2Bv+4e7+/v7JkQEKr+gBGBfBGaeWuNHGsqCrHAHO5/sBcgE2jMsBNKX+/eWunP7w+43t/uiRtAACAKkAAATGBbAACwAVADkAsABFWLABLxuxARw+WbAARViwAC8bsQAQPlmwARCyDAEKK1gh2Bv0WbAAELINAQorWCHYG/RZMDEzESEyBBIXFRQCBAcDETMyEjU1NAInqQGbvgEknwGf/tnE08re9+nWBbCo/srJXc7+yqYCBRL7iwEU/1X4ARMCAAABAKkAAARGBbAACwBOALAARViwBi8bsQYcPlmwAEVYsAQvG7EEED5ZsgsEBhESObALL7IAAQorWCHYG/RZsAQQsgIBCitYIdgb9FmwBhCyCAEKK1gh2Bv0WTAxASERIRUhESEVIREhA+D9iQLd/GMDk/0tAncCof38nQWwnv4sAAEAqQAABC8FsAAJAEAAsABFWLAELxuxBBw+WbAARViwAi8bsQIQPlmyCQIEERI5sAkvsgABCitYIdgb9FmwBBCyBgEKK1gh2Bv0WTAxASERIxEhFSERIQPM/Z3AA4b9OgJjAoP9fQWwnv4OAAEAev/sBNwFxAAfAGIAsABFWLALLxuxCxw+WbAARViwAy8bsQMQPlmwCxCwD9CwCxCyEQEKK1gh2Bv0WbADELIYAQorWCHYG/RZsh4DCxESObAeL7QPHh8eAl20Px5PHgJdsh0BCitYIdgb9FkwMSUGBCMiJAInNRAAITIEFyMCISICAxUUEjMyNjcRITUhBNxK/vewsv7slwIBMwEW5AEWH8A2/t7BxwHgv2yiNf6vAhC/ammnATTLfwFJAWrp1gEh/vH+/3f1/t8wOQFHnAABAKkAAAUIBbAACwBVALAARViwBi8bsQYcPlmwAEVYsAovG7EKHD5ZsABFWLAALxuxABA+WbAARViwBC8bsQQQPlmwABCwCdCwCS+ynwkBcrIvCQFdsgIBCitYIdgb9FkwMSEjESERIxEzESERMwUIwf0iwMAC3sECof1fBbD9jgJyAAABALcAAAF3BbAAAwAdALAARViwAi8bsQIcPlmwAEVYsAAvG7EAED5ZMDEhIxEzAXfAwAWwAAABADX/7APMBbAADwAuALAARViwAC8bsQAcPlmwAEVYsAUvG7EFED5ZsAnQsAUQsgwBCitYIdgb9FkwMQEzERQGIyImNTMUFjMyNjcDC8H70dnywImCd5MBBbD7+dHs3sh9jJaHAAABAKkAAAUFBbAACwB0ALAARViwBS8bsQUcPlmwAEVYsAcvG7EHHD5ZsABFWLACLxuxAhA+WbAARViwCy8bsQsQPlmyAAIFERI5QBFKAFoAagB6AIoAmgCqALoACF2yOQABXbIGBQIREjlAEzYGRgZWBmYGdgaGBpYGpga2BgldMDEBBxEjETMRATMBASMCG7LAwAKH6P3DAmrmAqW5/hQFsP0wAtD9ffzTAAEAqQAABBwFsAAFACgAsABFWLAELxuxBBw+WbAARViwAi8bsQIQPlmyAAEKK1gh2Bv0WTAxJSEVIREzAWoCsvyNwZ2dBbAAAAEAqQAABlIFsAAOAFkAsABFWLAALxuxABw+WbAARViwAi8bsQIcPlmwAEVYsAQvG7EEED5ZsABFWLAILxuxCBA+WbAARViwDC8bsQwQPlmyAQAEERI5sgcABBESObIKAAQREjkwMQkCMxEjERMBIwETESMRAaEB3AHc+cAS/iKT/iMTwAWw+1wEpPpQAjcCZPtlBJj9n/3JBbAAAAEAqQAABQgFsAAJAEyyAQoLERI5ALAARViwBS8bsQUcPlmwAEVYsAgvG7EIHD5ZsABFWLAALxuxABA+WbAARViwAy8bsQMQPlmyAgUAERI5sgcFABESOTAxISMBESMRMwERMwUIwf0jwcEC378EYvueBbD7mQRnAAIAdv/sBQkFxAARAB8AOQCwAEVYsA0vG7ENHD5ZsABFWLAELxuxBBA+WbANELIVAQorWCHYG/RZsAQQshwBCitYIdgb9FkwMQEUAgQjIiQCJzU0EiQzMgQSFScQAiMiAgcVFBIzMhI3BQmQ/viwrP72kwKSAQusrwELkL/Qu7bRA9O5uswDAqnW/sGoqQE5zmnSAUKrqf6/1QIBAwEV/uv2a/v+4QEP/QAAAgCpAAAEwAWwAAoAEwBNsgoUFRESObAKELAM0ACwAEVYsAMvG7EDHD5ZsABFWLABLxuxARA+WbILAwEREjmwCy+yAAEKK1gh2Bv0WbADELISAQorWCHYG/RZMDEBESMRITIEFRQEIyUhMjY1NCYnIQFpwAIZ7wEP/vf3/qkBWZqkpI/+nAI6/cYFsPTJ1OWdkYmCnAMAAgBt/woFBgXEABUAIgBNsggjJBESObAIELAZ0ACwAEVYsBEvG7ERHD5ZsABFWLAILxuxCBA+WbIDCBEREjmwERCyGQEKK1gh2Bv0WbAIELIgAQorWCHYG/RZMDEBFAIHBQclBiMiJAInNTQSJDMyBBIVJxACIyICBxUUEiASNwUBhnkBBIP+zUhQrP72kwKSAQussAELkMDNvrXRA9EBdMwDAqnT/s9WzHn0EqkBOc5p0gFCq6r+wdUBAQEBF/7r9mv6/uABD/0AAAIAqAAABMkFsAAOABcAYbIFGBkREjmwBRCwFtAAsABFWLAELxuxBBw+WbAARViwAi8bsQIQPlmwAEVYsA0vG7ENED5ZshAEAhESObAQL7IAAQorWCHYG/RZsgsABBESObAEELIWAQorWCHYG/RZMDEBIREjESEyBBUUBgcBFSMBITI2NTQmJyECv/6qwQHi9gEJk4MBVs79bgEnj6mhmP7aAk39swWw4NaIyjL9lgwC6pR8h5ABAAABAFD/7ARyBcQAJgBhsgAnKBESOQCwAEVYsAYvG7EGHD5ZsABFWLAaLxuxGhA+WbAGELAL0LAGELIOAQorWCHYG/RZsiYaBhESObAmELIUAQorWCHYG/RZsBoQsB/QsBoQsiIBCitYIdgb9FkwMQEmJjU0JDMyFhYVIzQmIyIGFRQWBBYWFRQEIyIkJjUzFBYzMjY0JgJW9+EBE9yW64HBqJmOn5cBa81j/uznlv78jcHDo5iilgKJR8+YrOF0zHmEl31vWXtme6RvsdVzyH+EmXzWdQAAAQAxAAAElwWwAAcALgCwAEVYsAYvG7EGHD5ZsABFWLACLxuxAhA+WbAGELIAAQorWCHYG/RZsATQMDEBIREjESE1IQSX/iy//i0EZgUS+u4FEp4AAQCM/+wEqgWwABIAPLIFExQREjkAsABFWLAALxuxABw+WbAARViwCS8bsQkcPlmwAEVYsAUvG7EFED5Zsg4BCitYIdgb9FkwMQERBgAHByIAJxEzERQWMzI2NREEqgH+/9wz7/7kAr6uoaOtBbD8Is7++hACAQLiA+D8Jp6vrp4D2wAAAQAcAAAE/QWwAAYAOLIABwgREjkAsABFWLABLxuxARw+WbAARViwBS8bsQUcPlmwAEVYsAMvG7EDED5ZsgABAxESOTAxJQEzASMBMwKLAaDS/eSq/eXR/wSx+lAFsAAAAQA9AAAG7QWwABIAWQCwAEVYsAMvG7EDHD5ZsABFWLAILxuxCBw+WbAARViwES8bsREcPlmwAEVYsAovG7EKED5ZsABFWLAPLxuxDxA+WbIBAwoREjmyBgMKERI5sg0DChESOTAxARc3ATMBFzcTMwEjAScHASMBMwHjHCkBIKIBGSgf4sH+n6/+1BcX/smv/qDAAcvArQP4/AiwxAPk+lAEJW9v+9sFsAABADkAAATOBbAACwBrALAARViwAS8bsQEcPlmwAEVYsAovG7EKHD5ZsABFWLAELxuxBBA+WbAARViwBy8bsQcQPlmyAAEEERI5QAmGAJYApgC2AARdsgYBBBESOUAJiQaZBqkGuQYEXbIDAAYREjmyCQYAERI5MDEBATMBASMBASMBATMChAFd4v40Adfk/pr+mOMB2P4z4QOCAi79Lv0iAjj9yALeAtIAAAEADwAABLsFsAAIADEAsABFWLABLxuxARw+WbAARViwBy8bsQccPlmwAEVYsAQvG7EEED5ZsgABBBESOTAxAQEzAREjEQEzAmUBfNr+CsD+CtwC1QLb/G/94QIfA5EAAAEAVgAABHoFsAAJAEQAsABFWLAHLxuxBxw+WbAARViwAi8bsQIQPlmyAAEKK1gh2Bv0WbIEAAIREjmwBxCyBQEKK1gh2Bv0WbIJBQcREjkwMSUhFSE1ASE1IRUBOQNB+9wDHvzvA/ednZAEgp6NAAABAJL+yAILBoAABwAiALAEL7AHL7IAAQorWCHYG/RZsAQQsgMBCitYIdgb9FkwMQEjETMVIREhAgu/v/6HAXkF6Pl4mAe4AAABACj/gwM4BbAAAwATALACL7AARViwAC8bsQAcPlkwMRMzASMosAJgsAWw+dMAAQAJ/sgBgwaAAAcAJQCwAi+wAS+wAhCyBQEKK1gh2Bv0WbABELIGAQorWCHYG/RZMDETIREhNTMRIwkBev6GwcEGgPhImAaIAAABAEAC2QMUBbAABgAnsgAHCBESOQCwAEVYsAMvG7EDHD5ZsADQsgEHAxESObABL7AF0DAxAQMjATMBIwGqvqwBK38BKqsEu/4eAtf9KQABAAT/aQOYAAAAAwAbALAARViwAy8bsQMQPlmyAAEKK1gh2Bv0WTAxBSE1IQOY/GwDlJeXAAABADkE2AHaBf4AAwAjALABL7IPAQFdsADQGbAALxiwARCwAtCwAi+0DwIfAgJdMDEBIwEzAdqf/v7fBNgBJgAAAgBt/+wD6gROAB4AKAB5shcpKhESObAXELAg0ACwAEVYsBcvG7EXGD5ZsABFWLAELxuxBBA+WbAARViwAC8bsQAQPlmyAhcEERI5sgsXBBESObALL7AXELIPAQorWCHYG/RZshILFxESObAEELIfAQorWCHYG/RZsAsQsiMBCitYIdgb9FkwMSEmJwYjIiY1NCQzMzU0JiMiBhUjNDY2MzIWFxEUFxUlMjY3NSMgFRQWAygQCoGzoM0BAem0dHFjhrpzxXa71AQm/gtXnCOR/qx0IFKGtYupu1Vhc2RHUZdYu6T+DpVYEI1aSN7HV2IAAgCM/+wEIAYAAA4AGQBkshIaGxESObASELAD0ACwCC+wAEVYsAwvG7EMGD5ZsABFWLADLxuxAxA+WbAARViwBi8bsQYQPlmyBQgDERI5sgoMAxESObAMELISAQorWCHYG/RZsAMQshcBCitYIdgb9FkwMQEUAiMiJwcjETMRNiASESc0JiMiBxEWMzI2BCDkwM1wCaq5cAGK4bmSibdQVbSFlAIR+P7TkX0GAP3Di/7W/v0Fvc6q/iyqzgABAFz/7APsBE4AHQBJshAeHxESOQCwAEVYsBAvG7EQGD5ZsABFWLAILxuxCBA+WbIAAQorWCHYG/RZsAgQsAPQsBAQsBTQsBAQshcBCitYIdgb9FkwMSUyNjczDgIjIgARNTQ2NjMyFhcjJiYjIgYVFRQWAj5jlAivBXbFbt3++3TZlLbxCK8Ij2mNm5qDeFpdqGQBJwEAH572iNquaYfLwCO7ygAAAgBf/+wD8AYAAA8AGgBkshgbHBESObAYELAD0ACwBi+wAEVYsAMvG7EDGD5ZsABFWLAMLxuxDBA+WbAARViwCC8bsQgQPlmyBQMMERI5sgoDDBESObAMELITAQorWCHYG/RZsAMQshgBCitYIdgb9FkwMRM0EjMyFxEzESMnBiMiAjUXFBYzMjcRJiMiBl/sv75vuaoJb8a87bmYhrBRU6yImAIm+QEvggI0+gB0iAE0+Ae40J4B8ZnSAAACAF3/7APzBE4AFQAdAGmyCB4fERI5sAgQsBbQALAARViwCC8bsQgYPlmwAEVYsAAvG7EAED5ZshoIABESObAaL7S/Gs8aAl2yDAEKK1gh2Bv0WbAAELIQAQorWCHYG/RZshMIABESObAIELIWAQorWCHYG/RZMDEFIgA1NTQ2NjMyEhEVIRYWMzI2NxcGASIGByE1JiYCTdz+7HvdgdPq/SMEs4piiDNxiP7ZcJgSAh4IiBQBIfIiof2P/ur+/U2gxVBCWNEDyqOTDo2bAAEAPAAAAsoGFQAVAGOyDxYXERI5ALAARViwCC8bsQgePlmwAEVYsAMvG7EDGD5ZsABFWLARLxuxERg+WbAARViwAC8bsQAQPlmwAxCyAQEKK1gh2Bv0WbAIELINAQorWCHYG/RZsAEQsBPQsBTQMDEzESM1MzU0NjMyFwcmIyIGFRUzFSMR56uruqpAPwovNVpi5+cDq49vrr4RlglpYnKP/FUAAgBg/lYD8gROABkAJACDsiIlJhESObAiELAL0ACwAEVYsAMvG7EDGD5ZsABFWLAGLxuxBhg+WbAARViwCy8bsQsSPlmwAEVYsBcvG7EXED5ZsgUDFxESObIPFwsREjmwCxCyEQEKK1gh2Bv0WbIVAxcREjmwFxCyHQEKK1gh2Bv0WbADELIiAQorWCHYG/RZMDETNBIzMhc3MxEUBiMiJic3FjMyNjU1BiMiAjcUFjMyNxEmIyIGYOrBxm8JqfnSdeA7YHesh5dvwL7rupaHr1JVqoeYAib9ASuMePvg0vJkV2+TmIpdgAEy87fRnwHum9IAAAEAjAAAA98GAAARAEmyChITERI5ALAQL7AARViwAi8bsQIYPlmwAEVYsAUvG7EFED5ZsABFWLAOLxuxDhA+WbIAAgUREjmwAhCyCgEKK1gh2Bv0WTAxATYzIBMRIxEmJiMiBgcRIxEzAUV7xQFXA7kBaW9aiCa5uQO3l/59/TUCzHVwYE78/QYAAAIAjQAAAWgFxAADAAwAPrIGDQ4REjmwBhCwAdAAsABFWLACLxuxAhg+WbAARViwAC8bsQAQPlmwAhCwCtCwCi+yBgUKK1gh2Bv0WTAxISMRMwM0NjIWFAYiJgFVubnIN2w4OGw3BDoBHy0+Plo8PAAC/7/+SwFZBcQADAAWAEmyEBcYERI5sBAQsADQALAARViwDC8bsQwYPlmwAEVYsAMvG7EDEj5ZsggBCitYIdgb9FmwDBCwFdCwFS+yEAUKK1gh2Bv0WTAxAREQISInNRYzMjY1EQM0NjMyFhQGIiYBS/7lPTQgND5BEzc1Njg4bDYEOvtJ/sgSlAhDUwS7AR8sPz5aPDwAAAEAjQAABAwGAAAMAHUAsABFWLAELxuxBB4+WbAARViwCC8bsQgYPlmwAEVYsAIvG7ECED5ZsABFWLALLxuxCxA+WbIACAIREjlAFToASgBaAGoAegCKAJoAqgC6AMoACl2yBggCERI5QBU2BkYGVgZmBnYGhgaWBqYGtgbGBgpdMDEBBxEjETMRNwEzAQEjAbp0ubljAVHh/lsB1tkB9Xn+hAYA/F93AWT+PP2KAAEAnAAAAVUGAAADAB0AsABFWLACLxuxAh4+WbAARViwAC8bsQAQPlkwMSEjETMBVbm5BgAAAAEAiwAABngETgAdAHeyBB4fERI5ALAARViwAy8bsQMYPlmwAEVYsAgvG7EIGD5ZsABFWLAALxuxABg+WbAARViwCy8bsQsQPlmwAEVYsBQvG7EUED5ZsABFWLAbLxuxGxA+WbIBCAsREjmyBQgLERI5sAgQshABCitYIdgb9FmwGNAwMQEXNjMyFzY2MyATESMRNCYjIgYHESMRNCMiBxEjEQE6BXfK41I2rXYBZAa5an1niAu657ZDuQQ6eIyuTmD+h/0rAsp0c3to/TICxeyb/OoEOgABAIwAAAPfBE4AEQBTsgsSExESOQCwAEVYsAMvG7EDGD5ZsABFWLAALxuxABg+WbAARViwBi8bsQYQPlmwAEVYsA8vG7EPED5ZsgEDBhESObADELILAQorWCHYG/RZMDEBFzYzIBMRIxEmJiMiBgcRIxEBOwZ8yAFXA7kBaW9aiCa5BDqInP59/TUCzHVwYE78/QQ6AAACAFv/7AQ0BE4ADwAbAEOyDBwdERI5sAwQsBPQALAARViwBC8bsQQYPlmwAEVYsAwvG7EMED5ZshMBCitYIdgb9FmwBBCyGQEKK1gh2Bv0WTAxEzQ2NjMyABUVFAYGIyIANRcUFjMyNjU0JiMiBlt934/dARF54ZLc/u+6p4yNpqmMiagCJ5/+iv7O/g2e+4wBMvwJtNrdx7Ld2gACAIz+YAQeBE4ADwAaAG6yExscERI5sBMQsAzQALAARViwDC8bsQwYPlmwAEVYsAkvG7EJGD5ZsABFWLAGLxuxBhI+WbAARViwAy8bsQMQPlmyBQwDERI5sgoMAxESObAMELITAQorWCHYG/RZsAMQshgBCitYIdgb9FkwMQEUAiMiJxEjETMXNjMyEhEnNCYjIgcRFjMyNgQe4sHFcbmpCXHJw+O5nIioVFOrhZ0CEff+0n399wXaeIz+2v76BLfUlf37lNMAAAIAX/5gA+8ETgAPABoAa7IYGxwREjmwGBCwA9AAsABFWLADLxuxAxg+WbAARViwBi8bsQYYPlmwAEVYsAgvG7EIEj5ZsABFWLAMLxuxDBA+WbIFAwwREjmyCgMMERI5shMBCitYIdgb9FmwAxCyGAEKK1gh2Bv0WTAxEzQSMzIXNzMRIxEGIyICNRcUFjMyNxEmIyIGX+rFwG8IqrlwusTpuZ2FpVdYooaeAib/ASmBbfomAgR4ATH8CLrUkgISj9UAAQCMAAAClwROAA0ARrIEDg8REjkAsABFWLALLxuxCxg+WbAARViwCC8bsQgYPlmwAEVYsAUvG7EFED5ZsAsQsgIBCitYIdgb9FmyCQsFERI5MDEBJiMiBxEjETMXNjMyFwKXKjG2Qbm0A1unNhwDlAeb/QAEOn2RDgABAF//7AO7BE4AJgBhsgknKBESOQCwAEVYsAkvG7EJGD5ZsABFWLAcLxuxHBA+WbIDHAkREjmwCRCwDdCwCRCyEAEKK1gh2Bv0WbADELIVAQorWCHYG/RZsBwQsCHQsBwQsiQBCitYIdgb9FkwMQE0JiQmJjU0NjMyFhUjNCYjIgYVFBYEFhYVFAYjIiYmNTMWFjMyNgMCcf7npU/hr7jluoFiZXJqARWsU+i5gshxuQWLcml/AR9LUzxUdFCFuL6UTG5YR0NEPlZ5V5GvXKVgXW1VAAEACf/sAlYFQAAVAF+yDhYXERI5ALAARViwAS8bsQEYPlmwAEVYsBMvG7ETGD5ZsABFWLANLxuxDRA+WbABELAA0LAAL7ABELIDAQorWCHYG/RZsA0QsggBCitYIdgb9FmwAxCwEdCwEtAwMQERMxUjERQWMzI3FQYjIiY1ESM1MxEBh8rKNkEgOElFfH7FxQVA/vqP/WFBQQyWFJaKAp+PAQYAAQCI/+wD3AQ6ABAAU7IKERIREjkAsABFWLAGLxuxBhg+WbAARViwDS8bsQ0YPlmwAEVYsAIvG7ECED5ZsABFWLAQLxuxEBA+WbIADQIREjmwAhCyCgEKK1gh2Bv0WTAxJQYjIiYnETMRFDMyNxEzESMDKGzRrbUBucjURrmwa3/JxQLA/UX2ngMT+8YAAAEAIQAAA7oEOgAGADiyAAcIERI5ALAARViwAS8bsQEYPlmwAEVYsAUvG7EFGD5ZsABFWLADLxuxAxA+WbIABQMREjkwMSUBMwEjATMB8QEMvf58jf54vfsDP/vGBDoAAAEAKwAABdMEOgAMAGCyBQ0OERI5ALAARViwAS8bsQEYPlmwAEVYsAgvG7EIGD5ZsABFWLALLxuxCxg+WbAARViwAy8bsQMQPlmwAEVYsAYvG7EGED5ZsgALAxESObIFCwMREjmyCgsDERI5MDElEzMBIwEBIwEzExMzBErQuf7Flv75/wCW/sa41fyV/wM7+8YDNPzMBDr81gMqAAEAKQAAA8oEOgALAFMAsABFWLABLxuxARg+WbAARViwCi8bsQoYPlmwAEVYsAQvG7EEED5ZsABFWLAHLxuxBxA+WbIACgQREjmyBgoEERI5sgMABhESObIJBgAREjkwMQETMwEBIwMDIwEBMwH38Nj+ngFt1vr61wFt/p7WAq8Bi/3p/d0Blf5rAiMCFwABABb+SwOwBDoADwBJsgAQERESOQCwAEVYsAEvG7EBGD5ZsABFWLAOLxuxDhg+WbAARViwBS8bsQUSPlmyAA4FERI5sgkBCitYIdgb9FmwABCwDdAwMQETMwECIycnNRcyNjc3ATMB7vzG/k1l3CNFMl5pIin+fsoBDwMr+x/+8gMNlgRMZW4ELgABAFgAAAOzBDoACQBEALAARViwBy8bsQcYPlmwAEVYsAIvG7ECED5ZsgABCitYIdgb9FmyBAACERI5sAcQsgUBCitYIdgb9FmyCQUHERI5MDElIRUhNQEhNSEVAToCefylAlX9tAM0l5eIAxmZgwAAAQBA/pICngY9ABgAMbITGRoREjkAsA0vsAAvsgcNABESObAHL7IfBwFdsgYDCitYIdgb9FmyEwYHERI5MDEBJiY1NTQjNTI1NTY2NxcGERUUBxYVFRIXAnixs9TUAq+zJtGnpwPO/pIy5bzH85Hy0LfhM3ND/ubK41la5c7+7UIAAAEAr/7yAUQFsAADABMAsAAvsABFWLACLxuxAhw+WTAxASMRMwFElZX+8ga+AAABABP+kgJyBj0AGAAxsgUZGhESOQCwCy+wGC+yEQsYERI5sBEvsh8RAV2yEgMKK1gh2Bv0WbIFEhEREjkwMRc2EzU0NyY1NRAnNxYWFxUUMxUiFRUUBgcTywe1tdEmsbIB1NS1r/tBAQrc51RS6csBGkNzMuG50u+R88q84jIAAAEAgwGSBO8DIgAXAEKyERgZERI5ALAARViwDy8bsQ8WPlmwANCwDxCwFNCwFC+yAwEKK1gh2Bv0WbAPELIIAQorWCHYG/RZsAMQsAvQMDEBFAYjIi4CIyIGFQc0NjMyFhYXFzI2NQTvu4lIgKlKKk5UobiLTIywQB1MXwMJntk1lCRrXgKgzkChCgJ0XwACAIv+mAFmBE0AAwAMADKyBg0OERI5sAYQsADQALACL7AARViwCy8bsQsYPlmyBgUKK1gh2Bv0WbIBAgYREjkwMRMzEyMTFAYiJjQ2MhaqqA3CyTdsODhsNwKs++wFTC0+Plo8PAABAGn/CwP5BSYAIQBSsgAiIxESOQCwAEVYsBQvG7EUGD5ZsABFWLAKLxuxChA+WbAH0LIAAQorWCHYG/RZsAoQsAPQsBQQsBHQsBQQsBjQsBQQshsBCitYIdgb9FkwMSUyNjczBgYHFSM1JgI1NTQSNzUzFRYWFyMmJiMiBhUVFBYCSmSUCK8GxpC5s8jKsbmWwAavCI9pjZubg3lZfska6eoiARzcI9QBHSHi3xfUlmmHy8Aju8oAAQBbAAAEaAXEACEAfLIcIiMREjkAsABFWLAULxuxFBw+WbAARViwBS8bsQUQPlmyHxQFERI5sB8vsl8fAXKyjx8BcbK/HwFdsgABCitYIdgb9FmwBRCyAwEKK1gh2Bv0WbAH0LAI0LAAELAN0LAfELAP0LAUELAY0LAUELIbAQorWCHYG/RZMDEBFxQHIQchNTM2Njc1JyM1MwM0NjMyFhUjNCYjIgYVEyEVAcEIPgLdAfv4TSgyAgiloAn1yL7ev39vaYIJAT8CbtyaW52dCYNgCN2dAQTH7tSxa3yaff78nQAAAgBp/+UFWwTxABsAKgA/sgIrLBESObACELAn0ACwAEVYsAIvG7ECED5ZsBDQsBAvsAIQsh8BCitYIdgb9FmwEBCyJwEKK1gh2Bv0WTAxJQYjIicHJzcmNTQ3JzcXNjMyFzcXBxYVFAcXBwEUFhYyNjY1NCYmIyIGBgRPn9HPn4aCi2hwk4KTnsPEn5WEl25mj4T8YHPE4sRxccVwccRzcISCiIeNnMrOo5eIlnh5mImao8vEn5CIAnt71Hp703t603l41AAAAQAfAAAErQWwABYAawCwAEVYsBYvG7EWHD5ZsABFWLABLxuxARw+WbAARViwDC8bsQwQPlmyDxMDK7IADBYREjm0DxMfEwJdsBMQsAPQsBMQshICCitYIdgb9FmwBtCwDxCwB9CwDxCyDgIKK1gh2Bv0WbAK0DAxAQEzASEVIRUhFSERIxEhNSE1ITUhATMCZgFs2/5eATj+gAGA/oDB/oYBev6GATn+XtwDDgKi/TB9pXz+vgFCfKV9AtAAAAIAk/7yAU0FsAADAAcAGACwAC+wAEVYsAYvG7EGHD5ZsgUBAyswMRMRMxERIxEzk7q6uv7yAxf86QPIAvYAAgBa/hEEeQXEADQARACAsiNFRhESObAjELA10ACwCC+wAEVYsCMvG7EjHD5ZshYIIxESObAWELI/AQorWCHYG/RZsgIWPxESObAIELAO0LAIELIRAQorWCHYG/RZsjAjCBESObAwELI3AQorWCHYG/RZsh03MBESObAjELAn0LAjELIqAQorWCHYG/RZMDEBFAcWFhUUBCMiJicmNTcUFjMyNjU0JicuAjU0NyYmNTQkMzIEFSM0JiMiBhUUFhYEHgIlJicGBhUUFhYEFzY2NTQmBHm6RUj+/ORwyUaLurSciKaO0bbAXbZCRwEL3ugBBLmoi46hOIcBH6lxOv3hWktQSzaFARwsTlSLAa+9VTGIZKjHODlxzQKCl3VgWWk+MG+bb7pYMYhkpsjizX2bc2JFUEFQSGGBqxgbE2VFRlBCUhEUZUVYbQAAAgBmBPAC7wXFAAgAEQAdALAHL7ICBQorWCHYG/RZsAvQsAcQsBDQsBAvMDETNDYyFhQGIiYlNDYyFhQGIiZmN2w4OGw3Aa43bDg4bDcFWy09PVo8PCstPj5aPDwAAAMAW//rBeYFxAAbACoAOQCVsic6OxESObAnELAD0LAnELA20ACwAEVYsC4vG7EuHD5ZsABFWLA2LxuxNhA+WbIDNi4REjmwAy+0DwMfAwJdsgouNhESObAKL7QAChAKAl2yDgoDERI5shECCitYIdgb9FmwAxCyGAIKK1gh2Bv0WbIbAwoREjmwNhCyIAQKK1gh2Bv0WbAuELInBAorWCHYG/RZMDEBFAYjIiY1NTQ2MzIWFSM0JiMiBhUVFBYzMjY1JRQSBCAkEjU0AiQjIgQCBzQSJCAEEhUUAgQjIiQCBF+tnp29v5ugrJJfW15sbF5cXf0BoAETAUABEqCe/u2hoP7sn3O7AUsBgAFKu7T+tcbF/rW2AlWZodO2brDTpJVjVYp7cXiKVGWErP7bpqYBJayqASKnpf7cqsoBWsfH/qbKxf6o0c8BWAAAAgCTArMDDwXEABsAJQBssg4mJxESObAOELAd0ACwAEVYsBUvG7EVHD5ZsgQmFRESObAEL7AA0LICBBUREjmyCwQVERI5sAsvsBUQsg4DCitYIdgb9FmyEQsVERI5sAQQshwDCitYIdgb9FmwCxCyIAQKK1gh2Bv0WTAxASYnBiMiJjU0NjMzNTQjIgYVJzQ2MzIWFREUFyUyNjc1IwYGFRQCagwGTIB3gqesbHxFT6GsiYWaGv6kK1gccFNZAsEiJlZ8Z294NIc2Mwxngo+G/sRhUXsoG44BPzNe//8AZgCXA2QDswAmAXr6/gAHAXoBRP/+AAEAfwF3A74DIAAFABoAsAQvsAHQsAEvsAQQsgIBCitYIdgb9FkwMQEjESE1IQO+uv17Az8BdwEIoQAEAFr/6wXlBcQADgAeADQAPQCpsjY+PxESObA2ELAL0LA2ELAT0LA2ELAj0ACwAEVYsAMvG7EDHD5ZsABFWLALLxuxCxA+WbITBAorWCHYG/RZsAMQshsECitYIdgb9FmyIAsDERI5sCAvsiIDCxESObAiL7QAIhAiAl2yNSAiERI5sDUvsr81AV20ADUQNQJdsh8CCitYIdgb9FmyKB81ERI5sCAQsC/QsC8vsCIQsj0CCitYIdgb9FkwMRM0EiQgBBIVFAIEIyIkAjcUEgQzMiQSNTQCJCMiBAIFESMRITIWFRQHFhcVFBcVIyY0JyYnJzM2NjU0JiMjWrsBSwGAAUq7tP61xsX+tbZzoAEToKEBFJ2d/uyhoP7snwHAjQEUmamAegERkQ4DEHOwnEhYTmSKAtnKAVrHx/6mysX+qNHPAVjHrP7bpqkBIqyrASGnpf7c9f6uA1GDfXtBMpo9ViYQJLkRYASAAkI2ST0AAAEAeAUhA0IFsAADABEAsAEvsgIDCitYIdgb9FkwMQEhNSEDQv02AsoFIY8AAgCCA8ACfAXEAAsAFgAvALAARViwAy8bsQMcPlmwDNCwDC+yCQIKK1gh2Bv0WbADELISAgorWCHYG/RZMDETNDYzMhYVFAYjIiYXMjY1NCYjIgYUFoKVamiTk2hplv82Sko2N0tLBMBonJtpapaWFkc5OktPbEoAAgBhAAAD9QTzAAsADwBGALAJL7AARViwDS8bsQ0QPlmwCRCwANCwCRCyBgEKK1gh2Bv0WbAD0LANELIOAQorWCHYG/RZsgUOBhESObQLBRsFAl0wMQEhFSERIxEhNSERMwEhNSECiQFs/pSn/n8BgacBQfy9A0MDVpf+YgGelwGd+w2YAAABAEICmwKrBbsAFgBUsggXGBESOQCwAEVYsA4vG7EOHD5ZsABFWLAALxuxABQ+WbIWAgorWCHYG/RZsALQsgMOFhESObAOELIIAgorWCHYG/RZsA4QsAvQshQWDhESOTAxASE1ATY1NCYjIgYVIzQ2IBYVFA8CIQKr/akBLG1APEtHnacBCJprVLABjwKbbAEaZkUxPUw5cpR/bmhrT5EAAQA+Ao8CmgW6ACYAibIgJygREjkAsABFWLAOLxuxDhw+WbAARViwGS8bsRkUPlmyABkOERI5sAAvtm8AfwCPAANdsj8AAXG2DwAfAC8AA12yXwABcrAOELIHAgorWCHYG/RZsgoOGRESObAAELImBAorWCHYG/RZshQmABESObIdGQ4REjmwGRCyIAIKK1gh2Bv0WTAxATMyNjU0JiMiBhUjNDYzMhYVFAYHFhUUBiMiJjUzFBYzMjY1NCcjAQlUSkg/RjlLnaN8iZxGQpWqiISmnk9DRkmcWARlPTAtOjMpYnt5aDdbGSmPan1+ay08PDNxAgAAAQB7BNgCHAX+AAMAIwCwAi+yDwIBXbAA0LAAL7QPAB8AAl2wAhCwA9AZsAMvGDAxATMBIwE84P70lQX+/toAAAEAmv5gA+4EOgASAFCyDRMUERI5ALAARViwAC8bsQAYPlmwAEVYsAcvG7EHGD5ZsABFWLAQLxuxEBI+WbAARViwDS8bsQ0QPlmyBAEKK1gh2Bv0WbILBw0REjkwMQERFhYzMjcRMxEjJwYjIicRIxEBUwFndMc+uqcJXaqTUbkEOv2Ho5yYAyD7xnOHSf4rBdoAAQBDAAADQAWwAAoAK7ICCwwREjkAsABFWLAILxuxCBw+WbAARViwAC8bsQAQPlmyAQAIERI5MDEhESMiJDU0JDMhEQKGVOb+9wEK5gENAgj+1tX/+lAAAAEAkwJrAXkDSQAJABayAwoLERI5ALACL7EICitY2BvcWTAxEzQ2MhYVFAYiJpM5cjs7cjkC2TBAQDAvPz8AAQB0/k0BqgAAAA4AQbIFDxAREjkAsABFWLAALxuxABA+WbAARViwBi8bsQYSPlm0EwYjBgJdsgEGABESObEHCitY2BvcWbABELAN0DAxIQcWFRQGIycyNjU0Jic3AR0MmaCPB09XQGIgNBuSYXFrNC8sKgmGAAEAegKiAe8FtwAGAECyAQcIERI5ALAARViwBS8bsQUcPlmwAEVYsAAvG7EAFD5ZsgQABRESObAEL7IDAgorWCHYG/RZsgIDBRESOTAxASMRBzUlMwHvndgBYxICogJZOYB1AAACAHoCsgMnBcQADAAaAECyAxscERI5sAMQsBDQALAARViwAy8bsQMcPlmyChsDERI5sAovshADCitYIdgb9FmwAxCyFwMKK1gh2Bv0WTAxEzQ2MzIWFRUUBiAmNRcUFjMyNjU1NCYjIgYHeryam7y7/sy+o2FUU19hU1FgAgRjnsPBpkqfwsKlBmRyc2VOY3JuYQD//wBmAJgDeAO1ACYBew0AAAcBewFqAAD//wBVAAAFkQWtACcB1f/bApgAJwF8ARgACAEHAdgC1gAAABAAsABFWLAFLxuxBRw+WTAx//8AUAAABckFrQAnAXwA7AAIACcB1f/WApgBBwHWAx4AAAAQALAARViwCS8bsQkcPlkwMf//AG8AAAXtBbsAJwF8AZcACAAnAdgDMgAAAQcB1wAxApsAEACwAEVYsCEvG7EhHD5ZMDEAAgBE/n8DeARNABgAIgBXsgkjJBESObAJELAc0ACwEC+wAEVYsCEvG7EhGD5ZsgAQIRESObIDEAAREjmwEBCyCQEKK1gh2Bv0WbAQELAM0LIVABAREjmwIRCyGwUKK1gh2Bv0WTAxAQ4DBwcUFjMyNjUzBgYjIiY1NDc3NjUTFAYiJjU0NjIWAkwBKWC4CwJ0bWR9uQLht8TWoG1CwTdsODhsNwKoan92wWMlbXNxW6HMybOtr3FOkgE9LT4+LSw8PAAC//IAAAdXBbAADwASAHcAsABFWLAGLxuxBhw+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZshEGABESObARL7ICAQorWCHYG/RZsAYQsggBCitYIdgb9FmyCwAGERI5sAsvsgwBCitYIdgb9FmwABCyDgEKK1gh2Bv0WbISBgAREjkwMSEhAyEDIwEhFSETIRUhEyEBIQMHV/yND/3MzeIDcAO3/U0UAk79uBYCwfqvAcgfAWH+nwWwmP4pl/3tAXgC3QABAFkAzgPdBGMACwA4ALADL7IJDAMREjmwCS+yCgkDERI5sgQDCRESObIBCgQREjmwAxCwBdCyBwQKERI5sAkQsAvQMDETAQE3AQEXAQEHAQFZAUr+uHcBSQFJd/64AUp3/rX+tQFJAVABT3v+sQFPe/6x/rB7AVH+rwAAAwB2/6MFHQXsABcAIAApAGayBCorERI5sAQQsB3QsAQQsCbQALAARViwEC8bsRAcPlmwAEVYsAQvG7EEED5ZshoQBBESObIjEAQREjmwIxCwG9CwEBCyHQEKK1gh2Bv0WbAaELAk0LAEELImAQorWCHYG/RZMDEBFAIEIyInByM3JhE1NBIkMzIXNzMHFhMFFBcBJiMiAgcFNCcBFjMyEjcFCZD++LCrg2GOkL6SAQus1pRnjZ+JAvwsYgI0Zqa20QMDFTj921t5uswDAqnW/sGoUpvnwAFoU9IBQqt9pf+7/tpj9I0DiG/+6/YNtoP8j0ABD/0AAgCmAAAEXQWwAA0AFgBXsgkXGBESObAJELAQ0ACwAEVYsAAvG7EAHD5ZsABFWLALLxuxCxA+WbIBAAsREjmwAS+yEAALERI5sBAvsgkBCitYIdgb9FmwARCyDgEKK1gh2Bv0WTAxAREhMhYWFRQEIyERIxETESEyNjU0JicBYAEXk9x3/vjj/u66ugEVjqCgiAWw/ttpwn7C5/7HBbD+Q/3el3h7lwEAAQCL/+wEagYSACoAabIhKywREjkAsABFWLAFLxuxBR4+WbAARViwEy8bsRMQPlmwAEVYsAAvG7EAED5ZsgoTBRESObIOBRMREjmwExCyGgEKK1gh2Bv0WbIgEwUREjmyIwUTERI5sAUQsigBCitYIdgb9FkwMSEjETQ2MzIWFRQGFRQeAhUUBiMiJic3FhYzMjY1NC4CNTQ2NTQmIyIRAUS5z7q0xYBLvFbLtlG1JisxhzVrcUq9V4toWNoEV9Drs599y0UzX5CITJ+yLBybICxeUjRgk4pRWc9UXmv+2wADAE7/7AZ8BE4AKgA1AD0AxrICPj8REjmwAhCwLtCwAhCwOdAAsABFWLAXLxuxFxg+WbAARViwHS8bsR0YPlmwAEVYsAAvG7EAED5ZsABFWLAFLxuxBRA+WbICHQAREjmyDAUXERI5sAwvtL8MzwwCXbAXELIQAQorWCHYG/RZshMMFxESObIaHQAREjmyOh0AERI5sDovtL86zzoCXbIhAQorWCHYG/RZsAAQsiUBCitYIdgb9FmyKB0AERI5sCvQsAwQsi8BCitYIdgb9FmwEBCwNtAwMQUgJwYGIyImNTQ2MzM1NCYjIgYVJzQ2MzIWFzY2MzISFRUhFhYzMjc3FwYlMjY3NSMGBhUUFgEiBgchNTQmBO7++4hB4o2nvOPd325oaYy48rtzsDI/rmnS6P0oB66VlHkvQJ78CUieMuR1jGoDUHOVEQIahhS0Vl6tl52uVWt7blETj7VTU09X/v/pc7C/TB+IeZZKNu0CblNNXQM0q4sfhJMAAAIAfv/sBC0GLAAdACsAVLIHLC0REjmwBxCwKNAAsABFWLAZLxuxGR4+WbAARViwBy8bsQcQPlmyDxkHERI5sA8vshEZBxESObIiAQorWCHYG/RZsAcQsigBCitYIdgb9FkwMQESERUUBgYjIiYmNTQ2NjMyFyYnByc3Jic3Fhc3FwMnJiYjIgYVFBYzMjY1AzT5ddiGh9x5cM+Bo3kwjdpJwIS3Oe+vvUloAiGLXJGip4B9mQUV/vj+Z12e/ZCB4IaT6YJyw42UY4NbMZ82i4Fk/PM4PUm/p4zE4rgAAAMARwCsBC0EugADAA0AFwBOsgcYGRESObAHELAA0LAHELAR0ACwAi+yAQEKK1gh2Bv0WbACELEMCitY2BvcWbEGCitY2BvcWbABELEQCitY2BvcWbEWCitY2BvcWTAxASE1IQE0NjIWFRQGIiYRNDYyFhUUBiImBC38GgPm/aA5cjs7cjk5cjs7cjkCWLgBOjBAQDAvPj78/jBAQDAuPz8AAAMAW/96BDQEuAAVAB0AJgBjsgQnKBESObAEELAb0LAEELAj0ACwAEVYsAQvG7EEGD5ZsABFWLAPLxuxDxA+WbIjAQorWCHYG/RZsiEjBBESObAhELAY0LAEELIbAQorWCHYG/RZshkbDxESObAZELAg0DAxEzQ2NjMyFzczBxYRFAYGIyInByM3JhMUFwEmIyIGBTQnARYzMjY1W3vhj25eSXxmw3zgkGhWSnxkzblhAVc+SIqoAmZX/qw3QounAief/YsqlM2a/sCe/okjlcuVATfCbwK2INq1tm/9UBnbuQACAJX+YAQnBgAADwAaAGSyGBscERI5sBgQsAzQALAIL7AARViwDC8bsQwYPlmwAEVYsAYvG7EGEj5ZsABFWLADLxuxAxA+WbIFDAMREjmyCgwDERI5sAwQshMBCitYIdgb9FmwAxCyGAEKK1gh2Bv0WTAxARQCIyInESMRMxE2MzISESc0JiMiBxEWMzI2BCfiwcVxublxwsPjuZyIqFRTq4WdAhH3/tJ9/fcHoP3KhP7a/voEt9SV/fuU0wAAAgAdAAAFiAWwABMAFwBrALAARViwDy8bsQ8cPlmwAEVYsAgvG7EIED5ZshQIDxESObAUL7IQFA8REjmwEC+wANCwEBCyFwEKK1gh2Bv0WbAD0LAIELAF0LAUELIHAQorWCHYG/RZsBcQsArQsBAQsA3QsA8QsBLQMDEBMxUjESMRIREjESM1MxEzESERMwEhNSEFAoaGwf0jwYaGwQLdwfxiAt39IwSOjvwAAqH9XwQAjgEi/t4BIv2OwgABAJsAAAFVBDoAAwAdALAARViwAi8bsQIYPlmwAEVYsAAvG7EAED5ZMDEhIxEzAVW6ugQ6AAABAJoAAAQ/BDoADABoALAARViwBC8bsQQYPlmwAEVYsAgvG7EIGD5ZsABFWLACLxuxAhA+WbAARViwCy8bsQsQPlmwAhCwBtCwBi+ynwYBXbS/Bs8GAl2yLwYBXbL/BgFdsgEBCitYIdgb9FmyCgEGERI5MDEBIxEjETMRMwEzAQEjAb9rurpbAY3f/jwB6OkBzf4zBDr+NgHK/fP90wAAAQAiAAAEGwWwAA0AWwCwAEVYsAwvG7EMHD5ZsABFWLAGLxuxBhA+WbIBDAYREjmwAS+wANCwARCyAgEKK1gh2Bv0WbAD0LAGELIEAQorWCHYG/RZsAMQsAjQsAnQsAAQsAvQsArQMDEBJRUFESEVIREHNTcRMwFpAQf++QKy/I2GhsEDS1R9VP3PnQKRKn0qAqIAAAEAIgAAAgoGAAALAEoAsABFWLAKLxuxCh4+WbAARViwBC8bsQQQPlmyAQQKERI5sAEvsADQsAEQsgIBCitYIdgb9FmwA9CwBtCwB9CwABCwCdCwCNAwMQE3FQcRIxEHNTcRMwFsnp66kJC6A2U9ez39FgKjN3s3AuIAAQCi/ksE8QWwABMAWrIGFBUREjkAsABFWLAALxuxABw+WbAARViwEC8bsRAcPlmwAEVYsAQvG7EEEj5ZsABFWLAOLxuxDhA+WbAEELIJAQorWCHYG/RZsg0OEBESObISDgAREjkwMQERFAYjIic3FjMyNTUBESMRMwERBPGrnD02DiU9iP0zwMACzQWw+f2ouhKaDtBHBGr7lgWw+5gEaAAAAQCR/ksD8AROABoAYbINGxwREjkAsABFWLADLxuxAxg+WbAARViwAC8bsQAYPlmwAEVYsAovG7EKEj5ZsABFWLAYLxuxGBA+WbIBGAMREjmwChCyDwEKK1gh2Bv0WbADELIVAQorWCHYG/RZMDEBFzYzMhYXERQGIyInNxYzMjURNCYjIgcRIxEBNw10y7O4AqebPTYOI0KJb32vUboEOpqu0Mv89KS4Ep0NwgL3i4CF/NQEOgACAGj/6wcJBcQAFwAjAJGyASQlERI5sAEQsBrQALAARViwDC8bsQwcPlmwAEVYsA4vG7EOHD5ZsABFWLAALxuxABA+WbAARViwAy8bsQMQPlmwDhCyEAEKK1gh2Bv0WbITAA4REjmwEy+yFAEKK1gh2Bv0WbAAELIWAQorWCHYG/RZsAMQshgBCitYIdgb9FmwDBCyHQEKK1gh2Bv0WTAxISEGIyImAicRNBI2MzIXIRUhESEVIREhBTI3ESYjIgYHERQWBwn8sLJyov6MAYv+onyqA0b9LQJ3/YkC3fuMcWZtbK3CAsMVlgEPqwE1rAERlxSe/iyd/fwbDgSOD+XP/sfT6wAAAwBh/+wHAAROACAALAA0AJayBjU2ERI5sAYQsCbQsAYQsDDQALAARViwBC8bsQQYPlmwAEVYsAovG7EKGD5ZsABFWLAXLxuxFxA+WbAARViwHS8bsR0QPlmyBwoXERI5sjEKFxESObAxL7IOAQorWCHYG/RZsBcQshIBCitYIdgb9FmyFAoXERI5shoKFxESObAk0LAEELIqAQorWCHYG/RZsC3QMDETNDY2MzIWFzY2MzIWFRUhFhYzMjcXBiMiJicGBiMiADUXFBYzMjY1NCYjIgYlIgYHITU0JmF5246JyT1BxHDP6v0yB6SGvHhKifWHzT8+x4bc/vi5oIuJoKGKh6IELWOWFgIOiQInoP6JdWRmc/7rdKrFbH6EcGRjcQEw/gm32NfOttnW1qOKGn2WAAABAKAAAAKCBhUADAAysgMNDhESOQCwAEVYsAQvG7EEHj5ZsABFWLAALxuxABA+WbAEELIJAQorWCHYG/RZMDEzETY2MzIXByYjIhURoAGwojtUFygztwSuqb4Vjgvd+2AAAAIAXf/sBRIFxAAXAB8AW7IAICEREjmwGNAAsABFWLAQLxuxEBw+WbAARViwAC8bsQAQPlmyBRAAERI5sAUvsBAQsgkBCitYIdgb9FmwABCyGAEKK1gh2Bv0WbAFELIbAQorWCHYG/RZMDEFIAARNSE1EAIjIgcHJzc2MyAAERUUAgQnMhI3IRUUFgK5/uP+wQP09N2liz0vFp7oAS4BZJz+6qep3g/8z9MUAVkBRXUHAQIBHDoajw1Y/of+sVTF/r+2ngEF2yLa5AAB/+T+SwK8BhUAHgBxshQfIBESOQCwAEVYsBUvG7EVHj5ZsABFWLAQLxuxEBg+WbAARViwHS8bsR0YPlmwAEVYsAUvG7EFEj5ZsB0QsgABCitYIdgb9FmwBRCyCgEKK1gh2Bv0WbAAELAO0LAP0LAVELIaAQorWCHYG/RZMDEBIxEUBiMiJzcWMzI2NREjNTM1NjYzMhcHJiMiBxUzAmDLqJo9Mg4eQ0FHq6sCr6E7VBYmPKsEywOr+/6ntxKTDWhcBASPeKe8FZMKw3oAAAIAZf/sBZ0GNwAXACUAU7IEJicREjmwBBCwItAAsABFWLANLxuxDRw+WbAARViwBC8bsQQQPlmyDw0EERI5sA8QsBXQsA0QshsBCitYIdgb9FmwBBCyIgEKK1gh2Bv0WTAxARQCBCMiJAInNTQSJDMyFzY2NTMQBRYXBxACIyICBxUUEjMyEhEE+JD++LCr/vaVAZIBC6zwm2Bdp/75YQG+z7220QPTub/LAqnW/sGoqAE+z2TSAUGsmweDhP6zPaz2BAECARb+6/Zr+/7hARoBAQAAAgBb/+wEugSwABYAIwBTshMkJRESObATELAa0ACwAEVYsAQvG7EEGD5ZsABFWLATLxuxExA+WbIGBBMREjmwBhCwDNCwExCyGgEKK1gh2Bv0WbAEELIhAQorWCHYG/RZMDETNDY2MzIXNjY1MxAHFhUVFAYGIyIANRcUFjMyNjU1NCYjIgZbe+GPz4hHQJbPSXzgkN7+8bmnjYunqYuKqAInn/2LighkgP7dM4qpFp7+iQEz+wm02tu5ELXa2gAAAQCM/+wGHQYCABoATLIMGxwREjkAsABFWLASLxuxEhw+WbAARViwGi8bsRocPlmwAEVYsA0vG7ENED5ZsgENGhESObABELAI0LANELIWAQorWCHYG/RZMDEBFTY2NTMUBgcRBgIHByIAJxEzERQWMzI2NREEqnNhn7HCAfTTSe/+5AK+rqGjrQWw1QuJk9LRDP1+x/78FgQBAuID4Pwmnq+ungPbAAEAiP/sBQ8EkAAZAGCyBxobERI5ALAARViwEy8bsRMYPlmwAEVYsA0vG7ENGD5ZsABFWLAILxuxCBA+WbAARViwBS8bsQUQPlmyFQgTERI5sBUQsAPQsgYIExESObAIELIQAQorWCHYG/RZMDEBFAYHESMnBiMiJicRMxEUMzI3ETMVPgI1BQ+ToLAEbNGttQG5yNRGuUREHQSQtJME/Ltrf8nFAsD9RfaeAxODAiNIbAAB/7T+SwFlBDoADQAoALAARViwAC8bsQAYPlmwAEVYsAQvG7EEEj5ZsgkBCitYIdgb9FkwMQERFAYjIic3FjMyNjURAWWqmDs0Dh5DQUgEOvttqrISkw1oXASTAAIAYv/sA+kETwAUABwAZbIIHR4REjmwCBCwFdAAsABFWLAALxuxABg+WbAARViwCC8bsQgQPlmyDQAIERI5sA0vsAAQshABCitYIdgb9FmyEgAIERI5sAgQshUBCitYIdgb9FmwDRCyGAEKK1gh2Bv0WTAxATIAFRUUBgYnIiY1NSEmJiMiByc2ATI2NyEVFBYB/9wBDnzYetDpAs0HoYi6e0mMAQ5ilxX984kET/7U+SSV+I0B/ul0qMhsfYb8NaSJGn2WAAEAqQTkAwYGAAAIADQAsAQvsAfQsAcvtA8HHwcCXbIFBAcREjkZsAUvGLAB0BmwAS8YsAQQsALQsgMEBxESOTAxARUjJwcjNRMzAwaZlpWZ9nAE7gqqqgwBEAAAAQCMBOMC9gX/AAgAIACwBC+wAdCwAS+0DwEfAQJdsgAEARESObAI0LAILzAxATczFQMjAzUzAcCWoP5x+50FVaoK/u4BEgr//wB4BSEDQgWwAQYAcAAAAAoAsAEvsQID9DAxAAEAgQTLAtgF1wAMACayCQ0OERI5ALADL7IPAwFdsgkECitYIdgb9FmwBtCwBi+wDNAwMQEUBiAmNTMUFjMyNjUC2KX+9KaXTElGTwXXeZOUeEZPTkcAAQCNBO4BaAXCAAgAGLICCQoREjkAsAcvsgIFCitYIdgb9FkwMRM0NjIWFAYiJo03bDg4bDcFVy0+Plo8PAACAHkEtAInBlAACQAUACqyAxUWERI5sAMQsA3QALADL7AH0LAHL7I/BwFdsAMQsA3QsAcQsBLQMDEBFAYjIiY0NjIWBRQWMzI2NCYjIgYCJ3xbXHt7uHv+tUMxMERDMTJCBYBXdXasenpWL0RCYkVGAAABADL+TwGSADgAEAAusgUREhESOQCwEC+wAEVYsAovG7EKEj5ZsgUDCitYIdgb9Fm2DxAfEC8QA10wMSEHBhUUMzI3FwYjIiY1NDY3AX46cU4wNA1GWllnhnstW1ZIGnksaFZZmjgAAAEAewTZAz4F6AAXAD4AsAMvsAjQsAgvtA8IHwgCXbADELAL0LALL7AIELIPAworWCHYG/RZsAMQshQDCitYIdgb9FmwDxCwF9AwMQEUBiMiLgIjIgYVJzQ2MzIeAjMyNjUDPntcKTxhKxwpOnx5XSM4YDMfKzkF3GyGFD4NPzEHa4wUOhJELQACAF4E0AMsBf8AAwAHADsAsAIvsADQsAAvtA8AHwACXbACELAD0BmwAy8YsAAQsAXQsAUvsAIQsAbQsAYvsAMQsAfQGbAHLxgwMQEzASMDMwMjAl3P/vOpbcXalgX//tEBL/7RAAACAH7+awHV/7UACwAWADQAsAMvQAsAAxADIAMwA0ADBV2wCdCwCS9ACTAJQAlQCWAJBF2yAAkBXbAO0LADELAU0DAxFzQ2MzIWFRQGIyImNxQWMjY1NCYjIgZ+ZEpHYmBJTGJXNEYwMCMlMvJGYWBHRl1eRSMwMCMkMjQAAfynBNj+SAX+AAMAHgCwAS+wANAZsAAvGLABELAC0LACL7QPAh8CAl0wMQEjATP+SJ/+/uAE2AEmAAH9bwTY/xAF/gADAB4AsAIvsAHQsAEvtA8BHwECXbACELAD0BmwAy8YMDEBMwEj/jDg/vSVBf7+2v///IsE2f9OBegABwCk/BAAAAAB/V4E2f6UBnQADgAuALAAL7IPAAFdsAfQsAcvQAkPBx8HLwc/BwRdsAbQsgEABhESObINAAcREjkwMQEnNjY0JiM3MhYVFAYHB/10AUtGW0sHlZpOTQEE2ZkFHk4namdVPVALRwAC/CcE5P8HBe4AAwAHADcAsAEvsADQGbAALxiwARCwBdCwBS+wBtCwBi+2DwYfBi8GA12wA9CwAy+wABCwBNAZsAQvGDAxASMBMwEjAzP+Aqn+zuEB/5b2zgTkAQr+9gEKAAH9OP6i/hP/dgAIABEAsAIvsgcFCitYIdgb9FkwMQU0NjIWFAYiJv04N2w4OGw39S0+Plo8PAAAAQC3BO4BmwY/AAMAHQCwAi+wANCwAC+yDwABXbIDAgAREjkZsAMvGDAxEzMDI+2udHAGP/6vAAADAHEE8AODBogAAwAMABUANwCwCy+wAtCwAi+wAdCwAS+wAhCwA9AZsAMvGLALELIGBQorWCHYG/RZsA/QsAsQsBTQsBQvMDEBMwMjBTQ2MhYUBiImJTQ2MhYUBiImAeG8ZYf+wDdsODhsNwI3N2w4OGw3Boj++CUtPT1aPDwrLT4+Wjw8//8AkwJrAXkDSQEGAHgAAAAGALACLzAxAAEAsQAABDAFsAAFACsAsABFWLAELxuxBBw+WbAARViwAi8bsQIQPlmwBBCyAAEKK1gh2Bv0WTAxASERIxEhBDD9QsEDfwUS+u4FsAACAB8AAAVzBbAAAwAGAC8AsABFWLAALxuxABw+WbAARViwAi8bsQIQPlmyBAEKK1gh2Bv0WbIGAgAREjkwMQEzASElIQEChqoCQ/qsAQYDTP5nBbD6UJ0EKAADAGf/7AT6BcQAAwAVACMAd7IIJCUREjmwCBCwAdCwCBCwINAAsABFWLARLxuxERw+WbAARViwCC8bsQgQPlmyAggRERI5sAIvss8CAV2y/wIBXbIvAgFdtL8CzwICcbIBAQorWCHYG/RZsBEQshkBCitYIdgb9FmwCBCyIAEKK1gh2Bv0WTAxASE1IQUUAgQjIiQCJzU0EiQzMgQSFwcQAiMiAgcVFBIzMhI3A8D9+wIFATqP/vixrP72kwKSAQusrwEIkQK/0Lu20QPRu7rMAwKTmILV/sKqqQE5zmnSAUKrqP7FzwsBAwEV/uv2a/r+4AEP/QABADIAAAUDBbAABgAxALAARViwAy8bsQMcPlmwAEVYsAEvG7EBED5ZsABFWLAFLxuxBRA+WbIAAwEREjkwMQEBIwEzASMCmv5mzgISrAITzwSJ+3cFsPpQAAADAHgAAAQhBbAAAwAHAAsATwCwAEVYsAgvG7EIHD5ZsABFWLACLxuxAhA+WbIAAQorWCHYG/RZsAIQsAXQsAUvsi8FAV2yBgEKK1gh2Bv0WbAIELIKAQorWCHYG/RZMDE3IRUhEyEVIQMhFSF4A6n8V1cC8v0OUwOU/GydnQM/nQMOngABALIAAAUBBbAABwA4ALAARViwBi8bsQYcPlmwAEVYsAAvG7EAED5ZsABFWLAELxuxBBA+WbAGELICAQorWCHYG/RZMDEhIxEhESMRIQUBwf0ywARPBRL67gWwAAEARQAABEQFsAAMADwAsABFWLAILxuxCBw+WbAARViwAy8bsQMQPlmyAQEKK1gh2Bv0WbAF0LAIELIKAQorWCHYG/RZsAfQMDEBASEVITUBATUhFSEBAvL+QwMP/AEB4f4fA879JAG7As79z52PAkoCR5Ce/dQAAAMATQAABXQFsAAUABsAIwBssgokJRESObAKELAV0LAKELAc0ACwAEVYsBMvG7ETHD5ZsABFWLAJLxuxCRA+WbISEwkREjmwEi+wANCyCAkTERI5sAgvsAvQsAgQsh0BCitYIdgb9FmwFdCwEhCyFgEKK1gh2Bv0WbAc0DAxATIEFhUUBgQjFSM1IiQmEDY2MzUzAxEjIgYQFgERMzI2NTQmA0KgAQOPkv8AoMKi/v6Pkf+jwsIFrMPCAXQErMPDBPeM/Jud/Yuvr436ATj9jLn7ngMK0v6Y0AMK/PbRtbPRAAABAFoAAAUhBbAAGABcsgAZGhESOQCwAEVYsAQvG7EEHD5ZsABFWLARLxuxERw+WbAARViwFy8bsRccPlmwAEVYsAsvG7ELED5ZshYECxESObAWL7AA0LAWELINAQorWCHYG/RZsArQMDEBNjY1ETMRFAYGBxEjESYAJxEzERYWFxEzAxacrsF/7Z/B5/7vA8ABpZXBAgsX16oCDf3wn/WTD/6WAWoXASrtAhj976PXGQOkAAABAHEAAATLBcQAJABcshklJhESOQCwAEVYsBkvG7EZHD5ZsABFWLAOLxuxDhA+WbAARViwIy8bsSMQPlmwDhCyEAEKK1gh2Bv0WbAN0LAA0LAZELIGAQorWCHYG/RZsBAQsCHQsCLQMDElNhI3NTQmIAYVFRQSFxUhNTMmAjU1NBI2MzIWEhcVFAIHMxUhAuGKmgPC/q7AnZH+FN1qeI3+oaD9jgN4atz+HKIbARzqhuf2+uVx8P7YHKKdZgEzom+6ASSfnP7ktIKg/s1mnQAAAgBk/+sEdwROABYAIQB8sh8iIxESObAfELAT0ACwAEVYsBMvG7ETGD5ZsABFWLAWLxuxFhg+WbAARViwCC8bsQgQPlmwAEVYsAwvG7EMED5ZsAgQsgMBCitYIdgb9FmyChMIERI5shUTCBESObAMELIaAQorWCHYG/RZsBMQsh8BCitYIdgb9FkwMQERFjMyNxcGIyInBiMiAjU1EBIzMhc3ARQWMzI3ESYjIgYD7gJOEw8XMEqTJmvRwOTixMtrEf3MkoetUlWohpUEOvzjjAWJIqWlARv0DwEIAT2hjf26r8O6Ab684wAAAgCg/oAETQXEABQAKgBpsgArLBESObAY0ACwDy+wAEVYsAAvG7EAHD5ZsABFWLAMLxuxDBA+WbIoAAwREjmwKC+yJQEKK1gh2Bv0WbIGJSgREjmyDgwAERI5sAAQshgBCitYIdgb9FmwDBCyHwEKK1gh2Bv0WTAxATIWFRQGBxYWFRQGIyInESMRNDY2ATQmIyIGBxEWFjMyNjU0JicjNTMyNgJdwetiWHuD+c21eLp6zwFniGtslgEskF6GmoxtllV4fgXE265bmC4tw4LN71/+NQWxbLxr/ntmh45r/MM0P6CBdqUDmHcAAQAu/mAD3wQ6AAgAOLIACQoREjkAsABFWLABLxuxARg+WbAARViwBy8bsQcYPlmwAEVYsAQvG7EEEj5ZsgAHBBESOTAxAQEzAREjEQEzAgoBGL3+hbr+hL0BFAMm+//+JwHgA/oAAgBg/+wEJwYcAB4AKgBeshQrLBESObAUELAi0ACwAEVYsAMvG7EDHj5ZsABFWLAULxuxFBA+WbADELIIAQorWCHYG/RZshsUAxESObAbL7IoCworWCHYG/RZsAzQsBQQsiIBCitYIdgb9FkwMRM0NjMyFwcmIyIGFRQEEhcVFAYGIyIANTU0EjcnJiYTFBYzMjY1NCYnIgbdy6+LhgKXfFZlAbvPBXbbkd7++byQAWNrPqGJiKCpfYikBPWInzegO0g+bJn+88QnmfOFASfyDaUBCCMFJ4z9Y7DLysaI2xnNAAEAY//sA+wETQAlAG+yAyYnERI5ALAARViwFS8bsRUYPlmwAEVYsAovG7EKED5ZsgMBCitYIdgb9FmwChCwBtCwChCwItCwIi+yLyIBXbK/IgFdsiMBCitYIdgb9FmyDyMiERI5shkVIhESObAVELIcAQorWCHYG/RZMDEBFBYzMjY1MxQGIyImNTQ3JiY1NDYzMhYVIzQmIyIGFRQzMxUjBgEek3Zxm7n/xsz4zVhi58q6+bmPa3CH9MTg6gEwTWJuUZu5sZO6QiR6SZSms45GZVtKoJQGAAEAbf6BA8MFsAAfAEuyCCAhERI5ALAPL7AARViwAC8bsQAcPlmyHQEKK1gh2Bv0WbAB0LIVIAAREjmyAhUAERI5sBUQsgcBCitYIdgb9FmyHAAVERI5MDEBFQEGBhUUFhcXFhYVBgYHJzY2NTQkJyYmNTQSNwEhNQPD/qKKZkNS91FHAmxDYi8z/sw2Z1uSfwEd/YMFsHj+VaHlhVphGUgYWE5FrDZUNVUtRE4YLZmBggFAlgFDmAABAJH+YQPwBE4AEgBTsgwTFBESOQCwAEVYsAMvG7EDGD5ZsABFWLAALxuxABg+WbAARViwBy8bsQcSPlmwAEVYsBAvG7EQED5ZsgEQAxESObADELIMAQorWCHYG/RZMDEBFzYzMhYXESMRNCYjIgYHESMRATgLeMi+rgG5bIBcgiK6BDqInMXM+6QEUYh8V0787wQ6AAADAHr/7AQSBcQADQAWAB4AkrIDHyAREjmwAxCwE9CwAxCwG9AAsABFWLAKLxuxChw+WbAARViwAy8bsQMQPlmyDgMKERI5sA4vsl8OAV2y/w4BXbSPDp8OAnG0vw7PDgJxsi8OAXGyzw4BXbIvDgFdtO8O/w4CcbAKELITAQorWCHYG/RZsA4QshgBCitYIdgb9FmwAxCyGwEKK1gh2Bv0WTAxARACIyICAzUQEjMyEhMFITU0JiMiBhUFIRUUFiA2NwQS7N/b7gTs397rBP0hAiWLiIaMAiX925IBBI0CAoD+v/6tAUwBNM0BPQFO/rz+zSw34/Hx488n5frw4wAAAQDD//QCSwQ6AAwAKACwAEVYsAAvG7EAGD5ZsABFWLAJLxuxCRA+WbIEAQorWCHYG/RZMDEBERQWMzI3FwYjIhERAXw3QDAnAUZJ+QQ6/Nc/QAyXEwEmAyAAAQAl/+8EOwXuABoAULIQGxwREjkAsAAvsABFWLALLxuxCxA+WbAARViwES8bsREQPlmwCxCyBwEKK1gh2Bv0WbIQAAsREjmwEBCwE9CwABCyFwEKK1gh2Bv0WTAxATIWFwEWFjM3FwYjIiYmJwMBIwEnJiYjByc2AQVieCEBqxQtIyYGJCpNTj4d5v7izgGKYBc1LS8BKgXuUF/7qzMnA5gMJVZQAlH89QQF6zguAo4MAAEAZf53A6kFxAAtAFayAy4vERI5ALAXL7AARViwKy8bsSscPlmyAgEKK1gh2Bv0WbIILisREjmwCC+yCQEKK1gh2Bv0WbIeLisREjmwHhCyDwEKK1gh2Bv0WbIlCQgREjkwMQEmIyIGFRQhMxUjBgYVFBYEFhcWFRQGByc3NjU0LgQ1NDY3JiY1NCQzMhcDcoRhjaABTYWWtseQAQ98IE9oSGs5MUzmqXdBpJZ2gwEC5JFwBQgkZ1XbmAKco3CdQSUUMWlApz1UQDw+Jy4zQmmZb5HLLiqYYJ+5JwABACn/9ASkBDoAFABcsgsVFhESOQCwAEVYsBMvG7ETGD5ZsABFWLAKLxuxChA+WbAARViwDy8bsQ8QPlmwExCyAAEKK1gh2Bv0WbAKELIFAQorWCHYG/RZsAAQsA3QsA7QsBHQsBLQMDEBIxEUFjMyNxcGIyIRESERIxEjNSEEcZw2QTAnAUZJ+f5vuakESAOh/XJAQQyXEwEmAof8XwOhmQACAJH+YAQfBE4ADwAbAFeyEhwdERI5sBIQsADQALAARViwAC8bsQAYPlmwAEVYsAovG7EKEj5ZsABFWLAHLxuxBxA+WbIJAAcREjmyEgEKK1gh2Bv0WbAAELIYAQorWCHYG/RZMDEBMhIXFxQCIyInESMRNDY2AxYzMjY1NCYjIgYVAlDP9AsB4L/DcrpxzYRTq4eWkYV1kARO/ub+QvD+6Hz9+APknuyA/MiTw8PN4NipAAABAGX+igPhBE4AIgBJsgAjJBESOQCwFC+wAEVYsAAvG7EAGD5ZsABFWLAbLxuxGxA+WbAAELAE0LAAELIHAQorWCHYG/RZsBsQsg0BCitYIdgb9FkwMQEyFhUjNCYjIgYVFRAFFxYWFQYGByc3NjU0JicmAjU1NDY2Aj2956+Gb4SbAUCGYlACY0piLzFGVuz4d9cETtW0boPbsyD+/GMmHWBQP6c+VTY8RisrEzQBAdMqmPuJAAIAYP/sBHsEOgARAB0ATLIIHh8REjmwCBCwFdAAsABFWLAQLxuxEBg+WbAARViwCC8bsQgQPlmwEBCyAAEKK1gh2Bv0WbAIELIVAQorWCHYG/RZsAAQsBvQMDEBIRYRFRQGBiMiADU1NDY2NyEBFBYzMjY1NCYjIgYEe/7kyHrdjNr+9nbZjAJA/J+gioufoYuJnwOhlP7vEYzriAEv/w2Y8ogB/de319nLrM7MAAEAUf/sA9kEOgAQAEmyChESERI5ALAARViwDy8bsQ8YPlmwAEVYsAkvG7EJED5ZsA8QsgABCitYIdgb9FmwCRCyBAEKK1gh2Bv0WbAAELAN0LAO0DAxASERFDMyNxcGIyImJxEhNSED2f6NaSsxKkxqfXUB/qUDiAOk/WmFGoI0k5ICk5YAAQCP/+wD9gQ6ABIAPLIOExQREjkAsABFWLAALxuxABg+WbAARViwCC8bsQgYPlmwAEVYsA4vG7EOED5ZsgMBCitYIdgb9FkwMQEREDMyNjUmAzMWERAAIyImJxEBScmBqgV2w3H+/9rCyAIEOv15/s/6tucBIfH+6f75/sHg1wKXAAIAV/4iBUwEOgAZACIAXLIPIyQREjmwDxCwGtAAsBgvsABFWLAGLxuxBhg+WbAARViwEC8bsRAYPlmwAEVYsBcvG7EXED5ZsADQsBcQshoBCitYIdgb9FmwDNCwEBCyIAEKK1gh2Bv0WTAxBSQANTQSNxcGBxQWFxE0NjMyFhYVFAAFESMTNjY1JiYjIhUCbP8A/uuBf2WhCrWminGC4YL+3v77ubmqxAWlgkIRFwEz+6gBB1eFjPWt5RoCzGl9jfiV8/7XFf4zAmYW3qSp2FIAAAEAX/4oBUMEOgAZAFiyABobERI5ALANL7AARViwAC8bsQAYPlmwAEVYsAYvG7EGGD5ZsABFWLATLxuxExg+WbAARViwDC8bsQwQPlmyAQEKK1gh2Bv0WbAMELAP0LABELAY0DAxARE2NjUmAzMWERAABREjESYAEREzERYWFxEDHKvDBXrCdv7j/va5//77ugKmogQ6/E4Y5bLoARvs/un+/f7QFf45AckaATYBEwHm/g7C5BkDsQABAHr/7AYZBDoAIwBashskJRESOQCwAEVYsAAvG7EAGD5ZsABFWLATLxuxExg+WbAARViwGS8bsRkQPlmwAEVYsB4vG7EeED5ZsgUBCitYIdgb9FmyCQAeERI5sA7QshsTGRESOTAxAQIHFBYzMjY1ETMRFhYzMjY1JgMzFhEQAiMiJwYGIyICERA3AcSKB3JqbHG7AXFranIHisOHz7zwVSmkd7zPhwQ6/uXvy+OtpgEt/s6kquLM7wEb9P7q/u3+z+51eQExARMBH+sAAAIAef/sBHkFxgAfACgAbrIUKSoREjmwFBCwJtAAsABFWLAZLxuxGRw+WbAARViwBi8bsQYQPlmyHRkGERI5sB0vsgIBCitYIdgb9FmyCxkGERI5sAYQsg8BCitYIdgb9FmwAhCwE9CwHRCwI9CwGRCyJgEKK1gh2Bv0WTAxAQYHFQYGIyImNRE3ERQWMzI2NTUmADU0NjMyFhURNjcBFBYXESYjIhUEeTxTAuXIy/e6jHx0gtn+87iWn7I/SP2UoooFk5QCcxcJptPu99cBRwL+sI+bkpimHwEa2aC7xbL+oQUTAVKFvR4BaMbEAAAB/9oAAARuBbwAGgBJsgAbHBESOQCwAEVYsAQvG7EEHD5ZsABFWLAXLxuxFxw+WbAARViwDS8bsQ0QPlmyAAQNERI5sAQQsgkBCitYIdgb9FmwEtAwMQETNjYzMhcHJiMiBwERIxEBJiMiByc2MzIWFwIk4StrV0g0JA0nRiT+17/+2CdDJw0kNEdYayoDBgH7Y1gblwhP/Xf9xgI8AodPCJYcVF0AAgBK/+wGGwQ6ABIAJgBwsggnKBESObAIELAe0ACwAEVYsBEvG7ERGD5ZsABFWLAGLxuxBhA+WbAARViwCi8bsQoQPlmwERCyAAEKK1gh2Bv0WbIIEQYREjmwD9CwENCwFdCwFtCwChCyGwEKK1gh2Bv0WbIfChEREjmwJNAwMQEjFhUQAiMiJwYjIgIRNDcjNSEBJichBgcUFjMyNjcRMxEWFjMyNgYbiEC8q/FTU/CqvUB0BdH+/gRK/LtLBGBYaXECuwJxalZgA6Gsxf7v/s3v7wEwARS/spn99qrHyKnL46eiAQf++aKn4gABACr/9QWxBbAAGABhshEZGhESOQCwAEVYsBcvG7EXHD5ZsABFWLAJLxuxCRA+WbAXELIAAQorWCHYG/RZsgQXCRESObAEL7AJELIKAQorWCHYG/RZsAQQshABCitYIdgb9FmwABCwFdCwFtAwMQEhETYzMgQQBCMnMjY1JiYjIgcRIxEhNSEElP32nYT0ARL+/O0Cm5gCo6KWisH+YQRqBRL+OTDx/k7jlpGUjpYu/VoFEp4AAAEAe//sBNwFxAAfAIayAyAhERI5ALAARViwCy8bsQscPlmwAEVYsAMvG7EDED5ZsAsQsA/QsAsQshIBCitYIdgb9FmyFgMLERI5sBYvtL8WzxYCcbLPFgFdsp8WAXGy/xYBXbIvFgFdsl8WAXKyjxYBcrIXAQorWCHYG/RZsAMQshwBCitYIdgb9FmwAxCwH9AwMQEGBCMgABE1NBIkMzIAFyMmJiMiAgchFSEVFBIzMjY3BNwb/uHu/v7+yY8BC7DoARgXwBmnl7nOAgI6/cbGsqCrHAHO5/sBcgE2i8kBNaf+/eWsnv7x6p0C7f7okbQAAgAxAAAIOwWwABgAIQB0sgkiIxESObAJELAZ0ACwAEVYsAAvG7EAHD5ZsABFWLAILxuxCBA+WbAARViwEC8bsRAQPlmyAQAIERI5sAEvsAAQsgoBCitYIdgb9FmwEBCyEgEKK1gh2Bv0WbABELIZAQorWCHYG/RZsBIQsBrQsBvQMDEBESEWBBUUBAchESEDAgIGByM1Nz4CNxMBESEyNjU0JicE7gFp3gEG/v7e/dP+ABoPWayQPyhdZDQLHgN3AV+Mop2KBbD9ywPwy8bzBAUS/b/+3v7ciQKdAgdr6vMCwv0t/cCehICcAgACALEAAAhNBbAAEgAbAIKyARwdERI5sAEQsBPQALAARViwEi8bsRIcPlmwAEVYsAIvG7ECHD5ZsABFWLAPLxuxDxA+WbAARViwDC8bsQwQPlmyAAIPERI5sAAvsgQMAhESObAEL7AAELIOAQorWCHYG/RZsAQQshMBCitYIdgb9FmwDBCyFAEKK1gh2Bv0WTAxASERMxEhFgQVFAQHIREhESMRMwERITI2NTQmJwFyAs7AAWriAQH+/9/90/0ywcEDjgFfjqCYigM5Anf9ngPivb/pBAKc/WQFsP0B/fWOenSMAwABAD4AAAXUBbAAFQBdsg4WFxESOQCwAEVYsBQvG7EUHD5ZsABFWLAILxuxCBA+WbAARViwEC8bsRAQPlmwFBCyAAEKK1gh2Bv0WbIEFAgREjmwBC+yDQEKK1gh2Bv0WbAAELAS0LAT0DAxASERNjMyFhcRIxEmJiMiBxEjESE1IQSm/fCgr/ryA8EBiaSppsD+aARoBRL+UCja3f4tAc6Yhir9PgUSngABALD+mQT/BbAACwBIALAJL7AARViwAC8bsQAcPlmwAEVYsAQvG7EEHD5ZsABFWLAGLxuxBhA+WbAARViwCi8bsQoQPlmyAgEKK1gh2Bv0WbAD0DAxEzMRIREzESERIxEhsMECzsD+QMH+MgWw+u0FE/pQ/pkBZwACAKIAAASxBbAADAAVAFuyDxYXERI5sA8QsAPQALAARViwCy8bsQscPlmwAEVYsAkvG7EJED5ZsAsQsgABCitYIdgb9FmyAgsJERI5sAIvsg0BCitYIdgb9FmwCRCyDgEKK1gh2Bv0WTAxASERIRYEFRQEByERIQERITI2NTQmJwQh/UIBauQBAP7+3/3SA3/9QgFfj5+ZjQUS/kwD5MTF6gQFsP0Q/d2YgHuOAgACADL+mgXJBbAADgAVAFuyEhYXERI5sBIQsAvQALAEL7AARViwCy8bsQscPlmwAEVYsAIvG7ECED5ZsAQQsAHQsAIQsgYBCitYIdgb9FmwDdCwDtCwD9CwENCwCxCyEQEKK1gh2Bv0WTAxASMRIREjAzM2EjcTIREzISERIQMGAgXHv/vrwAF3Xm8OIANnvvu7Asb+ExUNa/6bAWX+mgIDagFl1QJv+u0Edf5U+/6eAAEAGwAABzUFsAAVAIYAsABFWLAJLxuxCRw+WbAARViwDS8bsQ0cPlmwAEVYsBEvG7ERHD5ZsABFWLACLxuxAhA+WbAARViwBi8bsQYQPlmwAEVYsBQvG7EUED5ZsAIQsBDQsBAvsi8QAV2yzxABXbIAAQorWCHYG/RZsATQsggQABESObAQELAL0LITABAREjkwMQEjESMRIwEjAQEzATMRMxEzATMBASMEqJzApf5k8AHq/jzjAYOlwJ4Bg+L+PAHq7wKY/WgCmP1oAwACsP2IAnj9iAJ4/VH8/wABAFD/7ARqBcQAKABysgMpKhESOQCwAEVYsAsvG7ELHD5ZsABFWLAWLxuxFhA+WbALELIDAQorWCHYG/RZsAsQsAbQsiUWCxESObAlL7LPJQFdsp8lAXGyJAEKK1gh2Bv0WbIRJCUREjmwFhCwG9CwFhCyHgEKK1gh2Bv0WTAxATQmIyIGFSM0NjYzMgQVFAYHBBUUBCMiJiY1MxQWMzI2NRAlIzUzNjYDlKmZgK3Af+SK9AEOfG8BAf7c9JHthMC2jJ27/sO0s5KWBCl0iY1odLhn28NlpjBW/8TmZ76Dc5mSeAEABZ4DfgABALEAAAT/BbAACQBdALAARViwAC8bsQAcPlmwAEVYsAcvG7EHHD5ZsABFWLACLxuxAhA+WbAARViwBS8bsQUQPlmyBAACERI5QAmKBJoEqgS6BARdsgkAAhESOUAJhQmVCaUJtQkEXTAxATMRIxEBIxEzEQQ/wMD9M8HBBbD6UARi+54FsPueAAABAC8AAAT2BbAAEQBNsgQSExESOQCwAEVYsAAvG7EAHD5ZsABFWLABLxuxARA+WbAARViwCS8bsQkQPlmwABCyAwEKK1gh2Bv0WbAJELILAQorWCHYG/RZMDEBESMRIQMCAgYHIzU3PgI3EwT2wP32Gg9ZrJA/KF1kNAseBbD6UAUS/b/+3v7ciQKdAgdr6vMCwgAAAQBN/+sEywWwABEASrIEEhMREjkAsABFWLABLxuxARw+WbAARViwEC8bsRAcPlmwAEVYsAcvG7EHED5ZsgABBxESObILAQorWCHYG/RZsg8HEBESOTAxAQEzAQ4CIyInNxcyPwIBMwKdAU/f/f00WnlbTxYGW2kzGSb+ENcCYwNN+0N0YTMJmARlNFkENgAAAwBT/8QF4wXsABgAIQAqAFuyDCssERI5sAwQsCDQsAwQsCLQALALL7AXL7IVFwsREjmwFS+wANCyCQsXERI5sAkvsA3QsBUQshkBCitYIdgb9FmwCRCyJAEKK1gh2Bv0WbAf0LAZELAi0DAxATMWBBIVFAIEByMVIzUjIiQCEBIkMzM1MwMiBhUUFjMzETMRMzI2NTQmIwN4H6UBEJeY/vSkI7ocp/7vl5cBEaccuta829q/Grocv9fXwwUeAZj+9aWm/vKXAsTEmAEMAU4BDJjO/pvnzc7lA2f8mevKyOoAAAEAr/6hBZcFsAALADsAsAkvsABFWLAALxuxABw+WbAARViwBC8bsQQcPlmwAEVYsAovG7EKED5ZsgIBCitYIdgb9FmwBtAwMRMzESERMxEzAyMRIa/BAs7AmRKt+9cFsPrtBRP68f4AAV8AAAEAlgAABMgFsAASAEayBRMUERI5ALAARViwAC8bsQAcPlmwAEVYsAovG7EKHD5ZsABFWLABLxuxARA+WbIPAAEREjmwDy+yBgEKK1gh2Bv0WTAxAREjEQYGIyImJxEzERYWMzI3EQTIwWmsbvnyA8EBiaO+xQWw+lACWx4X2N8B0/4ymIY2ArYAAAEAsAAABtcFsAALAEgAsABFWLAALxuxABw+WbAARViwAy8bsQMcPlmwAEVYsAcvG7EHHD5ZsABFWLAJLxuxCRA+WbIBAQorWCHYG/RZsAXQsAbQMDEBESERMxEhETMRIREBcQH1vwHywPnZBbD67QUT+u0FE/pQBbAAAQCw/qEHagWwAA8AVACwCy+wAEVYsAAvG7EAHD5ZsABFWLADLxuxAxw+WbAARViwBy8bsQccPlmwAEVYsA0vG7ENED5ZsgEBCitYIdgb9FmwBdCwBtCwCdCwCtCwAtAwMQERIREzESERMxEzAyMRIREBcQH1vwHywJMSpfn9BbD67QUT+u0FE/rn/goBXwWwAAACABAAAAW4BbAADAAVAF6yARYXERI5sAEQsA3QALAARViwAC8bsQAcPlmwAEVYsAkvG7EJED5ZsgIACRESObACL7AAELILAQorWCHYG/RZsAIQsg0BCitYIdgb9FmwCRCyDgEKK1gh2Bv0WTAxEyERITIEFRQEByERIQERITI2NTQmJxACWwFa7wEE/v7i/db+ZgJbAV+On5mMBbD9ruXGxesDBRj9qP3dmIB7jgIAAAMAsgAABjAFsAAKABMAFwBtshIYGRESObASELAG0LASELAV0ACwAEVYsAkvG7EJHD5ZsABFWLAWLxuxFhw+WbAARViwBy8bsQcQPlmwAEVYsBQvG7EUED5ZsgAJBxESObAAL7ILAQorWCHYG/RZsAcQsgwBCitYIdgb9FkwMQEhFgQVFAQHIREzEREhMjY1NCYnASMRMwFyAWrkAQD+/t/908ABX4+fmY0DV8DAA14D5MTF6gQFsP0Q/d2YgHuOAv1ABbAAAAIAowAABLEFsAAKABMATbINFBUREjmwDRCwAdAAsABFWLAJLxuxCRw+WbAARViwBy8bsQcQPlmyAAkHERI5sAAvsgsBCitYIdgb9FmwBxCyDAEKK1gh2Bv0WTAxASEWBBUUBAchETMRESEyNjU0JicBYwFq5AEA/v7f/dPAAV+Pn5mNA14D5MTF6gQFsP0Q/d2YgHuOAgAAAQCT/+wE9AXEAB8Aj7IMICEREjkAsABFWLATLxuxExw+WbAARViwHC8bsRwQPlmwANCwHBCyAwEKK1gh2Bv0WbIIHBMREjmwCC+07wj/CAJxss8IAV2yLwgBcbS/CM8IAnGynwgBcbL/CAFdsi8IAV2yXwgBcrKPCAFysgYBCitYIdgb9FmwExCyDAEKK1gh2Bv0WbATELAP0DAxARYWMzISNyE1ITQCIyIGByM2ADMyBBIVFRQCBCMiJCcBVByroK3JAv3DAj3PupanGcEXARjosAELj47+/aju/uEbAc60kQEO8J7tARScruUBA6f+y8mRyf7MpfvnAAIAt//sBtoFxAAXACUAobIhJicREjmwIRCwEtAAsABFWLATLxuxExw+WbAARViwDS8bsQ0cPlmwAEVYsAQvG7EEED5ZsABFWLAKLxuxChA+WbIPCg0REjmwDy+yXw8BXbL/DwFdtE8PXw8CcbSPD58PAnGyLw8BcbLPDwFdsi8PAV2yzw8BcbIIAQorWCHYG/RZsBMQshsBCitYIdgb9FmwBBCyIgEKK1gh2Bv0WTAxARQCBCMiJAInIxEjETMRMzYSJDMyBBIVJxACIyICBxUUEjMyEjcG2pD++LCm/vmVCNHAwNADkAEKrK8BC5C/0Lu20QPTubrMAwKp1v7BqKABKsf9gwWw/WTOATerqf6/1QIBAwEV/uv2a/v+4QEP/QAAAgBZAAAEZAWwAAwAFQBhshAWFxESObAQELAK0ACwAEVYsAovG7EKHD5ZsABFWLAALxuxABA+WbAARViwAy8bsQMQPlmyEQoAERI5sBEvsgEBCitYIdgb9FmyBQEKERI5sAoQshIBCitYIdgb9FkwMSERIQEjASQRNCQzIREBFBYXIREhIgYDo/6w/tPNAVL+5gER8wHP/O2lkwEa/u+cpQI3/ckCbG8BHtDn+lAD+YSgAQI+lAACAGH/7AQoBhEAGwAoAGKyHCkqERI5sBwQsAjQALAARViwEi8bsRIePlmwAEVYsAgvG7EIED5ZsgASCBESObAAL7IXABIREjmyDxIXERI5shoACBESObIcAQorWCHYG/RZsAgQsiMBCitYIdgb9FkwMQEyEhUVFAYGIyIANTUQEjc2NjUzFAYHBwYGBzYXIgYVFRQWMzI2NTQmAmfM9XbdkNr+9v33jGKYcXyKpaUZk6+IoKGJiqChA/z+798RmfGFASP1WgFVAZIsGUg/fYwdHye5mqqYt6IQrsvMxJm5AAMAnQAABCkEOgAOABYAHACOshgdHhESObAYELAC0LAYELAW0ACwAEVYsAEvG7EBGD5ZsABFWLAALxuxABA+WbIXAQAREjmwFy+0vxfPFwJdtJ8XrxcCcbL/FwFdsg8XAXG0Lxc/FwJdtG8XfxcCcrIPAQorWCHYG/RZsggPFxESObAAELIQAQorWCHYG/RZsAEQshsBCitYIdgb9FkwMTMRITIWFRQGBxYWFRQGIwERITI2NTQjJTMgECcjnQGm2OdaWGJ328j+0AEydHPu/tXvAQT2/QQ6l5JLeSAXhl2VngHb/rpWTqKUATAFAAABAJoAAANHBDoABQArALAARViwBC8bsQQYPlmwAEVYsAIvG7ECED5ZsAQQsgABCitYIdgb9FkwMQEhESMRIQNH/g26Aq0DofxfBDoAAgAu/sIEkwQ6AA4AFABbshIVFhESObASELAE0ACwDC+wAEVYsAQvG7EEGD5ZsABFWLAKLxuxChA+WbIAAQorWCHYG/RZsAbQsAfQsAwQsAnQsAcQsA/QsBDQsAQQshEBCitYIdgb9FkwMTc3NhMTIREzESMRIREjEyEhESEDAoNAbA8RArmLuf0NuQEBLwHx/rMLEZdPjAEYAbD8Xf4rAT7+wgHVAvj+/v69AAEAFQAABgQEOgAVAJAAsABFWLAJLxuxCRg+WbAARViwDS8bsQ0YPlmwAEVYsBEvG7ERGD5ZsABFWLACLxuxAhA+WbAARViwBi8bsQYQPlmwAEVYsBQvG7EUED5ZsAIQsBDQsBAvsr8QAV2y/xABXbIvEAFdss8QAXGyAAEKK1gh2Bv0WbAE0LIIEAAREjmwEBCwC9CyEwAQERI5MDEBIxEjESMBIwEBMwEzETMRMwEzAQEjA+uCuYL+0eoBg/6i4AEXf7l+ARng/qEBg+oB1v4qAdb+KgIwAgr+QAHA/kABwP31/dEAAQBY/+0DrARNACYAhrIDJygREjkAsABFWLAKLxuxChg+WbAARViwFS8bsRUQPlmwChCyAwEKK1gh2Bv0WbIlChUREjmwJS+0LyU/JQJdtL8lzyUCXbSfJa8lAnG0byV/JQJysgYlChESObIiAQorWCHYG/RZshAiJRESObIZFQoREjmwFRCyHAEKK1gh2Bv0WTAxATQmIyIGFSM0NjMyFhUUBgcWFRQGIyImNTMUFjMyNjU0JiMjNTM2At90ZWKDuOyxvtRYUb3mwLvzuI1paoJtc7nJvQMSTFlmRY20o5dJeiRAvJWut5xPcWJOW0+cBQABAJwAAAQBBDoACQBFALAARViwAC8bsQAYPlmwAEVYsAcvG7EHGD5ZsABFWLACLxuxAhA+WbAARViwBS8bsQUQPlmyBAcCERI5sgkHAhESOTAxATMRIxEBIxEzEQNIubn+Dbm5BDr7xgMV/OsEOvzqAAABAJwAAAQ/BDoADAB3ALAARViwBC8bsQQYPlmwAEVYsAgvG7EIGD5ZsABFWLACLxuxAhA+WbAARViwCy8bsQsQPlmwAhCwBtCwBi+ynwYBXbL/BgFdss8GAXGynwYBcbS/Bs8GAl2yLwYBXbJvBgFysgEBCitYIdgb9FmyCgEGERI5MDEBIxEjETMRMwEzAQEjAd2Hurp5AWzg/lQB0OsBzf4zBDr+NgHK/fj9zgABACwAAAQDBDoADwBNsgQQERESOQCwAEVYsAAvG7EAGD5ZsABFWLABLxuxARA+WbAARViwCC8bsQgQPlmwABCyAwEKK1gh2Bv0WbAIELIKAQorWCHYG/RZMDEBESMRIQMCBgcjNTc2NjcTBAO6/pAWEpekSjVaTgsUBDr7xgOh/mv+6fAFowQKvP4BzwAAAQCdAAAFUgQ6AAwAWQCwAEVYsAEvG7EBGD5ZsABFWLALLxuxCxg+WbAARViwAy8bsQMQPlmwAEVYsAYvG7EGED5ZsABFWLAJLxuxCRA+WbIACwMREjmyBQsDERI5sggLAxESOTAxJQEzESMRASMBESMRMwL7AXDnuf6igP6bufD1A0X7xgMT/O0DJPzcBDoAAQCcAAAEAAQ6AAsAigCwAEVYsAYvG7EGGD5ZsABFWLAKLxuxChg+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsAAQsAnQsAkvsm8JAV20vwnPCQJdsj8JAXG0zwnfCQJxsg8JAXK0nwmvCQJxsv8JAV2yDwkBcbKfCQFdsi8JAV20bwl/CQJysgIBCitYIdgb9FkwMSEjESERIxEzESERMwQAuf4PuroB8bkBzv4yBDr+KwHVAAEAnAAABAEEOgAHADgAsABFWLAGLxuxBhg+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsAYQsgIBCitYIdgb9FkwMSEjESERIxEhBAG5/g66A2UDofxfBDoAAQAoAAADsAQ6AAcAMQCwAEVYsAYvG7EGGD5ZsABFWLACLxuxAhA+WbAGELIAAQorWCHYG/RZsATQsAXQMDEBIREjESE1IQOw/pW5/pwDiAOk/FwDpJYAAAMAZP5gBWkGAAAaACUAMAB/sgcxMhESObAHELAg0LAHELAr0ACwBi+wAEVYsAMvG7EDGD5ZsABFWLAKLxuxChg+WbAARViwEy8bsRMSPlmwAEVYsBAvG7EQED5ZsABFWLAXLxuxFxA+WbAKELIeAQorWCHYG/RZsBAQsiMBCitYIdgb9FmwKdCwHhCwLtAwMRMQEjMyFxEzETYzMhIRFAIjIicRIxEGIyICNSU0JiMiBxEWMzI2JRQWMzI3ESYjIgZk0rdVQLlGXrjS0bdhRblCVbbRBEyMez8vLUN8ifxtgno6Lyo9eoQCCQEPATYdAc/+KyP+yv7c7/7mIP5VAagdARr1D8zhFPzxEcCytrwSAxER2gAAAQCc/r8EggQ6AAsAOwCwCC+wAEVYsAAvG7EAGD5ZsABFWLAELxuxBBg+WbAARViwCi8bsQoQPlmyAgEKK1gh2Bv0WbAG0DAxEzMRIREzETMDIxEhnLoB8rmBEqb80gQ6/F0Do/xd/igBQQAAAQBnAAADvQQ7ABAARrIEERIREjkAsABFWLAILxuxCBg+WbAARViwDy8bsQ8YPlmwAEVYsAAvG7EAED5ZsgwPABESObAML7IEAQorWCHYG/RZMDEhIxEGIyImJxEzERYzMjcRMwO9unqAy9UCuQXkgHq6AYgg0MABQ/638iACGgABAJwAAAXgBDoACwBIALAARViwAC8bsQAYPlmwAEVYsAMvG7EDGD5ZsABFWLAHLxuxBxg+WbAARViwCS8bsQkQPlmyAQEKK1gh2Bv0WbAF0LAG0DAxAREhETMRIREzESERAVYBjLkBi7r6vAQ6/F0Do/xdA6P7xgQ6AAEAkf6/Bm0EOgAPAEsAsAwvsABFWLAALxuxABg+WbAARViwAy8bsQMYPlmwAEVYsAcvG7EHGD5ZsABFWLANLxuxDRA+WbIBAQorWCHYG/RZsAXQsAnQMDEBESERMxEhETMRMwMjESERAUsBjLkBi7qYEqb63AQ6/F0Do/xdA6P8Xf4oAUEEOgACAB4AAAS/BDoADAAVAF6yARYXERI5sAEQsA3QALAARViwAC8bsQAYPlmwAEVYsAkvG7EJED5ZsgIACRESObACL7AAELILAQorWCHYG/RZsAIQsg0BCitYIdgb9FmwCRCyDgEKK1gh2Bv0WTAxEyERIRYWFRQGIyERIQERITI2NTQmJx4B+gEZuNbcuv42/r8B+gETaHJvZAQ6/osCvKGixAOi/oz+aWtdWnMCAAADAJ0AAAV/BDoACgAOABcAbbIGGBkREjmwBhCwDNCwBhCwE9AAsABFWLAJLxuxCRg+WbAARViwDS8bsQ0YPlmwAEVYsAcvG7EHED5ZsABFWLALLxuxCxA+WbIADQcREjmwAC+yDwEKK1gh2Bv0WbAHELIQAQorWCHYG/RZMDEBIRYWFRQGIyERMwEjETMBESEyNjU0JicBVgEZuNbcuv42uQQpurr71wETaHJvZALFAryhosQEOvvGBDr99P5pa11acwIAAgCdAAAD/QQ6AAoAEwBNsgcUFRESObAHELAN0ACwAEVYsAkvG7EJGD5ZsABFWLAHLxuxBxA+WbIACQcREjmwAC+yCwEKK1gh2Bv0WbAHELIMAQorWCHYG/RZMDEBIRYWFRQGIyERMxERITI2NTQmJwFWARm41ty6/ja5ARNocm9kAsUCvKGixAQ6/fT+aWtdWnMCAAEAZP/sA+AETgAfAIKyACAhERI5ALAARViwCC8bsQgYPlmwAEVYsBAvG7EQED5ZsAgQsgABCitYIdgb9FmyHQgQERI5sB0vtC8dPx0CXbS/Hc8dAl20nx2vHQJxtG8dfx0CcrIDCB0REjmyFBAIERI5sBAQshcBCitYIdgb9FmwHRCyGgEKK1gh2Bv0WTAxASIGFSM0NjYzMgAVFRQGBiMiJjUzFBYzMjY3ITUhJiYCCGORsHbEatMBBXfXirTwsI5md5oM/moBlA6WA7Z+Vl2qZf7P9h+Y+4ngp2aLuKGYkrEAAAIAnf/sBjAETgAUAB8AnbINICEREjmwDRCwFdAAsABFWLAULxuxFBg+WbAARViwBC8bsQQYPlmwAEVYsBEvG7ERED5ZsABFWLAMLxuxDBA+WbIAERQREjmwAC+0vwDPAAJdtJ8ArwACcbL/AAFdsg8AAXG0LwA/AAJdtl8AbwB/AANyshABCitYIdgb9FmwDBCyGAEKK1gh2Bv0WbAEELIdAQorWCHYG/RZMDEBITYAMzIAFxcUBgYjIgAnIREjETMBFBYgNjU0JiMiBgFWAQQVAQnK1AEOCwF84JDR/vYQ/v25uQG6pwEapaiMiqgCb9gBB/7i5Tqe/okBEdr+KQQ6/de02t7Gsd7aAAACAC8AAAPHBDoADQAWAGGyFBcYERI5sBQQsA3QALAARViwAC8bsQAYPlmwAEVYsAEvG7EBED5ZsABFWLAFLxuxBRA+WbISAAEREjmwEi+yAwEKK1gh2Bv0WbIHAwAREjmwABCyEwEKK1gh2Bv0WTAxAREjESEDIwEmJjU0NjcDFBYXIREhIgYDx7r+6f/IARBob9663mxZASb+9md6BDr7xgGl/lsBwSafapS1Af60T2EBAWdlAAH/6P5LA98GAAAiAISyDSMkERI5ALAfL7AARViwBC8bsQQYPlmwAEVYsBkvG7EZED5ZsABFWLAKLxuxChI+WbK/HwFdsi8fAV2yDx8BXbIeGR8REjmwHi+wIdCyAQEKK1gh2Bv0WbICGQQREjmwChCyDwEKK1gh2Bv0WbAEELIVAQorWCHYG/RZsAEQsBvQMDEBIRE2MyATERQGIyInNxYyNjURNCYjIgYHESMRIzUzNTMVIQJj/uJ7xQFXA6qYPTYPI4JIaXBaiCa5pKS5AR4Euf7+l/59/NyqshKTDWhcAyB4cmBO/P0EuZivrwABAGf/7AP3BE4AHwCcsgAgIRESOQCwAEVYsBAvG7EQGD5ZsABFWLAILxuxCBA+WbIAAQorWCHYG/RZsgMIEBESObIbEAgREjmwGy+0DxsfGwJytL8bzxsCXbSfG68bAnG0zxvfGwJxsv8bAV2yDxsBcbQvGz8bAl20bxt/GwJysr8bAXKyFBAbERI5sBAQshcBCitYIdgb9FmwGxCyHAEKK1gh2Bv0WTAxJTI2NzMOAiMiABE1NDY2MzIWFyMmJiMiBgchFSEWFgJIY5QIsAV4xG7e/v112JS28QiwCI9ogpoKAZT+bAqZg3haXqhjASgBAB6f94barmmHsZ2YoK0AAgAnAAAGhgQ6ABYAHwB5sgkgIRESObAJELAX0ACwAEVYsAAvG7EAGD5ZsABFWLAILxuxCBA+WbAARViwDy8bsQ8QPlmyAQAIERI5sAEvsAAQsgoBCitYIdgb9FmwDxCyEQEKK1gh2Bv0WbABELIXAQorWCHYG/RZsAgQshgBCitYIdgb9FkwMQERIRYWFRQGByERIQMCBgcjNTc2NjcTAREhMjY1NCYnA98BHrbT07f+Kf6vFxScpUE2VU0NFwK8ARNldXJjBDr+ZAO1lJO8AwOh/lr+6+QCowQKp9MCD/3M/o9pVlFgAQAAAgCcAAAGpwQ6ABIAGwB7sgEcHRESObABELAT0ACwAEVYsAIvG7ECGD5ZsABFWLARLxuxERg+WbAARViwCy8bsQsQPlmwAEVYsA8vG7EPED5ZsgERCxESObABL7AE0LABELINAQorWCHYG/RZsAQQshMBCitYIdgb9FmwCxCyFAEKK1gh2Bv0WTAxASERMxEhFhYVFAYjIREhESMRMwERITI2NTQmJwFWAfG5ASK00dm9/jb+D7q6AqoBE2V1cmMCoQGZ/mMEsZaXuwIK/fYEOv3M/o9pVlFgAQAB//0AAAPfBgAAGQB5sgwaGxESOQCwFi+wAEVYsAQvG7EEGD5ZsABFWLAHLxuxBxA+WbAARViwEC8bsRAQPlmyvxYBXbIvFgFdsg8WAV2yGRAWERI5sBkvsgABCitYIdgb9FmyAgQHERI5sAQQsgwBCitYIdgb9FmwABCwEtCwGRCwFNAwMQEhETYzIBMRIxEmJiMiBgcRIxEjNTM1MxUhAnn+zHvFAVcDuQFpb1qIJrmPj7kBNAS+/vmX/n39NQLMdXBgTvz9BL6Xq6sAAAEAnP6cBAEEOgALAEUAsAgvsABFWLAALxuxABg+WbAARViwAy8bsQMYPlmwAEVYsAUvG7EFED5ZsABFWLAJLxuxCRA+WbIBAQorWCHYG/RZMDEBESERMxEhESMRIREBVgHyuf6tuf6nBDr8XQOj+8b+nAFkBDoAAAEAnP/sBnUFsAAgAGCyByEiERI5ALAARViwAC8bsQAcPlmwAEVYsA4vG7EOHD5ZsABFWLAXLxuxFxw+WbAARViwBC8bsQQQPlmwAEVYsAovG7EKED5ZsgcABBESObITAQorWCHYG/RZsBzQMDEBERQGIyImJwYGIyImJxEzERQWMzI2NREzERQWMzI2NREGdeHDbasxNLJxvdcBwXJicoLHfGlqegWw+97G3FdZWVfbwwQm+917iol8BCP73X2IiX0EIgABAIH/6wWtBDoAHgBgsgYfIBESOQCwAEVYsAAvG7EAGD5ZsABFWLAMLxuxDBg+WbAARViwFS8bsRUYPlmwAEVYsAQvG7EEED5ZsABFWLAILxuxCBA+WbIGFQQREjmyEQEKK1gh2Bv0WbAa0DAxAREUBiMiJwYjIiYnETMRFhYzMjY1ETMRFBYzMjY3EQWtyq7GWV/Op8ABuQFbU2JvumVcWWUBBDr9J7DGlJTDsALc/SNmdXhnAtn9J2d4dWYC3QAC/9wAAAP8BhYAEQAaAHGyFBscERI5sBQQsAPQALAARViwDi8bsQ4ePlmwAEVYsAgvG7EIED5ZshEOCBESObARL7IAAQorWCHYG/RZsgIOCBESObACL7AAELAK0LARELAM0LACELISAQorWCHYG/RZsAgQshMBCitYIdgb9FkwMQEhESEWFhAGByERIzUzETMRIQERITI2NTQmJwKW/r8BGLvU1Lf+Kr+/ugFB/r8BEmlxb2QEOv6wAsr+ttEDBDqXAUX+u/2B/kV3ZGF9AgAAAQC3/+0GoAXFACYAh7IeJygREjkAsABFWLAFLxuxBRw+WbAARViwJi8bsSYcPlmwAEVYsB0vG7EdED5ZsABFWLAjLxuxIxA+WbIQBR0REjmwEC+wANCwBRCwCdCwBRCyDAEKK1gh2Bv0WbAQELIRAQorWCHYG/RZsB0QshYBCitYIdgb9FmwHRCwGdCwERCwIdAwMQEzNhIkMzIAFyMmJiMiAgchFSEVFBIzMjY3MwYEIyAAETUjESMRMwF4xwWTAQas5gEZGMAZp5e0zwYCHv3ixrKjqRzAG/7h7v7+/snHwcEDQMEBJp7/AOisnv774pca7f7ok7Ln+wFyATYU/VcFsAABAJn/7AWhBE4AJADEsgMlJhESOQCwAEVYsAQvG7EEGD5ZsABFWLAkLxuxJBg+WbAARViwIS8bsSEQPlmwAEVYsBwvG7EcED5Zsg8cBBESObAPL7S/D88PAl20Pw9PDwJxtM8P3w8CcbQPDx8PAnK0nw+vDwJxsv8PAV2yDw8BcbQvDz8PAl20bw9/DwJysADQsggPBBESObAEELILAQorWCHYG/RZsA8QshABCitYIdgb9FmwHBCyFAEKK1gh2Bv0WbIXHAQREjmwEBCwH9AwMQEzNhIzMhYXIyYmIyIGByEVIRYWMzI2NzMOAiMiAicjESMRMwFTvxD/0bbxCLAIj2iEmAoBtf5LCpmDY5QIsAV4xG7R/hDAuroCZ98BCNquaYexnpegrXhaXqhjAQbe/jAEOgAAAgAoAAAE5AWwAAsADgBWALAARViwCC8bsQgcPlmwAEVYsAIvG7ECED5ZsABFWLAGLxuxBhA+WbAARViwCi8bsQoQPlmyDQgCERI5sA0vsgABCitYIdgb9FmwBNCyDggCERI5MDEBIxEjESMDIwEzASMBIQMDiaq8npjFAg2rAgTF/Z8Bk8cBtv5KAbb+SgWw+lACWgJJAAACAA8AAAQlBDoACwAQAFYAsABFWLAILxuxCBg+WbAARViwAi8bsQIQPlmwAEVYsAYvG7EGED5ZsABFWLAKLxuxChA+WbINAggREjmwDS+yAQEKK1gh2Bv0WbAE0LIPCAIREjkwMQEjESMRIwMjATMBIwEhAycHAu11uXx3vQG6nwG9vv4ZAS+AGBgBKf7XASn+1wQ6+8YBwQE7WVkAAAIAyQAABvUFsAATABYAfACwAEVYsAIvG7ECHD5ZsABFWLASLxuxEhw+WbAARViwBC8bsQQQPlmwAEVYsAgvG7EIED5ZsABFWLAMLxuxDBA+WbAARViwEC8bsRAQPlmyFQIEERI5sBUvsADQsBUQsgYBCitYIdgb9FmwCtCwBhCwDtCyFgIEERI5MDEBIQEzASMDIxEjESMDIxMhESMRMwEhAwGKAYcBNasCBMWWqryemMWe/rPBwQJFAZPHAlkDV/pQAbb+SgG2/koBuP5IBbD8qgJJAAACALwAAAXkBDoAEwAYAH8AsABFWLACLxuxAhg+WbAARViwEi8bsRIYPlmwAEVYsAQvG7EEED5ZsABFWLAILxuxCBA+WbAARViwDC8bsQwQPlmwAEVYsBAvG7EQED5ZsgAQEhESObAAL7AB0LIOAQorWCHYG/RZsAvQsAfQsAEQsBTQsBXQshcSBBESOTAxASEBMwEjAyMRIxEjAyMTIxEjETMBIQMnBwF2AQ8BA58Bvb56dbl8d7150bq6AckBL4AYGAHBAnn7xgEp/tcBKf7XASj+2AQ6/YcBO1lZAAACAJMAAAY/BbAAHQAhAHayHiIjERI5sB4QsA7QALAARViwHC8bsRwcPlmwAEVYsAUvG7EFED5ZsABFWLANLxuxDRA+WbAARViwFS8bsRUQPlmyAQ0cERI5sAEvsgoBCitYIdgb9FmwENCwARCwGtCwARCwHtCwHBCyIAEKK1gh2Bv0WTAxATMyFhcRIxEmJicjBxEjEScjIgYHESMRNjYzMwEhATMBIQRBG/TsA8EBfJqFFcENiJ6CBMAD7PMq/ngEsv2fEAEa/bsDKtTY/oIBeJCCAiP9lwJ2FnuN/nwBftjUAob9egHoAAACAJYAAAVLBDoAGwAfAHOyHCAhERI5sBwQsBTQALAARViwBi8bsQYYPlmwAEVYsBsvG7EbED5ZsABFWLAULxuxFBA+WbAARViwDC8bsQwQPlmyHBQGERI5sBwvsATQsBwQsAfQshABCitYIdgb9FmwF9CwBhCyHgEKK1gh2Bv0WTAxMzU2NjcBIQEWFhcVIzUmJiMjBxEjEScjIgYHFQEzEyGWBMrS/uEDv/7gzsUCugJzjDULuQY+jHUCAaIIt/6Lts3SBgHf/iEL09CtsZKBE/5PAbsJfpWxAlwBRgACALYAAAhyBbAAIgAmAJOyJicoERI5sCYQsB7QALAARViwCC8bsQgcPlmwAEVYsAsvG7ELHD5ZsABFWLAFLxuxBRA+WbAARViwIi8bsSIQPlmwAEVYsBsvG7EbED5ZsABFWLATLxuxExA+WbIJBQgREjmwCS+yBAEKK1gh2Bv0WbAJELAj0LAN0LAEELAe0LAY0LALELImAQorWCHYG/RZMDEhETY3IREjETMRIQEhATMyFhcRIxEmJicjBxEjEScjIgYHEQEzASECxQFP/mLBwQNZ/nkEs/54G/TsA8EBfJqFFsAOh56CBAIVEAEa/bsBeLNp/WwFsP18AoT9etTY/oIBeJCCAiX9mQJ1F3uN/nwDKgHoAAIAmwAABzsEOgAhACUAlrIeJicREjmwHhCwJdAAsABFWLAHLxuxBxg+WbAARViwCy8bsQsYPlmwAEVYsAAvG7EAED5ZsABFWLAFLxuxBRA+WbAARViwES8bsREQPlmwAEVYsBkvG7EZED5ZsgoLABESObAKL7IdAQorWCHYG/RZsAPQsAoQsA3QsB0QsBbQsAoQsCLQsAsQsiQBCitYIdgb9FkwMSE1NjchESMRMxEhASEBFhYXFSM1JiYjIwcRIxEnIwYGBxUBMxMhAoYCRv6HuroC0f7hA7/+4M7FAroCc4w1C7kGS4VvAgGiCLf+i6+taP48BDr+IgHe/iEL09CtsZKBE/5PAbsJAoCTrwJcAUYAAAIAUP5GA6oHhgApADIAh7IqMzQREjmwKhCwAtAAsBkvsC4vsABFWLAFLxuxBRw+WbAARViwEi8bsRIQPlmwBRCyAwEKK1gh2Bv0WbIoBRIREjmwKC+yJQEKK1gh2Bv0WbIMJSgREjmwEhCyHwEKK1gh2Bv0WbIPLgFdsC4QsCvQsCsvtA8rHysCXbIqLisREjmwMtAwMQE0JiMhNSEyBBUUBgcWFhUUBCMjBhUUFxcHJiY1NDY3MzY2NRAlIzUzIAM3MxUDIwM1MwLanYf+zgEr3gEGgXOCif734DSNgh9Keo2lojSGn/6+mYYBP7yXoP5y+p0EKm6AmNiyZ6QtKa2CxOUDbWlCD301qGN6gwEBlHkBCAWYA6WqCv7uARIKAAIATP5GA3YGMAApADIAnrIuMzQREjmwLhCwH9AAsBgvsC4vsABFWLAFLxuxBRg+WbAARViwES8bsREQPlmwBRCyAwEKK1gh2Bv0WbIoBREREjmwKC+0Lyg/KAJdtL8ozygCXbSfKK8oAnG0byh/KAJysiUBCitYIdgb9FmyDCUoERI5sBEQsh4BCitYIdgb9FmwLhCwK9CwKy+0DysfKwJdsiouKxESObAy0DAxATQmJyE1ITIWFRQGBxYVFAYjIwYVFBcXByYmNTQ2NzM2NzY1NCUjNTMgAzczFQMjAzUzAqd/cP7JASfK7mZb1/PIMo2CH0t8iqWiNnJDP/7omYgBE9qXoP5y+p0DCUNTApmqi0l3JEKvlK8DbWlCD303qGF6gwECMC5IogOYAx2qCv7uARIKAAADAGf/7AT6BcQAEQAYAB8AibIEICEREjmwBBCwEtCwBBCwGdAAsABFWLANLxuxDRw+WbAARViwBC8bsQQQPlmwDRCyEgEKK1gh2Bv0WbIWDQQREjmwFi+yLxYBXbLPFgFdsi8WAXGy/xYBXbJfFgFdtE8WXxYCcbKfFgFxsAQQshkBCitYIdgb9FmwFhCyHAEKK1gh2Bv0WTAxARQCBCMiJAInNTQSJDMyBBIXASICByEmAgMyEjchFhIE+o/++LGs/vaTApIBC6yvAQiRAv22ttAEAxQEzra2ygj87AjTAqnV/sKqqQE5zmnSAUKrqP7FzwIN/u3y+AEN+3ABAPTs/vgAAAMAW//sBDQETgAPABUAHACHsgQdHhESObAEELAT0LAEELAW0ACwAEVYsAQvG7EEGD5ZsABFWLAMLxuxDBA+WbIaDAQREjmwGi+0vxrPGgJdtJ8arxoCcbL/GgFdsg8aAXG0Lxo/GgJdtM8a3xoCcbIQAQorWCHYG/RZsAwQshQBCitYIdgb9FmwBBCyFgEKK1gh2Bv0WTAxEzQ2NjMyABcXFAYGIyIANQUhFhYgNgEiBgchJiZbe+GP1AEOCwF84JDe/vEDHP2fDaQBAqH+3H2iDwJeEqMCJ5/9i/7i5Tqe/okBM/tEm7i6Anm1k5exAAEAFgAABN0FwwAPAEayAhARERI5ALAARViwBi8bsQYcPlmwAEVYsA8vG7EPHD5ZsABFWLAMLxuxDBA+WbIBBgwREjmwBhCyCAEKK1gh2Bv0WTAxARc3ATY2MxcHIgYHASMBMwJDISMBCDOGZy4BQEAf/nyq/gfQAXaCgQM/l3gBqzxU+3kFsAABAC4AAAQLBE0AEQBGsgISExESOQCwAEVYsAUvG7EFGD5ZsABFWLARLxuxERg+WbAARViwDi8bsQ4QPlmyAQUOERI5sAUQsgoBCitYIdgb9FkwMQEXNxM2MzIXByYjIgYHASMBMwHbFxmdTaxHIxUNHR88EP7Xjf6DvQE8ZGQCH/IYlAgwLfy0BDoAAAIAZ/9zBPoGNAATACcAUrIFKCkREjmwBRCwGdAAsABFWLANLxuxDRw+WbAARViwAy8bsQMQPlmwBtCwDRCwENCyFwEKK1gh2Bv0WbAa0LADELIkAQorWCHYG/RZsCHQMDEBEAAHFSM1JgADNRAANzUzFRYAESc0AicVIzUGAhUVFBIXNTMVNhI1BPr+/uO55f7xAQEO57niAQO/mY25k6OkkrmPlwKp/t3+kSOBfx8BcQEjYAEkAXYfdngl/pD+2QfgAQkjYWQf/u7fXd7+7B9mZCIBC+IAAAIAW/+JBDQEtQATACUAWLIDJicREjmwAxCwHNAAsABFWLADLxuxAxg+WbAARViwEC8bsRAQPlmwAxCwBtCwEBCwDdCwEBCyIwEKK1gh2Bv0WbAU0LADELIdAQorWCHYG/RZsBrQMDETNBI3NTMVFhIVFRQCBxUjNSYCNQE2NjU0JicVIzUGBhUUFhc1M1vUubm62d22ubTZAkZjdnRluWJycWO5AifSASoicG8g/tjdENj+2B1rbB8BJ9z+eR/Nq5HQIGJhIdClkssiZgAAAwCc/+sGbwdRACwAQABJAKayCkpLERI5sAoQsDLQsAoQsEnQALAARViwFC8bsRQcPlmwAEVYsA0vG7ENED5ZsBQQsADQsA0QsAfQsgoNFBESObAUELIVAQorWCHYG/RZsA0QshwBCitYIdgb9FmyIBQNERI5sCXQsBUQsCzQsBQQsDjQsDgvsC/Qsi0CCitYIdgb9FmwLxCwNNCwNC+yPAIKK1gh2Bv0WbA4ELBE0LBJ0LBJLzAxATIWFREUBiMiJicGBiMiJicRNDYzFSIGFREUFjMyNjURMxEUFjMyNjURNCYjExUjIi4CIyIVFSM1NDYzMh4CATY3NTMVFAYHBNu72dm7cLI0NLBwudgE2L1jcXJicoLBgnNjcG9kaCtQgrg0GHGAf24oSL9q/kBCA51bOwWv8Nb9xtTwVVhYVejNAkrU8Z6dif3EjJuJfAGs/lR6i5yMAjqInwHCfyJQDHAPJG5sEVIb/pBQPGlmMnUgAAMAfv/rBaoF8QArAD8ASACssglJShESObAJELA80LAJELBI0ACwAEVYsBMvG7ETGD5ZsABFWLAMLxuxDBA+WbATELAA0LAMELAH0LIJDBMREjmwExCyFAEKK1gh2Bv0WbAMELIbAQorWCHYG/RZsh8TDBESObAk0LAUELAr0LATELA30LA3L7At0LAtL7IsAgorWCHYG/RZsC0QsDPQsDMvsjsCCitYIdgb9FmwNxCwQ9CwQy+wSNCwSC8wMQEyFhURFAYjIicGBiMiJicRNDYzFSIGFREUFjMyNjU1MxUWFjMyNjURNCYjExUjIi4CIyIVFSM1NDYzMh4CATY3NTMVFAYHBEKowMCo0F8vnGKjwQTAqFJdXFNib7kBcGFRXV1RqixPfsAwGHKAf28pSrdt/kFBA55bOwRE28L+38HalUtK0LsBMsHbmIh8/t57iXhn6+5ndYh9ASF8iAHHfyBSC28PJG5sElAc/oZOP2hmMnUgAAIAnP/sBnUHAwAgACgAgrIHKSoREjmwBxCwJ9AAsABFWLAPLxuxDxw+WbAARViwFy8bsRccPlmwAEVYsCAvG7EgHD5ZsABFWLAKLxuxChA+WbAE0LIHCg8REjmwChCyEwEKK1gh2Bv0WbAc0LAPELAn0LAnL7Ao0LAoL7IiBgorWCHYG/RZsCgQsCXQsCUvMDEBERQGIyImJwYGIyImJxEzERQWMzI2NREzERQWMzI2NRElNSEXIRUjNQZ14cNtqzE0snG91wHBcmJygsd8aWp6/EIDLAH+tagFsPvextxXWVlX28MEJvvde4qJfAQj+919iIl9BCLoa2t9fQAAAgCB/+sFrQWwAB4AJgCFsgYnKBESObAGELAj0ACwAEVYsA0vG7ENGD5ZsABFWLAVLxuxFRg+WbAARViwHi8bsR4YPlmwAEVYsAgvG7EIED5ZsATQsAQvsgYIDRESObAIELIRAQorWCHYG/RZsBrQsA0QsCXQsCUvsCbQsCYvsiAGCitYIdgb9FmwJhCwI9CwIy8wMQERFAYjIicGIyImJxEzERYWMzI2NREzERQWMzI2NxEBNSEXIRUjNQWtyq7GWV/Op8ABuQFbU2JvumVcWWUB/JMDLAP+s6kEOv0nsMaUlMOwAtz9I2Z1eGcC2f0nZ3h1ZgLdAQtra4CAAAABAHX+hAS8BcUAGQBJshgaGxESOQCwAC+wAEVYsAovG7EKHD5ZsABFWLACLxuxAhA+WbAKELAO0LAKELIRAQorWCHYG/RZsAIQshkBCitYIdgb9FkwMQEjESYANTU0EiQzMgAXIyYmIyICFRUUEhczAxS/2P74jgEAoPcBIALBArWhoM3FnXz+hAFsHAFW//SxASCf/vjgnqz+/NT0yv77BAABAGT+ggPgBE4AGQBJshgaGxESOQCwAC+wAEVYsAovG7EKGD5ZsABFWLACLxuxAhA+WbAKELAO0LAKELIRAQorWCHYG/RZsAIQshgBCitYIdgb9FkwMQEjESYCNTU0NjYzMhYVIzQmIyIGFRUUFhczAqK5sdR314uz8K+PZYScloJt/oIBcB4BJtkjmfmK4ahljNq1H6jbAwAAAQB0AAAEkAU+ABMAEwCwDi+wAEVYsAQvG7EEED5ZMDEBBQclAyMTJTcFEyU3BRMzAwUHJQJYASFE/t22qOH+30QBJc3+3kYBI7yl5wElSP7gAb6se6r+vwGOq3urAW2rfasBS/5oq3qqAAH8ZwSm/ycF/AAHABEAsAAvsgMGCitYIdgb9FkwMQEVJzchJxcV/Q2mAQIbAaUFI30B6WwB2AAAAfxxBRf/ZAYVABMALgCwDi+wCNCwCC+yAAIKK1gh2Bv0WbAOELAF0LAFL7AOELIPAgorWCHYG/RZMDEBMhYVFSM1NCMiBwcGByM1Mj4C/nZvf4ByKi1viXY8bGrBRwYVbG4kDnASLzoCfhtTEQAB/WYFFv5UBlcABQAMALABL7AF0LAFLzAxATUzFRcH/WazO00F3HuMdEEAAAH9pAUW/pMGVwAFAAwAsAMvsADQsAAvMDEBJzcnMxX98U07AbUFFkF0jHsACPob/sQBtgWvAAwAGgAnADUAQgBPAFwAagB6ALBFL7BTL7BgL7A4L7AARViwAi8bsQIcPlmyCQsKK1gh2Bv0WbBFELAQ0LBFELJMCworWCHYG/RZsBfQsFMQsB7QsFMQsloLCitYIdgb9FmwJdCwYBCwK9CwYBCyZwsKK1gh2Bv0WbAy0LA4ELI/CworWCHYG/RZMDEBNDYyFhUjNCYjIgYVATQ2MzIWFSM0JiMiBhUTNDYzMhYVIzQmIgYVATQ2MzIWFSM0JiMiBhUBNDYyFhUjNCYjIgYVATQ2MhYVIzQmIyIGFQE0NjMyFhUjNCYiBhUTNDYzMhYVIzQmIyIGFf0Ic750cDMwLjMB3nRdX3VxNS4sM0h1XV90cDVcM/7LdF1fdHA1Li0z/U9zvnRwMzAuM/1NdL50cDMwLjP+3nVdX3RwNVwzNXVdX3VxNS4tMwTzVGhoVC43NTD+61RoZ1UxNDUw/glVZ2hUMTQ3Lv35VGhoVDE0Ny7+5FRoaFQuNzcuBRpUaGhULjc1MP4JVWdoVDE0Ny79+VVnZ1UxNDUwAAj6LP5jAWsFxgAEAAkADgATABgAHQAiACcAOQCwIS+wEi+wCy+wGy+wJi+wAEVYsAcvG7EHHD5ZsABFWLAWLxuxFho+WbAARViwAi8bsQISPlkwMQUXAyMTAycTMwMBNwUVJQUHJTUFATclFwUBBwUnJQMnAzcTARcTBwP+Lwt6YEY6DHpgRgIdDQFN/qb7dQ3+swFaA5wCAUBE/tv88wL+wEUBJisRlEHGA2ARlELEPA7+rQFhBKIOAVL+oP4RDHxiRzsMfGJHAa4QmUTI/I4RmUXIAuQCAUZF/tX84wL+u0cBKwAAAv/cAAAD/AZxABEAGgB0shQbHBESObAUELAD0ACwAEVYsAwvG7EMHD5ZsABFWLAQLxuxEBw+WbAARViwCC8bsQgQPlmwEBCyAAEKK1gh2Bv0WbICDAgREjmwAi+wABCwCtCwC9CwAhCyEgEKK1gh2Bv0WbAIELITAQorWCHYG/RZMDEBIREhFhYQBgchESM1MzUzFSEBESEyNjU0JicClv6/ARi71NS3/iq/v7oBQf6/ARJpcW9kBRj90gLK/rbRAwUYmMHB/KL+RXdkYX0CAAIAqAAABNcFsAAOABsAVLIEHB0REjmwBBCwF9AAsABFWLADLxuxAxw+WbAARViwAS8bsQEQPlmyFgMBERI5sBYvsgABCitYIdgb9FmyCQADERI5sAMQshQBCitYIdgb9FkwMQERIxEhMgQVFAcXBycGIwE2NTQmJyERITI3JzcBacECGewBE2d+bYt2qAEZJaWR/qABWGJFbm4COv3GBbDyy7pwimeZNwEbQVuCnQL9xR15ZgAAAgCM/mAEIwROABMAIgB1shwjJBESObAcELAQ0ACwAEVYsBAvG7EQGD5ZsABFWLANLxuxDRg+WbAARViwCi8bsQoSPlmwAEVYsAcvG7EHED5ZsgIHEBESObIJEAcREjmyDhAHERI5sBAQshcBCitYIdgb9FmwBxCyHAEKK1gh2Bv0WTAxARQHFwcnBiMiJxEjETMXNjMyEhEnNCYjIgcRFjMyNyc3FzYEHmpvbm5Zc8VxuakJccnD47mciKhUU6tSPGZuWjICEe6XfWZ7OH399wXaeIz+2v76BLfUlf37lCdzZ2diAAABAKIAAAQjBwAACQA1sgMKCxESOQCwCC+wAEVYsAYvG7EGHD5ZsABFWLAELxuxBBA+WbAGELICAQorWCHYG/RZMDEBIxUhESMRIREzBCMD/ULAAsi5BRgG+u4FsAFQAAABAJEAAANCBXYABwAuALAGL7AARViwBC8bsQQYPlmwAEVYsAIvG7ECED5ZsAQQsgABCitYIdgb9FkwMQEhESMRIREzA0L+CboB+LkDofxfBDoBPAABALH+3wR8BbAAFQBbsgoWFxESOQCwCS+wAEVYsBQvG7EUHD5ZsABFWLASLxuxEhA+WbAUELIAAQorWCHYG/RZsgMUCRESObADL7AJELIKAQorWCHYG/RZsAMQshABCitYIdgb9FkwMQEhETMgABEQAiMnMjY1JiYjIxEjESEEMP1CsgEcATz15AKRkAHMzrXBA38FEv4v/s/+8P74/ueTw8vL1P1hBbAAAAEAkf7lA74EOgAWAFuyCxcYERI5ALAKL7AARViwFS8bsRUYPlmwAEVYsBMvG7ETED5ZsBUQsgABCitYIdgb9FmyAxUKERI5sAMvsAoQsgsBCitYIdgb9FmwAxCyEQEKK1gh2Bv0WTAxASERMzIAFRQGBgcnNjY1NCYjIxEjESEDPv4NbO8BGGKqdTCAeLKYcLoCrQOh/uT+/NdiyIYVkiGZeZGo/h0EOgAAAQCjAAAE/wWwABQAYgCwAEVYsAAvG7EAHD5ZsABFWLAMLxuxDBw+WbAARViwAi8bsQIQPlmwAEVYsAovG7EKED5ZsA/QsA8vsi8PAV2yzw8BXbIIAQorWCHYG/RZsgEIDxESObAF0LAPELAS0DAxCQIjASMVIzUjESMRMxEzETMRMwEE0v5wAb3x/qJQlGjBwWiUTQFDBbD9Tv0CAo709P1yBbD9fwEA/wACgQAAAQCaAAAEfwQ6ABQAewCwAEVYsA0vG7ENGD5ZsABFWLAULxuxFBg+WbAARViwCi8bsQoQPlmwAEVYsAMvG7EDED5ZsAoQsA7QsA4vsp8OAV2y/w4BXbKfDgFxtL8Ozw4CXbIvDgFdsm8OAXKyCQEKK1gh2Bv0WbIBCQ4REjmwBdCwDhCwEtAwMQkCIwEjFSM1IxEjETMRMzUzFTMBBFr+rgF36/7rMpRlurpllCoBAwQ6/f79yAHNwsL+MwQ6/jbV1QHKAAEARAAABosFsAAOAGsAsABFWLAGLxuxBhw+WbAARViwCi8bsQocPlmwAEVYsAIvG7ECED5ZsABFWLANLxuxDRA+WbIIBgIREjmwCC+yLwgBXbLPCAFdsgEBCitYIdgb9FmwBhCyBAEKK1gh2Bv0WbIMAQgREjkwMQEjESMRITUhETMBMwEBIwOQsMH+JQKclgH87/3UAlbsAo79cgUYmP1+AoL9P/0RAAEAPgAABX0EOgAOAIAAsABFWLAGLxuxBhg+WbAARViwCi8bsQoYPlmwAEVYsAIvG7ECED5ZsABFWLANLxuxDRA+WbACELAJ0LAJL7KfCQFdsv8JAV2ynwkBcbS/Cc8JAl2yLwkBXbJvCQFysgABCitYIdgb9FmwBhCyBAEKK1gh2Bv0WbIMAAkREjkwMQEjESMRITUhETMBMwEBIwMbiLr+ZQJVegFr4f5TAdHrAc3+MwOhmf42Acr9+P3OAAABAKgAAAeEBbAADQBeALAARViwAi8bsQIcPlmwAEVYsAwvG7EMHD5ZsABFWLAGLxuxBhA+WbAARViwCi8bsQoQPlmwAdCwAS+yLwEBXbACELIEAQorWCHYG/RZsAEQsggBCitYIdgb9FkwMQEhESEVIREjESERIxEzAWkC3gM9/YPA/SLBwQM+AnKY+ugCof1fBbAAAQCRAAAFaQQ6AA0AmwCwAEVYsAIvG7ECGD5ZsABFWLAMLxuxDBg+WbAARViwBi8bsQYQPlmwAEVYsAovG7EKED5ZsAYQsAHQsAEvsm8BAV20vwHPAQJdsj8BAXG0zwHfAQJxsg8BAXK0nwGvAQJxsv8BAV2yDwEBcbKfAQFdsi8BAV20bwF/AQJysAIQsgQBCitYIdgb9FmwARCyCAEKK1gh2Bv0WTAxASERIRUhESMRIREjETMBSwHxAi3+jLn+D7q6AmUB1Zn8XwHO/jIEOgAAAQCw/t8HzQWwABcAaLIRGBkREjkAsAcvsABFWLAWLxuxFhw+WbAARViwFC8bsRQQPlmwAEVYsBEvG7ERED5ZsgEWBxESObABL7AHELIIAQorWCHYG/RZsAEQsg4BCitYIdgb9FmwFhCyEgEKK1gh2Bv0WTAxATMgABEQAiMnMjY1JiYjIxEjESERIxEhBP92ARwBPPXkApGQAczOecH9MsAETwNB/s/+8P74/ueTw8vL1P1hBRL67gWwAAABAJH+5QawBDoAGABoshIZGhESOQCwCC+wAEVYsBcvG7EXGD5ZsABFWLAVLxuxFRA+WbAARViwEi8bsRIQPlmyARcIERI5sAEvsAgQsgkBCitYIdgb9FmwARCyDwEKK1gh2Bv0WbAXELITAQorWCHYG/RZMDEBMzIAFQcGBgcnNjY1NCYjIxEjESERIxEhA/ag+AEiAxTRmTB8e7ygpLn+DroDZQKF/vzXJqPhG5Igln2Sp/4dA6H8XwQ6AAIAcf/kBaIFxQAoADYAm7IYNzgREjmwGBCwKdAAsABFWLANLxuxDRw+WbAARViwHy8bsR8cPlmwAEVYsAQvG7EEED5ZsADQsAAvsgIEHxESObACL7ANELIOAQorWCHYG/RZsAQQshUBCitYIdgb9FmwAhCyLAEKK1gh2Bv0WbIXAiwREjmyJiwCERI5sAAQsigBCitYIdgb9FmwHxCyMwEKK1gh2Bv0WTAxBSInBiMiJAI1NTQSNjMXIgYVFRQSMzI3JgI1NTQ2NjMyEhUVFAIHFjMBFBYXNjY1NTQmIyIGFQWi17OOrLL+5J910oQBdpTsv0Y4eYRovXa25m9maHn9fXh1Ymh5Y2F6HElCsgFCxKyxASKjpf7Zpuz+1w1hARWq45r9jf7M/eue/vZfGgI0mO1KSOeN+bHO0rIAAAIAbf/rBJwETwAkAC8AorIEMDEREjmwBBCwJdAAsABFWLAMLxuxDBg+WbAARViwHC8bsRwYPlmwAEVYsAQvG7EEED5ZsABFWLAALxuxABA+WbICBBwREjmwAi+wDBCyDQEKK1gh2Bv0WbAEELIUAQorWCHYG/RZsAIQsicBCitYIdgb9FmyFhQnERI5sAAQsiQBCitYIdgb9FmyIickERI5sBwQsiwBCitYIdgb9FkwMQUiJwYjIiYCNTU0EjMVIgYVFRQWMzI3JhE1NDYzMhYVFRQHFjMBFBc2NzU0JiIGBwScsox2j4zhf8WbSV2piS4swa2PjLKAT2H+D59mA0l4RgEMOUKVARKnOs0BDp6tkjjB8AuiARFewOv5zmLjnRUBqdZ0c7p1gp6NegAAAQA0/qEGkwWwABMAWwCwES+wAEVYsAcvG7EHHD5ZsABFWLAMLxuxDBw+WbAARViwEy8bsRMQPlmwBxCyCAEKK1gh2Bv0WbAA0LAHELAF0LAD0LAC0LATELIKAQorWCHYG/RZsA7QMDEBITUhNTMVIRUhESERMxEzAyMRIQGr/okBd8EBgf5/As7BmBKs+9YFGJcBAZf7hQUT+vH+AAFfAAEAH/6/BRYEOgAPAEsAsA0vsABFWLADLxuxAxg+WbAARViwDy8bsQ8QPlmwAxCyBAEKK1gh2Bv0WbAA0LAPELIGAQorWCHYG/RZsAMQsAjQsAYQsArQMDEBITUhFSMRIREzETMDIxEhATH+7gLE+QHyuoASpfzSA6OXl/z0A6P8Xf4oAUEAAQCWAAAEyAWwABcAT7IEGBkREjkAsABFWLAALxuxABw+WbAARViwCi8bsQocPlmwAEVYsAwvG7EMED5ZsgcADBESObAHL7AE0LAHELIQAQorWCHYG/RZsBPQMDEBERYWMxEzETY3ETMRIxEGBxUjNSImJxEBVwGJoJV5eMHBcn+V+O8EBbD+MpqEATb+0g0hArb6UAJbIg3u6NnaAdcAAAEAgwAAA9kEOwAWAE+yBhcYERI5ALAARViwCy8bsQsYPlmwAEVYsBUvG7EVGD5ZsABFWLAALxuxABA+WbIPFQAREjmwDy+yBwEKK1gh2Bv0WbAE0LAPELAS0DAxISMRBgcVIzUmJicRMxEWFxEzETY3ETMD2bpGU5awuwK5Ba+WVEW6AYgTCYeFDcy1AUP+tdMaARj+6goRAhoAAAEAigAABLwFsAARAEayBRITERI5ALAARViwAS8bsQEcPlmwAEVYsAAvG7EAED5ZsABFWLAJLxuxCRA+WbIFAQAREjmwBS+yDgEKK1gh2Bv0WTAxMxEzETYzMhYXESMRJiYjIgcRisG5yvnyA8EBiaO7yAWw/aU12N/+LQHOmIY3/UsAAAIAP//qBb0FwwAdACUAZLIXJicREjmwFxCwJNAAsABFWLAPLxuxDxw+WbAARViwAC8bsQAQPlmyHw8AERI5sB8vshMBCitYIdgb9FmwBNCwHxCwC9CwABCyGAEKK1gh2Bv0WbAPELIjAQorWCHYG/RZMDEFIAARNSYmNTMUFhc0EjYzIAARFSEVFBYzMjcXBgYBITU0JiMiAgPp/uL+s5mmmFBXjv2WAQIBHPyC3syzpi9A0v3gAr6zq57CFgFRASlbE8WiWn0UtAEfov6j/r5sXdz3U48tNQNaIdnl/v0AAv/e/+wEYwROABkAIQByshQiIxESObAUELAb0ACwAEVYsA0vG7ENGD5ZsABFWLAALxuxABA+WbIeDQAREjmwHi+0vx7PHgJdshEBCitYIdgb9FmwA9CwHhCwCdCwABCyFQEKK1gh2Bv0WbIXDQAREjmwDRCyGgEKK1gh2Bv0WTAxBSIANSYmNTMUFz4CMzISERUhFhYzMjcXBgEiBgchNSYmAr3c/ux4d5NlFITIcNPq/SMEs4qub3GI/tlwmBICHgiIFAEh+h2uhpMwgslu/ur+/U2gxZJY0QPKo5MOjZsAAAEAo/7WBMwFsAAWAF2yFRcYERI5ALAOL7AARViwAi8bsQIcPlmwAEVYsAYvG7EGHD5ZsABFWLAALxuxABA+WbIEAAIREjmwBC+wCNCwDhCyDwEKK1gh2Bv0WbAEELIWAQorWCHYG/RZMDEhIxEzETMBMwEWABUQAiMnMjY1JiYnIQFkwcGFAgHi/fj4AQ355gKQkALHx/7sBbD9jwJx/YgW/tL6/vj+5JjBycrSAQAAAQCa/v4EGQQ6ABYAebINFxgREjkAsAcvsABFWLARLxuxERg+WbAARViwFS8bsRUYPlmwAEVYsA8vG7EPED5ZsBPQsBMvsp8TAV2y/xMBXbKfEwFxtL8TzxMCXbIvEwFdss8TAXGwANCwBxCyCAEKK1gh2Bv0WbATELIOAQorWCHYG/RZMDEBFhYVFAYGByc2NTQmJyMRIxEzETMBMwJ/w85krHAw+K2lsrq6WwGK4AJkH+K0XcV8E5I55oqSAv4zBDr+NgHKAAABALH+SwT+BbAAFQCnsgoWFxESOQCwAEVYsAAvG7EAHD5ZsABFWLADLxuxAxw+WbAARViwCC8bsQgSPlmwAEVYsBMvG7ETED5ZsALQsAIvsl8CAV2yzwIBXbIfAgFxtG8CfwICcbS/As8CAnG0DwIfAgJysu8CAXGynwIBcbJPAgFxsv8CAV2yrwIBXbIvAgFdsj8CAXKwCBCyDQEKK1gh2Bv0WbACELIRAQorWCHYG/RZMDEBESERMxEUBiMiJzcWMzI2NREhESMRAXICzMCrnDw2DiU9QUj9NMEFsP1uApL5/ai6EpoOZ1wC1f1/BbAAAAEAkf5LA/UEOgAWAJ+yChcYERI5ALAARViwAC8bsQAYPlmwAEVYsAMvG7EDGD5ZsABFWLAILxuxCBI+WbAARViwFC8bsRQQPlmwAtCwAi+ybwIBXbS/As8CAl2yPwIBcbTPAt8CAnGyDwIBcrSfAq8CAnGy/wIBXbIPAgFxsp8CAV2yLwIBXbRvAn8CAnKwCBCyDgEKK1gh2Bv0WbACELISAQorWCHYG/RZMDEBESERMxEUBiMiJzcWFxcyNjURIREjEQFLAfG5q5g8NA8RPBRCSP4PugQ6/isB1fttqrISkwcFAWhcAif+MgQ6AAACAF3/7AUSBcQAFwAfAF6yCCAhERI5sAgQsBjQALAARViwAC8bsQAcPlmwAEVYsAgvG7EIED5Zsg0ACBESObANL7AAELIRAQorWCHYG/RZsAgQshgBCitYIdgb9FmwDRCyGwEKK1gh2Bv0WTAxASAAERUUAgQjIAARNSE1EAIjIgcHJzc2ATISNyEVFBYCgAEuAWSc/uqn/uP+wQP09N2liz0vFp4BIaneD/zP0wXE/of+sVTF/r+2AVkBRXUHAQIBHDoajw1Y+sYBBdsi2uQAAQBo/+sELAWwABsAZ7ILHB0REjkAsABFWLACLxuxAhw+WbAARViwCy8bsQsQPlmwAhCyAAEKK1gh2Bv0WbAE0LIFAgsREjmwBS+wCxCwENCwCxCyEwEKK1gh2Bv0WbAFELIZAQorWCHYG/RZsAUQsBvQMDEBITUhFwEWFhUUBCMiJiY1MxQWMzI2NTQmIyM1Ax39dgNrAf5r2en+8+CG23bAnHuJo6aejQUSnn3+Hg7nxsPoab6CcpqSeJ2OlwAAAQBp/nUEKAQ6ABoAWrILGxwREjkAsAsvsABFWLACLxuxAhg+WbIAAQorWCHYG/RZsATQsgUCCxESObAFL7ALELAQ0LALELITAQorWCHYG/RZsAUQshgDCitYIdgb9FmwBRCwGtAwMQEhNSEXARYWFRQEIyImJjUzFBYzMjY1ECUjNQMM/YgDZQH+ctTo/vTehNd6up59jaT+yaADoZl2/hEQ4cXD52a/g3GflXkBIgiX//8AOv5LBHQFsAAmALBEAAAmAd6rQAAHAa8A8AAA//8AO/5LA5YEOgAmAOtPAAAmAd6sjgEHAa8A4QAAAAgAsgAGAV0wMQACAFcAAARlBbAACgATAFCyBBQVERI5sAQQsA3QALAARViwAS8bsQEcPlmwAEVYsAMvG7EDED5ZsgABAxESObAAL7ADELILAQorWCHYG/RZsAAQsgwBCitYIdgb9FkwMQERMxEhIiQ1NDY3AREhIgYVFBYXA6PC/d/k/vf/4AFt/qGMoZ+KA3MCPfpQ8svH6wT9KgI4loCCnwEAAgBZAAAGZwWwABcAHwBasgcgIRESObAHELAY0ACwAEVYsAgvG7EIHD5ZsABFWLAALxuxABA+WbIHCAAREjmwBy+wABCyGAEKK1gh2Bv0WbAK0LIQAAgREjmwBxCyGQEKK1gh2Bv0WTAxISIkNTQkNyERMxE3NjY3NiczFxYHBgYjJREhIgYUFhcCR+X+9wEB4wFqwVhvcgMEQLoWLwME5cP+7/6gjp6YhfTJxu0DAj366wECknuip0SXbsPonQI4l/6fBAAAAgBk/+cGbgYYAB8AKwCDshosLRESObAaELAq0ACwAEVYsAYvG7EGHj5ZsABFWLADLxuxAxg+WbAARViwGC8bsRgQPlmwAEVYsBwvG7EcED5ZsgUDGBESObAYELILAQorWCHYG/RZshEDGBESObIaAxgREjmwAxCyIgEKK1gh2Bv0WbAcELIoAQorWCHYG/RZMDETEBIzMhcRMxEGFjM2Njc2JzcWFgcOAiMGJwYjIgI1ASYjIgYVFBYzMjcnZOLEt2q5Al9OiZcEBEGzHCkCAnnZifJObNvA5ALHUqGHlJGIp1MFAgkBCAE9gwJN+0FfeALQvbrYAWbHZqn5hAS6tgEb9AExht/erb+TPgAAAQA2/+MF1QWwACcAY7IQKCkREjkAsABFWLAJLxuxCRw+WbAARViwIS8bsSEQPlmyASgJERI5sAEvsgABCitYIdgb9FmwCRCyBwEKK1gh2Bv0WbIPAAEREjmwIRCyFQEKK1gh2Bv0WbIaIQkREjkwMRM1MzY2NTQhITUhFhYVFAcWExUUFjM2Njc2JzMXFgcGAiMEAzU0Jif+m5+T/sv+oAFr7/zt2wVTQXSGBARBuhcwAwT2x/69D4d1AnmeAnuD+54B0cnoYkX+/FBPWwLOubvYWLuA/f7XCAFNQHiQAQABADH/4wToBDoAJwBgsg8oKRESOQCwAEVYsB8vG7EfGD5ZsABFWLAOLxuxDhA+WbICAQorWCHYG/RZsgcOHxESObIXKB8REjmwFy+yFAEKK1gh2Bv0WbAfELIdAQorWCHYG/RZsiUUFxESOTAxJQYzNjY3NiczFhYHBgYjBiYnNTQjIyczNjY1NCYjISchFhYVFAcWFwLnAl9wdgMEQrQtGAEE57iHiQfYzQLAem59df77BgEYxNy8tgTVWAKbiZmmhoA5zfADcINHnZYBV0pVXZYDp5idSjSyAAEAUv7XA/UFrwAhAF2yICIjERI5ALAXL7AARViwCS8bsQkcPlmwAEVYsBovG7EaED5ZsgEiCRESObABL7IAAQorWCHYG/RZsAkQsgcBCitYIdgb9FmyDwABERI5sBoQsRIKK1jYG9xZMDETNTM2NjUQISE1IRYWFRQHFhMVMxUUBgcnNjcjJic1NCYjr6mkm/7K/vEBIej05d4EqWFNalEOazwDkncCeZcBfYUBBZcD0sniZEb++KmUYchASHNuNKuPfo0AAAEAef7HA9kEOgAgAF2yICEiERI5ALAXL7AARViwCC8bsQgYPlmwAEVYsBovG7EaED5ZsgEhCBESObABL7IAAQorWCHYG/RZsAgQsgYBCitYIdgb9FmyDwABERI5sBoQsRIKK1jYG9xZMDETJzM2NTQjITUhFhcWFRQHFhcVMxUUBgcnNjcjJic1NCPCAdvp9f7pASfdbFa+vQGaYk1pVA1nMwLaAbiXAqGylgNnU4ShSTXKTJRhyj5IdH0hhV60AAEARP/rB3AFsAAjAGKyACQlERI5ALAARViwDi8bsQ4cPlmwAEVYsCAvG7EgED5ZsABFWLAHLxuxBxA+WbAOELIAAQorWCHYG/RZsAcQsggBCitYIdgb9FmwIBCyEwEKK1gh2Bv0WbIZDiAREjkwMQEhAwICBgcjNTc+AjcTIREUFjMyNjc2JzcWFgcGAgcHIiY1BCf+GhoPWayQPyhdZDQLHgNfWU+ClwQCP7ocKQID6cMus7cFEv2//t7+3IkCnQIHa+rzAsL7rGB0zbzA0gFmx2bs/toSArq0AAABAD//6wY6BDoAIQBisiAiIxESOQCwAEVYsAwvG7EMGD5ZsABFWLAeLxuxHhA+WbAARViwBi8bsQYQPlmwDBCyAAEKK1gh2Bv0WbAGELIHAQorWCHYG/RZsB4QshEBCitYIdgb9FmyFh4MERI5MDEBIQMCBgcjNTc2NjcTIREUFjMyNjc2JzMXFgcOAiMiJicDMf67FxScpUE2VU0NFwKvWk9sewQEQbMWMAMCbL54rrMBA6H+Wv7r5AKjBAqn0wIP/SFgebersstQsXya5nm4sQABAKn/5wdxBbAAHQCushQeHxESOQCwAEVYsAAvG7EAHD5ZsABFWLAZLxuxGRw+WbAARViwES8bsREQPlmwAEVYsBcvG7EXED5ZsBEQsgQBCitYIdgb9FmyCgARERI5sBcQsBzQsBwvsu8cAXGyXxwBXbLPHAFdsh8cAXG0bxx/HAJxtL8czxwCcbKfHAFxsk8cAXGy/xwBXbKvHAFdsi8cAV20DxwfHAJysj8cAXKyFQEKK1gh2Bv0WTAxAREUFjM2Njc2JzcWFgcOAiMGJicRIREjETMRIREE6V1KhpQEBEK7GysCAnvYiqu1CP1CwcECvgWw+6xlbwLNurfbAWLKZ6j7gwS4uwEn/X8FsP1uApIAAQCQ/+cGTQQ6ABwAo7IbHR4REjkAsABFWLAELxuxBBg+WbAARViwCC8bsQgYPlmwAEVYsBkvG7EZED5ZsABFWLACLxuxAhA+WbAH0LAHL7JvBwFdtL8HzwcCXbI/BwFxtM8H3wcCcbIPBwFytJ8HrwcCcbL/BwFdsg8HAXGynwcBXbIvBwFdtG8HfwcCcrIAAQorWCHYG/RZsBkQsg0BCitYIdgb9FmyEhkIERI5MDEBIREjETMRIREzERQWMzY2NzYnMxcWBwYCIwYmJwND/ga5uQH6uVxNbHwEBEGyFzADBOa7p7MIAc3+MwQ6/ioB1v0hZHUCtaus0VOxeer+8QS3uwABAHb/6wSgBcUAIgBHshUjJBESOQCwAEVYsAkvG7EJHD5ZsABFWLAALxuxABA+WbAJELIOAQorWCHYG/RZsAAQshYBCitYIdgb9FmyGwAJERI5MDEFIiQCJxE0EiQzMhcHJiMiAhUVFBYWMzY2NzYnMxcWBw4CArmk/viVApQBCqXchzuGoqzXYrBxjZYDAzW6JhMBAnveFZsBGK0BEK8BHp1YikT+/tL+g9V1ApmGms+zW1uIyW0AAQBl/+sDxwROAB4ARLITHyAREjkAsABFWLATLxuxExg+WbAARViwCy8bsQsQPlmyAAEKK1gh2Bv0WbIFCxMREjmwExCyGAEKK1gh2Bv0WTAxJTY2NzQnMxYHBgYjIgA1NTQ2NjMyFwcmIyIGFRUUFgJRYFoCFLIcAQTErdz+8HbWi7lgLGOKg5umggJQWXpyllaZqQEy9x6X+YxCkDrcsx+r2wABACP/5wVHBbAAGABNsgUZGhESOQCwAEVYsAIvG7ECHD5ZsABFWLAVLxuxFRA+WbACELIAAQorWCHYG/RZsATQsAXQsBUQsgkBCitYIdgb9FmyDgIVERI5MDEBITUhFSERFBYzNjYSJzcWFgcOAiMGJicB/v4lBID+HFxMhpQIQrobKwMCedmJqrcIBRKenvxIYHIC0AFu2wFiymep+YQEt7wAAAEARv/nBLcEOgAYAE2yFhkaERI5ALAARViwAi8bsQIYPlmwAEVYsBUvG7EVED5ZsAIQsgABCitYIdgb9FmwBNCwBdCwFRCyCQEKK1gh2Bv0WbIOFQIREjkwMQEhNSEVIREUFjM2Njc2JzMWFgcGBiMGJicBrP6aA4v+lV5NcXcDBECyKhsBBOi5qrMIA6SWlv21Y3QCnYmXrn2MPNDvBLm5AAEAlv/sBP8FxQApAG+yJCorERI5ALAARViwFi8bsRYcPlmwAEVYsAsvG7ELED5ZsgMBCitYIdgb9FmwCxCwBtCyJQsWERI5sCUvss8lAV2ynyUBcbImAQorWCHYG/RZshAmJRESObAWELAb0LAWELIeAQorWCHYG/RZMDEBFBYzMjY1MxQGBiMgJDU0JSYmNTQkITIWFhUjNCYjIgYVFBYXMxUjBgYBWM+wm8zBjf6d/vv+xAEUeIYBJQEGk/WMwcGSp8Kto8TEsbUBkniSmHSDvmflxf9WMKZlxNtlunVnj4h2dX0CngJ+AAIAbwRwAskF1gAFAA0AIwCwCy+wB9CwBy+wAdCwAS+wCxCwBNCwBC+wBdAZsAUvGDAxARMzFQMjATMVFhcHJjUBkXTE31n+3qgDUEmyBJQBQhX+wwFSW3tVO1+7AP//ACUCHwINArYABgARAAD//wAlAh8CDQK2AAYAEQAA//8AogKLBI0DIgBGAZfZAEzNQAD//wCQAosFyQMiAEYBl4QAZmZAAP//AA3+bAOhAAAAJwBDAAn/AwEGAEMJAAAUAEAJAwITAiMCMwIEXbKwAgFdMDEAAQBgBDEBeAYTAAgAIbIICQoREjkAsABFWLAALxuxAB4+WbIFCQAREjmwBS8wMQEXBgcVIzU0NgEOal0DuGEGE0h/k4h0ZsgAAQAwBBYBRwYAAAgAIbIICQoREjkAsABFWLAELxuxBB4+WbIACQQREjmwAC8wMRMnNjc1MxUGBplpXQO3AWEEFkiCkJCCZMcAAQAk/uUBOwC1AAgAHrIICQoREjkAsAkvsgQFCitYIdgb9FmwANCwAC8wMRMnNjc1MxUUBo1pWwO5Y/7lSX+SdmRlygABAE8EFgFnBgAACAAMALAIL7AE0LAELzAxARUWFwcmJic1AQYEXWpNXwIGAJOQf0hAwmGHAP//AGgEMQK7BhMAJgFsCAAABwFsAUMAAP//ADwEFgKGBgAAJgFtDAAABwFtAT8AAAACACT+0wJkAPYACAARADCyChITERI5sAoQsAXQALASL7IEBQorWCHYG/RZsADQsAAvsAnQsAkvsAQQsA3QMDETJzY3NTMVFAYXJzY3NTMVFAaNaVsDuWPdaVsDumH+00iJmbmkbNNASImZuaRr0QAAAQBGAAAEJAWwAAsASwCwAEVYsAgvG7EIHD5ZsABFWLAGLxuxBhg+WbAARViwCi8bsQoYPlmwAEVYsAIvG7ECED5ZsAoQsgABCitYIdgb9FmwBNCwBdAwMQEhESMRITUhETMRIQQk/my6/nABkLoBlAOh/F8DoZkBdv6KAAEAV/5gBDQFsAATAHwAsABFWLAMLxuxDBw+WbAARViwCi8bsQoYPlmwAEVYsA4vG7EOGD5ZsABFWLACLxuxAhI+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsgYBCitYIdgb9FmwDhCyCAEKK1gh2Bv0WbAJ0LAQ0LAR0LAGELAS0LAT0DAxISERIxEhNSERITUhETMRIRUhESEENP5quv5zAY3+cwGNugGW/moBlv5gAaCXAwqZAXb+ipn89gAAAQCKAhcCIgPLAA0AFrIKDg8REjkAsAMvsQoKK1jYG9xZMDETNDYzMhYVFRQGIyImNYpvXFtybl5dbwMEV3BtXSVXbm9Y//8AlP/1Ay8A0QAmABIEAAAHABIBuQAA//8AlP/1BM4A0QAmABIEAAAnABIBuQAAAAcAEgNYAAAAAQAmAh4AzwK3AAMADwCwAi+xAQorWNgb3FkwMRMjNTPPqakCHpkAAAYARP/rB1cFxQAVACMAJwA1AEMAUQC4sgJSUxESObACELAb0LACELAm0LACELAo0LACELA20LACELBJ0ACwAEVYsBkvG7EZHD5ZsABFWLASLxuxEhA+WbAD0LADL7AH0LAHL7ASELAO0LAOL7AZELAg0LAgL7IkEhkREjmwJC+yJhkSERI5sCYvsBIQsisECitYIdgb9FmwAxCyMgQKK1gh2Bv0WbArELA50LAyELBA0LAgELJHBAorWCHYG/RZsBkQsk4ECitYIdgb9FkwMQE0NjMyFzYzMhYVFRQGIyInBiMiJjUBNDYzMhYVFRQGIyImNQEnARcDFBYzMjY1NTQmIyIGFQUUFjMyNjU1NCYjIgYVARQWMzI2NTU0JiMiBhUDN6eDmE1Pl4Oop4KZT0yXgqr9DaeDhKelhIKqAWloAsdos1hKSFZXSUdZActYSUhWV0lIV/tCWEpHV1ZKSFgBZYOpeXmoi0eDqXh4p4sDe4OqqohIgaqni/wcQgRyQvw3T2VjVUpPZGNUSk9lZlJKT2RkUwLqTmViVUlOZmVTAAABAGwAmQIgA7UABgAQALAFL7ICBwUREjmwAi8wMQEBIwE1ATMBHgECjf7ZASeNAib+cwGEEwGFAAEAWQCYAg4DtQAGABAAsAAvsgMHABESObADLzAxEwEVASMBAecBJ/7ZjgEC/v4Dtf57E/57AY4BjwABADsAbgNqBSIAAwAJALAAL7ACLzAxNycBF6NoAsdobkIEckIA//8ANgKQArsFpQMHAdgAAAKQABMAsABFWLAJLxuxCRw+WbAN0DAxAAABAHoCiwL4BboADwBTsgoQERESOQCwAEVYsAAvG7EAHD5ZsABFWLADLxuxAxw+WbAARViwDS8bsQ0UPlmwAEVYsAYvG7EGFD5ZsgENAxESObADELIKAworWCHYG/RZMDETFzYzIBERIxEmIyIHESMR+h5KkgEEqgONbiyqBat7iv7G/gsB5rlt/c4DIAAAAQBbAAAEaAXEACkAlrIhKisREjkAsABFWLAZLxuxGRw+WbAARViwBi8bsQYQPlmyKRkGERI5sCkvsgACCitYIdgb9FmwBhCyBAEKK1gh2Bv0WbAI0LAJ0LAAELAO0LApELAQ0LApELAV0LAVL7YPFR8VLxUDXbISAgorWCHYG/RZsBkQsB3QsBkQsiABCitYIdgb9FmwFRCwJNCwEhCwJtAwMQEhFxQHIQchNTM2Njc1JyM1MycjNTMnNDYzMhYVIzQmIyIGFRchFSEXIQMV/rEDPgLdAfv4TSgyAgOqpgSinQb1yL7ev39vaYIGAVz+qQQBUwHWRJpbnZ0Jg2AIRX2IfbfH7tSxa3yafbd9iAAFAB8AAAY2BbAAGwAfACMAJgApALEAsABFWLAXLxuxFxw+WbAARViwGi8bsRocPlmwAEVYsAwvG7EMED5ZsABFWLAJLxuxCRA+WbIQDBcREjmwEC+wFNCwFC+0DxQfFAJdsCTQsCQvsBjQsBgvsADQsAAvsBQQshMBCitYIdgb9FmwH9CwI9CwA9CwEBCwHNCwHC+wINCwIC+wBNCwBC+wEBCyDwEKK1gh2Bv0WbAL0LAp0LAH0LImFwwREjmyJwkaERI5MDEBMxUjFTMVIxEjASERIxEjNTM1IzUzETMBIREzASEnIwUzNSElMycBNSMFV9/f39/C/sH+YsDZ2dnZwAFRAY+//GEBO2HaAhTM/tT+THd3AuBoA6yYlJj+GAHo/hgB6JiUmAIE/fwCBPzQlJSUmLb8558AAAIAp//sBgMFsAAfACgAorIjKSoREjmwIxCwEdAAsABFWLAWLxuxFhw+WbAARViwGi8bsRoYPlmwAEVYsB4vG7EeGD5ZsABFWLAKLxuxChA+WbAARViwFC8bsRQQPlmwHhCyAAEKK1gh2Bv0WbAKELIFAQorWCHYG/RZsAAQsA7QsA/QsiEUFhESObAhL7ISAQorWCHYG/RZsB4QsB3QsB0vsBYQsicBCitYIdgb9FkwMQEjERQWMzI3FwYjIiY1ESMGBgcjESMRITIWFzMRMxEzATMyNjU0JicjBf7KNkEjNAFJRnx+jxTnx8m5AXnK7RSPusr7YsCLi4eEywOr/WFBQQyWFJaKAp+3vQL9ywWwwLYBBv76/pKNl5iOAv//AKj/7AgQBbAAJgA2AAAABwBXBFUAAAAHADkAAAcpBbAAHwAjACcAKwAwADUAOgC3ALAARViwHi8bsR4cPlmwAEVYsBsvG7EbHD5ZsABFWLACLxuxAhw+WbAARViwDS8bsQ0QPlmwAEVYsBAvG7EQED5ZshQQGxESObAUL7AY0LAYL7Ac0LA20LAA0LAE0LAYELIXAQorWCHYG/RZsCfQsCPQsCvQsAfQsBQQsCTQsCDQsCjQsAjQsBQQshMBCitYIdgb9FmwMtCwD9CwLdCwC9CyNBAeERI5sDQQsC/QsjkeEBESOTAxASETMwMzFSMHMxUhAyMDIQMjAyE1MycjNTMDMxMhEzMDIScjBTM3IQUzNyETIxcXNyUjFxc3ATMnJwcEhwFTbMFzlbov6f7ydK+I/oSNr3X+9uUvtpFzwG4BVoih4wEkN7T+eqU3/vgDP6Us/vm5WQwpH/zpVwYdKAFEXRcXFwPUAdz+JJjCmP4eAeL+HgHimMKYAdz+JAHc/MrCwsLCwv6mKrLGFhfArQIcUW9vAAACAIwAAAWeBDoADQAbAGQAsABFWLAWLxuxFhg+WbAARViwAC8bsQAYPlmwAEVYsAsvG7ELED5ZsABFWLAOLxuxDhA+WbIRAQorWCHYG/RZsgURABESObAFL7AAELIKAQorWCHYG/RZsg8KCxESObAPLzAxATIWFxEjETQmJyERIxEBETMRITI2NxEzEQYGBwK6r6gEuWVv/r25AYm5AT5xZwG5AqWtBDrBv/6jAUx/eAH8XwQ6+8YC3f27dX4Cr/1OwsQCAAABAF//7AQcBcQAIwCHshUkJRESOQCwAEVYsBYvG7EWHD5ZsABFWLAJLxuxCRA+WbIjCRYREjmwIy+yAAIKK1gh2Bv0WbAJELIEAQorWCHYG/RZsAAQsAzQsCMQsA/QsCMQsB/QsB8vtg8fHx8vHwNdsiACCitYIdgb9FmwENCwHxCwE9CwFhCyGwEKK1gh2Bv0WTAxASEWFjMyNxcGIyIAAyM1MzUjNTMSADMyFwcmIyIGByEVIRUhA1H+gAS0pXRmFHh4+P7jBrKysrIKAR3zaocUbW6ksQYBf/6AAYACHcPSIqAeASUBDHyJfQEGAR8foiPLvH2JAAQAHwAABbwFsAAZAB4AIwAoALgAsABFWLALLxuxCxw+WbAARViwAS8bsQEQPlmwCxCyKAEKK1gh2Bv0WbIkKAEREjmwJC+ycCQBcbYAJBAkICQDXbIcAQorWCHYG/RZsB3QsB0vsnAdAXG2AB0QHSAdA12yIAEKK1gh2Bv0WbAh0LAhL7JwIQFxsiAhAV2yAAEKK1gh2Bv0WbAgELAD0LAdELAG0LAGL7AcELAH0LAkELAK0LAkELAP0LAcELAS0LAdELAU0LAULzAxAREjESM1MzUjNTM1ITIWFzMVIxcHMxUjBiEBJyEVIQchFSEyASEmIyEBpcDGxsbGAhmx6zbswwMCwuVr/owBRAT9bQKVP/2qAVms/fsCSlSe/qgCOv3GAzCXXpf0hHCXMiyX9gG3NF6XWQHlVgAAAQAqAAAD+AWwABoAZgCwAEVYsBkvG7EZHD5ZsABFWLAMLxuxDBA+WbAZELIYAQorWCHYG/RZsAHQsBgQsBTQsBQvsAPQsBQQshMBCitYIdgb9FmwBtCwExCwDtCwDi+yCQEKK1gh2Bv0WbINCQ4REjkwMQEjFhczByMGBiMBFSMBJzM2NjchNyEmJyE3IQPK7EARyS6YEvbbAe3j/e4B+X2cFf29LgITMPb+5y8DnQUSUXWesrT9xAwCaX0Ba1yevgieAAEAIP/uBBoFsAAeAI0AsABFWLARLxuxERw+WbAARViwBS8bsQUQPlmyExEFERI5sBMvsBfQsBcvsgAXAV2yGAEKK1gh2Bv0WbAZ0LAI0LAJ0LAXELAW0LAL0LAK0LATELIUAQorWCHYG/RZsBXQsAzQsA3QsBMQsBLQsA/QsA7QsAUQshoBCitYIdgb9FmyHgURERI5sB4vMDEBFQYCBCMiJxEHNTc1BzU3ETMRNxUHFTcVBxE2EhE1BBoCkP73r1Bs9PT09MD7+/v7vskDA2TS/semEgJab7JvmW+ybwFZ/v9zsnOZc7Jz/d4CARABCVgAAQBdAAAE6wQ6ABcAXLIAGBkREjkAsABFWLAWLxuxFhg+WbAARViwBC8bsQQQPlmwAEVYsAovG7EKED5ZsABFWLAQLxuxEBA+WbIAChYREjmwAC+yCQEKK1gh2Bv0WbAM0LAAELAV0DAxARYAERUjNSYCJxEjEQYCBxUjNRIANzUzAv/nAQW5Ap6TuY+fArkDAQffuQNxIf6N/tq3yN8BBSD9NALKIf712MbFAR0BbSLJAAIAHwAABQMFsAAWAB8AbQCwAEVYsAwvG7EMHD5ZsABFWLADLxuxAxA+WbIGAwwREjmwBi+yBQEKK1gh2Bv0WbAB0LAGELAK0LAKL7QPCh8KAl2yCQEKK1gh2Bv0WbAU0LAGELAV0LAKELAX0LAMELIfAQorWCHYG/RZMDEBIREjESM1MzUjNTMRITIEFRQEByEVIQEhMjY1NCYnIQL8/rG/z8/PzwIZ6gES/vny/qMBT/6xAVqboqiP/qABE/7tAROeiZ0C2e7L1ecBiQEmkox/nQEABAB6/+sFgwXFABsAJwA1ADkAt7IcOjsREjmwHBCwANCwHBCwKNCwHBCwONAAsABFWLAKLxuxChw+WbAARViwJS8bsSUQPlmwChCwA9CwAy+yDgoDERI5tioOOg5KDgNdsAoQshEECitYIdgb9FmwAxCyGAQKK1gh2Bv0WbIbAwoREjm0NhtGGwJdsiUbAV2wJRCwH9CwHy+wJRCyKwQKK1gh2Bv0WbAfELIyBAorWCHYG/RZsjYlChESObA2L7I4CiUREjmwOC8wMQEUBiMiJjU1NDYzMhYVIzQmIyIGFRUUFjMyNjUBNDYgFhUVFAYgJjUXFBYzMjY1NTQmIyIGFQUnARcCqJh7eqGee3mciklCQU1PQT1MARCnAQaop/78qopYSkhWV0lHWf4GaQLHaQQebpCoiUeCq5FvOk1mUklOZUw6/UeDqaiLR4Opp4sGT2VjVUpPZGNU80IEckIAAAIAaP/rA2oGEwAXACEAZLITIiMREjmwExCwGNAAsABFWLAMLxuxDB4+WbAARViwAC8bsQAQPlmyBgwAERI5sAYvsgUBCitYIdgb9FmwE9CwABCyFwEKK1gh2Bv0WbAGELAY0LAMELIfAQorWCHYG/RZMDEFIiY1BiM1MjcRNjYzMhYVFRQCBxUUFjMDNjY1NTQmIyIHAszC0mJucV8BnYV4l86ra3DbWWcwJmcDFerrHLAjAiSyxq2TJcH+j2timo0CY1X1eydSTNEAAAQAogAAB8YFwAADABAAHgAoAKOyHykqERI5sB8QsAHQsB8QsATQsB8QsBHQALAARViwJy8bsSccPlmwAEVYsCUvG7ElHD5ZsABFWLAHLxuxBxw+WbAARViwIi8bsSIQPlmwAEVYsCAvG7EgED5ZsAcQsA3QsALQsAIvshACAV2yAQMKK1gh2Bv0WbANELIUAworWCHYG/RZsAcQshsDCitYIdgb9FmyISUgERI5siYgJRESOTAxASE1IQE0NiAWFRUUBiMiJjUXFBYzMjY3NTQmIyIGFQEjAREjETMBETMHpP2ZAmf9dboBOLu5nJ66o19WVF0BX1VUX/68zP2vucsCVLcBnI4CPZu+u6Ndnbq7oQVia2pgZWFra2P7mwRu+5IFsPuPBHEAAgBnA5cEOAWwAAwAFABtALAARViwBi8bsQYcPlmwAEVYsAkvG7EJHD5ZsABFWLATLxuxExw+WbIBFQYREjmwAS+yAAkBERI5sgMBBhESObAE0LIIAQkREjmwARCwC9CwBhCxDQorWNgb3FmwARCwD9CwDRCwEdCwEtAwMQEDIwMRIxEzExMzESMBIxEjESM1IQPejDSMWnCQkHBa/guTW5QBggUh/nYBif53Ahn+cQGP/ecByP44AchRAAACAJj/7ASTBE4AFQAcAGKyAh0eERI5sAIQsBbQALAARViwCi8bsQoYPlmwAEVYsAIvG7ECED5ZshoKAhESObAaL7IPCgorWCHYG/RZsAIQshMKCitYIdgb9FmyFQoCERI5sAoQshYKCitYIdgb9FkwMSUGIyImAjU0EjYzMhYWFxUhERYzMjcBIgcRIREmBBa3u5H0h5D4hIXjhAP9AHeaxKz+kJd6AhxzXnKdAQGTjwEDn4vzkD7+uG56Ayp6/usBHnH//wBU//UFswWbACcB1f/aAoYAJwF8AOYAAAAHAdwDFAAA//8AZP/1BlMFtAAnAdcAJgKUACcBfAGlAAAABwHcA7QAAP//AGP/9QZJBaQAJwHZAAgCjwAnAXwBgwAAAAcB3AOqAAD//wBZ//UF/QWkACcB2wAfAo8AJwF8ASAAAAAHAdwDXgAAAAIAav/rBDIF7AAbACoAW7IVKywREjmwFRCwI9AAsA0vsABFWLAVLxuxFRA+WbIADRUREjmwAC+yAwAVERI5sA0QsgcBCitYIdgb9FmwABCyHAEKK1gh2Bv0WbAVELIjAQorWCHYG/RZMDEBMhYXLgIjIgcnNzYzIAARFRQCBiMiADU1NAAXIgYVFRQWMzI2NTUnJiYCPF2mOg5ppmCBmxAxdJcBBwEfeN6Q2v74AQDkjJ+fio6fBBygA/5NRIzZeTuXFTD+Tv5uMrz+1qUBI/YO3AEQmLugEKrP+ds9D1pqAAABAKn/KwTlBbAABwAnALAEL7AARViwBi8bsQYcPlmwBBCwAdCwBhCyAgEKK1gh2Bv0WTAxBSMRIREjESEE5bn9NrkEPNUF7foTBoUAAQBF/vMEqwWwAAwANQCwAy+wAEVYsAgvG7EIHD5ZsAMQsgIBCitYIdgb9FmwBdCwCBCyCgEKK1gh2Bv0WbAH0DAxAQEhFSE1AQE1IRUhAQNr/bsDhfuaAmH9nwQZ/McCRgJB/UqYjwLMAtKQmP1CAAEAqAKLA+sDIgADABsAsABFWLACLxuxAhY+WbIBAQorWCHYG/RZMDEBITUhA+v8vQNDAouXAAEAPwAABJgFsAAIADyyAwkKERI5ALAHL7AARViwAS8bsQEcPlmwAEVYsAMvG7EDED5ZsgABAxESObAHELIGAQorWCHYG/RZMDEBATMBIwMjNSECMAGrvf3ijfW5ATsBHASU+lACdJoAAwBi/+sHywROABwALAA8AG+yBz0+ERI5sAcQsCTQsAcQsDTQALAARViwBC8bsQQQPlmwAEVYsAovG7EKED5ZsBPQsBMvsBnQsBkvsgcZBBESObIWGQQREjmwChCyIAEKK1gh2Bv0WbATELIpAQorWCHYG/RZsDDQsCAQsDnQMDEBFAIGIyImJwYGIyImAjU1NBI2MzIWFzY2MzIAFQUUFjMyNjc3NS4CIyIGFSU0JiMiBgcHFR4CMzI2NQfLft+Jke5QUeyQid6Aft+Ike1RUO+SzgEW+VCmiHK5NAsYcpJQhqYF96aFc7w1CRZ1kFCIpQIPk/8Akbixs7aPAQCXGJMBAJK3s7G5/sHzDbHcvKMnKmPAYdy5CK7fvagfKmHFYN64AAH/sP5LAo4GFQAVAD2yAhYXERI5ALAARViwDi8bsQ4ePlmwAEVYsAMvG7EDEj5ZsggBCitYIdgb9FmwDhCyEwEKK1gh2Bv0WTAxBRQGIyInNxYzMjURNDYzMhcHJiMiFQFlpJ45OhIuIZuxoTxUGCU2tmuiqBSRDbEFGaq+FY4L2wACAGUBGAQLA/QAFQArAI2yHCwtERI5sBwQsAXQALADL7IPAwFdsA3QsA0vsgANAV2yCAEKK1gh2Bv0WbADELAK0LAKL7ADELISAQorWCHYG/RZsA0QsBXQsBUvsA0QsBnQsBkvsCPQsCMvsgAjAV2yHgEKK1gh2Bv0WbAZELAg0LAgL7AZELIoAQorWCHYG/RZsCMQsCvQsCsvMDETNjYzNhcXFjMyNxUGIyInJyYHIgYHBzY2MzYXFxYzMjcXBiMiJycmByIGB2Ywg0JSSphCToZmZ4VOQqFET0KDMAEwgkJSSpVEUIVmAWeFTkKYSlJCgzADhTM6AiNOH4C+bR9THwJEPOUzOwIjTSGAvW0fTiMCRDwAAAEAmACbA9oE1QATADcAsBMvsgABCitYIdgb9FmwBNCwExCwB9CwExCwD9CwDy+yEAEKK1gh2Bv0WbAI0LAPELAL0DAxASEHJzcjNSE3ITUhExcHMxUhByED2v3tjl9srgELlf5gAf6ZX3fD/t+UAbUBj/Q7uaD/oQEGO8uh/wD//wA+AAIDgQQ+AGYAIABhQAA5mgEHAZf/lv13AB0AsABFWLAFLxuxBRg+WbAARViwCC8bsQgQPlkwMQD//wCFAAED3ARRAGYAIgBzQAA5mgEHAZf/3f12AB0AsABFWLACLxuxAhg+WbAARViwCC8bsQgQPlkwMQAAAgArAAAD3AWwAAUACQA4sggKCxESObAIELAB0ACwAEVYsAAvG7EAHD5ZsABFWLADLxuxAxA+WbIGAAMREjmyCAADERI5MDEBMwEBIwkEAbyMAZT+cI3+bAHW/ukBHAEYBbD9J/0pAtcCD/3x/fICDgD//wC1AKcBmwT1ACcAEgAlALIABwASACUEJAACAG4CeQIzBDoAAwAHACwAsABFWLACLxuxAhg+WbAARViwBi8bsQYYPlmwAhCwANCwAC+wBNCwBdAwMRMjETMBIxEz+42NATiNjQJ5AcH+PwHBAAABAFz/XwFXAO8ACAAgsggJChESOQCwCS+wBNCwBC+0QARQBAJdsADQsAAvMDEXJzY3NTMVFAbFaUgCsU+hSG1/XExbswD//wA8AAAE9gYVACYASgAAAAcASgIsAAAAAgAfAAADzQYVABUAGQCDsggaGxESObAIELAX0ACwAEVYsAgvG7EIHj5ZsABFWLADLxuxAxg+WbAARViwES8bsREYPlmwAEVYsBgvG7EYGD5ZsABFWLAALxuxABA+WbAARViwFi8bsRYQPlmwAxCyAQEKK1gh2Bv0WbAIELINAQorWCHYG/RZsAEQsBPQsBTQMDEzESM1MzU0NjMyFwcmIyIGFRUzFSMRISMRM8qrq8+9cKsffXF3ad3dAkm6ugOrj1y1yj2cMmtrXo/8VQQ6AAEAPAAAA+kGFQAWAFwAsABFWLASLxuxEh4+WbAARViwBi8bsQYYPlmwAEVYsAkvG7EJED5ZsABFWLAWLxuxFhA+WbASELICAQorWCHYG/RZsAYQsgcBCitYIdgb9FmwC9CwBhCwDtAwMQEmIyIVFTMVIxEjESM1MzU2NjMyBREjAzB8TMjn57mrqwHAsWUBK7kFYxTSa4/8VQOrj3atuD36KAAAAgA8AAAGMgYVACcAKwCdALAARViwFi8bsRYePlmwAEVYsAgvG7EIHj5ZsABFWLAgLxuxIBg+WbAARViwEi8bsRIYPlmwAEVYsAQvG7EEGD5ZsABFWLAqLxuxKhg+WbAARViwKS8bsSkQPlmwAEVYsCMvG7EjED5ZsABFWLAnLxuxJxA+WbAgELIhAQorWCHYG/RZsCXQsAHQsAgQsg0BCitYIdgb9FmwG9AwMTMRIzUzNTQ2MzIXByYjIgYVFSE1NDYzMhcHJiMiBhUVMxUjESMRIREhIxEz56uruqpAPwovNVpiAZDPvXCrH31yd2ne3rn+cASSubkDq49vrr4RlglpYnJctco9nDJqbF6P/FUDq/xVBDoAAAEAPAAABjIGFQAoAGoAsABFWLAILxuxCB4+WbAARViwIS8bsSEYPlmwAEVYsCgvG7EoED5ZsCEQsiIBCitYIdgb9FmwJtCwAdCwIRCwEtCwBNCwCBCyDQEKK1gh2Bv0WbAIELAW0LAoELAl0LAa0LANELAd0DAxMxEjNTM1NDYzMhcHJiMiBhUVITU2NjMyBREjESYjIhUVMxUjESMRIRHnq6u6qkA/Ci81WmIBkAHAsWUBK7l8TMjn57n+cAOrj2+uvhGWCWlicnatuD36KAVjFNJrj/xVA6v8VQABADz/7ASbBhUAJgBzALAARViwIS8bsSEePlmwAEVYsB0vG7EdGD5ZsABFWLAYLxuxGBA+WbAARViwCi8bsQoQPlmwHRCwENCwJdCyAQEKK1gh2Bv0WbAKELIFAQorWCHYG/RZsAEQsA7QsCEQshUBCitYIdgb9FmwDhCwGtAwMQEjERQWMzI3FwYjIiY1ESM1MxEmJyciFREjESM1MzU0NjMyFhcRMwSWyjZBIzQBSUZ8fsXFPWYYt7mrq7OgXdtaygOr/WFBQQyWFJaKAp+PAR8cBwHd+2ADq49wrb45LP6KAAABAF//7AZUBhEATAC5shZNThESOQCwAEVYsEcvG7FHHj5ZsABFWLAPLxuxDxg+WbAARViwSy8bsUsYPlmwAEVYsEAvG7FAGD5ZsABFWLAJLxuxCRA+WbAARViwLC8bsSwQPlmwSxCyAQEKK1gh2Bv0WbAJELIEAQorWCHYG/RZsAEQsA3QsEcQshQBCitYIdgb9FmwQBCyIAEKK1gh2Bv0WbI6LEAREjmwOhCyJQEKK1gh2Bv0WbAsELI0AQorWCHYG/RZMDEBIxEUMzI3FwYjIiY1ESM1MzU0JiMiBhUUHgIVIzQmIyIGFRQWBBYWFRQGIyImJjUzFhYzMjY1NCYkJiY1NDYzMhcmNTQ2MzIWFRUzBk/KdyM0AU1CdoS8vGZiWFwfJR66gWJlcmoBFaxT6LmCyHG5BYtyaX9x/uelT+GvYFYsypu5ycoDq/1+nwyWFKaXAoKPVXJ1WEY7aXB8TExuWEdDRD5WeVeRr1ylYF1tVUdLUzxUdFCFuB5uUnylx8NNAAAWAFv+cgfuBa4ADQAaACgANwA9AEMASQBPAFYAWgBeAGIAZgBqAG4AdgB6AH4AggCGAIoAjgG+shCPkBESObAQELAA0LAQELAb0LAQELAw0LAQELA80LAQELA+0LAQELBG0LAQELBK0LAQELBQ0LAQELBX0LAQELBb0LAQELBh0LAQELBj0LAQELBn0LAQELBt0LAQELBw0LAQELB30LAQELB70LAQELB/0LAQELCE0LAQELCI0LAQELCM0ACwPS+wAEVYsEYvG7FGHD5Zsn5JAyuyensDK7KCdwMrsn86AyuyCj1GERI5sAovsAPQsAMvsA7QsA4vsAoQsA/QsA8vslAODxESObBQL7JvBworWCHYG/RZshVQbxESObAKELIeBworWCHYG/RZsAMQsiUHCitYIdgb9FmwDxCwKdCwKS+wDhCwLtCwLi+yNAcKK1gh2Bv0WbA9ELI8CgorWCHYG/RZsD0QsGvQsGfQsGPQsD7QsDwQsGzQsGjQsGTQsD/QsDoQsEHQsEYQsGDQsFzQsFjQsEvQskoKCitYIdgb9FmwWtCwXtCwYtCwR9CwSRCwTtCwDhCyUQcKK1gh2Bv0WbAPELJ2BworWCHYG/RZsHcQsITQsHoQsIXQsHsQsIjQsH4QsInQsH8QsIzQsIIQsI3QMDEBFAYjIiYnNTQ2MzIWFxMRMzIWFRQHFhYVFCMBNCYjIgYVFRQWMzI2NQEzERQGIyImNTMUMzI2NQERMxUzFSE1MzUzEQERIRUjFSU1IREjNQEVMzI1NCcTNSEVITUhFSE1IRUBNSEVITUhFSE1IRUTMzI1NCYjIwEjNTM1IzUzESM1MyUjNTM1IzUzESM1MwM5gWRmgAJ+aGWAAkO8YnJUMjTQ/o9KQUBKSkJASQO6XGlSWG1daCk2+cRxxAUox2/4bQE1xAXsATZv/Fx+Z2LLARb9WwEV/VwBFAIKARb9WwEV/VwBFLxddjo8XfzxcXFxcXFxByJvb29vb28B1GJ5eF51X3x4Xv6zAiVJTVQgDUYtmwFIRU5ORXBFTk5FAU/+hk5dUVNbNiz8yQE7ynFxyv7FBh8BHXSpqXT+46n8tqlTUgQDSnR0dHR0dPk4cXFxcXFxA8RQKR7+0/x++vwV+X78fvr8FfkABQBc/dUH1whzAAMAHAAgACQAKABSsxEPEAQrswQPHAQrswoPFwQrsAQQsB3QsBwQsB7QALAhL7AlL7IcHgMrsCUQsADQsAAvsCEQsALQsAIvsg0AAhESObANL7IfHgIREjmwHy8wMQkDBTQ2NzY2NTQmIyIGBzM2NjMyFhUUBwYGFRcjFTMDMxUjAzMVIwQYA7/8QfxEBA8eJEpcp5WQoALLAjorOThdWy/KyspLBAQCBAQGUvwx/DEDz/E6Ohgnh0qAl4t/MzRANF88QVxMW6r9TAQKngQAAQA7AAAD0gWwAAYAMgCwAEVYsAUvG7EFHD5ZsABFWLABLxuxARA+WbAFELIDAQorWCHYG/RZsgADBRESOTAxAQEjASE1IQPS/b66AkD9JQOXBUj6uAUYmAAAAgBa/+wERAROABAAHAA2ALAARViwBC8bsQQYPlmwAEVYsAwvG7EMED5ZshQBCitYIdgb9FmwBBCyGgEKK1gh2Bv0WTAxEzQ2NjMyABUVFAYGIyImJic3FBYzMjY1NCYjIgZagOOQ3QEafuWSj+OBArmvjY6usY2LrwInnP+M/sz7Dp38jIj5mgqw3uDEr+DeAAAB/7b+SwFnAJgADAAnALANL7AARViwBC8bsQQSPlmyCQEKK1gh2Bv0WbANELAM0LAMLzAxJRUGBiMiJzcWMzI1NQFnAaqXOzQOHkOJmPWosBKdDcLpAAEAZ/6ZASEAmQADABIAsAQvsALQsAIvsAHQsAEvMDEBIxEzASG6uv6ZAgAAAgCDBNkC0gbQAA0AIQB7ALADL7AH0LAHL0ANDwcfBy8HPwdPB18HBl2wAxCyCgQKK1gh2Bv0WbAHELAN0LANL7AHELAR0LARL7AU0LAUL0ALDxQfFC8UPxRPFAVdsBEQsBfQsBcvsBQQshsECitYIdgb9FmwERCyHgQKK1gh2Bv0WbAbELAh0DAxARQGIyImNTMUFjMyNjUTFAYjIiYjIgYVJzQ2MzIWMzI2NQLSoYaHoZZKSEdKjWBGOncsIjBTYEUwgSwjMAWuX3Z2XzZAQDYBCkppSzMmFUtrSzMmAAACAIEE4ALKBwMADQAcAGUAsAMvsAfQsAcvQA0PBx8HLwc/B08HXwcGXbADELIKBAorWCHYG/RZsAcQsA3QsA0vsAcQsA7QsA4vsBXQsBUvQA8PFR8VLxU/FU8VXxVvFQddsBTQsg8UDhESObIbDhUREjkwMQEUBiMiJjUzFBYzMjY1Jyc2NjU0IzcyFhUUBgcHAsqhg4ShkkpJRUzJAUpCoAeQlFFEAQWwXnJzXTU+PTYRfAQYHTtSTkIyOwc+AAACAIEE3wLgBooADQARAF8AsAMvsAfQsAcvQA0PBx8HLwc/B08HXwcGXbADELIKBAorWCHYG/RZsAcQsA3QsA0vsAcQsBDQsBAvsA/QsA8vQA8PDx8PLw8/D08PXw9vDwddsBAQsBHQGbARLxgwMQEUBiMiJjUzFBYzMjY1JzMHIwLgqIeIqJhPSUdPYJmkZgWwX3JyXzc9PzXaxgACAGkE5ANGBtQABgAaAIUAsAMvsAHQsAEvsAbQsAYvQAkPBh8GLwY/BgRdsgQDBhESORmwBC8YsADQsgIGARESObAGELAK0LAKL7Q/Ck8KAl2wDdCwDS9ADQ8NHw0vDT8NTw1fDQZdsAoQsBDQsBAvsA0QshQECitYIdgb9FmwChCyFwQKK1gh2Bv0WbAUELAa0DAxASMnByMlMzcUBiMiJiMiBhUnNDYzMhYzMjY1A0aqxcWpAS2Dw2BBNm4oHTZNYEAqfCYfNATknp705T5eRy4dEz9iRi0cAAIAaQTkA+wGzwAGABUAYQCwAy+wBdCwBS+2DwUfBS8FA12yBAMFERI5GbAELxiwANCwAxCwAdCwAS+yAgUDERI5sAfQsAcvsA7QsA4vQA0PDh8OLw4/Dk8OXw4GXbAN0LIIBw0REjmyFA4HERI5MDEBIycHIwEzFyc2NjU0IzcyFhUUBgcHA0aqxcWpARC8vgFBO40FgIZKPAEE5Lq6AQZ8gwQaIUNcWEk7Qgc8AAL/XgTPA0YGggAGAAoAXQCwAy+yDwMBXbAE0BmwBC8YsADQGbAALxiwAxCwAdCwAS+wBtCwBi+2DwYfBi8GA12yAgMGERI5sAMQsAjQsAgvsAfQGbAHLxiwCBCwCtCwCi+2DwofCi8KA10wMQEjJwcjATMFIwMzA0bFqqrEASKY/o+MyMcEz56eAQZVAQIAAAIAbgThBFgGlQAGAAoAXQCwAy+yDwMBXbAF0LAFL7AA0LAAL7YPAB8ALwADXbADELAC0BmwAi8YsgQDABESObAG0BmwBi8YsAMQsAnQsAkvsAfQsAcvtg8HHwcvBwNdsAkQsArQGbAKLxgwMQEzASMnByMBMwMjAZKYASLFqarGAyLIyY0F6P75n58BtP79AAIAgQTfAuAGigANABEAXwCwAy+wB9CwBy9ADQ8HHwcvBz8HTwdfBwZdsAMQsgoECitYIdgb9FmwBxCwDdCwDS+wBxCwEdCwES+wD9CwDy9ADw8PHw8vDz8PTw9fD28PB12wERCwENAZsBAvGDAxARQGIyImNTMUFjMyNjUlMxcjAuCoh4iomE9JR0/+pppwZQWwX3JyXzc9PzXaxgAAAQCfBI4BlgY7AAgADACwAC+wBNCwBC8wMQEXBgcVIzU0NgErazsDuVQGO1Njb4iCTa0AAAIAEwAABHAEjQAHAAoARgCwAEVYsAQvG7EEGj5ZsABFWLACLxuxAhA+WbAARViwBi8bsQYQPlmyCQQCERI5sAkvsgABCitYIdgb9FmyCgQCERI5MDEBIQMjATMBIwEhAwNG/fhuvQHfpgHYvP3GAZHHARf+6QSN+3MBrgH9AAMAigAAA+8EjQAOABYAHgBoALAARViwAS8bsQEaPlmwAEVYsAAvG7EAED5ZshcAARESObAXL7K/FwFdtB8XLxcCXbTfF+8XAl2yDwEKK1gh2Bv0WbIIDxcREjmwABCyEAEKK1gh2Bv0WbABELIeAQorWCHYG/RZMDEzESEyFhUUBgcWFhUUBgcBESEyNjU0IyUzMjY1NCcjigGW0d5fWGN02sn+9wEGc3rr/vjqbHzl7QSNo5tRfiEYlWWergECEv6FYlXEjVVTqAUAAAEAYP/wBDAEnQAcAEyyAx0eERI5ALAARViwCy8bsQsaPlmwAEVYsAMvG7EDED5ZsAsQsA/QsAsQshIBCitYIdgb9FmwAxCyGQEKK1gh2Bv0WbADELAc0DAxAQYGIyIAETU0NjYzMhYXIyYmIyIGBxUUFjMyNjcEMBT80eD+8XvnmMz3E7kSjX6ZpwGfl4eNFAF5u84BJwEDXqT5iNO7gnTLvWq9z2+DAAIAigAABB8EjQAKABQARrICFRYREjmwAhCwFNAAsABFWLABLxuxARo+WbAARViwAC8bsQAQPlmwARCyCwEKK1gh2Bv0WbAAELIMAQorWCHYG/RZMDEzESEyFhYXFRQAIQMRMzI2NTU0JiOKAWmi+4wD/sn++Z6kusa9twSNhfafTfz+1gP0/KPQwEDAzQABAIoAAAOuBI0ACwBUALAARViwBi8bsQYaPlmwAEVYsAQvG7EEED5ZsAvQsAsvst8LAV2yHwsBXbIAAQorWCHYG/RZsAQQsgIBCitYIdgb9FmwBhCyCAEKK1gh2Bv0WTAxASERIRUhESEVIREhA1f97AJr/NwDHv2bAhQCDv6JlwSNmf6yAAEAigAAA5sEjQAJAEEAsABFWLAELxuxBBo+WbAARViwAi8bsQIQPlmwCdCwCS+yHwkBXbIAAQorWCHYG/RZsAQQsgYBCitYIdgb9FkwMQEhESMRIRUhESEDS/34uQMR/agCCAHz/g0EjZn+mAAAAQBj//AENQSdAB0AX7IKHh8REjkAsABFWLAKLxuxCho+WbAARViwAy8bsQMQPlmyHQoDERI5sB0vsg0dChESObAKELIQAQorWCHYG/RZsAMQshcBCitYIdgb9FmwHRCyGgMKK1gh2Bv0WTAxJQYGIyIAJzUQADMyFhcjJiMiBhUVFBYzMjc1ITUhBDVC6Zfu/uACAQvyyPIbuCb1n6a5oLZR/ucB0ZZTUwEq/FoBBgEnvLXZzsdUvtdK7pAAAAEAigAABFgEjQALAFMAsABFWLAGLxuxBho+WbAARViwCi8bsQoaPlmwAEVYsAAvG7EAED5ZsABFWLAELxuxBBA+WbIJAAoREjl8sAkvGLKjCQFdsgIBCitYIdgb9FkwMSEjESERIxEzESERMwRYuf2kubkCXLkB8v4OBI39/QIDAAABAJcAAAFRBI0AAwAdALAARViwAi8bsQIaPlmwAEVYsAAvG7EAED5ZMDEhIxEzAVG6ugSNAAABACv/8ANNBI0ADwA1sgUQERESOQCwAEVYsAAvG7EAGj5ZsABFWLAFLxuxBRA+WbAJ0LAFELIMAQorWCHYG/RZMDEBMxEUBiMiJjUzFBYzMjY1ApK71LHC27pxclxuBI38xZ3Ft6ReZm1fAAABAIoAAARXBI0ADABMALAARViwBC8bsQQaPlmwAEVYsAgvG7EIGj5ZsABFWLACLxuxAhA+WbAARViwCy8bsQsQPlmyAAIIERI5sgYCBBESObIKAggREjkwMQEHESMRMxE3ATMBASMB1pO5uYIBjeP+IQIB4QIHjv6HBI391ZABm/35/XoAAAEAigAAA4sEjQAFACgAsABFWLAELxuxBBo+WbAARViwAi8bsQIQPlmyAAEKK1gh2Bv0WTAxJSEVIREzAUMCSPz/uZeXBI0AAAEAigAABXcEjQAOAGCyAQ8QERI5ALAARViwAC8bsQAaPlmwAEVYsAIvG7ECGj5ZsABFWLAELxuxBBA+WbAARViwCC8bsQgQPlmwAEVYsAwvG7EMED5ZsgEABBESObIHAAQREjmyCgAEERI5MDEJAjMRIxETASMBExEjEQF6AYcBhfG4E/5yiP5zE7gEjfxxA4/7cwGRAhX8WgOi/e/+bwSNAAEAigAABFgEjQAJAEUAsABFWLAFLxuxBRo+WbAARViwCC8bsQgaPlmwAEVYsAAvG7EAED5ZsABFWLADLxuxAxA+WbICBQAREjmyBwUAERI5MDEhIwERIxEzAREzBFi4/aO5uQJduANs/JQEjfyTA20AAAIAYP/wBFoEnQANABsARrIDHB0REjmwAxCwEdAAsABFWLAKLxuxCho+WbAARViwAy8bsQMQPlmwChCyEQEKK1gh2Bv0WbADELIYAQorWCHYG/RZMDEBEAAjIgARNRAAMzIAFwc0JiMiBhUVFBYzMjY1BFr+7Ojl/ucBF+XpARMCt6yblq+wl5ypAiT++/7RATIBBz4BAgE0/tD/BcbS1sVCw9fTxwACAIoAAAQbBI0ACgATAE2yChQVERI5sAoQsAzQALAARViwAy8bsQMaPlmwAEVYsAEvG7EBED5ZsgsDARESObALL7IAAQorWCHYG/RZsAMQshIBCitYIdgb9FkwMQERIxEhMhYVFAYjJSEyNjU0JichAUO5AdPM8urW/ugBGnyIiHf+4QG2/koEjceoqr6YamRgdwEAAgBZ/zYEVwSdABMAIQBNsggiIxESObAIELAe0ACwAEVYsBAvG7EQGj5ZsABFWLAILxuxCBA+WbIDCBAREjmwEBCyFwEKK1gh2Bv0WbAIELIeAQorWCHYG/RZMDEBFAYHFwclBiMiABE1NBI2MzIAESc0JiMiBgcVFBYzMjY1BFVwZth8/vk2RuT+5X/oluoBFbesnJSsBK6YnKoCJKbzRqBvxw0BMQEIPqkBA4r+zf75BsbSz7lVwtjTxwACAIoAAAQlBI0ADQAWAGGyFRcYERI5sBUQsAXQALAARViwBC8bsQQaPlmwAEVYsAIvG7ECED5ZsABFWLAMLxuxDBA+WbIPBAIREjmwDy+yAAEKK1gh2Bv0WbIKAAQREjmwBBCyFQEKK1gh2Bv0WTAxASERIxEhMhYVFAcBFSMBMzI2NTQmIyMCWv7puQGq1efrASDG/eT2dYmGfvABwf4/BI26quRZ/h4KAlhtXWRuAAEAQ//wA90EnQAlAFoAsABFWLAJLxuxCRo+WbAARViwHC8bsRwQPlmyAhwJERI5sAkQsA3QsAkQshABCitYIdgb9FmwAhCyFgEKK1gh2Bv0WbAcELAg0LAcELIjAQorWCHYG/RZMDEBNCYkJyY1NDYzMhYVIzQmIyIGFRQWBBYWFRQGIyIkNTMUFjMyNgMjef7aVsPzv8T5uY15cYZ7ATiwVvPHz/7vupqMfoIBKlBYSitis4+yyJxia1lQQVhQZYhbk6nLomZyWwABACgAAAP9BI0ABwAuALAARViwBi8bsQYaPlmwAEVYsAIvG7ECED5ZsAYQsgABCitYIdgb9FmwBNAwMQEhESMRITUhA/3+cbn+cwPVA/T8DAP0mQABAHT/8AQKBI0AEQA8sgQSExESOQCwAEVYsAAvG7EAGj5ZsABFWLAILxuxCBo+WbAARViwBC8bsQQQPlmyDQEKK1gh2Bv0WTAxAREUBiMiJicRMxEUFjMyNjURBAr60dL2A7ePhYOPBI389Lbb07YDFPz0eYF/ewMMAAEAFAAABFMEjQAIADEAsABFWLADLxuxAxo+WbAARViwBy8bsQcaPlmwAEVYsAUvG7EFED5ZsgEDBRESOTAxARc3ATMBIwEzAhoZGgFAxv43rf43xwEkXlwDa/tzBI0AAAEAMQAABfEEjQASAGCyDhMUERI5ALAARViwAy8bsQMaPlmwAEVYsAgvG7EIGj5ZsABFWLARLxuxERo+WbAARViwCi8bsQoQPlmwAEVYsA8vG7EPED5ZsgEDChESObIGAwoREjmyDQMKERI5MDEBFzcTMxMXNxMzASMBJwcBIwEzAa8LD/il9A0Mxrj+1q7+/AEB/vSt/te3ASZQQAN3/IY7UANl+3MDlQUF/GsEjQAAAQAmAAAEMQSNAAsAUwCwAEVYsAEvG7EBGj5ZsABFWLAKLxuxCho+WbAARViwBC8bsQQQPlmwAEVYsAcvG7EHED5ZsgABBBESObIGAQQREjmyAwAGERI5sgkGABESOTAxAQEzAQEjAQEjAQEzAigBH9z+dQGZ3P7V/tjcAZb+c9sC2gGz/b79tQG7/kUCSwJCAAABAA0AAAQcBI0ACAAxALAARViwAS8bsQEaPlmwAEVYsAcvG7EHGj5ZsABFWLAELxuxBBA+WbIAAQQREjkwMQEBMwERIxEBMwIUATjQ/lK5/ljQAkoCQ/0K/mkBogLrAAABAEcAAAPgBI0ACQBEALAARViwBy8bsQcaPlmwAEVYsAIvG7ECED5ZsgABCitYIdgb9FmyBAACERI5sAcQsgUBCitYIdgb9FmyCQUHERI5MDElIRUhNQEhNSEVAS8CsfxnApj9cQN4l5d8A3iZeQAAAgBQ//UCnQMgAA0AFwBGsgMYGRESObADELAQ0ACwAEVYsAovG7EKFj5ZsABFWLADLxuxAxA+WbAKELIQAgorWCHYG/RZsAMQshUCCitYIdgb9FkwMQEUBiMiJic1NDYzMhYXJzQjIgcVFDMyNwKdmI2LnAGbi42YAp2KhQSLhAQBRaKurKCOo66snQfAtLPCtQABAHoAAAHvAxUABgA1ALAARViwBS8bsQUWPlmwAEVYsAEvG7EBED5ZsgQFARESObAEL7IDAgorWCHYG/RZsALQMDEhIxEHNSUzAe+d2AFjEgJZOYB1AAEAQgAAAqsDIAAWAFSyCBcYERI5ALAARViwDi8bsQ4WPlmwAEVYsAAvG7EAED5ZshUCCitYIdgb9FmwAtCyFBUOERI5sgMOFBESObAOELIIAgorWCHYG/RZsA4QsAvQMDEhITUBNjU0JiMiBhUjNDYgFhUUDwIhAqv9qQEsbUA8S0edpwEImmtUsAGPbAEaZkUxPUw5cpR/bmhrT5EAAQA+//UCmgMgACYAcQCwAEVYsA4vG7EOFj5ZsABFWLAZLxuxGRA+WbIAGQ4REjl8sAAvGLaAAJAAoAADXbAOELIHAgorWCHYG/RZsgoABxESObAAELImAgorWCHYG/RZshQmABESObAZELIgAgorWCHYG/RZsh0mIBESOTAxATMyNjU0JiMiBhUjNDYzMhYVFAYHFhUUBiMiJjUzFBYzMjY1NCcjAQlUSkg/RjlLnaN8iZxGQpWqiISmnk9DRkmcWAHLPTAtOjMpYnt5aDdbGSmPan1+ay08PDNxAgAAAgA2AAACuwMVAAoADgBJALAARViwCS8bsQkWPlmwAEVYsAQvG7EEED5ZsgEJBBESObABL7ICAgorWCHYG/RZsAbQsAEQsAvQsggLBhESObINCQQREjkwMQEzFSMVIzUhJwEzATMRBwJQa2ud/okGAXmh/oTfEQErgqmpZgIG/hYBIRwAAQBb//UCpwMVABsAYQCwAEVYsAEvG7EBFj5ZsABFWLANLxuxDRA+WbABELIECQorWCHYG/RZsgcNARESObAHL7IZAgorWCHYG/RZsgUHGRESObANELAR0LANELITAgorWCHYG/RZsAcQsBvQMDETEyEVIQc2MzIWFRQGIyImJzMWMzI2NTQmIyIHcDIB3v6jFkFKgI+ghnmnBpsKgUFITkpJOwGDAZKEqh2JeXyRfmVjS0Q+TSsAAAIAVv/1AqsDHgATAB8ATgCwAEVYsAAvG7EAFj5ZsABFWLAMLxuxDBA+WbAAELIBAgorWCHYG/RZsgYMABESObAGL7IUAgorWCHYG/RZsAwQshsCCitYIdgb9FkwMQEVIwQHNjMyFhUUBiMiJjU1NDY3AyIGBxUUFjMyNjQmAigR/vQXSHJ2h5+Ei6fezX4zTRFTPz1ORwMegwLbTZF3dJqmlzPQ5AX+biwgIlRVT3xMAAABADoAAAKlAxUABgAyALAARViwBS8bsQUWPlmwAEVYsAIvG7ECED5ZsAUQsgQCCitYIdgb9FmyAAUEERI5MDEBASMBITUhAqX+o6YBXf47AmsCu/1FApOCAAADAE//9QKfAyAAEwAeACgAegCwAEVYsBEvG7ERFj5ZsABFWLAGLxuxBhA+WbIkBhEREjmwJC+23yTvJP8kA122DyQfJC8kA12y/yQBcbQPJB8kAnKyFwIKK1gh2Bv0WbICJBcREjmyDBckERI5sAYQsh0CCitYIdgb9FmwERCyHwIKK1gh2Bv0WTAxARQHFhUUBiAmNTQ2NyY1NDYzMhYDNCYjIgYVFBYyNgMiBhUUFjI2NCYCi3eLoP7woEpAd5d9fpeJTj4/S0x+TIw3Pz9wP0ACQ3Y3O4NqeXlqQmEbN3Zndnb+OjQ6OjQ1OjoB8DUwLjg4XDcAAAIASf/5ApUDIAASAB4AWgCwAEVYsAgvG7EIFj5ZsABFWLAPLxuxDxA+WbICDwgREjmwAi+2DwIfAi8CA12wDxCyEAIKK1gh2Bv0WbACELITAgorWCHYG/RZsAgQshkCCitYIdgb9FkwMQEGIyImNTQ2MzIWFxUQBQc1MjYnMjc1NCYjIgYVFBYB9kVldo2jgYmcA/5zN5aEe14qTzw7TEoBQEGKfnmgpZQ9/mQUAX9inkc8U1BUQ0FOAAEAjwKLAwsDIgADABEAsAIvsgEBCitYIdgb9FkwMQEhNSEDC/2EAnwCi5cAAwCeBEACbgZyAAMADwAbAHIAsABFWLANLxuxDRg+WbAH0LAHL0AJPwdPB18HbwcEXbAC0LACL7Y/Ak8CXwIDXbAA0LAAL0ARDwAfAC8APwBPAF8AbwB/AAhdsAIQsAPQGbADLxiwDRCyEwcKK1gh2Bv0WbAHELIZBworWCHYG/RZMDEBMwcjBzQ2MzIWFRQGIyImNxQWMzI2NTQmIyIGAbG93HKCZEhEY2FGSGRVMyQjMDAjJTIGcrjXRmFeSUdcXkUjMjEkJjI0AAMAHv5KBBEETgApADcARACPALAARViwJi8bsSYYPlmwAEVYsBYvG7EWEj5ZsCYQsCnQsCkvsgADCitYIdgb9FmyCBYmERI5sAgvsg4IFhESObAOL7SQDqAOAl2yNwEKK1gh2Bv0WbIcNw4REjmyIAgmERI5sBYQsjABCitYIdgb9FmwCBCyOwEKK1gh2Bv0WbAmELJCAQorWCHYG/RZMDEBIxYXFRQGBiMiJwYVFBczFhYVFAYGIyImNTQ2NyY1NDcmNTU0NjMyFyEBBgYVFBYzMjY1NCYnIwMUFjMyNjU1NCYiBhUEEZc6AW/DeE9JNHq3yM6N9JfR/15UOHOu8btQRwFv/Tw4PJSDks1obO90jGlniorSigOnVGkZYqZeFSpAUAIBlY9UoWCbelOKKi9KfFJqxQudyhT7+BpdN0pZckxKQQICpVN7elgSV3h4WgAAAgBk/+sEWAROABAAHABhALAARViwCS8bsQkYPlmwAEVYsAwvG7EMGD5ZsABFWLACLxuxAhA+WbAARViwEC8bsRAQPlmyAAIJERI5sgsJAhESObACELIUAQorWCHYG/RZsAkQshoBCitYIdgb9FkwMSUCISICNTUQEjMgEzczAxMjARQWMzITNSYmIyIGA4Js/vLA5OLEAQlsIrBqcbD9dZKH00gckmuGlfH++gEb9A8BCAE9/v/t/eL95AH0r8MBhyS+y+MAAgCxAAAE4wWvABYAHgBhshgfIBESObAYELAE0ACwAEVYsAMvG7EDHD5ZsABFWLABLxuxARA+WbAARViwDy8bsQ8QPlmyFwMBERI5sBcvsgABCitYIdgb9FmyCRcAERI5sAMQsh0BCitYIdgb9FkwMQERIxEhMhYVFAcWExUWFxUjJic1NCYjJSEyNjUQISEBcsECDvD77d4FAkHGOwOMf/6eATminf7P/rkCdP2MBa/SzOVjRf76nI09GDasi3iPnXyEAQAAAQCyAAAFHQWwAAwAaACwAEVYsAQvG7EEHD5ZsABFWLAILxuxCBw+WbAARViwAi8bsQIQPlmwAEVYsAsvG7ELED5ZsgYCBBESOXywBi8YtGMGcwYCXbQzBkMGAl2ykwYBXbIBAQorWCHYG/RZsgoBBhESOTAxASMRIxEzETMBMwEBIwIjscDAlgH97/3UAlXrAo79cgWw/X4Cgv0+/RIAAAEAkgAABBQGAAAMAFMAsABFWLAELxuxBB4+WbAARViwCC8bsQgYPlmwAEVYsAIvG7ECED5ZsABFWLALLxuxCxA+WbIHCAIREjmwBy+yAAEKK1gh2Bv0WbIKAAcREjkwMQEjESMRMxEzATMBASMBzIC6un4BO9v+hgGu2wH1/gsGAPyOAaz+E/2zAAEAsgAABPoFsAALAEwAsABFWLADLxuxAxw+WbAARViwBy8bsQccPlmwAEVYsAEvG7EBED5ZsABFWLAKLxuxChA+WbIAAwEREjmyBQMBERI5sgkABRESOTAxAREjETMRMwEzAQEjAXLAwAwCY/H9awK97QK1/UsFsP15Aof9O/0VAAABAJIAAAPxBhgADABMALAARViwBC8bsQQePlmwAEVYsAgvG7EIGD5ZsABFWLACLxuxAhA+WbAARViwCy8bsQsQPlmyAAgCERI5sgYIAhESObIKBgAREjkwMQEjESMRMxEzATMBASMBUAS6ugEBivD+KwH/5AHz/g0GGPx1Aa3+Df25AAABAEP/EwPdBXMAKwBmALAARViwCS8bsQkaPlmwAEVYsCIvG7EiED5ZsgIiCRESObAJELAM0LAJELAQ0LAJELITAQorWCHYG/RZsAIQshkBCitYIdgb9FmwIhCwH9CwIhCwJtCwIhCyKQEKK1gh2Bv0WTAxATQmJCcmNTQ2NzUzFRYWFSM0JiMiBhUUFgQWFhUUBgcVIzUmJjUzFBYzMjYDI3n+2lbDy6aVo8a5jXlxhnsBOLBWw6mVut+6mox+ggEqUFhKK2KzgqwQ2dsVwohia1lQQVhQZYhbgqYQ4eETwpRmclsAAAEAMAAAA+8EnQAgAGAAsABFWLAULxuxFBo+WbAARViwBy8bsQcQPlmyDwcUERI5sA8vsg4ECitYIdgb9FmwAdCwBxCyBAEKK1gh2Bv0WbAI0LAUELAY0LAUELIbAQorWCHYG/RZsA8QsB/QMDEBIRcWByEHITUzNjc3JyM1MycmNjMyFhUjNCYjIgYXFyEDHf5wAQU4ApQB/IQKTwkBAaSgBAbLtbfKuWhgXWgEBAGUAfQiy2+YmBfdRiJ5e8nszLdwd4+KewAAAQAWAAAEJQSNABcAigCwAEVYsBcvG7EXGj5ZsABFWLABLxuxARo+WbAARViwDS8bsQ0QPlmyAA0XERI5shANFxESObAQL7IPEAFdsBTQsBQvtA8UHxQCcUAPDxQfFC8UPxRPFF8UbxQHXbAD0LAUELITBAorWCHYG/RZsAbQsBAQsAjQsBAQsg8ECitYIdgb9FmwC9AwMQEBMwEzFSEHFSEVIRUjNSE1ITUhNSEBMwIdATjQ/pv7/sEFAUT+vLn+vAFE/rwBAP6c0AJLAkL9jHkJQnjd3XhLeQJ0AAEAigAAA4UEjQAFADKyAQYHERI5ALAARViwBC8bsQQaPlmwAEVYsAIvG7ECED5ZsAQQsgABCitYIdgb9FkwMQEhESMRIQOF/b65AvsD9PwMBI0AAAIAFAAABFMEjQADAAgAPLIFCQoREjmwBRCwAtAAsABFWLACLxuxAho+WbAARViwAC8bsQAQPlmyBQIAERI5sgcBCitYIdgb9FkwMSEhATMDJwcBIQRT+8EBya09Ghn++AJDBI3+3Vxe/TAAAAMAYP/wBFoEnQADABEAHwBeALAARViwDi8bsQ4aPlmwAEVYsAcvG7EHED5ZsgIHDhESOXywAi8YtGACcAICcbRgAnACAl2yAQEKK1gh2Bv0WbAOELIVAQorWCHYG/RZsAcQshwBCitYIdgb9FkwMQEhNSEFEAAjIgARNRAAMzIAFwc0JiMiBhUVFBYzMjY1A1X+HwHhAQX+7Ojl/ucBF+XpARMCt6yblq+wl5ypAfmZbv77/tEBMgEHPgECATT+0P8FxtLWxULD19PHAAEAFAAABFMEjQAIADiyBwkKERI5ALAARViwAi8bsQIaPlmwAEVYsAAvG7EAED5ZsABFWLAELxuxBBA+WbIHAgAREjkwMTMjATMBIwEnB9vHAcmtAcnG/sAaGQSN+3MDalxeAAADAD4AAANLBI0AAwAHAAsAY7IEDA0REjmwBBCwAdCwBBCwCdAAsABFWLAKLxuxCho+WbAARViwAC8bsQAQPlmyAgEKK1gh2Bv0WbIHCgAREjmwBy+yvwcBXbIEAQorWCHYG/RZsAoQsggBCitYIdgb9FkwMSEhNSEDITUhEyE1IQNL/PMDDUP9dwKJQ/zzAw2YAXuYAUmZAAEAigAABEQEjQAHAD+yAQgJERI5ALAARViwBi8bsQYaPlmwAEVYsAAvG7EAED5ZsABFWLAELxuxBBA+WbAGELICAQorWCHYG/RZMDEhIxEhESMRIQREuv25uQO6A/T8DASNAAABAD8AAAPIBI0ADABDsgYNDhESOQCwAEVYsAgvG7EIGj5ZsABFWLADLxuxAxA+WbIBAQorWCHYG/RZsAXQsAgQsgoBCitYIdgb9FmwB9AwMQEBIRUhNQEBNSEVIQECb/62AqP8dwFR/q8DV/2PAUoCOv5fmZABtwG2kJn+XwADAGAAAAUGBI0AEQAXAB4AXACwAEVYsBAvG7EQGj5ZsABFWLAILxuxCBA+WbIPEAgREjmwDy+wANCyCQgQERI5sAkvsAbQsAkQshQBCitYIdgb9FmwDxCyFQEKK1gh2Bv0WbAb0LAUELAc0DAxARYEFRQEBxUjNSYkNTQkNzUzARAFEQYGBTQmJxE2NgMQ5gEQ/u3juen+8gEQ57n+CAE/mqUDNqaYmKYEFg36y838DW5uDfvMzfsNdv21/tgRAnMJl5iZlQn9jgqWAAABAGAAAAS2BI0AFQBcsgAWFxESOQCwAEVYsAMvG7EDGj5ZsABFWLAPLxuxDxo+WbAARViwFC8bsRQaPlmwAEVYsAkvG7EJED5ZshMDCRESObATL7AA0LATELILAQorWCHYG/RZsAjQMDEBJBERMxEGAgcRIxEmAicRMxEQBREzAugBFbkD8tm62fAFugEUugG7MwFrATT+vfP+4hj+3wEfFAEd8gFL/sv+ji0C1AABAHUAAAR+BJ0AIQBcsgciIxESOQCwAEVYsBgvG7EYGj5ZsABFWLAPLxuxDxA+WbAARViwIC8bsSAQPlmwDxCyEQEKK1gh2Bv0WbAO0LAA0LAYELIHAQorWCHYG/RZsBEQsB7QsB/QMDElNjY1NTQmIyIGFRUUFhcVITUzJhE1NAAzMgAVFRAHMxUhAruIf66dnKyNf/4+r7MBG+foARyytf49nR/fzSazwMG3IczfIJ2XnQE6Hu4BI/7c9Rz+y5yXAAEAJv/sBSwEjQAZAGuyFhobERI5ALAARViwAi8bsQIaPlmwAEVYsA4vG7EOED5ZsABFWLAYLxuxGBA+WbACELIAAQorWCHYG/RZsATQsAXQsggCDhESObAIL7AOELIPAQorWCHYG/RZsAgQshUBCitYIdgb9FkwMQEhNSEVIRE2MzIWFRQGIzUyNjU0JiMiBxEjAYr+nAOJ/pSXnNTi5eCNf32AnZa5A/SZmf7XMdDEvr6XbXiDeTL9zgAAAQBg//AEMASdAB4AfbIDHyAREjkAsABFWLALLxuxCxo+WbAARViwAy8bsQMQPlmyDwsDERI5sAsQshIBCitYIdgb9FmyFgsDERI5fLAWLxiyoBYBXbRgFnAWAl2yMBYBcbRgFnAWAnGyFwEKK1gh2Bv0WbADELIbAQorWCHYG/RZsh4DCxESOTAxAQYGIyIAETU0NjYzMhYXIyYmIyIGByEVIRYWMzI2NwQwFPzR4P7xe+eYzPcTuRKNfpmiBgG//kEEoZGHjRQBebvOAScBA16k+YjTu4J0w6+YssJvgwACACcAAAb7BI0AFwAgAHayBCEiERI5sAQQsBjQALAARViwEi8bsRIaPlmwAEVYsAMvG7EDED5ZsABFWLALLxuxCxA+WbASELIFAQorWCHYG/RZsAsQsg4BCitYIdgb9FmyFBIDERI5sBQvshgBCitYIdgb9FmwAxCyGQEKK1gh2Bv0WTAxARQGByERIQMOAgcjNzc2NhMTIREhFhYlESEyNjU0JiMG++bD/iv+Xg8LTZd7OwQuYFEKFAMOASTB4P07ARVyhINzAW6lxwID9P5l7fZ1AaUBBL4BCQIc/koEwS3+WXVjX3AAAgCKAAAHCQSNABIAGwCJsgEcHRESObABELAT0ACwAEVYsAIvG7ECGj5ZsABFWLARLxuxERo+WbAARViwCy8bsQsQPlmwAEVYsA8vG7EPED5ZsgECCxESOXywAS8YsqABAV2yBAILERI5sAQvsAEQsg0BCitYIdgb9FmwBBCyEwEKK1gh2Bv0WbALELIUAQorWCHYG/RZMDEBIREzESEWFhUUBgchESERIxEzAREhMjY1NCYnAUMCSLkBJMHg5sP+K/24ubkDAQEVc4R9bgKKAgP+SgTBpKXHAgHy/g4Ejf2y/ll3YVtxAwAAAQAoAAAFLgSNABUAWrIHFhcREjkAsABFWLACLxuxAho+WbAARViwDC8bsQwQPlmwAEVYsBQvG7EUED5ZsAIQsgABCitYIdgb9FmwBNCwBdCyCAIMERI5sAgvshEBCitYIdgb9FkwMQEhNSEVIRE2MzIWFxEjETQmIyIHESMBi/6dA4n+lJOg1N4Eun1/nZa6A/SZmf7XMcrB/o8BZId5Mv3OAAABAIr+mwRDBI0ACwBPsgMMDRESOQCwAi+wAEVYsAYvG7EGGj5ZsABFWLAKLxuxCho+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsggBCitYIdgb9FmwCdAwMSEhESMRIREzESERMwRD/oG5/n+5Ake5/psBZQSN/AsD9QACAIoAAAQIBI0ADAAVAF6yAxYXERI5sAMQsA3QALAARViwCy8bsQsaPlmwAEVYsAkvG7EJED5ZsAsQsgABCitYIdgb9FmyAwsJERI5sAMvsAkQsg0BCitYIdgb9FmwAxCyEwEKK1gh2Bv0WTAxASERITIWFRQGByERIQEyNjU0JichEQOV/a4BEc7m5MX+KwML/sNzhH1u/t8D9/7gxKWkyAIEjfwLd2FbcQP+WQACAC7+rATnBI0ADwAVAFuyExYXERI5sBMQsAXQALAJL7AARViwBS8bsQUaPlmwAEVYsAsvG7ELED5ZsgABCitYIdgb9FmwB9CwCNCwCRCwDdCwCBCwENCwEdCwBRCyEgEKK1gh2Bv0WTAxNzc2NjcTIREzESMRIREjEyEhESEDAoUpR0cHDgMHj7n8uroBAS4CQv5kDBGYMVb92AGZ/Av+FAFU/q0B6wNc/sj+mQABAB8AAAXrBI0AFQCRsgEWFxESOQCwAEVYsAkvG7EJGj5ZsABFWLANLxuxDRo+WbAARViwES8bsREaPlmwAEVYsAIvG7ECED5ZsABFWLAGLxuxBhA+WbAARViwFC8bsRQQPlmyEAkCERI5fLAQLxiyoBABXbRgEHAQAl2yAAEKK1gh2Bv0WbAE0LITEAAREjmwExCwCNCwEBCwC9AwMQEjESMRIwEjAQEzATMRMxEzATMBASMDxWO6ZP7F6gGG/p7gASxZulkBLOD+nAGI6gH2/goB9v4KAlECPP4DAf3+AwH9/c39pgAAAQBH//AD1ASdACgAfbIkKSoREjkAsABFWLAKLxuxCho+WbAARViwFi8bsRYQPlmwChCyAwEKK1gh2Bv0WbIGChYREjmyJwoWERI5sCcvtB8nLycCXbK/JwFdtN8n7ycCXbIkAQorWCHYG/RZshAkJxESObIcFgoREjmwFhCyHwEKK1gh2Bv0WTAxATQmIyIGFSM0NjMyFhUUBgcWFhUUBiMiJicmNTMWFjMyNjU0JSM1MzYDCIp9boG67bzT7m5ndnH+1VupPXm5BYN5iJL+/52c7wNQVF1YT461qJZWjSkkkluetCwuWZ1WYGBYwQWYBQABAIoAAARhBI0ACQBMsgAKCxESOQCwAEVYsAAvG7EAGj5ZsABFWLAHLxuxBxo+WbAARViwAi8bsQIQPlmwAEVYsAUvG7EFED5ZsgQAAhESObIJAAIREjkwMQEzESMRASMRMxEDqLm5/Zu5uQSN+3MDdPyMBI38jAABAIsAAAQsBI0ADABosgoNDhESOQCwAEVYsAQvG7EEGj5ZsABFWLAILxuxCBo+WbAARViwAi8bsQIQPlmwAEVYsAsvG7ELED5ZsgYCBBESOXywBi8YsqAGAV20YAZwBgJdsgEBCitYIdgb9FmyCgEGERI5MDEBIxEjETMRMwEzAQEjAa5qublkAYXf/jUB6+8B9v4KBI3+AwH9/cX9rgAAAQAnAAAENgSNAA8ATbIEEBEREjkAsABFWLAALxuxABo+WbAARViwAS8bsQEQPlmwAEVYsAgvG7EIED5ZsAAQsgMBCitYIdgb9FmwCBCyCgEKK1gh2Bv0WTAxAREjESEDAgIHIzc3NjY3EwQ2uf5eDw2ksEQEKV5QDRkEjftzA/T+gv6q/uUFpQMHnuICXgAAAQAi/+wECwSNABEAQ7IBEhMREjkAsABFWLACLxuxAho+WbAARViwEC8bsRAaPlmwAEVYsAgvG7EIED5ZsgEIAhESObIMAQorWCHYG/RZMDEBFwEzAQcGBwciJzcXMjY3ATMB9S0BFNX+XiVQqiZQFAZcMUkg/mbWAjB4AtX8RUmRCwEIkwUxOwOfAAABAIr+rATxBI0ACwBFsgkMDRESOQCwAi+wAEVYsAYvG7EGGj5ZsABFWLAKLxuxCho+WbAARViwBC8bsQQQPlmyAAEKK1gh2Bv0WbAI0LAJ0DAxJTMDIxEhETMRIREzBEStEqX8ULkCR7qY/hQBVASN/AsD9QAAAQA9AAAD3wSNABEARrIEEhMREjkAsABFWLAILxuxCBo+WbAARViwEC8bsRAaPlmwAEVYsAAvG7EAED5Zsg0IABESObANL7IEAQorWCHYG/RZMDEhIxEGIyImJxEzERQWMzI3ETMD37mQo9TeBLl+f52WuQHCMMrBAXD+nYd5MgIxAAEAigAABcYEjQALAE+yBQwNERI5ALAARViwAi8bsQIaPlmwAEVYsAYvG7EGGj5ZsABFWLAKLxuxCho+WbAARViwAC8bsQAQPlmyBAEKK1gh2Bv0WbAI0LAJ0DAxISERMxEhETMRIREzBcb6xLkBiLoBiLkEjfwLA/X8CwP1AAEAiv6sBnUEjQAPAFiyCxARERI5ALACL7AARViwBi8bsQYaPlmwAEVYsAovG7EKGj5ZsABFWLAOLxuxDho+WbAARViwBC8bsQQQPlmyAAEKK1gh2Bv0WbAI0LAJ0LAM0LAN0DAxJTMDIxEhETMRIREzESERMwXHrhKm+s25AYi6AYi6mP4UAVQEjfwLA/X8CwP1AAACAAgAAATWBI0ADQAWAF6yCBcYERI5sAgQsBXQALAARViwBy8bsQcaPlmwAEVYsAMvG7EDED5ZsAcQsgUBCitYIdgb9FmyCgcDERI5sAovsAMQsg4BCitYIdgb9FmwChCyFAEKK1gh2Bv0WTAxARQGByERITUhESEyFhYBMjY1NCYjIREE1uTE/ir+sAIKARaEwmj+UXKEg3P+6wFupMgCA/SZ/kpYo/68dWNfcP5Z//8AigAABWcEjQAmAggAAAAHAcIEFgAAAAIAigAABAgEjQAKABMAULIIFBUREjmwCBCwC9AAsABFWLAFLxuxBRo+WbAARViwAy8bsQMQPlmyCAUDERI5sAgvsAMQsgsBCitYIdgb9FmwCBCyEQEKK1gh2Bv0WTAxARQGByERMxEhMhYBMjY1NCYnIREECOTF/iu5ARHO5v5Qc4R9bv7fAW6kyAIEjf5KxP6Fd2FbcQP+WQABAEv/8AQbBJ0AHgB6sgMfIBESOQCwAEVYsBMvG7ETGj5ZsABFWLAbLxuxGxA+WbIAGxMREjmyAwEKK1gh2Bv0WbIJExsREjl8sAkvGLKgCQFdtGAJcAkCXbIwCQFxtGAJcAkCcbIGAQorWCHYG/RZsBMQsgwBCitYIdgb9FmyDxMbERI5MDEBFhYzMjY3ITUhJiYjIgYHIzY2MzIAFxUUBgYjIiYnAQQUjYeNogf+QQG+BaOYfo0SuRP3zOQBEQV44pXP/hQBeYNvu7mYr8N0grvT/t/0daP5h867AAACAIr/8AYVBJ0AEwAhAIqyBCIjERI5sAQQsBjQALAARViwEC8bsRAaPlmwAEVYsAsvG7ELGj5ZsABFWLADLxuxAxA+WbAARViwCC8bsQgQPlmyDQgLERI5fLANLxi0YA1wDQJxsqANAV20YA1wDQJdsgYBCitYIdgb9FmwEBCyFwEKK1gh2Bv0WbADELIeAQorWCHYG/RZMDEBEAAjIgAnIxEjETMRMzYAMzIAFwc0JiMiBhUVFBYzMjY1BhX+7Ojd/usM2Lm52A4BFNrpARMCt6yblq+wl5ypAiT++/7RARzy/gIEjf4J8QEW/tD/BcbS1sVCw9fTxwAAAgBQAAAD/ASNAA0AFABhshMVFhESObATELAH0ACwAEVYsAcvG7EHGj5ZsABFWLAALxuxABA+WbAARViwCS8bsQkQPlmyEQcAERI5sBEvsgsBCitYIdgb9FmyAQsHERI5sAcQshIBCitYIdgb9FkwMTMBJiY1NDY3IREjESEDExQXIREhIlABInpx3MgB0bn+0P8u5gEb/u/wAg0mnWihsgL7cwHf/iEDMLQEAXwAAQALAAAD5wSNAA0AULIBDg8REjkAsABFWLAILxuxCBo+WbAARViwAi8bsQIQPlmyDQgCERI5sA0vsgABCitYIdgb9FmwBNCwDRCwBtCwCBCyCgEKK1gh2Bv0WTAxASMRIxEjNTMRIRUhETMCh+K54eEC+/2+4gH9/gMB/ZcB+Zn+oAAAAQAf/qwGIgSNABkAqrIIGhsREjkAsABFWLAQLxuxEBo+WbAARViwFC8bsRQaPlmwAEVYsBgvG7EYGj5ZsABFWLANLxuxDRA+WbAARViwCi8bsQoQPlmwAEVYsAUvG7EFED5ZshcKGBESOXywFy8YsqAXAV20YBdwFwJdtGAXcBcCcbIHAQorWCHYG/RZsgAHFxESObAFELIBAQorWCHYG/RZsAcQsAvQsg8XBxESObAXELAS0DAxAQEzESMRIwEjESMRIwEjAQEzATMRMxEzATMEYwEmmad6/sRjumT+xeoBhv6e4AEsWbpZASzgAlr+PP4WAVQB9v4KAfb+CgJRAjz+AwH9/gMB/QABAIv+rAROBI0AEACAsgAREhESOQCwAy+wAEVYsAsvG7ELGj5ZsABFWLAPLxuxDxo+WbAARViwCS8bsQkQPlmwAEVYsAUvG7EFED5Zsg0JCxESOXywDS8YtGANcA0CcbKgDQFdtGANcA0CXbIIAQorWCHYG/RZsgAIDRESObAFELIBAQorWCHYG/RZMDEBATMRIxEjASMRIxEzETMBMwJBAW+eqGn+cWq5uWQBhd8CUv5E/hYBVAH2/goEjf4DAf0AAAEAiwAABOcEjQAUAHiyCxUWERI5ALAARViwBi8bsQYaPlmwAEVYsBMvG7ETGj5ZsABFWLAJLxuxCRA+WbAARViwES8bsREQPlmyABETERI5fLAALxiyoAABXbRgAHAAAl20YABwAAJxsATQsAAQshABCitYIdgb9FmyCBAAERI5sAzQMDEBMzUzFTMBMwEBIwEjFSM1IxEjETMBRFCUPAGE4P40Aevv/nFBlFC5uQKQ5OQB/f3F/a4B9s7O/goEjQAAAQAjAAAFFQSNAA4AfbIADxAREjkAsABFWLAGLxuxBho+WbAARViwCi8bsQoaPlmwAEVYsAIvG7ECED5ZsABFWLANLxuxDRA+WbIIAgYREjl8sAgvGLKgCAFdtGAIcAgCXbRgCHAIAnGyAQEKK1gh2Bv0WbAGELIEAQorWCHYG/RZsgwBCBESOTAxASMRIxEhNSERMwEzAQEjApdpuv6vAgtjAYXg/jQB6+8B9v4KA/WY/gMB/f3F/a4AAgBg/+sFWwSfACMALgCUshQvMBESObAUELAk0ACwAEVYsAsvG7ELGj5ZsABFWLAbLxuxGxo+WbAARViwAC8bsQAQPlmwAEVYsAQvG7EEED5ZsgIEGxESObACL7ALELIMAQorWCHYG/RZsAQQshMBCitYIdgb9FmwAhCyJgEKK1gh2Bv0WbIVEyYREjmyIQImERI5sBsQsiwBCitYIdgb9FkwMQUiJwYjIAARNRASMxciBhUVFBYzMjcmAzU0EjMyEhUVEAcWMwEQFzYRNTQmIyIDBVvZpomj/ur+xvTSAX6Q0Mc2MuMBz7W4zbZedv2S4bZiasYFFDs8AUUBKhoBAwEonsPIIejlCLIBRSfrAQT+//E4/tqyEgH9/sx5gQEeOKyj/sP//wANAAAEHASNACYB0gAAAQcB3gBE/t4ACACyAAoBXTAxAAEAJv6sBHEEjQAQAGuyCxESERI5ALAHL7AARViwAS8bsQEaPlmwAEVYsA8vG7EPGj5ZsABFWLAJLxuxCRA+WbAARViwDC8bsQwQPlmyAAEMERI5sgsMARESObIDCwAREjmwCRCyBAEKK1gh2Bv0WbIOAAsREjkwMQEBMwEBNTMRIxEjAQEjAQEzAigBH9z+dQExqKh0/tX+2NwBlv5z2wLaAbP9vv5KAf4WAVQBu/5FAksCQgAAAQAm/qwF8gSNAA8AXLIJEBEREjkAsAIvsABFWLAILxuxCBo+WbAARViwDi8bsQ4aPlmwAEVYsAQvG7EEED5ZsgABCitYIdgb9FmwCBCyBgEKK1gh2Bv0WbAK0LAL0LAAELAM0LAN0DAxJTMDIxEhESE1IRUhESERMwVErhKl/FD+mwOJ/pUCRrqY/hQBVAP0mZn8pAP1AAABAD0AAAPfBI0AFwBPsgQYGRESOQCwAEVYsAsvG7ELGj5ZsABFWLAWLxuxFho+WbAARViwAC8bsQAQPlmyEAsAERI5sBAvsgcBCitYIdgb9FmwBNCwEBCwE9AwMSEjEQYHFSM1JiYnETMRFBYXNTMVNjcRMwPfuWNplbzJA7lnaJVnZbkBwiELxsMKyboBbf6de3gL8O0LIgIxAAABAIoAAAQsBI0AEQBGsgQSExESOQCwAEVYsAAvG7EAGj5ZsABFWLAILxuxCBA+WbAARViwEC8bsRAQPlmyBAAIERI5sAQvsg0BCitYIdgb9FkwMRMzETYzMhYXESMRNCYjIgcRI4q5mpnU3gS5fn+Ym7kEjf4+McrB/o8BZId5M/3PAAACAAL/8AVrBJ0AHAAkAGmyFSUmERI5sBUQsB7QALAARViwDi8bsQ4aPlmwAEVYsAAvG7EAED5ZsiEOABESObAhL7K/IQFdshIBCitYIdgb9FmwA9CwIRCwCtCwABCyFgEKK1gh2Bv0WbAOELIdAQorWCHYG/RZMDEFIgA1JiY1MxQWFz4CMzIAERUhFBYzMjY3FwYGAyIGByE1NCYDkf/+zqa4mV9mBYfpjvgBEPyuwbdMh1A5PLiWj7UGApmuEAEi8wvGqF53DJPsgf7r/v2CscAfKJIoLwQRwqQboaoAAAIAXv/wBGkEnQAWAB4AXrIIHyAREjmwCBCwF9AAsABFWLAALxuxABo+WbAARViwCC8bsQgQPlmyDQAIERI5sA0vsAAQshEBCitYIdgb9FmwCBCyFwEKK1gh2Bv0WbANELIaAQorWCHYG/RZMDEBMgAXFRQGBiMiABE1ITU0JiMiByc2NhMyNjchFRQWAkf3ASkChOyT+P7wA1LBt5OQOUHAiZGzBv1nrQSd/uDviJn0iQEVAQGCAbHBSJIpL/vtxqEboKwAAAEAR//tA9QEjQAcAG2yGh0eERI5ALAARViwAi8bsQIaPlmwAEVYsAsvG7ELED5ZsAIQsgABCitYIdgb9FmyBAACERI5sgULAhESObAFL7IRCwIREjmwCxCyFAEKK1gh2Bv0WbAFELIaAQorWCHYG/RZshwFGhESOTAxASE1IRcBFhYVFAYjIiYnJjUzFhYzMjY1NCYjIzUCs/28AzgC/qmx0fzXWas8erkFiXOIkoqGgAP0mXb+mxDFi6e+LS5anllkaGpfaqUAAwBg//AEWgSdAA0AFAAbAHOyAxwdERI5sAMQsA7QsAMQsBXQALAARViwCi8bsQoaPlmwAEVYsAMvG7EDED5Zsg4BCitYIdgb9FmyGQoDERI5fLAZLxiyoBkBXbRgGXAZAl20YBlwGQJxshEBCitYIdgb9FmwChCyFQEKK1gh2Bv0WTAxARAAIyIAETUQADMyABcBMjY3IRYWEyIGByEmJgRa/uzo5f7nARfl6QETAv4Ek6gJ/XYKrY2RqwgCigmqAiT++/7RATIBBz4BAgE0/tD//hy8tLDAA3fDrLO8AAABADAAAAPvBJ0AJwCush0oKRESOQCwAEVYsB0vG7EdGj5ZsABFWLAMLxuxDBA+WbIGHQwREjmwBi+yDwYBcbIPBgFdsk8GAXGwAdCwAS9ACR8BLwE/AU8BBF2yAAEBXbICBAorWCHYG/RZsAYQsgcECitYIdgb9FmwDBCyCgEKK1gh2Bv0WbAO0LAP0LAHELAR0LAGELAT0LACELAW0LABELAY0LIhAR0REjmwHRCyJAEKK1gh2Bv0WTAxASEVIRcVIRUhBgchByE1MzY3IzUzNScjNTMnJjYzMhYVIzQmIyIGFwGHAZb+bgMBj/5sCiQClAH8hAo/FJ+lA6KeAgbLtbfKuWhgXWgEAqh5XRB5akeYmBKfeRBdeUDJ7My3cHePigAAAQBC//ADngSdACEAnrIUIiMREjkAsABFWLAVLxuxFRo+WbAARViwCC8bsQgQPlmyIRUIERI5sCEvsg8hAV20ECEgIQJdsgAECitYIdgb9FmwCBCyAwEKK1gh2Bv0WbAAELAL0LAhELAN0LAhELAS0LASL0AJHxIvEj8STxIEXbIAEgFdsg8ECitYIdgb9FmwFRCyGgEKK1gh2Bv0WbASELAc0LAPELAe0DAxASESITI3FwYjIiYnIzUzNSM1MzY2MzIXByYjIAMhFSEVIQMv/mggAQJiaBt2b9P1FJuXl5sW9c9ghxVZef8AIAGY/mQBnAGW/vEclR7azHlteczcH5Uc/vB5bQAABACKAAAHrQSdAAMAEAAeACgAqLIfKSoREjmwHxCwAdCwHxCwBNCwHxCwEdAAsABFWLAnLxuxJxo+WbAARViwJS8bsSUaPlmwAEVYsAcvG7EHGj5ZsABFWLAiLxuxIhA+WbAARViwIC8bsSAQPlmwBxCwDdCwDS+wAtCwAi+0AAIQAgJdsgEDCitYIdgb9FmwDRCyFAMKK1gh2Bv0WbAHELIbAworWCHYG/RZsiEnIBESObImICcREjkwMSUhNSEBNDYgFhUVFAYjIiY1FxQWMzI2NTU0JiMiBhUBIwERIxEzAREzB2790wIt/ZK8ATS9vpeZv6NeV1ReYVNSYf61uP2jubkCXbi9jgIDlbq4m1CYtrecBVlqaVxSWmhnXvy1A2z8lASN/JMDbQAAAgAoAAAEZgSNABYAHwCDsgAgIRESObAY0ACwAEVYsAwvG7EMGj5ZsABFWLACLxuxAhA+WbIWDAIREjmwFi+yAAEKK1gh2Bv0WbAE0LAWELAG0LAWELAL0LALL0AJDwsfCy8LPwsEXbS/C88LAl2yCAEKK1gh2Bv0WbAT0LALELAX0LAMELIeAQorWCHYG/RZMDElIRUjNSM1MzUjNTMRITIWFRQGByEVISUhMjY1NCYjIQKk/v66wMDAwAHPxerjvv7dAQL+/gEVcoOEcP7qtLS0mFmYAlDMqKXLBFnxeGJkegAAAgCM/+wENAYAABAAGwBkshQcHRESObAUELAN0ACwCS+wAEVYsA0vG7ENGD5ZsABFWLAELxuxBBA+WbAARViwBy8bsQcQPlmyBg0EERI5sgsNBBESObANELIUAQorWCHYG/RZsAQQshkBCitYIdgb9FkwMQEUBgYjIicHIxEzETYzMhIRJzQmIyIHERYzMjYENG/JgNFwD6C5cMXJ8bmjjLdQVbSKowISn/yLlYEGAP3Di/7T/v8HtNaq/iyr2AAAAQBc/+wD7wROAB0ASbIAHh8REjkAsABFWLAQLxuxEBg+WbAARViwCC8bsQgQPlmyAAEKK1gh2Bv0WbAIELAD0LAQELAU0LAQELIXAQorWCHYG/RZMDElMjY3Mw4CIyIANTU0NjYzMhYXIyYmIyIGFRUUFgJAY5QIsAV4xG7f/vt225O28QiwCI9oj5udg3haXqhjASr8IJ35htquaYfOvyG8yQACAFv/7AQABgAAEQAcAGSyGh0eERI5sBoQsATQALAHL7AARViwBC8bsQQYPlmwAEVYsA0vG7ENED5ZsABFWLAJLxuxCRA+WbIGBA0REjmyCwQNERI5sA0QshUBCitYIdgb9FmwBBCyGgEKK1gh2Bv0WTAxEzQ2NjMyFxEzESMnBiMiJiYnNxQWMzI3ESYjIgZbcc6Avm+5oQ5vynzLdQG5qIqvUlOsjacCJp/8jYICNPoAeIyM+5gGsdifAfGZ1gACAFv+VgQABE4AGwAmAHyyHycoERI5sB8QsAvQALAARViwAy8bsQMYPlmwAEVYsAYvG7EGGD5ZsABFWLALLxuxCxI+WbAARViwGC8bsRgQPlmyBQMYERI5sAsQshIBCitYIdgb9FmyFgMYERI5sBgQsh8BCitYIdgb9FmwAxCyJAEKK1gh2Bv0WTAxEzQSMzIXNzMRBgIjIiYnNxYWMzI2NTUGIyICNRcUFjMyNxEmIyIGW/jGzG8PnQL04FbISDc/n0+Vim/Bwvq5pouvU1OtjqUCJvYBMpSA/A7v/v03MooqMrCoKIEBOPQHsNmhAeud1wD//wBXAAAChgW3AAYAFa0AAAIAjP5gBDIETgAQABsAbrIZHB0REjmwGRCwDdAAsABFWLANLxuxDRg+WbAARViwCi8bsQoYPlmwAEVYsAcvG7EHEj5ZsABFWLAELxuxBBA+WbIGDQQREjmyCw0EERI5sA0QshQBCitYIdgb9FmwBBCyGQEKK1gh2Bv0WTAxARQGBiMiJxEjETMXNjMyEhcHNCYjIgcRFjMyNgQybsiBxXG5nw90ysHuCripj6hUU6uMqgIRnvyLff33Bdp9kf7p6iew25X9+5TfAAACAFv+YAP/BE4ADwAaAGuyGBscERI5sBgQsAPQALAARViwAy8bsQMYPlmwAEVYsAYvG7EGGD5ZsABFWLAILxuxCBI+WbAARViwDC8bsQwQPlmyBQMMERI5sgoDDBESObITAQorWCHYG/RZsAMQshgBCitYIdgb9FkwMRM0EjMyFzczESMRBiMiAjUXFBYzMjcRJiMiBlv3zMRvDqC5cLrH+rmqjKZWWKKOqgIl9QE0hnL6JgIEeAE19geu35MCEY/fAAIAXf/sA/METgAUABwAYrIIHR4REjmwCBCwFdAAsABFWLAILxuxCBg+WbAARViwAC8bsQAQPlmyGQgAERI5sBkvtL8ZzxkCXbIMAQorWCHYG/RZsAAQshABCitYIdgb9FmwCBCyFQEKK1gh2Bv0WTAxBSIAJyc0NjYzMhIVFSEWFjMyNxcGASIGByE1NCYCceX+3QsBfN2A1ej9JAjCmaB4OYP+7nOYEQIgiRQBF+NOm/WK/v7wdJ3IWn9yA8qglhmDmgACAGD+VgPyBE4AGgAlAHyyIyYnERI5sCMQsAvQALAARViwAy8bsQMYPlmwAEVYsAYvG7EGGD5ZsABFWLALLxuxCxI+WbAARViwFy8bsRcQPlmyBQMXERI5sAsQshEBCitYIdgb9FmyFQMXERI5sBcQsh4BCitYIdgb9FmwAxCyIwEKK1gh2Bv0WTAxEzQSMzIXNzMRFAYjIiYnNxYzMjY1NQYjIgI1FxQWMzI3ESYjIgZg6MPKcBCd9eFSr0E3eo+ViW/Avuu6lYivUlWqiZYCJfoBL5N//AXq/y0pikmnnjqAATL6CLXToAHum9AAAQB+/+sFHQXFAB4ATLIMHyAREjkAsABFWLAMLxuxDBw+WbAARViwAy8bsQMQPlmwDBCwENCwDBCyEwEKK1gh2Bv0WbADELIbAQorWCHYG/RZsAMQsB7QMDEBBgAjIiQCJzU0EiQzMgAXIyYmIyICERUUEhYzMjY3BRwY/tvusf7hogGdARuy7QEvGcEYv53A6m7IfaGwGgHO3/78tAFHy0TTAUqz/vrjo6j+y/7+N6H/AJCdqQABAH7/6wUeBcQAIgBtsgwjJBESOQCwAEVYsAwvG7EMHD5ZsABFWLADLxuxAxA+WbIQAwwREjmwEC+wDBCyEwEKK1gh2Bv0WbADELIbAQorWCHYG/RZsiIMAxESObAiL7Q/Ik8iAl20DyIfIgJdsh8BCitYIdgb9FkwMSUGBCMiJAInNTQSJDMyBBcjJiYjIgIHBxQSFjMyNjcRITUhBR5D/uOwu/7WqAObARy18QEhIsAeupy17AoBeNOFcrUq/rACD75hcrQBR9It2wFOtuXalYz+3PJGrP72jDowAUabAAIAsgAABREFsAALABUARrIDFhcREjmwAxCwFdAAsABFWLABLxuxARw+WbAARViwAC8bsQAQPlmwARCyDAEKK1gh2Bv0WbAAELINAQorWCHYG/RZMDEzESEyBBIXFRQCBAcDETMyABE1NAAjsgGxwQE4sQSt/sLL6d/qARP+9+gFsKz+xMg+0P7BsQIFEvuLASoBAyT8ASgAAgB+/+sFXwXFABEAIgBGsgQjJBESObAEELAf0ACwAEVYsA0vG7ENHD5ZsABFWLAELxuxBBA+WbANELIWAQorWCHYG/RZsAQQsh8BCitYIdgb9FkwMQEUAgQjIiQCJzU0EiQzMgQSFwc0AiYjIgYGBxUUEhYzMhI1BV+i/uKvq/7hpgKkASGrrQEgowG/bsd9eMZyAXHJecHvAsLO/rC5uQFKyDfNAU+8uf60zAWiAQCPj/6cNaD+/pIBO/8AAAIAfv8EBV8FxQAVACYATbIIJygREjmwCBCwI9AAsABFWLARLxuxERw+WbAARViwCC8bsQgQPlmyAwgRERI5sBEQshoBCitYIdgb9FmwCBCyIwEKK1gh2Bv0WTAxARQCBxcHJQYjIiQCJzU0EiQzMgQSFSc0AiYjIgYGBxUUEhYzMhI1BV+plPqD/sw5PKv+4KQDogEirK4BIaK/bsd9eMdxAXHJecHvAsLU/qxaw3nzDLoBRsY6zAFQvrv+sM4BowEBj5D/nDOg/v6SATv/AAABAKAAAALJBI0ABgAyALAARViwBS8bsQUaPlmwAEVYsAAvG7EAED5ZsgQABRESObAEL7IDAQorWCHYG/RZMDEhIxEFNSUzAsm5/pACCh8DpouoygABAIMAAAQgBKAAGABUsgkZGhESOQCwAEVYsBEvG7ERGj5ZsABFWLAALxuxABA+WbIXAQorWCHYG/RZsALQshYXERESObIDERYREjmwERCyCQEKK1gh2Bv0WbARELAM0DAxISE1ATY3NzQmIyIGFSM0NjYzMhYVFAcBIQQg/IcB/X0KA31mepW5eNJ+u+HF/oYCeIMByXNUNVRsjnVwv2y4mLG0/qwAAQCKAAADhQXEAAcAMrIDCAkREjkAsABFWLAGLxuxBho+WbAARViwBC8bsQQQPlmwBhCyAgEKK1gh2Bv0WTAxATMRIREjESECzLn9vrkCQgXE/jD8DASNAAEAD/6jA94EjQAYAE4AsAsvsABFWLACLxuxAho+WbIBAQorWCHYG/RZsATQsgULAhESObAFL7ALELIQAQorWCHYG/RZsAUQshcBCitYIdgb9FmyGBcFERI5MDEBITUhFQEWFhUUACMiJzcWMzI2NTQmIyM1AuT9dANy/oCy4v7M/8rSNKWxtNe5wDwD9Jl2/mwY9rP5/tpni1jKpaulZwACAD7+tgSgBI0ACgAOAEsAsABFWLAJLxuxCRo+WbAARViwAi8bsQIQPlmwAEVYsAYvG7EGED5ZsgABCitYIdgb9FmwBhCwBdCwBS+wABCwDNCyDQkCERI5MDElMxUjESMRITUBMwEhEQcD28XFuv0dAtbH/TwCChyWl/63AUltBCH8CQL8NQD//wBQAo0CnQW4AwcB1AAAApgAEwCwAEVYsAovG7EKHD5ZsBDQMDEA//8ANgKYArsFrQMHAdgAAAKYABMAsABFWLAJLxuxCRw+WbAN0DAxAP//AFsCjQKnBa0DBwHZAAACmAAQALAARViwAS8bsQEcPlkwMf//AFYCjQKrBbYDBwHaAAACmAATALAARViwAC8bsQAcPlmwFNAwMQD//wA6ApgCpQWtAwcB2wAAApgAEACwAEVYsAUvG7EFHD5ZMDH//wBPAo0CnwW4AwcB3AAAApgAGQCwAEVYsBEvG7ERHD5ZsBfQsBEQsB/QMDEA//8ASQKRApUFuAMHAd0AAAKYABMAsABFWLAILxuxCBw+WbAZ0DAxAAABAGX+oAQFBIwAGwBOALANL7AARViwAS8bsQEaPlmyBAEKK1gh2Bv0WbIHDQEREjmwBy+yGAEKK1gh2Bv0WbIFBxgREjmwDRCyEgEKK1gh2Bv0WbAHELAb0DAxExMhFSEDNjc2EhUUACMiJzcWMzI2NTQmIyIGB4ZmAxT9fjZvlcjx/uDx4K86gtOZv6WHanUiAXQDGKv+dEACAv714e/+4nKLZc+kj7Y6UwAAAQBK/rYD8gSNAAYAJQCwAS+wAEVYsAUvG7EFGj5ZsgMBCitYIdgb9FmyAAMFERI5MDEBASMBITUhA/L9oLoCV/0bA6gEI/qTBT+YAAIAYP/wBm0EnQATAB0AmrIVHh8REjmwFRCwCtAAsABFWLAJLxuxCRo+WbAARViwCy8bsQsaPlmwAEVYsAIvG7ECED5ZsABFWLAALxuxABA+WbALELIMAQorWCHYG/RZsAAQsA/QsA8vsh8PAV2y3w8BXbIQAQorWCHYG/RZsAAQshMBCitYIdgb9FmwAhCyFAEKK1gh2Bv0WbAJELIXAQorWCHYG/RZMDEhIQUiABE1EAAzBSEVIREhFSERIQU3ESciBhUVFBYGbf1j/o7l/ucBF+UBWwKv/ZsCFP3sAmz78erslq+wEAEyAQc+AQIBNBCZ/rKY/okNBwNnCdbFQsPXAAIAgv6pBD8EoQAYACUASwCwFC+wAEVYsAwvG7EMGj5ZsBQQsgABCitYIdgb9FmyBRQMERI5sAUvsgMFDBESObIaAQorWCHYG/RZsAwQsiABCitYIdgb9FkwMQUyNjcGIyICNTQ2NjMyABMVFAIEIyInNxYTMjY3NTQmIyIGFRQWAd+x3BV3t9L/ddKE6wEFApL+86+fdiZ64GmfIqGSf5ijv/TZaQEU4pzsfv7c/vb63P66rjyOMgH8XFKUxcXDq5XJAAACAHj/6wSJBKEACwAZADkAsABFWLAILxuxCBo+WbAARViwAy8bsQMQPlmwCBCyDwEKK1gh2Bv0WbADELIWAQorWCHYG/RZMDEBEAAgAAM1EAAgABMnNCYjIgYHFRQWMzI2NwSJ/uj+Iv7mAQEZAd4BGQG6sp2bsgK2m5qxAgI8/ur+xQE8ARQUARQBPv7E/usNyuLgxTTJ5d3KAP///7T+SwFlBDoABgCbAAD///+0/ksBZQQ6AAYAmwAA//8AmwAAAVUEOgAGAIwAAP////r+WQFaBDoAJgCMAAAABgCjyAr//wCbAAABVQQ6AAYAjAAA//8Ahv6sAWEEOgAmAIwAAAAHAKwDTgAKAAEAiv/sA/kEnQAhAFwAsABFWLAVLxuxFRo+WbAARViwEC8bsRAQPlmwAEVYsB8vG7EfED5ZsgIBCitYIdgb9FmyGR8VERI5sBkvsQgKK1jYG9xZsBkQsArQsBUQsg0BCitYIdgb9FkwMSUWMzI2NTQmIyM1EyYjIgMRIxE2NjMyFhcBFhYVFAYjIicBw1JYYXKIh1TtTmPTBLgBxclrw2X+7qm217V3aLUze2NiVYkBJz7+9f0GAvXS1lVi/rYPo4aszDEA//8AJQIfAg0CtgIGABEAAAACACUAAATkBbAADwAdAGYAsABFWLAFLxuxBRw+WbAARViwAC8bsQAQPlmyBAAFERI5sAQvss8EAV2yLwQBXbKfBAFxsgEBCitYIdgb9FmwEdCwABCyEgEKK1gh2Bv0WbAFELIbAQorWCHYG/RZsAQQsBzQMDEzESM1MxEhMgQSFxUUAgQHEyERMzISNzU0AicjESHHoqIBm74BJJ8Bn/7ZxEf+5sne9wHp1uABGgKalwJ/qP7KyV3O/sqmAgKa/gMBEvld+AETAv4fAAACACUAAATkBbAADwAdAGYAsABFWLAFLxuxBRw+WbAARViwAC8bsQAQPlmyBAAFERI5sAQvss8EAV2yLwQBXbKfBAFxsgEBCitYIdgb9FmwEdCwABCyEgEKK1gh2Bv0WbAFELIbAQorWCHYG/RZsAQQsBzQMDEzESM1MxEhMgQSFxUUAgQHEyERMzISNzU0AicjESHHoqIBm74BJJ8Bn/7ZxEf+5sne9wHp1uABGgKalwJ/qP7KyV3O/sqmAgKa/gMBEvld+AETAv4fAAABAAAAAAP9BgAAGQBqALAXL7AARViwBC8bsQQYPlmwAEVYsBAvG7EQED5ZsABFWLAILxuxCBA+WbIvFwFdsg8XAV2yFRAXERI5sBUvshIBCitYIdgb9FmwAdCyAhAEERI5sAQQsgwBCitYIdgb9FmwFRCwGNAwMQEhETYzIBMRIxEmJiMiBgcRIxEjNTM1MxUhAnz+53vFAVcDuQFpb1qIJrmqqrkBGQTS/uWX/n39NQLMdXBgTvz9BNKXl5cAAQAxAAAElwWwAA8ATACwAEVYsAovG7EKHD5ZsABFWLACLxuxAhA+WbIPCgIREjmwDy+yAAEKK1gh2Bv0WbAE0LAPELAG0LAKELIIAQorWCHYG/RZsAzQMDEBIxEjESM1MxEhNSEVIREzA6rnv9bW/i0EZv4s5wM3/MkDN5cBRJ6e/rwAAf/0/+wCcAVAAB0AcwCwAEVYsAEvG7EBGD5ZsABFWLARLxuxERA+WbABELAA0LAAL7ABELIEAQorWCHYG/RZsAEQsAXQsAUvsgAFAV2yCAEKK1gh2Bv0WbARELIMAQorWCHYG/RZsAgQsBXQsAUQsBjQsAQQsBnQsAEQsBzQMDEBETMVIxUzFSMRFBYzMjcVBiMiJjURIzUzNSM1MxEBh8rK6ek2QSA4SUV8ftraxcUFQP76j7qX/rJBQQyWFJaKAU6Xuo8BBv//ABwAAAUdBzQCJgAlAAABBwBEATABNgAUALAARViwBC8bsQQcPlmxDAj0MDH//wAcAAAFHQc0AiYAJQAAAQcAdQG/ATYAFACwAEVYsAUvG7EFHD5ZsQ0I9DAx//8AHAAABR0HNgImACUAAAEHAJ0AyQE2ABQAsABFWLAELxuxBBw+WbEPBvQwMf//ABwAAAUdByICJgAlAAABBwCkAMUBOgAUALAARViwBS8bsQUcPlmxDgT0MDH//wAcAAAFHQb7AiYAJQAAAQcAagD5ATYAFwCwAEVYsAQvG7EEHD5ZsREE9LAb0DAxAP//ABwAAAUdB5ECJgAlAAABBwCiAVABQQAXALAARViwBC8bsQQcPlmxDgb0sBjQMDEA//8AHAAABR0HlAImACUAAAAHAd8BWgEi//8Ad/5EBNgFxAImACcAAAAHAHkB0v/3//8AqQAABEYHQAImACkAAAEHAEQA+wFCABQAsABFWLAGLxuxBhw+WbENCPQwMf//AKkAAARGB0ACJgApAAABBwB1AYoBQgAUALAARViwBi8bsQYcPlmxDgj0MDH//wCpAAAERgdCAiYAKQAAAQcAnQCUAUIAFACwAEVYsAYvG7EGHD5ZsRAG9DAx//8AqQAABEYHBwImACkAAAEHAGoAxAFCABcAsABFWLAGLxuxBhw+WbESBPSwG9AwMQD////gAAABgQdAAiYALQAAAQcARP+nAUIAFACwAEVYsAIvG7ECHD5ZsQUI9DAx//8AsAAAAlEHQAImAC0AAAEHAHUANQFCABQAsABFWLADLxuxAxw+WbEGCPQwMf///+kAAAJGB0ICJgAtAAABBwCd/0ABQgAUALAARViwAi8bsQIcPlmxCAb0MDH////WAAACXwcHAiYALQAAAQcAav9wAUIAFwCwAEVYsAIvG7ECHD5ZsQoE9LAU0DAxAP//AKkAAAUIByICJgAyAAABBwCkAPsBOgAUALAARViwBi8bsQYcPlmxDQT0MDH//wB2/+wFCQc2AiYAMwAAAQcARAFSATgAFACwAEVYsA0vG7ENHD5ZsSEI9DAx//8Adv/sBQkHNgImADMAAAEHAHUB4QE4ABQAsABFWLANLxuxDRw+WbEiCPQwMf//AHb/7AUJBzgCJgAzAAABBwCdAOsBOAAUALAARViwDS8bsQ0cPlmxIgb0MDH//wB2/+wFCQckAiYAMwAAAQcApADnATwAFACwAEVYsA0vG7ENHD5ZsSME9DAx//8Adv/sBQkG/QImADMAAAEHAGoBGwE4ABcAsABFWLANLxuxDRw+WbEnBPSwMNAwMQD//wCM/+wEqgc0AiYAOQAAAQcARAErATYAFACwAEVYsAovG7EKHD5ZsRQI9DAx//8AjP/sBKoHNAImADkAAAEHAHUBugE2ABQAsABFWLASLxuxEhw+WbEVCPQwMf//AIz/7ASqBzYCJgA5AAABBwCdAMQBNgAUALAARViwCi8bsQocPlmxFwb0MDH//wCM/+wEqgb7AiYAOQAAAQcAagD0ATYAFwCwAEVYsAovG7EKHD5ZsRkE9LAj0DAxAP//AA8AAAS7BzQCJgA9AAABBwB1AYgBNgAUALAARViwAS8bsQEcPlmxCwj0MDH//wBt/+wD6gX+AiYARQAAAQcARADVAAAAFACwAEVYsBcvG7EXGD5ZsSoJ9DAx//8Abf/sA+oF/gImAEUAAAEHAHUBZAAAABQAsABFWLAXLxuxFxg+WbErCfQwMf//AG3/7APqBgACJgBFAAABBgCdbgAAFACwAEVYsBcvG7EXGD5ZsSsB9DAx//8Abf/sA+oF7AImAEUAAAEGAKRqBAAUALAARViwFy8bsRcYPlmxLAH0MDH//wBt/+wD6gXFAiYARQAAAQcAagCeAAAAFwCwAEVYsBcvG7EXGD5ZsTAB9LA50DAxAP//AG3/7APqBlsCJgBFAAABBwCiAPUACwAXALAARViwFy8bsRcYPlmxLAT0sDbQMDEA//8Abf/sA+oGXwImAEUAAAAHAd8A///t//8AXP5EA+wETgImAEcAAAAHAHkBP//3//8AXf/sA/MF/gImAEkAAAEHAEQAxQAAABQAsABFWLAILxuxCBg+WbEfCfQwMf//AF3/7APzBf4CJgBJAAABBwB1AVQAAAAUALAARViwCC8bsQgYPlmxIAn0MDH//wBd/+wD8wYAAiYASQAAAQYAnV4AABQAsABFWLAILxuxCBg+WbEgAfQwMf//AF3/7APzBcUCJgBJAAABBwBqAI4AAAAXALAARViwCC8bsQgYPlmxJQH0sC7QMDEA////xgAAAWcF/QImAIwAAAEGAESN/wAUALAARViwAi8bsQIYPlmxBQn0MDH//wCWAAACNwX9AiYAjAAAAQYAdRv/ABQAsABFWLADLxuxAxg+WbEGCfQwMf///88AAAIsBf8CJgCMAAABBwCd/yb//wAUALAARViwAi8bsQIYPlmxCAH0MDH///+8AAACRQXEAiYAjAAAAQcAav9W//8AFwCwAEVYsAIvG7ECGD5ZsQsB9LAU0DAxAP//AIwAAAPfBewCJgBSAAABBgCkYQQAFACwAEVYsAMvG7EDGD5ZsRUB9DAx//8AW//sBDQF/gImAFMAAAEHAEQAzwAAABQAsABFWLAELxuxBBg+WbEdCfQwMf//AFv/7AQ0Bf4CJgBTAAABBwB1AV4AAAAUALAARViwBC8bsQQYPlmxHgn0MDH//wBb/+wENAYAAiYAUwAAAQYAnWgAABQAsABFWLAELxuxBBg+WbEeAfQwMf//AFv/7AQ0BewCJgBTAAABBgCkZAQAFACwAEVYsAQvG7EEGD5ZsR8B9DAx//8AW//sBDQFxQImAFMAAAEHAGoAmAAAABcAsABFWLAELxuxBBg+WbEjAfSwLNAwMQD//wCI/+wD3AX+AiYAWQAAAQcARADHAAAAFACwAEVYsAcvG7EHGD5ZsRIJ9DAx//8AiP/sA9wF/gImAFkAAAEHAHUBVgAAABQAsABFWLANLxuxDRg+WbETCfQwMf//AIj/7APcBgACJgBZAAABBgCdYAAAFACwAEVYsAcvG7EHGD5ZsRUB9DAx//8AiP/sA9wFxQImAFkAAAEHAGoAkAAAABcAsABFWLAHLxuxBxg+WbEYAfSwIdAwMQD//wAW/ksDsAX+AiYAXQAAAQcAdQEbAAAAFACwAEVYsAEvG7EBGD5ZsRIJ9DAx//8AFv5LA7AFxQImAF0AAAEGAGpVAAAXALAARViwDy8bsQ8YPlmxFwH0sCDQMDEA//8AHAAABR0G7gImACUAAAEHAHAAxwE+ABMAsABFWLAELxuxBBw+WbAM3DAxAP//AG3/7APqBbgCJgBFAAABBgBwbAgAEwCwAEVYsBcvG7EXGD5ZsCrcMDEA//8AHAAABR0HDgImACUAAAEHAKAA9AE3ABMAsABFWLAELxuxBBw+WbAN3DAxAP//AG3/7APqBdgCJgBFAAABBwCgAJkAAQATALAARViwFy8bsRcYPlmwK9wwMQAAAgAc/k8FHQWwABYAGQBnALAARViwFi8bsRYcPlmwAEVYsBQvG7EUED5ZsABFWLABLxuxARA+WbAARViwDC8bsQwSPlmyBwMKK1gh2Bv0WbABELAR0LARL7IXFBYREjmwFy+yEwEKK1gh2Bv0WbIZFhQREjkwMQEBIwcGFRQzMjcXBiMiJjU0NwMhAyMBAyEDAvACLSY6cU4wNA1GWllnqYf9nonGAiyjAe/4BbD6UC1bVkgaeSxoVpBsAXP+hAWw/GoCqQAAAgBt/k8D6gROAC0ANwCQALAARViwFy8bsRcYPlmwAEVYsAQvG7EEED5ZsABFWLAeLxuxHhA+WbAARViwKS8bsSkSPlmwHhCwANCwAC+yAgQXERI5sgsXBBESObALL7AXELIPAQorWCHYG/RZshILFxESObApELIkAworWCHYG/RZsAQQsi4BCitYIdgb9FmwCxCyMwEKK1gh2Bv0WTAxJSYnBiMiJjU0JDMzNTQmIyIGFSM0NjYzMhYXERQXFSMHBhUUMzI3FwYjIiY1NCcyNjc1IyAVFBYDJA8HgbOgzQEB6bR0cWOGunPFdrvUBCYhOnFOMDQNRlpZZ4hXnCOR/qx0ByZFhrWLqbtVYXNkR1GXWLuk/g6VWBAtW1ZIGnksaFaQ8FpI3sdXYgD//wB3/+wE2AdVAiYAJwAAAQcAdQHGAVcAFACwAEVYsAsvG7ELHD5ZsR8I9DAx//8AXP/sA+wF/gImAEcAAAEHAHUBMwAAABQAsABFWLAQLxuxEBg+WbEgCfQwMf//AHf/7ATYB1cCJgAnAAABBwCdANABVwAUALAARViwCy8bsQscPlmxHwb0MDH//wBc/+wD7AYAAiYARwAAAQYAnT0AABQAsABFWLAQLxuxEBg+WbEgAfQwMf//AHf/7ATYBxkCJgAnAAABBwChAa4BVwAUALAARViwCy8bsQscPlmxIwT0MDH//wBc/+wD7AXCAiYARwAAAQcAoQEbAAAAFACwAEVYsBAvG7EQGD5ZsSQB9DAx//8Ad//sBNgHVwImACcAAAEHAJ4A5gFYABQAsABFWLALLxuxCxw+WbEhBvQwMf//AFz/7APsBgACJgBHAAABBgCeUwEAFACwAEVYsBAvG7EQGD5ZsSIB9DAx//8AqQAABMYHQgImACgAAAEHAJ4AnwFDABQAsABFWLABLxuxARw+WbEbBvQwMf//AF//7AUrBgIAJgBIAAABBwGiA9QFEwBIALLwHwFysh8fAV2ynx8BXbIfHwFxtM8f3x8CcbLfHwFysl8fAXKyTx8BcbLPHwFdtE8fXx8CXbJgHwFdsuAfAXGy4B8BXTAx//8AqQAABEYG+gImACkAAAEHAHAAkgFKABMAsABFWLAGLxuxBhw+WbAN3DAxAP//AF3/7APzBbgCJgBJAAABBgBwXAgAEwCwAEVYsAgvG7EIGD5ZsB/cMDEA//8AqQAABEYHGgImACkAAAEHAKAAvwFDABMAsABFWLAGLxuxBhw+WbAP3DAxAP//AF3/7APzBdgCJgBJAAABBwCgAIkAAQATALAARViwCC8bsQgYPlmwIdwwMQD//wCpAAAERgcEAiYAKQAAAQcAoQFyAUIAFACwAEVYsAYvG7EGHD5ZsRME9DAx//8AXf/sA/MFwgImAEkAAAEHAKEBPAAAABQAsABFWLAILxuxCBg+WbElAfQwMQABAKn+TwRGBbAAGwB2ALAARViwFi8bsRYcPlmwAEVYsBUvG7EVED5ZsABFWLAPLxuxDxI+WbAARViwBC8bsQQQPlmyGhUWERI5sBovsgEBCitYIdgb9FmwFRCyAgEKK1gh2Bv0WbAPELIKAworWCHYG/RZsBYQshkBCitYIdgb9FkwMQEhESEVIwcGFRQzMjcXBiMiJjU0NyERIRUhESED4P2JAt1JOnFOMDQNRlpZZ5v9XQOT/S0CdwKh/fydLVtWSBp5LGhWimkFsJ7+LAAAAgBd/mgD8wROACUALQB6ALAARViwGi8bsRoYPlmwAEVYsA0vG7ENEj5ZsABFWLASLxuxEhA+WbAE0LANELIIAworWCHYG/RZsioSGhESObAqL7S/Ks8qAl2yHgEKK1gh2Bv0WbASELIiAQorWCHYG/RZsiUSGhESObAaELImAQorWCHYG/RZMDElBgczBwYVFDMyNxcGIyImNTQ3JgA1NTQ2NjMyEhEVIRYWMzI2NwEiBgchNSYmA+VHcwE6cU4wNA1GWllnYtr+9XvdgdPq/SMEs4piiDP+wnCYEgIeCIi9bjYtW1ZIGnksaFZsWgQBIe8hof2P/ur+/U2gxVBCAqGjkw6NmwD//wCpAAAERgdCAiYAKQAAAQcAngCqAUMAFACwAEVYsAYvG7EGHD5ZsREG9DAx//8AXf/sA/MGAAImAEkAAAEGAJ50AQAUALAARViwCC8bsQgYPlmxIgH0MDH//wB6/+wE3AdXAiYAKwAAAQcAnQDIAVcAFACwAEVYsAsvG7ELHD5ZsSIG9DAx//8AYP5WA/IGAAImAEsAAAEGAJ1VAAAUALAARViwAy8bsQMYPlmxJwH0MDH//wB6/+wE3AcvAiYAKwAAAQcAoADzAVgAEwCwAEVYsAsvG7ELHD5ZsCLcMDEA//8AYP5WA/IF2AImAEsAAAEHAKAAgAABABMAsABFWLADLxuxAxg+WbAn3DAxAP//AHr/7ATcBxkCJgArAAABBwChAaYBVwAUALAARViwCy8bsQscPlmxJwT0MDH//wBg/lYD8gXCAiYASwAAAQcAoQEzAAAAFACwAEVYsAMvG7EDGD5ZsSwB9DAx//8Aev3/BNwFxAImACsAAAAHAaIBo/6g//8AYP5WA/IGkwImAEsAAAEHAbkBKwBYABMAsABFWLADLxuxAxg+WbAq3DAxAP//AKkAAAUIB0ICJgAsAAABBwCdAPEBQgAUALAARViwBy8bsQccPlmxEAb0MDH//wCMAAAD3wdBAiYATAAAAQcAnQAdAUEACQCwES+wFNwwMQD///+3AAACegcuAiYALQAAAQcApP88AUYAFACwAEVYsAMvG7EDHD5ZsQcE9DAx////nQAAAmAF6gImAIwAAAEHAKT/IgACABQAsABFWLADLxuxAxg+WbEHAfQwMf///7YAAAKABvoCJgAtAAABBwBw/z4BSgATALAARViwAi8bsQIcPlmwBdwwMQD///+cAAACZgW2AiYAjAAAAQcAcP8kAAYAEwCwAEVYsAIvG7ECGD5ZsAXcMDEA////7AAAAkMHGgImAC0AAAEHAKD/awFDABMAsABFWLACLxuxAhw+WbAH3DAxAP///9IAAAIpBdcCJgCMAAABBwCg/1EAAAATALAARViwAi8bsQIYPlmwB9wwMQD//wAY/lgBeAWwAiYALQAAAAYAo+YJ////+/5PAWgFxAImAE0AAAAGAKPJAP//AKoAAAGFBwQCJgAtAAABBwChAB0BQgAUALAARViwAi8bsQIcPlmxCwT0MDH//wC3/+wF+QWwACYALQAAAAcALgItAAD//wCN/ksDSgXEACYATQAAAAcATgHxAAD//wA1/+wEggc1AiYALgAAAQcAnQF8ATUAFACwAEVYsAAvG7EAHD5ZsRQG9DAx////tP5LAjkF2AImAJsAAAEHAJ3/M//YABQAsABFWLANLxuxDRg+WbESBPQwMf//AKn9/wUFBbACJgAvAAAABwGiAZT+oP//AI39/wQMBgACJgBPAAAABwGiARH+oP//AKEAAAQcBy8CJgAwAAABBwB1ACYBMQAUALAARViwBS8bsQUcPlmxCAj0MDH//wCTAAACNAeUAiYAUAAAAQcAdQAYAZYAFACwAEVYsAMvG7EDHj5ZsQYJ9DAx//8Aqf3/BBwFsAImADAAAAAHAaIBbP6g//8AV/3/AVUGAAImAFAAAAAHAaL/+/6g//8AqQAABBwFsQImADAAAAEHAaIB1QTCABAAsABFWLAKLxuxChw+WTAx//8AnAAAAq0GAgAmAFAAAAEHAaIBVgUTAFAAsh8IAV2ynwgBXbQfCC8IAnGyrwgBcbQvCD8IAnKy3wgBcrZfCG8IfwgDcrTPCN8IAnGyTwgBcbLPCAFdtE8IXwgCXbJgCAFdsvAIAXIwMf//AKkAAAQcBbACJgAwAAAABwChAbz9xf//AJwAAAKgBgAAJgBQAAAABwChATj9tv//AKkAAAUIBzQCJgAyAAABBwB1AfUBNgAUALAARViwCC8bsQgcPlmxDAj0MDH//wCMAAAD3wX+AiYAUgAAAQcAdQFbAAAAFACwAEVYsAMvG7EDGD5ZsRQJ9DAx//8Aqf3/BQgFsAImADIAAAAHAaIB0P6g//8AjP3/A98ETgImAFIAAAAHAaIBM/6g//8AqQAABQgHNgImADIAAAEHAJ4BFQE3ABQAsABFWLAGLxuxBhw+WbEPBvQwMf//AIwAAAPfBgACJgBSAAABBgCeewEAFACwAEVYsAMvG7EDGD5ZsRYB9DAx////vAAAA98GBAImAFIAAAEHAaL/YAUVAAYAsBcvMDH//wB2/+wFCQbwAiYAMwAAAQcAcADpAUAAEwCwAEVYsA0vG7ENHD5ZsCHcMDEA//8AW//sBDQFuAImAFMAAAEGAHBmCAATALAARViwBC8bsQQYPlmwHdwwMQD//wB2/+wFCQcQAiYAMwAAAQcAoAEWATkAEwCwAEVYsA0vG7ENHD5ZsCLcMDEA//8AW//sBDQF2AImAFMAAAEHAKAAkwABABMAsABFWLAELxuxBBg+WbAf3DAxAP//AHb/7AUJBzcCJgAzAAABBwClAWsBOAAXALAARViwDS8bsQ0cPlmxJgj0sCLQMDEA//8AW//sBDQF/wImAFMAAAEHAKUA6AAAABcAsABFWLAELxuxBBg+WbEiCfSwHtAwMQD//wCoAAAEyQc0AiYANgAAAQcAdQGAATYAFACwAEVYsAQvG7EEHD5ZsRoI9DAx//8AjAAAAtIF/gImAFYAAAEHAHUAtgAAABQAsABFWLALLxuxCxg+WbEQCfQwMf//AKj9/wTJBbACJgA2AAAABwGiAWP+oP//AFP9/wKXBE4CJgBWAAAABwGi//f+oP//AKgAAATJBzYCJgA2AAABBwCeAKABNwAUALAARViwBC8bsQQcPlmxHQb0MDH//wBjAAACzQYAAiYAVgAAAQYAntcBABQAsABFWLALLxuxCxg+WbESAfQwMf//AFD/7ARyBzYCJgA3AAABBwB1AY0BOAAUALAARViwBi8bsQYcPlmxKQj0MDH//wBf/+wDuwX+AiYAVwAAAQcAdQFRAAAAFACwAEVYsAkvG7EJGD5ZsSkJ9DAx//8AUP/sBHIHOAImADcAAAEHAJ0AlwE4ABQAsABFWLAGLxuxBhw+WbEpBvQwMf//AF//7AO7BgACJgBXAAABBgCdWwAAFACwAEVYsAkvG7EJGD5ZsSkB9DAx//8AUP5NBHIFxAImADcAAAAHAHkBnwAA//8AX/5FA7sETgImAFcAAAAHAHkBXf/4//8AUP3/BHIFxAImADcAAAAHAaIBdf6g//8AX/3/A7sETgImAFcAAAAHAaIBM/6g//8AUP/sBHIHOAImADcAAAEHAJ4ArQE5ABQAsABFWLAGLxuxBhw+WbErBvQwMf//AF//7AO7BgACJgBXAAABBgCecQEAFACwAEVYsAkvG7EJGD5ZsSsB9DAx//8AMf3/BJcFsAImADgAAAAHAaIBZv6g//8ACf3/AlYFQAImAFgAAAAHAaIAxf6g//8AMf5NBJcFsAImADgAAAAHAHkBkAAA//8ACf5NApkFQAImAFgAAAAHAHkA7wAA//8AMQAABJcHNgImADgAAAEHAJ4AogE3ABQAsABFWLAGLxuxBhw+WbENBvQwMf//AAn/7ALsBnkAJgBYAAAABwGiAZUFiv//AIz/7ASqByICJgA5AAABBwCkAMABOgAUALAARViwEi8bsRIcPlmxFgT0MDH//wCI/+wD3AXsAiYAWQAAAQYApFwEABQAsABFWLANLxuxDRg+WbEUAfQwMf//AIz/7ASqBu4CJgA5AAABBwBwAMIBPgATALAARViwEi8bsRIcPlmwE9wwMQD//wCI/+wD3AW4AiYAWQAAAQYAcF4IABMAsABFWLAHLxuxBxg+WbAS3DAxAP//AIz/7ASqBw4CJgA5AAABBwCgAO8BNwATALAARViwCi8bsQocPlmwFtwwMQD//wCI/+wD3AXYAiYAWQAAAQcAoACLAAEAEwCwAEVYsAcvG7EHGD5ZsBTcMDEA//8AjP/sBKoHkQImADkAAAEHAKIBSwFBABcAsABFWLAKLxuxChw+WbEWBvSwINAwMQD//wCI/+wD3AZbAiYAWQAAAQcAogDnAAsAFwCwAEVYsAcvG7EHGD5ZsRQE9LAe0DAxAP//AIz/7ASqBzUCJgA5AAABBwClAUQBNgAXALAARViwEi8bsRIcPlmxFQj0sBnQMDEA//8AiP/sBAwF/wImAFkAAAEHAKUA4AAAABcAsABFWLANLxuxDRg+WbETCfSwF9AwMQAAAQCM/nsEqgWwACAAUwCwAEVYsBgvG7EYHD5ZsABFWLANLxuxDRI+WbAARViwEy8bsRMQPlmwGBCwINCyBBMgERI5sA0QsggDCitYIdgb9FmwExCyHAEKK1gh2Bv0WTAxAREGBgcGFRQzMjcXBiMiJjU0NwciACcRMxEUFjMyNjURBKoBioObTjA0DUZaWWdPFu/+5AK+rqGjrQWw/CGU4jtyYEgaeSxoVmFTAQEC4gPg/Caer66eA9sAAQCI/k8D5gQ6AB8AbQCwAEVYsBcvG7EXGD5ZsABFWLAdLxuxHRg+WbAARViwHy8bsR8QPlmwAEVYsBIvG7ESED5ZsABFWLAKLxuxChI+WbIFAworWCHYG/RZsB8QsA/QsA8vshASHRESObASELIaAQorWCHYG/RZMDEhBwYVFDMyNxcGIyImNTQ3JwYjIiYnETMRFDMyNxEzEQPSOnFOMDQNRlpZZ6YEbNGttQG5yNRGuS1bVkgaeSxoVo9qZX/JxQLA/UX2ngMT+8b//wA9AAAG7Qc2AiYAOwAAAQcAnQHFATYAFACwAEVYsAMvG7EDHD5ZsRcG9DAx//8AKwAABdMGAAImAFsAAAEHAJ0BJAAAABQAsABFWLAMLxuxDBg+WbEPAfQwMf//AA8AAAS7BzYCJgA9AAABBwCdAJIBNgAUALAARViwAS8bsQEcPlmxCwb0MDH//wAW/ksDsAYAAiYAXQAAAQYAnSUAABQAsABFWLAPLxuxDxg+WbEUAfQwMf//AA8AAAS7BvsCJgA9AAABBwBqAMIBNgAXALAARViwCC8bsQgcPlmxEAT0sBnQMDEA//8AVgAABHoHNAImAD4AAAEHAHUBhwE2ABQAsABFWLAHLxuxBxw+WbEMCPQwMf//AFgAAAOzBf4CJgBeAAABBwB1ASEAAAAUALAARViwBy8bsQcYPlmxDAn0MDH//wBWAAAEegb4AiYAPgAAAQcAoQFvATYAFACwAEVYsAcvG7EHHD5ZsREE9DAx//8AWAAAA7MFwgImAF4AAAEHAKEBCQAAABQAsABFWLAHLxuxBxg+WbERAfQwMf//AFYAAAR6BzYCJgA+AAABBwCeAKcBNwAUALAARViwBy8bsQccPlmxDwb0MDH//wBYAAADswYAAiYAXgAAAQYAnkEBABQAsABFWLAHLxuxBxg+WbEPAfQwMf////IAAAdXB0ACJgCBAAABBwB1AskBQgAUALAARViwBi8bsQYcPlmxFQj0MDH//wBO/+wGfAX/AiYAhgAAAQcAdQJ6AAEAFACwAEVYsB0vG7EdGD5ZsUAJ9DAx//8Adv+jBR0HfgImAIMAAAEHAHUB6QGAABQAsABFWLAQLxuxEBw+WbEsCPQwMf//AFv/egQ0Bf4CJgCJAAABBwB1ATcAAAAUALAARViwBC8bsQQYPlmxKQn0MDH///++AAAEHwSNAiYBvQAAAQcB3v8v/3gALACyHxgBcbTfGO8YAnG0HxgvGAJdsh8YAXKyTxgBcbTvGP8YAl2yXxgBXTAx////vgAABB8EjQImAb0AAAEHAd7/L/94ADYAtO8X/xcCXbJPFwFxsh8XAXKy3xcBcrJvFwFytN8X7xcCcbIfFwFxsl8XAV20HxcvFwJdMDH//wAoAAAD/QSNAiYBzQAAAQYB3kXgAA0AsgMKAV2ysAoBXTAxAP//ABMAAARwBhwCJgG6AAABBwBEANUAHgAUALAARViwBC8bsQQaPlmxDAb0MDH//wATAAAEcAYcAiYBugAAAQcAdQFkAB4AFACwAEVYsAUvG7EFGj5ZsQ0G9DAx//8AEwAABHAGHgImAboAAAEGAJ1uHgAUALAARViwBC8bsQQaPlmxDwT0MDH//wATAAAEcAYKAiYBugAAAQYApGoiABQAsABFWLAFLxuxBRo+WbEOAvQwMf//ABMAAARwBeMCJgG6AAABBwBqAJ4AHgAXALAARViwBC8bsQQaPlmxEgL0sBvQMDEA//8AEwAABHAGeQImAboAAAEHAKIA9QApABcAsABFWLAELxuxBBo+WbEOBvSwGNAwMQD//wATAAAEcAZ8AiYBugAAAAcB3wD/AAr//wBg/koEMASdAiYBvAAAAAcAeQF0//3//wCKAAADrgYcAiYBvgAAAQcARACoAB4AFACwAEVYsAYvG7EGGj5ZsQ0G9DAx//8AigAAA64GHAImAb4AAAEHAHUBNwAeABQAsABFWLAHLxuxBxo+WbEOBvQwMf//AIoAAAOuBh4CJgG+AAABBgCdQR4AFACwAEVYsAYvG7EGGj5ZsRAE9DAx//8AigAAA64F4wImAb4AAAEGAGpxHgAXALAARViwBi8bsQYaPlmxEwL0sBzQMDEA////vgAAAV8GHAImAcIAAAEGAESFHgAUALAARViwAi8bsQIaPlmxBQb0MDH//wCOAAACLwYcAiYBwgAAAQYAdRMeABQAsABFWLADLxuxAxo+WbEGBvQwMf///8cAAAIkBh4CJgHCAAABBwCd/x4AHgAUALAARViwAi8bsQIaPlmxCAT0MDH///+0AAACPQXjAiYBwgAAAQcAav9OAB4AFwCwAEVYsAIvG7ECGj5ZsQsC9LAU0DAxAP//AIoAAARYBgoCJgHHAAABBwCkAJUAIgAUALAARViwBi8bsQYaPlmxDQL0MDH//wBg//AEWgYcAiYByAAAAQcARADuAB4AFACwAEVYsAovG7EKGj5ZsR0G9DAx//8AYP/wBFoGHAImAcgAAAEHAHUBfQAeABQAsABFWLAKLxuxCho+WbEeBvQwMf//AGD/8ARaBh4CJgHIAAABBwCdAIcAHgAUALAARViwCi8bsQoaPlmxIAT0MDH//wBg//AEWgYKAiYByAAAAQcApACDACIAFACwAEVYsAovG7EKGj5ZsR8C9DAx//8AYP/wBFoF4wImAcgAAAEHAGoAtwAeABcAsABFWLAKLxuxCho+WbEjAvSwLNAwMQD//wB0//AECgYcAiYBzgAAAQcARADPAB4AFACwAEVYsAkvG7EJGj5ZsRMG9DAx//8AdP/wBAoGHAImAc4AAAEHAHUBXgAeABQAsABFWLARLxuxERo+WbEUBvQwMf//AHT/8AQKBh4CJgHOAAABBgCdaB4AFACwAEVYsAkvG7EJGj5ZsRYE9DAx//8AdP/wBAoF4wImAc4AAAEHAGoAmAAeABcAsABFWLAJLxuxCRo+WbEZAvSwItAwMQD//wANAAAEHAYcAiYB0gAAAQcAdQEzAB4AFACwAEVYsAEvG7EBGj5ZsQsG9DAx//8AEwAABHAF1gImAboAAAEGAHBsJgATALAARViwBC8bsQQaPlmwDNwwMQD//wATAAAEcAX2AiYBugAAAQcAoACZAB8AFACwAEVYsAQvG7EEGj5ZsQ4I9DAxAAIAE/5PBHAEjQAWABkAZwCwAEVYsAAvG7EAGj5ZsABFWLAULxuxFBA+WbAARViwAS8bsQEQPlmwAEVYsAwvG7EMEj5ZsgcDCitYIdgb9FmwARCwEdCwES+yFxQAERI5sBcvshMBCitYIdgb9FmyGQAUERI5MDEBASMHBhUUMzI3FwYjIiY1NDcDIQMjAQMhAwKYAdgmOnFOMDQNRlpZZ7Bo/fhuvQHfeAGRxwSN+3MtW1ZIGnksaFaUbAEK/ukEjf0hAf0A//8AYP/wBDAGHAImAbwAAAEHAHUBaQAeABQAsABFWLALLxuxCxo+WbEfBvQwMf//AGD/8AQwBh4CJgG8AAABBgCdcx4AFACwAEVYsAsvG7ELGj5ZsSEE9DAx//8AYP/wBDAF4AImAbwAAAEHAKEBUQAeABQAsABFWLALLxuxCxo+WbEjAvQwMf//AGD/8AQwBh4CJgG8AAABBwCeAIkAHwAUALAARViwCy8bsQsaPlmxIQb0MDH//wCKAAAEHwYeAiYBvQAAAQYAnjIfABQAsABFWLABLxuxARo+WbEaBvQwMf//AIoAAAOuBdYCJgG+AAABBgBwPyYAEwCwAEVYsAYvG7EGGj5ZsA3cMDEA//8AigAAA64F9gImAb4AAAEGAKBsHwAUALAARViwBi8bsQYaPlmxDwj0MDH//wCKAAADrgXgAiYBvgAAAQcAoQEfAB4AFACwAEVYsAYvG7EGGj5ZsRMC9DAxAAEAiv5PA64EjQAbAHgAsABFWLAWLxuxFho+WbAARViwFC8bsRQQPlmwAEVYsA8vG7EPEj5ZsBQQsBvQsBsvsh8bAV2y3xsBXbIAAQorWCHYG/RZsBQQsgIBCitYIdgb9FmwFBCwBdCwDxCyCgMKK1gh2Bv0WbAWELIZAQorWCHYG/RZMDEBIREhFSMHBhUUMzI3FwYjIiY1NDchESEVIREhA1f97AJrPTpxTjA0DUZaWWeb/coDHv2bAhQCDv6Jly1bVkgaeSxoVoppBI2Z/rIA//8AigAAA64GHgImAb4AAAEGAJ5XHwAUALAARViwBi8bsQYaPlmxEQb0MDH//wBj//AENQYeAiYBwAAAAQYAnXEeABQAsABFWLAKLxuxCho+WbEgBPQwMf//AGP/8AQ1BfYCJgHAAAABBwCgAJwAHwAUALAARViwCi8bsQoaPlmxIAj0MDH//wBj//AENQXgAiYBwAAAAQcAoQFPAB4AFACwAEVYsAovG7EKGj5ZsSUC9DAx//8AY/38BDUEnQImAcAAAAAHAaIBT/6d//8AigAABFgGHgImAcEAAAEHAJ0AkAAeABQAsABFWLAHLxuxBxo+WbEQBPQwMf///5UAAAJYBgoCJgHCAAABBwCk/xoAIgAUALAARViwAy8bsQMaPlmxBwL0MDH///+UAAACXgXWAiYBwgAAAQcAcP8cACYAEwCwAEVYsAIvG7ECGj5ZsAXcMDEA////ygAAAiEF9gImAcIAAAEHAKD/SQAfABQAsABFWLACLxuxAho+WbEHCPQwMf//AAb+TwFmBI0CJgHCAAAABgCj1AD//wCJAAABZAXgAiYBwgAAAQYAofweABQAsABFWLACLxuxAho+WbELAvQwMf//ACv/8AQNBh4CJgHDAAABBwCdAQcAHgAUALAARViwAC8bsQAaPlmxFAT0MDH//wCK/fwEVwSNAiYBxAAAAAcBogEU/p3//wCCAAADiwYcAiYBxQAAAQYAdQceABQAsABFWLAFLxuxBRo+WbEIBvQwMf//AIr9/AOLBI0CJgHFAAAABwGiARD+nf//AIoAAAOLBI4CJgHFAAABBwGiAX4DnwAQALAARViwCi8bsQoaPlkwMf//AIoAAAOLBI0CJgHFAAAABwChAWb9N///AIoAAARYBhwCJgHHAAABBwB1AY8AHgAUALAARViwCC8bsQgaPlmxDAb0MDH//wCK/fwEWASNAiYBxwAAAAcBogFs/p3//wCKAAAEWAYeAiYBxwAAAQcAngCvAB8AFACwAEVYsAYvG7EGGj5ZsQ8G9DAx//8AYP/wBFoF1gImAcgAAAEHAHAAhQAmABMAsABFWLAKLxuxCho+WbAd3DAxAP//AGD/8ARaBfYCJgHIAAABBwCgALIAHwAUALAARViwCi8bsQoaPlmxHwj0MDH//wBg//AEWgYdAiYByAAAAQcApQEHAB4AFwCwAEVYsAovG7EKGj5ZsR4G9LAi0DAxAP//AIoAAAQlBhwCJgHLAAABBwB1AScAHgAUALAARViwBS8bsQUaPlmxGQb0MDH//wCK/fwEJQSNAiYBywAAAAcBogEN/p3//wCKAAAEJQYeAiYBywAAAQYAnkcfABQAsABFWLAELxuxBBo+WbEcBvQwMf//AEP/8APdBhwCJgHMAAABBwB1AT4AHgAUALAARViwCS8bsQkaPlmxKAb0MDH//wBD//AD3QYeAiYBzAAAAQYAnUgeABQAsABFWLAJLxuxCRo+WbEqBPQwMf//AEP+TQPdBJ0CJgHMAAAABwB5AVMAAP//AEP/8APdBh4CJgHMAAABBgCeXh8AFACwAEVYsAkvG7EJGj5ZsSoG9DAx//8AKP38A/0EjQImAc0AAAAHAaIBFP6d//8AKAAAA/0GHgImAc0AAAEGAJ5RHwAUALAARViwBi8bsQYaPlmxDQb0MDH//wAo/k8D/QSNAiYBzQAAAAcAeQE+AAL//wB0//AECgYKAiYBzgAAAQYApGQiABQAsABFWLARLxuxERo+WbEVAvQwMf//AHT/8AQKBdYCJgHOAAABBgBwZiYAEwCwAEVYsAkvG7EJGj5ZsBPcMDEA//8AdP/wBAoF9gImAc4AAAEHAKAAkwAfABQAsABFWLAJLxuxCRo+WbEVCPQwMf//AHT/8AQKBnkCJgHOAAABBwCiAO8AKQAXALAARViwCS8bsQkaPlmxFQb0sB/QMDEA//8AdP/wBBQGHQImAc4AAAEHAKUA6AAeABcAsABFWLARLxuxERo+WbEUBvSwGNAwMQAAAQB0/nQECgSNACAAUwCwAEVYsBgvG7EYGj5ZsABFWLAOLxuxDhI+WbAARViwEy8bsRMQPlmwGBCwINCyBRMgERI5sA4QsgkDCitYIdgb9FmwExCyHAEKK1gh2Bv0WTAxAREUBgcHBhUUMzI3FwYjIiY1NDciJicRMxEUFjMyNjURBAp4bzJsTjA0DUZaWWdazfkEt4+Fg48EjfzzerowKFtSSBp5LGhWaFbOuAMX/PR5gX97AwwA//8AMQAABfEGHgImAdAAAAEHAJ0BOwAeABQAsABFWLADLxuxAxo+WbEXBPQwMf//AA0AAAQcBh4CJgHSAAABBgCdPR4AFACwAEVYsAgvG7EIGj5ZsQ0E9DAx//8ADQAABBwF4wImAdIAAAEGAGptHgAXALAARViwCC8bsQgaPlmxEAL0sBnQMDEA//8ARwAAA+AGHAImAdMAAAEHAHUBMwAeABQAsABFWLAILxuxCBo+WbEMBvQwMf//AEcAAAPgBeACJgHTAAABBwChARsAHgAUALAARViwBy8bsQcaPlmxEQL0MDH//wBHAAAD4AYeAiYB0wAAAQYAnlMfABQAsABFWLAHLxuxBxo+WbEPBvQwMf//ABwAAAUdBj8CJgAlAAAABgCtBAD////wAAAEqgY/ACYAKWQAAAcArf85AAD////+AAAFbAZBACYALGQAAAcArf9HAAL//wAEAAAB2wZAACYALWQAAAcArf9NAAH////6/+wFHQY/ACYAMxQAAAcArf9DAAD///94AAAFHwY/ACYAPWQAAAcArf7BAAD////9AAAE3wY/ACYAuRQAAAcArf9GAAD///+b//QCrQZ0AiYAwgAAAQcArv8q/+wAHQCwAEVYsAwvG7EMGD5ZsRgB9LAP0LAYELAh0DAxAP//ABwAAAUdBbACBgAlAAD//wCpAAAEiAWwAgYAJgAA//8AqQAABEYFsAIGACkAAP//AFYAAAR6BbACBgA+AAD//wCpAAAFCAWwAgYALAAA//8AtwAAAXcFsAIGAC0AAP//AKkAAAUFBbACBgAvAAD//wCpAAAGUgWwAgYAMQAA//8AqQAABQgFsAIGADIAAP//AHb/7AUJBcQCBgAzAAD//wCpAAAEwAWwAgYANAAA//8AMQAABJcFsAIGADgAAP//AA8AAAS7BbACBgA9AAD//wA5AAAEzgWwAgYAPAAA////1gAAAl8HBwImAC0AAAEHAGr/cAFCABcAsABFWLACLxuxAhw+WbELBPSwFNAwMQD//wAPAAAEuwb7AiYAPQAAAQcAagDCATYAFwCwAEVYsAgvG7EIHD5ZsRAE9LAZ0DAxAP//AGT/6wR3BjoCJgC6AAABBwCtAXX/+wAUALAARViwEy8bsRMYPlmxJAH0MDH//wBj/+wD7AY5AiYAvgAAAQcArQEr//oAFACwAEVYsBUvG7EVGD5ZsSgB9DAx//8Akf5hA/AGOgImAMAAAAEHAK0BRv/7ABQAsABFWLADLxuxAxg+WbEVAfQwMf//AMP/9AJLBiUCJgDCAAABBgCtKuYAFACwAEVYsAwvG7EMGD5ZsQ8B9DAx//8Aj//sA/YGdAImAMoAAAEGAK4h7AAdALAARViwAC8bsQAYPlmxHQH0sBXQsB0QsCfQMDEA//8AmgAABD8EOgIGAI0AAP//AFv/7AQ0BE4CBgBTAAD//wCa/mAD7gQ6AgYAdgAA//8AIQAAA7oEOgIGAFoAAP//ACkAAAPKBDoCBgBcAAD////m//QCbwWxAiYAwgAAAQYAaoDsABcAsABFWLAMLxuxDBg+WbEUAfSwHdAwMQD//wCP/+wD9gWxAiYAygAAAQYAanfsABcAsABFWLAALxuxABg+WbEaAfSwI9AwMQD//wBb/+wENAY6AiYAUwAAAQcArQFD//sAFACwAEVYsAQvG7EEGD5ZsR4B9DAx//8Aj//sA/YGJQImAMoAAAEHAK0BIv/mABQAsABFWLAALxuxABg+WbEVAfQwMf//AHr/7AYZBiICJgDNAAABBwCtAlP/4wAUALAARViwAC8bsQAYPlmxJgH0MDH//wCpAAAERgcHAiYAKQAAAQcAagDEAUIAFwCwAEVYsAYvG7EGHD5ZsRME9LAc0DAxAP//ALEAAAQwB0ACJgCwAAABBwB1AZABQgAUALAARViwBC8bsQQcPlmxCAj0MDEAAQBQ/+wEcgXEACYAYbIAJygREjkAsABFWLAGLxuxBhw+WbAARViwGi8bsRoQPlmwBhCwC9CwBhCyDgEKK1gh2Bv0WbImGgYREjmwJhCyFAEKK1gh2Bv0WbAaELAf0LAaELIiAQorWCHYG/RZMDEBJiY1NCQzMhYWFSM0JiMiBhUUFgQWFhUUBCMiJCY1MxQWMzI2NCYCVvfhARPcluuBwaiZjp+XAWvNY/7s55b+/I3Bw6OYopYCiUfPmKzhdMx5hJd9b1l7Znukb7HVc8h/hJl81nUA//8AtwAAAXcFsAIGAC0AAP///9YAAAJfBwcCJgAtAAABBwBq/3ABQgAXALAARViwAi8bsQIcPlmxCwT0sBTQMDEA//8ANf/sA8wFsAIGAC4AAP//ALIAAAUdBbACBgHjAAD//wCpAAAFBQcuAiYALwAAAQcAdQF7ATAAFACwAEVYsAUvG7EFHD5ZsQ4I9DAx//8ATf/rBMsHGgImAN0AAAEHAKAA2gFDABMAsABFWLARLxuxERw+WbAV3DAxAP//ABwAAAUdBbACBgAlAAD//wCpAAAEiAWwAgYAJgAA//8AsQAABDAFsAIGALAAAP//AKkAAARGBbACBgApAAD//wCxAAAE/wcaAiYA2wAAAQcAoAExAUMAEwCwAEVYsAgvG7EIHD5ZsA3cMDEA//8AqQAABlIFsAIGADEAAP//AKkAAAUIBbACBgAsAAD//wB2/+wFCQXEAgYAMwAA//8AsgAABQEFsAIGALUAAP//AKkAAATABbACBgA0AAD//wB3/+wE2AXEAgYAJwAA//8AMQAABJcFsAIGADgAAP//ADkAAATOBbACBgA8AAD//wBt/+wD6gROAgYARQAA//8AXf/sA/METgIGAEkAAP//AJwAAAQBBcQCJgDvAAABBwCgAKL/7QATALAARViwCC8bsQgYPlmwDdwwMQD//wBb/+wENAROAgYAUwAA//8AjP5gBB4ETgIGAFQAAAABAFz/7APsBE4AHQBJshAeHxESOQCwAEVYsBAvG7EQGD5ZsABFWLAILxuxCBA+WbIAAQorWCHYG/RZsAgQsAPQsBAQsBTQsBAQshcBCitYIdgb9FkwMSUyNjczDgIjIgARNTQ2NjMyFhcjJiYjIgYVFRQWAj5jlAivBXbFbt3++3TZlLbxCK8Ij2mNm5qDeFpdqGQBJwEAH572iNquaYfLwCO7ygD//wAW/ksDsAQ6AgYAXQAA//8AKQAAA8oEOgIGAFwAAP//AF3/7APzBcUCJgBJAAABBwBqAI4AAAAXALAARViwCC8bsQgYPlmxJQH0sC7QMDEA//8AmgAAA0cF6gImAOsAAAEHAHUAzf/sABQAsABFWLAELxuxBBg+WbEICfQwMf//AF//7AO7BE4CBgBXAAD//wCNAAABaAXEAgYATQAA////vAAAAkUFxAImAIwAAAEHAGr/Vv//ABcAsABFWLACLxuxAhg+WbELAfSwFNAwMQD///+//ksBWQXEAgYATgAA//8AnAAABD8F6QImAPAAAAEHAHUBO//rABQAsABFWLAELxuxBBg+WbEPCfQwMf//ABb+SwOwBdgCJgBdAAABBgCgUAEAEwCwAEVYsA8vG7EPGD5ZsBPcMDEA//8APQAABu0HNAImADsAAAEHAEQCLAE2ABQAsABFWLADLxuxAxw+WbEUCPQwMf//ACsAAAXTBf4CJgBbAAABBwBEAYsAAAAUALAARViwCy8bsQsYPlmxDgn0MDH//wA9AAAG7Qc0AiYAOwAAAQcAdQK7ATYAFACwAEVYsAQvG7EEHD5ZsRUI9DAx//8AKwAABdMF/gImAFsAAAEHAHUCGgAAABQAsABFWLAMLxuxDBg+WbEPCfQwMf//AD0AAAbtBvsCJgA7AAABBwBqAfUBNgAXALAARViwAy8bsQMcPlmxGgT0sCPQMDEA//8AKwAABdMFxQImAFsAAAEHAGoBVAAAABcAsABFWLALLxuxCxg+WbEUAfSwHdAwMQD//wAPAAAEuwc0AiYAPQAAAQcARAD5ATYAFACwAEVYsAgvG7EIHD5ZsQoI9DAx//8AFv5LA7AF/gImAF0AAAEHAEQAjAAAABQAsABFWLAPLxuxDxg+WbERCfQwMf//AGcEIQD9BgACBgALAAD//wCIBBICIwYAAgYABgAA//8AoP/1A4oFsAAmAAUAAAAHAAUCDwAA////tP5LAj8F2AImAJsAAAEHAJ7/Sf/ZABQAsABFWLANLxuxDRg+WbETAfQwMf//ADAEFgFHBgACBgFtAAD//wCpAAAGUgc0AiYAMQAAAQcAdQKZATYAFACwAEVYsAIvG7ECHD5ZsREI9DAx//8AiwAABngF/gImAFEAAAEHAHUCrQAAABQAsABFWLADLxuxAxg+WbEgCfQwMf//ABz+awUdBbACJgAlAAAABwCmAX8AAP//AG3+awPqBE4CJgBFAAAABwCmAMcAAP//AKkAAARGB0ACJgApAAABBwBEAPsBQgAUALAARViwBi8bsQYcPlmxDQj0MDH//wCxAAAE/wdAAiYA2wAAAQcARAFtAUIAFACwAEVYsAgvG7EIHD5ZsQsI9DAx//8AXf/sA/MF/gImAEkAAAEHAEQAxQAAABQAsABFWLAILxuxCBg+WbEfCfQwMf//AJwAAAQBBeoCJgDvAAABBwBEAN7/7AAUALAARViwCC8bsQgYPlmxCwn0MDH//wBaAAAFIQWwAgYAuAAA//8AX/4oBUMEOgIGAMwAAP//ABYAAATdBugCJgEYAAABBwCrBDkA+gAXALAARViwDy8bsQ8cPlmxEQj0sBXQMDEA////+wAABAsFwQImARkAAAEHAKsD1P/TABcAsABFWLARLxuxERg+WbETCfSwF9AwMQD//wBb/ksIQAROACYAUwAAAAcAXQSQAAD//wB2/ksJMAXEACYAMwAAAAcAXQWAAAD//wBQ/lEEagXEAiYA2gAAAAcBsAGc/7j//wBY/lIDrARNAiYA7gAAAAcBsAFD/7n//wB3/lEE2AXEAiYAJwAAAAcBsAHl/7j//wBc/lED7AROAiYARwAAAAcBsAFS/7j//wAPAAAEuwWwAgYAPQAA//8ALv5gA98EOgIGALwAAP//ALcAAAF3BbACBgAtAAD//wAbAAAHNQcaAiYA2QAAAQcAoAH4AUMAEwCwAEVYsA0vG7ENHD5ZsBncMDEA//8AFQAABgQFxAImAO0AAAEHAKABX//tABMAsABFWLANLxuxDRg+WbAZ3DAxAP//ALcAAAF3BbACBgAtAAD//wAcAAAFHQcOAiYAJQAAAQcAoAD0ATcAEwCwAEVYsAQvG7EEHD5ZsA7cMDEA//8Abf/sA+oF2AImAEUAAAEHAKAAmQABABMAsABFWLAXLxuxFxg+WbAs3DAxAP//ABwAAAUdBvsCJgAlAAABBwBqAPkBNgAUALAARViwBC8bsQQcPlmxEgT0MDH//wBt/+wD6gXFAiYARQAAAQcAagCeAAAAFwCwAEVYsBcvG7EXGD5ZsTAB9LA50DAxAP////IAAAdXBbACBgCBAAD//wBO/+wGfAROAgYAhgAA//8AqQAABEYHGgImACkAAAEHAKAAvwFDABMAsABFWLAGLxuxBhw+WbAP3DAxAP//AF3/7APzBdgCJgBJAAABBwCgAIkAAQATALAARViwCC8bsQgYPlmwIdwwMQD//wBd/+wFEgbZAiYBRQAAAQcAagDTARQAFwCwAEVYsAAvG7EAHD5ZsScE9LAw0DAxAP//AGL/7APpBE8CBgCcAAD//wBi/+wD6QXGAiYAnAAAAQcAagCHAAEAFwCwAEVYsAAvG7EAGD5ZsSQB9LAt0DAxAP//ABsAAAc1BwcCJgDZAAABBwBqAf0BQgAXALAARViwDS8bsQ0cPlmxHQT0sCbQMDEA//8AFQAABgQFsQImAO0AAAEHAGoBZP/sABcAsABFWLANLxuxDRg+WbEdAfSwJtAwMQD//wBQ/+wEagccAiYA2gAAAQcAagC3AVcAFwCwAEVYsAsvG7ELHD5ZsTAE9LA50DAxAP//AFj/7QOsBcUCJgDuAAABBgBqXgAAFwCwAEVYsAovG7EKGD5ZsS4B9LA30DAxAP//ALEAAAT/BvoCJgDbAAABBwBwAQQBSgATALAARViwCC8bsQgcPlmwC9wwMQD//wCcAAAEAQWkAiYA7wAAAQYAcHX0ABMAsABFWLAHLxuxBxg+WbAL3DAxAP//ALEAAAT/BwcCJgDbAAABBwBqATYBQgAXALAARViwCC8bsQgcPlmxEQT0sBrQMDEA//8AnAAABAEFsQImAO8AAAEHAGoAp//sABcAsABFWLAILxuxCBg+WbERAfSwGtAwMQD//wB2/+wFCQb9AiYAMwAAAQcAagEbATgAFwCwAEVYsA0vG7ENHD5ZsScE9LAw0DAxAP//AFv/7AQ0BcUCJgBTAAABBwBqAJgAAAAXALAARViwBC8bsQQYPlmxIwH0sCzQMDEA//8AZ//sBPoFxAIGARYAAP//AFv/7AQ0BE4CBgEXAAD//wBn/+wE+gcCAiYBFgAAAQcAagEOAT0AFwCwAEVYsA0vG7ENHD5ZsScE9LAw0DAxAP//AFv/7AQ0BccCJgEXAAABBwBqAIgAAgAXALAARViwBC8bsQQYPlmxJAH0sC3QMDEA//8Ak//sBPQHHQImAOYAAAEHAGoBDQFYABcAsABFWLATLxuxExw+WbEnBPSwMNAwMQD//wBk/+wD4AXFAiYA/gAAAQYAanwAABcAsABFWLAILxuxCBg+WbEnAfSwMNAwMQD//wBN/+sEywb6AiYA3QAAAQcAcACtAUoAEwCwAEVYsBEvG7ERHD5ZsBPcMDEA//8AFv5LA7AFuAImAF0AAAEGAHAjCAATALAARViwDi8bsQ4YPlmwEdwwMQD//wBN/+sEywcHAiYA3QAAAQcAagDfAUIAFwCwAEVYsBEvG7ERHD5ZsRkE9LAi0DAxAP//ABb+SwOwBcUCJgBdAAABBgBqVQAAFwCwAEVYsA8vG7EPGD5ZsRcB9LAg0DAxAP//AE3/6wTLB0ECJgDdAAABBwClAS8BQgAXALAARViwAS8bsQEcPlmxFAj0sBjQMDEA//8AFv5LA9EF/wImAF0AAAEHAKUApQAAABcAsABFWLAPLxuxDxg+WbEWCfSwEtAwMQD//wCWAAAEyAcHAiYA4AAAAQcAagEJAUIAFwCwAEVYsAsvG7ELHD5ZsRoE9LAj0DAxAP//AGcAAAO9BbECJgD4AAABBgBqZOwAFwCwAEVYsAkvG7EJGD5ZsRgB9LAh0DAxAP//ALIAAAYwBwcAJgDlDwAAJwAtBLkAAAEHAGoB0wFCABcAsABFWLAKLxuxChw+WbEfBPSwKNAwMQD//wCdAAAFfwWxACYA/QAAACcAjAQqAAABBwBqAW3/7AAXALAARViwCi8bsQoYPlmxHwH0sCjQMDEA//8AOf5LBQ4FsAImADwAAAAHAa8DpwAA//8AKf5LBBwEOgImAFwAAAAHAa8CtQAA//8AX//sA/AGAAIGAEgAAP//AC/+SwWsBbACJgDcAAAABwGvBEUAAP//ACz+SwS7BDoCJgDxAAAABwGvA1QAAP//ABz+ogUdBbACJgAlAAAABwCsBQIAAP//AG3+ogPqBE4CJgBFAAAABwCsBEoAAP//ABwAAAUdB7oCJgAlAAABBwCqBO4BRgAUALAARViwBC8bsQQcPlmxCwj0MDH//wBt/+wD6gaEAiYARQAAAQcAqgSTABAAFACwAEVYsBcvG7EXGD5ZsSkB9DAx//8AHAAABR0HwwImACUAAAEHAbcAwwEuABcAsABFWLAFLxuxBRw+WbEODPSwFNAwMQD//wBt/+wEwAaOAiYARQAAAQYBt2j5ABcAsABFWLAXLxuxFxg+WbEsCPSwMtAwMQD//wAcAAAFHQe/AiYAJQAAAQcBtgDHAT0AFwCwAEVYsAQvG7EEHD5ZsQ4M9LAT0DAxAP///8r/7APqBokCJgBFAAABBgG2bAcAFwCwAEVYsBcvG7EXGD5ZsSwI9LAx0DAxAP//ABwAAAUdB+oCJgAlAAABBwG1AMgBGwAXALAARViwBS8bsQUcPlmxDAz0sCDQMDEA//8Abf/sBFkGtQImAEUAAAEGAbVt5gAXALAARViwFy8bsRcYPlmxKgj0sDDQMDEA//8AHAAABR0H2gImACUAAAEHAbQAxwEGABcAsABFWLAFLxuxBRw+WbEMDPSwFdAwMQD//wBt/+wD6galAiYARQAAAQYBtGzRABcAsABFWLAXLxuxFxg+WbEqCPSwM9AwMQD//wAc/qIFHQc2AiYAJQAAACcAnQDJATYBBwCsBQIAAAAUALAARViwBC8bsQQcPlmxDwb0MDH//wBt/qID6gYAAiYARQAAACYAnW4AAQcArARKAAAAFACwAEVYsBcvG7EXGD5ZsS0B9DAx//8AHAAABR0HtwImACUAAAEHAbMA6gEtABcAsABFWLAELxuxBBw+WbEOB/SwG9AwMQD//wBt/+wD6gaCAiYARQAAAQcBswCP//gAFwCwAEVYsBcvG7EXGD5ZsSwE9LA50DAxAP//ABwAAAUdB7cCJgAlAAABBwG4AOoBLQAXALAARViwBC8bsQQcPlmxDgf0sBzQMDEA//8Abf/sA+oGggImAEUAAAEHAbgAj//4ABcAsABFWLAXLxuxFxg+WbEsBPSwOtAwMQD//wAcAAAFHQhAAiYAJQAAAQcBsgDuAT0AFwCwAEVYsAQvG7EEHD5ZsQ4H9LAn0DAxAP//AG3/7APqBwoCJgBFAAABBwGyAJMABwAXALAARViwFy8bsRcYPlmxLAT0sEXQMDEA//8AHAAABR0IFQImACUAAAEHAbEA7gFFABcAsABFWLAELxuxBBw+WbEOB/SwHNAwMQD//wBt/+wD6gbfAiYARQAAAQcBsQCTAA8AFwCwAEVYsBcvG7EXGD5ZsSwE9LA60DAxAP//ABz+ogUdBw4CJgAlAAAAJwCgAPQBNwEHAKwFAgAAABMAsABFWLAELxuxBBw+WbAO3DAxAP//AG3+ogPqBdgCJgBFAAAAJwCgAJkAAQEHAKwESgAAABMAsABFWLAXLxuxFxg+WbAs3DAxAP//AKn+ogRGBbACJgApAAAABwCsBMAAAP//AF3+ogPzBE4CJgBJAAAABwCsBIwAAP//AKkAAARGB8YCJgApAAABBwCqBLkBUgAUALAARViwBi8bsQYcPlmxDAj0MDH//wBd/+wD8waEAiYASQAAAQcAqgSDABAAFACwAEVYsAgvG7EIGD5ZsR4B9DAx//8AqQAABEYHLgImACkAAAEHAKQAkAFGABQAsABFWLAGLxuxBhw+WbEPBPQwMf//AF3/7APzBewCJgBJAAABBgCkWgQAFACwAEVYsAgvG7EIGD5ZsSEB9DAx//8AqQAABOYHzwImACkAAAEHAbcAjgE6ABcAsABFWLAHLxuxBxw+WbEPDPSwFdAwMQD//wBd/+wEsAaOAiYASQAAAQYBt1j5ABcAsABFWLAILxuxCBg+WbEhCPSwJ9AwMQD////wAAAERgfLAiYAKQAAAQcBtgCSAUkAFwCwAEVYsAYvG7EGHD5ZsQ8M9LAU0DAxAP///7r/7APzBokCJgBJAAABBgG2XAcAFwCwAEVYsAgvG7EIGD5ZsSEI9LAm0DAxAP//AKkAAAR/B/YCJgApAAABBwG1AJMBJwAXALAARViwBi8bsQYcPlmxDwz0sBPQMDEA//8AXf/sBEkGtQImAEkAAAEGAbVd5gAXALAARViwCC8bsQgYPlmxHwj0sCXQMDEA//8AqQAABEYH5gImACkAAAEHAbQAkgESABcAsABFWLAGLxuxBhw+WbEPDPSwFtAwMQD//wBd/+wD8walAiYASQAAAQYBtFzRABcAsABFWLAILxuxCBg+WbEhCPSwKNAwMQD//wCp/qIERgdCAiYAKQAAACcAnQCUAUIBBwCsBMAAAAAUALAARViwBi8bsQYcPlmxEAb0MDH//wBd/qID8wYAAiYASQAAACYAnV4AAQcArASMAAAAFACwAEVYsAgvG7EIGD5ZsSAB9DAx//8AtwAAAfgHxgImAC0AAAEHAKoDZAFSABQAsABFWLACLxuxAhw+WbEECPQwMf//AJsAAAHeBoICJgCMAAABBwCqA0oADgAUALAARViwAi8bsQIYPlmxBAH0MDH//wCj/qIBfgWwAiYALQAAAAcArANrAAD//wCF/qIBaAXEAiYATQAAAAcArANNAAD//wB2/qIFCQXEAiYAMwAAAAcArAUYAAD//wBb/qIENAROAiYAUwAAAAcArASdAAD//wB2/+wFCQe8AiYAMwAAAQcAqgUQAUgAFACwAEVYsA0vG7ENHD5ZsS4I9DAx//8AW//sBDQGhAImAFMAAAEHAKoEjQAQABQAsABFWLAELxuxBBg+WbEqAfQwMf//AHb/7AU9B8UCJgAzAAABBwG3AOUBMAAXALAARViwDS8bsQ0cPlmxIwz0sCnQMDEA//8AW//sBLoGjgImAFMAAAEGAbdi+QAXALAARViwBC8bsQQYPlmxHwj0sCXQMDEA//8AR//sBQkHwQImADMAAAEHAbYA6QE/ABcAsABFWLANLxuxDRw+WbEhDPSwKNAwMQD////E/+wENAaJAiYAUwAAAQYBtmYHABcAsABFWLAELxuxBBg+WbEdCPSwJNAwMQD//wB2/+wFCQfsAiYAMwAAAQcBtQDqAR0AFwCwAEVYsA0vG7ENHD5ZsSEM9LAn0DAxAP//AFv/7ARTBrUCJgBTAAABBgG1Z+YAFwCwAEVYsAQvG7EEGD5ZsR0I9LAj0DAxAP//AHb/7AUJB9wCJgAzAAABBwG0AOkBCAAXALAARViwDS8bsQ0cPlmxIQz0sCrQMDEA//8AW//sBDQGpQImAFMAAAEGAbRm0QAXALAARViwBC8bsQQYPlmxHQj0sCbQMDEA//8Adv6iBQkHOAImADMAAAAnAJ0A6wE4AQcArAUYAAAAFACwAEVYsA0vG7ENHD5ZsSIG9DAx//8AW/6iBDQGAAImAFMAAAAmAJ1oAAEHAKwEnQAAABQAsABFWLAELxuxBBg+WbEeAfQwMf//AGX/7AWdBy8CJgCXAAABBwB1Ad0BMQAUALAARViwDS8bsQ0cPlmxKAj0MDH//wBb/+wEugX+AiYAmAAAAQcAdQFlAAAAFACwAEVYsAQvG7EEGD5ZsSYJ9DAx//8AZf/sBZ0HLwImAJcAAAEHAEQBTgExABQAsABFWLANLxuxDRw+WbEnCPQwMf//AFv/7AS6Bf4CJgCYAAABBwBEANYAAAAUALAARViwBC8bsQQYPlmxJQn0MDH//wBl/+wFnQe1AiYAlwAAAQcAqgUMAUEAFACwAEVYsA0vG7ENHD5ZsTQI9DAx//8AW//sBLoGhAImAJgAAAEHAKoElAAQABQAsABFWLAELxuxBBg+WbEyAfQwMf//AGX/7AWdBx0CJgCXAAABBwCkAOMBNQAUALAARViwDS8bsQ0cPlmxKQT0MDH//wBb/+wEugXsAiYAmAAAAQYApGsEABQAsABFWLAELxuxBBg+WbEnAfQwMf//AGX+ogWdBjcCJgCXAAAABwCsBQkAAP//AFv+ogS6BLACJgCYAAAABwCsBJsAAP//AIz+ogSqBbACJgA5AAAABwCsBO4AAP//AIj+ogPcBDoCJgBZAAAABwCsBFEAAP//AIz/7ASqB7oCJgA5AAABBwCqBOkBRgAUALAARViwCi8bsQocPlmxEwj0MDH//wCI/+wD3AaEAiYAWQAAAQcAqgSFABAAFACwAEVYsAcvG7EHGD5ZsREB9DAx//8AjP/sBh0HQAImAJkAAAEHAHUB1AFCABQAsABFWLAaLxuxGhw+WbEdCPQwMf//AIj/7AUPBeoCJgCaAAABBwB1AWP/7AAUALAARViwEy8bsRMYPlmxHAn0MDH//wCM/+wGHQdAAiYAmQAAAQcARAFFAUIAFACwAEVYsBIvG7ESHD5ZsRwI9DAx//8AiP/sBQ8F6gImAJoAAAEHAEQA1P/sABQAsABFWLANLxuxDRg+WbEbCfQwMf//AIz/7AYdB8YCJgCZAAABBwCqBQMBUgAUALAARViwGi8bsRocPlmxKQj0MDH//wCI/+wFDwZwAiYAmgAAAQcAqgSS//wAFACwAEVYsBMvG7ETGD5ZsSgB9DAx//8AjP/sBh0HLgImAJkAAAEHAKQA2gFGABQAsABFWLASLxuxEhw+WbEeBPQwMf//AIj/7AUPBdgCJgCaAAABBgCkafAAFACwAEVYsBMvG7ETGD5ZsR0B9DAx//8AjP6iBh0GAgImAJkAAAAHAKwFCQAA//8AiP6iBQ8EkAImAJoAAAAHAKwEVwAA//8AD/6iBLsFsAImAD0AAAAHAKwEuwAA//8AFv4FA7AEOgImAF0AAAAHAKwFHP9j//8ADwAABLsHugImAD0AAAEHAKoEtwFGABQAsABFWLAILxuxCBw+WbEJCPQwMf//ABb+SwOwBoQCJgBdAAABBwCqBEoAEAAUALAARViwDy8bsQ8YPlmxEAH0MDH//wAPAAAEuwciAiYAPQAAAQcApACOAToAFACwAEVYsAEvG7EBHD5ZsQwE9DAx//8AFv5LA7AF7AImAF0AAAEGAKQhBAAUALAARViwAS8bsQEYPlmxEwH0MDEAAgBf/+wErAYAABcAIgB/ALAUL7AARViwDS8bsQ0YPlmwAEVYsAMvG7EDED5ZsABFWLAGLxuxBhA+WbIPFAFdsi8UAV2yEwMUERI5sBMvshABCitYIdgb9FmwAdCyBAYNERI5sg8NBhESObATELAW0LAGELIbAQorWCHYG/RZsA0QsiABCitYIdgb9FkwMQEjESMnBiMiAjU1NBIzMhcRITUhNTMVMwEUFjMyNxEmIyIGBKy8qglvxrzt7L++b/75AQe5vPxsmIawUVOsiJgE0vsudIgBNPgO+QEvggEGl5eX/Ki40J4B8ZnSAP//AF/+zQSsBgAAJgBIAAAAJwHeAaECRwEHAEMAn/9kAAgAsi8eAV0wMf//ALL+mAVEBbACJgHjAAAABwGwBCP/////AJz+mQSBBDoCJgDwAAAABwGwA2AAAP//AKn+mQWpBbACJgAsAAAABwGwBIgAAP//AJz+mQSiBDoCJgDzAAAABwGwA4EAAP//ADH+mQSXBbACJgA4AAAABwGwAj8AAP//ACj+mQOwBDoCJgD1AAAABwGwAcYAAP//ADn+mQT4BbACJgA8AAAABwGwA9cAAP//ACn+mQQGBDoCJgBcAAAABwGwAuUAAP//AJb+mQVmBbACJgDgAAAABwGwBEUAAP//AGf+mQReBDsCJgD4AAAABwGwAz0AAP//AJb+mQTIBbACJgDgAAAABwGwAv4AAP//AGf+mQO9BDsCJgD4AAAABwGwAfUAAP//ALH+mQQwBbACJgCwAAAABwGwAO8AAP//AJr+mQNHBDoCJgDrAAAABwGwANUAAP//ABv+mQeCBbACJgDZAAAABwGwBmEAAP//ABX+mQY9BDoCJgDtAAAABwGwBRwAAP//AD/+VQW9BcMCJgE/AAAABwGwAwb/vP///97+WQRjBE4CJgFAAAAABwGwAgH/wP//AIwAAAPfBgACBgBMAAAAAv/UAAAEsQWwABIAGwBhALAARViwDy8bsQ8cPlmwAEVYsAovG7EKED5ZsgIKDxESObACL7IODwIREjmwDi+yCwEKK1gh2Bv0WbAB0LAOELAR0LACELITAQorWCHYG/RZsAoQshQBCitYIdgb9FkwMQEjFSEWBBUUBAchESM1MzUzFTMDESEyNjU0JicCUO0BauQBAP7+3/3Tz8/A7e0BX4+fmY0EUPID5MTF6gQEUJfJyf3Z/d2YgHuOAgAC/9QAAASxBbAAEgAbAGEAsABFWLAQLxuxEBw+WbAARViwCi8bsQoQPlmyAgoQERI5sAIvshECEBESObARL7IBAQorWCHYG/RZsAvQsBEQsA7QsAIQshMBCitYIdgb9FmwChCyFAEKK1gh2Bv0WTAxASMVIRYEFRQEByERIzUzNTMVMwMRITI2NTQmJwJQ7QFq5AEA/v7f/dPPz8Dt7QFfj5+ZjQRQ8gPkxMXqBARQl8nJ/dn93ZiAe44CAAEAAwAABDAFsAANAE4AsABFWLAILxuxCBw+WbAARViwAi8bsQIQPlmyDQgCERI5sA0vsnoNAV2yAAEKK1gh2Bv0WbAE0LANELAG0LAIELIKAQorWCHYG/RZMDEBIREjESM1MxEhFSERIQJ//vPBrq4Df/1CAQ0CrP1UAqyXAm2e/jEAAAH//AAAA0cEOgANAEkAsABFWLAILxuxCBg+WbAARViwAi8bsQIQPlmyDQgCERI5sA0vsgABCitYIdgb9FmwBNCwDRCwBtCwCBCyCgEKK1gh2Bv0WTAxASERIxEjNTMRIRUhESECeP7cup6eAq3+DQEkAd/+IQHflwHEmf7VAAEACwAABTEFsAAUAH4AsABFWLAILxuxCBw+WbAARViwEC8bsRAcPlmwAEVYsAIvG7ECED5ZsABFWLATLxuxExA+WbIOCAIREjmwDi+yLw4BXbLPDgFdsgEBCitYIdgb9FmyBwgCERI5sAcvsgQBCitYIdgb9FmwBxCwCtCwBBCwDNCyEgEOERI5MDEBIxEjESM1MzUzFSEVIREzATMBASMCN7HAu7vAAQH+/5YB/e/91AJV6wKO/XIEN5fi4pf+9wKC/T79EgAAAf/TAAAEKAYAABQAdACwAEVYsAgvG7EIHj5ZsABFWLAQLxuxEBg+WbAARViwAi8bsQIQPlmwAEVYsBMvG7ETED5Zsg4QAhESObAOL7IBAQorWCHYG/RZsgcIEBESObAHL7IEAQorWCHYG/RZsAcQsArQsAQQsAzQshIBDhESOTAxASMRIxEjNTM1MxUzFSMRMwEzAQEjAeCAutPTuu/vfgE72/6GAa7bAfX+CwTBl6iol/3NAaz+E/2zAP//ALH+mwWyBxoCJgDbAAAAJwCgATEBQwEHABAEfv+9ABMAsABFWLAILxuxCBw+WbAN3DAxAP//AJz+mwS1BcQCJgDvAAAAJwCgAKL/7QEHABADgf+9ABMAsABFWLAILxuxCBg+WbAN3DAxAP//AKn+mwW7BbACJgAsAAAABwAQBIf/vf//AJz+mwS0BDoCJgDzAAAABwAQA4D/vf//AKn+mwb4BbACJgAxAAAABwAQBcT/vf//AJ3+mwYGBDoCJgDyAAAABwAQBNL/vf//AC/+mwWoBbACJgDcAAAABwAQBHT/vf//ACz+mwS3BDoCJgDxAAAABwAQA4P/vQABAA8AAAS7BbAADgBWsgoPEBESOQCwAEVYsAgvG7EIHD5ZsABFWLALLxuxCxw+WbAARViwAi8bsQIQPlmyBggCERI5sAYvsgUBCitYIdgb9FmwANCyCggCERI5sAYQsA7QMDEBIxEjESM1MwEzAQEzATMDpuHA25T+UdwBegF82v5RmgIJ/fcCCZcDEP0lAtv88AAAAQAu/mAD3wQ6AA4AY7IKDxAREjkAsABFWLAILxuxCBg+WbAARViwCy8bsQsYPlmwAEVYsAIvG7ECEj5ZsABFWLAALxuxABA+WbAARViwBC8bsQQQPlmyBgEKK1gh2Bv0WbIKCwAREjmwDdCwDtAwMQUjESMRIzUzATMBATMBMwNK5rrcv/6hvQEfARi9/qPIC/5rAZWXA6782gMm/FIAAAEAOQAABM4FsAARAGMAsABFWLALLxuxCxw+WbAARViwDi8bsQ4cPlmwAEVYsAIvG7ECED5ZsABFWLAFLxuxBRA+WbIRCwIREjmwES+yAAEKK1gh2Bv0WbIECwIREjmwB9CwERCwCdCyDQsCERI5MDEBIwEjAQEjASM1MwEzAQEzATMDxKQBruT+mv6Y4wGvoJH+a+EBXwFd4v5rlgKe/WICOP3IAp6XAnv90gIu/YUAAQApAAADygQ6ABEAYwCwAEVYsAsvG7ELGD5ZsABFWLAOLxuxDhg+WbAARViwAi8bsQIQPlmwAEVYsAUvG7EFED5ZshEOAhESObARL7IAAQorWCHYG/RZsgQOAhESObAH0LARELAJ0LINDgIREjkwMQEjASMDAyMBIzUzATMTEzMBMwM8swFB1vr61wFBqp7+1tbt8Nj+1qcB4f4fAZX+awHhlwHC/nUBi/4+//8AY//sA+wETQIGAL4AAP//ABIAAAQvBbACJgAqAAAABwHe/4P+f///AJACiwXJAyIARgGXhABmZkAA//8AXQAABDMFxAIGABYAAP//AF7/7AP5BcQCBgAXAAD//wA1AAAEUAWwAgYAGAAA//8Amv/sBC0FsAIGABkAAP//AGT//wP4BcQABgAdAAD//wCH/+wEHgXEAAYAFBQA//8Aev/sBNwHVQImACsAAAEHAHUBvgFXABQAsABFWLALLxuxCxw+WbEiCPQwMf//AGD+VgPyBf4CJgBLAAABBwB1AUsAAAAUALAARViwAy8bsQMYPlmxJwn0MDH//wCpAAAFCAc0AiYAMgAAAQcARAFmATYAFACwAEVYsAYvG7EGHD5ZsQsI9DAx//8AjAAAA98F/gImAFIAAAEHAEQAzAAAABQAsABFWLADLxuxAxg+WbETCfQwMf//ABwAAAUdByACJgAlAAABBwCrBG0BMgAXALAARViwBC8bsQQcPlmxDAj0sBDQMDEA//8AOf/sA+oF6wImAEUAAAEHAKsEEv/9ABcAsABFWLAXLxuxFxg+WbEqCfSwLtAwMQD//wBfAAAERgcsAiYAKQAAAQcAqwQ4AT4AFwCwAEVYsAYvG7EGHD5ZsQ0I9LAR0DAxAP//ACn/7APzBesCJgBJAAABBwCrBAL//QAXALAARViwCC8bsQgYPlmxHwn0sCPQMDEA////CgAAAeoHLAImAC0AAAEHAKsC4wE+ABcAsABFWLACLxuxAhw+WbEFCPSwCdAwMQD///7wAAAB0AXpAiYAjAAAAQcAqwLJ//sAFwCwAEVYsAIvG7ECGD5ZsQUJ9LAJ0DAxAP//AHb/7AUJByICJgAzAAABBwCrBI8BNAAXALAARViwDS8bsQ0cPlmxIQj0sCXQMDEA//8AM//sBDQF6wImAFMAAAEHAKsEDP/9ABcAsABFWLAELxuxBBg+WbEdCfSwIdAwMQD//wBVAAAEyQcgAiYANgAAAQcAqwQuATIAFwCwAEVYsAQvG7EEHD5ZsRkI9LAd0DAxAP///4sAAAKXBesCJgBWAAABBwCrA2T//QAXALAARViwCy8bsQsYPlmxDwn0sBPQMDEA//8AjP/sBKoHIAImADkAAAEHAKsEaAEyABcAsABFWLAJLxuxCRw+WbEUCPSwGNAwMQD//wAr/+wD3AXrAiYAWQAAAQcAqwQE//0AFwCwAEVYsAcvG7EHGD5ZsRIJ9LAW0DAxAP///zoAAATSBj8AJgDPZAAABwCt/oMAAP//AKn+ogSIBbACJgAmAAAABwCsBLoAAP//AIz+ogQgBgACJgBGAAAABwCsBKsAAP//AKn+ogTGBbACJgAoAAAABwCsBLkAAP//AF/+ogPwBgACJgBIAAAABwCsBL0AAP//AKn9/wTGBbACJgAoAAAABwGiAWX+oP//AF/9/wPwBgACJgBIAAAABwGiAWn+oP//AKn+ogUIBbACJgAsAAAABwCsBR8AAP//AIz+ogPfBgACJgBMAAAABwCsBKEAAP//AKkAAAUFBy4CJgAvAAABBwB1AXsBMAAUALAARViwBS8bsQUcPlmxDgj0MDH//wCNAAAEDAc/AiYATwAAAQcAdQFEAUEACQCwBS+wD9wwMQD//wCp/qIFBQWwAiYALwAAAAcArAToAAD//wCN/qIEDAYAAiYATwAAAAcArARlAAD//wCp/qIEHAWwAiYAMAAAAAcArATAAAD//wCG/qIBYQYAAiYAUAAAAAcArANOAAD//wCp/qIGUgWwAiYAMQAAAAcArAXSAAD//wCL/qIGeAROAiYAUQAAAAcArAXWAAD//wCp/qIFCAWwAiYAMgAAAAcArAUkAAD//wCM/qID3wROAiYAUgAAAAcArASHAAD//wCpAAAEwAdAAiYANAAAAQcAdQF8AUIAFACwAEVYsAMvG7EDHD5ZsRYI9DAx//8AjP5gBB4F9QImAFQAAAEHAHUBk//3ABQAsABFWLAMLxuxDBg+WbEdCfQwMf//AKj+ogTJBbACJgA2AAAABwCsBLcAAP//AIL+ogKXBE4CJgBWAAAABwCsA0oAAP//AFD+ogRyBcQCJgA3AAAABwCsBMkAAP//AF/+ogO7BE4CJgBXAAAABwCsBIcAAP//ADH+ogSXBbACJgA4AAAABwCsBLoAAP//AAn+ogJWBUACJgBYAAAABwCsBBkAAP//ABwAAAT9By4CJgA6AAABBwCkALQBRgAUALAARViwBi8bsQYcPlmxCgT0MDH//wAhAAADugXjAiYAWgAAAQYApB37ABQAsABFWLABLxuxARg+WbEKAfQwMf//ABz+ogT9BbACJgA6AAAABwCsBOQAAP//ACH+ogO6BDoCJgBaAAAABwCsBE0AAP//AD3+ogbtBbACJgA7AAAABwCsBe8AAP//ACv+ogXTBDoCJgBbAAAABwCsBVMAAP//AFb+ogR6BbACJgA+AAAABwCsBLoAAP//AFj+ogOzBDoCJgBeAAAABwCsBGIAAP///nj/7AVPBdYAJgAzRgAABwFa/gkAAP//ABMAAARwBRwCJgG6AAAABwCt/9z+3f///58AAAPqBR8AJgG+PAAABwCt/uj+4P///7wAAASUBRwAJgHBPAAABwCt/wX+3f///8AAAAGNBR4AJgHCPAAABwCt/wn+3////9//8ARkBRwAJgHICgAABwCt/yj+3f///1cAAARYBRwAJgHSPAAABwCt/qD+3f////gAAASIBRsAJgHzCgAABwCt/0H+3P//ABMAAARwBI0CBgG6AAD//wCKAAAD7wSNAgYBuwAA//8AigAAA64EjQIGAb4AAP//AEcAAAPgBI0CBgHTAAD//wCKAAAEWASNAgYBwQAA//8AlwAAAVEEjQIGAcIAAP//AIoAAARXBI0CBgHEAAD//wCKAAAFdwSNAgYBxgAA//8AYP/wBFoEnQIGAcgAAP//AIoAAAQbBI0CBgHJAAD//wAoAAAD/QSNAgYBzQAA//8ADQAABBwEjQIGAdIAAP//ACYAAAQxBI0CBgHRAAD///+0AAACPQXjAiYBwgAAAQcAav9OAB4AFwCwAEVYsAIvG7ECGj5ZsQsC9LAU0DAxAP//AA0AAAQcBeMCJgHSAAABBgBqbR4AFwCwAEVYsAgvG7EIGj5ZsRAC9LAZ0DAxAP//AIoAAAOuBeMCJgG+AAABBgBqcR4AFwCwAEVYsAYvG7EGGj5ZsRMC9LAc0DAxAP//AIoAAAOFBhwCJgHqAAABBwB1ATQAHgAUALAARViwBC8bsQQaPlmxCAb0MDH//wBD//AD3QSdAgYBzAAA//8AlwAAAVEEjQIGAcIAAP///7QAAAI9BeMCJgHCAAABBwBq/04AHgAXALAARViwAi8bsQIaPlmxCwL0sBTQMDEA//8AK//wA00EjQIGAcMAAP//AIoAAARXBhwCJgHEAAABBwB1ASUAHgAUALAARViwBS8bsQUaPlmxDwb0MDH//wAi/+wECwX2AiYCAQAAAQYAoGcfABQAsABFWLACLxuxAho+WbEUCPQwMf//ABMAAARwBI0CBgG6AAD//wCKAAAD7wSNAgYBuwAA//8AigAAA4UEjQIGAeoAAP//AIoAAAOuBI0CBgG+AAD//wCKAAAEYQX2AiYB/gAAAQcAoADJAB8AFACwAEVYsAgvG7EIGj5ZsQ0I9DAx//8AigAABXcEjQIGAcYAAP//AIoAAARYBI0CBgHBAAD//wBg//AEWgSdAgYByAAA//8AigAABEQEjQIGAe8AAP//AIoAAAQbBI0CBgHJAAD//wBg//AEMASdAgYBvAAA//8AKAAAA/0EjQIGAc0AAP//ACYAAAQxBI0CBgHRAAAAAQBH/lAD1ASdACkAmgCwAEVYsAovG7EKGj5ZsABFWLAZLxuxGRA+WbAARViwGC8bsRgSPlmwChCyAwEKK1gh2Bv0WbIGChkREjmyJxkKERI5fLAnLxiy8CcBXbIAJwFxsqAnAV20YCdwJwJdsjAnAXG0YCdwJwJxsiYBCitYIdgb9FmyECYnERI5sBkQsBbQsh0ZChESObAZELIgAQorWCHYG/RZMDEBNCYjIgYVIzQ2MzIWFRQGBxYWFRQGBxEjESYmNTMWFjMyNjU0JSM1MzYDCIp9boG67bzT7m5ndnHLr7qjtrkFg3mIkv7/nZzvA1BUXVhPjrWollaNKSSSW4yvEv5bAacUrYhWYGBYwQWYBQAAAQCK/pkE+gSNAA8AXQCwAS+wAEVYsAkvG7EJGj5ZsABFWLADLxuxAxA+WbAARViwBi8bsQYQPlmyCwMJERI5fLALLxiyoAsBXbIEAQorWCHYG/RZsAkQsAzQsAMQsg4BCitYIdgb9FkwMQEjESMRIREjETMRIREzETME+rqh/aS5uQJcuaL+mQFnAfL+DgSN/f0CA/wMAAABAGD+VgQwBJ0AHwBYALAARViwDi8bsQ4aPlmwAEVYsAMvG7EDED5ZsABFWLAFLxuxBRI+WbADELAG0LAOELAS0LAOELIVAQorWCHYG/RZsAMQshwBCitYIdgb9FmwAxCwH9AwMQEGBgcRIxEmAjU1NDY2MzIWFyMmJiMiBgcVFBYzMjY3BDAUy6m6t9d755jM9xO5Eo1+macBn5eHjRQBeajHFP5gAaIeAR7jYaT5iNO7gnTLvWq9z2+D//8ADQAABBwEjQIGAdIAAP//AAL+UQVrBJ0CJgIXAAAABwGwArz/uP//AIoAAARhBdYCJgH+AAABBwBwAJwAJgATALAARViwCC8bsQgaPlmwC9wwMQD//wAi/+wECwXWAiYCAQAAAQYAcDomABMAsABFWLARLxuxERo+WbAT3DAxAP//AGAAAAUGBI0CBgHxAAD//wAc/k8FHQWwAiYAJQAAAAcAowF8AAD//wBt/k8D6gROAiYARQAAAAcAowDEAAD//wCp/lkERgWwAiYAKQAAAAcAowE6AAr//wBd/k8D8wROAiYASQAAAAcAowEGAAAAAAAAAA0AogADAAEECQAAAF4AAAADAAEECQABAAwAXgADAAEECQACAA4AagADAAEECQADAAwAXgADAAEECQAEAAwAXgADAAEECQAFACwAeAADAAEECQAGABwApAADAAEECQAHAEAAwAADAAEECQAJAAwBAAADAAEECQALABQBDAADAAEECQAMACYBIAADAAEECQANAFwBRgADAAEECQAOAFQBogBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADEAIABHAG8AbwBnAGwAZQAgAEkAbgBjAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUgBvAGIAbwB0AG8AUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMgAuADAAMAAxADEAMAAxADsAIAAyADAAMQA0AFIAbwBiAG8AdABvAC0AUgBlAGcAdQBsAGEAcgBSAG8AYgBvAHQAbwAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEcAbwBvAGcAbABlAC4ARwBvAG8AZwBsAGUARwBvAG8AZwBsAGUALgBjAG8AbQBDAGgAcgBpAHMAdABpAGEAbgAgAFIAbwBiAGUAcgB0AHMAbwBuAEwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAQQBwAGEAYwBoAGUAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMgAuADAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAcABhAGMAaABlAC4AbwByAGcALwBsAGkAYwBlAG4AcwBlAHMALwBMAEkAQwBFAE4AUwBFAC0AMgAuADAAAwAAAAAAAP9qAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIACAAC//8ADwABAAAADAAAAAAAAAACAF4AJQA+AAEARQBeAAEAeQB5AAMAgQCBAAEAgwCDAAEAhgCGAAEAiQCJAAEAiwCVAAEAlwCcAAEAowCjAAMApwCsAAMAsACwAAEAuQC6AAEAvgC+AAEAwADAAAEAwgDCAAEAxgDGAAEAygDKAAEAzADNAAEAzwDQAAEA0gDSAAEA2QDdAAEA4ADgAAEA5ADkAAEA5gDoAAEA6gD6AAEA/AD8AAEA/gEAAAEBAgECAAEBBwEIAAEBFQEZAAEBGwEbAAEBHwEhAAEBIwEkAAMBOAE5AAEBPgFAAAEBRQFFAAEBTQFNAAEBTwFPAAEBUwFTAAEBVQFXAAEBWQFZAAEBogGiAAMBowGpAAIBugHTAAEB4gHiAAEB5AHkAAEB6gHqAAEB8wHzAAEB9QH1AAEB/AH+AAECAAIBAAECAwIDAAECBwIHAAECCQILAAECEQIRAAECFgIYAAECGgIaAAECPgJDAAECRwKvAAECsgNYAAEDWwNqAAEDcQNxAAEDcwN3AAEDegN/AAEDgQOEAAEDhgOKAAEDjAOnAAEDqwOrAAEDrQO0AAEDtgO4AAEDvQO/AAEDwQPNAAEDzwPZAAED3APsAAED7wRIAAEESwRLAAEETQRNAAEETwRQAAEEWwRbAAEEYgRkAAEEZgRmAAEEagRqAAEEbARtAAEEbwRvAAEEdwSGAAEEhwSHAAIEiASwAAEEsgTKAAEEzATQAAEE0gTVAAEE1wTZAAEE2wTcAAEE3gThAAEAAQAAAAoAXACaAARERkxUABpjeXJsAChncmVrADZsYXRuAEQABAAAAAD//wACAAAABAAEAAAAAP//AAIAAQAFAAQAAAAA//8AAgACAAYABAAAAAD//wACAAMABwAIY3BzcAAyY3BzcAAyY3BzcAAyY3BzcAAya2VybgA4a2VybgA4a2VybgA4a2VybgA4AAAAAQAAAAAAAQABAAIABgHYAAEAAAABAAgAAQAKAAUAJABIAAEA3gAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAkgCwALEAsgCzALQAtQC2ALcAuAC5ANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoASwBMAEyATgBOgE8AT4BPwFFAUYBfwGFAYoBjQJHAkgCSgJMAk0CTgJPAlACUQJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgKDAoUChwKJAosCjQKPApECkwKVApcCmQKbAp0CnwKhAqMCpQKnAqkCqwKtAq8CsgK0ArYCuAK6ArwCvgLAAsICxQLHAskCywLNAs8C0QLTAtUC2QLbAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLyAvQC9gNTA1QDVQNWA1cDWANZA1sDXANdA14DXwNgA2EDYgNkA2UDZgNnA2gDaQNqA3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DuwO9A78D1APaA+AESQRLBE8EVwRZBF4EagACAAAABAAOD84V8jViAAEDVAAEAAABpQrSCtIGggtwCoAK/g+aDAAGiA7uDu4MRg6gCiIO7g7uD5oKigaSDGYMRgrYCqwNUg8QCl4L4gsQDBYGmA22DbYNtgwgCxAKUAxMDbAMTAsQBqYN5gtwD5oLcAasBrIGvAbCBsgMTAbOBtgNtgb+BxQHKgcwB0YHTAdSB4QHigeQDcANwAe+Du4H4AgCDVIIMA7uDu4LJg7uDu4IRg3ADcAIeAiCCIwIpg1ICLgNsAjSCOgLEAkyCUwJaAloCxAJYgloCWgJaAtwDCAK2AxMCxAN5g1IDqAOoA1ICtIK0grSCtIK0gmKCbAJugnECeIJ9AoGChgK/g+aD5oPmg+aDGYLcAtwC3ALcAtwC3ALcAr+DAAMAAwADAAO7g7uDu4O7g7uD5oPmg+aD5oPmgxGDEYMRgxGDxAL4gviC+IL4gviC+IL4gwWDBYMFgwWDbYMIAwgDCAMIAwgDEwMTAtwC+ILcAviC3AL4gr+Cv4K/gr+D5oMAAwWDAAMFgwADBYMAAwWDAAMFg7uDbYO7g7uDu4O7g7uDEYOoAoiCiIKIgoiDu4Ntg7uDbYO7g22DbYPmgwgD5oMIA+aDCAKUApQClAMZgxmDGYMRgxGDEYMRgxGDEYKrA8QDEwPEApeCl4KXgtwDAAO7g7uD5oPEAtwCoAMAApeDu4O7g6gDu4O7g+aCooMZg8QDVIO7g8QDbYMIAxMDCAMAA3mDu4O7gxGDqAOoAsmC3AKgA3mDAAO7g7uD5oKigr+DGYNUgviDBYMIAsQDEwNsAwWDUgMTAqsCqwKrA8QDEwK0grSCtIO7g22C3AL4gwADBYK2AxMCv4PEAxMDu4NUg2wDu4LcAviC3AL4gwADBYMFgwWDVINsA+aDCAMIAsQCyYMTAsmDEwLJgxMDVINsAtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gtwC+ILcAviC3AL4gwADBYMAAwWDAAMFgwADBYMAAwWDAAMFgwADBYMAAwWDu4O7g+aDCAPmgwgD5oMIA+aDCAPmgwgD5oMIA+aDCAMIAxGDEYPEAxMDxAMTA8QDEwOoA7uDGYNUg2wDeYNSA1SDbANtg3ADeYOoA7uDu4PEA+aAAIAhwAGAAYAAAALAAsAAQATABMAAgAlACoAAwAsADUACQA4AD4AEwBFAEYAGgBJAEoAHABMAEwAHgBRAFQAHwBWAFYAIwBaAFoAJABcAF0AJQCKAIoAJwCcAJwAKACwALQAKQC2ALgALgC6ALoAMQC8AL0AMgC/AMAANADCAMQANgDGAMsAOQDRANEAPwDTAN0AQADfAN8ASwDhAOMATADlAOcATwDpAO0AUgDwAPAAVwD1APcAWAD6APsAWwD9AP8AXQEDAQQAYAEJAQkAYgEMAQwAYwEXARkAZAErAS0AZwEwATAAagEyATIAawFJAUkAbAFsAW0AbQFvAXEAbwG6AboAcgG9Ab0AcwHEAcUAdAHIAcgAdgHKAcsAdwHNAc0AeQIoAigAegIqAisAewJHAkgAfQJKAkoAfwJMAm0AgAJvAnIAogJ3AnwApgKBAokArAKLAosAtQKNAo0AtgKPAo8AtwKRApEAuAKTApwAuQKlAqcAwwKpAqkAxgKrAqsAxwKtAq0AyAKvAq8AyQKyArIAygK0ArQAywK2ArYAzAK4ArgAzQK6AroAzgK8ArwAzwK+AsoA0ALMAswA3QLOAs4A3gLQAtAA3wLbAtsA4ALdAt0A4QLfAt8A4gLh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BB7/6wQg/+sEIv/rBCT/6wQm/+sEKP/rBCr/6wQs/+sELv/rBDD/6wQy/+sENP/qBDb/6gQ4/+oEOv/qBDz/6gQ+/+oEQP/qBEL/6ARE/+gERv/oBE0AFAAfADj/1QA6/+QAO//sAD3/3QDR/9UA1f/VARj/5AEy/9UBOv/VAmb/3QLb/9UC3f/VAt//1QLt/+wC7//dAvH/3QNY/90DZ//dA2r/3QOO/9UDoP/sA6L/7AOk/+wDpv/dA7f/5AO//90EQf/dBEP/3QRF/90ETf/VBGr/3QAaADj/sAA6/+0APf/QANH/sADV/7ABGP/tATL/sAE6/7ACZv/QAtv/sALd/7AC3/+wAu//0ALx/9ADWP/QA2f/0ANq/9ADjv+wA6b/0AO3/+0Dv//QBEH/0ARD/9AERf/QBE3/sARq/9AAEAAu/+4AOf/uAmL/7gJj/+4CZP/uAmX/7gKy/+4C4f/uAuP/7gLl/+4C5//uAun/7gLr/+4Df//uBDP/7gQ1/+4ARwAGABAACwAQAEf/6ABI/+gASf/oAEv/6ABV/+gAk//oAJj/6AC6/+gAx//oAMj/6AD2/+gBAv/oAR3/6AEh/+gBOf/oAUv/6AFM/+gBVv/oAWwAEAFtABABbwAQAXAAEAFxABACbv/oAm//6AJw/+gCcf/oAnL/6AKK/+gCjP/oAo7/6AKQ/+gCkv/oApT/6AKW/+gCmP/oApr/6AKc/+gCnv/oAqD/6AKi/+gCpP/oA2v/6AOR/+gDlf/oA5j/6AOoABADqQAQA6wAEAOz/+gDuf/oA77/6APM/+gDzv/oA8//6APb/+gD7P/oBAj/6AQK/+gEDP/oBA7/6AQQ/+gEEv/oBBT/6AQW/+gEKv/oBCz/6AQu/+gEMv/oAAEAVgAEAAAAJgCmAZwB+gIUAlYCzAPCBLgFkgYsCMYKjAteDFQOGg5MDn4O/BDiEVgSKhRMFQIWaBciF6gYBhjIGT4ewBlQGqIc4B0CHhgelh7AHuoAAQAmAE8AWABbAF8AnAC0ALYAtwC4AL8AwgDDAMQAyQDLAMwAzQDRANUA1wDYANoA4gDmAOcA6ADpAOoA7ADuAPAA9QD3APoA/wECASEBbQA9AEf/7ABI/+wASf/sAEv/7ABV/+wAk//sAJj/7AC6/+wAx//sAMj/7AD2/+wBAv/sAR3/7AEh/+wBOf/sAUv/7AFM/+wBVv/sAm7/7AJv/+wCcP/sAnH/7AJy/+wCiv/sAoz/7AKO/+wCkP/sApL/7AKU/+wClv/sApj/7AKa/+wCnP/sAp7/7AKg/+wCov/sAqT/7ANr/+wDkf/sA5X/7AOY/+wDs//sA7n/7AO+/+wDzP/sA87/7APP/+wD2//sA+z/7AQI/+wECv/sBAz/7AQO/+wEEP/sBBL/7AQU/+wEFv/sBCr/7AQs/+wELv/sBDL/7AAXAFP/7AEX/+wCeP/sAnn/7AJ6/+wCe//sAnz/7ALG/+wCyP/sAsr/7ANx/+wDd//sA5P/7APZ/+wD3f/sBBz/7AQe/+wEIP/sBCL/7AQk/+wEJv/sBCj/7AQw/+wABgAQ/4QAEv+EAW7/hAFy/4QBdv+EAXf/hAAQAC7/7AA5/+wCYv/sAmP/7AJk/+wCZf/sArL/7ALh/+wC4//sAuX/7ALn/+wC6f/sAuv/7AN//+wEM//sBDX/7AAdAAb/8gAL//IAWv/zAF3/8wC8//MBGf/zAWz/8gFt//IBb//yAXD/8gFx//ICgf/zAoL/8wLw//MDc//zA5b/8wOf//MDp//zA6j/8gOp//IDrP/yA7j/8wPA//MD4f/zA+P/8wPl//MEQv/zBET/8wRG//MAPQAn//MAK//zADP/8wA1//MAg//zAJL/8wCX//MAsv/zANL/8wEH//MBFv/zARr/8wEc//MBHv/zASD/8wE4//MBVf/zAij/8wIp//MCK//zAiz/8wJT//MCXf/zAl7/8wJf//MCYP/zAmH/8wKJ//MCi//zAo3/8wKP//MCnf/zAp//8wKh//MCo//zAsX/8wLH//MCyf/zAvr/8wNX//MDZP/zA4r/8wON//MDuv/zA73/8wPY//MD2v/zA9z/8wQb//MEHf/zBB//8wQh//MEI//zBCX/8wQn//MEKf/zBCv/8wQt//MEL//zBDH/8wSq//MAPQAn/+YAK//mADP/5gA1/+YAg//mAJL/5gCX/+YAsv/mANL/5gEH/+YBFv/mARr/5gEc/+YBHv/mASD/5gE4/+YBVf/mAij/5gIp/+YCK//mAiz/5gJT/+YCXf/mAl7/5gJf/+YCYP/mAmH/5gKJ/+YCi//mAo3/5gKP/+YCnf/mAp//5gKh/+YCo//mAsX/5gLH/+YCyf/mAvr/5gNX/+YDZP/mA4r/5gON/+YDuv/mA73/5gPY/+YD2v/mA9z/5gQb/+YEHf/mBB//5gQh/+YEI//mBCX/5gQn/+YEKf/mBCv/5gQt/+YEL//mBDH/5gSq/+YANgAl/+QAPP/SAD3/0wCx/+QAs//kANn/0gEM/+QCTP/kAk3/5AJO/+QCT//kAlD/5AJR/+QCUv/kAmb/0wKD/+QChf/kAof/5ALv/9MC8f/TA1P/5ANY/9MDW//kA2f/0wNo/9IDav/TA4P/5AOP/9IDpv/TA6//5AO//9MDwv/SA8X/5APH/+QD0P/SA+r/0gPv/+QD8f/kA/P/5AP1/+QD9//kA/n/5AP7/+QD/f/kA///5AQB/+QEA//kBAX/5ARB/9MEQ//TBEX/0wRP/9IEV//SBGr/0wAmABD/HgAS/x4AJf/NALH/zQCz/80BDP/NAW7/HgFy/x4Bdv8eAXf/HgJM/80CTf/NAk7/zQJP/80CUP/NAlH/zQJS/80Cg//NAoX/zQKH/80DU//NA1v/zQOD/80Dr//NA8X/zQPH/80D7//NA/H/zQPz/80D9f/NA/f/zQP5/80D+//NA/3/zQP//80EAf/NBAP/zQQF/80ApgBH/9wASP/cAEn/3ABL/9wAUf/zAFL/8wBT/9YAVP/zAFX/3ABZ/90AWv/hAF3/4QCT/9wAmP/cAJr/3QC6/9wAvP/hAMD/8wDH/9wAyP/cAMr/3QDr//MA7//zAPD/8wDy//MA8//zAPT/8wD2/9wA9//zAPn/8wD6//MA/f/zAP//8wEC/9wBBP/zARf/1gEZ/+EBHf/cASH/3AE1//MBOf/cAUT/8wFJ//MBS//cAUz/3AFW/9wCbv/cAm//3AJw/9wCcf/cAnL/3AJ3//MCeP/WAnn/1gJ6/9YCe//WAnz/1gJ9/90Cfv/dAn//3QKA/90Cgf/hAoL/4QKK/9wCjP/cAo7/3AKQ/9wCkv/cApT/3AKW/9wCmP/cApr/3AKc/9wCnv/cAqD/3AKi/9wCpP/cAr//8wLB//MCw//zAsT/8wLG/9YCyP/WAsr/1gLi/90C5P/dAub/3QLo/90C6v/dAuz/3QLw/+EDa//cA23/8wNv/90Dcf/WA3P/4QN2/90Dd//WA3j/3QOR/9wDkv/zA5P/1gOU//MDlf/cA5b/4QOY/9wDmf/zA57/8wOf/+EDp//hA67/8wOz/9wDtP/zA7j/4QO5/9wDvv/cA8D/4QPM/9wDzv/cA8//3APV//MD1//zA9n/1gPb/9wD3f/WA+H/4QPj/+ED5f/hA+n/8wPs/9wECP/cBAr/3AQM/9wEDv/cBBD/3AQS/9wEFP/cBBb/3AQc/9YEHv/WBCD/1gQi/9YEJP/WBCb/1gQo/9YEKv/cBCz/3AQu/9wEMP/WBDL/3AQ0/90ENv/dBDj/3QQ6/90EPP/dBD7/3QRA/90EQv/hBET/4QRG/+EESv/zBEz/8wRW//MEY//zBGX/8wRn//MAcQAG/9oAC//aAEf/8ABI//AASf/wAEv/8ABV//AAWf/vAFr/3ABd/9wAk//wAJj/8ACa/+8Auv/wALz/3ADH//AAyP/wAMr/7wD2//ABAv/wARn/3AEd//ABIf/wATn/8AFL//ABTP/wAVb/8AFs/9oBbf/aAW//2gFw/9oBcf/aAm7/8AJv//ACcP/wAnH/8AJy//ACff/vAn7/7wJ//+8CgP/vAoH/3AKC/9wCiv/wAoz/8AKO//ACkP/wApL/8AKU//AClv/wApj/8AKa//ACnP/wAp7/8AKg//ACov/wAqT/8ALi/+8C5P/vAub/7wLo/+8C6v/vAuz/7wLw/9wDa//wA2//7wNz/9wDdv/vA3j/7wOR//ADlf/wA5b/3AOY//ADn//cA6f/3AOo/9oDqf/aA6z/2gOz//ADuP/cA7n/8AO+//ADwP/cA8z/8APO//ADz//wA9v/8APh/9wD4//cA+X/3APs//AECP/wBAr/8AQM//AEDv/wBBD/8AQS//AEFP/wBBb/8AQq//AELP/wBC7/8AQy//AENP/vBDb/7wQ4/+8EOv/vBDz/7wQ+/+8EQP/vBEL/3ARE/9wERv/cADQABv+gAAv/oABZ//EAWv/FAF3/xQCa//EAvP/FAMr/8QEZ/8UBbP+gAW3/oAFv/6ABcP+gAXH/oAJ9//ECfv/xAn//8QKA//ECgf/FAoL/xQLi//EC5P/xAub/8QLo//EC6v/xAuz/8QLw/8UDb//xA3P/xQN2//EDeP/xA5b/xQOf/8UDp//FA6j/oAOp/6ADrP+gA7j/xQPA/8UD4f/FA+P/xQPl/8UENP/xBDb/8QQ4//EEOv/xBDz/8QQ+//EEQP/xBEL/xQRE/8UERv/FAD0AR//nAEj/5wBJ/+cAS//nAFX/5wCT/+cAmP/nALr/5wDH/+cAyP/nAPb/5wEC/+cBHf/nASH/5wE5/+cBS//nAUz/5wFW/+cCbv/nAm//5wJw/+cCcf/nAnL/5wKK/+cCjP/nAo7/5wKQ/+cCkv/nApT/5wKW/+cCmP/nApr/5wKc/+cCnv/nAqD/5wKi/+cCpP/nA2v/5wOR/+cDlf/nA5j/5wOz/+cDuf/nA77/5wPM/+cDzv/nA8//5wPb/+cD7P/nBAj/5wQK/+cEDP/nBA7/5wQQ/+cEEv/nBBT/5wQW/+cEKv/nBCz/5wQu/+cEMv/nAHEABgAMAAsADABH/+gASP/oAEn/6ABL/+gAU//qAFX/6ABaAAsAXQALAJP/6ACY/+gAuv/oALwACwDH/+gAyP/oAPb/6AEC/+gBF//qARkACwEd/+gBIf/oATn/6AFL/+gBTP/oAVb/6AFsAAwBbQAMAW8ADAFwAAwBcQAMAm7/6AJv/+gCcP/oAnH/6AJy/+gCeP/qAnn/6gJ6/+oCe//qAnz/6gKBAAsCggALAor/6AKM/+gCjv/oApD/6AKS/+gClP/oApb/6AKY/+gCmv/oApz/6AKe/+gCoP/oAqL/6AKk/+gCxv/qAsj/6gLK/+oC8AALA2v/6ANx/+oDcwALA3f/6gOR/+gDk//qA5X/6AOWAAsDmP/oA58ACwOnAAsDqAAMA6kADAOsAAwDs//oA7gACwO5/+gDvv/oA8AACwPM/+gDzv/oA8//6APZ/+oD2//oA93/6gPhAAsD4wALA+UACwPs/+gECP/oBAr/6AQM/+gEDv/oBBD/6AQS/+gEFP/oBBb/6AQc/+oEHv/qBCD/6gQi/+oEJP/qBCb/6gQo/+oEKv/oBCz/6AQu/+gEMP/qBDL/6ARCAAsERAALBEYACwAMAFz/7QBe/+0A7f/tAvP/7QL1/+0C9//tA5f/7QPD/+0D0f/tA+v/7QRQ/+0EWP/tAAwAXP/yAF7/8gDt//IC8//yAvX/8gL3//IDl//yA8P/8gPR//ID6//yBFD/8gRY//IAHwBa//QAXP/yAF3/9ABe//MAvP/0AO3/8gEZ//QCgf/0AoL/9ALw//QC8//zAvX/8wL3//MDc//0A5b/9AOX//IDn//0A6f/9AO4//QDwP/0A8P/8gPR//ID4f/0A+P/9APl//QD6//yBEL/9ARE//QERv/0BFD/8gRY//IAeQAG/8oAC//KADj/0gA6/9QAPP/0AD3/0wBR/9EAUv/RAFT/0QBa/+YAXP/vAF3/5gC8/+YAwP/RANH/0gDV/9IA2f/0AN3/7QDg/+EA6//RAO3/7wDv/9EA8P/RAPL/0QDz/9EA9P/RAPf/0QD5/9EA+v/RAP3/0QD//9EBBP/RARj/1AEZ/+YBMv/SATX/0QE6/9IBRP/RAUn/0QFs/8oBbf/KAW//ygFw/8oBcf/KAmb/0wJ3/9ECgf/mAoL/5gK//9ECwf/RAsP/0QLE/9EC2//SAt3/0gLf/9IC7//TAvD/5gLx/9MDWP/TA2f/0wNo//QDav/TA23/0QNz/+YDgv/tA47/0gOP//QDkv/RA5T/0QOW/+YDl//vA5n/0QOe/9EDn//mA6b/0wOn/+YDqP/KA6n/ygOs/8oDrv/RA7T/0QO3/9QDuP/mA7//0wPA/+YDwv/0A8P/7wPQ//QD0f/vA9X/0QPX/9ED4P/tA+H/5gPi/+0D4//mA+T/7QPl/+YD5v/hA+n/0QPq//QD6//vBEH/0wRC/+YEQ//TBET/5gRF/9MERv/mBEr/0QRM/9EETf/SBE//9ARQ/+8EUf/hBFP/4QRW/9EEV//0BFj/7wRj/9EEZf/RBGf/0QRq/9MAHQA4/74AWv/vAF3/7wC8/+8A0f++ANX/vgEZ/+8BMv++ATr/vgKB/+8Cgv/vAtv/vgLd/74C3/++AvD/7wNz/+8Djv++A5b/7wOf/+8Dp//vA7j/7wPA/+8D4f/vA+P/7wPl/+8EQv/vBET/7wRG/+8ETf++ADQAOP/mADr/5wA8//IAPf/nAFz/8QDR/+YA1f/mANn/8gDd/+4A4P/oAO3/8QEY/+cBMv/mATr/5gJm/+cC2//mAt3/5gLf/+YC7//nAvH/5wNY/+cDZ//nA2j/8gNq/+cDgv/uA47/5gOP//IDl//xA6b/5wO3/+cDv//nA8L/8gPD//ED0P/yA9H/8QPg/+4D4v/uA+T/7gPm/+gD6v/yA+v/8QRB/+cEQ//nBEX/5wRN/+YET//yBFD/8QRR/+gEU//oBFf/8gRY//EEav/nAIgAJQAQACf/6AAr/+gAM//oADX/6AA4/+AAOv/gAD3/3wCD/+gAkv/oAJf/6ACxABAAsv/oALMAEADR/+AA0v/oANMAEADV/+AA3AAQAOD/4QDxABAA+P/gAQMAEAEH/+gBDAAQARb/6AEY/+ABGv/oARz/6AEe/+gBIP/oATL/4AE4/+gBOv/gAVEAEAFV/+gCKP/oAin/6AIr/+gCLP/oAkwAEAJNABACTgAQAk8AEAJQABACUQAQAlIAEAJT/+gCXf/oAl7/6AJf/+gCYP/oAmH/6AJm/98CgwAQAoUAEAKHABACif/oAov/6AKN/+gCj//oAp3/6AKf/+gCof/oAqP/6ALF/+gCx//oAsn/6ALb/+AC3f/gAt//4ALv/98C8f/fAvr/6ANTABADV//oA1j/3wNbABADZP/oA2f/3wNq/98DgwAQA4r/6AON/+gDjv/gA6b/3wOvABADt//gA7r/6AO9/+gDv//fA8UAEAPHABAD2P/oA9r/6APc/+gD5v/hA+f/4APtABAD7gAQA+8AEAPxABAD8wAQA/UAEAP3ABAD+QAQA/sAEAP9ABAD/wAQBAEAEAQDABAEBQAQBBv/6AQd/+gEH//oBCH/6AQj/+gEJf/oBCf/6AQp/+gEK//oBC3/6AQv/+gEMf/oBEH/3wRD/98ERf/fBE3/4ARR/+EEUv/gBFP/4QRU/+AEaAAQBGkAEARq/98Eqv/oAC0AOP/xADr/9AA8//QAPf/wANH/8QDT//UA1f/xANn/9ADc//UA3f/zARj/9AEy//EBOv/xAVH/9QJm//AC2//xAt3/8QLf//EC7//wAvH/8ANY//ADZ//wA2j/9ANq//ADgv/zA47/8QOP//QDpv/wA7f/9AO///ADwv/0A9D/9APg//MD4v/zA+T/8wPq//QD7f/1BEH/8ARD//AERf/wBE3/8QRP//QEV//0BGj/9QRq//AAWQAlAA8AOP/mADr/5gA8AA4APf/mALEADwCzAA8A0f/mANMADgDV/+YA2QAOANwADgDdAAsA4P/lAPEADwD4/+gBAwAPAQwADwEY/+YBMv/mATr/5gFRAA4CTAAPAk0ADwJOAA8CTwAPAlAADwJRAA8CUgAPAmb/5gKDAA8ChQAPAocADwLb/+YC3f/mAt//5gLv/+YC8f/mA1MADwNY/+YDWwAPA2f/5gNoAA4Dav/mA4IACwODAA8Djv/mA48ADgOm/+YDrwAPA7f/5gO//+YDwgAOA8UADwPHAA8D0AAOA+AACwPiAAsD5AALA+b/5QPn/+gD6gAOA+0ADgPuAA8D7wAPA/EADwPzAA8D9QAPA/cADwP5AA8D+wAPA/0ADwP/AA8EAQAPBAMADwQFAA8EQf/mBEP/5gRF/+YETf/mBE8ADgRR/+UEUv/oBFP/5QRU/+gEVwAOBGgADgRpAA8Eav/mAC4AOP/jADz/5QA9/+QA0f/jANP/5QDV/+MA2f/lANz/5QDd/+kA8f/qAQP/6gEy/+MBOv/jAVH/5QJm/+QC2//jAt3/4wLf/+MC7//kAvH/5ANY/+QDZ//kA2j/5QNq/+QDgv/pA47/4wOP/+UDpv/kA7//5APC/+UD0P/lA+D/6QPi/+kD5P/pA+r/5QPt/+UD7v/qBEH/5ARD/+QERf/kBE3/4wRP/+UEV//lBGj/5QRp/+oEav/kACEAOP/iADz/5ADR/+IA0//kANX/4gDZ/+QA3P/kAN3/6QDx/+sBA//rATL/4gE6/+IBUf/kAtv/4gLd/+IC3//iA2j/5AOC/+kDjv/iA4//5APC/+QD0P/kA+D/6QPi/+kD5P/pA+r/5APt/+QD7v/rBE3/4gRP/+QEV//kBGj/5ARp/+sAFwA4/+sAPf/zANH/6wDV/+sBMv/rATr/6wJm//MC2//rAt3/6wLf/+sC7//zAvH/8wNY//MDZ//zA2r/8wOO/+sDpv/zA7//8wRB//MEQ//zBEX/8wRN/+sEav/zADAAUf/vAFL/7wBU/+8AXP/wAMD/7wDr/+8A7f/wAO//7wDw/+8A8v/vAPP/7wD0/+8A9//vAPn/7wD6/+8A/f/vAP//7wEE/+8BNf/vAUT/7wFJ/+8Cd//vAr//7wLB/+8Cw//vAsT/7wNt/+8Dkv/vA5T/7wOX//ADmf/vA57/7wOu/+8DtP/vA8P/8APR//AD1f/vA9f/7wPp/+8D6//wBEr/7wRM/+8EUP/wBFb/7wRY//AEY//vBGX/7wRn/+8AHQAG//IAC//yAFr/9QBd//UAvP/1ARn/9QFs//IBbf/yAW//8gFw//IBcf/yAoH/9QKC//UC8P/1A3P/9QOW//UDn//1A6f/9QOo//IDqf/yA6z/8gO4//UDwP/1A+H/9QPj//UD5f/1BEL/9QRE//UERv/1AAQA+P/tA+f/7QRS/+0EVP/tAFQAR//wAEj/8ABJ//AAS//wAFP/6wBV//AAk//wAJj/8AC6//AAx//wAMj/8AD2//ABAv/wARf/6wEd//ABIf/wATn/8AFL//ABTP/wAVb/8AJu//ACb//wAnD/8AJx//ACcv/wAnj/6wJ5/+sCev/rAnv/6wJ8/+sCiv/wAoz/8AKO//ACkP/wApL/8AKU//AClv/wApj/8AKa//ACnP/wAp7/8AKg//ACov/wAqT/8ALG/+sCyP/rAsr/6wNr//ADcf/rA3f/6wOR//ADk//rA5X/8AOY//ADs//wA7n/8AO+//ADzP/wA87/8APP//AD2f/rA9v/8APd/+sD7P/wBAj/8AQK//AEDP/wBA7/8AQQ//AEEv/wBBT/8AQW//AEHP/rBB7/6wQg/+sEIv/rBCT/6wQm/+sEKP/rBCr/8AQs//AELv/wBDD/6wQy//AAjwAGAA0ACwANAEX/8ABH/7AASP+wAEn/sABL/7AAU//WAFX/sABaAAsAXQALAJP/sACY/7AAuv+wALwACwDI/7AA8f+vAPb/sAEC/7ABA/+vARf/1gEZAAsBHf+wASH/sAE5/7ABS/+wAUz/sAFW/7ABbAANAW0ADQFvAA0BcAANAXEADQJn//ACaP/wAmn/8AJq//ACa//wAmz/8AJt//ACbv+wAm//sAJw/7ACcf+wAnL/sAJ4/9YCef/WAnr/1gJ7/9YCfP/WAoEACwKCAAsChP/wAob/8AKI//ACiv+wAoz/sAKO/7ACkP+wApL/sAKU/7AClv+wApj/sAKa/7ACnP+wAp7/sAKg/7ACov+wAqT/sALG/9YCyP/WAsr/1gLwAAsDa/+wA3H/1gNzAAsDd//WA5D/8AOR/7ADk//WA5X/sAOWAAsDmP+wA58ACwOnAAsDqAANA6kADQOsAA0DsP/wA7P/sAO4AAsDuf+wA77/sAPAAAsDxv/wA8j/8APM/7ADzv+wA8//sAPZ/9YD2/+wA93/1gPhAAsD4wALA+UACwPs/7AD7v+vA/D/8APy//AD9P/wA/b/8AP4//AD+v/wA/z/8AP+//AEAP/wBAL/8AQE//AEBv/wBAj/sAQK/7AEDP+wBA7/sAQQ/7AEEv+wBBT/sAQW/7AEHP/WBB7/1gQg/9YEIv/WBCT/1gQm/9YEKP/WBCr/sAQs/7AELv+wBDD/1gQy/7AEQgALBEQACwRGAAsEaf+vAAgA8QAQAPj/8AEDABAD5//wA+4AEARS//AEVP/wBGkAEABFAEcADABIAAwASQAMAEsADABVAAwAkwAMAJgADAC6AAwAxwAMAMgADADxABgA9gAMAPj/9wECAAwBAwAYAR0ADAEhAAwBOQAMAUsADAFMAAwBVgAMAm4ADAJvAAwCcAAMAnEADAJyAAwCigAMAowADAKOAAwCkAAMApIADAKUAAwClgAMApgADAKaAAwCnAAMAp4ADAKgAAwCogAMAqQADANrAAwDkQAMA5UADAOYAAwDswAMA7kADAO+AAwDzAAMA84ADAPPAAwD2wAMA+f/9wPsAAwD7gAYBAgADAQKAAwEDAAMBA4ADAQQAAwEEgAMBBQADAQWAAwEKgAMBCwADAQuAAwEMgAMBFL/9wRU//cEaQAYAB8AWv/0AFz/8ABd//QAvP/0AO3/8ADx//MBA//zARn/9AKB//QCgv/0AvD/9ANz//QDlv/0A5f/8AOf//QDp//0A7j/9APA//QDw//wA9H/8APh//QD4//0A+X/9APr//AD7v/zBEL/9ARE//QERv/0BFD/8ARY//AEaf/zAAoABv/WAAv/1gFs/9YBbf/WAW//1gFw/9YBcf/WA6j/1gOp/9YDrP/WAAoABv/1AAv/9QFs//UBbf/1AW//9QFw//UBcf/1A6j/9QOp//UDrP/1ACEATAAgAE8AIABQACAAU/+AAFf/kAEX/4ACeP+AAnn/gAJ6/4ACe/+AAnz/gALG/4ACyP+AAsr/gALS/5AC1P+QAtb/kALY/5AC2v+QA3H/gAN3/4ADk/+AA5r/kAPZ/4AD3f+ABBz/gAQe/4AEIP+ABCL/gAQk/4AEJv+ABCj/gAQw/4AAAgeKAAQAAApeEb4AIQAdAAAAEf/O/48AEv/1/+//iP/0/7v/f//1AAz/qf+i/8kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+UAAAAA/+j/yQAA//MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAD/5QARAAAAAAAAAAAAAP/jAAAAAAAA/+T/5AAAABIAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/4QAAAAAAAAAAAAAAAAAAAAD/5QAAAAD/6v/VAAAAAP/r/+r/mv/pAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+YAAAAAAAAAAAAA/+0AAAAU/+8AAAAAAAAAAAAAAAAAAAAAAAD/7QAAAAAAAAAAAAAAAAAAAAD/y/+4/3z/fv/kAAAAAP+dAA8AEP+h/8QAEAAQAAAAAP+xAAD/JgAA/53/s/8Y/5P/8P+P/4z/EAAA/5L/cv8M/w//vQAAAAD/RAAFAAf/S/+GAAcABwAAAAD/PgAA/noAAP9E/2r+Yv8z/9H/LP8nAAAAAAAAAAAAAP/YAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7AAAAAAAAAAAAAAAAAAAAAAAAP/Y/6MAAP/hAAAAAP/lAAAAAP/pAAAAAAAAAAAAAAAAAAAAAAAA/+YAAP/A/+kAAAAAAAAAAAAAAAD/ewAAAAD/v//K/rAAAP9x/u3/1AAA/1H/EQAAAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/JAA8AAP/ZAAAAAAAA//MAAAAAAAAAAAAAAAAAAAAA/3b/4f68/+b/8wAAAAAAAAAA//UAAP84AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9QAAAAD/8wAAAAD/0gAAAAD/5AAAAAAAAAAAAAD/tQAA/x8AAP/UAAD/2wAAAAD/0gAAAAAAAAAR/+H/0QAR/+cAAAAA/+sAAAAA/+sAAAAOAAAAAAAAAAAAAAAAAAD/5gAA/9IAAAAAAAAAAAAAAAAAAP/sAAAAAP/j/6AAAP+/ABEAEf/Z/+IAEgASAAAAAP+iAA3/LQAA/7//6f/M/9j/8P+3/8b/oAAAAAAAAAAAAAAAAAAAAAD/4QAAAA7/7QAAAAAAAAAAAAD/1QAA/4UAAP/hAAD/xAAAAAD/3wAAAAAAAAAA/+UAAAAA/+YAAAAA/+sAAAAA/+0AAAAAAAAAAAAAAA0AAAAAAAD/6wAAAAAAAAAAAAAAAAAAAAD/ygAA/+n/u//pAAAAAP+9AAAAEgAAAAAAAAASAAAAAP+lAAD+bQAA/70AAP+J/5oAAP+R/9IAAAAAAAD/8QAAAAAAAAAA/70AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/1AAD/8gAAAAD/4wAAAAAAAAAA//EAAAAAAAAAAAAAAAAAAAAAAAD/8QAAAAAAAAAAAAAAAAAAAAD/8wAAAAAAAAAA//IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/xAAD/8AAAAAD/eAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAD/6wAAAAAAAAAAAAAAAAAAAAAAAAAA/9cAAAAAAA//8QAAAAAAAAAAAAAAAAAAAAAAAAAA/5UAAP/zAAAAAAAAAAD/8QAAAAAAAAAAABIAAAAAAAAAAAAQ/+wAAAAAAAAAAAAAAAAAAAAAAAAAAP+FAAD/7QAAAAAAAAAA/9gAAAAAAAAAAAAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+V/8MAAAAAAAAAAAAAAAAAAAAA/4gAAAAAAAD/xQAAAAD/7AAA/87/sAAAAAAAAAAAAAAAAAAAAAD/VgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//UAAAAAAAAAAAAA/8AAAAAA/vUAAAAA/8j/rf/n/+sAAP/wAAAAAAAA/8kAAAAAAAAAAAAAAAAAAAAA/93/2QAAAAAAAP95AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/1AAAAAAAAAAAAAAAAAAIAeAAGAAYAAAALAAsAAQAQABAAAgASABIAAwAlACkABAAsADQACQA4AD4AEgBFAEcAGQBJAEkAHABMAEwAHQBRAFQAHgBWAFYAIgBaAFoAIwBcAF4AJACKAIoAJwCwALMAKAC8ALwALADAAMAALQDGAMYALgDTANQALwDWANYAMQDZANkAMgDbAN0AMwDfAN8ANgDhAOEANwDjAOMAOADlAOUAOQDrAOsAOgDtAO0AOwD2APYAPAD7APsAPQD9AP4APgEDAQQAQAEJAQkAQgEMAQwAQwEXARkARAErAS0ARwEwATAASgEyATIASwFJAUkATAFsAXIATQF2AXcAVAIoAigAVgIqAisAVwJHAkgAWQJKAkoAWwJMAnIAXAJ3AnwAgwKBApEAiQKTApwAmgKlAqcApAKpAqkApwKrAqsAqAKtAq0AqQKvAq8AqgKyArIAqwK0ArQArAK2ArYArQK4ArgArgK6AroArwK8ArwAsAK+AsoAsQLMAswAvgLOAs4AvwLQAtAAwALbAtsAwQLdAt0AwgLfAt8AwwLhAuEAxALjAuMAxQLlAuUAxgLnAucAxwLpAukAyALrAusAyQLtAu0AygLvAvcAywNTA1gA1ANbA2oA2gNtA20A6gNxA3EA6wNzA3MA7AN3A3cA7QN6A3sA7gN9A4YA8AOIA4oA+gOMA5EA/QOTA5kBAwOfA6ABCgOiA6IBDAOkA6QBDQOmA6kBDgOsA7EBEgOzA7MBGAO3A7gBGQO9A8gBGwPLA8wBJwPOA9EBKQPYA9kBLQPdA90BLwPfA+UBMAPqA+sBNwPvBBcBOQQZBBkBYgQbBCgBYwQwBDABcQQzBDMBcgQ1BDUBcwRBBEYBdARJBEkBegRLBEsBewRNBE0BfARPBFABfQRVBFgBfwRbBFsBgwRdBF4BhARgBGABhgRkBGQBhwRmBGYBiARqBGoBiQSqBKoBigACAToABgAGAB0ACwALAB0AEAAQAB4AEgASAB4AJgAmAAEAJwAnAAQAKAAoAAMAKQApAAUALAAtAAIALgAuAAwALwAvAAkAMAAwAAoAMQAyAAIAMwAzAAMANAA0AAsAOAA4AAYAOQA5AAwAOgA6AA0AOwA7ABAAPAA8AA4APQA9AA8APgA+ABEARQBFABMARgBGABUARwBHABQASQBJABYATABMABcAUQBSABcAUwBTABgAVABUABUAVgBWABoAWgBaABkAXABcABsAXQBdABkAXgBeABwAigCKABUAsACwAAcAsgCyAAMAvAC8ABkAwADAABcAxgDGABUA0wDUAB8A1gDWAAIA2QDZAA4A2wDcAAIA3QDdABIA3wDfAAIA4QDhAAIA4wDjAB8A5QDlAB8A6wDrAAgA7QDtABsA9gD2ABUA+wD7ACAA/QD9ACAA/gD+ABUBAwEEACABCQEJACABFwEXABgBGAEYAA0BGQEZABkBKwErABUBLAEsAAcBLQEtAAgBMAEwAAkBMgEyAAkBSQFJAAgBbAFtAB0BbgFuAB4BbwFxAB0BcgFyAB4BdgF3AB4CKAIoAAQCKgIrAAMCRwJIAAMCSgJKAAYCUwJTAAQCVAJXAAUCWAJcAAICXQJhAAMCYgJlAAwCZgJmAA8CZwJtABMCbgJuABQCbwJyABYCdwJ3ABcCeAJ8ABgCgQKCABkChAKEABMChgKGABMCiAKIABMCiQKJAAQCigKKABQCiwKLAAQCjAKMABQCjQKNAAQCjgKOABQCjwKPAAQCkAKQABQCkQKRAAMCkwKTAAUClAKUABYClQKVAAUClgKWABYClwKXAAUCmAKYABYCmQKZAAUCmgKaABYCmwKbAAUCnAKcABYCpQKlAAICpgKmABcCpwKnAAICqQKpAAICqwKrAAICrQKtAAICrwKvAAICsgKyAAwCtAK0AAkCtgK2AAoCuAK4AAoCugK6AAoCvAK8AAoCvgK+AAICvwK/ABcCwALAAAICwQLBABcCwgLCAAICwwLEABcCxQLFAAMCxgLGABgCxwLHAAMCyALIABgCyQLJAAMCygLKABgCzALMABoCzgLOABoC0ALQABoC2wLbAAYC3QLdAAYC3wLfAAYC4QLhAAwC4wLjAAwC5QLlAAwC5wLnAAwC6QLpAAwC6wLrAAwC7QLtABAC7wLvAA8C8ALwABkC8QLxAA8C8gLyABEC8wLzABwC9AL0ABEC9QL1ABwC9gL2ABEC9wL3ABwDVANUAAUDVQNWAAIDVwNXAAMDWANYAA8DXANcAAEDXQNdAAUDXgNeABEDXwNgAAIDYQNhAAkDYgNjAAIDZANkAAMDZQNlAAsDZgNmAAYDZwNnAA8DaANoAA4DaQNpAAIDagNqAA8DbQNtABcDcQNxABgDcwNzABkDdwN3ABgDegN6AAUDewN7AAcDfQN+AAIDfwN/AAwDgAOBAAkDggOCABIDhAOEAAEDhQOFAAcDhgOGAAUDiAOJAAIDigOKAAMDjAOMAAsDjQONAAQDjgOOAAYDjwOPAA4DkAOQABMDkQORABYDkwOTABgDlAOUABUDlQOVABQDlgOWABkDlwOXABsDmAOYABYDmQOZAAgDnwOfABkDoAOgABADogOiABADpAOkABADpgOmAA8DpwOnABkDqAOpAB0DrAOsAB0DrQOtAAIDrgOuABcDsAOwABMDsQOxAAUDswOzABYDtwO3AA0DuAO4ABkDvQO9AAQDvgO+ABQDvwO/AA8DwAPAABkDwQPBAAIDwgPCAA4DwwPDABsDxAPEAAIDxgPGABMDyAPIABMDywPLAAUDzAPMABYDzgPPABYD0APQAA4D0QPRABsD2APYAAMD2QPZABgD3QPdABgD3wPfABUD4APgABID4QPhABkD4gPiABID4wPjABkD5APkABID5QPlABkD6gPqAA4D6wPrABsD8APwABMD8gPyABMD9AP0ABMD9gP2ABMD+AP4ABMD+gP6ABMD/AP8ABMD/gP+ABMEAAQAABMEAgQCABMEBAQEABMEBgQGABMEBwQHAAUECAQIABYECQQJAAUECgQKABYECwQLAAUEDAQMABYEDQQNAAUEDgQOABYEDwQPAAUEEAQQABYEEQQRAAUEEgQSABYEEwQTAAUEFAQUABYEFQQVAAUEFgQWABYEFwQXAAIEGQQZAAIEGwQbAAMEHAQcABgEHQQdAAMEHgQeABgEHwQfAAMEIAQgABgEIQQhAAMEIgQiABgEIwQjAAMEJAQkABgEJQQlAAMEJgQmABgEJwQnAAMEKAQoABgEMAQwABgEMwQzAAwENQQ1AAwEQQRBAA8EQgRCABkEQwRDAA8ERAREABkERQRFAA8ERgRGABkESQRJAAkESwRLAAIETQRNAAYETwRPAA4EUARQABsEVQRVAAcEVgRWAAgEVwRXAA4EWARYABsEWwRbABcEXQRdAB8EXgReAAcEYARgAAkEZARkAAIEZgRmAAIEagRqAA8EqgSqAAMAAgFtAAYABgAHAAsACwAHABAAEAATABEAEQAXABIAEgATACUAJQARACcAJwAFACsAKwAFAC4ALgAcADMAMwAFADUANQAFADcANwAZADgAOAAKADkAOQAGADoAOgANADsAOwAJADwAPAASAD0APQAOAD4APgAUAEUARQAaAEcASQAVAEsASwAVAFEAUgAYAFMAUwAIAFQAVAAYAFUAVQAVAFcAVwAbAFkAWQALAFoAWgACAFwAXAAWAF0AXQACAF4AXgAMAIMAgwAFAJIAkgAFAJMAkwAVAJcAlwAFAJgAmAAVAJoAmgALALEAsQAR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b20EbGRub20EbGRub20EbGZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmZyYWMEcmxpZ2EEfGxpZ2EEhGxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxudW0EimxvY2wEkGxvY2wElmxvY2wEnG51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom51bXIEom9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqG9udW0EqHBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnBudW0ErnNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNtY3AEtHNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDEEunNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDIEwHNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDMExnNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDQEzHNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDUE0nNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDYE2HNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nNzMDcE3nRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5HRudW0E5AAAAAEAAAAAAAIAAgADAAAAAQAHAAAAAQAYAAAAAwAVABYAFwAAAAIACAAJAAAAAQAJAAAAAQAUAAAAAQAEAAAAAQAGAAAAAQAFAAAAAQAZAAAAAQARAAAAAQATAAAAAQABAAAAAQAKAAAAAQALAAAAAQAMAAAAAQANAAAAAQAOAAAAAQAPAAAAAQAQAAAAAQASABsAOAPGBrQHYA3wDfAOBg4oDl4OhA6yDsYO2g7uDwAPGg9cD3oPmA/KD/wQLhBCEHoQbBB6EKYAAQAAAAEACAACAcQA3wHnAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHoAekCRAI7AeoB6wHsAe0B7gHvAfAB8QHyAfMB9AH1AfYB9wH4AfkB+gH7AfwB/QH+AgACAQTdAgICAwIEAgUCBgIHAggCCQIKAgsCLwIPAhACEQIUAhUCFgIXAhgCGQIbAhwCHgIdAvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYB/wTHBMgEyQTKBMsEzATNBM4EzwTQBNEE0gTTBNQE1QTWBNgE2QTbAhoE3AIOBNcCEwINBNoCDAISAAEA3wAIACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgBlAGcAhQCSALAAsQCyALMAtAC1ALYAtwC4ALkA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgBLAEwATIBOAE6ATwBPgE/AUUBRgF/AYUBigGNAkcCSAJKAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAoMChQKHAokCiwKNAo8CkQKTApUClwKZApsCnQKfAqECowKlAqcCqQKrAq0CrwKyArQCtgK4AroCvAK+AsACwgLFAscCyQLLAs0CzwLRAtMC1QLZAtsC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvIC9AL2A1MDVANVA1YDVwNYA1kDWwNcA10DXgNfA2ADYQNiA2QDZQNmA2cDaANpA2oDegN7A3wDfQN+A38DgAOBA4IDgwOEA4UDhgOHA4gDiQOKA4sDjAONA44DjwO7A70DvwPUA9oD4ARJBEsETwRXBFkEXgRqAAEAAAABAAgAAgF0ALcBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAv0DMAI7AfoEygTLAfsB/AH9Af4B/wIABM4EzwTRBNQE3QICAgMCBAIFAgYCBwIIAgkCCgILAfQB9QH2AfcB+AH5Ai8CDwIQAhECFAIVAhcCGQL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZA08DGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAy4DLwMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRgNFA0cDSANJA0oDSwNMA00DTgNQA1EDUgTJBMwEzQTQBNIE0wIBBNUEwQTCBMMExATFBMYExwTIBNYE2ATZAhgE2wIaBNwC/AIOBNcCEwINBNoCFgIMAhIAAQC3AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgCHAIwAkwDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwA/QD+AP8BAAEBAQIBAwEEAQUBBgEtATEBMwE5ATsBPQFAAUcCSwJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoQChgKIAooCjAKOApACkgKUApYCmAKaApwCngKgAqICpAKmAqgCqgKsAq4CswK1ArcCuQK7Ar0CvwLBAsMCxgLIAsoCzALOAtAC0gLUAtYC2gLcAt4C4ALiAuQC5gLoAuoC7ALuAvAC8wL1AvcDkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwO8A74DwAPOA9UD2wPhBEcESgRMBFAEWARaBFsEXwRrAAYAAAAGABIAKgBCAFoAcgCKAAMAAAABABIAAQCQAAEAAAAaAAEAAQBNAAMAAAABABIAAQB4AAEAAAAaAAEAAQBOAAMAAAABABIAAQBgAAEAAAAaAAEAAQKuAAMAAAABABIAAQBIAAEAAAAaAAEAAQObAAMAAAABABIAAQAwAAEAAAAaAAEAAQOdAAMAAAABABIAAQAYAAEAAAAaAAEAAQQaAAIAAQCnAKsAAAAEAAAAAQAIAAEGHgA2AHIApACuALgAygD8AQ4BGAFKAWQBfgGQAboB7AH2AhgCMgJEAnYCiAKiAswC3gMQAxoDJAM2A2gDcgN8A4YDoAO6A8wD9gQoBDIEVARuBIAEsgTEBN4FCAUaBSQFLgU4BUIFbAWWBcAF6gYUAAYADgAUABoAIAAmACwCTAACAKcCTQACAKgCTwACAKkD8QACAKoEewACAKsD7wACAKwAAQAEBIgAAgCsAAEABAKJAAIAqAACAAYADASKAAIArASMAAIBogAGAA4AFAAaACAAJgAsAlQAAgCnAlUAAgCoBAsAAgCpBAkAAgCqBH0AAgCrBAcAAgCsAAIABgAMBHcAAgCoAqMAAgGiAAEABASOAAIArAAGAA4AFAAaACAAJgAsAlgAAgCnAlkAAgCoAqcAAgCpBBcAAgCqBH8AAgCrBBkAAgCsAAMACAAOABQEkAACAKgEkgACAKwCtAACAaIAAwAIAA4AFAK2AAIAqASUAAIArAK4AAIBogACAAYADAOtAAIAqASWAAIArAAFAAwAEgAYAB4AJAR5AAIApwK+AAIAqAJcAAIAqQSYAAIArALAAAIBogAGAA4AFAAaACAAJgAsAl0AAgCnAl4AAgCoAmAAAgCpBB0AAgCqBIEAAgCrBBsAAgCsAAEABASaAAIAqAAEAAoAEAAWABwCywACAKgEgwACAKsEnAACAKwCzQACAaIAAwAIAA4AFALRAAIAqASeAAIArALXAAIBogACAAYADASgAAIArALbAAIBogAGAA4AFAAaACAAJgAsAmIAAgCnAmMAAgCoAuEAAgCpBDUAAgCqBIUAAgCrBDMAAgCsAAIABgAMBKIAAgCpBKQAAgCsAAMACAAOABQDoAACAKcDogACAKgEpgACAKwABQAMABIAGAAeACQDpgACAKcCZgACAKgERQACAKkEQwACAKoEQQACAKwAAgAGAAwC8gACAKgEqAACAKwABgAOABQAGgAgACYALAJnAAIApwJoAAIAqAJqAAIAqQPyAAIAqgR8AAIAqwPwAAIArAABAAQEiQACAKwAAQAEAooAAgCoAAIABgAMBIsAAgCsBI0AAgGiAAYADgAUABoAIAAmACwCbwACAKcCcAACAKgEDAACAKkECgACAKoEfgACAKsECAACAKwAAQAEBHgAAgCoAAEABASPAAIArAABAAQEGgACAKwAAwAIAA4AFASRAAIAqASTAAIArAK1AAIBogADAAgADgAUArcAAgCoBJUAAgCsArkAAgGiAAIABgAMA64AAgCoBJcAAgCsAAUADAASABgAHgAkBHoAAgCnAr8AAgCoAncAAgCpBJkAAgCsAsEAAgGiAAYADgAUABoAIAAmACwCeAACAKcCeQACAKgCewACAKkEHgACAKoEggACAKsEHAACAKwAAQAEBJsAAgCoAAQACgAQABYAHALMAAIAqASEAAIAqwSdAAIArALOAAIBogADAAgADgAUAtIAAgCoBJ8AAgCsAtgAAgGiAAIABgAMBKEAAgCsAtwAAgGiAAYADgAUABoAIAAmACwCfQACAKcCfgACAKgC4gACAKkENgACAKoEhgACAKsENAACAKwAAgAGAAwEowACAKkEpQACAKwAAwAIAA4AFAOhAAIApwOjAAIAqASnAAIArAAFAAwAEgAYAB4AJAOnAAIApwKBAAIAqARGAAIAqQREAAIAqgRCAAIArAACAAYADALzAAIAqASpAAIArAABAAQC+AACAKgAAQAEAvoAAgCoAAEABAL5AAIAqAABAAQC+wACAKgABQAMABIAGAAeACQCcwACAKcCdAACAKgCqAACAKkEGAACAKoEgAACAKsABQAMABIAGAAeACQEKwACAKcEKQACAKgELwACAKkELQACAKoEMQACAKwABQAMABIAGAAeACQELAACAKcEKgACAKgEMAACAKkELgACAKoEMgACAKwABQAMABIAGAAeACQEOQACAKcENwACAKgEPQACAKkEOwACAKoEPwACAKwABQAMABIAGAAeACQEOgACAKcEOAACAKgEPgACAKkEPAACAKoEQAACAKwAAQAEBIcAAgCoAAIAEQAlACkAAAArAC0ABQAvADQACAA2ADsADgA9AD4AFABFAEkAFgBLAE0AGwBPAFQAHgBWAFsAJABdAF4AKgCBAIEALACDAIMALQCGAIYALgCJAIkALwCMAIwAMACXAJoAMQDPAM8ANQABAAAAAQAIAAEABgACAAEAAgLVAtYAAQAAAAEACAACAA4ABATeBN8E4AThAAEABAKHAogCmQKaAAQAAAABAAgAAQAmAAIACgAcAAIABgAMAaMAAgBKAagAAgBYAAEABAGpAAIAWAABAAIASgBXAAQAAAABAAgAAQBEAAIACgAUAAEABAGkAAIATQABAAQBpgACAE0ABAAAAAEACAABAB4AAgAKABQAAQAEAaUAAgBQAAEABAGnAAIAUAABAAIASgGjAAEAAAABAAgAAQAGAZUAAQABAEsAAQAAAAEACAABAAYBJwABAAEAugABAAAAAQAIAAEABgGsAAEAAQA2AAEAAAABAAgAAgAcAAIB4wHkAAEAAAABAAgAAgAKAAIB5QHmAAEAAgAvAE8AAQAAAAEACAACAB4ADAIoAioCKQIrAiwCHwIgAiECIgGuAiQCJQABAAwAJwAoACsAMwA1AEYARwBIAEsAUwBUAFUAAQAAAAEACAACAAwAAwImAicCJwABAAMASQBLAiIAAQAAAAEACAACAGYACAI9Ai0CLgIwAjECOQI6AjwAAQAAAAEACAACABYACAAbABUAFgAXABgAGQAdABQAAQAIAa0CIwRxBHIEcwR0BHUEdgABAAAAAQAIAAIAFgAIBHYCIwRxBHIEcwR0Aa0EdQABAAgAFAAVABYAFwAYABkAGwAdAAEAAAABAAgAAgAWAAgAFQAWABcAGAAZABsAHQAUAAEACAItAi4CMAIxAjkCOgI8Aj0AAQAAAAEACAABAAYBaQABAAEAEwAGAAAAAQAIAAMAAQASAAEAUgAAAAEAAAAaAAIAAgF8AXwAAAHUAd0AAQABAAAAAQAIAAEAKAHAAAEAAAABAAgAAgAaAAoCMgB6AHMAdAIzAjQCNQI2AjcCOAACAAEAFAAdAAAAAQAAAAEACAACACYAEAHUAdUB1gHXAdgB2QHaAdsB3AHdAkACPgJBAkICPwJDAAEAEAAUABUAFgAXABgAGQAaABsAHAAdAE0ATgKuA5sDnQQa",
  65903. "sampleImage.jpg": "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AAGyAAAAEAAAAAEAAAAAABJwcmludE91dHB1dE9wdGlvbnMAAAASAAAAAENwdG5ib29sAAAAAABDbGJyYm9vbAAAAAAAUmdzTWJvb2wAAAAAAENybkNib29sAAAAAABDbnRDYm9vbAAAAAAATGJsc2Jvb2wAAAAAAE5ndHZib29sAAAAAABFbWxEYm9vbAAAAAAASW50cmJvb2wAAAAAAEJja2dPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAAAABCbCAgZG91YkBv4AAAAAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQZ1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVudEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAA4QklNA+0AAAAAABAASAAAAAEAAgBIAAAAAQACOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgABOEJJTQQCAAAAAAAEAAAAADhCSU0EMAAAAAAAAgEBOEJJTQQtAAAAAAAGAAEAAAACOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0sAAAAGAAAA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aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNC0wMy0xOVQwMzowMjoyNiswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxNC0wMy0xOVQwMzowMjoyNiswMTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTQtMDMtMTlUMDM6MDI6MjYrMDE6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDI4MDExNzQwNzIwNjgxMTg3MUY4MTMxRkI2RTY4OTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTg3MUY4MTMxRkI2RTY4OTgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowMTgwMTE3NDA3MjA2ODExODcxRjgxMzFGQjZFNjg5OCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjAxODAxMTc0MDcyMDY4MTE4NzFGODEzMUZCNkU2ODk4IiBzdEV2dDp3aGVuPSIyMDE0LTAzLTE5VDAzOjAyOjI2KzAxOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDowMjgwMTE3NDA3MjA2ODExODcxRjgxMzFGQjZFNjg5OCIgc3RFdnQ6d2hlbj0iMjAxNC0wMy0xOVQwMzowMjoyNiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAA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"
  65904. };
  65905. /*! DataTables 1.10.16
  65906. * ©2008-2017 SpryMedia Ltd - datatables.net/license
  65907. */
  65908. /**
  65909. * @summary DataTables
  65910. * @description Paginate, search and order HTML tables
  65911. * @version 1.10.16
  65912. * @file jquery.dataTables.js
  65913. * @author SpryMedia Ltd
  65914. * @contact www.datatables.net
  65915. * @copyright Copyright 2008-2017 SpryMedia Ltd.
  65916. *
  65917. * This source file is free software, available under the following license:
  65918. * MIT license - http://datatables.net/license
  65919. *
  65920. * This source file is distributed in the hope that it will be useful, but
  65921. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  65922. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  65923. *
  65924. * For details please refer to: http://www.datatables.net
  65925. */
  65926. /*jslint evil: true, undef: true, browser: true */
  65927. /*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
  65928. (function( factory ) {
  65929. "use strict";
  65930. if ( typeof define === 'function' && define.amd ) {
  65931. // AMD
  65932. define( ['jquery'], function ( $ ) {
  65933. return factory( $, window, document );
  65934. } );
  65935. }
  65936. else if ( typeof exports === 'object' ) {
  65937. // CommonJS
  65938. module.exports = function (root, $) {
  65939. if ( ! root ) {
  65940. // CommonJS environments without a window global must pass a
  65941. // root. This will give an error otherwise
  65942. root = window;
  65943. }
  65944. if ( ! $ ) {
  65945. $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
  65946. require('jquery') :
  65947. require('jquery')( root );
  65948. }
  65949. return factory( $, root, root.document );
  65950. };
  65951. }
  65952. else {
  65953. // Browser
  65954. factory( jQuery, window, document );
  65955. }
  65956. }
  65957. (function( $, window, document, undefined ) {
  65958. "use strict";
  65959. /**
  65960. * DataTables is a plug-in for the jQuery Javascript library. It is a highly
  65961. * flexible tool, based upon the foundations of progressive enhancement,
  65962. * which will add advanced interaction controls to any HTML table. For a
  65963. * full list of features please refer to
  65964. * [DataTables.net](href="http://datatables.net).
  65965. *
  65966. * Note that the `DataTable` object is not a global variable but is aliased
  65967. * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
  65968. * be accessed.
  65969. *
  65970. * @class
  65971. * @param {object} [init={}] Configuration object for DataTables. Options
  65972. * are defined by {@link DataTable.defaults}
  65973. * @requires jQuery 1.7+
  65974. *
  65975. * @example
  65976. * // Basic initialisation
  65977. * $(document).ready( function {
  65978. * $('#example').dataTable();
  65979. * } );
  65980. *
  65981. * @example
  65982. * // Initialisation with configuration options - in this case, disable
  65983. * // pagination and sorting.
  65984. * $(document).ready( function {
  65985. * $('#example').dataTable( {
  65986. * "paginate": false,
  65987. * "sort": false
  65988. * } );
  65989. * } );
  65990. */
  65991. var DataTable = function ( options )
  65992. {
  65993. /**
  65994. * Perform a jQuery selector action on the table's TR elements (from the tbody) and
  65995. * return the resulting jQuery object.
  65996. * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
  65997. * @param {object} [oOpts] Optional parameters for modifying the rows to be included
  65998. * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
  65999. * criterion ("applied") or all TR elements (i.e. no filter).
  66000. * @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
  66001. * Can be either 'current', whereby the current sorting of the table is used, or
  66002. * 'original' whereby the original order the data was read into the table is used.
  66003. * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
  66004. * ("current") or not ("all"). If 'current' is given, then order is assumed to be
  66005. * 'current' and filter is 'applied', regardless of what they might be given as.
  66006. * @returns {object} jQuery object, filtered by the given selector.
  66007. * @dtopt API
  66008. * @deprecated Since v1.10
  66009. *
  66010. * @example
  66011. * $(document).ready(function() {
  66012. * var oTable = $('#example').dataTable();
  66013. *
  66014. * // Highlight every second row
  66015. * oTable.$('tr:odd').css('backgroundColor', 'blue');
  66016. * } );
  66017. *
  66018. * @example
  66019. * $(document).ready(function() {
  66020. * var oTable = $('#example').dataTable();
  66021. *
  66022. * // Filter to rows with 'Webkit' in them, add a background colour and then
  66023. * // remove the filter, thus highlighting the 'Webkit' rows only.
  66024. * oTable.fnFilter('Webkit');
  66025. * oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
  66026. * oTable.fnFilter('');
  66027. * } );
  66028. */
  66029. this.$ = function ( sSelector, oOpts )
  66030. {
  66031. return this.api(true).$( sSelector, oOpts );
  66032. };
  66033. /**
  66034. * Almost identical to $ in operation, but in this case returns the data for the matched
  66035. * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
  66036. * rather than any descendants, so the data can be obtained for the row/cell. If matching
  66037. * rows are found, the data returned is the original data array/object that was used to
  66038. * create the row (or a generated array if from a DOM source).
  66039. *
  66040. * This method is often useful in-combination with $ where both functions are given the
  66041. * same parameters and the array indexes will match identically.
  66042. * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
  66043. * @param {object} [oOpts] Optional parameters for modifying the rows to be included
  66044. * @param {string} [oOpts.filter=none] Select elements that meet the current filter
  66045. * criterion ("applied") or all elements (i.e. no filter).
  66046. * @param {string} [oOpts.order=current] Order of the data in the processed array.
  66047. * Can be either 'current', whereby the current sorting of the table is used, or
  66048. * 'original' whereby the original order the data was read into the table is used.
  66049. * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
  66050. * ("current") or not ("all"). If 'current' is given, then order is assumed to be
  66051. * 'current' and filter is 'applied', regardless of what they might be given as.
  66052. * @returns {array} Data for the matched elements. If any elements, as a result of the
  66053. * selector, were not TR, TD or TH elements in the DataTable, they will have a null
  66054. * entry in the array.
  66055. * @dtopt API
  66056. * @deprecated Since v1.10
  66057. *
  66058. * @example
  66059. * $(document).ready(function() {
  66060. * var oTable = $('#example').dataTable();
  66061. *
  66062. * // Get the data from the first row in the table
  66063. * var data = oTable._('tr:first');
  66064. *
  66065. * // Do something useful with the data
  66066. * alert( "First cell is: "+data[0] );
  66067. * } );
  66068. *
  66069. * @example
  66070. * $(document).ready(function() {
  66071. * var oTable = $('#example').dataTable();
  66072. *
  66073. * // Filter to 'Webkit' and get all data for
  66074. * oTable.fnFilter('Webkit');
  66075. * var data = oTable._('tr', {"search": "applied"});
  66076. *
  66077. * // Do something with the data
  66078. * alert( data.length+" rows matched the search" );
  66079. * } );
  66080. */
  66081. this._ = function ( sSelector, oOpts )
  66082. {
  66083. return this.api(true).rows( sSelector, oOpts ).data();
  66084. };
  66085. /**
  66086. * Create a DataTables Api instance, with the currently selected tables for
  66087. * the Api's context.
  66088. * @param {boolean} [traditional=false] Set the API instance's context to be
  66089. * only the table referred to by the `DataTable.ext.iApiIndex` option, as was
  66090. * used in the API presented by DataTables 1.9- (i.e. the traditional mode),
  66091. * or if all tables captured in the jQuery object should be used.
  66092. * @return {DataTables.Api}
  66093. */
  66094. this.api = function ( traditional )
  66095. {
  66096. return traditional ?
  66097. new _Api(
  66098. _fnSettingsFromNode( this[ _ext.iApiIndex ] )
  66099. ) :
  66100. new _Api( this );
  66101. };
  66102. /**
  66103. * Add a single new row or multiple rows of data to the table. Please note
  66104. * that this is suitable for client-side processing only - if you are using
  66105. * server-side processing (i.e. "bServerSide": true), then to add data, you
  66106. * must add it to the data source, i.e. the server-side, through an Ajax call.
  66107. * @param {array|object} data The data to be added to the table. This can be:
  66108. * <ul>
  66109. * <li>1D array of data - add a single row with the data provided</li>
  66110. * <li>2D array of arrays - add multiple rows in a single call</li>
  66111. * <li>object - data object when using <i>mData</i></li>
  66112. * <li>array of objects - multiple data objects when using <i>mData</i></li>
  66113. * </ul>
  66114. * @param {bool} [redraw=true] redraw the table or not
  66115. * @returns {array} An array of integers, representing the list of indexes in
  66116. * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
  66117. * the table.
  66118. * @dtopt API
  66119. * @deprecated Since v1.10
  66120. *
  66121. * @example
  66122. * // Global var for counter
  66123. * var giCount = 2;
  66124. *
  66125. * $(document).ready(function() {
  66126. * $('#example').dataTable();
  66127. * } );
  66128. *
  66129. * function fnClickAddRow() {
  66130. * $('#example').dataTable().fnAddData( [
  66131. * giCount+".1",
  66132. * giCount+".2",
  66133. * giCount+".3",
  66134. * giCount+".4" ]
  66135. * );
  66136. *
  66137. * giCount++;
  66138. * }
  66139. */
  66140. this.fnAddData = function( data, redraw )
  66141. {
  66142. var api = this.api( true );
  66143. /* Check if we want to add multiple rows or not */
  66144. var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
  66145. api.rows.add( data ) :
  66146. api.row.add( data );
  66147. if ( redraw === undefined || redraw ) {
  66148. api.draw();
  66149. }
  66150. return rows.flatten().toArray();
  66151. };
  66152. /**
  66153. * This function will make DataTables recalculate the column sizes, based on the data
  66154. * contained in the table and the sizes applied to the columns (in the DOM, CSS or
  66155. * through the sWidth parameter). This can be useful when the width of the table's
  66156. * parent element changes (for example a window resize).
  66157. * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
  66158. * @dtopt API
  66159. * @deprecated Since v1.10
  66160. *
  66161. * @example
  66162. * $(document).ready(function() {
  66163. * var oTable = $('#example').dataTable( {
  66164. * "sScrollY": "200px",
  66165. * "bPaginate": false
  66166. * } );
  66167. *
  66168. * $(window).on('resize', function () {
  66169. * oTable.fnAdjustColumnSizing();
  66170. * } );
  66171. * } );
  66172. */
  66173. this.fnAdjustColumnSizing = function ( bRedraw )
  66174. {
  66175. var api = this.api( true ).columns.adjust();
  66176. var settings = api.settings()[0];
  66177. var scroll = settings.oScroll;
  66178. if ( bRedraw === undefined || bRedraw ) {
  66179. api.draw( false );
  66180. }
  66181. else if ( scroll.sX !== "" || scroll.sY !== "" ) {
  66182. /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
  66183. _fnScrollDraw( settings );
  66184. }
  66185. };
  66186. /**
  66187. * Quickly and simply clear a table
  66188. * @param {bool} [bRedraw=true] redraw the table or not
  66189. * @dtopt API
  66190. * @deprecated Since v1.10
  66191. *
  66192. * @example
  66193. * $(document).ready(function() {
  66194. * var oTable = $('#example').dataTable();
  66195. *
  66196. * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
  66197. * oTable.fnClearTable();
  66198. * } );
  66199. */
  66200. this.fnClearTable = function( bRedraw )
  66201. {
  66202. var api = this.api( true ).clear();
  66203. if ( bRedraw === undefined || bRedraw ) {
  66204. api.draw();
  66205. }
  66206. };
  66207. /**
  66208. * The exact opposite of 'opening' a row, this function will close any rows which
  66209. * are currently 'open'.
  66210. * @param {node} nTr the table row to 'close'
  66211. * @returns {int} 0 on success, or 1 if failed (can't find the row)
  66212. * @dtopt API
  66213. * @deprecated Since v1.10
  66214. *
  66215. * @example
  66216. * $(document).ready(function() {
  66217. * var oTable;
  66218. *
  66219. * // 'open' an information row when a row is clicked on
  66220. * $('#example tbody tr').click( function () {
  66221. * if ( oTable.fnIsOpen(this) ) {
  66222. * oTable.fnClose( this );
  66223. * } else {
  66224. * oTable.fnOpen( this, "Temporary row opened", "info_row" );
  66225. * }
  66226. * } );
  66227. *
  66228. * oTable = $('#example').dataTable();
  66229. * } );
  66230. */
  66231. this.fnClose = function( nTr )
  66232. {
  66233. this.api( true ).row( nTr ).child.hide();
  66234. };
  66235. /**
  66236. * Remove a row for the table
  66237. * @param {mixed} target The index of the row from aoData to be deleted, or
  66238. * the TR element you want to delete
  66239. * @param {function|null} [callBack] Callback function
  66240. * @param {bool} [redraw=true] Redraw the table or not
  66241. * @returns {array} The row that was deleted
  66242. * @dtopt API
  66243. * @deprecated Since v1.10
  66244. *
  66245. * @example
  66246. * $(document).ready(function() {
  66247. * var oTable = $('#example').dataTable();
  66248. *
  66249. * // Immediately remove the first row
  66250. * oTable.fnDeleteRow( 0 );
  66251. * } );
  66252. */
  66253. this.fnDeleteRow = function( target, callback, redraw )
  66254. {
  66255. var api = this.api( true );
  66256. var rows = api.rows( target );
  66257. var settings = rows.settings()[0];
  66258. var data = settings.aoData[ rows[0][0] ];
  66259. rows.remove();
  66260. if ( callback ) {
  66261. callback.call( this, settings, data );
  66262. }
  66263. if ( redraw === undefined || redraw ) {
  66264. api.draw();
  66265. }
  66266. return data;
  66267. };
  66268. /**
  66269. * Restore the table to it's original state in the DOM by removing all of DataTables
  66270. * enhancements, alterations to the DOM structure of the table and event listeners.
  66271. * @param {boolean} [remove=false] Completely remove the table from the DOM
  66272. * @dtopt API
  66273. * @deprecated Since v1.10
  66274. *
  66275. * @example
  66276. * $(document).ready(function() {
  66277. * // This example is fairly pointless in reality, but shows how fnDestroy can be used
  66278. * var oTable = $('#example').dataTable();
  66279. * oTable.fnDestroy();
  66280. * } );
  66281. */
  66282. this.fnDestroy = function ( remove )
  66283. {
  66284. this.api( true ).destroy( remove );
  66285. };
  66286. /**
  66287. * Redraw the table
  66288. * @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
  66289. * @dtopt API
  66290. * @deprecated Since v1.10
  66291. *
  66292. * @example
  66293. * $(document).ready(function() {
  66294. * var oTable = $('#example').dataTable();
  66295. *
  66296. * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
  66297. * oTable.fnDraw();
  66298. * } );
  66299. */
  66300. this.fnDraw = function( complete )
  66301. {
  66302. // Note that this isn't an exact match to the old call to _fnDraw - it takes
  66303. // into account the new data, but can hold position.
  66304. this.api( true ).draw( complete );
  66305. };
  66306. /**
  66307. * Filter the input based on data
  66308. * @param {string} sInput String to filter the table on
  66309. * @param {int|null} [iColumn] Column to limit filtering to
  66310. * @param {bool} [bRegex=false] Treat as regular expression or not
  66311. * @param {bool} [bSmart=true] Perform smart filtering or not
  66312. * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
  66313. * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
  66314. * @dtopt API
  66315. * @deprecated Since v1.10
  66316. *
  66317. * @example
  66318. * $(document).ready(function() {
  66319. * var oTable = $('#example').dataTable();
  66320. *
  66321. * // Sometime later - filter...
  66322. * oTable.fnFilter( 'test string' );
  66323. * } );
  66324. */
  66325. this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
  66326. {
  66327. var api = this.api( true );
  66328. if ( iColumn === null || iColumn === undefined ) {
  66329. api.search( sInput, bRegex, bSmart, bCaseInsensitive );
  66330. }
  66331. else {
  66332. api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
  66333. }
  66334. api.draw();
  66335. };
  66336. /**
  66337. * Get the data for the whole table, an individual row or an individual cell based on the
  66338. * provided parameters.
  66339. * @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
  66340. * a TR node then the data source for the whole row will be returned. If given as a
  66341. * TD/TH cell node then iCol will be automatically calculated and the data for the
  66342. * cell returned. If given as an integer, then this is treated as the aoData internal
  66343. * data index for the row (see fnGetPosition) and the data for that row used.
  66344. * @param {int} [col] Optional column index that you want the data of.
  66345. * @returns {array|object|string} If mRow is undefined, then the data for all rows is
  66346. * returned. If mRow is defined, just data for that row, and is iCol is
  66347. * defined, only data for the designated cell is returned.
  66348. * @dtopt API
  66349. * @deprecated Since v1.10
  66350. *
  66351. * @example
  66352. * // Row data
  66353. * $(document).ready(function() {
  66354. * oTable = $('#example').dataTable();
  66355. *
  66356. * oTable.$('tr').click( function () {
  66357. * var data = oTable.fnGetData( this );
  66358. * // ... do something with the array / object of data for the row
  66359. * } );
  66360. * } );
  66361. *
  66362. * @example
  66363. * // Individual cell data
  66364. * $(document).ready(function() {
  66365. * oTable = $('#example').dataTable();
  66366. *
  66367. * oTable.$('td').click( function () {
  66368. * var sData = oTable.fnGetData( this );
  66369. * alert( 'The cell clicked on had the value of '+sData );
  66370. * } );
  66371. * } );
  66372. */
  66373. this.fnGetData = function( src, col )
  66374. {
  66375. var api = this.api( true );
  66376. if ( src !== undefined ) {
  66377. var type = src.nodeName ? src.nodeName.toLowerCase() : '';
  66378. return col !== undefined || type == 'td' || type == 'th' ?
  66379. api.cell( src, col ).data() :
  66380. api.row( src ).data() || null;
  66381. }
  66382. return api.data().toArray();
  66383. };
  66384. /**
  66385. * Get an array of the TR nodes that are used in the table's body. Note that you will
  66386. * typically want to use the '$' API method in preference to this as it is more
  66387. * flexible.
  66388. * @param {int} [iRow] Optional row index for the TR element you want
  66389. * @returns {array|node} If iRow is undefined, returns an array of all TR elements
  66390. * in the table's body, or iRow is defined, just the TR element requested.
  66391. * @dtopt API
  66392. * @deprecated Since v1.10
  66393. *
  66394. * @example
  66395. * $(document).ready(function() {
  66396. * var oTable = $('#example').dataTable();
  66397. *
  66398. * // Get the nodes from the table
  66399. * var nNodes = oTable.fnGetNodes( );
  66400. * } );
  66401. */
  66402. this.fnGetNodes = function( iRow )
  66403. {
  66404. var api = this.api( true );
  66405. return iRow !== undefined ?
  66406. api.row( iRow ).node() :
  66407. api.rows().nodes().flatten().toArray();
  66408. };
  66409. /**
  66410. * Get the array indexes of a particular cell from it's DOM element
  66411. * and column index including hidden columns
  66412. * @param {node} node this can either be a TR, TD or TH in the table's body
  66413. * @returns {int} If nNode is given as a TR, then a single index is returned, or
  66414. * if given as a cell, an array of [row index, column index (visible),
  66415. * column index (all)] is given.
  66416. * @dtopt API
  66417. * @deprecated Since v1.10
  66418. *
  66419. * @example
  66420. * $(document).ready(function() {
  66421. * $('#example tbody td').click( function () {
  66422. * // Get the position of the current data from the node
  66423. * var aPos = oTable.fnGetPosition( this );
  66424. *
  66425. * // Get the data array for this row
  66426. * var aData = oTable.fnGetData( aPos[0] );
  66427. *
  66428. * // Update the data array and return the value
  66429. * aData[ aPos[1] ] = 'clicked';
  66430. * this.innerHTML = 'clicked';
  66431. * } );
  66432. *
  66433. * // Init DataTables
  66434. * oTable = $('#example').dataTable();
  66435. * } );
  66436. */
  66437. this.fnGetPosition = function( node )
  66438. {
  66439. var api = this.api( true );
  66440. var nodeName = node.nodeName.toUpperCase();
  66441. if ( nodeName == 'TR' ) {
  66442. return api.row( node ).index();
  66443. }
  66444. else if ( nodeName == 'TD' || nodeName == 'TH' ) {
  66445. var cell = api.cell( node ).index();
  66446. return [
  66447. cell.row,
  66448. cell.columnVisible,
  66449. cell.column
  66450. ];
  66451. }
  66452. return null;
  66453. };
  66454. /**
  66455. * Check to see if a row is 'open' or not.
  66456. * @param {node} nTr the table row to check
  66457. * @returns {boolean} true if the row is currently open, false otherwise
  66458. * @dtopt API
  66459. * @deprecated Since v1.10
  66460. *
  66461. * @example
  66462. * $(document).ready(function() {
  66463. * var oTable;
  66464. *
  66465. * // 'open' an information row when a row is clicked on
  66466. * $('#example tbody tr').click( function () {
  66467. * if ( oTable.fnIsOpen(this) ) {
  66468. * oTable.fnClose( this );
  66469. * } else {
  66470. * oTable.fnOpen( this, "Temporary row opened", "info_row" );
  66471. * }
  66472. * } );
  66473. *
  66474. * oTable = $('#example').dataTable();
  66475. * } );
  66476. */
  66477. this.fnIsOpen = function( nTr )
  66478. {
  66479. return this.api( true ).row( nTr ).child.isShown();
  66480. };
  66481. /**
  66482. * This function will place a new row directly after a row which is currently
  66483. * on display on the page, with the HTML contents that is passed into the
  66484. * function. This can be used, for example, to ask for confirmation that a
  66485. * particular record should be deleted.
  66486. * @param {node} nTr The table row to 'open'
  66487. * @param {string|node|jQuery} mHtml The HTML to put into the row
  66488. * @param {string} sClass Class to give the new TD cell
  66489. * @returns {node} The row opened. Note that if the table row passed in as the
  66490. * first parameter, is not found in the table, this method will silently
  66491. * return.
  66492. * @dtopt API
  66493. * @deprecated Since v1.10
  66494. *
  66495. * @example
  66496. * $(document).ready(function() {
  66497. * var oTable;
  66498. *
  66499. * // 'open' an information row when a row is clicked on
  66500. * $('#example tbody tr').click( function () {
  66501. * if ( oTable.fnIsOpen(this) ) {
  66502. * oTable.fnClose( this );
  66503. * } else {
  66504. * oTable.fnOpen( this, "Temporary row opened", "info_row" );
  66505. * }
  66506. * } );
  66507. *
  66508. * oTable = $('#example').dataTable();
  66509. * } );
  66510. */
  66511. this.fnOpen = function( nTr, mHtml, sClass )
  66512. {
  66513. return this.api( true )
  66514. .row( nTr )
  66515. .child( mHtml, sClass )
  66516. .show()
  66517. .child()[0];
  66518. };
  66519. /**
  66520. * Change the pagination - provides the internal logic for pagination in a simple API
  66521. * function. With this function you can have a DataTables table go to the next,
  66522. * previous, first or last pages.
  66523. * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
  66524. * or page number to jump to (integer), note that page 0 is the first page.
  66525. * @param {bool} [bRedraw=true] Redraw the table or not
  66526. * @dtopt API
  66527. * @deprecated Since v1.10
  66528. *
  66529. * @example
  66530. * $(document).ready(function() {
  66531. * var oTable = $('#example').dataTable();
  66532. * oTable.fnPageChange( 'next' );
  66533. * } );
  66534. */
  66535. this.fnPageChange = function ( mAction, bRedraw )
  66536. {
  66537. var api = this.api( true ).page( mAction );
  66538. if ( bRedraw === undefined || bRedraw ) {
  66539. api.draw(false);
  66540. }
  66541. };
  66542. /**
  66543. * Show a particular column
  66544. * @param {int} iCol The column whose display should be changed
  66545. * @param {bool} bShow Show (true) or hide (false) the column
  66546. * @param {bool} [bRedraw=true] Redraw the table or not
  66547. * @dtopt API
  66548. * @deprecated Since v1.10
  66549. *
  66550. * @example
  66551. * $(document).ready(function() {
  66552. * var oTable = $('#example').dataTable();
  66553. *
  66554. * // Hide the second column after initialisation
  66555. * oTable.fnSetColumnVis( 1, false );
  66556. * } );
  66557. */
  66558. this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
  66559. {
  66560. var api = this.api( true ).column( iCol ).visible( bShow );
  66561. if ( bRedraw === undefined || bRedraw ) {
  66562. api.columns.adjust().draw();
  66563. }
  66564. };
  66565. /**
  66566. * Get the settings for a particular table for external manipulation
  66567. * @returns {object} DataTables settings object. See
  66568. * {@link DataTable.models.oSettings}
  66569. * @dtopt API
  66570. * @deprecated Since v1.10
  66571. *
  66572. * @example
  66573. * $(document).ready(function() {
  66574. * var oTable = $('#example').dataTable();
  66575. * var oSettings = oTable.fnSettings();
  66576. *
  66577. * // Show an example parameter from the settings
  66578. * alert( oSettings._iDisplayStart );
  66579. * } );
  66580. */
  66581. this.fnSettings = function()
  66582. {
  66583. return _fnSettingsFromNode( this[_ext.iApiIndex] );
  66584. };
  66585. /**
  66586. * Sort the table by a particular column
  66587. * @param {int} iCol the data index to sort on. Note that this will not match the
  66588. * 'display index' if you have hidden data entries
  66589. * @dtopt API
  66590. * @deprecated Since v1.10
  66591. *
  66592. * @example
  66593. * $(document).ready(function() {
  66594. * var oTable = $('#example').dataTable();
  66595. *
  66596. * // Sort immediately with columns 0 and 1
  66597. * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
  66598. * } );
  66599. */
  66600. this.fnSort = function( aaSort )
  66601. {
  66602. this.api( true ).order( aaSort ).draw();
  66603. };
  66604. /**
  66605. * Attach a sort listener to an element for a given column
  66606. * @param {node} nNode the element to attach the sort listener to
  66607. * @param {int} iColumn the column that a click on this node will sort on
  66608. * @param {function} [fnCallback] callback function when sort is run
  66609. * @dtopt API
  66610. * @deprecated Since v1.10
  66611. *
  66612. * @example
  66613. * $(document).ready(function() {
  66614. * var oTable = $('#example').dataTable();
  66615. *
  66616. * // Sort on column 1, when 'sorter' is clicked on
  66617. * oTable.fnSortListener( document.getElementById('sorter'), 1 );
  66618. * } );
  66619. */
  66620. this.fnSortListener = function( nNode, iColumn, fnCallback )
  66621. {
  66622. this.api( true ).order.listener( nNode, iColumn, fnCallback );
  66623. };
  66624. /**
  66625. * Update a table cell or row - this method will accept either a single value to
  66626. * update the cell with, an array of values with one element for each column or
  66627. * an object in the same format as the original data source. The function is
  66628. * self-referencing in order to make the multi column updates easier.
  66629. * @param {object|array|string} mData Data to update the cell/row with
  66630. * @param {node|int} mRow TR element you want to update or the aoData index
  66631. * @param {int} [iColumn] The column to update, give as null or undefined to
  66632. * update a whole row.
  66633. * @param {bool} [bRedraw=true] Redraw the table or not
  66634. * @param {bool} [bAction=true] Perform pre-draw actions or not
  66635. * @returns {int} 0 on success, 1 on error
  66636. * @dtopt API
  66637. * @deprecated Since v1.10
  66638. *
  66639. * @example
  66640. * $(document).ready(function() {
  66641. * var oTable = $('#example').dataTable();
  66642. * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
  66643. * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
  66644. * } );
  66645. */
  66646. this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
  66647. {
  66648. var api = this.api( true );
  66649. if ( iColumn === undefined || iColumn === null ) {
  66650. api.row( mRow ).data( mData );
  66651. }
  66652. else {
  66653. api.cell( mRow, iColumn ).data( mData );
  66654. }
  66655. if ( bAction === undefined || bAction ) {
  66656. api.columns.adjust();
  66657. }
  66658. if ( bRedraw === undefined || bRedraw ) {
  66659. api.draw();
  66660. }
  66661. return 0;
  66662. };
  66663. /**
  66664. * Provide a common method for plug-ins to check the version of DataTables being used, in order
  66665. * to ensure compatibility.
  66666. * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
  66667. * formats "X" and "X.Y" are also acceptable.
  66668. * @returns {boolean} true if this version of DataTables is greater or equal to the required
  66669. * version, or false if this version of DataTales is not suitable
  66670. * @method
  66671. * @dtopt API
  66672. * @deprecated Since v1.10
  66673. *
  66674. * @example
  66675. * $(document).ready(function() {
  66676. * var oTable = $('#example').dataTable();
  66677. * alert( oTable.fnVersionCheck( '1.9.0' ) );
  66678. * } );
  66679. */
  66680. this.fnVersionCheck = _ext.fnVersionCheck;
  66681. var _that = this;
  66682. var emptyInit = options === undefined;
  66683. var len = this.length;
  66684. if ( emptyInit ) {
  66685. options = {};
  66686. }
  66687. this.oApi = this.internal = _ext.internal;
  66688. // Extend with old style plug-in API methods
  66689. for ( var fn in DataTable.ext.internal ) {
  66690. if ( fn ) {
  66691. this[fn] = _fnExternApiFunc(fn);
  66692. }
  66693. }
  66694. this.each(function() {
  66695. // For each initialisation we want to give it a clean initialisation
  66696. // object that can be bashed around
  66697. var o = {};
  66698. var oInit = len > 1 ? // optimisation for single table case
  66699. _fnExtend( o, options, true ) :
  66700. options;
  66701. /*global oInit,_that,emptyInit*/
  66702. var i=0, iLen, j, jLen, k, kLen;
  66703. var sId = this.getAttribute( 'id' );
  66704. var bInitHandedOff = false;
  66705. var defaults = DataTable.defaults;
  66706. var $this = $(this);
  66707. /* Sanity check */
  66708. if ( this.nodeName.toLowerCase() != 'table' )
  66709. {
  66710. _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
  66711. return;
  66712. }
  66713. /* Backwards compatibility for the defaults */
  66714. _fnCompatOpts( defaults );
  66715. _fnCompatCols( defaults.column );
  66716. /* Convert the camel-case defaults to Hungarian */
  66717. _fnCamelToHungarian( defaults, defaults, true );
  66718. _fnCamelToHungarian( defaults.column, defaults.column, true );
  66719. /* Setting up the initialisation object */
  66720. _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
  66721. /* Check to see if we are re-initialising a table */
  66722. var allSettings = DataTable.settings;
  66723. for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
  66724. {
  66725. var s = allSettings[i];
  66726. /* Base check on table node */
  66727. if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
  66728. {
  66729. var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
  66730. var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
  66731. if ( emptyInit || bRetrieve )
  66732. {
  66733. return s.oInstance;
  66734. }
  66735. else if ( bDestroy )
  66736. {
  66737. s.oInstance.fnDestroy();
  66738. break;
  66739. }
  66740. else
  66741. {
  66742. _fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
  66743. return;
  66744. }
  66745. }
  66746. /* If the element we are initialising has the same ID as a table which was previously
  66747. * initialised, but the table nodes don't match (from before) then we destroy the old
  66748. * instance by simply deleting it. This is under the assumption that the table has been
  66749. * destroyed by other methods. Anyone using non-id selectors will need to do this manually
  66750. */
  66751. if ( s.sTableId == this.id )
  66752. {
  66753. allSettings.splice( i, 1 );
  66754. break;
  66755. }
  66756. }
  66757. /* Ensure the table has an ID - required for accessibility */
  66758. if ( sId === null || sId === "" )
  66759. {
  66760. sId = "DataTables_Table_"+(DataTable.ext._unique++);
  66761. this.id = sId;
  66762. }
  66763. /* Create the settings object for this table and set some of the default parameters */
  66764. var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
  66765. "sDestroyWidth": $this[0].style.width,
  66766. "sInstance": sId,
  66767. "sTableId": sId
  66768. } );
  66769. oSettings.nTable = this;
  66770. oSettings.oApi = _that.internal;
  66771. oSettings.oInit = oInit;
  66772. allSettings.push( oSettings );
  66773. // Need to add the instance after the instance after the settings object has been added
  66774. // to the settings array, so we can self reference the table instance if more than one
  66775. oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
  66776. // Backwards compatibility, before we apply all the defaults
  66777. _fnCompatOpts( oInit );
  66778. if ( oInit.oLanguage )
  66779. {
  66780. _fnLanguageCompat( oInit.oLanguage );
  66781. }
  66782. // If the length menu is given, but the init display length is not, use the length menu
  66783. if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
  66784. {
  66785. oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
  66786. oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
  66787. }
  66788. // Apply the defaults and init options to make a single init object will all
  66789. // options defined from defaults and instance options.
  66790. oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
  66791. // Map the initialisation options onto the settings object
  66792. _fnMap( oSettings.oFeatures, oInit, [
  66793. "bPaginate",
  66794. "bLengthChange",
  66795. "bFilter",
  66796. "bSort",
  66797. "bSortMulti",
  66798. "bInfo",
  66799. "bProcessing",
  66800. "bAutoWidth",
  66801. "bSortClasses",
  66802. "bServerSide",
  66803. "bDeferRender"
  66804. ] );
  66805. _fnMap( oSettings, oInit, [
  66806. "asStripeClasses",
  66807. "ajax",
  66808. "fnServerData",
  66809. "fnFormatNumber",
  66810. "sServerMethod",
  66811. "aaSorting",
  66812. "aaSortingFixed",
  66813. "aLengthMenu",
  66814. "sPaginationType",
  66815. "sAjaxSource",
  66816. "sAjaxDataProp",
  66817. "iStateDuration",
  66818. "sDom",
  66819. "bSortCellsTop",
  66820. "iTabIndex",
  66821. "fnStateLoadCallback",
  66822. "fnStateSaveCallback",
  66823. "renderer",
  66824. "searchDelay",
  66825. "rowId",
  66826. [ "iCookieDuration", "iStateDuration" ], // backwards compat
  66827. [ "oSearch", "oPreviousSearch" ],
  66828. [ "aoSearchCols", "aoPreSearchCols" ],
  66829. [ "iDisplayLength", "_iDisplayLength" ]
  66830. ] );
  66831. _fnMap( oSettings.oScroll, oInit, [
  66832. [ "sScrollX", "sX" ],
  66833. [ "sScrollXInner", "sXInner" ],
  66834. [ "sScrollY", "sY" ],
  66835. [ "bScrollCollapse", "bCollapse" ]
  66836. ] );
  66837. _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
  66838. /* Callback functions which are array driven */
  66839. _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' );
  66840. _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' );
  66841. _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' );
  66842. _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' );
  66843. _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' );
  66844. _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' );
  66845. _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' );
  66846. _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' );
  66847. _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' );
  66848. _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' );
  66849. _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' );
  66850. oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
  66851. /* Browser support detection */
  66852. _fnBrowserDetect( oSettings );
  66853. var oClasses = oSettings.oClasses;
  66854. $.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
  66855. $this.addClass( oClasses.sTable );
  66856. if ( oSettings.iInitDisplayStart === undefined )
  66857. {
  66858. /* Display start point, taking into account the save saving */
  66859. oSettings.iInitDisplayStart = oInit.iDisplayStart;
  66860. oSettings._iDisplayStart = oInit.iDisplayStart;
  66861. }
  66862. if ( oInit.iDeferLoading !== null )
  66863. {
  66864. oSettings.bDeferLoading = true;
  66865. var tmp = $.isArray( oInit.iDeferLoading );
  66866. oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
  66867. oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
  66868. }
  66869. /* Language definitions */
  66870. var oLanguage = oSettings.oLanguage;
  66871. $.extend( true, oLanguage, oInit.oLanguage );
  66872. if ( oLanguage.sUrl )
  66873. {
  66874. /* Get the language definitions from a file - because this Ajax call makes the language
  66875. * get async to the remainder of this function we use bInitHandedOff to indicate that
  66876. * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
  66877. */
  66878. $.ajax( {
  66879. dataType: 'json',
  66880. url: oLanguage.sUrl,
  66881. success: function ( json ) {
  66882. _fnLanguageCompat( json );
  66883. _fnCamelToHungarian( defaults.oLanguage, json );
  66884. $.extend( true, oLanguage, json );
  66885. _fnInitialise( oSettings );
  66886. },
  66887. error: function () {
  66888. // Error occurred loading language file, continue on as best we can
  66889. _fnInitialise( oSettings );
  66890. }
  66891. } );
  66892. bInitHandedOff = true;
  66893. }
  66894. /*
  66895. * Stripes
  66896. */
  66897. if ( oInit.asStripeClasses === null )
  66898. {
  66899. oSettings.asStripeClasses =[
  66900. oClasses.sStripeOdd,
  66901. oClasses.sStripeEven
  66902. ];
  66903. }
  66904. /* Remove row stripe classes if they are already on the table row */
  66905. var stripeClasses = oSettings.asStripeClasses;
  66906. var rowOne = $this.children('tbody').find('tr').eq(0);
  66907. if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
  66908. return rowOne.hasClass(el);
  66909. } ) ) !== -1 ) {
  66910. $('tbody tr', this).removeClass( stripeClasses.join(' ') );
  66911. oSettings.asDestroyStripes = stripeClasses.slice();
  66912. }
  66913. /*
  66914. * Columns
  66915. * See if we should load columns automatically or use defined ones
  66916. */
  66917. var anThs = [];
  66918. var aoColumnsInit;
  66919. var nThead = this.getElementsByTagName('thead');
  66920. if ( nThead.length !== 0 )
  66921. {
  66922. _fnDetectHeader( oSettings.aoHeader, nThead[0] );
  66923. anThs = _fnGetUniqueThs( oSettings );
  66924. }
  66925. /* If not given a column array, generate one with nulls */
  66926. if ( oInit.aoColumns === null )
  66927. {
  66928. aoColumnsInit = [];
  66929. for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
  66930. {
  66931. aoColumnsInit.push( null );
  66932. }
  66933. }
  66934. else
  66935. {
  66936. aoColumnsInit = oInit.aoColumns;
  66937. }
  66938. /* Add the columns */
  66939. for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
  66940. {
  66941. _fnAddColumn( oSettings, anThs ? anThs[i] : null );
  66942. }
  66943. /* Apply the column definitions */
  66944. _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
  66945. _fnColumnOptions( oSettings, iCol, oDef );
  66946. } );
  66947. /* HTML5 attribute detection - build an mData object automatically if the
  66948. * attributes are found
  66949. */
  66950. if ( rowOne.length ) {
  66951. var a = function ( cell, name ) {
  66952. return cell.getAttribute( 'data-'+name ) !== null ? name : null;
  66953. };
  66954. $( rowOne[0] ).children('th, td').each( function (i, cell) {
  66955. var col = oSettings.aoColumns[i];
  66956. if ( col.mData === i ) {
  66957. var sort = a( cell, 'sort' ) || a( cell, 'order' );
  66958. var filter = a( cell, 'filter' ) || a( cell, 'search' );
  66959. if ( sort !== null || filter !== null ) {
  66960. col.mData = {
  66961. _: i+'.display',
  66962. sort: sort !== null ? i+'.@data-'+sort : undefined,
  66963. type: sort !== null ? i+'.@data-'+sort : undefined,
  66964. filter: filter !== null ? i+'.@data-'+filter : undefined
  66965. };
  66966. _fnColumnOptions( oSettings, i );
  66967. }
  66968. }
  66969. } );
  66970. }
  66971. var features = oSettings.oFeatures;
  66972. var loadedInit = function () {
  66973. /*
  66974. * Sorting
  66975. * @todo For modularisation (1.11) this needs to do into a sort start up handler
  66976. */
  66977. // If aaSorting is not defined, then we use the first indicator in asSorting
  66978. // in case that has been altered, so the default sort reflects that option
  66979. if ( oInit.aaSorting === undefined ) {
  66980. var sorting = oSettings.aaSorting;
  66981. for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {
  66982. sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
  66983. }
  66984. }
  66985. /* Do a first pass on the sorting classes (allows any size changes to be taken into
  66986. * account, and also will apply sorting disabled classes if disabled
  66987. */
  66988. _fnSortingClasses( oSettings );
  66989. if ( features.bSort ) {
  66990. _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
  66991. if ( oSettings.bSorted ) {
  66992. var aSort = _fnSortFlatten( oSettings );
  66993. var sortedColumns = {};
  66994. $.each( aSort, function (i, val) {
  66995. sortedColumns[ val.src ] = val.dir;
  66996. } );
  66997. _fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
  66998. _fnSortAria( oSettings );
  66999. }
  67000. } );
  67001. }
  67002. _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
  67003. if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
  67004. _fnSortingClasses( oSettings );
  67005. }
  67006. }, 'sc' );
  67007. /*
  67008. * Final init
  67009. * Cache the header, body and footer as required, creating them if needed
  67010. */
  67011. // Work around for Webkit bug 83867 - store the caption-side before removing from doc
  67012. var captions = $this.children('caption').each( function () {
  67013. this._captionSide = $(this).css('caption-side');
  67014. } );
  67015. var thead = $this.children('thead');
  67016. if ( thead.length === 0 ) {
  67017. thead = $('<thead/>').appendTo($this);
  67018. }
  67019. oSettings.nTHead = thead[0];
  67020. var tbody = $this.children('tbody');
  67021. if ( tbody.length === 0 ) {
  67022. tbody = $('<tbody/>').appendTo($this);
  67023. }
  67024. oSettings.nTBody = tbody[0];
  67025. var tfoot = $this.children('tfoot');
  67026. if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) {
  67027. // If we are a scrolling table, and no footer has been given, then we need to create
  67028. // a tfoot element for the caption element to be appended to
  67029. tfoot = $('<tfoot/>').appendTo($this);
  67030. }
  67031. if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
  67032. $this.addClass( oClasses.sNoFooter );
  67033. }
  67034. else if ( tfoot.length > 0 ) {
  67035. oSettings.nTFoot = tfoot[0];
  67036. _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
  67037. }
  67038. /* Check if there is data passing into the constructor */
  67039. if ( oInit.aaData ) {
  67040. for ( i=0 ; i<oInit.aaData.length ; i++ ) {
  67041. _fnAddData( oSettings, oInit.aaData[ i ] );
  67042. }
  67043. }
  67044. else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {
  67045. /* Grab the data from the page - only do this when deferred loading or no Ajax
  67046. * source since there is no point in reading the DOM data if we are then going
  67047. * to replace it with Ajax data
  67048. */
  67049. _fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
  67050. }
  67051. /* Copy the data index array */
  67052. oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
  67053. /* Initialisation complete - table can be drawn */
  67054. oSettings.bInitialised = true;
  67055. /* Check if we need to initialise the table (it might not have been handed off to the
  67056. * language processor)
  67057. */
  67058. if ( bInitHandedOff === false ) {
  67059. _fnInitialise( oSettings );
  67060. }
  67061. };
  67062. /* Must be done after everything which can be overridden by the state saving! */
  67063. if ( oInit.bStateSave )
  67064. {
  67065. features.bStateSave = true;
  67066. _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
  67067. _fnLoadState( oSettings, oInit, loadedInit );
  67068. }
  67069. else {
  67070. loadedInit();
  67071. }
  67072. } );
  67073. _that = null;
  67074. return this;
  67075. };
  67076. /*
  67077. * It is useful to have variables which are scoped locally so only the
  67078. * DataTables functions can access them and they don't leak into global space.
  67079. * At the same time these functions are often useful over multiple files in the
  67080. * core and API, so we list, or at least document, all variables which are used
  67081. * by DataTables as private variables here. This also ensures that there is no
  67082. * clashing of variable names and that they can easily referenced for reuse.
  67083. */
  67084. // Defined else where
  67085. // _selector_run
  67086. // _selector_opts
  67087. // _selector_first
  67088. // _selector_row_indexes
  67089. var _ext; // DataTable.ext
  67090. var _Api; // DataTable.Api
  67091. var _api_register; // DataTable.Api.register
  67092. var _api_registerPlural; // DataTable.Api.registerPlural
  67093. var _re_dic = {};
  67094. var _re_new_lines = /[\r\n]/g;
  67095. var _re_html = /<.*?>/g;
  67096. // This is not strict ISO8601 - Date.parse() is quite lax, although
  67097. // implementations differ between browsers.
  67098. var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/;
  67099. // Escape regular expression special characters
  67100. var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
  67101. // http://en.wikipedia.org/wiki/Foreign_exchange_market
  67102. // - \u20BD - Russian ruble.
  67103. // - \u20a9 - South Korean Won
  67104. // - \u20BA - Turkish Lira
  67105. // - \u20B9 - Indian Rupee
  67106. // - R - Brazil (R$) and South Africa
  67107. // - fr - Swiss Franc
  67108. // - kr - Swedish krona, Norwegian krone and Danish krone
  67109. // - \u2009 is thin space and \u202F is narrow no-break space, both used in many
  67110. // standards as thousands separators.
  67111. var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
  67112. var _empty = function ( d ) {
  67113. return !d || d === true || d === '-' ? true : false;
  67114. };
  67115. var _intVal = function ( s ) {
  67116. var integer = parseInt( s, 10 );
  67117. return !isNaN(integer) && isFinite(s) ? integer : null;
  67118. };
  67119. // Convert from a formatted number with characters other than `.` as the
  67120. // decimal place, to a Javascript number
  67121. var _numToDecimal = function ( num, decimalPoint ) {
  67122. // Cache created regular expressions for speed as this function is called often
  67123. if ( ! _re_dic[ decimalPoint ] ) {
  67124. _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
  67125. }
  67126. return typeof num === 'string' && decimalPoint !== '.' ?
  67127. num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
  67128. num;
  67129. };
  67130. var _isNumber = function ( d, decimalPoint, formatted ) {
  67131. var strType = typeof d === 'string';
  67132. // If empty return immediately so there must be a number if it is a
  67133. // formatted string (this stops the string "k", or "kr", etc being detected
  67134. // as a formatted number for currency
  67135. if ( _empty( d ) ) {
  67136. return true;
  67137. }
  67138. if ( decimalPoint && strType ) {
  67139. d = _numToDecimal( d, decimalPoint );
  67140. }
  67141. if ( formatted && strType ) {
  67142. d = d.replace( _re_formatted_numeric, '' );
  67143. }
  67144. return !isNaN( parseFloat(d) ) && isFinite( d );
  67145. };
  67146. // A string without HTML in it can be considered to be HTML still
  67147. var _isHtml = function ( d ) {
  67148. return _empty( d ) || typeof d === 'string';
  67149. };
  67150. var _htmlNumeric = function ( d, decimalPoint, formatted ) {
  67151. if ( _empty( d ) ) {
  67152. return true;
  67153. }
  67154. var html = _isHtml( d );
  67155. return ! html ?
  67156. null :
  67157. _isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
  67158. true :
  67159. null;
  67160. };
  67161. var _pluck = function ( a, prop, prop2 ) {
  67162. var out = [];
  67163. var i=0, ien=a.length;
  67164. // Could have the test in the loop for slightly smaller code, but speed
  67165. // is essential here
  67166. if ( prop2 !== undefined ) {
  67167. for ( ; i<ien ; i++ ) {
  67168. if ( a[i] && a[i][ prop ] ) {
  67169. out.push( a[i][ prop ][ prop2 ] );
  67170. }
  67171. }
  67172. }
  67173. else {
  67174. for ( ; i<ien ; i++ ) {
  67175. if ( a[i] ) {
  67176. out.push( a[i][ prop ] );
  67177. }
  67178. }
  67179. }
  67180. return out;
  67181. };
  67182. // Basically the same as _pluck, but rather than looping over `a` we use `order`
  67183. // as the indexes to pick from `a`
  67184. var _pluck_order = function ( a, order, prop, prop2 )
  67185. {
  67186. var out = [];
  67187. var i=0, ien=order.length;
  67188. // Could have the test in the loop for slightly smaller code, but speed
  67189. // is essential here
  67190. if ( prop2 !== undefined ) {
  67191. for ( ; i<ien ; i++ ) {
  67192. if ( a[ order[i] ][ prop ] ) {
  67193. out.push( a[ order[i] ][ prop ][ prop2 ] );
  67194. }
  67195. }
  67196. }
  67197. else {
  67198. for ( ; i<ien ; i++ ) {
  67199. out.push( a[ order[i] ][ prop ] );
  67200. }
  67201. }
  67202. return out;
  67203. };
  67204. var _range = function ( len, start )
  67205. {
  67206. var out = [];
  67207. var end;
  67208. if ( start === undefined ) {
  67209. start = 0;
  67210. end = len;
  67211. }
  67212. else {
  67213. end = start;
  67214. start = len;
  67215. }
  67216. for ( var i=start ; i<end ; i++ ) {
  67217. out.push( i );
  67218. }
  67219. return out;
  67220. };
  67221. var _removeEmpty = function ( a )
  67222. {
  67223. var out = [];
  67224. for ( var i=0, ien=a.length ; i<ien ; i++ ) {
  67225. if ( a[i] ) { // careful - will remove all falsy values!
  67226. out.push( a[i] );
  67227. }
  67228. }
  67229. return out;
  67230. };
  67231. var _stripHtml = function ( d ) {
  67232. return d.replace( _re_html, '' );
  67233. };
  67234. /**
  67235. * Determine if all values in the array are unique. This means we can short
  67236. * cut the _unique method at the cost of a single loop. A sorted array is used
  67237. * to easily check the values.
  67238. *
  67239. * @param {array} src Source array
  67240. * @return {boolean} true if all unique, false otherwise
  67241. * @ignore
  67242. */
  67243. var _areAllUnique = function ( src ) {
  67244. if ( src.length < 2 ) {
  67245. return true;
  67246. }
  67247. var sorted = src.slice().sort();
  67248. var last = sorted[0];
  67249. for ( var i=1, ien=sorted.length ; i<ien ; i++ ) {
  67250. if ( sorted[i] === last ) {
  67251. return false;
  67252. }
  67253. last = sorted[i];
  67254. }
  67255. return true;
  67256. };
  67257. /**
  67258. * Find the unique elements in a source array.
  67259. *
  67260. * @param {array} src Source array
  67261. * @return {array} Array of unique items
  67262. * @ignore
  67263. */
  67264. var _unique = function ( src )
  67265. {
  67266. if ( _areAllUnique( src ) ) {
  67267. return src.slice();
  67268. }
  67269. // A faster unique method is to use object keys to identify used values,
  67270. // but this doesn't work with arrays or objects, which we must also
  67271. // consider. See jsperf.com/compare-array-unique-versions/4 for more
  67272. // information.
  67273. var
  67274. out = [],
  67275. val,
  67276. i, ien=src.length,
  67277. j, k=0;
  67278. again: for ( i=0 ; i<ien ; i++ ) {
  67279. val = src[i];
  67280. for ( j=0 ; j<k ; j++ ) {
  67281. if ( out[j] === val ) {
  67282. continue again;
  67283. }
  67284. }
  67285. out.push( val );
  67286. k++;
  67287. }
  67288. return out;
  67289. };
  67290. /**
  67291. * DataTables utility methods
  67292. *
  67293. * This namespace provides helper methods that DataTables uses internally to
  67294. * create a DataTable, but which are not exclusively used only for DataTables.
  67295. * These methods can be used by extension authors to save the duplication of
  67296. * code.
  67297. *
  67298. * @namespace
  67299. */
  67300. DataTable.util = {
  67301. /**
  67302. * Throttle the calls to a function. Arguments and context are maintained
  67303. * for the throttled function.
  67304. *
  67305. * @param {function} fn Function to be called
  67306. * @param {integer} freq Call frequency in mS
  67307. * @return {function} Wrapped function
  67308. */
  67309. throttle: function ( fn, freq ) {
  67310. var
  67311. frequency = freq !== undefined ? freq : 200,
  67312. last,
  67313. timer;
  67314. return function () {
  67315. var
  67316. that = this,
  67317. now = +new Date(),
  67318. args = arguments;
  67319. if ( last && now < last + frequency ) {
  67320. clearTimeout( timer );
  67321. timer = setTimeout( function () {
  67322. last = undefined;
  67323. fn.apply( that, args );
  67324. }, frequency );
  67325. }
  67326. else {
  67327. last = now;
  67328. fn.apply( that, args );
  67329. }
  67330. };
  67331. },
  67332. /**
  67333. * Escape a string such that it can be used in a regular expression
  67334. *
  67335. * @param {string} val string to escape
  67336. * @returns {string} escaped string
  67337. */
  67338. escapeRegex: function ( val ) {
  67339. return val.replace( _re_escape_regex, '\\$1' );
  67340. }
  67341. };
  67342. /**
  67343. * Create a mapping object that allows camel case parameters to be looked up
  67344. * for their Hungarian counterparts. The mapping is stored in a private
  67345. * parameter called `_hungarianMap` which can be accessed on the source object.
  67346. * @param {object} o
  67347. * @memberof DataTable#oApi
  67348. */
  67349. function _fnHungarianMap ( o )
  67350. {
  67351. var
  67352. hungarian = 'a aa ai ao as b fn i m o s ',
  67353. match,
  67354. newKey,
  67355. map = {};
  67356. $.each( o, function (key, val) {
  67357. match = key.match(/^([^A-Z]+?)([A-Z])/);
  67358. if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
  67359. {
  67360. newKey = key.replace( match[0], match[2].toLowerCase() );
  67361. map[ newKey ] = key;
  67362. if ( match[1] === 'o' )
  67363. {
  67364. _fnHungarianMap( o[key] );
  67365. }
  67366. }
  67367. } );
  67368. o._hungarianMap = map;
  67369. }
  67370. /**
  67371. * Convert from camel case parameters to Hungarian, based on a Hungarian map
  67372. * created by _fnHungarianMap.
  67373. * @param {object} src The model object which holds all parameters that can be
  67374. * mapped.
  67375. * @param {object} user The object to convert from camel case to Hungarian.
  67376. * @param {boolean} force When set to `true`, properties which already have a
  67377. * Hungarian value in the `user` object will be overwritten. Otherwise they
  67378. * won't be.
  67379. * @memberof DataTable#oApi
  67380. */
  67381. function _fnCamelToHungarian ( src, user, force )
  67382. {
  67383. if ( ! src._hungarianMap ) {
  67384. _fnHungarianMap( src );
  67385. }
  67386. var hungarianKey;
  67387. $.each( user, function (key, val) {
  67388. hungarianKey = src._hungarianMap[ key ];
  67389. if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
  67390. {
  67391. // For objects, we need to buzz down into the object to copy parameters
  67392. if ( hungarianKey.charAt(0) === 'o' )
  67393. {
  67394. // Copy the camelCase options over to the hungarian
  67395. if ( ! user[ hungarianKey ] ) {
  67396. user[ hungarianKey ] = {};
  67397. }
  67398. $.extend( true, user[hungarianKey], user[key] );
  67399. _fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
  67400. }
  67401. else {
  67402. user[hungarianKey] = user[ key ];
  67403. }
  67404. }
  67405. } );
  67406. }
  67407. /**
  67408. * Language compatibility - when certain options are given, and others aren't, we
  67409. * need to duplicate the values over, in order to provide backwards compatibility
  67410. * with older language files.
  67411. * @param {object} oSettings dataTables settings object
  67412. * @memberof DataTable#oApi
  67413. */
  67414. function _fnLanguageCompat( lang )
  67415. {
  67416. var defaults = DataTable.defaults.oLanguage;
  67417. var zeroRecords = lang.sZeroRecords;
  67418. /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
  67419. * sZeroRecords - assuming that is given.
  67420. */
  67421. if ( ! lang.sEmptyTable && zeroRecords &&
  67422. defaults.sEmptyTable === "No data available in table" )
  67423. {
  67424. _fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
  67425. }
  67426. /* Likewise with loading records */
  67427. if ( ! lang.sLoadingRecords && zeroRecords &&
  67428. defaults.sLoadingRecords === "Loading..." )
  67429. {
  67430. _fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
  67431. }
  67432. // Old parameter name of the thousands separator mapped onto the new
  67433. if ( lang.sInfoThousands ) {
  67434. lang.sThousands = lang.sInfoThousands;
  67435. }
  67436. var decimal = lang.sDecimal;
  67437. if ( decimal ) {
  67438. _addNumericSort( decimal );
  67439. }
  67440. }
  67441. /**
  67442. * Map one parameter onto another
  67443. * @param {object} o Object to map
  67444. * @param {*} knew The new parameter name
  67445. * @param {*} old The old parameter name
  67446. */
  67447. var _fnCompatMap = function ( o, knew, old ) {
  67448. if ( o[ knew ] !== undefined ) {
  67449. o[ old ] = o[ knew ];
  67450. }
  67451. };
  67452. /**
  67453. * Provide backwards compatibility for the main DT options. Note that the new
  67454. * options are mapped onto the old parameters, so this is an external interface
  67455. * change only.
  67456. * @param {object} init Object to map
  67457. */
  67458. function _fnCompatOpts ( init )
  67459. {
  67460. _fnCompatMap( init, 'ordering', 'bSort' );
  67461. _fnCompatMap( init, 'orderMulti', 'bSortMulti' );
  67462. _fnCompatMap( init, 'orderClasses', 'bSortClasses' );
  67463. _fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
  67464. _fnCompatMap( init, 'order', 'aaSorting' );
  67465. _fnCompatMap( init, 'orderFixed', 'aaSortingFixed' );
  67466. _fnCompatMap( init, 'paging', 'bPaginate' );
  67467. _fnCompatMap( init, 'pagingType', 'sPaginationType' );
  67468. _fnCompatMap( init, 'pageLength', 'iDisplayLength' );
  67469. _fnCompatMap( init, 'searching', 'bFilter' );
  67470. // Boolean initialisation of x-scrolling
  67471. if ( typeof init.sScrollX === 'boolean' ) {
  67472. init.sScrollX = init.sScrollX ? '100%' : '';
  67473. }
  67474. if ( typeof init.scrollX === 'boolean' ) {
  67475. init.scrollX = init.scrollX ? '100%' : '';
  67476. }
  67477. // Column search objects are in an array, so it needs to be converted
  67478. // element by element
  67479. var searchCols = init.aoSearchCols;
  67480. if ( searchCols ) {
  67481. for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
  67482. if ( searchCols[i] ) {
  67483. _fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
  67484. }
  67485. }
  67486. }
  67487. }
  67488. /**
  67489. * Provide backwards compatibility for column options. Note that the new options
  67490. * are mapped onto the old parameters, so this is an external interface change
  67491. * only.
  67492. * @param {object} init Object to map
  67493. */
  67494. function _fnCompatCols ( init )
  67495. {
  67496. _fnCompatMap( init, 'orderable', 'bSortable' );
  67497. _fnCompatMap( init, 'orderData', 'aDataSort' );
  67498. _fnCompatMap( init, 'orderSequence', 'asSorting' );
  67499. _fnCompatMap( init, 'orderDataType', 'sortDataType' );
  67500. // orderData can be given as an integer
  67501. var dataSort = init.aDataSort;
  67502. if ( typeof dataSort === 'number' && ! $.isArray( dataSort ) ) {
  67503. init.aDataSort = [ dataSort ];
  67504. }
  67505. }
  67506. /**
  67507. * Browser feature detection for capabilities, quirks
  67508. * @param {object} settings dataTables settings object
  67509. * @memberof DataTable#oApi
  67510. */
  67511. function _fnBrowserDetect( settings )
  67512. {
  67513. // We don't need to do this every time DataTables is constructed, the values
  67514. // calculated are specific to the browser and OS configuration which we
  67515. // don't expect to change between initialisations
  67516. if ( ! DataTable.__browser ) {
  67517. var browser = {};
  67518. DataTable.__browser = browser;
  67519. // Scrolling feature / quirks detection
  67520. var n = $('<div/>')
  67521. .css( {
  67522. position: 'fixed',
  67523. top: 0,
  67524. left: $(window).scrollLeft()*-1, // allow for scrolling
  67525. height: 1,
  67526. width: 1,
  67527. overflow: 'hidden'
  67528. } )
  67529. .append(
  67530. $('<div/>')
  67531. .css( {
  67532. position: 'absolute',
  67533. top: 1,
  67534. left: 1,
  67535. width: 100,
  67536. overflow: 'scroll'
  67537. } )
  67538. .append(
  67539. $('<div/>')
  67540. .css( {
  67541. width: '100%',
  67542. height: 10
  67543. } )
  67544. )
  67545. )
  67546. .appendTo( 'body' );
  67547. var outer = n.children();
  67548. var inner = outer.children();
  67549. // Numbers below, in order, are:
  67550. // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
  67551. //
  67552. // IE6 XP: 100 100 100 83
  67553. // IE7 Vista: 100 100 100 83
  67554. // IE 8+ Windows: 83 83 100 83
  67555. // Evergreen Windows: 83 83 100 83
  67556. // Evergreen Mac with scrollbars: 85 85 100 85
  67557. // Evergreen Mac without scrollbars: 100 100 100 100
  67558. // Get scrollbar width
  67559. browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
  67560. // IE6/7 will oversize a width 100% element inside a scrolling element, to
  67561. // include the width of the scrollbar, while other browsers ensure the inner
  67562. // element is contained without forcing scrolling
  67563. browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
  67564. // In rtl text layout, some browsers (most, but not all) will place the
  67565. // scrollbar on the left, rather than the right.
  67566. browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
  67567. // IE8- don't provide height and width for getBoundingClientRect
  67568. browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
  67569. n.remove();
  67570. }
  67571. $.extend( settings.oBrowser, DataTable.__browser );
  67572. settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
  67573. }
  67574. /**
  67575. * Array.prototype reduce[Right] method, used for browsers which don't support
  67576. * JS 1.6. Done this way to reduce code size, since we iterate either way
  67577. * @param {object} settings dataTables settings object
  67578. * @memberof DataTable#oApi
  67579. */
  67580. function _fnReduce ( that, fn, init, start, end, inc )
  67581. {
  67582. var
  67583. i = start,
  67584. value,
  67585. isSet = false;
  67586. if ( init !== undefined ) {
  67587. value = init;
  67588. isSet = true;
  67589. }
  67590. while ( i !== end ) {
  67591. if ( ! that.hasOwnProperty(i) ) {
  67592. continue;
  67593. }
  67594. value = isSet ?
  67595. fn( value, that[i], i, that ) :
  67596. that[i];
  67597. isSet = true;
  67598. i += inc;
  67599. }
  67600. return value;
  67601. }
  67602. /**
  67603. * Add a column to the list used for the table with default values
  67604. * @param {object} oSettings dataTables settings object
  67605. * @param {node} nTh The th element for this column
  67606. * @memberof DataTable#oApi
  67607. */
  67608. function _fnAddColumn( oSettings, nTh )
  67609. {
  67610. // Add column to aoColumns array
  67611. var oDefaults = DataTable.defaults.column;
  67612. var iCol = oSettings.aoColumns.length;
  67613. var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
  67614. "nTh": nTh ? nTh : document.createElement('th'),
  67615. "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
  67616. "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
  67617. "mData": oDefaults.mData ? oDefaults.mData : iCol,
  67618. idx: iCol
  67619. } );
  67620. oSettings.aoColumns.push( oCol );
  67621. // Add search object for column specific search. Note that the `searchCols[ iCol ]`
  67622. // passed into extend can be undefined. This allows the user to give a default
  67623. // with only some of the parameters defined, and also not give a default
  67624. var searchCols = oSettings.aoPreSearchCols;
  67625. searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
  67626. // Use the default column options function to initialise classes etc
  67627. _fnColumnOptions( oSettings, iCol, $(nTh).data() );
  67628. }
  67629. /**
  67630. * Apply options for a column
  67631. * @param {object} oSettings dataTables settings object
  67632. * @param {int} iCol column index to consider
  67633. * @param {object} oOptions object with sType, bVisible and bSearchable etc
  67634. * @memberof DataTable#oApi
  67635. */
  67636. function _fnColumnOptions( oSettings, iCol, oOptions )
  67637. {
  67638. var oCol = oSettings.aoColumns[ iCol ];
  67639. var oClasses = oSettings.oClasses;
  67640. var th = $(oCol.nTh);
  67641. // Try to get width information from the DOM. We can't get it from CSS
  67642. // as we'd need to parse the CSS stylesheet. `width` option can override
  67643. if ( ! oCol.sWidthOrig ) {
  67644. // Width attribute
  67645. oCol.sWidthOrig = th.attr('width') || null;
  67646. // Style attribute
  67647. var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
  67648. if ( t ) {
  67649. oCol.sWidthOrig = t[1];
  67650. }
  67651. }
  67652. /* User specified column options */
  67653. if ( oOptions !== undefined && oOptions !== null )
  67654. {
  67655. // Backwards compatibility
  67656. _fnCompatCols( oOptions );
  67657. // Map camel case parameters to their Hungarian counterparts
  67658. _fnCamelToHungarian( DataTable.defaults.column, oOptions );
  67659. /* Backwards compatibility for mDataProp */
  67660. if ( oOptions.mDataProp !== undefined && !oOptions.mData )
  67661. {
  67662. oOptions.mData = oOptions.mDataProp;
  67663. }
  67664. if ( oOptions.sType )
  67665. {
  67666. oCol._sManualType = oOptions.sType;
  67667. }
  67668. // `class` is a reserved word in Javascript, so we need to provide
  67669. // the ability to use a valid name for the camel case input
  67670. if ( oOptions.className && ! oOptions.sClass )
  67671. {
  67672. oOptions.sClass = oOptions.className;
  67673. }
  67674. if ( oOptions.sClass ) {
  67675. th.addClass( oOptions.sClass );
  67676. }
  67677. $.extend( oCol, oOptions );
  67678. _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
  67679. /* iDataSort to be applied (backwards compatibility), but aDataSort will take
  67680. * priority if defined
  67681. */
  67682. if ( oOptions.iDataSort !== undefined )
  67683. {
  67684. oCol.aDataSort = [ oOptions.iDataSort ];
  67685. }
  67686. _fnMap( oCol, oOptions, "aDataSort" );
  67687. }
  67688. /* Cache the data get and set functions for speed */
  67689. var mDataSrc = oCol.mData;
  67690. var mData = _fnGetObjectDataFn( mDataSrc );
  67691. var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
  67692. var attrTest = function( src ) {
  67693. return typeof src === 'string' && src.indexOf('@') !== -1;
  67694. };
  67695. oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
  67696. attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
  67697. );
  67698. oCol._setter = null;
  67699. oCol.fnGetData = function (rowData, type, meta) {
  67700. var innerData = mData( rowData, type, undefined, meta );
  67701. return mRender && type ?
  67702. mRender( innerData, type, rowData, meta ) :
  67703. innerData;
  67704. };
  67705. oCol.fnSetData = function ( rowData, val, meta ) {
  67706. return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
  67707. };
  67708. // Indicate if DataTables should read DOM data as an object or array
  67709. // Used in _fnGetRowElements
  67710. if ( typeof mDataSrc !== 'number' ) {
  67711. oSettings._rowReadObject = true;
  67712. }
  67713. /* Feature sorting overrides column specific when off */
  67714. if ( !oSettings.oFeatures.bSort )
  67715. {
  67716. oCol.bSortable = false;
  67717. th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
  67718. }
  67719. /* Check that the class assignment is correct for sorting */
  67720. var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
  67721. var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
  67722. if ( !oCol.bSortable || (!bAsc && !bDesc) )
  67723. {
  67724. oCol.sSortingClass = oClasses.sSortableNone;
  67725. oCol.sSortingClassJUI = "";
  67726. }
  67727. else if ( bAsc && !bDesc )
  67728. {
  67729. oCol.sSortingClass = oClasses.sSortableAsc;
  67730. oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
  67731. }
  67732. else if ( !bAsc && bDesc )
  67733. {
  67734. oCol.sSortingClass = oClasses.sSortableDesc;
  67735. oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
  67736. }
  67737. else
  67738. {
  67739. oCol.sSortingClass = oClasses.sSortable;
  67740. oCol.sSortingClassJUI = oClasses.sSortJUI;
  67741. }
  67742. }
  67743. /**
  67744. * Adjust the table column widths for new data. Note: you would probably want to
  67745. * do a redraw after calling this function!
  67746. * @param {object} settings dataTables settings object
  67747. * @memberof DataTable#oApi
  67748. */
  67749. function _fnAdjustColumnSizing ( settings )
  67750. {
  67751. /* Not interested in doing column width calculation if auto-width is disabled */
  67752. if ( settings.oFeatures.bAutoWidth !== false )
  67753. {
  67754. var columns = settings.aoColumns;
  67755. _fnCalculateColumnWidths( settings );
  67756. for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
  67757. {
  67758. columns[i].nTh.style.width = columns[i].sWidth;
  67759. }
  67760. }
  67761. var scroll = settings.oScroll;
  67762. if ( scroll.sY !== '' || scroll.sX !== '')
  67763. {
  67764. _fnScrollDraw( settings );
  67765. }
  67766. _fnCallbackFire( settings, null, 'column-sizing', [settings] );
  67767. }
  67768. /**
  67769. * Covert the index of a visible column to the index in the data array (take account
  67770. * of hidden columns)
  67771. * @param {object} oSettings dataTables settings object
  67772. * @param {int} iMatch Visible column index to lookup
  67773. * @returns {int} i the data index
  67774. * @memberof DataTable#oApi
  67775. */
  67776. function _fnVisibleToColumnIndex( oSettings, iMatch )
  67777. {
  67778. var aiVis = _fnGetColumns( oSettings, 'bVisible' );
  67779. return typeof aiVis[iMatch] === 'number' ?
  67780. aiVis[iMatch] :
  67781. null;
  67782. }
  67783. /**
  67784. * Covert the index of an index in the data array and convert it to the visible
  67785. * column index (take account of hidden columns)
  67786. * @param {int} iMatch Column index to lookup
  67787. * @param {object} oSettings dataTables settings object
  67788. * @returns {int} i the data index
  67789. * @memberof DataTable#oApi
  67790. */
  67791. function _fnColumnIndexToVisible( oSettings, iMatch )
  67792. {
  67793. var aiVis = _fnGetColumns( oSettings, 'bVisible' );
  67794. var iPos = $.inArray( iMatch, aiVis );
  67795. return iPos !== -1 ? iPos : null;
  67796. }
  67797. /**
  67798. * Get the number of visible columns
  67799. * @param {object} oSettings dataTables settings object
  67800. * @returns {int} i the number of visible columns
  67801. * @memberof DataTable#oApi
  67802. */
  67803. function _fnVisbleColumns( oSettings )
  67804. {
  67805. var vis = 0;
  67806. // No reduce in IE8, use a loop for now
  67807. $.each( oSettings.aoColumns, function ( i, col ) {
  67808. if ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {
  67809. vis++;
  67810. }
  67811. } );
  67812. return vis;
  67813. }
  67814. /**
  67815. * Get an array of column indexes that match a given property
  67816. * @param {object} oSettings dataTables settings object
  67817. * @param {string} sParam Parameter in aoColumns to look for - typically
  67818. * bVisible or bSearchable
  67819. * @returns {array} Array of indexes with matched properties
  67820. * @memberof DataTable#oApi
  67821. */
  67822. function _fnGetColumns( oSettings, sParam )
  67823. {
  67824. var a = [];
  67825. $.map( oSettings.aoColumns, function(val, i) {
  67826. if ( val[sParam] ) {
  67827. a.push( i );
  67828. }
  67829. } );
  67830. return a;
  67831. }
  67832. /**
  67833. * Calculate the 'type' of a column
  67834. * @param {object} settings dataTables settings object
  67835. * @memberof DataTable#oApi
  67836. */
  67837. function _fnColumnTypes ( settings )
  67838. {
  67839. var columns = settings.aoColumns;
  67840. var data = settings.aoData;
  67841. var types = DataTable.ext.type.detect;
  67842. var i, ien, j, jen, k, ken;
  67843. var col, cell, detectedType, cache;
  67844. // For each column, spin over the
  67845. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  67846. col = columns[i];
  67847. cache = [];
  67848. if ( ! col.sType && col._sManualType ) {
  67849. col.sType = col._sManualType;
  67850. }
  67851. else if ( ! col.sType ) {
  67852. for ( j=0, jen=types.length ; j<jen ; j++ ) {
  67853. for ( k=0, ken=data.length ; k<ken ; k++ ) {
  67854. // Use a cache array so we only need to get the type data
  67855. // from the formatter once (when using multiple detectors)
  67856. if ( cache[k] === undefined ) {
  67857. cache[k] = _fnGetCellData( settings, k, i, 'type' );
  67858. }
  67859. detectedType = types[j]( cache[k], settings );
  67860. // If null, then this type can't apply to this column, so
  67861. // rather than testing all cells, break out. There is an
  67862. // exception for the last type which is `html`. We need to
  67863. // scan all rows since it is possible to mix string and HTML
  67864. // types
  67865. if ( ! detectedType && j !== types.length-1 ) {
  67866. break;
  67867. }
  67868. // Only a single match is needed for html type since it is
  67869. // bottom of the pile and very similar to string
  67870. if ( detectedType === 'html' ) {
  67871. break;
  67872. }
  67873. }
  67874. // Type is valid for all data points in the column - use this
  67875. // type
  67876. if ( detectedType ) {
  67877. col.sType = detectedType;
  67878. break;
  67879. }
  67880. }
  67881. // Fall back - if no type was detected, always use string
  67882. if ( ! col.sType ) {
  67883. col.sType = 'string';
  67884. }
  67885. }
  67886. }
  67887. }
  67888. /**
  67889. * Take the column definitions and static columns arrays and calculate how
  67890. * they relate to column indexes. The callback function will then apply the
  67891. * definition found for a column to a suitable configuration object.
  67892. * @param {object} oSettings dataTables settings object
  67893. * @param {array} aoColDefs The aoColumnDefs array that is to be applied
  67894. * @param {array} aoCols The aoColumns array that defines columns individually
  67895. * @param {function} fn Callback function - takes two parameters, the calculated
  67896. * column index and the definition for that column.
  67897. * @memberof DataTable#oApi
  67898. */
  67899. function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
  67900. {
  67901. var i, iLen, j, jLen, k, kLen, def;
  67902. var columns = oSettings.aoColumns;
  67903. // Column definitions with aTargets
  67904. if ( aoColDefs )
  67905. {
  67906. /* Loop over the definitions array - loop in reverse so first instance has priority */
  67907. for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
  67908. {
  67909. def = aoColDefs[i];
  67910. /* Each definition can target multiple columns, as it is an array */
  67911. var aTargets = def.targets !== undefined ?
  67912. def.targets :
  67913. def.aTargets;
  67914. if ( ! $.isArray( aTargets ) )
  67915. {
  67916. aTargets = [ aTargets ];
  67917. }
  67918. for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
  67919. {
  67920. if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
  67921. {
  67922. /* Add columns that we don't yet know about */
  67923. while( columns.length <= aTargets[j] )
  67924. {
  67925. _fnAddColumn( oSettings );
  67926. }
  67927. /* Integer, basic index */
  67928. fn( aTargets[j], def );
  67929. }
  67930. else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
  67931. {
  67932. /* Negative integer, right to left column counting */
  67933. fn( columns.length+aTargets[j], def );
  67934. }
  67935. else if ( typeof aTargets[j] === 'string' )
  67936. {
  67937. /* Class name matching on TH element */
  67938. for ( k=0, kLen=columns.length ; k<kLen ; k++ )
  67939. {
  67940. if ( aTargets[j] == "_all" ||
  67941. $(columns[k].nTh).hasClass( aTargets[j] ) )
  67942. {
  67943. fn( k, def );
  67944. }
  67945. }
  67946. }
  67947. }
  67948. }
  67949. }
  67950. // Statically defined columns array
  67951. if ( aoCols )
  67952. {
  67953. for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
  67954. {
  67955. fn( i, aoCols[i] );
  67956. }
  67957. }
  67958. }
  67959. /**
  67960. * Add a data array to the table, creating DOM node etc. This is the parallel to
  67961. * _fnGatherData, but for adding rows from a Javascript source, rather than a
  67962. * DOM source.
  67963. * @param {object} oSettings dataTables settings object
  67964. * @param {array} aData data array to be added
  67965. * @param {node} [nTr] TR element to add to the table - optional. If not given,
  67966. * DataTables will create a row automatically
  67967. * @param {array} [anTds] Array of TD|TH elements for the row - must be given
  67968. * if nTr is.
  67969. * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
  67970. * @memberof DataTable#oApi
  67971. */
  67972. function _fnAddData ( oSettings, aDataIn, nTr, anTds )
  67973. {
  67974. /* Create the object for storing information about this new row */
  67975. var iRow = oSettings.aoData.length;
  67976. var oData = $.extend( true, {}, DataTable.models.oRow, {
  67977. src: nTr ? 'dom' : 'data',
  67978. idx: iRow
  67979. } );
  67980. oData._aData = aDataIn;
  67981. oSettings.aoData.push( oData );
  67982. /* Create the cells */
  67983. var nTd, sThisType;
  67984. var columns = oSettings.aoColumns;
  67985. // Invalidate the column types as the new data needs to be revalidated
  67986. for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
  67987. {
  67988. columns[i].sType = null;
  67989. }
  67990. /* Add to the display array */
  67991. oSettings.aiDisplayMaster.push( iRow );
  67992. var id = oSettings.rowIdFn( aDataIn );
  67993. if ( id !== undefined ) {
  67994. oSettings.aIds[ id ] = oData;
  67995. }
  67996. /* Create the DOM information, or register it if already present */
  67997. if ( nTr || ! oSettings.oFeatures.bDeferRender )
  67998. {
  67999. _fnCreateTr( oSettings, iRow, nTr, anTds );
  68000. }
  68001. return iRow;
  68002. }
  68003. /**
  68004. * Add one or more TR elements to the table. Generally we'd expect to
  68005. * use this for reading data from a DOM sourced table, but it could be
  68006. * used for an TR element. Note that if a TR is given, it is used (i.e.
  68007. * it is not cloned).
  68008. * @param {object} settings dataTables settings object
  68009. * @param {array|node|jQuery} trs The TR element(s) to add to the table
  68010. * @returns {array} Array of indexes for the added rows
  68011. * @memberof DataTable#oApi
  68012. */
  68013. function _fnAddTr( settings, trs )
  68014. {
  68015. var row;
  68016. // Allow an individual node to be passed in
  68017. if ( ! (trs instanceof $) ) {
  68018. trs = $(trs);
  68019. }
  68020. return trs.map( function (i, el) {
  68021. row = _fnGetRowElements( settings, el );
  68022. return _fnAddData( settings, row.data, el, row.cells );
  68023. } );
  68024. }
  68025. /**
  68026. * Take a TR element and convert it to an index in aoData
  68027. * @param {object} oSettings dataTables settings object
  68028. * @param {node} n the TR element to find
  68029. * @returns {int} index if the node is found, null if not
  68030. * @memberof DataTable#oApi
  68031. */
  68032. function _fnNodeToDataIndex( oSettings, n )
  68033. {
  68034. return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
  68035. }
  68036. /**
  68037. * Take a TD element and convert it into a column data index (not the visible index)
  68038. * @param {object} oSettings dataTables settings object
  68039. * @param {int} iRow The row number the TD/TH can be found in
  68040. * @param {node} n The TD/TH element to find
  68041. * @returns {int} index if the node is found, -1 if not
  68042. * @memberof DataTable#oApi
  68043. */
  68044. function _fnNodeToColumnIndex( oSettings, iRow, n )
  68045. {
  68046. return $.inArray( n, oSettings.aoData[ iRow ].anCells );
  68047. }
  68048. /**
  68049. * Get the data for a given cell from the internal cache, taking into account data mapping
  68050. * @param {object} settings dataTables settings object
  68051. * @param {int} rowIdx aoData row id
  68052. * @param {int} colIdx Column index
  68053. * @param {string} type data get type ('display', 'type' 'filter' 'sort')
  68054. * @returns {*} Cell data
  68055. * @memberof DataTable#oApi
  68056. */
  68057. function _fnGetCellData( settings, rowIdx, colIdx, type )
  68058. {
  68059. var draw = settings.iDraw;
  68060. var col = settings.aoColumns[colIdx];
  68061. var rowData = settings.aoData[rowIdx]._aData;
  68062. var defaultContent = col.sDefaultContent;
  68063. var cellData = col.fnGetData( rowData, type, {
  68064. settings: settings,
  68065. row: rowIdx,
  68066. col: colIdx
  68067. } );
  68068. if ( cellData === undefined ) {
  68069. if ( settings.iDrawError != draw && defaultContent === null ) {
  68070. _fnLog( settings, 0, "Requested unknown parameter "+
  68071. (typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
  68072. " for row "+rowIdx+", column "+colIdx, 4 );
  68073. settings.iDrawError = draw;
  68074. }
  68075. return defaultContent;
  68076. }
  68077. // When the data source is null and a specific data type is requested (i.e.
  68078. // not the original data), we can use default column data
  68079. if ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {
  68080. cellData = defaultContent;
  68081. }
  68082. else if ( typeof cellData === 'function' ) {
  68083. // If the data source is a function, then we run it and use the return,
  68084. // executing in the scope of the data object (for instances)
  68085. return cellData.call( rowData );
  68086. }
  68087. if ( cellData === null && type == 'display' ) {
  68088. return '';
  68089. }
  68090. return cellData;
  68091. }
  68092. /**
  68093. * Set the value for a specific cell, into the internal data cache
  68094. * @param {object} settings dataTables settings object
  68095. * @param {int} rowIdx aoData row id
  68096. * @param {int} colIdx Column index
  68097. * @param {*} val Value to set
  68098. * @memberof DataTable#oApi
  68099. */
  68100. function _fnSetCellData( settings, rowIdx, colIdx, val )
  68101. {
  68102. var col = settings.aoColumns[colIdx];
  68103. var rowData = settings.aoData[rowIdx]._aData;
  68104. col.fnSetData( rowData, val, {
  68105. settings: settings,
  68106. row: rowIdx,
  68107. col: colIdx
  68108. } );
  68109. }
  68110. // Private variable that is used to match action syntax in the data property object
  68111. var __reArray = /\[.*?\]$/;
  68112. var __reFn = /\(\)$/;
  68113. /**
  68114. * Split string on periods, taking into account escaped periods
  68115. * @param {string} str String to split
  68116. * @return {array} Split string
  68117. */
  68118. function _fnSplitObjNotation( str )
  68119. {
  68120. return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
  68121. return s.replace(/\\\./g, '.');
  68122. } );
  68123. }
  68124. /**
  68125. * Return a function that can be used to get data from a source object, taking
  68126. * into account the ability to use nested objects as a source
  68127. * @param {string|int|function} mSource The data source for the object
  68128. * @returns {function} Data get function
  68129. * @memberof DataTable#oApi
  68130. */
  68131. function _fnGetObjectDataFn( mSource )
  68132. {
  68133. if ( $.isPlainObject( mSource ) )
  68134. {
  68135. /* Build an object of get functions, and wrap them in a single call */
  68136. var o = {};
  68137. $.each( mSource, function (key, val) {
  68138. if ( val ) {
  68139. o[key] = _fnGetObjectDataFn( val );
  68140. }
  68141. } );
  68142. return function (data, type, row, meta) {
  68143. var t = o[type] || o._;
  68144. return t !== undefined ?
  68145. t(data, type, row, meta) :
  68146. data;
  68147. };
  68148. }
  68149. else if ( mSource === null )
  68150. {
  68151. /* Give an empty string for rendering / sorting etc */
  68152. return function (data) { // type, row and meta also passed, but not used
  68153. return data;
  68154. };
  68155. }
  68156. else if ( typeof mSource === 'function' )
  68157. {
  68158. return function (data, type, row, meta) {
  68159. return mSource( data, type, row, meta );
  68160. };
  68161. }
  68162. else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
  68163. mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
  68164. {
  68165. /* If there is a . in the source string then the data source is in a
  68166. * nested object so we loop over the data for each level to get the next
  68167. * level down. On each loop we test for undefined, and if found immediately
  68168. * return. This allows entire objects to be missing and sDefaultContent to
  68169. * be used if defined, rather than throwing an error
  68170. */
  68171. var fetchData = function (data, type, src) {
  68172. var arrayNotation, funcNotation, out, innerSrc;
  68173. if ( src !== "" )
  68174. {
  68175. var a = _fnSplitObjNotation( src );
  68176. for ( var i=0, iLen=a.length ; i<iLen ; i++ )
  68177. {
  68178. // Check if we are dealing with special notation
  68179. arrayNotation = a[i].match(__reArray);
  68180. funcNotation = a[i].match(__reFn);
  68181. if ( arrayNotation )
  68182. {
  68183. // Array notation
  68184. a[i] = a[i].replace(__reArray, '');
  68185. // Condition allows simply [] to be passed in
  68186. if ( a[i] !== "" ) {
  68187. data = data[ a[i] ];
  68188. }
  68189. out = [];
  68190. // Get the remainder of the nested object to get
  68191. a.splice( 0, i+1 );
  68192. innerSrc = a.join('.');
  68193. // Traverse each entry in the array getting the properties requested
  68194. if ( $.isArray( data ) ) {
  68195. for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
  68196. out.push( fetchData( data[j], type, innerSrc ) );
  68197. }
  68198. }
  68199. // If a string is given in between the array notation indicators, that
  68200. // is used to join the strings together, otherwise an array is returned
  68201. var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
  68202. data = (join==="") ? out : out.join(join);
  68203. // The inner call to fetchData has already traversed through the remainder
  68204. // of the source requested, so we exit from the loop
  68205. break;
  68206. }
  68207. else if ( funcNotation )
  68208. {
  68209. // Function call
  68210. a[i] = a[i].replace(__reFn, '');
  68211. data = data[ a[i] ]();
  68212. continue;
  68213. }
  68214. if ( data === null || data[ a[i] ] === undefined )
  68215. {
  68216. return undefined;
  68217. }
  68218. data = data[ a[i] ];
  68219. }
  68220. }
  68221. return data;
  68222. };
  68223. return function (data, type) { // row and meta also passed, but not used
  68224. return fetchData( data, type, mSource );
  68225. };
  68226. }
  68227. else
  68228. {
  68229. /* Array or flat object mapping */
  68230. return function (data, type) { // row and meta also passed, but not used
  68231. return data[mSource];
  68232. };
  68233. }
  68234. }
  68235. /**
  68236. * Return a function that can be used to set data from a source object, taking
  68237. * into account the ability to use nested objects as a source
  68238. * @param {string|int|function} mSource The data source for the object
  68239. * @returns {function} Data set function
  68240. * @memberof DataTable#oApi
  68241. */
  68242. function _fnSetObjectDataFn( mSource )
  68243. {
  68244. if ( $.isPlainObject( mSource ) )
  68245. {
  68246. /* Unlike get, only the underscore (global) option is used for for
  68247. * setting data since we don't know the type here. This is why an object
  68248. * option is not documented for `mData` (which is read/write), but it is
  68249. * for `mRender` which is read only.
  68250. */
  68251. return _fnSetObjectDataFn( mSource._ );
  68252. }
  68253. else if ( mSource === null )
  68254. {
  68255. /* Nothing to do when the data source is null */
  68256. return function () {};
  68257. }
  68258. else if ( typeof mSource === 'function' )
  68259. {
  68260. return function (data, val, meta) {
  68261. mSource( data, 'set', val, meta );
  68262. };
  68263. }
  68264. else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
  68265. mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
  68266. {
  68267. /* Like the get, we need to get data from a nested object */
  68268. var setData = function (data, val, src) {
  68269. var a = _fnSplitObjNotation( src ), b;
  68270. var aLast = a[a.length-1];
  68271. var arrayNotation, funcNotation, o, innerSrc;
  68272. for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
  68273. {
  68274. // Check if we are dealing with an array notation request
  68275. arrayNotation = a[i].match(__reArray);
  68276. funcNotation = a[i].match(__reFn);
  68277. if ( arrayNotation )
  68278. {
  68279. a[i] = a[i].replace(__reArray, '');
  68280. data[ a[i] ] = [];
  68281. // Get the remainder of the nested object to set so we can recurse
  68282. b = a.slice();
  68283. b.splice( 0, i+1 );
  68284. innerSrc = b.join('.');
  68285. // Traverse each entry in the array setting the properties requested
  68286. if ( $.isArray( val ) )
  68287. {
  68288. for ( var j=0, jLen=val.length ; j<jLen ; j++ )
  68289. {
  68290. o = {};
  68291. setData( o, val[j], innerSrc );
  68292. data[ a[i] ].push( o );
  68293. }
  68294. }
  68295. else
  68296. {
  68297. // We've been asked to save data to an array, but it
  68298. // isn't array data to be saved. Best that can be done
  68299. // is to just save the value.
  68300. data[ a[i] ] = val;
  68301. }
  68302. // The inner call to setData has already traversed through the remainder
  68303. // of the source and has set the data, thus we can exit here
  68304. return;
  68305. }
  68306. else if ( funcNotation )
  68307. {
  68308. // Function call
  68309. a[i] = a[i].replace(__reFn, '');
  68310. data = data[ a[i] ]( val );
  68311. }
  68312. // If the nested object doesn't currently exist - since we are
  68313. // trying to set the value - create it
  68314. if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
  68315. {
  68316. data[ a[i] ] = {};
  68317. }
  68318. data = data[ a[i] ];
  68319. }
  68320. // Last item in the input - i.e, the actual set
  68321. if ( aLast.match(__reFn ) )
  68322. {
  68323. // Function call
  68324. data = data[ aLast.replace(__reFn, '') ]( val );
  68325. }
  68326. else
  68327. {
  68328. // If array notation is used, we just want to strip it and use the property name
  68329. // and assign the value. If it isn't used, then we get the result we want anyway
  68330. data[ aLast.replace(__reArray, '') ] = val;
  68331. }
  68332. };
  68333. return function (data, val) { // meta is also passed in, but not used
  68334. return setData( data, val, mSource );
  68335. };
  68336. }
  68337. else
  68338. {
  68339. /* Array or flat object mapping */
  68340. return function (data, val) { // meta is also passed in, but not used
  68341. data[mSource] = val;
  68342. };
  68343. }
  68344. }
  68345. /**
  68346. * Return an array with the full table data
  68347. * @param {object} oSettings dataTables settings object
  68348. * @returns array {array} aData Master data array
  68349. * @memberof DataTable#oApi
  68350. */
  68351. function _fnGetDataMaster ( settings )
  68352. {
  68353. return _pluck( settings.aoData, '_aData' );
  68354. }
  68355. /**
  68356. * Nuke the table
  68357. * @param {object} oSettings dataTables settings object
  68358. * @memberof DataTable#oApi
  68359. */
  68360. function _fnClearTable( settings )
  68361. {
  68362. settings.aoData.length = 0;
  68363. settings.aiDisplayMaster.length = 0;
  68364. settings.aiDisplay.length = 0;
  68365. settings.aIds = {};
  68366. }
  68367. /**
  68368. * Take an array of integers (index array) and remove a target integer (value - not
  68369. * the key!)
  68370. * @param {array} a Index array to target
  68371. * @param {int} iTarget value to find
  68372. * @memberof DataTable#oApi
  68373. */
  68374. function _fnDeleteIndex( a, iTarget, splice )
  68375. {
  68376. var iTargetIndex = -1;
  68377. for ( var i=0, iLen=a.length ; i<iLen ; i++ )
  68378. {
  68379. if ( a[i] == iTarget )
  68380. {
  68381. iTargetIndex = i;
  68382. }
  68383. else if ( a[i] > iTarget )
  68384. {
  68385. a[i]--;
  68386. }
  68387. }
  68388. if ( iTargetIndex != -1 && splice === undefined )
  68389. {
  68390. a.splice( iTargetIndex, 1 );
  68391. }
  68392. }
  68393. /**
  68394. * Mark cached data as invalid such that a re-read of the data will occur when
  68395. * the cached data is next requested. Also update from the data source object.
  68396. *
  68397. * @param {object} settings DataTables settings object
  68398. * @param {int} rowIdx Row index to invalidate
  68399. * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom'
  68400. * or 'data'
  68401. * @param {int} [colIdx] Column index to invalidate. If undefined the whole
  68402. * row will be invalidated
  68403. * @memberof DataTable#oApi
  68404. *
  68405. * @todo For the modularisation of v1.11 this will need to become a callback, so
  68406. * the sort and filter methods can subscribe to it. That will required
  68407. * initialisation options for sorting, which is why it is not already baked in
  68408. */
  68409. function _fnInvalidate( settings, rowIdx, src, colIdx )
  68410. {
  68411. var row = settings.aoData[ rowIdx ];
  68412. var i, ien;
  68413. var cellWrite = function ( cell, col ) {
  68414. // This is very frustrating, but in IE if you just write directly
  68415. // to innerHTML, and elements that are overwritten are GC'ed,
  68416. // even if there is a reference to them elsewhere
  68417. while ( cell.childNodes.length ) {
  68418. cell.removeChild( cell.firstChild );
  68419. }
  68420. cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
  68421. };
  68422. // Are we reading last data from DOM or the data object?
  68423. if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
  68424. // Read the data from the DOM
  68425. row._aData = _fnGetRowElements(
  68426. settings, row, colIdx, colIdx === undefined ? undefined : row._aData
  68427. )
  68428. .data;
  68429. }
  68430. else {
  68431. // Reading from data object, update the DOM
  68432. var cells = row.anCells;
  68433. if ( cells ) {
  68434. if ( colIdx !== undefined ) {
  68435. cellWrite( cells[colIdx], colIdx );
  68436. }
  68437. else {
  68438. for ( i=0, ien=cells.length ; i<ien ; i++ ) {
  68439. cellWrite( cells[i], i );
  68440. }
  68441. }
  68442. }
  68443. }
  68444. // For both row and cell invalidation, the cached data for sorting and
  68445. // filtering is nulled out
  68446. row._aSortData = null;
  68447. row._aFilterData = null;
  68448. // Invalidate the type for a specific column (if given) or all columns since
  68449. // the data might have changed
  68450. var cols = settings.aoColumns;
  68451. if ( colIdx !== undefined ) {
  68452. cols[ colIdx ].sType = null;
  68453. }
  68454. else {
  68455. for ( i=0, ien=cols.length ; i<ien ; i++ ) {
  68456. cols[i].sType = null;
  68457. }
  68458. // Update DataTables special `DT_*` attributes for the row
  68459. _fnRowAttributes( settings, row );
  68460. }
  68461. }
  68462. /**
  68463. * Build a data source object from an HTML row, reading the contents of the
  68464. * cells that are in the row.
  68465. *
  68466. * @param {object} settings DataTables settings object
  68467. * @param {node|object} TR element from which to read data or existing row
  68468. * object from which to re-read the data from the cells
  68469. * @param {int} [colIdx] Optional column index
  68470. * @param {array|object} [d] Data source object. If `colIdx` is given then this
  68471. * parameter should also be given and will be used to write the data into.
  68472. * Only the column in question will be written
  68473. * @returns {object} Object with two parameters: `data` the data read, in
  68474. * document order, and `cells` and array of nodes (they can be useful to the
  68475. * caller, so rather than needing a second traversal to get them, just return
  68476. * them from here).
  68477. * @memberof DataTable#oApi
  68478. */
  68479. function _fnGetRowElements( settings, row, colIdx, d )
  68480. {
  68481. var
  68482. tds = [],
  68483. td = row.firstChild,
  68484. name, col, o, i=0, contents,
  68485. columns = settings.aoColumns,
  68486. objectRead = settings._rowReadObject;
  68487. // Allow the data object to be passed in, or construct
  68488. d = d !== undefined ?
  68489. d :
  68490. objectRead ?
  68491. {} :
  68492. [];
  68493. var attr = function ( str, td ) {
  68494. if ( typeof str === 'string' ) {
  68495. var idx = str.indexOf('@');
  68496. if ( idx !== -1 ) {
  68497. var attr = str.substring( idx+1 );
  68498. var setter = _fnSetObjectDataFn( str );
  68499. setter( d, td.getAttribute( attr ) );
  68500. }
  68501. }
  68502. };
  68503. // Read data from a cell and store into the data object
  68504. var cellProcess = function ( cell ) {
  68505. if ( colIdx === undefined || colIdx === i ) {
  68506. col = columns[i];
  68507. contents = $.trim(cell.innerHTML);
  68508. if ( col && col._bAttrSrc ) {
  68509. var setter = _fnSetObjectDataFn( col.mData._ );
  68510. setter( d, contents );
  68511. attr( col.mData.sort, cell );
  68512. attr( col.mData.type, cell );
  68513. attr( col.mData.filter, cell );
  68514. }
  68515. else {
  68516. // Depending on the `data` option for the columns the data can
  68517. // be read to either an object or an array.
  68518. if ( objectRead ) {
  68519. if ( ! col._setter ) {
  68520. // Cache the setter function
  68521. col._setter = _fnSetObjectDataFn( col.mData );
  68522. }
  68523. col._setter( d, contents );
  68524. }
  68525. else {
  68526. d[i] = contents;
  68527. }
  68528. }
  68529. }
  68530. i++;
  68531. };
  68532. if ( td ) {
  68533. // `tr` element was passed in
  68534. while ( td ) {
  68535. name = td.nodeName.toUpperCase();
  68536. if ( name == "TD" || name == "TH" ) {
  68537. cellProcess( td );
  68538. tds.push( td );
  68539. }
  68540. td = td.nextSibling;
  68541. }
  68542. }
  68543. else {
  68544. // Existing row object passed in
  68545. tds = row.anCells;
  68546. for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
  68547. cellProcess( tds[j] );
  68548. }
  68549. }
  68550. // Read the ID from the DOM if present
  68551. var rowNode = row.firstChild ? row : row.nTr;
  68552. if ( rowNode ) {
  68553. var id = rowNode.getAttribute( 'id' );
  68554. if ( id ) {
  68555. _fnSetObjectDataFn( settings.rowId )( d, id );
  68556. }
  68557. }
  68558. return {
  68559. data: d,
  68560. cells: tds
  68561. };
  68562. }
  68563. /**
  68564. * Create a new TR element (and it's TD children) for a row
  68565. * @param {object} oSettings dataTables settings object
  68566. * @param {int} iRow Row to consider
  68567. * @param {node} [nTrIn] TR element to add to the table - optional. If not given,
  68568. * DataTables will create a row automatically
  68569. * @param {array} [anTds] Array of TD|TH elements for the row - must be given
  68570. * if nTr is.
  68571. * @memberof DataTable#oApi
  68572. */
  68573. function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
  68574. {
  68575. var
  68576. row = oSettings.aoData[iRow],
  68577. rowData = row._aData,
  68578. cells = [],
  68579. nTr, nTd, oCol,
  68580. i, iLen;
  68581. if ( row.nTr === null )
  68582. {
  68583. nTr = nTrIn || document.createElement('tr');
  68584. row.nTr = nTr;
  68585. row.anCells = cells;
  68586. /* Use a private property on the node to allow reserve mapping from the node
  68587. * to the aoData array for fast look up
  68588. */
  68589. nTr._DT_RowIndex = iRow;
  68590. /* Special parameters can be given by the data source to be used on the row */
  68591. _fnRowAttributes( oSettings, row );
  68592. /* Process each column */
  68593. for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
  68594. {
  68595. oCol = oSettings.aoColumns[i];
  68596. nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
  68597. nTd._DT_CellIndex = {
  68598. row: iRow,
  68599. column: i
  68600. };
  68601. cells.push( nTd );
  68602. // Need to create the HTML if new, or if a rendering function is defined
  68603. if ( (!nTrIn || oCol.mRender || oCol.mData !== i) &&
  68604. (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')
  68605. ) {
  68606. nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
  68607. }
  68608. /* Add user defined class */
  68609. if ( oCol.sClass )
  68610. {
  68611. nTd.className += ' '+oCol.sClass;
  68612. }
  68613. // Visibility - add or remove as required
  68614. if ( oCol.bVisible && ! nTrIn )
  68615. {
  68616. nTr.appendChild( nTd );
  68617. }
  68618. else if ( ! oCol.bVisible && nTrIn )
  68619. {
  68620. nTd.parentNode.removeChild( nTd );
  68621. }
  68622. if ( oCol.fnCreatedCell )
  68623. {
  68624. oCol.fnCreatedCell.call( oSettings.oInstance,
  68625. nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
  68626. );
  68627. }
  68628. }
  68629. _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
  68630. }
  68631. // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
  68632. // and deployed
  68633. row.nTr.setAttribute( 'role', 'row' );
  68634. }
  68635. /**
  68636. * Add attributes to a row based on the special `DT_*` parameters in a data
  68637. * source object.
  68638. * @param {object} settings DataTables settings object
  68639. * @param {object} DataTables row object for the row to be modified
  68640. * @memberof DataTable#oApi
  68641. */
  68642. function _fnRowAttributes( settings, row )
  68643. {
  68644. var tr = row.nTr;
  68645. var data = row._aData;
  68646. if ( tr ) {
  68647. var id = settings.rowIdFn( data );
  68648. if ( id ) {
  68649. tr.id = id;
  68650. }
  68651. if ( data.DT_RowClass ) {
  68652. // Remove any classes added by DT_RowClass before
  68653. var a = data.DT_RowClass.split(' ');
  68654. row.__rowc = row.__rowc ?
  68655. _unique( row.__rowc.concat( a ) ) :
  68656. a;
  68657. $(tr)
  68658. .removeClass( row.__rowc.join(' ') )
  68659. .addClass( data.DT_RowClass );
  68660. }
  68661. if ( data.DT_RowAttr ) {
  68662. $(tr).attr( data.DT_RowAttr );
  68663. }
  68664. if ( data.DT_RowData ) {
  68665. $(tr).data( data.DT_RowData );
  68666. }
  68667. }
  68668. }
  68669. /**
  68670. * Create the HTML header for the table
  68671. * @param {object} oSettings dataTables settings object
  68672. * @memberof DataTable#oApi
  68673. */
  68674. function _fnBuildHead( oSettings )
  68675. {
  68676. var i, ien, cell, row, column;
  68677. var thead = oSettings.nTHead;
  68678. var tfoot = oSettings.nTFoot;
  68679. var createHeader = $('th, td', thead).length === 0;
  68680. var classes = oSettings.oClasses;
  68681. var columns = oSettings.aoColumns;
  68682. if ( createHeader ) {
  68683. row = $('<tr/>').appendTo( thead );
  68684. }
  68685. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  68686. column = columns[i];
  68687. cell = $( column.nTh ).addClass( column.sClass );
  68688. if ( createHeader ) {
  68689. cell.appendTo( row );
  68690. }
  68691. // 1.11 move into sorting
  68692. if ( oSettings.oFeatures.bSort ) {
  68693. cell.addClass( column.sSortingClass );
  68694. if ( column.bSortable !== false ) {
  68695. cell
  68696. .attr( 'tabindex', oSettings.iTabIndex )
  68697. .attr( 'aria-controls', oSettings.sTableId );
  68698. _fnSortAttachListener( oSettings, column.nTh, i );
  68699. }
  68700. }
  68701. if ( column.sTitle != cell[0].innerHTML ) {
  68702. cell.html( column.sTitle );
  68703. }
  68704. _fnRenderer( oSettings, 'header' )(
  68705. oSettings, cell, column, classes
  68706. );
  68707. }
  68708. if ( createHeader ) {
  68709. _fnDetectHeader( oSettings.aoHeader, thead );
  68710. }
  68711. /* ARIA role for the rows */
  68712. $(thead).find('>tr').attr('role', 'row');
  68713. /* Deal with the footer - add classes if required */
  68714. $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
  68715. $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
  68716. // Cache the footer cells. Note that we only take the cells from the first
  68717. // row in the footer. If there is more than one row the user wants to
  68718. // interact with, they need to use the table().foot() method. Note also this
  68719. // allows cells to be used for multiple columns using colspan
  68720. if ( tfoot !== null ) {
  68721. var cells = oSettings.aoFooter[0];
  68722. for ( i=0, ien=cells.length ; i<ien ; i++ ) {
  68723. column = columns[i];
  68724. column.nTf = cells[i].cell;
  68725. if ( column.sClass ) {
  68726. $(column.nTf).addClass( column.sClass );
  68727. }
  68728. }
  68729. }
  68730. }
  68731. /**
  68732. * Draw the header (or footer) element based on the column visibility states. The
  68733. * methodology here is to use the layout array from _fnDetectHeader, modified for
  68734. * the instantaneous column visibility, to construct the new layout. The grid is
  68735. * traversed over cell at a time in a rows x columns grid fashion, although each
  68736. * cell insert can cover multiple elements in the grid - which is tracks using the
  68737. * aApplied array. Cell inserts in the grid will only occur where there isn't
  68738. * already a cell in that position.
  68739. * @param {object} oSettings dataTables settings object
  68740. * @param array {objects} aoSource Layout array from _fnDetectHeader
  68741. * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
  68742. * @memberof DataTable#oApi
  68743. */
  68744. function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
  68745. {
  68746. var i, iLen, j, jLen, k, kLen, n, nLocalTr;
  68747. var aoLocal = [];
  68748. var aApplied = [];
  68749. var iColumns = oSettings.aoColumns.length;
  68750. var iRowspan, iColspan;
  68751. if ( ! aoSource )
  68752. {
  68753. return;
  68754. }
  68755. if ( bIncludeHidden === undefined )
  68756. {
  68757. bIncludeHidden = false;
  68758. }
  68759. /* Make a copy of the master layout array, but without the visible columns in it */
  68760. for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
  68761. {
  68762. aoLocal[i] = aoSource[i].slice();
  68763. aoLocal[i].nTr = aoSource[i].nTr;
  68764. /* Remove any columns which are currently hidden */
  68765. for ( j=iColumns-1 ; j>=0 ; j-- )
  68766. {
  68767. if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
  68768. {
  68769. aoLocal[i].splice( j, 1 );
  68770. }
  68771. }
  68772. /* Prep the applied array - it needs an element for each row */
  68773. aApplied.push( [] );
  68774. }
  68775. for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
  68776. {
  68777. nLocalTr = aoLocal[i].nTr;
  68778. /* All cells are going to be replaced, so empty out the row */
  68779. if ( nLocalTr )
  68780. {
  68781. while( (n = nLocalTr.firstChild) )
  68782. {
  68783. nLocalTr.removeChild( n );
  68784. }
  68785. }
  68786. for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
  68787. {
  68788. iRowspan = 1;
  68789. iColspan = 1;
  68790. /* Check to see if there is already a cell (row/colspan) covering our target
  68791. * insert point. If there is, then there is nothing to do.
  68792. */
  68793. if ( aApplied[i][j] === undefined )
  68794. {
  68795. nLocalTr.appendChild( aoLocal[i][j].cell );
  68796. aApplied[i][j] = 1;
  68797. /* Expand the cell to cover as many rows as needed */
  68798. while ( aoLocal[i+iRowspan] !== undefined &&
  68799. aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
  68800. {
  68801. aApplied[i+iRowspan][j] = 1;
  68802. iRowspan++;
  68803. }
  68804. /* Expand the cell to cover as many columns as needed */
  68805. while ( aoLocal[i][j+iColspan] !== undefined &&
  68806. aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
  68807. {
  68808. /* Must update the applied array over the rows for the columns */
  68809. for ( k=0 ; k<iRowspan ; k++ )
  68810. {
  68811. aApplied[i+k][j+iColspan] = 1;
  68812. }
  68813. iColspan++;
  68814. }
  68815. /* Do the actual expansion in the DOM */
  68816. $(aoLocal[i][j].cell)
  68817. .attr('rowspan', iRowspan)
  68818. .attr('colspan', iColspan);
  68819. }
  68820. }
  68821. }
  68822. }
  68823. /**
  68824. * Insert the required TR nodes into the table for display
  68825. * @param {object} oSettings dataTables settings object
  68826. * @memberof DataTable#oApi
  68827. */
  68828. function _fnDraw( oSettings )
  68829. {
  68830. /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
  68831. var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
  68832. if ( $.inArray( false, aPreDraw ) !== -1 )
  68833. {
  68834. _fnProcessingDisplay( oSettings, false );
  68835. return;
  68836. }
  68837. var i, iLen, n;
  68838. var anRows = [];
  68839. var iRowCount = 0;
  68840. var asStripeClasses = oSettings.asStripeClasses;
  68841. var iStripes = asStripeClasses.length;
  68842. var iOpenRows = oSettings.aoOpenRows.length;
  68843. var oLang = oSettings.oLanguage;
  68844. var iInitDisplayStart = oSettings.iInitDisplayStart;
  68845. var bServerSide = _fnDataSource( oSettings ) == 'ssp';
  68846. var aiDisplay = oSettings.aiDisplay;
  68847. oSettings.bDrawing = true;
  68848. /* Check and see if we have an initial draw position from state saving */
  68849. if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
  68850. {
  68851. oSettings._iDisplayStart = bServerSide ?
  68852. iInitDisplayStart :
  68853. iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
  68854. 0 :
  68855. iInitDisplayStart;
  68856. oSettings.iInitDisplayStart = -1;
  68857. }
  68858. var iDisplayStart = oSettings._iDisplayStart;
  68859. var iDisplayEnd = oSettings.fnDisplayEnd();
  68860. /* Server-side processing draw intercept */
  68861. if ( oSettings.bDeferLoading )
  68862. {
  68863. oSettings.bDeferLoading = false;
  68864. oSettings.iDraw++;
  68865. _fnProcessingDisplay( oSettings, false );
  68866. }
  68867. else if ( !bServerSide )
  68868. {
  68869. oSettings.iDraw++;
  68870. }
  68871. else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
  68872. {
  68873. return;
  68874. }
  68875. if ( aiDisplay.length !== 0 )
  68876. {
  68877. var iStart = bServerSide ? 0 : iDisplayStart;
  68878. var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
  68879. for ( var j=iStart ; j<iEnd ; j++ )
  68880. {
  68881. var iDataIndex = aiDisplay[j];
  68882. var aoData = oSettings.aoData[ iDataIndex ];
  68883. if ( aoData.nTr === null )
  68884. {
  68885. _fnCreateTr( oSettings, iDataIndex );
  68886. }
  68887. var nRow = aoData.nTr;
  68888. /* Remove the old striping classes and then add the new one */
  68889. if ( iStripes !== 0 )
  68890. {
  68891. var sStripe = asStripeClasses[ iRowCount % iStripes ];
  68892. if ( aoData._sRowStripe != sStripe )
  68893. {
  68894. $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
  68895. aoData._sRowStripe = sStripe;
  68896. }
  68897. }
  68898. // Row callback functions - might want to manipulate the row
  68899. // iRowCount and j are not currently documented. Are they at all
  68900. // useful?
  68901. _fnCallbackFire( oSettings, 'aoRowCallback', null,
  68902. [nRow, aoData._aData, iRowCount, j] );
  68903. anRows.push( nRow );
  68904. iRowCount++;
  68905. }
  68906. }
  68907. else
  68908. {
  68909. /* Table is empty - create a row with an empty message in it */
  68910. var sZero = oLang.sZeroRecords;
  68911. if ( oSettings.iDraw == 1 && _fnDataSource( oSettings ) == 'ajax' )
  68912. {
  68913. sZero = oLang.sLoadingRecords;
  68914. }
  68915. else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
  68916. {
  68917. sZero = oLang.sEmptyTable;
  68918. }
  68919. anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
  68920. .append( $('<td />', {
  68921. 'valign': 'top',
  68922. 'colSpan': _fnVisbleColumns( oSettings ),
  68923. 'class': oSettings.oClasses.sRowEmpty
  68924. } ).html( sZero ) )[0];
  68925. }
  68926. /* Header and footer callbacks */
  68927. _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
  68928. _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
  68929. _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
  68930. _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
  68931. var body = $(oSettings.nTBody);
  68932. body.children().detach();
  68933. body.append( $(anRows) );
  68934. /* Call all required callback functions for the end of a draw */
  68935. _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
  68936. /* Draw is complete, sorting and filtering must be as well */
  68937. oSettings.bSorted = false;
  68938. oSettings.bFiltered = false;
  68939. oSettings.bDrawing = false;
  68940. }
  68941. /**
  68942. * Redraw the table - taking account of the various features which are enabled
  68943. * @param {object} oSettings dataTables settings object
  68944. * @param {boolean} [holdPosition] Keep the current paging position. By default
  68945. * the paging is reset to the first page
  68946. * @memberof DataTable#oApi
  68947. */
  68948. function _fnReDraw( settings, holdPosition )
  68949. {
  68950. var
  68951. features = settings.oFeatures,
  68952. sort = features.bSort,
  68953. filter = features.bFilter;
  68954. if ( sort ) {
  68955. _fnSort( settings );
  68956. }
  68957. if ( filter ) {
  68958. _fnFilterComplete( settings, settings.oPreviousSearch );
  68959. }
  68960. else {
  68961. // No filtering, so we want to just use the display master
  68962. settings.aiDisplay = settings.aiDisplayMaster.slice();
  68963. }
  68964. if ( holdPosition !== true ) {
  68965. settings._iDisplayStart = 0;
  68966. }
  68967. // Let any modules know about the draw hold position state (used by
  68968. // scrolling internally)
  68969. settings._drawHold = holdPosition;
  68970. _fnDraw( settings );
  68971. settings._drawHold = false;
  68972. }
  68973. /**
  68974. * Add the options to the page HTML for the table
  68975. * @param {object} oSettings dataTables settings object
  68976. * @memberof DataTable#oApi
  68977. */
  68978. function _fnAddOptionsHtml ( oSettings )
  68979. {
  68980. var classes = oSettings.oClasses;
  68981. var table = $(oSettings.nTable);
  68982. var holding = $('<div/>').insertBefore( table ); // Holding element for speed
  68983. var features = oSettings.oFeatures;
  68984. // All DataTables are wrapped in a div
  68985. var insert = $('<div/>', {
  68986. id: oSettings.sTableId+'_wrapper',
  68987. 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
  68988. } );
  68989. oSettings.nHolding = holding[0];
  68990. oSettings.nTableWrapper = insert[0];
  68991. oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
  68992. /* Loop over the user set positioning and place the elements as needed */
  68993. var aDom = oSettings.sDom.split('');
  68994. var featureNode, cOption, nNewNode, cNext, sAttr, j;
  68995. for ( var i=0 ; i<aDom.length ; i++ )
  68996. {
  68997. featureNode = null;
  68998. cOption = aDom[i];
  68999. if ( cOption == '<' )
  69000. {
  69001. /* New container div */
  69002. nNewNode = $('<div/>')[0];
  69003. /* Check to see if we should append an id and/or a class name to the container */
  69004. cNext = aDom[i+1];
  69005. if ( cNext == "'" || cNext == '"' )
  69006. {
  69007. sAttr = "";
  69008. j = 2;
  69009. while ( aDom[i+j] != cNext )
  69010. {
  69011. sAttr += aDom[i+j];
  69012. j++;
  69013. }
  69014. /* Replace jQuery UI constants @todo depreciated */
  69015. if ( sAttr == "H" )
  69016. {
  69017. sAttr = classes.sJUIHeader;
  69018. }
  69019. else if ( sAttr == "F" )
  69020. {
  69021. sAttr = classes.sJUIFooter;
  69022. }
  69023. /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
  69024. * breaks the string into parts and applies them as needed
  69025. */
  69026. if ( sAttr.indexOf('.') != -1 )
  69027. {
  69028. var aSplit = sAttr.split('.');
  69029. nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
  69030. nNewNode.className = aSplit[1];
  69031. }
  69032. else if ( sAttr.charAt(0) == "#" )
  69033. {
  69034. nNewNode.id = sAttr.substr(1, sAttr.length-1);
  69035. }
  69036. else
  69037. {
  69038. nNewNode.className = sAttr;
  69039. }
  69040. i += j; /* Move along the position array */
  69041. }
  69042. insert.append( nNewNode );
  69043. insert = $(nNewNode);
  69044. }
  69045. else if ( cOption == '>' )
  69046. {
  69047. /* End container div */
  69048. insert = insert.parent();
  69049. }
  69050. // @todo Move options into their own plugins?
  69051. else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
  69052. {
  69053. /* Length */
  69054. featureNode = _fnFeatureHtmlLength( oSettings );
  69055. }
  69056. else if ( cOption == 'f' && features.bFilter )
  69057. {
  69058. /* Filter */
  69059. featureNode = _fnFeatureHtmlFilter( oSettings );
  69060. }
  69061. else if ( cOption == 'r' && features.bProcessing )
  69062. {
  69063. /* pRocessing */
  69064. featureNode = _fnFeatureHtmlProcessing( oSettings );
  69065. }
  69066. else if ( cOption == 't' )
  69067. {
  69068. /* Table */
  69069. featureNode = _fnFeatureHtmlTable( oSettings );
  69070. }
  69071. else if ( cOption == 'i' && features.bInfo )
  69072. {
  69073. /* Info */
  69074. featureNode = _fnFeatureHtmlInfo( oSettings );
  69075. }
  69076. else if ( cOption == 'p' && features.bPaginate )
  69077. {
  69078. /* Pagination */
  69079. featureNode = _fnFeatureHtmlPaginate( oSettings );
  69080. }
  69081. else if ( DataTable.ext.feature.length !== 0 )
  69082. {
  69083. /* Plug-in features */
  69084. var aoFeatures = DataTable.ext.feature;
  69085. for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
  69086. {
  69087. if ( cOption == aoFeatures[k].cFeature )
  69088. {
  69089. featureNode = aoFeatures[k].fnInit( oSettings );
  69090. break;
  69091. }
  69092. }
  69093. }
  69094. /* Add to the 2D features array */
  69095. if ( featureNode )
  69096. {
  69097. var aanFeatures = oSettings.aanFeatures;
  69098. if ( ! aanFeatures[cOption] )
  69099. {
  69100. aanFeatures[cOption] = [];
  69101. }
  69102. aanFeatures[cOption].push( featureNode );
  69103. insert.append( featureNode );
  69104. }
  69105. }
  69106. /* Built our DOM structure - replace the holding div with what we want */
  69107. holding.replaceWith( insert );
  69108. oSettings.nHolding = null;
  69109. }
  69110. /**
  69111. * Use the DOM source to create up an array of header cells. The idea here is to
  69112. * create a layout grid (array) of rows x columns, which contains a reference
  69113. * to the cell that that point in the grid (regardless of col/rowspan), such that
  69114. * any column / row could be removed and the new grid constructed
  69115. * @param array {object} aLayout Array to store the calculated layout in
  69116. * @param {node} nThead The header/footer element for the table
  69117. * @memberof DataTable#oApi
  69118. */
  69119. function _fnDetectHeader ( aLayout, nThead )
  69120. {
  69121. var nTrs = $(nThead).children('tr');
  69122. var nTr, nCell;
  69123. var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
  69124. var bUnique;
  69125. var fnShiftCol = function ( a, i, j ) {
  69126. var k = a[i];
  69127. while ( k[j] ) {
  69128. j++;
  69129. }
  69130. return j;
  69131. };
  69132. aLayout.splice( 0, aLayout.length );
  69133. /* We know how many rows there are in the layout - so prep it */
  69134. for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
  69135. {
  69136. aLayout.push( [] );
  69137. }
  69138. /* Calculate a layout array */
  69139. for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
  69140. {
  69141. nTr = nTrs[i];
  69142. iColumn = 0;
  69143. /* For every cell in the row... */
  69144. nCell = nTr.firstChild;
  69145. while ( nCell ) {
  69146. if ( nCell.nodeName.toUpperCase() == "TD" ||
  69147. nCell.nodeName.toUpperCase() == "TH" )
  69148. {
  69149. /* Get the col and rowspan attributes from the DOM and sanitise them */
  69150. iColspan = nCell.getAttribute('colspan') * 1;
  69151. iRowspan = nCell.getAttribute('rowspan') * 1;
  69152. iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
  69153. iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
  69154. /* There might be colspan cells already in this row, so shift our target
  69155. * accordingly
  69156. */
  69157. iColShifted = fnShiftCol( aLayout, i, iColumn );
  69158. /* Cache calculation for unique columns */
  69159. bUnique = iColspan === 1 ? true : false;
  69160. /* If there is col / rowspan, copy the information into the layout grid */
  69161. for ( l=0 ; l<iColspan ; l++ )
  69162. {
  69163. for ( k=0 ; k<iRowspan ; k++ )
  69164. {
  69165. aLayout[i+k][iColShifted+l] = {
  69166. "cell": nCell,
  69167. "unique": bUnique
  69168. };
  69169. aLayout[i+k].nTr = nTr;
  69170. }
  69171. }
  69172. }
  69173. nCell = nCell.nextSibling;
  69174. }
  69175. }
  69176. }
  69177. /**
  69178. * Get an array of unique th elements, one for each column
  69179. * @param {object} oSettings dataTables settings object
  69180. * @param {node} nHeader automatically detect the layout from this node - optional
  69181. * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
  69182. * @returns array {node} aReturn list of unique th's
  69183. * @memberof DataTable#oApi
  69184. */
  69185. function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
  69186. {
  69187. var aReturn = [];
  69188. if ( !aLayout )
  69189. {
  69190. aLayout = oSettings.aoHeader;
  69191. if ( nHeader )
  69192. {
  69193. aLayout = [];
  69194. _fnDetectHeader( aLayout, nHeader );
  69195. }
  69196. }
  69197. for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
  69198. {
  69199. for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
  69200. {
  69201. if ( aLayout[i][j].unique &&
  69202. (!aReturn[j] || !oSettings.bSortCellsTop) )
  69203. {
  69204. aReturn[j] = aLayout[i][j].cell;
  69205. }
  69206. }
  69207. }
  69208. return aReturn;
  69209. }
  69210. /**
  69211. * Create an Ajax call based on the table's settings, taking into account that
  69212. * parameters can have multiple forms, and backwards compatibility.
  69213. *
  69214. * @param {object} oSettings dataTables settings object
  69215. * @param {array} data Data to send to the server, required by
  69216. * DataTables - may be augmented by developer callbacks
  69217. * @param {function} fn Callback function to run when data is obtained
  69218. */
  69219. function _fnBuildAjax( oSettings, data, fn )
  69220. {
  69221. // Compatibility with 1.9-, allow fnServerData and event to manipulate
  69222. _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
  69223. // Convert to object based for 1.10+ if using the old array scheme which can
  69224. // come from server-side processing or serverParams
  69225. if ( data && $.isArray(data) ) {
  69226. var tmp = {};
  69227. var rbracket = /(.*?)\[\]$/;
  69228. $.each( data, function (key, val) {
  69229. var match = val.name.match(rbracket);
  69230. if ( match ) {
  69231. // Support for arrays
  69232. var name = match[0];
  69233. if ( ! tmp[ name ] ) {
  69234. tmp[ name ] = [];
  69235. }
  69236. tmp[ name ].push( val.value );
  69237. }
  69238. else {
  69239. tmp[val.name] = val.value;
  69240. }
  69241. } );
  69242. data = tmp;
  69243. }
  69244. var ajaxData;
  69245. var ajax = oSettings.ajax;
  69246. var instance = oSettings.oInstance;
  69247. var callback = function ( json ) {
  69248. _fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
  69249. fn( json );
  69250. };
  69251. if ( $.isPlainObject( ajax ) && ajax.data )
  69252. {
  69253. ajaxData = ajax.data;
  69254. var newData = $.isFunction( ajaxData ) ?
  69255. ajaxData( data, oSettings ) : // fn can manipulate data or return
  69256. ajaxData; // an object object or array to merge
  69257. // If the function returned something, use that alone
  69258. data = $.isFunction( ajaxData ) && newData ?
  69259. newData :
  69260. $.extend( true, data, newData );
  69261. // Remove the data property as we've resolved it already and don't want
  69262. // jQuery to do it again (it is restored at the end of the function)
  69263. delete ajax.data;
  69264. }
  69265. var baseAjax = {
  69266. "data": data,
  69267. "success": function (json) {
  69268. var error = json.error || json.sError;
  69269. if ( error ) {
  69270. _fnLog( oSettings, 0, error );
  69271. }
  69272. oSettings.json = json;
  69273. callback( json );
  69274. },
  69275. "dataType": "json",
  69276. "cache": false,
  69277. "type": oSettings.sServerMethod,
  69278. "error": function (xhr, error, thrown) {
  69279. var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
  69280. if ( $.inArray( true, ret ) === -1 ) {
  69281. if ( error == "parsererror" ) {
  69282. _fnLog( oSettings, 0, 'Invalid JSON response', 1 );
  69283. }
  69284. else if ( xhr.readyState === 4 ) {
  69285. _fnLog( oSettings, 0, 'Ajax error', 7 );
  69286. }
  69287. }
  69288. _fnProcessingDisplay( oSettings, false );
  69289. }
  69290. };
  69291. // Store the data submitted for the API
  69292. oSettings.oAjaxData = data;
  69293. // Allow plug-ins and external processes to modify the data
  69294. _fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
  69295. if ( oSettings.fnServerData )
  69296. {
  69297. // DataTables 1.9- compatibility
  69298. oSettings.fnServerData.call( instance,
  69299. oSettings.sAjaxSource,
  69300. $.map( data, function (val, key) { // Need to convert back to 1.9 trad format
  69301. return { name: key, value: val };
  69302. } ),
  69303. callback,
  69304. oSettings
  69305. );
  69306. }
  69307. else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
  69308. {
  69309. // DataTables 1.9- compatibility
  69310. oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
  69311. url: ajax || oSettings.sAjaxSource
  69312. } ) );
  69313. }
  69314. else if ( $.isFunction( ajax ) )
  69315. {
  69316. // Is a function - let the caller define what needs to be done
  69317. oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
  69318. }
  69319. else
  69320. {
  69321. // Object to extend the base settings
  69322. oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
  69323. // Restore for next time around
  69324. ajax.data = ajaxData;
  69325. }
  69326. }
  69327. /**
  69328. * Update the table using an Ajax call
  69329. * @param {object} settings dataTables settings object
  69330. * @returns {boolean} Block the table drawing or not
  69331. * @memberof DataTable#oApi
  69332. */
  69333. function _fnAjaxUpdate( settings )
  69334. {
  69335. if ( settings.bAjaxDataGet ) {
  69336. settings.iDraw++;
  69337. _fnProcessingDisplay( settings, true );
  69338. _fnBuildAjax(
  69339. settings,
  69340. _fnAjaxParameters( settings ),
  69341. function(json) {
  69342. _fnAjaxUpdateDraw( settings, json );
  69343. }
  69344. );
  69345. return false;
  69346. }
  69347. return true;
  69348. }
  69349. /**
  69350. * Build up the parameters in an object needed for a server-side processing
  69351. * request. Note that this is basically done twice, is different ways - a modern
  69352. * method which is used by default in DataTables 1.10 which uses objects and
  69353. * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
  69354. * the sAjaxSource option is used in the initialisation, or the legacyAjax
  69355. * option is set.
  69356. * @param {object} oSettings dataTables settings object
  69357. * @returns {bool} block the table drawing or not
  69358. * @memberof DataTable#oApi
  69359. */
  69360. function _fnAjaxParameters( settings )
  69361. {
  69362. var
  69363. columns = settings.aoColumns,
  69364. columnCount = columns.length,
  69365. features = settings.oFeatures,
  69366. preSearch = settings.oPreviousSearch,
  69367. preColSearch = settings.aoPreSearchCols,
  69368. i, data = [], dataProp, column, columnSearch,
  69369. sort = _fnSortFlatten( settings ),
  69370. displayStart = settings._iDisplayStart,
  69371. displayLength = features.bPaginate !== false ?
  69372. settings._iDisplayLength :
  69373. -1;
  69374. var param = function ( name, value ) {
  69375. data.push( { 'name': name, 'value': value } );
  69376. };
  69377. // DataTables 1.9- compatible method
  69378. param( 'sEcho', settings.iDraw );
  69379. param( 'iColumns', columnCount );
  69380. param( 'sColumns', _pluck( columns, 'sName' ).join(',') );
  69381. param( 'iDisplayStart', displayStart );
  69382. param( 'iDisplayLength', displayLength );
  69383. // DataTables 1.10+ method
  69384. var d = {
  69385. draw: settings.iDraw,
  69386. columns: [],
  69387. order: [],
  69388. start: displayStart,
  69389. length: displayLength,
  69390. search: {
  69391. value: preSearch.sSearch,
  69392. regex: preSearch.bRegex
  69393. }
  69394. };
  69395. for ( i=0 ; i<columnCount ; i++ ) {
  69396. column = columns[i];
  69397. columnSearch = preColSearch[i];
  69398. dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
  69399. d.columns.push( {
  69400. data: dataProp,
  69401. name: column.sName,
  69402. searchable: column.bSearchable,
  69403. orderable: column.bSortable,
  69404. search: {
  69405. value: columnSearch.sSearch,
  69406. regex: columnSearch.bRegex
  69407. }
  69408. } );
  69409. param( "mDataProp_"+i, dataProp );
  69410. if ( features.bFilter ) {
  69411. param( 'sSearch_'+i, columnSearch.sSearch );
  69412. param( 'bRegex_'+i, columnSearch.bRegex );
  69413. param( 'bSearchable_'+i, column.bSearchable );
  69414. }
  69415. if ( features.bSort ) {
  69416. param( 'bSortable_'+i, column.bSortable );
  69417. }
  69418. }
  69419. if ( features.bFilter ) {
  69420. param( 'sSearch', preSearch.sSearch );
  69421. param( 'bRegex', preSearch.bRegex );
  69422. }
  69423. if ( features.bSort ) {
  69424. $.each( sort, function ( i, val ) {
  69425. d.order.push( { column: val.col, dir: val.dir } );
  69426. param( 'iSortCol_'+i, val.col );
  69427. param( 'sSortDir_'+i, val.dir );
  69428. } );
  69429. param( 'iSortingCols', sort.length );
  69430. }
  69431. // If the legacy.ajax parameter is null, then we automatically decide which
  69432. // form to use, based on sAjaxSource
  69433. var legacy = DataTable.ext.legacy.ajax;
  69434. if ( legacy === null ) {
  69435. return settings.sAjaxSource ? data : d;
  69436. }
  69437. // Otherwise, if legacy has been specified then we use that to decide on the
  69438. // form
  69439. return legacy ? data : d;
  69440. }
  69441. /**
  69442. * Data the data from the server (nuking the old) and redraw the table
  69443. * @param {object} oSettings dataTables settings object
  69444. * @param {object} json json data return from the server.
  69445. * @param {string} json.sEcho Tracking flag for DataTables to match requests
  69446. * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
  69447. * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
  69448. * @param {array} json.aaData The data to display on this page
  69449. * @param {string} [json.sColumns] Column ordering (sName, comma separated)
  69450. * @memberof DataTable#oApi
  69451. */
  69452. function _fnAjaxUpdateDraw ( settings, json )
  69453. {
  69454. // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
  69455. // Support both
  69456. var compat = function ( old, modern ) {
  69457. return json[old] !== undefined ? json[old] : json[modern];
  69458. };
  69459. var data = _fnAjaxDataSrc( settings, json );
  69460. var draw = compat( 'sEcho', 'draw' );
  69461. var recordsTotal = compat( 'iTotalRecords', 'recordsTotal' );
  69462. var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
  69463. if ( draw ) {
  69464. // Protect against out of sequence returns
  69465. if ( draw*1 < settings.iDraw ) {
  69466. return;
  69467. }
  69468. settings.iDraw = draw * 1;
  69469. }
  69470. _fnClearTable( settings );
  69471. settings._iRecordsTotal = parseInt(recordsTotal, 10);
  69472. settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
  69473. for ( var i=0, ien=data.length ; i<ien ; i++ ) {
  69474. _fnAddData( settings, data[i] );
  69475. }
  69476. settings.aiDisplay = settings.aiDisplayMaster.slice();
  69477. settings.bAjaxDataGet = false;
  69478. _fnDraw( settings );
  69479. if ( ! settings._bInitComplete ) {
  69480. _fnInitComplete( settings, json );
  69481. }
  69482. settings.bAjaxDataGet = true;
  69483. _fnProcessingDisplay( settings, false );
  69484. }
  69485. /**
  69486. * Get the data from the JSON data source to use for drawing a table. Using
  69487. * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
  69488. * source object, or from a processing function.
  69489. * @param {object} oSettings dataTables settings object
  69490. * @param {object} json Data source object / array from the server
  69491. * @return {array} Array of data to use
  69492. */
  69493. function _fnAjaxDataSrc ( oSettings, json )
  69494. {
  69495. var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
  69496. oSettings.ajax.dataSrc :
  69497. oSettings.sAjaxDataProp; // Compatibility with 1.9-.
  69498. // Compatibility with 1.9-. In order to read from aaData, check if the
  69499. // default has been changed, if not, check for aaData
  69500. if ( dataSrc === 'data' ) {
  69501. return json.aaData || json[dataSrc];
  69502. }
  69503. return dataSrc !== "" ?
  69504. _fnGetObjectDataFn( dataSrc )( json ) :
  69505. json;
  69506. }
  69507. /**
  69508. * Generate the node required for filtering text
  69509. * @returns {node} Filter control element
  69510. * @param {object} oSettings dataTables settings object
  69511. * @memberof DataTable#oApi
  69512. */
  69513. function _fnFeatureHtmlFilter ( settings )
  69514. {
  69515. var classes = settings.oClasses;
  69516. var tableId = settings.sTableId;
  69517. var language = settings.oLanguage;
  69518. var previousSearch = settings.oPreviousSearch;
  69519. var features = settings.aanFeatures;
  69520. var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
  69521. var str = language.sSearch;
  69522. str = str.match(/_INPUT_/) ?
  69523. str.replace('_INPUT_', input) :
  69524. str+input;
  69525. var filter = $('<div/>', {
  69526. 'id': ! features.f ? tableId+'_filter' : null,
  69527. 'class': classes.sFilter
  69528. } )
  69529. .append( $('<label/>' ).append( str ) );
  69530. var searchFn = function() {
  69531. /* Update all other filter input elements for the new display */
  69532. var n = features.f;
  69533. var val = !this.value ? "" : this.value; // mental IE8 fix :-(
  69534. /* Now do the filter */
  69535. if ( val != previousSearch.sSearch ) {
  69536. _fnFilterComplete( settings, {
  69537. "sSearch": val,
  69538. "bRegex": previousSearch.bRegex,
  69539. "bSmart": previousSearch.bSmart ,
  69540. "bCaseInsensitive": previousSearch.bCaseInsensitive
  69541. } );
  69542. // Need to redraw, without resorting
  69543. settings._iDisplayStart = 0;
  69544. _fnDraw( settings );
  69545. }
  69546. };
  69547. var searchDelay = settings.searchDelay !== null ?
  69548. settings.searchDelay :
  69549. _fnDataSource( settings ) === 'ssp' ?
  69550. 400 :
  69551. 0;
  69552. var jqFilter = $('input', filter)
  69553. .val( previousSearch.sSearch )
  69554. .attr( 'placeholder', language.sSearchPlaceholder )
  69555. .on(
  69556. 'keyup.DT search.DT input.DT paste.DT cut.DT',
  69557. searchDelay ?
  69558. _fnThrottle( searchFn, searchDelay ) :
  69559. searchFn
  69560. )
  69561. .on( 'keypress.DT', function(e) {
  69562. /* Prevent form submission */
  69563. if ( e.keyCode == 13 ) {
  69564. return false;
  69565. }
  69566. } )
  69567. .attr('aria-controls', tableId);
  69568. // Update the input elements whenever the table is filtered
  69569. $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
  69570. if ( settings === s ) {
  69571. // IE9 throws an 'unknown error' if document.activeElement is used
  69572. // inside an iframe or frame...
  69573. try {
  69574. if ( jqFilter[0] !== document.activeElement ) {
  69575. jqFilter.val( previousSearch.sSearch );
  69576. }
  69577. }
  69578. catch ( e ) {}
  69579. }
  69580. } );
  69581. return filter[0];
  69582. }
  69583. /**
  69584. * Filter the table using both the global filter and column based filtering
  69585. * @param {object} oSettings dataTables settings object
  69586. * @param {object} oSearch search information
  69587. * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
  69588. * @memberof DataTable#oApi
  69589. */
  69590. function _fnFilterComplete ( oSettings, oInput, iForce )
  69591. {
  69592. var oPrevSearch = oSettings.oPreviousSearch;
  69593. var aoPrevSearch = oSettings.aoPreSearchCols;
  69594. var fnSaveFilter = function ( oFilter ) {
  69595. /* Save the filtering values */
  69596. oPrevSearch.sSearch = oFilter.sSearch;
  69597. oPrevSearch.bRegex = oFilter.bRegex;
  69598. oPrevSearch.bSmart = oFilter.bSmart;
  69599. oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
  69600. };
  69601. var fnRegex = function ( o ) {
  69602. // Backwards compatibility with the bEscapeRegex option
  69603. return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
  69604. };
  69605. // Resolve any column types that are unknown due to addition or invalidation
  69606. // @todo As per sort - can this be moved into an event handler?
  69607. _fnColumnTypes( oSettings );
  69608. /* In server-side processing all filtering is done by the server, so no point hanging around here */
  69609. if ( _fnDataSource( oSettings ) != 'ssp' )
  69610. {
  69611. /* Global filter */
  69612. _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
  69613. fnSaveFilter( oInput );
  69614. /* Now do the individual column filter */
  69615. for ( var i=0 ; i<aoPrevSearch.length ; i++ )
  69616. {
  69617. _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
  69618. aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
  69619. }
  69620. /* Custom filtering */
  69621. _fnFilterCustom( oSettings );
  69622. }
  69623. else
  69624. {
  69625. fnSaveFilter( oInput );
  69626. }
  69627. /* Tell the draw function we have been filtering */
  69628. oSettings.bFiltered = true;
  69629. _fnCallbackFire( oSettings, null, 'search', [oSettings] );
  69630. }
  69631. /**
  69632. * Apply custom filtering functions
  69633. * @param {object} oSettings dataTables settings object
  69634. * @memberof DataTable#oApi
  69635. */
  69636. function _fnFilterCustom( settings )
  69637. {
  69638. var filters = DataTable.ext.search;
  69639. var displayRows = settings.aiDisplay;
  69640. var row, rowIdx;
  69641. for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
  69642. var rows = [];
  69643. // Loop over each row and see if it should be included
  69644. for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
  69645. rowIdx = displayRows[ j ];
  69646. row = settings.aoData[ rowIdx ];
  69647. if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
  69648. rows.push( rowIdx );
  69649. }
  69650. }
  69651. // So the array reference doesn't break set the results into the
  69652. // existing array
  69653. displayRows.length = 0;
  69654. $.merge( displayRows, rows );
  69655. }
  69656. }
  69657. /**
  69658. * Filter the table on a per-column basis
  69659. * @param {object} oSettings dataTables settings object
  69660. * @param {string} sInput string to filter on
  69661. * @param {int} iColumn column to filter
  69662. * @param {bool} bRegex treat search string as a regular expression or not
  69663. * @param {bool} bSmart use smart filtering or not
  69664. * @param {bool} bCaseInsensitive Do case insenstive matching or not
  69665. * @memberof DataTable#oApi
  69666. */
  69667. function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
  69668. {
  69669. if ( searchStr === '' ) {
  69670. return;
  69671. }
  69672. var data;
  69673. var out = [];
  69674. var display = settings.aiDisplay;
  69675. var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
  69676. for ( var i=0 ; i<display.length ; i++ ) {
  69677. data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
  69678. if ( rpSearch.test( data ) ) {
  69679. out.push( display[i] );
  69680. }
  69681. }
  69682. settings.aiDisplay = out;
  69683. }
  69684. /**
  69685. * Filter the data table based on user input and draw the table
  69686. * @param {object} settings dataTables settings object
  69687. * @param {string} input string to filter on
  69688. * @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
  69689. * @param {bool} regex treat as a regular expression or not
  69690. * @param {bool} smart perform smart filtering or not
  69691. * @param {bool} caseInsensitive Do case insenstive matching or not
  69692. * @memberof DataTable#oApi
  69693. */
  69694. function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
  69695. {
  69696. var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
  69697. var prevSearch = settings.oPreviousSearch.sSearch;
  69698. var displayMaster = settings.aiDisplayMaster;
  69699. var display, invalidated, i;
  69700. var filtered = [];
  69701. // Need to take account of custom filtering functions - always filter
  69702. if ( DataTable.ext.search.length !== 0 ) {
  69703. force = true;
  69704. }
  69705. // Check if any of the rows were invalidated
  69706. invalidated = _fnFilterData( settings );
  69707. // If the input is blank - we just want the full data set
  69708. if ( input.length <= 0 ) {
  69709. settings.aiDisplay = displayMaster.slice();
  69710. }
  69711. else {
  69712. // New search - start from the master array
  69713. if ( invalidated ||
  69714. force ||
  69715. prevSearch.length > input.length ||
  69716. input.indexOf(prevSearch) !== 0 ||
  69717. settings.bSorted // On resort, the display master needs to be
  69718. // re-filtered since indexes will have changed
  69719. ) {
  69720. settings.aiDisplay = displayMaster.slice();
  69721. }
  69722. // Search the display array
  69723. display = settings.aiDisplay;
  69724. for ( i=0 ; i<display.length ; i++ ) {
  69725. if ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
  69726. filtered.push( display[i] );
  69727. }
  69728. }
  69729. settings.aiDisplay = filtered;
  69730. }
  69731. }
  69732. /**
  69733. * Build a regular expression object suitable for searching a table
  69734. * @param {string} sSearch string to search for
  69735. * @param {bool} bRegex treat as a regular expression or not
  69736. * @param {bool} bSmart perform smart filtering or not
  69737. * @param {bool} bCaseInsensitive Do case insensitive matching or not
  69738. * @returns {RegExp} constructed object
  69739. * @memberof DataTable#oApi
  69740. */
  69741. function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
  69742. {
  69743. search = regex ?
  69744. search :
  69745. _fnEscapeRegex( search );
  69746. if ( smart ) {
  69747. /* For smart filtering we want to allow the search to work regardless of
  69748. * word order. We also want double quoted text to be preserved, so word
  69749. * order is important - a la google. So this is what we want to
  69750. * generate:
  69751. *
  69752. * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
  69753. */
  69754. var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
  69755. if ( word.charAt(0) === '"' ) {
  69756. var m = word.match( /^"(.*)"$/ );
  69757. word = m ? m[1] : word;
  69758. }
  69759. return word.replace('"', '');
  69760. } );
  69761. search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
  69762. }
  69763. return new RegExp( search, caseInsensitive ? 'i' : '' );
  69764. }
  69765. /**
  69766. * Escape a string such that it can be used in a regular expression
  69767. * @param {string} sVal string to escape
  69768. * @returns {string} escaped string
  69769. * @memberof DataTable#oApi
  69770. */
  69771. var _fnEscapeRegex = DataTable.util.escapeRegex;
  69772. var __filter_div = $('<div>')[0];
  69773. var __filter_div_textContent = __filter_div.textContent !== undefined;
  69774. // Update the filtering data for each row if needed (by invalidation or first run)
  69775. function _fnFilterData ( settings )
  69776. {
  69777. var columns = settings.aoColumns;
  69778. var column;
  69779. var i, j, ien, jen, filterData, cellData, row;
  69780. var fomatters = DataTable.ext.type.search;
  69781. var wasInvalidated = false;
  69782. for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
  69783. row = settings.aoData[i];
  69784. if ( ! row._aFilterData ) {
  69785. filterData = [];
  69786. for ( j=0, jen=columns.length ; j<jen ; j++ ) {
  69787. column = columns[j];
  69788. if ( column.bSearchable ) {
  69789. cellData = _fnGetCellData( settings, i, j, 'filter' );
  69790. if ( fomatters[ column.sType ] ) {
  69791. cellData = fomatters[ column.sType ]( cellData );
  69792. }
  69793. // Search in DataTables 1.10 is string based. In 1.11 this
  69794. // should be altered to also allow strict type checking.
  69795. if ( cellData === null ) {
  69796. cellData = '';
  69797. }
  69798. if ( typeof cellData !== 'string' && cellData.toString ) {
  69799. cellData = cellData.toString();
  69800. }
  69801. }
  69802. else {
  69803. cellData = '';
  69804. }
  69805. // If it looks like there is an HTML entity in the string,
  69806. // attempt to decode it so sorting works as expected. Note that
  69807. // we could use a single line of jQuery to do this, but the DOM
  69808. // method used here is much faster http://jsperf.com/html-decode
  69809. if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
  69810. __filter_div.innerHTML = cellData;
  69811. cellData = __filter_div_textContent ?
  69812. __filter_div.textContent :
  69813. __filter_div.innerText;
  69814. }
  69815. if ( cellData.replace ) {
  69816. cellData = cellData.replace(/[\r\n]/g, '');
  69817. }
  69818. filterData.push( cellData );
  69819. }
  69820. row._aFilterData = filterData;
  69821. row._sFilterRow = filterData.join(' ');
  69822. wasInvalidated = true;
  69823. }
  69824. }
  69825. return wasInvalidated;
  69826. }
  69827. /**
  69828. * Convert from the internal Hungarian notation to camelCase for external
  69829. * interaction
  69830. * @param {object} obj Object to convert
  69831. * @returns {object} Inverted object
  69832. * @memberof DataTable#oApi
  69833. */
  69834. function _fnSearchToCamel ( obj )
  69835. {
  69836. return {
  69837. search: obj.sSearch,
  69838. smart: obj.bSmart,
  69839. regex: obj.bRegex,
  69840. caseInsensitive: obj.bCaseInsensitive
  69841. };
  69842. }
  69843. /**
  69844. * Convert from camelCase notation to the internal Hungarian. We could use the
  69845. * Hungarian convert function here, but this is cleaner
  69846. * @param {object} obj Object to convert
  69847. * @returns {object} Inverted object
  69848. * @memberof DataTable#oApi
  69849. */
  69850. function _fnSearchToHung ( obj )
  69851. {
  69852. return {
  69853. sSearch: obj.search,
  69854. bSmart: obj.smart,
  69855. bRegex: obj.regex,
  69856. bCaseInsensitive: obj.caseInsensitive
  69857. };
  69858. }
  69859. /**
  69860. * Generate the node required for the info display
  69861. * @param {object} oSettings dataTables settings object
  69862. * @returns {node} Information element
  69863. * @memberof DataTable#oApi
  69864. */
  69865. function _fnFeatureHtmlInfo ( settings )
  69866. {
  69867. var
  69868. tid = settings.sTableId,
  69869. nodes = settings.aanFeatures.i,
  69870. n = $('<div/>', {
  69871. 'class': settings.oClasses.sInfo,
  69872. 'id': ! nodes ? tid+'_info' : null
  69873. } );
  69874. if ( ! nodes ) {
  69875. // Update display on each draw
  69876. settings.aoDrawCallback.push( {
  69877. "fn": _fnUpdateInfo,
  69878. "sName": "information"
  69879. } );
  69880. n
  69881. .attr( 'role', 'status' )
  69882. .attr( 'aria-live', 'polite' );
  69883. // Table is described by our info div
  69884. $(settings.nTable).attr( 'aria-describedby', tid+'_info' );
  69885. }
  69886. return n[0];
  69887. }
  69888. /**
  69889. * Update the information elements in the display
  69890. * @param {object} settings dataTables settings object
  69891. * @memberof DataTable#oApi
  69892. */
  69893. function _fnUpdateInfo ( settings )
  69894. {
  69895. /* Show information about the table */
  69896. var nodes = settings.aanFeatures.i;
  69897. if ( nodes.length === 0 ) {
  69898. return;
  69899. }
  69900. var
  69901. lang = settings.oLanguage,
  69902. start = settings._iDisplayStart+1,
  69903. end = settings.fnDisplayEnd(),
  69904. max = settings.fnRecordsTotal(),
  69905. total = settings.fnRecordsDisplay(),
  69906. out = total ?
  69907. lang.sInfo :
  69908. lang.sInfoEmpty;
  69909. if ( total !== max ) {
  69910. /* Record set after filtering */
  69911. out += ' ' + lang.sInfoFiltered;
  69912. }
  69913. // Convert the macros
  69914. out += lang.sInfoPostFix;
  69915. out = _fnInfoMacros( settings, out );
  69916. var callback = lang.fnInfoCallback;
  69917. if ( callback !== null ) {
  69918. out = callback.call( settings.oInstance,
  69919. settings, start, end, max, total, out
  69920. );
  69921. }
  69922. $(nodes).html( out );
  69923. }
  69924. function _fnInfoMacros ( settings, str )
  69925. {
  69926. // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
  69927. // internally
  69928. var
  69929. formatter = settings.fnFormatNumber,
  69930. start = settings._iDisplayStart+1,
  69931. len = settings._iDisplayLength,
  69932. vis = settings.fnRecordsDisplay(),
  69933. all = len === -1;
  69934. return str.
  69935. replace(/_START_/g, formatter.call( settings, start ) ).
  69936. replace(/_END_/g, formatter.call( settings, settings.fnDisplayEnd() ) ).
  69937. replace(/_MAX_/g, formatter.call( settings, settings.fnRecordsTotal() ) ).
  69938. replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
  69939. replace(/_PAGE_/g, formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
  69940. replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
  69941. }
  69942. /**
  69943. * Draw the table for the first time, adding all required features
  69944. * @param {object} settings dataTables settings object
  69945. * @memberof DataTable#oApi
  69946. */
  69947. function _fnInitialise ( settings )
  69948. {
  69949. var i, iLen, iAjaxStart=settings.iInitDisplayStart;
  69950. var columns = settings.aoColumns, column;
  69951. var features = settings.oFeatures;
  69952. var deferLoading = settings.bDeferLoading; // value modified by the draw
  69953. /* Ensure that the table data is fully initialised */
  69954. if ( ! settings.bInitialised ) {
  69955. setTimeout( function(){ _fnInitialise( settings ); }, 200 );
  69956. return;
  69957. }
  69958. /* Show the display HTML options */
  69959. _fnAddOptionsHtml( settings );
  69960. /* Build and draw the header / footer for the table */
  69961. _fnBuildHead( settings );
  69962. _fnDrawHead( settings, settings.aoHeader );
  69963. _fnDrawHead( settings, settings.aoFooter );
  69964. /* Okay to show that something is going on now */
  69965. _fnProcessingDisplay( settings, true );
  69966. /* Calculate sizes for columns */
  69967. if ( features.bAutoWidth ) {
  69968. _fnCalculateColumnWidths( settings );
  69969. }
  69970. for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
  69971. column = columns[i];
  69972. if ( column.sWidth ) {
  69973. column.nTh.style.width = _fnStringToCss( column.sWidth );
  69974. }
  69975. }
  69976. _fnCallbackFire( settings, null, 'preInit', [settings] );
  69977. // If there is default sorting required - let's do it. The sort function
  69978. // will do the drawing for us. Otherwise we draw the table regardless of the
  69979. // Ajax source - this allows the table to look initialised for Ajax sourcing
  69980. // data (show 'loading' message possibly)
  69981. _fnReDraw( settings );
  69982. // Server-side processing init complete is done by _fnAjaxUpdateDraw
  69983. var dataSrc = _fnDataSource( settings );
  69984. if ( dataSrc != 'ssp' || deferLoading ) {
  69985. // if there is an ajax source load the data
  69986. if ( dataSrc == 'ajax' ) {
  69987. _fnBuildAjax( settings, [], function(json) {
  69988. var aData = _fnAjaxDataSrc( settings, json );
  69989. // Got the data - add it to the table
  69990. for ( i=0 ; i<aData.length ; i++ ) {
  69991. _fnAddData( settings, aData[i] );
  69992. }
  69993. // Reset the init display for cookie saving. We've already done
  69994. // a filter, and therefore cleared it before. So we need to make
  69995. // it appear 'fresh'
  69996. settings.iInitDisplayStart = iAjaxStart;
  69997. _fnReDraw( settings );
  69998. _fnProcessingDisplay( settings, false );
  69999. _fnInitComplete( settings, json );
  70000. }, settings );
  70001. }
  70002. else {
  70003. _fnProcessingDisplay( settings, false );
  70004. _fnInitComplete( settings );
  70005. }
  70006. }
  70007. }
  70008. /**
  70009. * Draw the table for the first time, adding all required features
  70010. * @param {object} oSettings dataTables settings object
  70011. * @param {object} [json] JSON from the server that completed the table, if using Ajax source
  70012. * with client-side processing (optional)
  70013. * @memberof DataTable#oApi
  70014. */
  70015. function _fnInitComplete ( settings, json )
  70016. {
  70017. settings._bInitComplete = true;
  70018. // When data was added after the initialisation (data or Ajax) we need to
  70019. // calculate the column sizing
  70020. if ( json || settings.oInit.aaData ) {
  70021. _fnAdjustColumnSizing( settings );
  70022. }
  70023. _fnCallbackFire( settings, null, 'plugin-init', [settings, json] );
  70024. _fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
  70025. }
  70026. function _fnLengthChange ( settings, val )
  70027. {
  70028. var len = parseInt( val, 10 );
  70029. settings._iDisplayLength = len;
  70030. _fnLengthOverflow( settings );
  70031. // Fire length change event
  70032. _fnCallbackFire( settings, null, 'length', [settings, len] );
  70033. }
  70034. /**
  70035. * Generate the node required for user display length changing
  70036. * @param {object} settings dataTables settings object
  70037. * @returns {node} Display length feature node
  70038. * @memberof DataTable#oApi
  70039. */
  70040. function _fnFeatureHtmlLength ( settings )
  70041. {
  70042. var
  70043. classes = settings.oClasses,
  70044. tableId = settings.sTableId,
  70045. menu = settings.aLengthMenu,
  70046. d2 = $.isArray( menu[0] ),
  70047. lengths = d2 ? menu[0] : menu,
  70048. language = d2 ? menu[1] : menu;
  70049. var select = $('<select/>', {
  70050. 'name': tableId+'_length',
  70051. 'aria-controls': tableId,
  70052. 'class': classes.sLengthSelect
  70053. } );
  70054. for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
  70055. select[0][ i ] = new Option(
  70056. typeof language[i] === 'number' ?
  70057. settings.fnFormatNumber( language[i] ) :
  70058. language[i],
  70059. lengths[i]
  70060. );
  70061. }
  70062. var div = $('<div><label/></div>').addClass( classes.sLength );
  70063. if ( ! settings.aanFeatures.l ) {
  70064. div[0].id = tableId+'_length';
  70065. }
  70066. div.children().append(
  70067. settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
  70068. );
  70069. // Can't use `select` variable as user might provide their own and the
  70070. // reference is broken by the use of outerHTML
  70071. $('select', div)
  70072. .val( settings._iDisplayLength )
  70073. .on( 'change.DT', function(e) {
  70074. _fnLengthChange( settings, $(this).val() );
  70075. _fnDraw( settings );
  70076. } );
  70077. // Update node value whenever anything changes the table's length
  70078. $(settings.nTable).on( 'length.dt.DT', function (e, s, len) {
  70079. if ( settings === s ) {
  70080. $('select', div).val( len );
  70081. }
  70082. } );
  70083. return div[0];
  70084. }
  70085. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  70086. * Note that most of the paging logic is done in
  70087. * DataTable.ext.pager
  70088. */
  70089. /**
  70090. * Generate the node required for default pagination
  70091. * @param {object} oSettings dataTables settings object
  70092. * @returns {node} Pagination feature node
  70093. * @memberof DataTable#oApi
  70094. */
  70095. function _fnFeatureHtmlPaginate ( settings )
  70096. {
  70097. var
  70098. type = settings.sPaginationType,
  70099. plugin = DataTable.ext.pager[ type ],
  70100. modern = typeof plugin === 'function',
  70101. redraw = function( settings ) {
  70102. _fnDraw( settings );
  70103. },
  70104. node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
  70105. features = settings.aanFeatures;
  70106. if ( ! modern ) {
  70107. plugin.fnInit( settings, node, redraw );
  70108. }
  70109. /* Add a draw callback for the pagination on first instance, to update the paging display */
  70110. if ( ! features.p )
  70111. {
  70112. node.id = settings.sTableId+'_paginate';
  70113. settings.aoDrawCallback.push( {
  70114. "fn": function( settings ) {
  70115. if ( modern ) {
  70116. var
  70117. start = settings._iDisplayStart,
  70118. len = settings._iDisplayLength,
  70119. visRecords = settings.fnRecordsDisplay(),
  70120. all = len === -1,
  70121. page = all ? 0 : Math.ceil( start / len ),
  70122. pages = all ? 1 : Math.ceil( visRecords / len ),
  70123. buttons = plugin(page, pages),
  70124. i, ien;
  70125. for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
  70126. _fnRenderer( settings, 'pageButton' )(
  70127. settings, features.p[i], i, buttons, page, pages
  70128. );
  70129. }
  70130. }
  70131. else {
  70132. plugin.fnUpdate( settings, redraw );
  70133. }
  70134. },
  70135. "sName": "pagination"
  70136. } );
  70137. }
  70138. return node;
  70139. }
  70140. /**
  70141. * Alter the display settings to change the page
  70142. * @param {object} settings DataTables settings object
  70143. * @param {string|int} action Paging action to take: "first", "previous",
  70144. * "next" or "last" or page number to jump to (integer)
  70145. * @param [bool] redraw Automatically draw the update or not
  70146. * @returns {bool} true page has changed, false - no change
  70147. * @memberof DataTable#oApi
  70148. */
  70149. function _fnPageChange ( settings, action, redraw )
  70150. {
  70151. var
  70152. start = settings._iDisplayStart,
  70153. len = settings._iDisplayLength,
  70154. records = settings.fnRecordsDisplay();
  70155. if ( records === 0 || len === -1 )
  70156. {
  70157. start = 0;
  70158. }
  70159. else if ( typeof action === "number" )
  70160. {
  70161. start = action * len;
  70162. if ( start > records )
  70163. {
  70164. start = 0;
  70165. }
  70166. }
  70167. else if ( action == "first" )
  70168. {
  70169. start = 0;
  70170. }
  70171. else if ( action == "previous" )
  70172. {
  70173. start = len >= 0 ?
  70174. start - len :
  70175. 0;
  70176. if ( start < 0 )
  70177. {
  70178. start = 0;
  70179. }
  70180. }
  70181. else if ( action == "next" )
  70182. {
  70183. if ( start + len < records )
  70184. {
  70185. start += len;
  70186. }
  70187. }
  70188. else if ( action == "last" )
  70189. {
  70190. start = Math.floor( (records-1) / len) * len;
  70191. }
  70192. else
  70193. {
  70194. _fnLog( settings, 0, "Unknown paging action: "+action, 5 );
  70195. }
  70196. var changed = settings._iDisplayStart !== start;
  70197. settings._iDisplayStart = start;
  70198. if ( changed ) {
  70199. _fnCallbackFire( settings, null, 'page', [settings] );
  70200. if ( redraw ) {
  70201. _fnDraw( settings );
  70202. }
  70203. }
  70204. return changed;
  70205. }
  70206. /**
  70207. * Generate the node required for the processing node
  70208. * @param {object} settings dataTables settings object
  70209. * @returns {node} Processing element
  70210. * @memberof DataTable#oApi
  70211. */
  70212. function _fnFeatureHtmlProcessing ( settings )
  70213. {
  70214. return $('<div/>', {
  70215. 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
  70216. 'class': settings.oClasses.sProcessing
  70217. } )
  70218. .html( settings.oLanguage.sProcessing )
  70219. .insertBefore( settings.nTable )[0];
  70220. }
  70221. /**
  70222. * Display or hide the processing indicator
  70223. * @param {object} settings dataTables settings object
  70224. * @param {bool} show Show the processing indicator (true) or not (false)
  70225. * @memberof DataTable#oApi
  70226. */
  70227. function _fnProcessingDisplay ( settings, show )
  70228. {
  70229. if ( settings.oFeatures.bProcessing ) {
  70230. $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
  70231. }
  70232. _fnCallbackFire( settings, null, 'processing', [settings, show] );
  70233. }
  70234. /**
  70235. * Add any control elements for the table - specifically scrolling
  70236. * @param {object} settings dataTables settings object
  70237. * @returns {node} Node to add to the DOM
  70238. * @memberof DataTable#oApi
  70239. */
  70240. function _fnFeatureHtmlTable ( settings )
  70241. {
  70242. var table = $(settings.nTable);
  70243. // Add the ARIA grid role to the table
  70244. table.attr( 'role', 'grid' );
  70245. // Scrolling from here on in
  70246. var scroll = settings.oScroll;
  70247. if ( scroll.sX === '' && scroll.sY === '' ) {
  70248. return settings.nTable;
  70249. }
  70250. var scrollX = scroll.sX;
  70251. var scrollY = scroll.sY;
  70252. var classes = settings.oClasses;
  70253. var caption = table.children('caption');
  70254. var captionSide = caption.length ? caption[0]._captionSide : null;
  70255. var headerClone = $( table[0].cloneNode(false) );
  70256. var footerClone = $( table[0].cloneNode(false) );
  70257. var footer = table.children('tfoot');
  70258. var _div = '<div/>';
  70259. var size = function ( s ) {
  70260. return !s ? null : _fnStringToCss( s );
  70261. };
  70262. if ( ! footer.length ) {
  70263. footer = null;
  70264. }
  70265. /*
  70266. * The HTML structure that we want to generate in this function is:
  70267. * div - scroller
  70268. * div - scroll head
  70269. * div - scroll head inner
  70270. * table - scroll head table
  70271. * thead - thead
  70272. * div - scroll body
  70273. * table - table (master table)
  70274. * thead - thead clone for sizing
  70275. * tbody - tbody
  70276. * div - scroll foot
  70277. * div - scroll foot inner
  70278. * table - scroll foot table
  70279. * tfoot - tfoot
  70280. */
  70281. var scroller = $( _div, { 'class': classes.sScrollWrapper } )
  70282. .append(
  70283. $(_div, { 'class': classes.sScrollHead } )
  70284. .css( {
  70285. overflow: 'hidden',
  70286. position: 'relative',
  70287. border: 0,
  70288. width: scrollX ? size(scrollX) : '100%'
  70289. } )
  70290. .append(
  70291. $(_div, { 'class': classes.sScrollHeadInner } )
  70292. .css( {
  70293. 'box-sizing': 'content-box',
  70294. width: scroll.sXInner || '100%'
  70295. } )
  70296. .append(
  70297. headerClone
  70298. .removeAttr('id')
  70299. .css( 'margin-left', 0 )
  70300. .append( captionSide === 'top' ? caption : null )
  70301. .append(
  70302. table.children('thead')
  70303. )
  70304. )
  70305. )
  70306. )
  70307. .append(
  70308. $(_div, { 'class': classes.sScrollBody } )
  70309. .css( {
  70310. position: 'relative',
  70311. overflow: 'auto',
  70312. width: size( scrollX )
  70313. } )
  70314. .append( table )
  70315. );
  70316. if ( footer ) {
  70317. scroller.append(
  70318. $(_div, { 'class': classes.sScrollFoot } )
  70319. .css( {
  70320. overflow: 'hidden',
  70321. border: 0,
  70322. width: scrollX ? size(scrollX) : '100%'
  70323. } )
  70324. .append(
  70325. $(_div, { 'class': classes.sScrollFootInner } )
  70326. .append(
  70327. footerClone
  70328. .removeAttr('id')
  70329. .css( 'margin-left', 0 )
  70330. .append( captionSide === 'bottom' ? caption : null )
  70331. .append(
  70332. table.children('tfoot')
  70333. )
  70334. )
  70335. )
  70336. );
  70337. }
  70338. var children = scroller.children();
  70339. var scrollHead = children[0];
  70340. var scrollBody = children[1];
  70341. var scrollFoot = footer ? children[2] : null;
  70342. // When the body is scrolled, then we also want to scroll the headers
  70343. if ( scrollX ) {
  70344. $(scrollBody).on( 'scroll.DT', function (e) {
  70345. var scrollLeft = this.scrollLeft;
  70346. scrollHead.scrollLeft = scrollLeft;
  70347. if ( footer ) {
  70348. scrollFoot.scrollLeft = scrollLeft;
  70349. }
  70350. } );
  70351. }
  70352. $(scrollBody).css(
  70353. scrollY && scroll.bCollapse ? 'max-height' : 'height',
  70354. scrollY
  70355. );
  70356. settings.nScrollHead = scrollHead;
  70357. settings.nScrollBody = scrollBody;
  70358. settings.nScrollFoot = scrollFoot;
  70359. // On redraw - align columns
  70360. settings.aoDrawCallback.push( {
  70361. "fn": _fnScrollDraw,
  70362. "sName": "scrolling"
  70363. } );
  70364. return scroller[0];
  70365. }
  70366. /**
  70367. * Update the header, footer and body tables for resizing - i.e. column
  70368. * alignment.
  70369. *
  70370. * Welcome to the most horrible function DataTables. The process that this
  70371. * function follows is basically:
  70372. * 1. Re-create the table inside the scrolling div
  70373. * 2. Take live measurements from the DOM
  70374. * 3. Apply the measurements to align the columns
  70375. * 4. Clean up
  70376. *
  70377. * @param {object} settings dataTables settings object
  70378. * @memberof DataTable#oApi
  70379. */
  70380. function _fnScrollDraw ( settings )
  70381. {
  70382. // Given that this is such a monster function, a lot of variables are use
  70383. // to try and keep the minimised size as small as possible
  70384. var
  70385. scroll = settings.oScroll,
  70386. scrollX = scroll.sX,
  70387. scrollXInner = scroll.sXInner,
  70388. scrollY = scroll.sY,
  70389. barWidth = scroll.iBarWidth,
  70390. divHeader = $(settings.nScrollHead),
  70391. divHeaderStyle = divHeader[0].style,
  70392. divHeaderInner = divHeader.children('div'),
  70393. divHeaderInnerStyle = divHeaderInner[0].style,
  70394. divHeaderTable = divHeaderInner.children('table'),
  70395. divBodyEl = settings.nScrollBody,
  70396. divBody = $(divBodyEl),
  70397. divBodyStyle = divBodyEl.style,
  70398. divFooter = $(settings.nScrollFoot),
  70399. divFooterInner = divFooter.children('div'),
  70400. divFooterTable = divFooterInner.children('table'),
  70401. header = $(settings.nTHead),
  70402. table = $(settings.nTable),
  70403. tableEl = table[0],
  70404. tableStyle = tableEl.style,
  70405. footer = settings.nTFoot ? $(settings.nTFoot) : null,
  70406. browser = settings.oBrowser,
  70407. ie67 = browser.bScrollOversize,
  70408. dtHeaderCells = _pluck( settings.aoColumns, 'nTh' ),
  70409. headerTrgEls, footerTrgEls,
  70410. headerSrcEls, footerSrcEls,
  70411. headerCopy, footerCopy,
  70412. headerWidths=[], footerWidths=[],
  70413. headerContent=[], footerContent=[],
  70414. idx, correction, sanityWidth,
  70415. zeroOut = function(nSizer) {
  70416. var style = nSizer.style;
  70417. style.paddingTop = "0";
  70418. style.paddingBottom = "0";
  70419. style.borderTopWidth = "0";
  70420. style.borderBottomWidth = "0";
  70421. style.height = 0;
  70422. };
  70423. // If the scrollbar visibility has changed from the last draw, we need to
  70424. // adjust the column sizes as the table width will have changed to account
  70425. // for the scrollbar
  70426. var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
  70427. if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
  70428. settings.scrollBarVis = scrollBarVis;
  70429. _fnAdjustColumnSizing( settings );
  70430. return; // adjust column sizing will call this function again
  70431. }
  70432. else {
  70433. settings.scrollBarVis = scrollBarVis;
  70434. }
  70435. /*
  70436. * 1. Re-create the table inside the scrolling div
  70437. */
  70438. // Remove the old minimised thead and tfoot elements in the inner table
  70439. table.children('thead, tfoot').remove();
  70440. if ( footer ) {
  70441. footerCopy = footer.clone().prependTo( table );
  70442. footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
  70443. footerSrcEls = footerCopy.find('tr');
  70444. }
  70445. // Clone the current header and footer elements and then place it into the inner table
  70446. headerCopy = header.clone().prependTo( table );
  70447. headerTrgEls = header.find('tr'); // original header is in its own table
  70448. headerSrcEls = headerCopy.find('tr');
  70449. headerCopy.find('th, td').removeAttr('tabindex');
  70450. /*
  70451. * 2. Take live measurements from the DOM - do not alter the DOM itself!
  70452. */
  70453. // Remove old sizing and apply the calculated column widths
  70454. // Get the unique column headers in the newly created (cloned) header. We want to apply the
  70455. // calculated sizes to this header
  70456. if ( ! scrollX )
  70457. {
  70458. divBodyStyle.width = '100%';
  70459. divHeader[0].style.width = '100%';
  70460. }
  70461. $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
  70462. idx = _fnVisibleToColumnIndex( settings, i );
  70463. el.style.width = settings.aoColumns[idx].sWidth;
  70464. } );
  70465. if ( footer ) {
  70466. _fnApplyToChildren( function(n) {
  70467. n.style.width = "";
  70468. }, footerSrcEls );
  70469. }
  70470. // Size the table as a whole
  70471. sanityWidth = table.outerWidth();
  70472. if ( scrollX === "" ) {
  70473. // No x scrolling
  70474. tableStyle.width = "100%";
  70475. // IE7 will make the width of the table when 100% include the scrollbar
  70476. // - which is shouldn't. When there is a scrollbar we need to take this
  70477. // into account.
  70478. if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
  70479. divBody.css('overflow-y') == "scroll")
  70480. ) {
  70481. tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
  70482. }
  70483. // Recalculate the sanity width
  70484. sanityWidth = table.outerWidth();
  70485. }
  70486. else if ( scrollXInner !== "" ) {
  70487. // legacy x scroll inner has been given - use it
  70488. tableStyle.width = _fnStringToCss(scrollXInner);
  70489. // Recalculate the sanity width
  70490. sanityWidth = table.outerWidth();
  70491. }
  70492. // Hidden header should have zero height, so remove padding and borders. Then
  70493. // set the width based on the real headers
  70494. // Apply all styles in one pass
  70495. _fnApplyToChildren( zeroOut, headerSrcEls );
  70496. // Read all widths in next pass
  70497. _fnApplyToChildren( function(nSizer) {
  70498. headerContent.push( nSizer.innerHTML );
  70499. headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
  70500. }, headerSrcEls );
  70501. // Apply all widths in final pass
  70502. _fnApplyToChildren( function(nToSize, i) {
  70503. // Only apply widths to the DataTables detected header cells - this
  70504. // prevents complex headers from having contradictory sizes applied
  70505. if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {
  70506. nToSize.style.width = headerWidths[i];
  70507. }
  70508. }, headerTrgEls );
  70509. $(headerSrcEls).height(0);
  70510. /* Same again with the footer if we have one */
  70511. if ( footer )
  70512. {
  70513. _fnApplyToChildren( zeroOut, footerSrcEls );
  70514. _fnApplyToChildren( function(nSizer) {
  70515. footerContent.push( nSizer.innerHTML );
  70516. footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
  70517. }, footerSrcEls );
  70518. _fnApplyToChildren( function(nToSize, i) {
  70519. nToSize.style.width = footerWidths[i];
  70520. }, footerTrgEls );
  70521. $(footerSrcEls).height(0);
  70522. }
  70523. /*
  70524. * 3. Apply the measurements
  70525. */
  70526. // "Hide" the header and footer that we used for the sizing. We need to keep
  70527. // the content of the cell so that the width applied to the header and body
  70528. // both match, but we want to hide it completely. We want to also fix their
  70529. // width to what they currently are
  70530. _fnApplyToChildren( function(nSizer, i) {
  70531. nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>';
  70532. nSizer.style.width = headerWidths[i];
  70533. }, headerSrcEls );
  70534. if ( footer )
  70535. {
  70536. _fnApplyToChildren( function(nSizer, i) {
  70537. nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+footerContent[i]+'</div>';
  70538. nSizer.style.width = footerWidths[i];
  70539. }, footerSrcEls );
  70540. }
  70541. // Sanity check that the table is of a sensible width. If not then we are going to get
  70542. // misalignment - try to prevent this by not allowing the table to shrink below its min width
  70543. if ( table.outerWidth() < sanityWidth )
  70544. {
  70545. // The min width depends upon if we have a vertical scrollbar visible or not */
  70546. correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
  70547. divBody.css('overflow-y') == "scroll")) ?
  70548. sanityWidth+barWidth :
  70549. sanityWidth;
  70550. // IE6/7 are a law unto themselves...
  70551. if ( ie67 && (divBodyEl.scrollHeight >
  70552. divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
  70553. ) {
  70554. tableStyle.width = _fnStringToCss( correction-barWidth );
  70555. }
  70556. // And give the user a warning that we've stopped the table getting too small
  70557. if ( scrollX === "" || scrollXInner !== "" ) {
  70558. _fnLog( settings, 1, 'Possible column misalignment', 6 );
  70559. }
  70560. }
  70561. else
  70562. {
  70563. correction = '100%';
  70564. }
  70565. // Apply to the container elements
  70566. divBodyStyle.width = _fnStringToCss( correction );
  70567. divHeaderStyle.width = _fnStringToCss( correction );
  70568. if ( footer ) {
  70569. settings.nScrollFoot.style.width = _fnStringToCss( correction );
  70570. }
  70571. /*
  70572. * 4. Clean up
  70573. */
  70574. if ( ! scrollY ) {
  70575. /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
  70576. * the scrollbar height from the visible display, rather than adding it on. We need to
  70577. * set the height in order to sort this. Don't want to do it in any other browsers.
  70578. */
  70579. if ( ie67 ) {
  70580. divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
  70581. }
  70582. }
  70583. /* Finally set the width's of the header and footer tables */
  70584. var iOuterWidth = table.outerWidth();
  70585. divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
  70586. divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
  70587. // Figure out if there are scrollbar present - if so then we need a the header and footer to
  70588. // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
  70589. var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
  70590. var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
  70591. divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
  70592. if ( footer ) {
  70593. divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
  70594. divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
  70595. divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
  70596. }
  70597. // Correct DOM ordering for colgroup - comes before the thead
  70598. table.children('colgroup').insertBefore( table.children('thead') );
  70599. /* Adjust the position of the header in case we loose the y-scrollbar */
  70600. divBody.scroll();
  70601. // If sorting or filtering has occurred, jump the scrolling back to the top
  70602. // only if we aren't holding the position
  70603. if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
  70604. divBodyEl.scrollTop = 0;
  70605. }
  70606. }
  70607. /**
  70608. * Apply a given function to the display child nodes of an element array (typically
  70609. * TD children of TR rows
  70610. * @param {function} fn Method to apply to the objects
  70611. * @param array {nodes} an1 List of elements to look through for display children
  70612. * @param array {nodes} an2 Another list (identical structure to the first) - optional
  70613. * @memberof DataTable#oApi
  70614. */
  70615. function _fnApplyToChildren( fn, an1, an2 )
  70616. {
  70617. var index=0, i=0, iLen=an1.length;
  70618. var nNode1, nNode2;
  70619. while ( i < iLen ) {
  70620. nNode1 = an1[i].firstChild;
  70621. nNode2 = an2 ? an2[i].firstChild : null;
  70622. while ( nNode1 ) {
  70623. if ( nNode1.nodeType === 1 ) {
  70624. if ( an2 ) {
  70625. fn( nNode1, nNode2, index );
  70626. }
  70627. else {
  70628. fn( nNode1, index );
  70629. }
  70630. index++;
  70631. }
  70632. nNode1 = nNode1.nextSibling;
  70633. nNode2 = an2 ? nNode2.nextSibling : null;
  70634. }
  70635. i++;
  70636. }
  70637. }
  70638. var __re_html_remove = /<.*?>/g;
  70639. /**
  70640. * Calculate the width of columns for the table
  70641. * @param {object} oSettings dataTables settings object
  70642. * @memberof DataTable#oApi
  70643. */
  70644. function _fnCalculateColumnWidths ( oSettings )
  70645. {
  70646. var
  70647. table = oSettings.nTable,
  70648. columns = oSettings.aoColumns,
  70649. scroll = oSettings.oScroll,
  70650. scrollY = scroll.sY,
  70651. scrollX = scroll.sX,
  70652. scrollXInner = scroll.sXInner,
  70653. columnCount = columns.length,
  70654. visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
  70655. headerCells = $('th', oSettings.nTHead),
  70656. tableWidthAttr = table.getAttribute('width'), // from DOM element
  70657. tableContainer = table.parentNode,
  70658. userInputs = false,
  70659. i, column, columnIdx, width, outerWidth,
  70660. browser = oSettings.oBrowser,
  70661. ie67 = browser.bScrollOversize;
  70662. var styleWidth = table.style.width;
  70663. if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
  70664. tableWidthAttr = styleWidth;
  70665. }
  70666. /* Convert any user input sizes into pixel sizes */
  70667. for ( i=0 ; i<visibleColumns.length ; i++ ) {
  70668. column = columns[ visibleColumns[i] ];
  70669. if ( column.sWidth !== null ) {
  70670. column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
  70671. userInputs = true;
  70672. }
  70673. }
  70674. /* If the number of columns in the DOM equals the number that we have to
  70675. * process in DataTables, then we can use the offsets that are created by
  70676. * the web- browser. No custom sizes can be set in order for this to happen,
  70677. * nor scrolling used
  70678. */
  70679. if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
  70680. columnCount == _fnVisbleColumns( oSettings ) &&
  70681. columnCount == headerCells.length
  70682. ) {
  70683. for ( i=0 ; i<columnCount ; i++ ) {
  70684. var colIdx = _fnVisibleToColumnIndex( oSettings, i );
  70685. if ( colIdx !== null ) {
  70686. columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
  70687. }
  70688. }
  70689. }
  70690. else
  70691. {
  70692. // Otherwise construct a single row, worst case, table with the widest
  70693. // node in the data, assign any user defined widths, then insert it into
  70694. // the DOM and allow the browser to do all the hard work of calculating
  70695. // table widths
  70696. var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
  70697. .css( 'visibility', 'hidden' )
  70698. .removeAttr( 'id' );
  70699. // Clean up the table body
  70700. tmpTable.find('tbody tr').remove();
  70701. var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
  70702. // Clone the table header and footer - we can't use the header / footer
  70703. // from the cloned table, since if scrolling is active, the table's
  70704. // real header and footer are contained in different table tags
  70705. tmpTable.find('thead, tfoot').remove();
  70706. tmpTable
  70707. .append( $(oSettings.nTHead).clone() )
  70708. .append( $(oSettings.nTFoot).clone() );
  70709. // Remove any assigned widths from the footer (from scrolling)
  70710. tmpTable.find('tfoot th, tfoot td').css('width', '');
  70711. // Apply custom sizing to the cloned header
  70712. headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
  70713. for ( i=0 ; i<visibleColumns.length ; i++ ) {
  70714. column = columns[ visibleColumns[i] ];
  70715. headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
  70716. _fnStringToCss( column.sWidthOrig ) :
  70717. '';
  70718. // For scrollX we need to force the column width otherwise the
  70719. // browser will collapse it. If this width is smaller than the
  70720. // width the column requires, then it will have no effect
  70721. if ( column.sWidthOrig && scrollX ) {
  70722. $( headerCells[i] ).append( $('<div/>').css( {
  70723. width: column.sWidthOrig,
  70724. margin: 0,
  70725. padding: 0,
  70726. border: 0,
  70727. height: 1
  70728. } ) );
  70729. }
  70730. }
  70731. // Find the widest cell for each column and put it into the table
  70732. if ( oSettings.aoData.length ) {
  70733. for ( i=0 ; i<visibleColumns.length ; i++ ) {
  70734. columnIdx = visibleColumns[i];
  70735. column = columns[ columnIdx ];
  70736. $( _fnGetWidestNode( oSettings, columnIdx ) )
  70737. .clone( false )
  70738. .append( column.sContentPadding )
  70739. .appendTo( tr );
  70740. }
  70741. }
  70742. // Tidy the temporary table - remove name attributes so there aren't
  70743. // duplicated in the dom (radio elements for example)
  70744. $('[name]', tmpTable).removeAttr('name');
  70745. // Table has been built, attach to the document so we can work with it.
  70746. // A holding element is used, positioned at the top of the container
  70747. // with minimal height, so it has no effect on if the container scrolls
  70748. // or not. Otherwise it might trigger scrolling when it actually isn't
  70749. // needed
  70750. var holder = $('<div/>').css( scrollX || scrollY ?
  70751. {
  70752. position: 'absolute',
  70753. top: 0,
  70754. left: 0,
  70755. height: 1,
  70756. right: 0,
  70757. overflow: 'hidden'
  70758. } :
  70759. {}
  70760. )
  70761. .append( tmpTable )
  70762. .appendTo( tableContainer );
  70763. // When scrolling (X or Y) we want to set the width of the table as
  70764. // appropriate. However, when not scrolling leave the table width as it
  70765. // is. This results in slightly different, but I think correct behaviour
  70766. if ( scrollX && scrollXInner ) {
  70767. tmpTable.width( scrollXInner );
  70768. }
  70769. else if ( scrollX ) {
  70770. tmpTable.css( 'width', 'auto' );
  70771. tmpTable.removeAttr('width');
  70772. // If there is no width attribute or style, then allow the table to
  70773. // collapse
  70774. if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
  70775. tmpTable.width( tableContainer.clientWidth );
  70776. }
  70777. }
  70778. else if ( scrollY ) {
  70779. tmpTable.width( tableContainer.clientWidth );
  70780. }
  70781. else if ( tableWidthAttr ) {
  70782. tmpTable.width( tableWidthAttr );
  70783. }
  70784. // Get the width of each column in the constructed table - we need to
  70785. // know the inner width (so it can be assigned to the other table's
  70786. // cells) and the outer width so we can calculate the full width of the
  70787. // table. This is safe since DataTables requires a unique cell for each
  70788. // column, but if ever a header can span multiple columns, this will
  70789. // need to be modified.
  70790. var total = 0;
  70791. for ( i=0 ; i<visibleColumns.length ; i++ ) {
  70792. var cell = $(headerCells[i]);
  70793. var border = cell.outerWidth() - cell.width();
  70794. // Use getBounding... where possible (not IE8-) because it can give
  70795. // sub-pixel accuracy, which we then want to round up!
  70796. var bounding = browser.bBounding ?
  70797. Math.ceil( headerCells[i].getBoundingClientRect().width ) :
  70798. cell.outerWidth();
  70799. // Total is tracked to remove any sub-pixel errors as the outerWidth
  70800. // of the table might not equal the total given here (IE!).
  70801. total += bounding;
  70802. // Width for each column to use
  70803. columns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );
  70804. }
  70805. table.style.width = _fnStringToCss( total );
  70806. // Finished with the table - ditch it
  70807. holder.remove();
  70808. }
  70809. // If there is a width attr, we want to attach an event listener which
  70810. // allows the table sizing to automatically adjust when the window is
  70811. // resized. Use the width attr rather than CSS, since we can't know if the
  70812. // CSS is a relative value or absolute - DOM read is always px.
  70813. if ( tableWidthAttr ) {
  70814. table.style.width = _fnStringToCss( tableWidthAttr );
  70815. }
  70816. if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
  70817. var bindResize = function () {
  70818. $(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
  70819. _fnAdjustColumnSizing( oSettings );
  70820. } ) );
  70821. };
  70822. // IE6/7 will crash if we bind a resize event handler on page load.
  70823. // To be removed in 1.11 which drops IE6/7 support
  70824. if ( ie67 ) {
  70825. setTimeout( bindResize, 1000 );
  70826. }
  70827. else {
  70828. bindResize();
  70829. }
  70830. oSettings._reszEvt = true;
  70831. }
  70832. }
  70833. /**
  70834. * Throttle the calls to a function. Arguments and context are maintained for
  70835. * the throttled function
  70836. * @param {function} fn Function to be called
  70837. * @param {int} [freq=200] call frequency in mS
  70838. * @returns {function} wrapped function
  70839. * @memberof DataTable#oApi
  70840. */
  70841. var _fnThrottle = DataTable.util.throttle;
  70842. /**
  70843. * Convert a CSS unit width to pixels (e.g. 2em)
  70844. * @param {string} width width to be converted
  70845. * @param {node} parent parent to get the with for (required for relative widths) - optional
  70846. * @returns {int} width in pixels
  70847. * @memberof DataTable#oApi
  70848. */
  70849. function _fnConvertToWidth ( width, parent )
  70850. {
  70851. if ( ! width ) {
  70852. return 0;
  70853. }
  70854. var n = $('<div/>')
  70855. .css( 'width', _fnStringToCss( width ) )
  70856. .appendTo( parent || document.body );
  70857. var val = n[0].offsetWidth;
  70858. n.remove();
  70859. return val;
  70860. }
  70861. /**
  70862. * Get the widest node
  70863. * @param {object} settings dataTables settings object
  70864. * @param {int} colIdx column of interest
  70865. * @returns {node} widest table node
  70866. * @memberof DataTable#oApi
  70867. */
  70868. function _fnGetWidestNode( settings, colIdx )
  70869. {
  70870. var idx = _fnGetMaxLenString( settings, colIdx );
  70871. if ( idx < 0 ) {
  70872. return null;
  70873. }
  70874. var data = settings.aoData[ idx ];
  70875. return ! data.nTr ? // Might not have been created when deferred rendering
  70876. $('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
  70877. data.anCells[ colIdx ];
  70878. }
  70879. /**
  70880. * Get the maximum strlen for each data column
  70881. * @param {object} settings dataTables settings object
  70882. * @param {int} colIdx column of interest
  70883. * @returns {string} max string length for each column
  70884. * @memberof DataTable#oApi
  70885. */
  70886. function _fnGetMaxLenString( settings, colIdx )
  70887. {
  70888. var s, max=-1, maxIdx = -1;
  70889. for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
  70890. s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
  70891. s = s.replace( __re_html_remove, '' );
  70892. s = s.replace( /&nbsp;/g, ' ' );
  70893. if ( s.length > max ) {
  70894. max = s.length;
  70895. maxIdx = i;
  70896. }
  70897. }
  70898. return maxIdx;
  70899. }
  70900. /**
  70901. * Append a CSS unit (only if required) to a string
  70902. * @param {string} value to css-ify
  70903. * @returns {string} value with css unit
  70904. * @memberof DataTable#oApi
  70905. */
  70906. function _fnStringToCss( s )
  70907. {
  70908. if ( s === null ) {
  70909. return '0px';
  70910. }
  70911. if ( typeof s == 'number' ) {
  70912. return s < 0 ?
  70913. '0px' :
  70914. s+'px';
  70915. }
  70916. // Check it has a unit character already
  70917. return s.match(/\d$/) ?
  70918. s+'px' :
  70919. s;
  70920. }
  70921. function _fnSortFlatten ( settings )
  70922. {
  70923. var
  70924. i, iLen, k, kLen,
  70925. aSort = [],
  70926. aiOrig = [],
  70927. aoColumns = settings.aoColumns,
  70928. aDataSort, iCol, sType, srcCol,
  70929. fixed = settings.aaSortingFixed,
  70930. fixedObj = $.isPlainObject( fixed ),
  70931. nestedSort = [],
  70932. add = function ( a ) {
  70933. if ( a.length && ! $.isArray( a[0] ) ) {
  70934. // 1D array
  70935. nestedSort.push( a );
  70936. }
  70937. else {
  70938. // 2D array
  70939. $.merge( nestedSort, a );
  70940. }
  70941. };
  70942. // Build the sort array, with pre-fix and post-fix options if they have been
  70943. // specified
  70944. if ( $.isArray( fixed ) ) {
  70945. add( fixed );
  70946. }
  70947. if ( fixedObj && fixed.pre ) {
  70948. add( fixed.pre );
  70949. }
  70950. add( settings.aaSorting );
  70951. if (fixedObj && fixed.post ) {
  70952. add( fixed.post );
  70953. }
  70954. for ( i=0 ; i<nestedSort.length ; i++ )
  70955. {
  70956. srcCol = nestedSort[i][0];
  70957. aDataSort = aoColumns[ srcCol ].aDataSort;
  70958. for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
  70959. {
  70960. iCol = aDataSort[k];
  70961. sType = aoColumns[ iCol ].sType || 'string';
  70962. if ( nestedSort[i]._idx === undefined ) {
  70963. nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
  70964. }
  70965. aSort.push( {
  70966. src: srcCol,
  70967. col: iCol,
  70968. dir: nestedSort[i][1],
  70969. index: nestedSort[i]._idx,
  70970. type: sType,
  70971. formatter: DataTable.ext.type.order[ sType+"-pre" ]
  70972. } );
  70973. }
  70974. }
  70975. return aSort;
  70976. }
  70977. /**
  70978. * Change the order of the table
  70979. * @param {object} oSettings dataTables settings object
  70980. * @memberof DataTable#oApi
  70981. * @todo This really needs split up!
  70982. */
  70983. function _fnSort ( oSettings )
  70984. {
  70985. var
  70986. i, ien, iLen, j, jLen, k, kLen,
  70987. sDataType, nTh,
  70988. aiOrig = [],
  70989. oExtSort = DataTable.ext.type.order,
  70990. aoData = oSettings.aoData,
  70991. aoColumns = oSettings.aoColumns,
  70992. aDataSort, data, iCol, sType, oSort,
  70993. formatters = 0,
  70994. sortCol,
  70995. displayMaster = oSettings.aiDisplayMaster,
  70996. aSort;
  70997. // Resolve any column types that are unknown due to addition or invalidation
  70998. // @todo Can this be moved into a 'data-ready' handler which is called when
  70999. // data is going to be used in the table?
  71000. _fnColumnTypes( oSettings );
  71001. aSort = _fnSortFlatten( oSettings );
  71002. for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
  71003. sortCol = aSort[i];
  71004. // Track if we can use the fast sort algorithm
  71005. if ( sortCol.formatter ) {
  71006. formatters++;
  71007. }
  71008. // Load the data needed for the sort, for each cell
  71009. _fnSortData( oSettings, sortCol.col );
  71010. }
  71011. /* No sorting required if server-side or no sorting array */
  71012. if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
  71013. {
  71014. // Create a value - key array of the current row positions such that we can use their
  71015. // current position during the sort, if values match, in order to perform stable sorting
  71016. for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
  71017. aiOrig[ displayMaster[i] ] = i;
  71018. }
  71019. /* Do the sort - here we want multi-column sorting based on a given data source (column)
  71020. * and sorting function (from oSort) in a certain direction. It's reasonably complex to
  71021. * follow on it's own, but this is what we want (example two column sorting):
  71022. * fnLocalSorting = function(a,b){
  71023. * var iTest;
  71024. * iTest = oSort['string-asc']('data11', 'data12');
  71025. * if (iTest !== 0)
  71026. * return iTest;
  71027. * iTest = oSort['numeric-desc']('data21', 'data22');
  71028. * if (iTest !== 0)
  71029. * return iTest;
  71030. * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
  71031. * }
  71032. * Basically we have a test for each sorting column, if the data in that column is equal,
  71033. * test the next column. If all columns match, then we use a numeric sort on the row
  71034. * positions in the original data array to provide a stable sort.
  71035. *
  71036. * Note - I know it seems excessive to have two sorting methods, but the first is around
  71037. * 15% faster, so the second is only maintained for backwards compatibility with sorting
  71038. * methods which do not have a pre-sort formatting function.
  71039. */
  71040. if ( formatters === aSort.length ) {
  71041. // All sort types have formatting functions
  71042. displayMaster.sort( function ( a, b ) {
  71043. var
  71044. x, y, k, test, sort,
  71045. len=aSort.length,
  71046. dataA = aoData[a]._aSortData,
  71047. dataB = aoData[b]._aSortData;
  71048. for ( k=0 ; k<len ; k++ ) {
  71049. sort = aSort[k];
  71050. x = dataA[ sort.col ];
  71051. y = dataB[ sort.col ];
  71052. test = x<y ? -1 : x>y ? 1 : 0;
  71053. if ( test !== 0 ) {
  71054. return sort.dir === 'asc' ? test : -test;
  71055. }
  71056. }
  71057. x = aiOrig[a];
  71058. y = aiOrig[b];
  71059. return x<y ? -1 : x>y ? 1 : 0;
  71060. } );
  71061. }
  71062. else {
  71063. // Depreciated - remove in 1.11 (providing a plug-in option)
  71064. // Not all sort types have formatting methods, so we have to call their sorting
  71065. // methods.
  71066. displayMaster.sort( function ( a, b ) {
  71067. var
  71068. x, y, k, l, test, sort, fn,
  71069. len=aSort.length,
  71070. dataA = aoData[a]._aSortData,
  71071. dataB = aoData[b]._aSortData;
  71072. for ( k=0 ; k<len ; k++ ) {
  71073. sort = aSort[k];
  71074. x = dataA[ sort.col ];
  71075. y = dataB[ sort.col ];
  71076. fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
  71077. test = fn( x, y );
  71078. if ( test !== 0 ) {
  71079. return test;
  71080. }
  71081. }
  71082. x = aiOrig[a];
  71083. y = aiOrig[b];
  71084. return x<y ? -1 : x>y ? 1 : 0;
  71085. } );
  71086. }
  71087. }
  71088. /* Tell the draw function that we have sorted the data */
  71089. oSettings.bSorted = true;
  71090. }
  71091. function _fnSortAria ( settings )
  71092. {
  71093. var label;
  71094. var nextSort;
  71095. var columns = settings.aoColumns;
  71096. var aSort = _fnSortFlatten( settings );
  71097. var oAria = settings.oLanguage.oAria;
  71098. // ARIA attributes - need to loop all columns, to update all (removing old
  71099. // attributes as needed)
  71100. for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
  71101. {
  71102. var col = columns[i];
  71103. var asSorting = col.asSorting;
  71104. var sTitle = col.sTitle.replace( /<.*?>/g, "" );
  71105. var th = col.nTh;
  71106. // IE7 is throwing an error when setting these properties with jQuery's
  71107. // attr() and removeAttr() methods...
  71108. th.removeAttribute('aria-sort');
  71109. /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
  71110. if ( col.bSortable ) {
  71111. if ( aSort.length > 0 && aSort[0].col == i ) {
  71112. th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
  71113. nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
  71114. }
  71115. else {
  71116. nextSort = asSorting[0];
  71117. }
  71118. label = sTitle + ( nextSort === "asc" ?
  71119. oAria.sSortAscending :
  71120. oAria.sSortDescending
  71121. );
  71122. }
  71123. else {
  71124. label = sTitle;
  71125. }
  71126. th.setAttribute('aria-label', label);
  71127. }
  71128. }
  71129. /**
  71130. * Function to run on user sort request
  71131. * @param {object} settings dataTables settings object
  71132. * @param {node} attachTo node to attach the handler to
  71133. * @param {int} colIdx column sorting index
  71134. * @param {boolean} [append=false] Append the requested sort to the existing
  71135. * sort if true (i.e. multi-column sort)
  71136. * @param {function} [callback] callback function
  71137. * @memberof DataTable#oApi
  71138. */
  71139. function _fnSortListener ( settings, colIdx, append, callback )
  71140. {
  71141. var col = settings.aoColumns[ colIdx ];
  71142. var sorting = settings.aaSorting;
  71143. var asSorting = col.asSorting;
  71144. var nextSortIdx;
  71145. var next = function ( a, overflow ) {
  71146. var idx = a._idx;
  71147. if ( idx === undefined ) {
  71148. idx = $.inArray( a[1], asSorting );
  71149. }
  71150. return idx+1 < asSorting.length ?
  71151. idx+1 :
  71152. overflow ?
  71153. null :
  71154. 0;
  71155. };
  71156. // Convert to 2D array if needed
  71157. if ( typeof sorting[0] === 'number' ) {
  71158. sorting = settings.aaSorting = [ sorting ];
  71159. }
  71160. // If appending the sort then we are multi-column sorting
  71161. if ( append && settings.oFeatures.bSortMulti ) {
  71162. // Are we already doing some kind of sort on this column?
  71163. var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
  71164. if ( sortIdx !== -1 ) {
  71165. // Yes, modify the sort
  71166. nextSortIdx = next( sorting[sortIdx], true );
  71167. if ( nextSortIdx === null && sorting.length === 1 ) {
  71168. nextSortIdx = 0; // can't remove sorting completely
  71169. }
  71170. if ( nextSortIdx === null ) {
  71171. sorting.splice( sortIdx, 1 );
  71172. }
  71173. else {
  71174. sorting[sortIdx][1] = asSorting[ nextSortIdx ];
  71175. sorting[sortIdx]._idx = nextSortIdx;
  71176. }
  71177. }
  71178. else {
  71179. // No sort on this column yet
  71180. sorting.push( [ colIdx, asSorting[0], 0 ] );
  71181. sorting[sorting.length-1]._idx = 0;
  71182. }
  71183. }
  71184. else if ( sorting.length && sorting[0][0] == colIdx ) {
  71185. // Single column - already sorting on this column, modify the sort
  71186. nextSortIdx = next( sorting[0] );
  71187. sorting.length = 1;
  71188. sorting[0][1] = asSorting[ nextSortIdx ];
  71189. sorting[0]._idx = nextSortIdx;
  71190. }
  71191. else {
  71192. // Single column - sort only on this column
  71193. sorting.length = 0;
  71194. sorting.push( [ colIdx, asSorting[0] ] );
  71195. sorting[0]._idx = 0;
  71196. }
  71197. // Run the sort by calling a full redraw
  71198. _fnReDraw( settings );
  71199. // callback used for async user interaction
  71200. if ( typeof callback == 'function' ) {
  71201. callback( settings );
  71202. }
  71203. }
  71204. /**
  71205. * Attach a sort handler (click) to a node
  71206. * @param {object} settings dataTables settings object
  71207. * @param {node} attachTo node to attach the handler to
  71208. * @param {int} colIdx column sorting index
  71209. * @param {function} [callback] callback function
  71210. * @memberof DataTable#oApi
  71211. */
  71212. function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
  71213. {
  71214. var col = settings.aoColumns[ colIdx ];
  71215. _fnBindAction( attachTo, {}, function (e) {
  71216. /* If the column is not sortable - don't to anything */
  71217. if ( col.bSortable === false ) {
  71218. return;
  71219. }
  71220. // If processing is enabled use a timeout to allow the processing
  71221. // display to be shown - otherwise to it synchronously
  71222. if ( settings.oFeatures.bProcessing ) {
  71223. _fnProcessingDisplay( settings, true );
  71224. setTimeout( function() {
  71225. _fnSortListener( settings, colIdx, e.shiftKey, callback );
  71226. // In server-side processing, the draw callback will remove the
  71227. // processing display
  71228. if ( _fnDataSource( settings ) !== 'ssp' ) {
  71229. _fnProcessingDisplay( settings, false );
  71230. }
  71231. }, 0 );
  71232. }
  71233. else {
  71234. _fnSortListener( settings, colIdx, e.shiftKey, callback );
  71235. }
  71236. } );
  71237. }
  71238. /**
  71239. * Set the sorting classes on table's body, Note: it is safe to call this function
  71240. * when bSort and bSortClasses are false
  71241. * @param {object} oSettings dataTables settings object
  71242. * @memberof DataTable#oApi
  71243. */
  71244. function _fnSortingClasses( settings )
  71245. {
  71246. var oldSort = settings.aLastSort;
  71247. var sortClass = settings.oClasses.sSortColumn;
  71248. var sort = _fnSortFlatten( settings );
  71249. var features = settings.oFeatures;
  71250. var i, ien, colIdx;
  71251. if ( features.bSort && features.bSortClasses ) {
  71252. // Remove old sorting classes
  71253. for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
  71254. colIdx = oldSort[i].src;
  71255. // Remove column sorting
  71256. $( _pluck( settings.aoData, 'anCells', colIdx ) )
  71257. .removeClass( sortClass + (i<2 ? i+1 : 3) );
  71258. }
  71259. // Add new column sorting
  71260. for ( i=0, ien=sort.length ; i<ien ; i++ ) {
  71261. colIdx = sort[i].src;
  71262. $( _pluck( settings.aoData, 'anCells', colIdx ) )
  71263. .addClass( sortClass + (i<2 ? i+1 : 3) );
  71264. }
  71265. }
  71266. settings.aLastSort = sort;
  71267. }
  71268. // Get the data to sort a column, be it from cache, fresh (populating the
  71269. // cache), or from a sort formatter
  71270. function _fnSortData( settings, idx )
  71271. {
  71272. // Custom sorting function - provided by the sort data type
  71273. var column = settings.aoColumns[ idx ];
  71274. var customSort = DataTable.ext.order[ column.sSortDataType ];
  71275. var customData;
  71276. if ( customSort ) {
  71277. customData = customSort.call( settings.oInstance, settings, idx,
  71278. _fnColumnIndexToVisible( settings, idx )
  71279. );
  71280. }
  71281. // Use / populate cache
  71282. var row, cellData;
  71283. var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
  71284. for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
  71285. row = settings.aoData[i];
  71286. if ( ! row._aSortData ) {
  71287. row._aSortData = [];
  71288. }
  71289. if ( ! row._aSortData[idx] || customSort ) {
  71290. cellData = customSort ?
  71291. customData[i] : // If there was a custom sort function, use data from there
  71292. _fnGetCellData( settings, i, idx, 'sort' );
  71293. row._aSortData[ idx ] = formatter ?
  71294. formatter( cellData ) :
  71295. cellData;
  71296. }
  71297. }
  71298. }
  71299. /**
  71300. * Save the state of a table
  71301. * @param {object} oSettings dataTables settings object
  71302. * @memberof DataTable#oApi
  71303. */
  71304. function _fnSaveState ( settings )
  71305. {
  71306. if ( !settings.oFeatures.bStateSave || settings.bDestroying )
  71307. {
  71308. return;
  71309. }
  71310. /* Store the interesting variables */
  71311. var state = {
  71312. time: +new Date(),
  71313. start: settings._iDisplayStart,
  71314. length: settings._iDisplayLength,
  71315. order: $.extend( true, [], settings.aaSorting ),
  71316. search: _fnSearchToCamel( settings.oPreviousSearch ),
  71317. columns: $.map( settings.aoColumns, function ( col, i ) {
  71318. return {
  71319. visible: col.bVisible,
  71320. search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
  71321. };
  71322. } )
  71323. };
  71324. _fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
  71325. settings.oSavedState = state;
  71326. settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
  71327. }
  71328. /**
  71329. * Attempt to load a saved table state
  71330. * @param {object} oSettings dataTables settings object
  71331. * @param {object} oInit DataTables init object so we can override settings
  71332. * @param {function} callback Callback to execute when the state has been loaded
  71333. * @memberof DataTable#oApi
  71334. */
  71335. function _fnLoadState ( settings, oInit, callback )
  71336. {
  71337. var i, ien;
  71338. var columns = settings.aoColumns;
  71339. var loaded = function ( s ) {
  71340. if ( ! s || ! s.time ) {
  71341. callback();
  71342. return;
  71343. }
  71344. // Allow custom and plug-in manipulation functions to alter the saved data set and
  71345. // cancelling of loading by returning false
  71346. var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );
  71347. if ( $.inArray( false, abStateLoad ) !== -1 ) {
  71348. callback();
  71349. return;
  71350. }
  71351. // Reject old data
  71352. var duration = settings.iStateDuration;
  71353. if ( duration > 0 && s.time < +new Date() - (duration*1000) ) {
  71354. callback();
  71355. return;
  71356. }
  71357. // Number of columns have changed - all bets are off, no restore of settings
  71358. if ( s.columns && columns.length !== s.columns.length ) {
  71359. callback();
  71360. return;
  71361. }
  71362. // Store the saved state so it might be accessed at any time
  71363. settings.oLoadedState = $.extend( true, {}, s );
  71364. // Restore key features - todo - for 1.11 this needs to be done by
  71365. // subscribed events
  71366. if ( s.start !== undefined ) {
  71367. settings._iDisplayStart = s.start;
  71368. settings.iInitDisplayStart = s.start;
  71369. }
  71370. if ( s.length !== undefined ) {
  71371. settings._iDisplayLength = s.length;
  71372. }
  71373. // Order
  71374. if ( s.order !== undefined ) {
  71375. settings.aaSorting = [];
  71376. $.each( s.order, function ( i, col ) {
  71377. settings.aaSorting.push( col[0] >= columns.length ?
  71378. [ 0, col[1] ] :
  71379. col
  71380. );
  71381. } );
  71382. }
  71383. // Search
  71384. if ( s.search !== undefined ) {
  71385. $.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );
  71386. }
  71387. // Columns
  71388. //
  71389. if ( s.columns ) {
  71390. for ( i=0, ien=s.columns.length ; i<ien ; i++ ) {
  71391. var col = s.columns[i];
  71392. // Visibility
  71393. if ( col.visible !== undefined ) {
  71394. columns[i].bVisible = col.visible;
  71395. }
  71396. // Search
  71397. if ( col.search !== undefined ) {
  71398. $.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
  71399. }
  71400. }
  71401. }
  71402. _fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );
  71403. callback();
  71404. }
  71405. if ( ! settings.oFeatures.bStateSave ) {
  71406. callback();
  71407. return;
  71408. }
  71409. var state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );
  71410. if ( state !== undefined ) {
  71411. loaded( state );
  71412. }
  71413. // otherwise, wait for the loaded callback to be executed
  71414. }
  71415. /**
  71416. * Return the settings object for a particular table
  71417. * @param {node} table table we are using as a dataTable
  71418. * @returns {object} Settings object - or null if not found
  71419. * @memberof DataTable#oApi
  71420. */
  71421. function _fnSettingsFromNode ( table )
  71422. {
  71423. var settings = DataTable.settings;
  71424. var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
  71425. return idx !== -1 ?
  71426. settings[ idx ] :
  71427. null;
  71428. }
  71429. /**
  71430. * Log an error message
  71431. * @param {object} settings dataTables settings object
  71432. * @param {int} level log error messages, or display them to the user
  71433. * @param {string} msg error message
  71434. * @param {int} tn Technical note id to get more information about the error.
  71435. * @memberof DataTable#oApi
  71436. */
  71437. function _fnLog( settings, level, msg, tn )
  71438. {
  71439. msg = 'DataTables warning: '+
  71440. (settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
  71441. if ( tn ) {
  71442. msg += '. For more information about this error, please see '+
  71443. 'http://datatables.net/tn/'+tn;
  71444. }
  71445. if ( ! level ) {
  71446. // Backwards compatibility pre 1.10
  71447. var ext = DataTable.ext;
  71448. var type = ext.sErrMode || ext.errMode;
  71449. if ( settings ) {
  71450. _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
  71451. }
  71452. if ( type == 'alert' ) {
  71453. alert( msg );
  71454. }
  71455. else if ( type == 'throw' ) {
  71456. throw new Error(msg);
  71457. }
  71458. else if ( typeof type == 'function' ) {
  71459. type( settings, tn, msg );
  71460. }
  71461. }
  71462. else if ( window.console && console.log ) {
  71463. console.log( msg );
  71464. }
  71465. }
  71466. /**
  71467. * See if a property is defined on one object, if so assign it to the other object
  71468. * @param {object} ret target object
  71469. * @param {object} src source object
  71470. * @param {string} name property
  71471. * @param {string} [mappedName] name to map too - optional, name used if not given
  71472. * @memberof DataTable#oApi
  71473. */
  71474. function _fnMap( ret, src, name, mappedName )
  71475. {
  71476. if ( $.isArray( name ) ) {
  71477. $.each( name, function (i, val) {
  71478. if ( $.isArray( val ) ) {
  71479. _fnMap( ret, src, val[0], val[1] );
  71480. }
  71481. else {
  71482. _fnMap( ret, src, val );
  71483. }
  71484. } );
  71485. return;
  71486. }
  71487. if ( mappedName === undefined ) {
  71488. mappedName = name;
  71489. }
  71490. if ( src[name] !== undefined ) {
  71491. ret[mappedName] = src[name];
  71492. }
  71493. }
  71494. /**
  71495. * Extend objects - very similar to jQuery.extend, but deep copy objects, and
  71496. * shallow copy arrays. The reason we need to do this, is that we don't want to
  71497. * deep copy array init values (such as aaSorting) since the dev wouldn't be
  71498. * able to override them, but we do want to deep copy arrays.
  71499. * @param {object} out Object to extend
  71500. * @param {object} extender Object from which the properties will be applied to
  71501. * out
  71502. * @param {boolean} breakRefs If true, then arrays will be sliced to take an
  71503. * independent copy with the exception of the `data` or `aaData` parameters
  71504. * if they are present. This is so you can pass in a collection to
  71505. * DataTables and have that used as your data source without breaking the
  71506. * references
  71507. * @returns {object} out Reference, just for convenience - out === the return.
  71508. * @memberof DataTable#oApi
  71509. * @todo This doesn't take account of arrays inside the deep copied objects.
  71510. */
  71511. function _fnExtend( out, extender, breakRefs )
  71512. {
  71513. var val;
  71514. for ( var prop in extender ) {
  71515. if ( extender.hasOwnProperty(prop) ) {
  71516. val = extender[prop];
  71517. if ( $.isPlainObject( val ) ) {
  71518. if ( ! $.isPlainObject( out[prop] ) ) {
  71519. out[prop] = {};
  71520. }
  71521. $.extend( true, out[prop], val );
  71522. }
  71523. else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
  71524. out[prop] = val.slice();
  71525. }
  71526. else {
  71527. out[prop] = val;
  71528. }
  71529. }
  71530. }
  71531. return out;
  71532. }
  71533. /**
  71534. * Bind an event handers to allow a click or return key to activate the callback.
  71535. * This is good for accessibility since a return on the keyboard will have the
  71536. * same effect as a click, if the element has focus.
  71537. * @param {element} n Element to bind the action to
  71538. * @param {object} oData Data object to pass to the triggered function
  71539. * @param {function} fn Callback function for when the event is triggered
  71540. * @memberof DataTable#oApi
  71541. */
  71542. function _fnBindAction( n, oData, fn )
  71543. {
  71544. $(n)
  71545. .on( 'click.DT', oData, function (e) {
  71546. n.blur(); // Remove focus outline for mouse users
  71547. fn(e);
  71548. } )
  71549. .on( 'keypress.DT', oData, function (e){
  71550. if ( e.which === 13 ) {
  71551. e.preventDefault();
  71552. fn(e);
  71553. }
  71554. } )
  71555. .on( 'selectstart.DT', function () {
  71556. /* Take the brutal approach to cancelling text selection */
  71557. return false;
  71558. } );
  71559. }
  71560. /**
  71561. * Register a callback function. Easily allows a callback function to be added to
  71562. * an array store of callback functions that can then all be called together.
  71563. * @param {object} oSettings dataTables settings object
  71564. * @param {string} sStore Name of the array storage for the callbacks in oSettings
  71565. * @param {function} fn Function to be called back
  71566. * @param {string} sName Identifying name for the callback (i.e. a label)
  71567. * @memberof DataTable#oApi
  71568. */
  71569. function _fnCallbackReg( oSettings, sStore, fn, sName )
  71570. {
  71571. if ( fn )
  71572. {
  71573. oSettings[sStore].push( {
  71574. "fn": fn,
  71575. "sName": sName
  71576. } );
  71577. }
  71578. }
  71579. /**
  71580. * Fire callback functions and trigger events. Note that the loop over the
  71581. * callback array store is done backwards! Further note that you do not want to
  71582. * fire off triggers in time sensitive applications (for example cell creation)
  71583. * as its slow.
  71584. * @param {object} settings dataTables settings object
  71585. * @param {string} callbackArr Name of the array storage for the callbacks in
  71586. * oSettings
  71587. * @param {string} eventName Name of the jQuery custom event to trigger. If
  71588. * null no trigger is fired
  71589. * @param {array} args Array of arguments to pass to the callback function /
  71590. * trigger
  71591. * @memberof DataTable#oApi
  71592. */
  71593. function _fnCallbackFire( settings, callbackArr, eventName, args )
  71594. {
  71595. var ret = [];
  71596. if ( callbackArr ) {
  71597. ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
  71598. return val.fn.apply( settings.oInstance, args );
  71599. } );
  71600. }
  71601. if ( eventName !== null ) {
  71602. var e = $.Event( eventName+'.dt' );
  71603. $(settings.nTable).trigger( e, args );
  71604. ret.push( e.result );
  71605. }
  71606. return ret;
  71607. }
  71608. function _fnLengthOverflow ( settings )
  71609. {
  71610. var
  71611. start = settings._iDisplayStart,
  71612. end = settings.fnDisplayEnd(),
  71613. len = settings._iDisplayLength;
  71614. /* If we have space to show extra rows (backing up from the end point - then do so */
  71615. if ( start >= end )
  71616. {
  71617. start = end - len;
  71618. }
  71619. // Keep the start record on the current page
  71620. start -= (start % len);
  71621. if ( len === -1 || start < 0 )
  71622. {
  71623. start = 0;
  71624. }
  71625. settings._iDisplayStart = start;
  71626. }
  71627. function _fnRenderer( settings, type )
  71628. {
  71629. var renderer = settings.renderer;
  71630. var host = DataTable.ext.renderer[type];
  71631. if ( $.isPlainObject( renderer ) && renderer[type] ) {
  71632. // Specific renderer for this type. If available use it, otherwise use
  71633. // the default.
  71634. return host[renderer[type]] || host._;
  71635. }
  71636. else if ( typeof renderer === 'string' ) {
  71637. // Common renderer - if there is one available for this type use it,
  71638. // otherwise use the default
  71639. return host[renderer] || host._;
  71640. }
  71641. // Use the default
  71642. return host._;
  71643. }
  71644. /**
  71645. * Detect the data source being used for the table. Used to simplify the code
  71646. * a little (ajax) and to make it compress a little smaller.
  71647. *
  71648. * @param {object} settings dataTables settings object
  71649. * @returns {string} Data source
  71650. * @memberof DataTable#oApi
  71651. */
  71652. function _fnDataSource ( settings )
  71653. {
  71654. if ( settings.oFeatures.bServerSide ) {
  71655. return 'ssp';
  71656. }
  71657. else if ( settings.ajax || settings.sAjaxSource ) {
  71658. return 'ajax';
  71659. }
  71660. return 'dom';
  71661. }
  71662. /**
  71663. * Computed structure of the DataTables API, defined by the options passed to
  71664. * `DataTable.Api.register()` when building the API.
  71665. *
  71666. * The structure is built in order to speed creation and extension of the Api
  71667. * objects since the extensions are effectively pre-parsed.
  71668. *
  71669. * The array is an array of objects with the following structure, where this
  71670. * base array represents the Api prototype base:
  71671. *
  71672. * [
  71673. * {
  71674. * name: 'data' -- string - Property name
  71675. * val: function () {}, -- function - Api method (or undefined if just an object
  71676. * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result
  71677. * propExt: [ ... ] -- array - Array of Api object definitions to extend the property
  71678. * },
  71679. * {
  71680. * name: 'row'
  71681. * val: {},
  71682. * methodExt: [ ... ],
  71683. * propExt: [
  71684. * {
  71685. * name: 'data'
  71686. * val: function () {},
  71687. * methodExt: [ ... ],
  71688. * propExt: [ ... ]
  71689. * },
  71690. * ...
  71691. * ]
  71692. * }
  71693. * ]
  71694. *
  71695. * @type {Array}
  71696. * @ignore
  71697. */
  71698. var __apiStruct = [];
  71699. /**
  71700. * `Array.prototype` reference.
  71701. *
  71702. * @type object
  71703. * @ignore
  71704. */
  71705. var __arrayProto = Array.prototype;
  71706. /**
  71707. * Abstraction for `context` parameter of the `Api` constructor to allow it to
  71708. * take several different forms for ease of use.
  71709. *
  71710. * Each of the input parameter types will be converted to a DataTables settings
  71711. * object where possible.
  71712. *
  71713. * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one
  71714. * of:
  71715. *
  71716. * * `string` - jQuery selector. Any DataTables' matching the given selector
  71717. * with be found and used.
  71718. * * `node` - `TABLE` node which has already been formed into a DataTable.
  71719. * * `jQuery` - A jQuery object of `TABLE` nodes.
  71720. * * `object` - DataTables settings object
  71721. * * `DataTables.Api` - API instance
  71722. * @return {array|null} Matching DataTables settings objects. `null` or
  71723. * `undefined` is returned if no matching DataTable is found.
  71724. * @ignore
  71725. */
  71726. var _toSettings = function ( mixed )
  71727. {
  71728. var idx, jq;
  71729. var settings = DataTable.settings;
  71730. var tables = $.map( settings, function (el, i) {
  71731. return el.nTable;
  71732. } );
  71733. if ( ! mixed ) {
  71734. return [];
  71735. }
  71736. else if ( mixed.nTable && mixed.oApi ) {
  71737. // DataTables settings object
  71738. return [ mixed ];
  71739. }
  71740. else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
  71741. // Table node
  71742. idx = $.inArray( mixed, tables );
  71743. return idx !== -1 ? [ settings[idx] ] : null;
  71744. }
  71745. else if ( mixed && typeof mixed.settings === 'function' ) {
  71746. return mixed.settings().toArray();
  71747. }
  71748. else if ( typeof mixed === 'string' ) {
  71749. // jQuery selector
  71750. jq = $(mixed);
  71751. }
  71752. else if ( mixed instanceof $ ) {
  71753. // jQuery object (also DataTables instance)
  71754. jq = mixed;
  71755. }
  71756. if ( jq ) {
  71757. return jq.map( function(i) {
  71758. idx = $.inArray( this, tables );
  71759. return idx !== -1 ? settings[idx] : null;
  71760. } ).toArray();
  71761. }
  71762. };
  71763. /**
  71764. * DataTables API class - used to control and interface with one or more
  71765. * DataTables enhanced tables.
  71766. *
  71767. * The API class is heavily based on jQuery, presenting a chainable interface
  71768. * that you can use to interact with tables. Each instance of the API class has
  71769. * a "context" - i.e. the tables that it will operate on. This could be a single
  71770. * table, all tables on a page or a sub-set thereof.
  71771. *
  71772. * Additionally the API is designed to allow you to easily work with the data in
  71773. * the tables, retrieving and manipulating it as required. This is done by
  71774. * presenting the API class as an array like interface. The contents of the
  71775. * array depend upon the actions requested by each method (for example
  71776. * `rows().nodes()` will return an array of nodes, while `rows().data()` will
  71777. * return an array of objects or arrays depending upon your table's
  71778. * configuration). The API object has a number of array like methods (`push`,
  71779. * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
  71780. * `unique` etc) to assist your working with the data held in a table.
  71781. *
  71782. * Most methods (those which return an Api instance) are chainable, which means
  71783. * the return from a method call also has all of the methods available that the
  71784. * top level object had. For example, these two calls are equivalent:
  71785. *
  71786. * // Not chained
  71787. * api.row.add( {...} );
  71788. * api.draw();
  71789. *
  71790. * // Chained
  71791. * api.row.add( {...} ).draw();
  71792. *
  71793. * @class DataTable.Api
  71794. * @param {array|object|string|jQuery} context DataTable identifier. This is
  71795. * used to define which DataTables enhanced tables this API will operate on.
  71796. * Can be one of:
  71797. *
  71798. * * `string` - jQuery selector. Any DataTables' matching the given selector
  71799. * with be found and used.
  71800. * * `node` - `TABLE` node which has already been formed into a DataTable.
  71801. * * `jQuery` - A jQuery object of `TABLE` nodes.
  71802. * * `object` - DataTables settings object
  71803. * @param {array} [data] Data to initialise the Api instance with.
  71804. *
  71805. * @example
  71806. * // Direct initialisation during DataTables construction
  71807. * var api = $('#example').DataTable();
  71808. *
  71809. * @example
  71810. * // Initialisation using a DataTables jQuery object
  71811. * var api = $('#example').dataTable().api();
  71812. *
  71813. * @example
  71814. * // Initialisation as a constructor
  71815. * var api = new $.fn.DataTable.Api( 'table.dataTable' );
  71816. */
  71817. _Api = function ( context, data )
  71818. {
  71819. if ( ! (this instanceof _Api) ) {
  71820. return new _Api( context, data );
  71821. }
  71822. var settings = [];
  71823. var ctxSettings = function ( o ) {
  71824. var a = _toSettings( o );
  71825. if ( a ) {
  71826. settings = settings.concat( a );
  71827. }
  71828. };
  71829. if ( $.isArray( context ) ) {
  71830. for ( var i=0, ien=context.length ; i<ien ; i++ ) {
  71831. ctxSettings( context[i] );
  71832. }
  71833. }
  71834. else {
  71835. ctxSettings( context );
  71836. }
  71837. // Remove duplicates
  71838. this.context = _unique( settings );
  71839. // Initial data
  71840. if ( data ) {
  71841. $.merge( this, data );
  71842. }
  71843. // selector
  71844. this.selector = {
  71845. rows: null,
  71846. cols: null,
  71847. opts: null
  71848. };
  71849. _Api.extend( this, this, __apiStruct );
  71850. };
  71851. DataTable.Api = _Api;
  71852. // Don't destroy the existing prototype, just extend it. Required for jQuery 2's
  71853. // isPlainObject.
  71854. $.extend( _Api.prototype, {
  71855. any: function ()
  71856. {
  71857. return this.count() !== 0;
  71858. },
  71859. concat: __arrayProto.concat,
  71860. context: [], // array of table settings objects
  71861. count: function ()
  71862. {
  71863. return this.flatten().length;
  71864. },
  71865. each: function ( fn )
  71866. {
  71867. for ( var i=0, ien=this.length ; i<ien; i++ ) {
  71868. fn.call( this, this[i], i, this );
  71869. }
  71870. return this;
  71871. },
  71872. eq: function ( idx )
  71873. {
  71874. var ctx = this.context;
  71875. return ctx.length > idx ?
  71876. new _Api( ctx[idx], this[idx] ) :
  71877. null;
  71878. },
  71879. filter: function ( fn )
  71880. {
  71881. var a = [];
  71882. if ( __arrayProto.filter ) {
  71883. a = __arrayProto.filter.call( this, fn, this );
  71884. }
  71885. else {
  71886. // Compatibility for browsers without EMCA-252-5 (JS 1.6)
  71887. for ( var i=0, ien=this.length ; i<ien ; i++ ) {
  71888. if ( fn.call( this, this[i], i, this ) ) {
  71889. a.push( this[i] );
  71890. }
  71891. }
  71892. }
  71893. return new _Api( this.context, a );
  71894. },
  71895. flatten: function ()
  71896. {
  71897. var a = [];
  71898. return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
  71899. },
  71900. join: __arrayProto.join,
  71901. indexOf: __arrayProto.indexOf || function (obj, start)
  71902. {
  71903. for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
  71904. if ( this[i] === obj ) {
  71905. return i;
  71906. }
  71907. }
  71908. return -1;
  71909. },
  71910. iterator: function ( flatten, type, fn, alwaysNew ) {
  71911. var
  71912. a = [], ret,
  71913. i, ien, j, jen,
  71914. context = this.context,
  71915. rows, items, item,
  71916. selector = this.selector;
  71917. // Argument shifting
  71918. if ( typeof flatten === 'string' ) {
  71919. alwaysNew = fn;
  71920. fn = type;
  71921. type = flatten;
  71922. flatten = false;
  71923. }
  71924. for ( i=0, ien=context.length ; i<ien ; i++ ) {
  71925. var apiInst = new _Api( context[i] );
  71926. if ( type === 'table' ) {
  71927. ret = fn.call( apiInst, context[i], i );
  71928. if ( ret !== undefined ) {
  71929. a.push( ret );
  71930. }
  71931. }
  71932. else if ( type === 'columns' || type === 'rows' ) {
  71933. // this has same length as context - one entry for each table
  71934. ret = fn.call( apiInst, context[i], this[i], i );
  71935. if ( ret !== undefined ) {
  71936. a.push( ret );
  71937. }
  71938. }
  71939. else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
  71940. // columns and rows share the same structure.
  71941. // 'this' is an array of column indexes for each context
  71942. items = this[i];
  71943. if ( type === 'column-rows' ) {
  71944. rows = _selector_row_indexes( context[i], selector.opts );
  71945. }
  71946. for ( j=0, jen=items.length ; j<jen ; j++ ) {
  71947. item = items[j];
  71948. if ( type === 'cell' ) {
  71949. ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
  71950. }
  71951. else {
  71952. ret = fn.call( apiInst, context[i], item, i, j, rows );
  71953. }
  71954. if ( ret !== undefined ) {
  71955. a.push( ret );
  71956. }
  71957. }
  71958. }
  71959. }
  71960. if ( a.length || alwaysNew ) {
  71961. var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
  71962. var apiSelector = api.selector;
  71963. apiSelector.rows = selector.rows;
  71964. apiSelector.cols = selector.cols;
  71965. apiSelector.opts = selector.opts;
  71966. return api;
  71967. }
  71968. return this;
  71969. },
  71970. lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
  71971. {
  71972. // Bit cheeky...
  71973. return this.indexOf.apply( this.toArray.reverse(), arguments );
  71974. },
  71975. length: 0,
  71976. map: function ( fn )
  71977. {
  71978. var a = [];
  71979. if ( __arrayProto.map ) {
  71980. a = __arrayProto.map.call( this, fn, this );
  71981. }
  71982. else {
  71983. // Compatibility for browsers without EMCA-252-5 (JS 1.6)
  71984. for ( var i=0, ien=this.length ; i<ien ; i++ ) {
  71985. a.push( fn.call( this, this[i], i ) );
  71986. }
  71987. }
  71988. return new _Api( this.context, a );
  71989. },
  71990. pluck: function ( prop )
  71991. {
  71992. return this.map( function ( el ) {
  71993. return el[ prop ];
  71994. } );
  71995. },
  71996. pop: __arrayProto.pop,
  71997. push: __arrayProto.push,
  71998. // Does not return an API instance
  71999. reduce: __arrayProto.reduce || function ( fn, init )
  72000. {
  72001. return _fnReduce( this, fn, init, 0, this.length, 1 );
  72002. },
  72003. reduceRight: __arrayProto.reduceRight || function ( fn, init )
  72004. {
  72005. return _fnReduce( this, fn, init, this.length-1, -1, -1 );
  72006. },
  72007. reverse: __arrayProto.reverse,
  72008. // Object with rows, columns and opts
  72009. selector: null,
  72010. shift: __arrayProto.shift,
  72011. slice: function () {
  72012. return new _Api( this.context, this );
  72013. },
  72014. sort: __arrayProto.sort, // ? name - order?
  72015. splice: __arrayProto.splice,
  72016. toArray: function ()
  72017. {
  72018. return __arrayProto.slice.call( this );
  72019. },
  72020. to$: function ()
  72021. {
  72022. return $( this );
  72023. },
  72024. toJQuery: function ()
  72025. {
  72026. return $( this );
  72027. },
  72028. unique: function ()
  72029. {
  72030. return new _Api( this.context, _unique(this) );
  72031. },
  72032. unshift: __arrayProto.unshift
  72033. } );
  72034. _Api.extend = function ( scope, obj, ext )
  72035. {
  72036. // Only extend API instances and static properties of the API
  72037. if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
  72038. return;
  72039. }
  72040. var
  72041. i, ien,
  72042. j, jen,
  72043. struct, inner,
  72044. methodScoping = function ( scope, fn, struc ) {
  72045. return function () {
  72046. var ret = fn.apply( scope, arguments );
  72047. // Method extension
  72048. _Api.extend( ret, ret, struc.methodExt );
  72049. return ret;
  72050. };
  72051. };
  72052. for ( i=0, ien=ext.length ; i<ien ; i++ ) {
  72053. struct = ext[i];
  72054. // Value
  72055. obj[ struct.name ] = typeof struct.val === 'function' ?
  72056. methodScoping( scope, struct.val, struct ) :
  72057. $.isPlainObject( struct.val ) ?
  72058. {} :
  72059. struct.val;
  72060. obj[ struct.name ].__dt_wrapper = true;
  72061. // Property extension
  72062. _Api.extend( scope, obj[ struct.name ], struct.propExt );
  72063. }
  72064. };
  72065. // @todo - Is there need for an augment function?
  72066. // _Api.augment = function ( inst, name )
  72067. // {
  72068. // // Find src object in the structure from the name
  72069. // var parts = name.split('.');
  72070. // _Api.extend( inst, obj );
  72071. // };
  72072. // [
  72073. // {
  72074. // name: 'data' -- string - Property name
  72075. // val: function () {}, -- function - Api method (or undefined if just an object
  72076. // methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result
  72077. // propExt: [ ... ] -- array - Array of Api object definitions to extend the property
  72078. // },
  72079. // {
  72080. // name: 'row'
  72081. // val: {},
  72082. // methodExt: [ ... ],
  72083. // propExt: [
  72084. // {
  72085. // name: 'data'
  72086. // val: function () {},
  72087. // methodExt: [ ... ],
  72088. // propExt: [ ... ]
  72089. // },
  72090. // ...
  72091. // ]
  72092. // }
  72093. // ]
  72094. _Api.register = _api_register = function ( name, val )
  72095. {
  72096. if ( $.isArray( name ) ) {
  72097. for ( var j=0, jen=name.length ; j<jen ; j++ ) {
  72098. _Api.register( name[j], val );
  72099. }
  72100. return;
  72101. }
  72102. var
  72103. i, ien,
  72104. heir = name.split('.'),
  72105. struct = __apiStruct,
  72106. key, method;
  72107. var find = function ( src, name ) {
  72108. for ( var i=0, ien=src.length ; i<ien ; i++ ) {
  72109. if ( src[i].name === name ) {
  72110. return src[i];
  72111. }
  72112. }
  72113. return null;
  72114. };
  72115. for ( i=0, ien=heir.length ; i<ien ; i++ ) {
  72116. method = heir[i].indexOf('()') !== -1;
  72117. key = method ?
  72118. heir[i].replace('()', '') :
  72119. heir[i];
  72120. var src = find( struct, key );
  72121. if ( ! src ) {
  72122. src = {
  72123. name: key,
  72124. val: {},
  72125. methodExt: [],
  72126. propExt: []
  72127. };
  72128. struct.push( src );
  72129. }
  72130. if ( i === ien-1 ) {
  72131. src.val = val;
  72132. }
  72133. else {
  72134. struct = method ?
  72135. src.methodExt :
  72136. src.propExt;
  72137. }
  72138. }
  72139. };
  72140. _Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
  72141. _Api.register( pluralName, val );
  72142. _Api.register( singularName, function () {
  72143. var ret = val.apply( this, arguments );
  72144. if ( ret === this ) {
  72145. // Returned item is the API instance that was passed in, return it
  72146. return this;
  72147. }
  72148. else if ( ret instanceof _Api ) {
  72149. // New API instance returned, want the value from the first item
  72150. // in the returned array for the singular result.
  72151. return ret.length ?
  72152. $.isArray( ret[0] ) ?
  72153. new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
  72154. ret[0] :
  72155. undefined;
  72156. }
  72157. // Non-API return - just fire it back
  72158. return ret;
  72159. } );
  72160. };
  72161. /**
  72162. * Selector for HTML tables. Apply the given selector to the give array of
  72163. * DataTables settings objects.
  72164. *
  72165. * @param {string|integer} [selector] jQuery selector string or integer
  72166. * @param {array} Array of DataTables settings objects to be filtered
  72167. * @return {array}
  72168. * @ignore
  72169. */
  72170. var __table_selector = function ( selector, a )
  72171. {
  72172. // Integer is used to pick out a table by index
  72173. if ( typeof selector === 'number' ) {
  72174. return [ a[ selector ] ];
  72175. }
  72176. // Perform a jQuery selector on the table nodes
  72177. var nodes = $.map( a, function (el, i) {
  72178. return el.nTable;
  72179. } );
  72180. return $(nodes)
  72181. .filter( selector )
  72182. .map( function (i) {
  72183. // Need to translate back from the table node to the settings
  72184. var idx = $.inArray( this, nodes );
  72185. return a[ idx ];
  72186. } )
  72187. .toArray();
  72188. };
  72189. /**
  72190. * Context selector for the API's context (i.e. the tables the API instance
  72191. * refers to.
  72192. *
  72193. * @name DataTable.Api#tables
  72194. * @param {string|integer} [selector] Selector to pick which tables the iterator
  72195. * should operate on. If not given, all tables in the current context are
  72196. * used. This can be given as a jQuery selector (for example `':gt(0)'`) to
  72197. * select multiple tables or as an integer to select a single table.
  72198. * @returns {DataTable.Api} Returns a new API instance if a selector is given.
  72199. */
  72200. _api_register( 'tables()', function ( selector ) {
  72201. // A new instance is created if there was a selector specified
  72202. return selector ?
  72203. new _Api( __table_selector( selector, this.context ) ) :
  72204. this;
  72205. } );
  72206. _api_register( 'table()', function ( selector ) {
  72207. var tables = this.tables( selector );
  72208. var ctx = tables.context;
  72209. // Truncate to the first matched table
  72210. return ctx.length ?
  72211. new _Api( ctx[0] ) :
  72212. tables;
  72213. } );
  72214. _api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
  72215. return this.iterator( 'table', function ( ctx ) {
  72216. return ctx.nTable;
  72217. }, 1 );
  72218. } );
  72219. _api_registerPlural( 'tables().body()', 'table().body()' , function () {
  72220. return this.iterator( 'table', function ( ctx ) {
  72221. return ctx.nTBody;
  72222. }, 1 );
  72223. } );
  72224. _api_registerPlural( 'tables().header()', 'table().header()' , function () {
  72225. return this.iterator( 'table', function ( ctx ) {
  72226. return ctx.nTHead;
  72227. }, 1 );
  72228. } );
  72229. _api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
  72230. return this.iterator( 'table', function ( ctx ) {
  72231. return ctx.nTFoot;
  72232. }, 1 );
  72233. } );
  72234. _api_registerPlural( 'tables().containers()', 'table().container()' , function () {
  72235. return this.iterator( 'table', function ( ctx ) {
  72236. return ctx.nTableWrapper;
  72237. }, 1 );
  72238. } );
  72239. /**
  72240. * Redraw the tables in the current context.
  72241. */
  72242. _api_register( 'draw()', function ( paging ) {
  72243. return this.iterator( 'table', function ( settings ) {
  72244. if ( paging === 'page' ) {
  72245. _fnDraw( settings );
  72246. }
  72247. else {
  72248. if ( typeof paging === 'string' ) {
  72249. paging = paging === 'full-hold' ?
  72250. false :
  72251. true;
  72252. }
  72253. _fnReDraw( settings, paging===false );
  72254. }
  72255. } );
  72256. } );
  72257. /**
  72258. * Get the current page index.
  72259. *
  72260. * @return {integer} Current page index (zero based)
  72261. *//**
  72262. * Set the current page.
  72263. *
  72264. * Note that if you attempt to show a page which does not exist, DataTables will
  72265. * not throw an error, but rather reset the paging.
  72266. *
  72267. * @param {integer|string} action The paging action to take. This can be one of:
  72268. * * `integer` - The page index to jump to
  72269. * * `string` - An action to take:
  72270. * * `first` - Jump to first page.
  72271. * * `next` - Jump to the next page
  72272. * * `previous` - Jump to previous page
  72273. * * `last` - Jump to the last page.
  72274. * @returns {DataTables.Api} this
  72275. */
  72276. _api_register( 'page()', function ( action ) {
  72277. if ( action === undefined ) {
  72278. return this.page.info().page; // not an expensive call
  72279. }
  72280. // else, have an action to take on all tables
  72281. return this.iterator( 'table', function ( settings ) {
  72282. _fnPageChange( settings, action );
  72283. } );
  72284. } );
  72285. /**
  72286. * Paging information for the first table in the current context.
  72287. *
  72288. * If you require paging information for another table, use the `table()` method
  72289. * with a suitable selector.
  72290. *
  72291. * @return {object} Object with the following properties set:
  72292. * * `page` - Current page index (zero based - i.e. the first page is `0`)
  72293. * * `pages` - Total number of pages
  72294. * * `start` - Display index for the first record shown on the current page
  72295. * * `end` - Display index for the last record shown on the current page
  72296. * * `length` - Display length (number of records). Note that generally `start
  72297. * + length = end`, but this is not always true, for example if there are
  72298. * only 2 records to show on the final page, with a length of 10.
  72299. * * `recordsTotal` - Full data set length
  72300. * * `recordsDisplay` - Data set length once the current filtering criterion
  72301. * are applied.
  72302. */
  72303. _api_register( 'page.info()', function ( action ) {
  72304. if ( this.context.length === 0 ) {
  72305. return undefined;
  72306. }
  72307. var
  72308. settings = this.context[0],
  72309. start = settings._iDisplayStart,
  72310. len = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,
  72311. visRecords = settings.fnRecordsDisplay(),
  72312. all = len === -1;
  72313. return {
  72314. "page": all ? 0 : Math.floor( start / len ),
  72315. "pages": all ? 1 : Math.ceil( visRecords / len ),
  72316. "start": start,
  72317. "end": settings.fnDisplayEnd(),
  72318. "length": len,
  72319. "recordsTotal": settings.fnRecordsTotal(),
  72320. "recordsDisplay": visRecords,
  72321. "serverSide": _fnDataSource( settings ) === 'ssp'
  72322. };
  72323. } );
  72324. /**
  72325. * Get the current page length.
  72326. *
  72327. * @return {integer} Current page length. Note `-1` indicates that all records
  72328. * are to be shown.
  72329. *//**
  72330. * Set the current page length.
  72331. *
  72332. * @param {integer} Page length to set. Use `-1` to show all records.
  72333. * @returns {DataTables.Api} this
  72334. */
  72335. _api_register( 'page.len()', function ( len ) {
  72336. // Note that we can't call this function 'length()' because `length`
  72337. // is a Javascript property of functions which defines how many arguments
  72338. // the function expects.
  72339. if ( len === undefined ) {
  72340. return this.context.length !== 0 ?
  72341. this.context[0]._iDisplayLength :
  72342. undefined;
  72343. }
  72344. // else, set the page length
  72345. return this.iterator( 'table', function ( settings ) {
  72346. _fnLengthChange( settings, len );
  72347. } );
  72348. } );
  72349. var __reload = function ( settings, holdPosition, callback ) {
  72350. // Use the draw event to trigger a callback
  72351. if ( callback ) {
  72352. var api = new _Api( settings );
  72353. api.one( 'draw', function () {
  72354. callback( api.ajax.json() );
  72355. } );
  72356. }
  72357. if ( _fnDataSource( settings ) == 'ssp' ) {
  72358. _fnReDraw( settings, holdPosition );
  72359. }
  72360. else {
  72361. _fnProcessingDisplay( settings, true );
  72362. // Cancel an existing request
  72363. var xhr = settings.jqXHR;
  72364. if ( xhr && xhr.readyState !== 4 ) {
  72365. xhr.abort();
  72366. }
  72367. // Trigger xhr
  72368. _fnBuildAjax( settings, [], function( json ) {
  72369. _fnClearTable( settings );
  72370. var data = _fnAjaxDataSrc( settings, json );
  72371. for ( var i=0, ien=data.length ; i<ien ; i++ ) {
  72372. _fnAddData( settings, data[i] );
  72373. }
  72374. _fnReDraw( settings, holdPosition );
  72375. _fnProcessingDisplay( settings, false );
  72376. } );
  72377. }
  72378. };
  72379. /**
  72380. * Get the JSON response from the last Ajax request that DataTables made to the
  72381. * server. Note that this returns the JSON from the first table in the current
  72382. * context.
  72383. *
  72384. * @return {object} JSON received from the server.
  72385. */
  72386. _api_register( 'ajax.json()', function () {
  72387. var ctx = this.context;
  72388. if ( ctx.length > 0 ) {
  72389. return ctx[0].json;
  72390. }
  72391. // else return undefined;
  72392. } );
  72393. /**
  72394. * Get the data submitted in the last Ajax request
  72395. */
  72396. _api_register( 'ajax.params()', function () {
  72397. var ctx = this.context;
  72398. if ( ctx.length > 0 ) {
  72399. return ctx[0].oAjaxData;
  72400. }
  72401. // else return undefined;
  72402. } );
  72403. /**
  72404. * Reload tables from the Ajax data source. Note that this function will
  72405. * automatically re-draw the table when the remote data has been loaded.
  72406. *
  72407. * @param {boolean} [reset=true] Reset (default) or hold the current paging
  72408. * position. A full re-sort and re-filter is performed when this method is
  72409. * called, which is why the pagination reset is the default action.
  72410. * @returns {DataTables.Api} this
  72411. */
  72412. _api_register( 'ajax.reload()', function ( callback, resetPaging ) {
  72413. return this.iterator( 'table', function (settings) {
  72414. __reload( settings, resetPaging===false, callback );
  72415. } );
  72416. } );
  72417. /**
  72418. * Get the current Ajax URL. Note that this returns the URL from the first
  72419. * table in the current context.
  72420. *
  72421. * @return {string} Current Ajax source URL
  72422. *//**
  72423. * Set the Ajax URL. Note that this will set the URL for all tables in the
  72424. * current context.
  72425. *
  72426. * @param {string} url URL to set.
  72427. * @returns {DataTables.Api} this
  72428. */
  72429. _api_register( 'ajax.url()', function ( url ) {
  72430. var ctx = this.context;
  72431. if ( url === undefined ) {
  72432. // get
  72433. if ( ctx.length === 0 ) {
  72434. return undefined;
  72435. }
  72436. ctx = ctx[0];
  72437. return ctx.ajax ?
  72438. $.isPlainObject( ctx.ajax ) ?
  72439. ctx.ajax.url :
  72440. ctx.ajax :
  72441. ctx.sAjaxSource;
  72442. }
  72443. // set
  72444. return this.iterator( 'table', function ( settings ) {
  72445. if ( $.isPlainObject( settings.ajax ) ) {
  72446. settings.ajax.url = url;
  72447. }
  72448. else {
  72449. settings.ajax = url;
  72450. }
  72451. // No need to consider sAjaxSource here since DataTables gives priority
  72452. // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
  72453. // value of `sAjaxSource` redundant.
  72454. } );
  72455. } );
  72456. /**
  72457. * Load data from the newly set Ajax URL. Note that this method is only
  72458. * available when `ajax.url()` is used to set a URL. Additionally, this method
  72459. * has the same effect as calling `ajax.reload()` but is provided for
  72460. * convenience when setting a new URL. Like `ajax.reload()` it will
  72461. * automatically redraw the table once the remote data has been loaded.
  72462. *
  72463. * @returns {DataTables.Api} this
  72464. */
  72465. _api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
  72466. // Same as a reload, but makes sense to present it for easy access after a
  72467. // url change
  72468. return this.iterator( 'table', function ( ctx ) {
  72469. __reload( ctx, resetPaging===false, callback );
  72470. } );
  72471. } );
  72472. var _selector_run = function ( type, selector, selectFn, settings, opts )
  72473. {
  72474. var
  72475. out = [], res,
  72476. a, i, ien, j, jen,
  72477. selectorType = typeof selector;
  72478. // Can't just check for isArray here, as an API or jQuery instance might be
  72479. // given with their array like look
  72480. if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
  72481. selector = [ selector ];
  72482. }
  72483. for ( i=0, ien=selector.length ; i<ien ; i++ ) {
  72484. // Only split on simple strings - complex expressions will be jQuery selectors
  72485. a = selector[i] && selector[i].split && ! selector[i].match(/[\[\(:]/) ?
  72486. selector[i].split(',') :
  72487. [ selector[i] ];
  72488. for ( j=0, jen=a.length ; j<jen ; j++ ) {
  72489. res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
  72490. if ( res && res.length ) {
  72491. out = out.concat( res );
  72492. }
  72493. }
  72494. }
  72495. // selector extensions
  72496. var ext = _ext.selector[ type ];
  72497. if ( ext.length ) {
  72498. for ( i=0, ien=ext.length ; i<ien ; i++ ) {
  72499. out = ext[i]( settings, opts, out );
  72500. }
  72501. }
  72502. return _unique( out );
  72503. };
  72504. var _selector_opts = function ( opts )
  72505. {
  72506. if ( ! opts ) {
  72507. opts = {};
  72508. }
  72509. // Backwards compatibility for 1.9- which used the terminology filter rather
  72510. // than search
  72511. if ( opts.filter && opts.search === undefined ) {
  72512. opts.search = opts.filter;
  72513. }
  72514. return $.extend( {
  72515. search: 'none',
  72516. order: 'current',
  72517. page: 'all'
  72518. }, opts );
  72519. };
  72520. var _selector_first = function ( inst )
  72521. {
  72522. // Reduce the API instance to the first item found
  72523. for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
  72524. if ( inst[i].length > 0 ) {
  72525. // Assign the first element to the first item in the instance
  72526. // and truncate the instance and context
  72527. inst[0] = inst[i];
  72528. inst[0].length = 1;
  72529. inst.length = 1;
  72530. inst.context = [ inst.context[i] ];
  72531. return inst;
  72532. }
  72533. }
  72534. // Not found - return an empty instance
  72535. inst.length = 0;
  72536. return inst;
  72537. };
  72538. var _selector_row_indexes = function ( settings, opts )
  72539. {
  72540. var
  72541. i, ien, tmp, a=[],
  72542. displayFiltered = settings.aiDisplay,
  72543. displayMaster = settings.aiDisplayMaster;
  72544. var
  72545. search = opts.search, // none, applied, removed
  72546. order = opts.order, // applied, current, index (original - compatibility with 1.9)
  72547. page = opts.page; // all, current
  72548. if ( _fnDataSource( settings ) == 'ssp' ) {
  72549. // In server-side processing mode, most options are irrelevant since
  72550. // rows not shown don't exist and the index order is the applied order
  72551. // Removed is a special case - for consistency just return an empty
  72552. // array
  72553. return search === 'removed' ?
  72554. [] :
  72555. _range( 0, displayMaster.length );
  72556. }
  72557. else if ( page == 'current' ) {
  72558. // Current page implies that order=current and fitler=applied, since it is
  72559. // fairly senseless otherwise, regardless of what order and search actually
  72560. // are
  72561. for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
  72562. a.push( displayFiltered[i] );
  72563. }
  72564. }
  72565. else if ( order == 'current' || order == 'applied' ) {
  72566. a = search == 'none' ?
  72567. displayMaster.slice() : // no search
  72568. search == 'applied' ?
  72569. displayFiltered.slice() : // applied search
  72570. $.map( displayMaster, function (el, i) { // removed search
  72571. return $.inArray( el, displayFiltered ) === -1 ? el : null;
  72572. } );
  72573. }
  72574. else if ( order == 'index' || order == 'original' ) {
  72575. for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
  72576. if ( search == 'none' ) {
  72577. a.push( i );
  72578. }
  72579. else { // applied | removed
  72580. tmp = $.inArray( i, displayFiltered );
  72581. if ((tmp === -1 && search == 'removed') ||
  72582. (tmp >= 0 && search == 'applied') )
  72583. {
  72584. a.push( i );
  72585. }
  72586. }
  72587. }
  72588. }
  72589. return a;
  72590. };
  72591. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  72592. * Rows
  72593. *
  72594. * {} - no selector - use all available rows
  72595. * {integer} - row aoData index
  72596. * {node} - TR node
  72597. * {string} - jQuery selector to apply to the TR elements
  72598. * {array} - jQuery array of nodes, or simply an array of TR nodes
  72599. *
  72600. */
  72601. var __row_selector = function ( settings, selector, opts )
  72602. {
  72603. var rows;
  72604. var run = function ( sel ) {
  72605. var selInt = _intVal( sel );
  72606. var i, ien;
  72607. // Short cut - selector is a number and no options provided (default is
  72608. // all records, so no need to check if the index is in there, since it
  72609. // must be - dev error if the index doesn't exist).
  72610. if ( selInt !== null && ! opts ) {
  72611. return [ selInt ];
  72612. }
  72613. if ( ! rows ) {
  72614. rows = _selector_row_indexes( settings, opts );
  72615. }
  72616. if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
  72617. // Selector - integer
  72618. return [ selInt ];
  72619. }
  72620. else if ( sel === null || sel === undefined || sel === '' ) {
  72621. // Selector - none
  72622. return rows;
  72623. }
  72624. // Selector - function
  72625. if ( typeof sel === 'function' ) {
  72626. return $.map( rows, function (idx) {
  72627. var row = settings.aoData[ idx ];
  72628. return sel( idx, row._aData, row.nTr ) ? idx : null;
  72629. } );
  72630. }
  72631. // Get nodes in the order from the `rows` array with null values removed
  72632. var nodes = _removeEmpty(
  72633. _pluck_order( settings.aoData, rows, 'nTr' )
  72634. );
  72635. // Selector - node
  72636. if ( sel.nodeName ) {
  72637. if ( sel._DT_RowIndex !== undefined ) {
  72638. return [ sel._DT_RowIndex ]; // Property added by DT for fast lookup
  72639. }
  72640. else if ( sel._DT_CellIndex ) {
  72641. return [ sel._DT_CellIndex.row ];
  72642. }
  72643. else {
  72644. var host = $(sel).closest('*[data-dt-row]');
  72645. return host.length ?
  72646. [ host.data('dt-row') ] :
  72647. [];
  72648. }
  72649. }
  72650. // ID selector. Want to always be able to select rows by id, regardless
  72651. // of if the tr element has been created or not, so can't rely upon
  72652. // jQuery here - hence a custom implementation. This does not match
  72653. // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
  72654. // but to select it using a CSS selector engine (like Sizzle or
  72655. // querySelect) it would need to need to be escaped for some characters.
  72656. // DataTables simplifies this for row selectors since you can select
  72657. // only a row. A # indicates an id any anything that follows is the id -
  72658. // unescaped.
  72659. if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
  72660. // get row index from id
  72661. var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
  72662. if ( rowObj !== undefined ) {
  72663. return [ rowObj.idx ];
  72664. }
  72665. // need to fall through to jQuery in case there is DOM id that
  72666. // matches
  72667. }
  72668. // Selector - jQuery selector string, array of nodes or jQuery object/
  72669. // As jQuery's .filter() allows jQuery objects to be passed in filter,
  72670. // it also allows arrays, so this will cope with all three options
  72671. return $(nodes)
  72672. .filter( sel )
  72673. .map( function () {
  72674. return this._DT_RowIndex;
  72675. } )
  72676. .toArray();
  72677. };
  72678. return _selector_run( 'row', selector, run, settings, opts );
  72679. };
  72680. _api_register( 'rows()', function ( selector, opts ) {
  72681. // argument shifting
  72682. if ( selector === undefined ) {
  72683. selector = '';
  72684. }
  72685. else if ( $.isPlainObject( selector ) ) {
  72686. opts = selector;
  72687. selector = '';
  72688. }
  72689. opts = _selector_opts( opts );
  72690. var inst = this.iterator( 'table', function ( settings ) {
  72691. return __row_selector( settings, selector, opts );
  72692. }, 1 );
  72693. // Want argument shifting here and in __row_selector?
  72694. inst.selector.rows = selector;
  72695. inst.selector.opts = opts;
  72696. return inst;
  72697. } );
  72698. _api_register( 'rows().nodes()', function () {
  72699. return this.iterator( 'row', function ( settings, row ) {
  72700. return settings.aoData[ row ].nTr || undefined;
  72701. }, 1 );
  72702. } );
  72703. _api_register( 'rows().data()', function () {
  72704. return this.iterator( true, 'rows', function ( settings, rows ) {
  72705. return _pluck_order( settings.aoData, rows, '_aData' );
  72706. }, 1 );
  72707. } );
  72708. _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
  72709. return this.iterator( 'row', function ( settings, row ) {
  72710. var r = settings.aoData[ row ];
  72711. return type === 'search' ? r._aFilterData : r._aSortData;
  72712. }, 1 );
  72713. } );
  72714. _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
  72715. return this.iterator( 'row', function ( settings, row ) {
  72716. _fnInvalidate( settings, row, src );
  72717. } );
  72718. } );
  72719. _api_registerPlural( 'rows().indexes()', 'row().index()', function () {
  72720. return this.iterator( 'row', function ( settings, row ) {
  72721. return row;
  72722. }, 1 );
  72723. } );
  72724. _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
  72725. var a = [];
  72726. var context = this.context;
  72727. // `iterator` will drop undefined values, but in this case we want them
  72728. for ( var i=0, ien=context.length ; i<ien ; i++ ) {
  72729. for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
  72730. var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
  72731. a.push( (hash === true ? '#' : '' )+ id );
  72732. }
  72733. }
  72734. return new _Api( context, a );
  72735. } );
  72736. _api_registerPlural( 'rows().remove()', 'row().remove()', function () {
  72737. var that = this;
  72738. this.iterator( 'row', function ( settings, row, thatIdx ) {
  72739. var data = settings.aoData;
  72740. var rowData = data[ row ];
  72741. var i, ien, j, jen;
  72742. var loopRow, loopCells;
  72743. data.splice( row, 1 );
  72744. // Update the cached indexes
  72745. for ( i=0, ien=data.length ; i<ien ; i++ ) {
  72746. loopRow = data[i];
  72747. loopCells = loopRow.anCells;
  72748. // Rows
  72749. if ( loopRow.nTr !== null ) {
  72750. loopRow.nTr._DT_RowIndex = i;
  72751. }
  72752. // Cells
  72753. if ( loopCells !== null ) {
  72754. for ( j=0, jen=loopCells.length ; j<jen ; j++ ) {
  72755. loopCells[j]._DT_CellIndex.row = i;
  72756. }
  72757. }
  72758. }
  72759. // Delete from the display arrays
  72760. _fnDeleteIndex( settings.aiDisplayMaster, row );
  72761. _fnDeleteIndex( settings.aiDisplay, row );
  72762. _fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
  72763. // For server-side processing tables - subtract the deleted row from the count
  72764. if ( settings._iRecordsDisplay > 0 ) {
  72765. settings._iRecordsDisplay--;
  72766. }
  72767. // Check for an 'overflow' they case for displaying the table
  72768. _fnLengthOverflow( settings );
  72769. // Remove the row's ID reference if there is one
  72770. var id = settings.rowIdFn( rowData._aData );
  72771. if ( id !== undefined ) {
  72772. delete settings.aIds[ id ];
  72773. }
  72774. } );
  72775. this.iterator( 'table', function ( settings ) {
  72776. for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
  72777. settings.aoData[i].idx = i;
  72778. }
  72779. } );
  72780. return this;
  72781. } );
  72782. _api_register( 'rows.add()', function ( rows ) {
  72783. var newRows = this.iterator( 'table', function ( settings ) {
  72784. var row, i, ien;
  72785. var out = [];
  72786. for ( i=0, ien=rows.length ; i<ien ; i++ ) {
  72787. row = rows[i];
  72788. if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
  72789. out.push( _fnAddTr( settings, row )[0] );
  72790. }
  72791. else {
  72792. out.push( _fnAddData( settings, row ) );
  72793. }
  72794. }
  72795. return out;
  72796. }, 1 );
  72797. // Return an Api.rows() extended instance, so rows().nodes() etc can be used
  72798. var modRows = this.rows( -1 );
  72799. modRows.pop();
  72800. $.merge( modRows, newRows );
  72801. return modRows;
  72802. } );
  72803. /**
  72804. *
  72805. */
  72806. _api_register( 'row()', function ( selector, opts ) {
  72807. return _selector_first( this.rows( selector, opts ) );
  72808. } );
  72809. _api_register( 'row().data()', function ( data ) {
  72810. var ctx = this.context;
  72811. if ( data === undefined ) {
  72812. // Get
  72813. return ctx.length && this.length ?
  72814. ctx[0].aoData[ this[0] ]._aData :
  72815. undefined;
  72816. }
  72817. // Set
  72818. ctx[0].aoData[ this[0] ]._aData = data;
  72819. // Automatically invalidate
  72820. _fnInvalidate( ctx[0], this[0], 'data' );
  72821. return this;
  72822. } );
  72823. _api_register( 'row().node()', function () {
  72824. var ctx = this.context;
  72825. return ctx.length && this.length ?
  72826. ctx[0].aoData[ this[0] ].nTr || null :
  72827. null;
  72828. } );
  72829. _api_register( 'row.add()', function ( row ) {
  72830. // Allow a jQuery object to be passed in - only a single row is added from
  72831. // it though - the first element in the set
  72832. if ( row instanceof $ && row.length ) {
  72833. row = row[0];
  72834. }
  72835. var rows = this.iterator( 'table', function ( settings ) {
  72836. if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
  72837. return _fnAddTr( settings, row )[0];
  72838. }
  72839. return _fnAddData( settings, row );
  72840. } );
  72841. // Return an Api.rows() extended instance, with the newly added row selected
  72842. return this.row( rows[0] );
  72843. } );
  72844. var __details_add = function ( ctx, row, data, klass )
  72845. {
  72846. // Convert to array of TR elements
  72847. var rows = [];
  72848. var addRow = function ( r, k ) {
  72849. // Recursion to allow for arrays of jQuery objects
  72850. if ( $.isArray( r ) || r instanceof $ ) {
  72851. for ( var i=0, ien=r.length ; i<ien ; i++ ) {
  72852. addRow( r[i], k );
  72853. }
  72854. return;
  72855. }
  72856. // If we get a TR element, then just add it directly - up to the dev
  72857. // to add the correct number of columns etc
  72858. if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
  72859. rows.push( r );
  72860. }
  72861. else {
  72862. // Otherwise create a row with a wrapper
  72863. var created = $('<tr><td/></tr>').addClass( k );
  72864. $('td', created)
  72865. .addClass( k )
  72866. .html( r )
  72867. [0].colSpan = _fnVisbleColumns( ctx );
  72868. rows.push( created[0] );
  72869. }
  72870. };
  72871. addRow( data, klass );
  72872. if ( row._details ) {
  72873. row._details.detach();
  72874. }
  72875. row._details = $(rows);
  72876. // If the children were already shown, that state should be retained
  72877. if ( row._detailsShow ) {
  72878. row._details.insertAfter( row.nTr );
  72879. }
  72880. };
  72881. var __details_remove = function ( api, idx )
  72882. {
  72883. var ctx = api.context;
  72884. if ( ctx.length ) {
  72885. var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
  72886. if ( row && row._details ) {
  72887. row._details.remove();
  72888. row._detailsShow = undefined;
  72889. row._details = undefined;
  72890. }
  72891. }
  72892. };
  72893. var __details_display = function ( api, show ) {
  72894. var ctx = api.context;
  72895. if ( ctx.length && api.length ) {
  72896. var row = ctx[0].aoData[ api[0] ];
  72897. if ( row._details ) {
  72898. row._detailsShow = show;
  72899. if ( show ) {
  72900. row._details.insertAfter( row.nTr );
  72901. }
  72902. else {
  72903. row._details.detach();
  72904. }
  72905. __details_events( ctx[0] );
  72906. }
  72907. }
  72908. };
  72909. var __details_events = function ( settings )
  72910. {
  72911. var api = new _Api( settings );
  72912. var namespace = '.dt.DT_details';
  72913. var drawEvent = 'draw'+namespace;
  72914. var colvisEvent = 'column-visibility'+namespace;
  72915. var destroyEvent = 'destroy'+namespace;
  72916. var data = settings.aoData;
  72917. api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
  72918. if ( _pluck( data, '_details' ).length > 0 ) {
  72919. // On each draw, insert the required elements into the document
  72920. api.on( drawEvent, function ( e, ctx ) {
  72921. if ( settings !== ctx ) {
  72922. return;
  72923. }
  72924. api.rows( {page:'current'} ).eq(0).each( function (idx) {
  72925. // Internal data grab
  72926. var row = data[ idx ];
  72927. if ( row._detailsShow ) {
  72928. row._details.insertAfter( row.nTr );
  72929. }
  72930. } );
  72931. } );
  72932. // Column visibility change - update the colspan
  72933. api.on( colvisEvent, function ( e, ctx, idx, vis ) {
  72934. if ( settings !== ctx ) {
  72935. return;
  72936. }
  72937. // Update the colspan for the details rows (note, only if it already has
  72938. // a colspan)
  72939. var row, visible = _fnVisbleColumns( ctx );
  72940. for ( var i=0, ien=data.length ; i<ien ; i++ ) {
  72941. row = data[i];
  72942. if ( row._details ) {
  72943. row._details.children('td[colspan]').attr('colspan', visible );
  72944. }
  72945. }
  72946. } );
  72947. // Table destroyed - nuke any child rows
  72948. api.on( destroyEvent, function ( e, ctx ) {
  72949. if ( settings !== ctx ) {
  72950. return;
  72951. }
  72952. for ( var i=0, ien=data.length ; i<ien ; i++ ) {
  72953. if ( data[i]._details ) {
  72954. __details_remove( api, i );
  72955. }
  72956. }
  72957. } );
  72958. }
  72959. };
  72960. // Strings for the method names to help minification
  72961. var _emp = '';
  72962. var _child_obj = _emp+'row().child';
  72963. var _child_mth = _child_obj+'()';
  72964. // data can be:
  72965. // tr
  72966. // string
  72967. // jQuery or array of any of the above
  72968. _api_register( _child_mth, function ( data, klass ) {
  72969. var ctx = this.context;
  72970. if ( data === undefined ) {
  72971. // get
  72972. return ctx.length && this.length ?
  72973. ctx[0].aoData[ this[0] ]._details :
  72974. undefined;
  72975. }
  72976. else if ( data === true ) {
  72977. // show
  72978. this.child.show();
  72979. }
  72980. else if ( data === false ) {
  72981. // remove
  72982. __details_remove( this );
  72983. }
  72984. else if ( ctx.length && this.length ) {
  72985. // set
  72986. __details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
  72987. }
  72988. return this;
  72989. } );
  72990. _api_register( [
  72991. _child_obj+'.show()',
  72992. _child_mth+'.show()' // only when `child()` was called with parameters (without
  72993. ], function ( show ) { // it returns an object and this method is not executed)
  72994. __details_display( this, true );
  72995. return this;
  72996. } );
  72997. _api_register( [
  72998. _child_obj+'.hide()',
  72999. _child_mth+'.hide()' // only when `child()` was called with parameters (without
  73000. ], function () { // it returns an object and this method is not executed)
  73001. __details_display( this, false );
  73002. return this;
  73003. } );
  73004. _api_register( [
  73005. _child_obj+'.remove()',
  73006. _child_mth+'.remove()' // only when `child()` was called with parameters (without
  73007. ], function () { // it returns an object and this method is not executed)
  73008. __details_remove( this );
  73009. return this;
  73010. } );
  73011. _api_register( _child_obj+'.isShown()', function () {
  73012. var ctx = this.context;
  73013. if ( ctx.length && this.length ) {
  73014. // _detailsShown as false or undefined will fall through to return false
  73015. return ctx[0].aoData[ this[0] ]._detailsShow || false;
  73016. }
  73017. return false;
  73018. } );
  73019. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  73020. * Columns
  73021. *
  73022. * {integer} - column index (>=0 count from left, <0 count from right)
  73023. * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right)
  73024. * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right)
  73025. * "{string}:name" - column name
  73026. * "{string}" - jQuery selector on column header nodes
  73027. *
  73028. */
  73029. // can be an array of these items, comma separated list, or an array of comma
  73030. // separated lists
  73031. var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;
  73032. // r1 and r2 are redundant - but it means that the parameters match for the
  73033. // iterator callback in columns().data()
  73034. var __columnData = function ( settings, column, r1, r2, rows ) {
  73035. var a = [];
  73036. for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
  73037. a.push( _fnGetCellData( settings, rows[row], column ) );
  73038. }
  73039. return a;
  73040. };
  73041. var __column_selector = function ( settings, selector, opts )
  73042. {
  73043. var
  73044. columns = settings.aoColumns,
  73045. names = _pluck( columns, 'sName' ),
  73046. nodes = _pluck( columns, 'nTh' );
  73047. var run = function ( s ) {
  73048. var selInt = _intVal( s );
  73049. // Selector - all
  73050. if ( s === '' ) {
  73051. return _range( columns.length );
  73052. }
  73053. // Selector - index
  73054. if ( selInt !== null ) {
  73055. return [ selInt >= 0 ?
  73056. selInt : // Count from left
  73057. columns.length + selInt // Count from right (+ because its a negative value)
  73058. ];
  73059. }
  73060. // Selector = function
  73061. if ( typeof s === 'function' ) {
  73062. var rows = _selector_row_indexes( settings, opts );
  73063. return $.map( columns, function (col, idx) {
  73064. return s(
  73065. idx,
  73066. __columnData( settings, idx, 0, 0, rows ),
  73067. nodes[ idx ]
  73068. ) ? idx : null;
  73069. } );
  73070. }
  73071. // jQuery or string selector
  73072. var match = typeof s === 'string' ?
  73073. s.match( __re_column_selector ) :
  73074. '';
  73075. if ( match ) {
  73076. switch( match[2] ) {
  73077. case 'visIdx':
  73078. case 'visible':
  73079. var idx = parseInt( match[1], 10 );
  73080. // Visible index given, convert to column index
  73081. if ( idx < 0 ) {
  73082. // Counting from the right
  73083. var visColumns = $.map( columns, function (col,i) {
  73084. return col.bVisible ? i : null;
  73085. } );
  73086. return [ visColumns[ visColumns.length + idx ] ];
  73087. }
  73088. // Counting from the left
  73089. return [ _fnVisibleToColumnIndex( settings, idx ) ];
  73090. case 'name':
  73091. // match by name. `names` is column index complete and in order
  73092. return $.map( names, function (name, i) {
  73093. return name === match[1] ? i : null;
  73094. } );
  73095. default:
  73096. return [];
  73097. }
  73098. }
  73099. // Cell in the table body
  73100. if ( s.nodeName && s._DT_CellIndex ) {
  73101. return [ s._DT_CellIndex.column ];
  73102. }
  73103. // jQuery selector on the TH elements for the columns
  73104. var jqResult = $( nodes )
  73105. .filter( s )
  73106. .map( function () {
  73107. return $.inArray( this, nodes ); // `nodes` is column index complete and in order
  73108. } )
  73109. .toArray();
  73110. if ( jqResult.length || ! s.nodeName ) {
  73111. return jqResult;
  73112. }
  73113. // Otherwise a node which might have a `dt-column` data attribute, or be
  73114. // a child or such an element
  73115. var host = $(s).closest('*[data-dt-column]');
  73116. return host.length ?
  73117. [ host.data('dt-column') ] :
  73118. [];
  73119. };
  73120. return _selector_run( 'column', selector, run, settings, opts );
  73121. };
  73122. var __setColumnVis = function ( settings, column, vis ) {
  73123. var
  73124. cols = settings.aoColumns,
  73125. col = cols[ column ],
  73126. data = settings.aoData,
  73127. row, cells, i, ien, tr;
  73128. // Get
  73129. if ( vis === undefined ) {
  73130. return col.bVisible;
  73131. }
  73132. // Set
  73133. // No change
  73134. if ( col.bVisible === vis ) {
  73135. return;
  73136. }
  73137. if ( vis ) {
  73138. // Insert column
  73139. // Need to decide if we should use appendChild or insertBefore
  73140. var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
  73141. for ( i=0, ien=data.length ; i<ien ; i++ ) {
  73142. tr = data[i].nTr;
  73143. cells = data[i].anCells;
  73144. if ( tr ) {
  73145. // insertBefore can act like appendChild if 2nd arg is null
  73146. tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
  73147. }
  73148. }
  73149. }
  73150. else {
  73151. // Remove column
  73152. $( _pluck( settings.aoData, 'anCells', column ) ).detach();
  73153. }
  73154. // Common actions
  73155. col.bVisible = vis;
  73156. _fnDrawHead( settings, settings.aoHeader );
  73157. _fnDrawHead( settings, settings.aoFooter );
  73158. _fnSaveState( settings );
  73159. };
  73160. _api_register( 'columns()', function ( selector, opts ) {
  73161. // argument shifting
  73162. if ( selector === undefined ) {
  73163. selector = '';
  73164. }
  73165. else if ( $.isPlainObject( selector ) ) {
  73166. opts = selector;
  73167. selector = '';
  73168. }
  73169. opts = _selector_opts( opts );
  73170. var inst = this.iterator( 'table', function ( settings ) {
  73171. return __column_selector( settings, selector, opts );
  73172. }, 1 );
  73173. // Want argument shifting here and in _row_selector?
  73174. inst.selector.cols = selector;
  73175. inst.selector.opts = opts;
  73176. return inst;
  73177. } );
  73178. _api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
  73179. return this.iterator( 'column', function ( settings, column ) {
  73180. return settings.aoColumns[column].nTh;
  73181. }, 1 );
  73182. } );
  73183. _api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
  73184. return this.iterator( 'column', function ( settings, column ) {
  73185. return settings.aoColumns[column].nTf;
  73186. }, 1 );
  73187. } );
  73188. _api_registerPlural( 'columns().data()', 'column().data()', function () {
  73189. return this.iterator( 'column-rows', __columnData, 1 );
  73190. } );
  73191. _api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
  73192. return this.iterator( 'column', function ( settings, column ) {
  73193. return settings.aoColumns[column].mData;
  73194. }, 1 );
  73195. } );
  73196. _api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
  73197. return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
  73198. return _pluck_order( settings.aoData, rows,
  73199. type === 'search' ? '_aFilterData' : '_aSortData', column
  73200. );
  73201. }, 1 );
  73202. } );
  73203. _api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
  73204. return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
  73205. return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
  73206. }, 1 );
  73207. } );
  73208. _api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
  73209. var ret = this.iterator( 'column', function ( settings, column ) {
  73210. if ( vis === undefined ) {
  73211. return settings.aoColumns[ column ].bVisible;
  73212. } // else
  73213. __setColumnVis( settings, column, vis );
  73214. } );
  73215. // Group the column visibility changes
  73216. if ( vis !== undefined ) {
  73217. // Second loop once the first is done for events
  73218. this.iterator( 'column', function ( settings, column ) {
  73219. _fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );
  73220. } );
  73221. if ( calc === undefined || calc ) {
  73222. this.columns.adjust();
  73223. }
  73224. }
  73225. return ret;
  73226. } );
  73227. _api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
  73228. return this.iterator( 'column', function ( settings, column ) {
  73229. return type === 'visible' ?
  73230. _fnColumnIndexToVisible( settings, column ) :
  73231. column;
  73232. }, 1 );
  73233. } );
  73234. _api_register( 'columns.adjust()', function () {
  73235. return this.iterator( 'table', function ( settings ) {
  73236. _fnAdjustColumnSizing( settings );
  73237. }, 1 );
  73238. } );
  73239. _api_register( 'column.index()', function ( type, idx ) {
  73240. if ( this.context.length !== 0 ) {
  73241. var ctx = this.context[0];
  73242. if ( type === 'fromVisible' || type === 'toData' ) {
  73243. return _fnVisibleToColumnIndex( ctx, idx );
  73244. }
  73245. else if ( type === 'fromData' || type === 'toVisible' ) {
  73246. return _fnColumnIndexToVisible( ctx, idx );
  73247. }
  73248. }
  73249. } );
  73250. _api_register( 'column()', function ( selector, opts ) {
  73251. return _selector_first( this.columns( selector, opts ) );
  73252. } );
  73253. var __cell_selector = function ( settings, selector, opts )
  73254. {
  73255. var data = settings.aoData;
  73256. var rows = _selector_row_indexes( settings, opts );
  73257. var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
  73258. var allCells = $( [].concat.apply([], cells) );
  73259. var row;
  73260. var columns = settings.aoColumns.length;
  73261. var a, i, ien, j, o, host;
  73262. var run = function ( s ) {
  73263. var fnSelector = typeof s === 'function';
  73264. if ( s === null || s === undefined || fnSelector ) {
  73265. // All cells and function selectors
  73266. a = [];
  73267. for ( i=0, ien=rows.length ; i<ien ; i++ ) {
  73268. row = rows[i];
  73269. for ( j=0 ; j<columns ; j++ ) {
  73270. o = {
  73271. row: row,
  73272. column: j
  73273. };
  73274. if ( fnSelector ) {
  73275. // Selector - function
  73276. host = data[ row ];
  73277. if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
  73278. a.push( o );
  73279. }
  73280. }
  73281. else {
  73282. // Selector - all
  73283. a.push( o );
  73284. }
  73285. }
  73286. }
  73287. return a;
  73288. }
  73289. // Selector - index
  73290. if ( $.isPlainObject( s ) ) {
  73291. return [s];
  73292. }
  73293. // Selector - jQuery filtered cells
  73294. var jqResult = allCells
  73295. .filter( s )
  73296. .map( function (i, el) {
  73297. return { // use a new object, in case someone changes the values
  73298. row: el._DT_CellIndex.row,
  73299. column: el._DT_CellIndex.column
  73300. };
  73301. } )
  73302. .toArray();
  73303. if ( jqResult.length || ! s.nodeName ) {
  73304. return jqResult;
  73305. }
  73306. // Otherwise the selector is a node, and there is one last option - the
  73307. // element might be a child of an element which has dt-row and dt-column
  73308. // data attributes
  73309. host = $(s).closest('*[data-dt-row]');
  73310. return host.length ?
  73311. [ {
  73312. row: host.data('dt-row'),
  73313. column: host.data('dt-column')
  73314. } ] :
  73315. [];
  73316. };
  73317. return _selector_run( 'cell', selector, run, settings, opts );
  73318. };
  73319. _api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
  73320. // Argument shifting
  73321. if ( $.isPlainObject( rowSelector ) ) {
  73322. // Indexes
  73323. if ( rowSelector.row === undefined ) {
  73324. // Selector options in first parameter
  73325. opts = rowSelector;
  73326. rowSelector = null;
  73327. }
  73328. else {
  73329. // Cell index objects in first parameter
  73330. opts = columnSelector;
  73331. columnSelector = null;
  73332. }
  73333. }
  73334. if ( $.isPlainObject( columnSelector ) ) {
  73335. opts = columnSelector;
  73336. columnSelector = null;
  73337. }
  73338. // Cell selector
  73339. if ( columnSelector === null || columnSelector === undefined ) {
  73340. return this.iterator( 'table', function ( settings ) {
  73341. return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
  73342. } );
  73343. }
  73344. // Row + column selector
  73345. var columns = this.columns( columnSelector, opts );
  73346. var rows = this.rows( rowSelector, opts );
  73347. var a, i, ien, j, jen;
  73348. var cells = this.iterator( 'table', function ( settings, idx ) {
  73349. a = [];
  73350. for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
  73351. for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
  73352. a.push( {
  73353. row: rows[idx][i],
  73354. column: columns[idx][j]
  73355. } );
  73356. }
  73357. }
  73358. return a;
  73359. }, 1 );
  73360. $.extend( cells.selector, {
  73361. cols: columnSelector,
  73362. rows: rowSelector,
  73363. opts: opts
  73364. } );
  73365. return cells;
  73366. } );
  73367. _api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
  73368. return this.iterator( 'cell', function ( settings, row, column ) {
  73369. var data = settings.aoData[ row ];
  73370. return data && data.anCells ?
  73371. data.anCells[ column ] :
  73372. undefined;
  73373. }, 1 );
  73374. } );
  73375. _api_register( 'cells().data()', function () {
  73376. return this.iterator( 'cell', function ( settings, row, column ) {
  73377. return _fnGetCellData( settings, row, column );
  73378. }, 1 );
  73379. } );
  73380. _api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
  73381. type = type === 'search' ? '_aFilterData' : '_aSortData';
  73382. return this.iterator( 'cell', function ( settings, row, column ) {
  73383. return settings.aoData[ row ][ type ][ column ];
  73384. }, 1 );
  73385. } );
  73386. _api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
  73387. return this.iterator( 'cell', function ( settings, row, column ) {
  73388. return _fnGetCellData( settings, row, column, type );
  73389. }, 1 );
  73390. } );
  73391. _api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
  73392. return this.iterator( 'cell', function ( settings, row, column ) {
  73393. return {
  73394. row: row,
  73395. column: column,
  73396. columnVisible: _fnColumnIndexToVisible( settings, column )
  73397. };
  73398. }, 1 );
  73399. } );
  73400. _api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
  73401. return this.iterator( 'cell', function ( settings, row, column ) {
  73402. _fnInvalidate( settings, row, src, column );
  73403. } );
  73404. } );
  73405. _api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
  73406. return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
  73407. } );
  73408. _api_register( 'cell().data()', function ( data ) {
  73409. var ctx = this.context;
  73410. var cell = this[0];
  73411. if ( data === undefined ) {
  73412. // Get
  73413. return ctx.length && cell.length ?
  73414. _fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
  73415. undefined;
  73416. }
  73417. // Set
  73418. _fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
  73419. _fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
  73420. return this;
  73421. } );
  73422. /**
  73423. * Get current ordering (sorting) that has been applied to the table.
  73424. *
  73425. * @returns {array} 2D array containing the sorting information for the first
  73426. * table in the current context. Each element in the parent array represents
  73427. * a column being sorted upon (i.e. multi-sorting with two columns would have
  73428. * 2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
  73429. * the column index that the sorting condition applies to, the second is the
  73430. * direction of the sort (`desc` or `asc`) and, optionally, the third is the
  73431. * index of the sorting order from the `column.sorting` initialisation array.
  73432. *//**
  73433. * Set the ordering for the table.
  73434. *
  73435. * @param {integer} order Column index to sort upon.
  73436. * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
  73437. * @returns {DataTables.Api} this
  73438. *//**
  73439. * Set the ordering for the table.
  73440. *
  73441. * @param {array} order 1D array of sorting information to be applied.
  73442. * @param {array} [...] Optional additional sorting conditions
  73443. * @returns {DataTables.Api} this
  73444. *//**
  73445. * Set the ordering for the table.
  73446. *
  73447. * @param {array} order 2D array of sorting information to be applied.
  73448. * @returns {DataTables.Api} this
  73449. */
  73450. _api_register( 'order()', function ( order, dir ) {
  73451. var ctx = this.context;
  73452. if ( order === undefined ) {
  73453. // get
  73454. return ctx.length !== 0 ?
  73455. ctx[0].aaSorting :
  73456. undefined;
  73457. }
  73458. // set
  73459. if ( typeof order === 'number' ) {
  73460. // Simple column / direction passed in
  73461. order = [ [ order, dir ] ];
  73462. }
  73463. else if ( order.length && ! $.isArray( order[0] ) ) {
  73464. // Arguments passed in (list of 1D arrays)
  73465. order = Array.prototype.slice.call( arguments );
  73466. }
  73467. // otherwise a 2D array was passed in
  73468. return this.iterator( 'table', function ( settings ) {
  73469. settings.aaSorting = order.slice();
  73470. } );
  73471. } );
  73472. /**
  73473. * Attach a sort listener to an element for a given column
  73474. *
  73475. * @param {node|jQuery|string} node Identifier for the element(s) to attach the
  73476. * listener to. This can take the form of a single DOM node, a jQuery
  73477. * collection of nodes or a jQuery selector which will identify the node(s).
  73478. * @param {integer} column the column that a click on this node will sort on
  73479. * @param {function} [callback] callback function when sort is run
  73480. * @returns {DataTables.Api} this
  73481. */
  73482. _api_register( 'order.listener()', function ( node, column, callback ) {
  73483. return this.iterator( 'table', function ( settings ) {
  73484. _fnSortAttachListener( settings, node, column, callback );
  73485. } );
  73486. } );
  73487. _api_register( 'order.fixed()', function ( set ) {
  73488. if ( ! set ) {
  73489. var ctx = this.context;
  73490. var fixed = ctx.length ?
  73491. ctx[0].aaSortingFixed :
  73492. undefined;
  73493. return $.isArray( fixed ) ?
  73494. { pre: fixed } :
  73495. fixed;
  73496. }
  73497. return this.iterator( 'table', function ( settings ) {
  73498. settings.aaSortingFixed = $.extend( true, {}, set );
  73499. } );
  73500. } );
  73501. // Order by the selected column(s)
  73502. _api_register( [
  73503. 'columns().order()',
  73504. 'column().order()'
  73505. ], function ( dir ) {
  73506. var that = this;
  73507. return this.iterator( 'table', function ( settings, i ) {
  73508. var sort = [];
  73509. $.each( that[i], function (j, col) {
  73510. sort.push( [ col, dir ] );
  73511. } );
  73512. settings.aaSorting = sort;
  73513. } );
  73514. } );
  73515. _api_register( 'search()', function ( input, regex, smart, caseInsen ) {
  73516. var ctx = this.context;
  73517. if ( input === undefined ) {
  73518. // get
  73519. return ctx.length !== 0 ?
  73520. ctx[0].oPreviousSearch.sSearch :
  73521. undefined;
  73522. }
  73523. // set
  73524. return this.iterator( 'table', function ( settings ) {
  73525. if ( ! settings.oFeatures.bFilter ) {
  73526. return;
  73527. }
  73528. _fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
  73529. "sSearch": input+"",
  73530. "bRegex": regex === null ? false : regex,
  73531. "bSmart": smart === null ? true : smart,
  73532. "bCaseInsensitive": caseInsen === null ? true : caseInsen
  73533. } ), 1 );
  73534. } );
  73535. } );
  73536. _api_registerPlural(
  73537. 'columns().search()',
  73538. 'column().search()',
  73539. function ( input, regex, smart, caseInsen ) {
  73540. return this.iterator( 'column', function ( settings, column ) {
  73541. var preSearch = settings.aoPreSearchCols;
  73542. if ( input === undefined ) {
  73543. // get
  73544. return preSearch[ column ].sSearch;
  73545. }
  73546. // set
  73547. if ( ! settings.oFeatures.bFilter ) {
  73548. return;
  73549. }
  73550. $.extend( preSearch[ column ], {
  73551. "sSearch": input+"",
  73552. "bRegex": regex === null ? false : regex,
  73553. "bSmart": smart === null ? true : smart,
  73554. "bCaseInsensitive": caseInsen === null ? true : caseInsen
  73555. } );
  73556. _fnFilterComplete( settings, settings.oPreviousSearch, 1 );
  73557. } );
  73558. }
  73559. );
  73560. /*
  73561. * State API methods
  73562. */
  73563. _api_register( 'state()', function () {
  73564. return this.context.length ?
  73565. this.context[0].oSavedState :
  73566. null;
  73567. } );
  73568. _api_register( 'state.clear()', function () {
  73569. return this.iterator( 'table', function ( settings ) {
  73570. // Save an empty object
  73571. settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
  73572. } );
  73573. } );
  73574. _api_register( 'state.loaded()', function () {
  73575. return this.context.length ?
  73576. this.context[0].oLoadedState :
  73577. null;
  73578. } );
  73579. _api_register( 'state.save()', function () {
  73580. return this.iterator( 'table', function ( settings ) {
  73581. _fnSaveState( settings );
  73582. } );
  73583. } );
  73584. /**
  73585. * Provide a common method for plug-ins to check the version of DataTables being
  73586. * used, in order to ensure compatibility.
  73587. *
  73588. * @param {string} version Version string to check for, in the format "X.Y.Z".
  73589. * Note that the formats "X" and "X.Y" are also acceptable.
  73590. * @returns {boolean} true if this version of DataTables is greater or equal to
  73591. * the required version, or false if this version of DataTales is not
  73592. * suitable
  73593. * @static
  73594. * @dtopt API-Static
  73595. *
  73596. * @example
  73597. * alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
  73598. */
  73599. DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
  73600. {
  73601. var aThis = DataTable.version.split('.');
  73602. var aThat = version.split('.');
  73603. var iThis, iThat;
  73604. for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
  73605. iThis = parseInt( aThis[i], 10 ) || 0;
  73606. iThat = parseInt( aThat[i], 10 ) || 0;
  73607. // Parts are the same, keep comparing
  73608. if (iThis === iThat) {
  73609. continue;
  73610. }
  73611. // Parts are different, return immediately
  73612. return iThis > iThat;
  73613. }
  73614. return true;
  73615. };
  73616. /**
  73617. * Check if a `<table>` node is a DataTable table already or not.
  73618. *
  73619. * @param {node|jquery|string} table Table node, jQuery object or jQuery
  73620. * selector for the table to test. Note that if more than more than one
  73621. * table is passed on, only the first will be checked
  73622. * @returns {boolean} true the table given is a DataTable, or false otherwise
  73623. * @static
  73624. * @dtopt API-Static
  73625. *
  73626. * @example
  73627. * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
  73628. * $('#example').dataTable();
  73629. * }
  73630. */
  73631. DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
  73632. {
  73633. var t = $(table).get(0);
  73634. var is = false;
  73635. if ( table instanceof DataTable.Api ) {
  73636. return true;
  73637. }
  73638. $.each( DataTable.settings, function (i, o) {
  73639. var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
  73640. var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
  73641. if ( o.nTable === t || head === t || foot === t ) {
  73642. is = true;
  73643. }
  73644. } );
  73645. return is;
  73646. };
  73647. /**
  73648. * Get all DataTable tables that have been initialised - optionally you can
  73649. * select to get only currently visible tables.
  73650. *
  73651. * @param {boolean} [visible=false] Flag to indicate if you want all (default)
  73652. * or visible tables only.
  73653. * @returns {array} Array of `table` nodes (not DataTable instances) which are
  73654. * DataTables
  73655. * @static
  73656. * @dtopt API-Static
  73657. *
  73658. * @example
  73659. * $.each( $.fn.dataTable.tables(true), function () {
  73660. * $(table).DataTable().columns.adjust();
  73661. * } );
  73662. */
  73663. DataTable.tables = DataTable.fnTables = function ( visible )
  73664. {
  73665. var api = false;
  73666. if ( $.isPlainObject( visible ) ) {
  73667. api = visible.api;
  73668. visible = visible.visible;
  73669. }
  73670. var a = $.map( DataTable.settings, function (o) {
  73671. if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
  73672. return o.nTable;
  73673. }
  73674. } );
  73675. return api ?
  73676. new _Api( a ) :
  73677. a;
  73678. };
  73679. /**
  73680. * Convert from camel case parameters to Hungarian notation. This is made public
  73681. * for the extensions to provide the same ability as DataTables core to accept
  73682. * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
  73683. * parameters.
  73684. *
  73685. * @param {object} src The model object which holds all parameters that can be
  73686. * mapped.
  73687. * @param {object} user The object to convert from camel case to Hungarian.
  73688. * @param {boolean} force When set to `true`, properties which already have a
  73689. * Hungarian value in the `user` object will be overwritten. Otherwise they
  73690. * won't be.
  73691. */
  73692. DataTable.camelToHungarian = _fnCamelToHungarian;
  73693. /**
  73694. *
  73695. */
  73696. _api_register( '$()', function ( selector, opts ) {
  73697. var
  73698. rows = this.rows( opts ).nodes(), // Get all rows
  73699. jqRows = $(rows);
  73700. return $( [].concat(
  73701. jqRows.filter( selector ).toArray(),
  73702. jqRows.find( selector ).toArray()
  73703. ) );
  73704. } );
  73705. // jQuery functions to operate on the tables
  73706. $.each( [ 'on', 'one', 'off' ], function (i, key) {
  73707. _api_register( key+'()', function ( /* event, handler */ ) {
  73708. var args = Array.prototype.slice.call(arguments);
  73709. // Add the `dt` namespace automatically if it isn't already present
  73710. args[0] = $.map( args[0].split( /\s/ ), function ( e ) {
  73711. return ! e.match(/\.dt\b/) ?
  73712. e+'.dt' :
  73713. e;
  73714. } ).join( ' ' );
  73715. var inst = $( this.tables().nodes() );
  73716. inst[key].apply( inst, args );
  73717. return this;
  73718. } );
  73719. } );
  73720. _api_register( 'clear()', function () {
  73721. return this.iterator( 'table', function ( settings ) {
  73722. _fnClearTable( settings );
  73723. } );
  73724. } );
  73725. _api_register( 'settings()', function () {
  73726. return new _Api( this.context, this.context );
  73727. } );
  73728. _api_register( 'init()', function () {
  73729. var ctx = this.context;
  73730. return ctx.length ? ctx[0].oInit : null;
  73731. } );
  73732. _api_register( 'data()', function () {
  73733. return this.iterator( 'table', function ( settings ) {
  73734. return _pluck( settings.aoData, '_aData' );
  73735. } ).flatten();
  73736. } );
  73737. _api_register( 'destroy()', function ( remove ) {
  73738. remove = remove || false;
  73739. return this.iterator( 'table', function ( settings ) {
  73740. var orig = settings.nTableWrapper.parentNode;
  73741. var classes = settings.oClasses;
  73742. var table = settings.nTable;
  73743. var tbody = settings.nTBody;
  73744. var thead = settings.nTHead;
  73745. var tfoot = settings.nTFoot;
  73746. var jqTable = $(table);
  73747. var jqTbody = $(tbody);
  73748. var jqWrapper = $(settings.nTableWrapper);
  73749. var rows = $.map( settings.aoData, function (r) { return r.nTr; } );
  73750. var i, ien;
  73751. // Flag to note that the table is currently being destroyed - no action
  73752. // should be taken
  73753. settings.bDestroying = true;
  73754. // Fire off the destroy callbacks for plug-ins etc
  73755. _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
  73756. // If not being removed from the document, make all columns visible
  73757. if ( ! remove ) {
  73758. new _Api( settings ).columns().visible( true );
  73759. }
  73760. // Blitz all `DT` namespaced events (these are internal events, the
  73761. // lowercase, `dt` events are user subscribed and they are responsible
  73762. // for removing them
  73763. jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');
  73764. $(window).off('.DT-'+settings.sInstance);
  73765. // When scrolling we had to break the table up - restore it
  73766. if ( table != thead.parentNode ) {
  73767. jqTable.children('thead').detach();
  73768. jqTable.append( thead );
  73769. }
  73770. if ( tfoot && table != tfoot.parentNode ) {
  73771. jqTable.children('tfoot').detach();
  73772. jqTable.append( tfoot );
  73773. }
  73774. settings.aaSorting = [];
  73775. settings.aaSortingFixed = [];
  73776. _fnSortingClasses( settings );
  73777. $( rows ).removeClass( settings.asStripeClasses.join(' ') );
  73778. $('th, td', thead).removeClass( classes.sSortable+' '+
  73779. classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
  73780. );
  73781. // Add the TR elements back into the table in their original order
  73782. jqTbody.children().detach();
  73783. jqTbody.append( rows );
  73784. // Remove the DataTables generated nodes, events and classes
  73785. var removedMethod = remove ? 'remove' : 'detach';
  73786. jqTable[ removedMethod ]();
  73787. jqWrapper[ removedMethod ]();
  73788. // If we need to reattach the table to the document
  73789. if ( ! remove && orig ) {
  73790. // insertBefore acts like appendChild if !arg[1]
  73791. orig.insertBefore( table, settings.nTableReinsertBefore );
  73792. // Restore the width of the original table - was read from the style property,
  73793. // so we can restore directly to that
  73794. jqTable
  73795. .css( 'width', settings.sDestroyWidth )
  73796. .removeClass( classes.sTable );
  73797. // If the were originally stripe classes - then we add them back here.
  73798. // Note this is not fool proof (for example if not all rows had stripe
  73799. // classes - but it's a good effort without getting carried away
  73800. ien = settings.asDestroyStripes.length;
  73801. if ( ien ) {
  73802. jqTbody.children().each( function (i) {
  73803. $(this).addClass( settings.asDestroyStripes[i % ien] );
  73804. } );
  73805. }
  73806. }
  73807. /* Remove the settings object from the settings array */
  73808. var idx = $.inArray( settings, DataTable.settings );
  73809. if ( idx !== -1 ) {
  73810. DataTable.settings.splice( idx, 1 );
  73811. }
  73812. } );
  73813. } );
  73814. // Add the `every()` method for rows, columns and cells in a compact form
  73815. $.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
  73816. _api_register( type+'s().every()', function ( fn ) {
  73817. var opts = this.selector.opts;
  73818. var api = this;
  73819. return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
  73820. // Rows and columns:
  73821. // arg1 - index
  73822. // arg2 - table counter
  73823. // arg3 - loop counter
  73824. // arg4 - undefined
  73825. // Cells:
  73826. // arg1 - row index
  73827. // arg2 - column index
  73828. // arg3 - table counter
  73829. // arg4 - loop counter
  73830. fn.call(
  73831. api[ type ](
  73832. arg1,
  73833. type==='cell' ? arg2 : opts,
  73834. type==='cell' ? opts : undefined
  73835. ),
  73836. arg1, arg2, arg3, arg4
  73837. );
  73838. } );
  73839. } );
  73840. } );
  73841. // i18n method for extensions to be able to use the language object from the
  73842. // DataTable
  73843. _api_register( 'i18n()', function ( token, def, plural ) {
  73844. var ctx = this.context[0];
  73845. var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
  73846. if ( resolved === undefined ) {
  73847. resolved = def;
  73848. }
  73849. if ( plural !== undefined && $.isPlainObject( resolved ) ) {
  73850. resolved = resolved[ plural ] !== undefined ?
  73851. resolved[ plural ] :
  73852. resolved._;
  73853. }
  73854. return resolved.replace( '%d', plural ); // nb: plural might be undefined,
  73855. } );
  73856. /**
  73857. * Version string for plug-ins to check compatibility. Allowed format is
  73858. * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
  73859. * only for non-release builds. See http://semver.org/ for more information.
  73860. * @member
  73861. * @type string
  73862. * @default Version number
  73863. */
  73864. DataTable.version = "1.10.16";
  73865. /**
  73866. * Private data store, containing all of the settings objects that are
  73867. * created for the tables on a given page.
  73868. *
  73869. * Note that the `DataTable.settings` object is aliased to
  73870. * `jQuery.fn.dataTableExt` through which it may be accessed and
  73871. * manipulated, or `jQuery.fn.dataTable.settings`.
  73872. * @member
  73873. * @type array
  73874. * @default []
  73875. * @private
  73876. */
  73877. DataTable.settings = [];
  73878. /**
  73879. * Object models container, for the various models that DataTables has
  73880. * available to it. These models define the objects that are used to hold
  73881. * the active state and configuration of the table.
  73882. * @namespace
  73883. */
  73884. DataTable.models = {};
  73885. /**
  73886. * Template object for the way in which DataTables holds information about
  73887. * search information for the global filter and individual column filters.
  73888. * @namespace
  73889. */
  73890. DataTable.models.oSearch = {
  73891. /**
  73892. * Flag to indicate if the filtering should be case insensitive or not
  73893. * @type boolean
  73894. * @default true
  73895. */
  73896. "bCaseInsensitive": true,
  73897. /**
  73898. * Applied search term
  73899. * @type string
  73900. * @default <i>Empty string</i>
  73901. */
  73902. "sSearch": "",
  73903. /**
  73904. * Flag to indicate if the search term should be interpreted as a
  73905. * regular expression (true) or not (false) and therefore and special
  73906. * regex characters escaped.
  73907. * @type boolean
  73908. * @default false
  73909. */
  73910. "bRegex": false,
  73911. /**
  73912. * Flag to indicate if DataTables is to use its smart filtering or not.
  73913. * @type boolean
  73914. * @default true
  73915. */
  73916. "bSmart": true
  73917. };
  73918. /**
  73919. * Template object for the way in which DataTables holds information about
  73920. * each individual row. This is the object format used for the settings
  73921. * aoData array.
  73922. * @namespace
  73923. */
  73924. DataTable.models.oRow = {
  73925. /**
  73926. * TR element for the row
  73927. * @type node
  73928. * @default null
  73929. */
  73930. "nTr": null,
  73931. /**
  73932. * Array of TD elements for each row. This is null until the row has been
  73933. * created.
  73934. * @type array nodes
  73935. * @default []
  73936. */
  73937. "anCells": null,
  73938. /**
  73939. * Data object from the original data source for the row. This is either
  73940. * an array if using the traditional form of DataTables, or an object if
  73941. * using mData options. The exact type will depend on the passed in
  73942. * data from the data source, or will be an array if using DOM a data
  73943. * source.
  73944. * @type array|object
  73945. * @default []
  73946. */
  73947. "_aData": [],
  73948. /**
  73949. * Sorting data cache - this array is ostensibly the same length as the
  73950. * number of columns (although each index is generated only as it is
  73951. * needed), and holds the data that is used for sorting each column in the
  73952. * row. We do this cache generation at the start of the sort in order that
  73953. * the formatting of the sort data need be done only once for each cell
  73954. * per sort. This array should not be read from or written to by anything
  73955. * other than the master sorting methods.
  73956. * @type array
  73957. * @default null
  73958. * @private
  73959. */
  73960. "_aSortData": null,
  73961. /**
  73962. * Per cell filtering data cache. As per the sort data cache, used to
  73963. * increase the performance of the filtering in DataTables
  73964. * @type array
  73965. * @default null
  73966. * @private
  73967. */
  73968. "_aFilterData": null,
  73969. /**
  73970. * Filtering data cache. This is the same as the cell filtering cache, but
  73971. * in this case a string rather than an array. This is easily computed with
  73972. * a join on `_aFilterData`, but is provided as a cache so the join isn't
  73973. * needed on every search (memory traded for performance)
  73974. * @type array
  73975. * @default null
  73976. * @private
  73977. */
  73978. "_sFilterRow": null,
  73979. /**
  73980. * Cache of the class name that DataTables has applied to the row, so we
  73981. * can quickly look at this variable rather than needing to do a DOM check
  73982. * on className for the nTr property.
  73983. * @type string
  73984. * @default <i>Empty string</i>
  73985. * @private
  73986. */
  73987. "_sRowStripe": "",
  73988. /**
  73989. * Denote if the original data source was from the DOM, or the data source
  73990. * object. This is used for invalidating data, so DataTables can
  73991. * automatically read data from the original source, unless uninstructed
  73992. * otherwise.
  73993. * @type string
  73994. * @default null
  73995. * @private
  73996. */
  73997. "src": null,
  73998. /**
  73999. * Index in the aoData array. This saves an indexOf lookup when we have the
  74000. * object, but want to know the index
  74001. * @type integer
  74002. * @default -1
  74003. * @private
  74004. */
  74005. "idx": -1
  74006. };
  74007. /**
  74008. * Template object for the column information object in DataTables. This object
  74009. * is held in the settings aoColumns array and contains all the information that
  74010. * DataTables needs about each individual column.
  74011. *
  74012. * Note that this object is related to {@link DataTable.defaults.column}
  74013. * but this one is the internal data store for DataTables's cache of columns.
  74014. * It should NOT be manipulated outside of DataTables. Any configuration should
  74015. * be done through the initialisation options.
  74016. * @namespace
  74017. */
  74018. DataTable.models.oColumn = {
  74019. /**
  74020. * Column index. This could be worked out on-the-fly with $.inArray, but it
  74021. * is faster to just hold it as a variable
  74022. * @type integer
  74023. * @default null
  74024. */
  74025. "idx": null,
  74026. /**
  74027. * A list of the columns that sorting should occur on when this column
  74028. * is sorted. That this property is an array allows multi-column sorting
  74029. * to be defined for a column (for example first name / last name columns
  74030. * would benefit from this). The values are integers pointing to the
  74031. * columns to be sorted on (typically it will be a single integer pointing
  74032. * at itself, but that doesn't need to be the case).
  74033. * @type array
  74034. */
  74035. "aDataSort": null,
  74036. /**
  74037. * Define the sorting directions that are applied to the column, in sequence
  74038. * as the column is repeatedly sorted upon - i.e. the first value is used
  74039. * as the sorting direction when the column if first sorted (clicked on).
  74040. * Sort it again (click again) and it will move on to the next index.
  74041. * Repeat until loop.
  74042. * @type array
  74043. */
  74044. "asSorting": null,
  74045. /**
  74046. * Flag to indicate if the column is searchable, and thus should be included
  74047. * in the filtering or not.
  74048. * @type boolean
  74049. */
  74050. "bSearchable": null,
  74051. /**
  74052. * Flag to indicate if the column is sortable or not.
  74053. * @type boolean
  74054. */
  74055. "bSortable": null,
  74056. /**
  74057. * Flag to indicate if the column is currently visible in the table or not
  74058. * @type boolean
  74059. */
  74060. "bVisible": null,
  74061. /**
  74062. * Store for manual type assignment using the `column.type` option. This
  74063. * is held in store so we can manipulate the column's `sType` property.
  74064. * @type string
  74065. * @default null
  74066. * @private
  74067. */
  74068. "_sManualType": null,
  74069. /**
  74070. * Flag to indicate if HTML5 data attributes should be used as the data
  74071. * source for filtering or sorting. True is either are.
  74072. * @type boolean
  74073. * @default false
  74074. * @private
  74075. */
  74076. "_bAttrSrc": false,
  74077. /**
  74078. * Developer definable function that is called whenever a cell is created (Ajax source,
  74079. * etc) or processed for input (DOM source). This can be used as a compliment to mRender
  74080. * allowing you to modify the DOM element (add background colour for example) when the
  74081. * element is available.
  74082. * @type function
  74083. * @param {element} nTd The TD node that has been created
  74084. * @param {*} sData The Data for the cell
  74085. * @param {array|object} oData The data for the whole row
  74086. * @param {int} iRow The row index for the aoData data store
  74087. * @default null
  74088. */
  74089. "fnCreatedCell": null,
  74090. /**
  74091. * Function to get data from a cell in a column. You should <b>never</b>
  74092. * access data directly through _aData internally in DataTables - always use
  74093. * the method attached to this property. It allows mData to function as
  74094. * required. This function is automatically assigned by the column
  74095. * initialisation method
  74096. * @type function
  74097. * @param {array|object} oData The data array/object for the array
  74098. * (i.e. aoData[]._aData)
  74099. * @param {string} sSpecific The specific data type you want to get -
  74100. * 'display', 'type' 'filter' 'sort'
  74101. * @returns {*} The data for the cell from the given row's data
  74102. * @default null
  74103. */
  74104. "fnGetData": null,
  74105. /**
  74106. * Function to set data for a cell in the column. You should <b>never</b>
  74107. * set the data directly to _aData internally in DataTables - always use
  74108. * this method. It allows mData to function as required. This function
  74109. * is automatically assigned by the column initialisation method
  74110. * @type function
  74111. * @param {array|object} oData The data array/object for the array
  74112. * (i.e. aoData[]._aData)
  74113. * @param {*} sValue Value to set
  74114. * @default null
  74115. */
  74116. "fnSetData": null,
  74117. /**
  74118. * Property to read the value for the cells in the column from the data
  74119. * source array / object. If null, then the default content is used, if a
  74120. * function is given then the return from the function is used.
  74121. * @type function|int|string|null
  74122. * @default null
  74123. */
  74124. "mData": null,
  74125. /**
  74126. * Partner property to mData which is used (only when defined) to get
  74127. * the data - i.e. it is basically the same as mData, but without the
  74128. * 'set' option, and also the data fed to it is the result from mData.
  74129. * This is the rendering method to match the data method of mData.
  74130. * @type function|int|string|null
  74131. * @default null
  74132. */
  74133. "mRender": null,
  74134. /**
  74135. * Unique header TH/TD element for this column - this is what the sorting
  74136. * listener is attached to (if sorting is enabled.)
  74137. * @type node
  74138. * @default null
  74139. */
  74140. "nTh": null,
  74141. /**
  74142. * Unique footer TH/TD element for this column (if there is one). Not used
  74143. * in DataTables as such, but can be used for plug-ins to reference the
  74144. * footer for each column.
  74145. * @type node
  74146. * @default null
  74147. */
  74148. "nTf": null,
  74149. /**
  74150. * The class to apply to all TD elements in the table's TBODY for the column
  74151. * @type string
  74152. * @default null
  74153. */
  74154. "sClass": null,
  74155. /**
  74156. * When DataTables calculates the column widths to assign to each column,
  74157. * it finds the longest string in each column and then constructs a
  74158. * temporary table and reads the widths from that. The problem with this
  74159. * is that "mmm" is much wider then "iiii", but the latter is a longer
  74160. * string - thus the calculation can go wrong (doing it properly and putting
  74161. * it into an DOM object and measuring that is horribly(!) slow). Thus as
  74162. * a "work around" we provide this option. It will append its value to the
  74163. * text that is found to be the longest string for the column - i.e. padding.
  74164. * @type string
  74165. */
  74166. "sContentPadding": null,
  74167. /**
  74168. * Allows a default value to be given for a column's data, and will be used
  74169. * whenever a null data source is encountered (this can be because mData
  74170. * is set to null, or because the data source itself is null).
  74171. * @type string
  74172. * @default null
  74173. */
  74174. "sDefaultContent": null,
  74175. /**
  74176. * Name for the column, allowing reference to the column by name as well as
  74177. * by index (needs a lookup to work by name).
  74178. * @type string
  74179. */
  74180. "sName": null,
  74181. /**
  74182. * Custom sorting data type - defines which of the available plug-ins in
  74183. * afnSortData the custom sorting will use - if any is defined.
  74184. * @type string
  74185. * @default std
  74186. */
  74187. "sSortDataType": 'std',
  74188. /**
  74189. * Class to be applied to the header element when sorting on this column
  74190. * @type string
  74191. * @default null
  74192. */
  74193. "sSortingClass": null,
  74194. /**
  74195. * Class to be applied to the header element when sorting on this column -
  74196. * when jQuery UI theming is used.
  74197. * @type string
  74198. * @default null
  74199. */
  74200. "sSortingClassJUI": null,
  74201. /**
  74202. * Title of the column - what is seen in the TH element (nTh).
  74203. * @type string
  74204. */
  74205. "sTitle": null,
  74206. /**
  74207. * Column sorting and filtering type
  74208. * @type string
  74209. * @default null
  74210. */
  74211. "sType": null,
  74212. /**
  74213. * Width of the column
  74214. * @type string
  74215. * @default null
  74216. */
  74217. "sWidth": null,
  74218. /**
  74219. * Width of the column when it was first "encountered"
  74220. * @type string
  74221. * @default null
  74222. */
  74223. "sWidthOrig": null
  74224. };
  74225. /*
  74226. * Developer note: The properties of the object below are given in Hungarian
  74227. * notation, that was used as the interface for DataTables prior to v1.10, however
  74228. * from v1.10 onwards the primary interface is camel case. In order to avoid
  74229. * breaking backwards compatibility utterly with this change, the Hungarian
  74230. * version is still, internally the primary interface, but is is not documented
  74231. * - hence the @name tags in each doc comment. This allows a Javascript function
  74232. * to create a map from Hungarian notation to camel case (going the other direction
  74233. * would require each property to be listed, which would at around 3K to the size
  74234. * of DataTables, while this method is about a 0.5K hit.
  74235. *
  74236. * Ultimately this does pave the way for Hungarian notation to be dropped
  74237. * completely, but that is a massive amount of work and will break current
  74238. * installs (therefore is on-hold until v2).
  74239. */
  74240. /**
  74241. * Initialisation options that can be given to DataTables at initialisation
  74242. * time.
  74243. * @namespace
  74244. */
  74245. DataTable.defaults = {
  74246. /**
  74247. * An array of data to use for the table, passed in at initialisation which
  74248. * will be used in preference to any data which is already in the DOM. This is
  74249. * particularly useful for constructing tables purely in Javascript, for
  74250. * example with a custom Ajax call.
  74251. * @type array
  74252. * @default null
  74253. *
  74254. * @dtopt Option
  74255. * @name DataTable.defaults.data
  74256. *
  74257. * @example
  74258. * // Using a 2D array data source
  74259. * $(document).ready( function () {
  74260. * $('#example').dataTable( {
  74261. * "data": [
  74262. * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
  74263. * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
  74264. * ],
  74265. * "columns": [
  74266. * { "title": "Engine" },
  74267. * { "title": "Browser" },
  74268. * { "title": "Platform" },
  74269. * { "title": "Version" },
  74270. * { "title": "Grade" }
  74271. * ]
  74272. * } );
  74273. * } );
  74274. *
  74275. * @example
  74276. * // Using an array of objects as a data source (`data`)
  74277. * $(document).ready( function () {
  74278. * $('#example').dataTable( {
  74279. * "data": [
  74280. * {
  74281. * "engine": "Trident",
  74282. * "browser": "Internet Explorer 4.0",
  74283. * "platform": "Win 95+",
  74284. * "version": 4,
  74285. * "grade": "X"
  74286. * },
  74287. * {
  74288. * "engine": "Trident",
  74289. * "browser": "Internet Explorer 5.0",
  74290. * "platform": "Win 95+",
  74291. * "version": 5,
  74292. * "grade": "C"
  74293. * }
  74294. * ],
  74295. * "columns": [
  74296. * { "title": "Engine", "data": "engine" },
  74297. * { "title": "Browser", "data": "browser" },
  74298. * { "title": "Platform", "data": "platform" },
  74299. * { "title": "Version", "data": "version" },
  74300. * { "title": "Grade", "data": "grade" }
  74301. * ]
  74302. * } );
  74303. * } );
  74304. */
  74305. "aaData": null,
  74306. /**
  74307. * If ordering is enabled, then DataTables will perform a first pass sort on
  74308. * initialisation. You can define which column(s) the sort is performed
  74309. * upon, and the sorting direction, with this variable. The `sorting` array
  74310. * should contain an array for each column to be sorted initially containing
  74311. * the column's index and a direction string ('asc' or 'desc').
  74312. * @type array
  74313. * @default [[0,'asc']]
  74314. *
  74315. * @dtopt Option
  74316. * @name DataTable.defaults.order
  74317. *
  74318. * @example
  74319. * // Sort by 3rd column first, and then 4th column
  74320. * $(document).ready( function() {
  74321. * $('#example').dataTable( {
  74322. * "order": [[2,'asc'], [3,'desc']]
  74323. * } );
  74324. * } );
  74325. *
  74326. * // No initial sorting
  74327. * $(document).ready( function() {
  74328. * $('#example').dataTable( {
  74329. * "order": []
  74330. * } );
  74331. * } );
  74332. */
  74333. "aaSorting": [[0,'asc']],
  74334. /**
  74335. * This parameter is basically identical to the `sorting` parameter, but
  74336. * cannot be overridden by user interaction with the table. What this means
  74337. * is that you could have a column (visible or hidden) which the sorting
  74338. * will always be forced on first - any sorting after that (from the user)
  74339. * will then be performed as required. This can be useful for grouping rows
  74340. * together.
  74341. * @type array
  74342. * @default null
  74343. *
  74344. * @dtopt Option
  74345. * @name DataTable.defaults.orderFixed
  74346. *
  74347. * @example
  74348. * $(document).ready( function() {
  74349. * $('#example').dataTable( {
  74350. * "orderFixed": [[0,'asc']]
  74351. * } );
  74352. * } )
  74353. */
  74354. "aaSortingFixed": [],
  74355. /**
  74356. * DataTables can be instructed to load data to display in the table from a
  74357. * Ajax source. This option defines how that Ajax call is made and where to.
  74358. *
  74359. * The `ajax` property has three different modes of operation, depending on
  74360. * how it is defined. These are:
  74361. *
  74362. * * `string` - Set the URL from where the data should be loaded from.
  74363. * * `object` - Define properties for `jQuery.ajax`.
  74364. * * `function` - Custom data get function
  74365. *
  74366. * `string`
  74367. * --------
  74368. *
  74369. * As a string, the `ajax` property simply defines the URL from which
  74370. * DataTables will load data.
  74371. *
  74372. * `object`
  74373. * --------
  74374. *
  74375. * As an object, the parameters in the object are passed to
  74376. * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
  74377. * of the Ajax request. DataTables has a number of default parameters which
  74378. * you can override using this option. Please refer to the jQuery
  74379. * documentation for a full description of the options available, although
  74380. * the following parameters provide additional options in DataTables or
  74381. * require special consideration:
  74382. *
  74383. * * `data` - As with jQuery, `data` can be provided as an object, but it
  74384. * can also be used as a function to manipulate the data DataTables sends
  74385. * to the server. The function takes a single parameter, an object of
  74386. * parameters with the values that DataTables has readied for sending. An
  74387. * object may be returned which will be merged into the DataTables
  74388. * defaults, or you can add the items to the object that was passed in and
  74389. * not return anything from the function. This supersedes `fnServerParams`
  74390. * from DataTables 1.9-.
  74391. *
  74392. * * `dataSrc` - By default DataTables will look for the property `data` (or
  74393. * `aaData` for compatibility with DataTables 1.9-) when obtaining data
  74394. * from an Ajax source or for server-side processing - this parameter
  74395. * allows that property to be changed. You can use Javascript dotted
  74396. * object notation to get a data source for multiple levels of nesting, or
  74397. * it my be used as a function. As a function it takes a single parameter,
  74398. * the JSON returned from the server, which can be manipulated as
  74399. * required, with the returned value being that used by DataTables as the
  74400. * data source for the table. This supersedes `sAjaxDataProp` from
  74401. * DataTables 1.9-.
  74402. *
  74403. * * `success` - Should not be overridden it is used internally in
  74404. * DataTables. To manipulate / transform the data returned by the server
  74405. * use `ajax.dataSrc`, or use `ajax` as a function (see below).
  74406. *
  74407. * `function`
  74408. * ----------
  74409. *
  74410. * As a function, making the Ajax call is left up to yourself allowing
  74411. * complete control of the Ajax request. Indeed, if desired, a method other
  74412. * than Ajax could be used to obtain the required data, such as Web storage
  74413. * or an AIR database.
  74414. *
  74415. * The function is given four parameters and no return is required. The
  74416. * parameters are:
  74417. *
  74418. * 1. _object_ - Data to send to the server
  74419. * 2. _function_ - Callback function that must be executed when the required
  74420. * data has been obtained. That data should be passed into the callback
  74421. * as the only parameter
  74422. * 3. _object_ - DataTables settings object for the table
  74423. *
  74424. * Note that this supersedes `fnServerData` from DataTables 1.9-.
  74425. *
  74426. * @type string|object|function
  74427. * @default null
  74428. *
  74429. * @dtopt Option
  74430. * @name DataTable.defaults.ajax
  74431. * @since 1.10.0
  74432. *
  74433. * @example
  74434. * // Get JSON data from a file via Ajax.
  74435. * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
  74436. * $('#example').dataTable( {
  74437. * "ajax": "data.json"
  74438. * } );
  74439. *
  74440. * @example
  74441. * // Get JSON data from a file via Ajax, using `dataSrc` to change
  74442. * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
  74443. * $('#example').dataTable( {
  74444. * "ajax": {
  74445. * "url": "data.json",
  74446. * "dataSrc": "tableData"
  74447. * }
  74448. * } );
  74449. *
  74450. * @example
  74451. * // Get JSON data from a file via Ajax, using `dataSrc` to read data
  74452. * // from a plain array rather than an array in an object
  74453. * $('#example').dataTable( {
  74454. * "ajax": {
  74455. * "url": "data.json",
  74456. * "dataSrc": ""
  74457. * }
  74458. * } );
  74459. *
  74460. * @example
  74461. * // Manipulate the data returned from the server - add a link to data
  74462. * // (note this can, should, be done using `render` for the column - this
  74463. * // is just a simple example of how the data can be manipulated).
  74464. * $('#example').dataTable( {
  74465. * "ajax": {
  74466. * "url": "data.json",
  74467. * "dataSrc": function ( json ) {
  74468. * for ( var i=0, ien=json.length ; i<ien ; i++ ) {
  74469. * json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
  74470. * }
  74471. * return json;
  74472. * }
  74473. * }
  74474. * } );
  74475. *
  74476. * @example
  74477. * // Add data to the request
  74478. * $('#example').dataTable( {
  74479. * "ajax": {
  74480. * "url": "data.json",
  74481. * "data": function ( d ) {
  74482. * return {
  74483. * "extra_search": $('#extra').val()
  74484. * };
  74485. * }
  74486. * }
  74487. * } );
  74488. *
  74489. * @example
  74490. * // Send request as POST
  74491. * $('#example').dataTable( {
  74492. * "ajax": {
  74493. * "url": "data.json",
  74494. * "type": "POST"
  74495. * }
  74496. * } );
  74497. *
  74498. * @example
  74499. * // Get the data from localStorage (could interface with a form for
  74500. * // adding, editing and removing rows).
  74501. * $('#example').dataTable( {
  74502. * "ajax": function (data, callback, settings) {
  74503. * callback(
  74504. * JSON.parse( localStorage.getItem('dataTablesData') )
  74505. * );
  74506. * }
  74507. * } );
  74508. */
  74509. "ajax": null,
  74510. /**
  74511. * This parameter allows you to readily specify the entries in the length drop
  74512. * down menu that DataTables shows when pagination is enabled. It can be
  74513. * either a 1D array of options which will be used for both the displayed
  74514. * option and the value, or a 2D array which will use the array in the first
  74515. * position as the value, and the array in the second position as the
  74516. * displayed options (useful for language strings such as 'All').
  74517. *
  74518. * Note that the `pageLength` property will be automatically set to the
  74519. * first value given in this array, unless `pageLength` is also provided.
  74520. * @type array
  74521. * @default [ 10, 25, 50, 100 ]
  74522. *
  74523. * @dtopt Option
  74524. * @name DataTable.defaults.lengthMenu
  74525. *
  74526. * @example
  74527. * $(document).ready( function() {
  74528. * $('#example').dataTable( {
  74529. * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
  74530. * } );
  74531. * } );
  74532. */
  74533. "aLengthMenu": [ 10, 25, 50, 100 ],
  74534. /**
  74535. * The `columns` option in the initialisation parameter allows you to define
  74536. * details about the way individual columns behave. For a full list of
  74537. * column options that can be set, please see
  74538. * {@link DataTable.defaults.column}. Note that if you use `columns` to
  74539. * define your columns, you must have an entry in the array for every single
  74540. * column that you have in your table (these can be null if you don't which
  74541. * to specify any options).
  74542. * @member
  74543. *
  74544. * @name DataTable.defaults.column
  74545. */
  74546. "aoColumns": null,
  74547. /**
  74548. * Very similar to `columns`, `columnDefs` allows you to target a specific
  74549. * column, multiple columns, or all columns, using the `targets` property of
  74550. * each object in the array. This allows great flexibility when creating
  74551. * tables, as the `columnDefs` arrays can be of any length, targeting the
  74552. * columns you specifically want. `columnDefs` may use any of the column
  74553. * options available: {@link DataTable.defaults.column}, but it _must_
  74554. * have `targets` defined in each object in the array. Values in the `targets`
  74555. * array may be:
  74556. * <ul>
  74557. * <li>a string - class name will be matched on the TH for the column</li>
  74558. * <li>0 or a positive integer - column index counting from the left</li>
  74559. * <li>a negative integer - column index counting from the right</li>
  74560. * <li>the string "_all" - all columns (i.e. assign a default)</li>
  74561. * </ul>
  74562. * @member
  74563. *
  74564. * @name DataTable.defaults.columnDefs
  74565. */
  74566. "aoColumnDefs": null,
  74567. /**
  74568. * Basically the same as `search`, this parameter defines the individual column
  74569. * filtering state at initialisation time. The array must be of the same size
  74570. * as the number of columns, and each element be an object with the parameters
  74571. * `search` and `escapeRegex` (the latter is optional). 'null' is also
  74572. * accepted and the default will be used.
  74573. * @type array
  74574. * @default []
  74575. *
  74576. * @dtopt Option
  74577. * @name DataTable.defaults.searchCols
  74578. *
  74579. * @example
  74580. * $(document).ready( function() {
  74581. * $('#example').dataTable( {
  74582. * "searchCols": [
  74583. * null,
  74584. * { "search": "My filter" },
  74585. * null,
  74586. * { "search": "^[0-9]", "escapeRegex": false }
  74587. * ]
  74588. * } );
  74589. * } )
  74590. */
  74591. "aoSearchCols": [],
  74592. /**
  74593. * An array of CSS classes that should be applied to displayed rows. This
  74594. * array may be of any length, and DataTables will apply each class
  74595. * sequentially, looping when required.
  74596. * @type array
  74597. * @default null <i>Will take the values determined by the `oClasses.stripe*`
  74598. * options</i>
  74599. *
  74600. * @dtopt Option
  74601. * @name DataTable.defaults.stripeClasses
  74602. *
  74603. * @example
  74604. * $(document).ready( function() {
  74605. * $('#example').dataTable( {
  74606. * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
  74607. * } );
  74608. * } )
  74609. */
  74610. "asStripeClasses": null,
  74611. /**
  74612. * Enable or disable automatic column width calculation. This can be disabled
  74613. * as an optimisation (it takes some time to calculate the widths) if the
  74614. * tables widths are passed in using `columns`.
  74615. * @type boolean
  74616. * @default true
  74617. *
  74618. * @dtopt Features
  74619. * @name DataTable.defaults.autoWidth
  74620. *
  74621. * @example
  74622. * $(document).ready( function () {
  74623. * $('#example').dataTable( {
  74624. * "autoWidth": false
  74625. * } );
  74626. * } );
  74627. */
  74628. "bAutoWidth": true,
  74629. /**
  74630. * Deferred rendering can provide DataTables with a huge speed boost when you
  74631. * are using an Ajax or JS data source for the table. This option, when set to
  74632. * true, will cause DataTables to defer the creation of the table elements for
  74633. * each row until they are needed for a draw - saving a significant amount of
  74634. * time.
  74635. * @type boolean
  74636. * @default false
  74637. *
  74638. * @dtopt Features
  74639. * @name DataTable.defaults.deferRender
  74640. *
  74641. * @example
  74642. * $(document).ready( function() {
  74643. * $('#example').dataTable( {
  74644. * "ajax": "sources/arrays.txt",
  74645. * "deferRender": true
  74646. * } );
  74647. * } );
  74648. */
  74649. "bDeferRender": false,
  74650. /**
  74651. * Replace a DataTable which matches the given selector and replace it with
  74652. * one which has the properties of the new initialisation object passed. If no
  74653. * table matches the selector, then the new DataTable will be constructed as
  74654. * per normal.
  74655. * @type boolean
  74656. * @default false
  74657. *
  74658. * @dtopt Options
  74659. * @name DataTable.defaults.destroy
  74660. *
  74661. * @example
  74662. * $(document).ready( function() {
  74663. * $('#example').dataTable( {
  74664. * "srollY": "200px",
  74665. * "paginate": false
  74666. * } );
  74667. *
  74668. * // Some time later....
  74669. * $('#example').dataTable( {
  74670. * "filter": false,
  74671. * "destroy": true
  74672. * } );
  74673. * } );
  74674. */
  74675. "bDestroy": false,
  74676. /**
  74677. * Enable or disable filtering of data. Filtering in DataTables is "smart" in
  74678. * that it allows the end user to input multiple words (space separated) and
  74679. * will match a row containing those words, even if not in the order that was
  74680. * specified (this allow matching across multiple columns). Note that if you
  74681. * wish to use filtering in DataTables this must remain 'true' - to remove the
  74682. * default filtering input box and retain filtering abilities, please use
  74683. * {@link DataTable.defaults.dom}.
  74684. * @type boolean
  74685. * @default true
  74686. *
  74687. * @dtopt Features
  74688. * @name DataTable.defaults.searching
  74689. *
  74690. * @example
  74691. * $(document).ready( function () {
  74692. * $('#example').dataTable( {
  74693. * "searching": false
  74694. * } );
  74695. * } );
  74696. */
  74697. "bFilter": true,
  74698. /**
  74699. * Enable or disable the table information display. This shows information
  74700. * about the data that is currently visible on the page, including information
  74701. * about filtered data if that action is being performed.
  74702. * @type boolean
  74703. * @default true
  74704. *
  74705. * @dtopt Features
  74706. * @name DataTable.defaults.info
  74707. *
  74708. * @example
  74709. * $(document).ready( function () {
  74710. * $('#example').dataTable( {
  74711. * "info": false
  74712. * } );
  74713. * } );
  74714. */
  74715. "bInfo": true,
  74716. /**
  74717. * Allows the end user to select the size of a formatted page from a select
  74718. * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
  74719. * @type boolean
  74720. * @default true
  74721. *
  74722. * @dtopt Features
  74723. * @name DataTable.defaults.lengthChange
  74724. *
  74725. * @example
  74726. * $(document).ready( function () {
  74727. * $('#example').dataTable( {
  74728. * "lengthChange": false
  74729. * } );
  74730. * } );
  74731. */
  74732. "bLengthChange": true,
  74733. /**
  74734. * Enable or disable pagination.
  74735. * @type boolean
  74736. * @default true
  74737. *
  74738. * @dtopt Features
  74739. * @name DataTable.defaults.paging
  74740. *
  74741. * @example
  74742. * $(document).ready( function () {
  74743. * $('#example').dataTable( {
  74744. * "paging": false
  74745. * } );
  74746. * } );
  74747. */
  74748. "bPaginate": true,
  74749. /**
  74750. * Enable or disable the display of a 'processing' indicator when the table is
  74751. * being processed (e.g. a sort). This is particularly useful for tables with
  74752. * large amounts of data where it can take a noticeable amount of time to sort
  74753. * the entries.
  74754. * @type boolean
  74755. * @default false
  74756. *
  74757. * @dtopt Features
  74758. * @name DataTable.defaults.processing
  74759. *
  74760. * @example
  74761. * $(document).ready( function () {
  74762. * $('#example').dataTable( {
  74763. * "processing": true
  74764. * } );
  74765. * } );
  74766. */
  74767. "bProcessing": false,
  74768. /**
  74769. * Retrieve the DataTables object for the given selector. Note that if the
  74770. * table has already been initialised, this parameter will cause DataTables
  74771. * to simply return the object that has already been set up - it will not take
  74772. * account of any changes you might have made to the initialisation object
  74773. * passed to DataTables (setting this parameter to true is an acknowledgement
  74774. * that you understand this). `destroy` can be used to reinitialise a table if
  74775. * you need.
  74776. * @type boolean
  74777. * @default false
  74778. *
  74779. * @dtopt Options
  74780. * @name DataTable.defaults.retrieve
  74781. *
  74782. * @example
  74783. * $(document).ready( function() {
  74784. * initTable();
  74785. * tableActions();
  74786. * } );
  74787. *
  74788. * function initTable ()
  74789. * {
  74790. * return $('#example').dataTable( {
  74791. * "scrollY": "200px",
  74792. * "paginate": false,
  74793. * "retrieve": true
  74794. * } );
  74795. * }
  74796. *
  74797. * function tableActions ()
  74798. * {
  74799. * var table = initTable();
  74800. * // perform API operations with oTable
  74801. * }
  74802. */
  74803. "bRetrieve": false,
  74804. /**
  74805. * When vertical (y) scrolling is enabled, DataTables will force the height of
  74806. * the table's viewport to the given height at all times (useful for layout).
  74807. * However, this can look odd when filtering data down to a small data set,
  74808. * and the footer is left "floating" further down. This parameter (when
  74809. * enabled) will cause DataTables to collapse the table's viewport down when
  74810. * the result set will fit within the given Y height.
  74811. * @type boolean
  74812. * @default false
  74813. *
  74814. * @dtopt Options
  74815. * @name DataTable.defaults.scrollCollapse
  74816. *
  74817. * @example
  74818. * $(document).ready( function() {
  74819. * $('#example').dataTable( {
  74820. * "scrollY": "200",
  74821. * "scrollCollapse": true
  74822. * } );
  74823. * } );
  74824. */
  74825. "bScrollCollapse": false,
  74826. /**
  74827. * Configure DataTables to use server-side processing. Note that the
  74828. * `ajax` parameter must also be given in order to give DataTables a
  74829. * source to obtain the required data for each draw.
  74830. * @type boolean
  74831. * @default false
  74832. *
  74833. * @dtopt Features
  74834. * @dtopt Server-side
  74835. * @name DataTable.defaults.serverSide
  74836. *
  74837. * @example
  74838. * $(document).ready( function () {
  74839. * $('#example').dataTable( {
  74840. * "serverSide": true,
  74841. * "ajax": "xhr.php"
  74842. * } );
  74843. * } );
  74844. */
  74845. "bServerSide": false,
  74846. /**
  74847. * Enable or disable sorting of columns. Sorting of individual columns can be
  74848. * disabled by the `sortable` option for each column.
  74849. * @type boolean
  74850. * @default true
  74851. *
  74852. * @dtopt Features
  74853. * @name DataTable.defaults.ordering
  74854. *
  74855. * @example
  74856. * $(document).ready( function () {
  74857. * $('#example').dataTable( {
  74858. * "ordering": false
  74859. * } );
  74860. * } );
  74861. */
  74862. "bSort": true,
  74863. /**
  74864. * Enable or display DataTables' ability to sort multiple columns at the
  74865. * same time (activated by shift-click by the user).
  74866. * @type boolean
  74867. * @default true
  74868. *
  74869. * @dtopt Options
  74870. * @name DataTable.defaults.orderMulti
  74871. *
  74872. * @example
  74873. * // Disable multiple column sorting ability
  74874. * $(document).ready( function () {
  74875. * $('#example').dataTable( {
  74876. * "orderMulti": false
  74877. * } );
  74878. * } );
  74879. */
  74880. "bSortMulti": true,
  74881. /**
  74882. * Allows control over whether DataTables should use the top (true) unique
  74883. * cell that is found for a single column, or the bottom (false - default).
  74884. * This is useful when using complex headers.
  74885. * @type boolean
  74886. * @default false
  74887. *
  74888. * @dtopt Options
  74889. * @name DataTable.defaults.orderCellsTop
  74890. *
  74891. * @example
  74892. * $(document).ready( function() {
  74893. * $('#example').dataTable( {
  74894. * "orderCellsTop": true
  74895. * } );
  74896. * } );
  74897. */
  74898. "bSortCellsTop": false,
  74899. /**
  74900. * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
  74901. * `sorting\_3` to the columns which are currently being sorted on. This is
  74902. * presented as a feature switch as it can increase processing time (while
  74903. * classes are removed and added) so for large data sets you might want to
  74904. * turn this off.
  74905. * @type boolean
  74906. * @default true
  74907. *
  74908. * @dtopt Features
  74909. * @name DataTable.defaults.orderClasses
  74910. *
  74911. * @example
  74912. * $(document).ready( function () {
  74913. * $('#example').dataTable( {
  74914. * "orderClasses": false
  74915. * } );
  74916. * } );
  74917. */
  74918. "bSortClasses": true,
  74919. /**
  74920. * Enable or disable state saving. When enabled HTML5 `localStorage` will be
  74921. * used to save table display information such as pagination information,
  74922. * display length, filtering and sorting. As such when the end user reloads
  74923. * the page the display display will match what thy had previously set up.
  74924. *
  74925. * Due to the use of `localStorage` the default state saving is not supported
  74926. * in IE6 or 7. If state saving is required in those browsers, use
  74927. * `stateSaveCallback` to provide a storage solution such as cookies.
  74928. * @type boolean
  74929. * @default false
  74930. *
  74931. * @dtopt Features
  74932. * @name DataTable.defaults.stateSave
  74933. *
  74934. * @example
  74935. * $(document).ready( function () {
  74936. * $('#example').dataTable( {
  74937. * "stateSave": true
  74938. * } );
  74939. * } );
  74940. */
  74941. "bStateSave": false,
  74942. /**
  74943. * This function is called when a TR element is created (and all TD child
  74944. * elements have been inserted), or registered if using a DOM source, allowing
  74945. * manipulation of the TR element (adding classes etc).
  74946. * @type function
  74947. * @param {node} row "TR" element for the current row
  74948. * @param {array} data Raw data array for this row
  74949. * @param {int} dataIndex The index of this row in the internal aoData array
  74950. *
  74951. * @dtopt Callbacks
  74952. * @name DataTable.defaults.createdRow
  74953. *
  74954. * @example
  74955. * $(document).ready( function() {
  74956. * $('#example').dataTable( {
  74957. * "createdRow": function( row, data, dataIndex ) {
  74958. * // Bold the grade for all 'A' grade browsers
  74959. * if ( data[4] == "A" )
  74960. * {
  74961. * $('td:eq(4)', row).html( '<b>A</b>' );
  74962. * }
  74963. * }
  74964. * } );
  74965. * } );
  74966. */
  74967. "fnCreatedRow": null,
  74968. /**
  74969. * This function is called on every 'draw' event, and allows you to
  74970. * dynamically modify any aspect you want about the created DOM.
  74971. * @type function
  74972. * @param {object} settings DataTables settings object
  74973. *
  74974. * @dtopt Callbacks
  74975. * @name DataTable.defaults.drawCallback
  74976. *
  74977. * @example
  74978. * $(document).ready( function() {
  74979. * $('#example').dataTable( {
  74980. * "drawCallback": function( settings ) {
  74981. * alert( 'DataTables has redrawn the table' );
  74982. * }
  74983. * } );
  74984. * } );
  74985. */
  74986. "fnDrawCallback": null,
  74987. /**
  74988. * Identical to fnHeaderCallback() but for the table footer this function
  74989. * allows you to modify the table footer on every 'draw' event.
  74990. * @type function
  74991. * @param {node} foot "TR" element for the footer
  74992. * @param {array} data Full table data (as derived from the original HTML)
  74993. * @param {int} start Index for the current display starting point in the
  74994. * display array
  74995. * @param {int} end Index for the current display ending point in the
  74996. * display array
  74997. * @param {array int} display Index array to translate the visual position
  74998. * to the full data array
  74999. *
  75000. * @dtopt Callbacks
  75001. * @name DataTable.defaults.footerCallback
  75002. *
  75003. * @example
  75004. * $(document).ready( function() {
  75005. * $('#example').dataTable( {
  75006. * "footerCallback": function( tfoot, data, start, end, display ) {
  75007. * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
  75008. * }
  75009. * } );
  75010. * } )
  75011. */
  75012. "fnFooterCallback": null,
  75013. /**
  75014. * When rendering large numbers in the information element for the table
  75015. * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
  75016. * to have a comma separator for the 'thousands' units (e.g. 1 million is
  75017. * rendered as "1,000,000") to help readability for the end user. This
  75018. * function will override the default method DataTables uses.
  75019. * @type function
  75020. * @member
  75021. * @param {int} toFormat number to be formatted
  75022. * @returns {string} formatted string for DataTables to show the number
  75023. *
  75024. * @dtopt Callbacks
  75025. * @name DataTable.defaults.formatNumber
  75026. *
  75027. * @example
  75028. * // Format a number using a single quote for the separator (note that
  75029. * // this can also be done with the language.thousands option)
  75030. * $(document).ready( function() {
  75031. * $('#example').dataTable( {
  75032. * "formatNumber": function ( toFormat ) {
  75033. * return toFormat.toString().replace(
  75034. * /\B(?=(\d{3})+(?!\d))/g, "'"
  75035. * );
  75036. * };
  75037. * } );
  75038. * } );
  75039. */
  75040. "fnFormatNumber": function ( toFormat ) {
  75041. return toFormat.toString().replace(
  75042. /\B(?=(\d{3})+(?!\d))/g,
  75043. this.oLanguage.sThousands
  75044. );
  75045. },
  75046. /**
  75047. * This function is called on every 'draw' event, and allows you to
  75048. * dynamically modify the header row. This can be used to calculate and
  75049. * display useful information about the table.
  75050. * @type function
  75051. * @param {node} head "TR" element for the header
  75052. * @param {array} data Full table data (as derived from the original HTML)
  75053. * @param {int} start Index for the current display starting point in the
  75054. * display array
  75055. * @param {int} end Index for the current display ending point in the
  75056. * display array
  75057. * @param {array int} display Index array to translate the visual position
  75058. * to the full data array
  75059. *
  75060. * @dtopt Callbacks
  75061. * @name DataTable.defaults.headerCallback
  75062. *
  75063. * @example
  75064. * $(document).ready( function() {
  75065. * $('#example').dataTable( {
  75066. * "fheaderCallback": function( head, data, start, end, display ) {
  75067. * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
  75068. * }
  75069. * } );
  75070. * } )
  75071. */
  75072. "fnHeaderCallback": null,
  75073. /**
  75074. * The information element can be used to convey information about the current
  75075. * state of the table. Although the internationalisation options presented by
  75076. * DataTables are quite capable of dealing with most customisations, there may
  75077. * be times where you wish to customise the string further. This callback
  75078. * allows you to do exactly that.
  75079. * @type function
  75080. * @param {object} oSettings DataTables settings object
  75081. * @param {int} start Starting position in data for the draw
  75082. * @param {int} end End position in data for the draw
  75083. * @param {int} max Total number of rows in the table (regardless of
  75084. * filtering)
  75085. * @param {int} total Total number of rows in the data set, after filtering
  75086. * @param {string} pre The string that DataTables has formatted using it's
  75087. * own rules
  75088. * @returns {string} The string to be displayed in the information element.
  75089. *
  75090. * @dtopt Callbacks
  75091. * @name DataTable.defaults.infoCallback
  75092. *
  75093. * @example
  75094. * $('#example').dataTable( {
  75095. * "infoCallback": function( settings, start, end, max, total, pre ) {
  75096. * return start +" to "+ end;
  75097. * }
  75098. * } );
  75099. */
  75100. "fnInfoCallback": null,
  75101. /**
  75102. * Called when the table has been initialised. Normally DataTables will
  75103. * initialise sequentially and there will be no need for this function,
  75104. * however, this does not hold true when using external language information
  75105. * since that is obtained using an async XHR call.
  75106. * @type function
  75107. * @param {object} settings DataTables settings object
  75108. * @param {object} json The JSON object request from the server - only
  75109. * present if client-side Ajax sourced data is used
  75110. *
  75111. * @dtopt Callbacks
  75112. * @name DataTable.defaults.initComplete
  75113. *
  75114. * @example
  75115. * $(document).ready( function() {
  75116. * $('#example').dataTable( {
  75117. * "initComplete": function(settings, json) {
  75118. * alert( 'DataTables has finished its initialisation.' );
  75119. * }
  75120. * } );
  75121. * } )
  75122. */
  75123. "fnInitComplete": null,
  75124. /**
  75125. * Called at the very start of each table draw and can be used to cancel the
  75126. * draw by returning false, any other return (including undefined) results in
  75127. * the full draw occurring).
  75128. * @type function
  75129. * @param {object} settings DataTables settings object
  75130. * @returns {boolean} False will cancel the draw, anything else (including no
  75131. * return) will allow it to complete.
  75132. *
  75133. * @dtopt Callbacks
  75134. * @name DataTable.defaults.preDrawCallback
  75135. *
  75136. * @example
  75137. * $(document).ready( function() {
  75138. * $('#example').dataTable( {
  75139. * "preDrawCallback": function( settings ) {
  75140. * if ( $('#test').val() == 1 ) {
  75141. * return false;
  75142. * }
  75143. * }
  75144. * } );
  75145. * } );
  75146. */
  75147. "fnPreDrawCallback": null,
  75148. /**
  75149. * This function allows you to 'post process' each row after it have been
  75150. * generated for each table draw, but before it is rendered on screen. This
  75151. * function might be used for setting the row class name etc.
  75152. * @type function
  75153. * @param {node} row "TR" element for the current row
  75154. * @param {array} data Raw data array for this row
  75155. * @param {int} displayIndex The display index for the current table draw
  75156. * @param {int} displayIndexFull The index of the data in the full list of
  75157. * rows (after filtering)
  75158. *
  75159. * @dtopt Callbacks
  75160. * @name DataTable.defaults.rowCallback
  75161. *
  75162. * @example
  75163. * $(document).ready( function() {
  75164. * $('#example').dataTable( {
  75165. * "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
  75166. * // Bold the grade for all 'A' grade browsers
  75167. * if ( data[4] == "A" ) {
  75168. * $('td:eq(4)', row).html( '<b>A</b>' );
  75169. * }
  75170. * }
  75171. * } );
  75172. * } );
  75173. */
  75174. "fnRowCallback": null,
  75175. /**
  75176. * __Deprecated__ The functionality provided by this parameter has now been
  75177. * superseded by that provided through `ajax`, which should be used instead.
  75178. *
  75179. * This parameter allows you to override the default function which obtains
  75180. * the data from the server so something more suitable for your application.
  75181. * For example you could use POST data, or pull information from a Gears or
  75182. * AIR database.
  75183. * @type function
  75184. * @member
  75185. * @param {string} source HTTP source to obtain the data from (`ajax`)
  75186. * @param {array} data A key/value pair object containing the data to send
  75187. * to the server
  75188. * @param {function} callback to be called on completion of the data get
  75189. * process that will draw the data on the page.
  75190. * @param {object} settings DataTables settings object
  75191. *
  75192. * @dtopt Callbacks
  75193. * @dtopt Server-side
  75194. * @name DataTable.defaults.serverData
  75195. *
  75196. * @deprecated 1.10. Please use `ajax` for this functionality now.
  75197. */
  75198. "fnServerData": null,
  75199. /**
  75200. * __Deprecated__ The functionality provided by this parameter has now been
  75201. * superseded by that provided through `ajax`, which should be used instead.
  75202. *
  75203. * It is often useful to send extra data to the server when making an Ajax
  75204. * request - for example custom filtering information, and this callback
  75205. * function makes it trivial to send extra information to the server. The
  75206. * passed in parameter is the data set that has been constructed by
  75207. * DataTables, and you can add to this or modify it as you require.
  75208. * @type function
  75209. * @param {array} data Data array (array of objects which are name/value
  75210. * pairs) that has been constructed by DataTables and will be sent to the
  75211. * server. In the case of Ajax sourced data with server-side processing
  75212. * this will be an empty array, for server-side processing there will be a
  75213. * significant number of parameters!
  75214. * @returns {undefined} Ensure that you modify the data array passed in,
  75215. * as this is passed by reference.
  75216. *
  75217. * @dtopt Callbacks
  75218. * @dtopt Server-side
  75219. * @name DataTable.defaults.serverParams
  75220. *
  75221. * @deprecated 1.10. Please use `ajax` for this functionality now.
  75222. */
  75223. "fnServerParams": null,
  75224. /**
  75225. * Load the table state. With this function you can define from where, and how, the
  75226. * state of a table is loaded. By default DataTables will load from `localStorage`
  75227. * but you might wish to use a server-side database or cookies.
  75228. * @type function
  75229. * @member
  75230. * @param {object} settings DataTables settings object
  75231. * @param {object} callback Callback that can be executed when done. It
  75232. * should be passed the loaded state object.
  75233. * @return {object} The DataTables state object to be loaded
  75234. *
  75235. * @dtopt Callbacks
  75236. * @name DataTable.defaults.stateLoadCallback
  75237. *
  75238. * @example
  75239. * $(document).ready( function() {
  75240. * $('#example').dataTable( {
  75241. * "stateSave": true,
  75242. * "stateLoadCallback": function (settings, callback) {
  75243. * $.ajax( {
  75244. * "url": "/state_load",
  75245. * "dataType": "json",
  75246. * "success": function (json) {
  75247. * callback( json );
  75248. * }
  75249. * } );
  75250. * }
  75251. * } );
  75252. * } );
  75253. */
  75254. "fnStateLoadCallback": function ( settings ) {
  75255. try {
  75256. return JSON.parse(
  75257. (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
  75258. 'DataTables_'+settings.sInstance+'_'+location.pathname
  75259. )
  75260. );
  75261. } catch (e) {}
  75262. },
  75263. /**
  75264. * Callback which allows modification of the saved state prior to loading that state.
  75265. * This callback is called when the table is loading state from the stored data, but
  75266. * prior to the settings object being modified by the saved state. Note that for
  75267. * plug-in authors, you should use the `stateLoadParams` event to load parameters for
  75268. * a plug-in.
  75269. * @type function
  75270. * @param {object} settings DataTables settings object
  75271. * @param {object} data The state object that is to be loaded
  75272. *
  75273. * @dtopt Callbacks
  75274. * @name DataTable.defaults.stateLoadParams
  75275. *
  75276. * @example
  75277. * // Remove a saved filter, so filtering is never loaded
  75278. * $(document).ready( function() {
  75279. * $('#example').dataTable( {
  75280. * "stateSave": true,
  75281. * "stateLoadParams": function (settings, data) {
  75282. * data.oSearch.sSearch = "";
  75283. * }
  75284. * } );
  75285. * } );
  75286. *
  75287. * @example
  75288. * // Disallow state loading by returning false
  75289. * $(document).ready( function() {
  75290. * $('#example').dataTable( {
  75291. * "stateSave": true,
  75292. * "stateLoadParams": function (settings, data) {
  75293. * return false;
  75294. * }
  75295. * } );
  75296. * } );
  75297. */
  75298. "fnStateLoadParams": null,
  75299. /**
  75300. * Callback that is called when the state has been loaded from the state saving method
  75301. * and the DataTables settings object has been modified as a result of the loaded state.
  75302. * @type function
  75303. * @param {object} settings DataTables settings object
  75304. * @param {object} data The state object that was loaded
  75305. *
  75306. * @dtopt Callbacks
  75307. * @name DataTable.defaults.stateLoaded
  75308. *
  75309. * @example
  75310. * // Show an alert with the filtering value that was saved
  75311. * $(document).ready( function() {
  75312. * $('#example').dataTable( {
  75313. * "stateSave": true,
  75314. * "stateLoaded": function (settings, data) {
  75315. * alert( 'Saved filter was: '+data.oSearch.sSearch );
  75316. * }
  75317. * } );
  75318. * } );
  75319. */
  75320. "fnStateLoaded": null,
  75321. /**
  75322. * Save the table state. This function allows you to define where and how the state
  75323. * information for the table is stored By default DataTables will use `localStorage`
  75324. * but you might wish to use a server-side database or cookies.
  75325. * @type function
  75326. * @member
  75327. * @param {object} settings DataTables settings object
  75328. * @param {object} data The state object to be saved
  75329. *
  75330. * @dtopt Callbacks
  75331. * @name DataTable.defaults.stateSaveCallback
  75332. *
  75333. * @example
  75334. * $(document).ready( function() {
  75335. * $('#example').dataTable( {
  75336. * "stateSave": true,
  75337. * "stateSaveCallback": function (settings, data) {
  75338. * // Send an Ajax request to the server with the state object
  75339. * $.ajax( {
  75340. * "url": "/state_save",
  75341. * "data": data,
  75342. * "dataType": "json",
  75343. * "method": "POST"
  75344. * "success": function () {}
  75345. * } );
  75346. * }
  75347. * } );
  75348. * } );
  75349. */
  75350. "fnStateSaveCallback": function ( settings, data ) {
  75351. try {
  75352. (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
  75353. 'DataTables_'+settings.sInstance+'_'+location.pathname,
  75354. JSON.stringify( data )
  75355. );
  75356. } catch (e) {}
  75357. },
  75358. /**
  75359. * Callback which allows modification of the state to be saved. Called when the table
  75360. * has changed state a new state save is required. This method allows modification of
  75361. * the state saving object prior to actually doing the save, including addition or
  75362. * other state properties or modification. Note that for plug-in authors, you should
  75363. * use the `stateSaveParams` event to save parameters for a plug-in.
  75364. * @type function
  75365. * @param {object} settings DataTables settings object
  75366. * @param {object} data The state object to be saved
  75367. *
  75368. * @dtopt Callbacks
  75369. * @name DataTable.defaults.stateSaveParams
  75370. *
  75371. * @example
  75372. * // Remove a saved filter, so filtering is never saved
  75373. * $(document).ready( function() {
  75374. * $('#example').dataTable( {
  75375. * "stateSave": true,
  75376. * "stateSaveParams": function (settings, data) {
  75377. * data.oSearch.sSearch = "";
  75378. * }
  75379. * } );
  75380. * } );
  75381. */
  75382. "fnStateSaveParams": null,
  75383. /**
  75384. * Duration for which the saved state information is considered valid. After this period
  75385. * has elapsed the state will be returned to the default.
  75386. * Value is given in seconds.
  75387. * @type int
  75388. * @default 7200 <i>(2 hours)</i>
  75389. *
  75390. * @dtopt Options
  75391. * @name DataTable.defaults.stateDuration
  75392. *
  75393. * @example
  75394. * $(document).ready( function() {
  75395. * $('#example').dataTable( {
  75396. * "stateDuration": 60*60*24; // 1 day
  75397. * } );
  75398. * } )
  75399. */
  75400. "iStateDuration": 7200,
  75401. /**
  75402. * When enabled DataTables will not make a request to the server for the first
  75403. * page draw - rather it will use the data already on the page (no sorting etc
  75404. * will be applied to it), thus saving on an XHR at load time. `deferLoading`
  75405. * is used to indicate that deferred loading is required, but it is also used
  75406. * to tell DataTables how many records there are in the full table (allowing
  75407. * the information element and pagination to be displayed correctly). In the case
  75408. * where a filtering is applied to the table on initial load, this can be
  75409. * indicated by giving the parameter as an array, where the first element is
  75410. * the number of records available after filtering and the second element is the
  75411. * number of records without filtering (allowing the table information element
  75412. * to be shown correctly).
  75413. * @type int | array
  75414. * @default null
  75415. *
  75416. * @dtopt Options
  75417. * @name DataTable.defaults.deferLoading
  75418. *
  75419. * @example
  75420. * // 57 records available in the table, no filtering applied
  75421. * $(document).ready( function() {
  75422. * $('#example').dataTable( {
  75423. * "serverSide": true,
  75424. * "ajax": "scripts/server_processing.php",
  75425. * "deferLoading": 57
  75426. * } );
  75427. * } );
  75428. *
  75429. * @example
  75430. * // 57 records after filtering, 100 without filtering (an initial filter applied)
  75431. * $(document).ready( function() {
  75432. * $('#example').dataTable( {
  75433. * "serverSide": true,
  75434. * "ajax": "scripts/server_processing.php",
  75435. * "deferLoading": [ 57, 100 ],
  75436. * "search": {
  75437. * "search": "my_filter"
  75438. * }
  75439. * } );
  75440. * } );
  75441. */
  75442. "iDeferLoading": null,
  75443. /**
  75444. * Number of rows to display on a single page when using pagination. If
  75445. * feature enabled (`lengthChange`) then the end user will be able to override
  75446. * this to a custom setting using a pop-up menu.
  75447. * @type int
  75448. * @default 10
  75449. *
  75450. * @dtopt Options
  75451. * @name DataTable.defaults.pageLength
  75452. *
  75453. * @example
  75454. * $(document).ready( function() {
  75455. * $('#example').dataTable( {
  75456. * "pageLength": 50
  75457. * } );
  75458. * } )
  75459. */
  75460. "iDisplayLength": 10,
  75461. /**
  75462. * Define the starting point for data display when using DataTables with
  75463. * pagination. Note that this parameter is the number of records, rather than
  75464. * the page number, so if you have 10 records per page and want to start on
  75465. * the third page, it should be "20".
  75466. * @type int
  75467. * @default 0
  75468. *
  75469. * @dtopt Options
  75470. * @name DataTable.defaults.displayStart
  75471. *
  75472. * @example
  75473. * $(document).ready( function() {
  75474. * $('#example').dataTable( {
  75475. * "displayStart": 20
  75476. * } );
  75477. * } )
  75478. */
  75479. "iDisplayStart": 0,
  75480. /**
  75481. * By default DataTables allows keyboard navigation of the table (sorting, paging,
  75482. * and filtering) by adding a `tabindex` attribute to the required elements. This
  75483. * allows you to tab through the controls and press the enter key to activate them.
  75484. * The tabindex is default 0, meaning that the tab follows the flow of the document.
  75485. * You can overrule this using this parameter if you wish. Use a value of -1 to
  75486. * disable built-in keyboard navigation.
  75487. * @type int
  75488. * @default 0
  75489. *
  75490. * @dtopt Options
  75491. * @name DataTable.defaults.tabIndex
  75492. *
  75493. * @example
  75494. * $(document).ready( function() {
  75495. * $('#example').dataTable( {
  75496. * "tabIndex": 1
  75497. * } );
  75498. * } );
  75499. */
  75500. "iTabIndex": 0,
  75501. /**
  75502. * Classes that DataTables assigns to the various components and features
  75503. * that it adds to the HTML table. This allows classes to be configured
  75504. * during initialisation in addition to through the static
  75505. * {@link DataTable.ext.oStdClasses} object).
  75506. * @namespace
  75507. * @name DataTable.defaults.classes
  75508. */
  75509. "oClasses": {},
  75510. /**
  75511. * All strings that DataTables uses in the user interface that it creates
  75512. * are defined in this object, allowing you to modified them individually or
  75513. * completely replace them all as required.
  75514. * @namespace
  75515. * @name DataTable.defaults.language
  75516. */
  75517. "oLanguage": {
  75518. /**
  75519. * Strings that are used for WAI-ARIA labels and controls only (these are not
  75520. * actually visible on the page, but will be read by screenreaders, and thus
  75521. * must be internationalised as well).
  75522. * @namespace
  75523. * @name DataTable.defaults.language.aria
  75524. */
  75525. "oAria": {
  75526. /**
  75527. * ARIA label that is added to the table headers when the column may be
  75528. * sorted ascending by activing the column (click or return when focused).
  75529. * Note that the column header is prefixed to this string.
  75530. * @type string
  75531. * @default : activate to sort column ascending
  75532. *
  75533. * @dtopt Language
  75534. * @name DataTable.defaults.language.aria.sortAscending
  75535. *
  75536. * @example
  75537. * $(document).ready( function() {
  75538. * $('#example').dataTable( {
  75539. * "language": {
  75540. * "aria": {
  75541. * "sortAscending": " - click/return to sort ascending"
  75542. * }
  75543. * }
  75544. * } );
  75545. * } );
  75546. */
  75547. "sSortAscending": ": activate to sort column ascending",
  75548. /**
  75549. * ARIA label that is added to the table headers when the column may be
  75550. * sorted descending by activing the column (click or return when focused).
  75551. * Note that the column header is prefixed to this string.
  75552. * @type string
  75553. * @default : activate to sort column ascending
  75554. *
  75555. * @dtopt Language
  75556. * @name DataTable.defaults.language.aria.sortDescending
  75557. *
  75558. * @example
  75559. * $(document).ready( function() {
  75560. * $('#example').dataTable( {
  75561. * "language": {
  75562. * "aria": {
  75563. * "sortDescending": " - click/return to sort descending"
  75564. * }
  75565. * }
  75566. * } );
  75567. * } );
  75568. */
  75569. "sSortDescending": ": activate to sort column descending"
  75570. },
  75571. /**
  75572. * Pagination string used by DataTables for the built-in pagination
  75573. * control types.
  75574. * @namespace
  75575. * @name DataTable.defaults.language.paginate
  75576. */
  75577. "oPaginate": {
  75578. /**
  75579. * Text to use when using the 'full_numbers' type of pagination for the
  75580. * button to take the user to the first page.
  75581. * @type string
  75582. * @default First
  75583. *
  75584. * @dtopt Language
  75585. * @name DataTable.defaults.language.paginate.first
  75586. *
  75587. * @example
  75588. * $(document).ready( function() {
  75589. * $('#example').dataTable( {
  75590. * "language": {
  75591. * "paginate": {
  75592. * "first": "First page"
  75593. * }
  75594. * }
  75595. * } );
  75596. * } );
  75597. */
  75598. "sFirst": "First",
  75599. /**
  75600. * Text to use when using the 'full_numbers' type of pagination for the
  75601. * button to take the user to the last page.
  75602. * @type string
  75603. * @default Last
  75604. *
  75605. * @dtopt Language
  75606. * @name DataTable.defaults.language.paginate.last
  75607. *
  75608. * @example
  75609. * $(document).ready( function() {
  75610. * $('#example').dataTable( {
  75611. * "language": {
  75612. * "paginate": {
  75613. * "last": "Last page"
  75614. * }
  75615. * }
  75616. * } );
  75617. * } );
  75618. */
  75619. "sLast": "Last",
  75620. /**
  75621. * Text to use for the 'next' pagination button (to take the user to the
  75622. * next page).
  75623. * @type string
  75624. * @default Next
  75625. *
  75626. * @dtopt Language
  75627. * @name DataTable.defaults.language.paginate.next
  75628. *
  75629. * @example
  75630. * $(document).ready( function() {
  75631. * $('#example').dataTable( {
  75632. * "language": {
  75633. * "paginate": {
  75634. * "next": "Next page"
  75635. * }
  75636. * }
  75637. * } );
  75638. * } );
  75639. */
  75640. "sNext": "Next",
  75641. /**
  75642. * Text to use for the 'previous' pagination button (to take the user to
  75643. * the previous page).
  75644. * @type string
  75645. * @default Previous
  75646. *
  75647. * @dtopt Language
  75648. * @name DataTable.defaults.language.paginate.previous
  75649. *
  75650. * @example
  75651. * $(document).ready( function() {
  75652. * $('#example').dataTable( {
  75653. * "language": {
  75654. * "paginate": {
  75655. * "previous": "Previous page"
  75656. * }
  75657. * }
  75658. * } );
  75659. * } );
  75660. */
  75661. "sPrevious": "Previous"
  75662. },
  75663. /**
  75664. * This string is shown in preference to `zeroRecords` when the table is
  75665. * empty of data (regardless of filtering). Note that this is an optional
  75666. * parameter - if it is not given, the value of `zeroRecords` will be used
  75667. * instead (either the default or given value).
  75668. * @type string
  75669. * @default No data available in table
  75670. *
  75671. * @dtopt Language
  75672. * @name DataTable.defaults.language.emptyTable
  75673. *
  75674. * @example
  75675. * $(document).ready( function() {
  75676. * $('#example').dataTable( {
  75677. * "language": {
  75678. * "emptyTable": "No data available in table"
  75679. * }
  75680. * } );
  75681. * } );
  75682. */
  75683. "sEmptyTable": "No data available in table",
  75684. /**
  75685. * This string gives information to the end user about the information
  75686. * that is current on display on the page. The following tokens can be
  75687. * used in the string and will be dynamically replaced as the table
  75688. * display updates. This tokens can be placed anywhere in the string, or
  75689. * removed as needed by the language requires:
  75690. *
  75691. * * `\_START\_` - Display index of the first record on the current page
  75692. * * `\_END\_` - Display index of the last record on the current page
  75693. * * `\_TOTAL\_` - Number of records in the table after filtering
  75694. * * `\_MAX\_` - Number of records in the table without filtering
  75695. * * `\_PAGE\_` - Current page number
  75696. * * `\_PAGES\_` - Total number of pages of data in the table
  75697. *
  75698. * @type string
  75699. * @default Showing _START_ to _END_ of _TOTAL_ entries
  75700. *
  75701. * @dtopt Language
  75702. * @name DataTable.defaults.language.info
  75703. *
  75704. * @example
  75705. * $(document).ready( function() {
  75706. * $('#example').dataTable( {
  75707. * "language": {
  75708. * "info": "Showing page _PAGE_ of _PAGES_"
  75709. * }
  75710. * } );
  75711. * } );
  75712. */
  75713. "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
  75714. /**
  75715. * Display information string for when the table is empty. Typically the
  75716. * format of this string should match `info`.
  75717. * @type string
  75718. * @default Showing 0 to 0 of 0 entries
  75719. *
  75720. * @dtopt Language
  75721. * @name DataTable.defaults.language.infoEmpty
  75722. *
  75723. * @example
  75724. * $(document).ready( function() {
  75725. * $('#example').dataTable( {
  75726. * "language": {
  75727. * "infoEmpty": "No entries to show"
  75728. * }
  75729. * } );
  75730. * } );
  75731. */
  75732. "sInfoEmpty": "Showing 0 to 0 of 0 entries",
  75733. /**
  75734. * When a user filters the information in a table, this string is appended
  75735. * to the information (`info`) to give an idea of how strong the filtering
  75736. * is. The variable _MAX_ is dynamically updated.
  75737. * @type string
  75738. * @default (filtered from _MAX_ total entries)
  75739. *
  75740. * @dtopt Language
  75741. * @name DataTable.defaults.language.infoFiltered
  75742. *
  75743. * @example
  75744. * $(document).ready( function() {
  75745. * $('#example').dataTable( {
  75746. * "language": {
  75747. * "infoFiltered": " - filtering from _MAX_ records"
  75748. * }
  75749. * } );
  75750. * } );
  75751. */
  75752. "sInfoFiltered": "(filtered from _MAX_ total entries)",
  75753. /**
  75754. * If can be useful to append extra information to the info string at times,
  75755. * and this variable does exactly that. This information will be appended to
  75756. * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
  75757. * being used) at all times.
  75758. * @type string
  75759. * @default <i>Empty string</i>
  75760. *
  75761. * @dtopt Language
  75762. * @name DataTable.defaults.language.infoPostFix
  75763. *
  75764. * @example
  75765. * $(document).ready( function() {
  75766. * $('#example').dataTable( {
  75767. * "language": {
  75768. * "infoPostFix": "All records shown are derived from real information."
  75769. * }
  75770. * } );
  75771. * } );
  75772. */
  75773. "sInfoPostFix": "",
  75774. /**
  75775. * This decimal place operator is a little different from the other
  75776. * language options since DataTables doesn't output floating point
  75777. * numbers, so it won't ever use this for display of a number. Rather,
  75778. * what this parameter does is modify the sort methods of the table so
  75779. * that numbers which are in a format which has a character other than
  75780. * a period (`.`) as a decimal place will be sorted numerically.
  75781. *
  75782. * Note that numbers with different decimal places cannot be shown in
  75783. * the same table and still be sortable, the table must be consistent.
  75784. * However, multiple different tables on the page can use different
  75785. * decimal place characters.
  75786. * @type string
  75787. * @default
  75788. *
  75789. * @dtopt Language
  75790. * @name DataTable.defaults.language.decimal
  75791. *
  75792. * @example
  75793. * $(document).ready( function() {
  75794. * $('#example').dataTable( {
  75795. * "language": {
  75796. * "decimal": ","
  75797. * "thousands": "."
  75798. * }
  75799. * } );
  75800. * } );
  75801. */
  75802. "sDecimal": "",
  75803. /**
  75804. * DataTables has a build in number formatter (`formatNumber`) which is
  75805. * used to format large numbers that are used in the table information.
  75806. * By default a comma is used, but this can be trivially changed to any
  75807. * character you wish with this parameter.
  75808. * @type string
  75809. * @default ,
  75810. *
  75811. * @dtopt Language
  75812. * @name DataTable.defaults.language.thousands
  75813. *
  75814. * @example
  75815. * $(document).ready( function() {
  75816. * $('#example').dataTable( {
  75817. * "language": {
  75818. * "thousands": "'"
  75819. * }
  75820. * } );
  75821. * } );
  75822. */
  75823. "sThousands": ",",
  75824. /**
  75825. * Detail the action that will be taken when the drop down menu for the
  75826. * pagination length option is changed. The '_MENU_' variable is replaced
  75827. * with a default select list of 10, 25, 50 and 100, and can be replaced
  75828. * with a custom select box if required.
  75829. * @type string
  75830. * @default Show _MENU_ entries
  75831. *
  75832. * @dtopt Language
  75833. * @name DataTable.defaults.language.lengthMenu
  75834. *
  75835. * @example
  75836. * // Language change only
  75837. * $(document).ready( function() {
  75838. * $('#example').dataTable( {
  75839. * "language": {
  75840. * "lengthMenu": "Display _MENU_ records"
  75841. * }
  75842. * } );
  75843. * } );
  75844. *
  75845. * @example
  75846. * // Language and options change
  75847. * $(document).ready( function() {
  75848. * $('#example').dataTable( {
  75849. * "language": {
  75850. * "lengthMenu": 'Display <select>'+
  75851. * '<option value="10">10</option>'+
  75852. * '<option value="20">20</option>'+
  75853. * '<option value="30">30</option>'+
  75854. * '<option value="40">40</option>'+
  75855. * '<option value="50">50</option>'+
  75856. * '<option value="-1">All</option>'+
  75857. * '</select> records'
  75858. * }
  75859. * } );
  75860. * } );
  75861. */
  75862. "sLengthMenu": "Show _MENU_ entries",
  75863. /**
  75864. * When using Ajax sourced data and during the first draw when DataTables is
  75865. * gathering the data, this message is shown in an empty row in the table to
  75866. * indicate to the end user the the data is being loaded. Note that this
  75867. * parameter is not used when loading data by server-side processing, just
  75868. * Ajax sourced data with client-side processing.
  75869. * @type string
  75870. * @default Loading...
  75871. *
  75872. * @dtopt Language
  75873. * @name DataTable.defaults.language.loadingRecords
  75874. *
  75875. * @example
  75876. * $(document).ready( function() {
  75877. * $('#example').dataTable( {
  75878. * "language": {
  75879. * "loadingRecords": "Please wait - loading..."
  75880. * }
  75881. * } );
  75882. * } );
  75883. */
  75884. "sLoadingRecords": "Loading...",
  75885. /**
  75886. * Text which is displayed when the table is processing a user action
  75887. * (usually a sort command or similar).
  75888. * @type string
  75889. * @default Processing...
  75890. *
  75891. * @dtopt Language
  75892. * @name DataTable.defaults.language.processing
  75893. *
  75894. * @example
  75895. * $(document).ready( function() {
  75896. * $('#example').dataTable( {
  75897. * "language": {
  75898. * "processing": "DataTables is currently busy"
  75899. * }
  75900. * } );
  75901. * } );
  75902. */
  75903. "sProcessing": "Processing...",
  75904. /**
  75905. * Details the actions that will be taken when the user types into the
  75906. * filtering input text box. The variable "_INPUT_", if used in the string,
  75907. * is replaced with the HTML text box for the filtering input allowing
  75908. * control over where it appears in the string. If "_INPUT_" is not given
  75909. * then the input box is appended to the string automatically.
  75910. * @type string
  75911. * @default Search:
  75912. *
  75913. * @dtopt Language
  75914. * @name DataTable.defaults.language.search
  75915. *
  75916. * @example
  75917. * // Input text box will be appended at the end automatically
  75918. * $(document).ready( function() {
  75919. * $('#example').dataTable( {
  75920. * "language": {
  75921. * "search": "Filter records:"
  75922. * }
  75923. * } );
  75924. * } );
  75925. *
  75926. * @example
  75927. * // Specify where the filter should appear
  75928. * $(document).ready( function() {
  75929. * $('#example').dataTable( {
  75930. * "language": {
  75931. * "search": "Apply filter _INPUT_ to table"
  75932. * }
  75933. * } );
  75934. * } );
  75935. */
  75936. "sSearch": "Search:",
  75937. /**
  75938. * Assign a `placeholder` attribute to the search `input` element
  75939. * @type string
  75940. * @default
  75941. *
  75942. * @dtopt Language
  75943. * @name DataTable.defaults.language.searchPlaceholder
  75944. */
  75945. "sSearchPlaceholder": "",
  75946. /**
  75947. * All of the language information can be stored in a file on the
  75948. * server-side, which DataTables will look up if this parameter is passed.
  75949. * It must store the URL of the language file, which is in a JSON format,
  75950. * and the object has the same properties as the oLanguage object in the
  75951. * initialiser object (i.e. the above parameters). Please refer to one of
  75952. * the example language files to see how this works in action.
  75953. * @type string
  75954. * @default <i>Empty string - i.e. disabled</i>
  75955. *
  75956. * @dtopt Language
  75957. * @name DataTable.defaults.language.url
  75958. *
  75959. * @example
  75960. * $(document).ready( function() {
  75961. * $('#example').dataTable( {
  75962. * "language": {
  75963. * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
  75964. * }
  75965. * } );
  75966. * } );
  75967. */
  75968. "sUrl": "",
  75969. /**
  75970. * Text shown inside the table records when the is no information to be
  75971. * displayed after filtering. `emptyTable` is shown when there is simply no
  75972. * information in the table at all (regardless of filtering).
  75973. * @type string
  75974. * @default No matching records found
  75975. *
  75976. * @dtopt Language
  75977. * @name DataTable.defaults.language.zeroRecords
  75978. *
  75979. * @example
  75980. * $(document).ready( function() {
  75981. * $('#example').dataTable( {
  75982. * "language": {
  75983. * "zeroRecords": "No records to display"
  75984. * }
  75985. * } );
  75986. * } );
  75987. */
  75988. "sZeroRecords": "No matching records found"
  75989. },
  75990. /**
  75991. * This parameter allows you to have define the global filtering state at
  75992. * initialisation time. As an object the `search` parameter must be
  75993. * defined, but all other parameters are optional. When `regex` is true,
  75994. * the search string will be treated as a regular expression, when false
  75995. * (default) it will be treated as a straight string. When `smart`
  75996. * DataTables will use it's smart filtering methods (to word match at
  75997. * any point in the data), when false this will not be done.
  75998. * @namespace
  75999. * @extends DataTable.models.oSearch
  76000. *
  76001. * @dtopt Options
  76002. * @name DataTable.defaults.search
  76003. *
  76004. * @example
  76005. * $(document).ready( function() {
  76006. * $('#example').dataTable( {
  76007. * "search": {"search": "Initial search"}
  76008. * } );
  76009. * } )
  76010. */
  76011. "oSearch": $.extend( {}, DataTable.models.oSearch ),
  76012. /**
  76013. * __Deprecated__ The functionality provided by this parameter has now been
  76014. * superseded by that provided through `ajax`, which should be used instead.
  76015. *
  76016. * By default DataTables will look for the property `data` (or `aaData` for
  76017. * compatibility with DataTables 1.9-) when obtaining data from an Ajax
  76018. * source or for server-side processing - this parameter allows that
  76019. * property to be changed. You can use Javascript dotted object notation to
  76020. * get a data source for multiple levels of nesting.
  76021. * @type string
  76022. * @default data
  76023. *
  76024. * @dtopt Options
  76025. * @dtopt Server-side
  76026. * @name DataTable.defaults.ajaxDataProp
  76027. *
  76028. * @deprecated 1.10. Please use `ajax` for this functionality now.
  76029. */
  76030. "sAjaxDataProp": "data",
  76031. /**
  76032. * __Deprecated__ The functionality provided by this parameter has now been
  76033. * superseded by that provided through `ajax`, which should be used instead.
  76034. *
  76035. * You can instruct DataTables to load data from an external
  76036. * source using this parameter (use aData if you want to pass data in you
  76037. * already have). Simply provide a url a JSON object can be obtained from.
  76038. * @type string
  76039. * @default null
  76040. *
  76041. * @dtopt Options
  76042. * @dtopt Server-side
  76043. * @name DataTable.defaults.ajaxSource
  76044. *
  76045. * @deprecated 1.10. Please use `ajax` for this functionality now.
  76046. */
  76047. "sAjaxSource": null,
  76048. /**
  76049. * This initialisation variable allows you to specify exactly where in the
  76050. * DOM you want DataTables to inject the various controls it adds to the page
  76051. * (for example you might want the pagination controls at the top of the
  76052. * table). DIV elements (with or without a custom class) can also be added to
  76053. * aid styling. The follow syntax is used:
  76054. * <ul>
  76055. * <li>The following options are allowed:
  76056. * <ul>
  76057. * <li>'l' - Length changing</li>
  76058. * <li>'f' - Filtering input</li>
  76059. * <li>'t' - The table!</li>
  76060. * <li>'i' - Information</li>
  76061. * <li>'p' - Pagination</li>
  76062. * <li>'r' - pRocessing</li>
  76063. * </ul>
  76064. * </li>
  76065. * <li>The following constants are allowed:
  76066. * <ul>
  76067. * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
  76068. * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
  76069. * </ul>
  76070. * </li>
  76071. * <li>The following syntax is expected:
  76072. * <ul>
  76073. * <li>'&lt;' and '&gt;' - div elements</li>
  76074. * <li>'&lt;"class" and '&gt;' - div with a class</li>
  76075. * <li>'&lt;"#id" and '&gt;' - div with an ID</li>
  76076. * </ul>
  76077. * </li>
  76078. * <li>Examples:
  76079. * <ul>
  76080. * <li>'&lt;"wrapper"flipt&gt;'</li>
  76081. * <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
  76082. * </ul>
  76083. * </li>
  76084. * </ul>
  76085. * @type string
  76086. * @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
  76087. * <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
  76088. *
  76089. * @dtopt Options
  76090. * @name DataTable.defaults.dom
  76091. *
  76092. * @example
  76093. * $(document).ready( function() {
  76094. * $('#example').dataTable( {
  76095. * "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
  76096. * } );
  76097. * } );
  76098. */
  76099. "sDom": "lfrtip",
  76100. /**
  76101. * Search delay option. This will throttle full table searches that use the
  76102. * DataTables provided search input element (it does not effect calls to
  76103. * `dt-api search()`, providing a delay before the search is made.
  76104. * @type integer
  76105. * @default 0
  76106. *
  76107. * @dtopt Options
  76108. * @name DataTable.defaults.searchDelay
  76109. *
  76110. * @example
  76111. * $(document).ready( function() {
  76112. * $('#example').dataTable( {
  76113. * "searchDelay": 200
  76114. * } );
  76115. * } )
  76116. */
  76117. "searchDelay": null,
  76118. /**
  76119. * DataTables features six different built-in options for the buttons to
  76120. * display for pagination control:
  76121. *
  76122. * * `numbers` - Page number buttons only
  76123. * * `simple` - 'Previous' and 'Next' buttons only
  76124. * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
  76125. * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
  76126. * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers
  76127. * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers
  76128. *
  76129. * Further methods can be added using {@link DataTable.ext.oPagination}.
  76130. * @type string
  76131. * @default simple_numbers
  76132. *
  76133. * @dtopt Options
  76134. * @name DataTable.defaults.pagingType
  76135. *
  76136. * @example
  76137. * $(document).ready( function() {
  76138. * $('#example').dataTable( {
  76139. * "pagingType": "full_numbers"
  76140. * } );
  76141. * } )
  76142. */
  76143. "sPaginationType": "simple_numbers",
  76144. /**
  76145. * Enable horizontal scrolling. When a table is too wide to fit into a
  76146. * certain layout, or you have a large number of columns in the table, you
  76147. * can enable x-scrolling to show the table in a viewport, which can be
  76148. * scrolled. This property can be `true` which will allow the table to
  76149. * scroll horizontally when needed, or any CSS unit, or a number (in which
  76150. * case it will be treated as a pixel measurement). Setting as simply `true`
  76151. * is recommended.
  76152. * @type boolean|string
  76153. * @default <i>blank string - i.e. disabled</i>
  76154. *
  76155. * @dtopt Features
  76156. * @name DataTable.defaults.scrollX
  76157. *
  76158. * @example
  76159. * $(document).ready( function() {
  76160. * $('#example').dataTable( {
  76161. * "scrollX": true,
  76162. * "scrollCollapse": true
  76163. * } );
  76164. * } );
  76165. */
  76166. "sScrollX": "",
  76167. /**
  76168. * This property can be used to force a DataTable to use more width than it
  76169. * might otherwise do when x-scrolling is enabled. For example if you have a
  76170. * table which requires to be well spaced, this parameter is useful for
  76171. * "over-sizing" the table, and thus forcing scrolling. This property can by
  76172. * any CSS unit, or a number (in which case it will be treated as a pixel
  76173. * measurement).
  76174. * @type string
  76175. * @default <i>blank string - i.e. disabled</i>
  76176. *
  76177. * @dtopt Options
  76178. * @name DataTable.defaults.scrollXInner
  76179. *
  76180. * @example
  76181. * $(document).ready( function() {
  76182. * $('#example').dataTable( {
  76183. * "scrollX": "100%",
  76184. * "scrollXInner": "110%"
  76185. * } );
  76186. * } );
  76187. */
  76188. "sScrollXInner": "",
  76189. /**
  76190. * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
  76191. * to the given height, and enable scrolling for any data which overflows the
  76192. * current viewport. This can be used as an alternative to paging to display
  76193. * a lot of data in a small area (although paging and scrolling can both be
  76194. * enabled at the same time). This property can be any CSS unit, or a number
  76195. * (in which case it will be treated as a pixel measurement).
  76196. * @type string
  76197. * @default <i>blank string - i.e. disabled</i>
  76198. *
  76199. * @dtopt Features
  76200. * @name DataTable.defaults.scrollY
  76201. *
  76202. * @example
  76203. * $(document).ready( function() {
  76204. * $('#example').dataTable( {
  76205. * "scrollY": "200px",
  76206. * "paginate": false
  76207. * } );
  76208. * } );
  76209. */
  76210. "sScrollY": "",
  76211. /**
  76212. * __Deprecated__ The functionality provided by this parameter has now been
  76213. * superseded by that provided through `ajax`, which should be used instead.
  76214. *
  76215. * Set the HTTP method that is used to make the Ajax call for server-side
  76216. * processing or Ajax sourced data.
  76217. * @type string
  76218. * @default GET
  76219. *
  76220. * @dtopt Options
  76221. * @dtopt Server-side
  76222. * @name DataTable.defaults.serverMethod
  76223. *
  76224. * @deprecated 1.10. Please use `ajax` for this functionality now.
  76225. */
  76226. "sServerMethod": "GET",
  76227. /**
  76228. * DataTables makes use of renderers when displaying HTML elements for
  76229. * a table. These renderers can be added or modified by plug-ins to
  76230. * generate suitable mark-up for a site. For example the Bootstrap
  76231. * integration plug-in for DataTables uses a paging button renderer to
  76232. * display pagination buttons in the mark-up required by Bootstrap.
  76233. *
  76234. * For further information about the renderers available see
  76235. * DataTable.ext.renderer
  76236. * @type string|object
  76237. * @default null
  76238. *
  76239. * @name DataTable.defaults.renderer
  76240. *
  76241. */
  76242. "renderer": null,
  76243. /**
  76244. * Set the data property name that DataTables should use to get a row's id
  76245. * to set as the `id` property in the node.
  76246. * @type string
  76247. * @default DT_RowId
  76248. *
  76249. * @name DataTable.defaults.rowId
  76250. */
  76251. "rowId": "DT_RowId"
  76252. };
  76253. _fnHungarianMap( DataTable.defaults );
  76254. /*
  76255. * Developer note - See note in model.defaults.js about the use of Hungarian
  76256. * notation and camel case.
  76257. */
  76258. /**
  76259. * Column options that can be given to DataTables at initialisation time.
  76260. * @namespace
  76261. */
  76262. DataTable.defaults.column = {
  76263. /**
  76264. * Define which column(s) an order will occur on for this column. This
  76265. * allows a column's ordering to take multiple columns into account when
  76266. * doing a sort or use the data from a different column. For example first
  76267. * name / last name columns make sense to do a multi-column sort over the
  76268. * two columns.
  76269. * @type array|int
  76270. * @default null <i>Takes the value of the column index automatically</i>
  76271. *
  76272. * @name DataTable.defaults.column.orderData
  76273. * @dtopt Columns
  76274. *
  76275. * @example
  76276. * // Using `columnDefs`
  76277. * $(document).ready( function() {
  76278. * $('#example').dataTable( {
  76279. * "columnDefs": [
  76280. * { "orderData": [ 0, 1 ], "targets": [ 0 ] },
  76281. * { "orderData": [ 1, 0 ], "targets": [ 1 ] },
  76282. * { "orderData": 2, "targets": [ 2 ] }
  76283. * ]
  76284. * } );
  76285. * } );
  76286. *
  76287. * @example
  76288. * // Using `columns`
  76289. * $(document).ready( function() {
  76290. * $('#example').dataTable( {
  76291. * "columns": [
  76292. * { "orderData": [ 0, 1 ] },
  76293. * { "orderData": [ 1, 0 ] },
  76294. * { "orderData": 2 },
  76295. * null,
  76296. * null
  76297. * ]
  76298. * } );
  76299. * } );
  76300. */
  76301. "aDataSort": null,
  76302. "iDataSort": -1,
  76303. /**
  76304. * You can control the default ordering direction, and even alter the
  76305. * behaviour of the sort handler (i.e. only allow ascending ordering etc)
  76306. * using this parameter.
  76307. * @type array
  76308. * @default [ 'asc', 'desc' ]
  76309. *
  76310. * @name DataTable.defaults.column.orderSequence
  76311. * @dtopt Columns
  76312. *
  76313. * @example
  76314. * // Using `columnDefs`
  76315. * $(document).ready( function() {
  76316. * $('#example').dataTable( {
  76317. * "columnDefs": [
  76318. * { "orderSequence": [ "asc" ], "targets": [ 1 ] },
  76319. * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
  76320. * { "orderSequence": [ "desc" ], "targets": [ 3 ] }
  76321. * ]
  76322. * } );
  76323. * } );
  76324. *
  76325. * @example
  76326. * // Using `columns`
  76327. * $(document).ready( function() {
  76328. * $('#example').dataTable( {
  76329. * "columns": [
  76330. * null,
  76331. * { "orderSequence": [ "asc" ] },
  76332. * { "orderSequence": [ "desc", "asc", "asc" ] },
  76333. * { "orderSequence": [ "desc" ] },
  76334. * null
  76335. * ]
  76336. * } );
  76337. * } );
  76338. */
  76339. "asSorting": [ 'asc', 'desc' ],
  76340. /**
  76341. * Enable or disable filtering on the data in this column.
  76342. * @type boolean
  76343. * @default true
  76344. *
  76345. * @name DataTable.defaults.column.searchable
  76346. * @dtopt Columns
  76347. *
  76348. * @example
  76349. * // Using `columnDefs`
  76350. * $(document).ready( function() {
  76351. * $('#example').dataTable( {
  76352. * "columnDefs": [
  76353. * { "searchable": false, "targets": [ 0 ] }
  76354. * ] } );
  76355. * } );
  76356. *
  76357. * @example
  76358. * // Using `columns`
  76359. * $(document).ready( function() {
  76360. * $('#example').dataTable( {
  76361. * "columns": [
  76362. * { "searchable": false },
  76363. * null,
  76364. * null,
  76365. * null,
  76366. * null
  76367. * ] } );
  76368. * } );
  76369. */
  76370. "bSearchable": true,
  76371. /**
  76372. * Enable or disable ordering on this column.
  76373. * @type boolean
  76374. * @default true
  76375. *
  76376. * @name DataTable.defaults.column.orderable
  76377. * @dtopt Columns
  76378. *
  76379. * @example
  76380. * // Using `columnDefs`
  76381. * $(document).ready( function() {
  76382. * $('#example').dataTable( {
  76383. * "columnDefs": [
  76384. * { "orderable": false, "targets": [ 0 ] }
  76385. * ] } );
  76386. * } );
  76387. *
  76388. * @example
  76389. * // Using `columns`
  76390. * $(document).ready( function() {
  76391. * $('#example').dataTable( {
  76392. * "columns": [
  76393. * { "orderable": false },
  76394. * null,
  76395. * null,
  76396. * null,
  76397. * null
  76398. * ] } );
  76399. * } );
  76400. */
  76401. "bSortable": true,
  76402. /**
  76403. * Enable or disable the display of this column.
  76404. * @type boolean
  76405. * @default true
  76406. *
  76407. * @name DataTable.defaults.column.visible
  76408. * @dtopt Columns
  76409. *
  76410. * @example
  76411. * // Using `columnDefs`
  76412. * $(document).ready( function() {
  76413. * $('#example').dataTable( {
  76414. * "columnDefs": [
  76415. * { "visible": false, "targets": [ 0 ] }
  76416. * ] } );
  76417. * } );
  76418. *
  76419. * @example
  76420. * // Using `columns`
  76421. * $(document).ready( function() {
  76422. * $('#example').dataTable( {
  76423. * "columns": [
  76424. * { "visible": false },
  76425. * null,
  76426. * null,
  76427. * null,
  76428. * null
  76429. * ] } );
  76430. * } );
  76431. */
  76432. "bVisible": true,
  76433. /**
  76434. * Developer definable function that is called whenever a cell is created (Ajax source,
  76435. * etc) or processed for input (DOM source). This can be used as a compliment to mRender
  76436. * allowing you to modify the DOM element (add background colour for example) when the
  76437. * element is available.
  76438. * @type function
  76439. * @param {element} td The TD node that has been created
  76440. * @param {*} cellData The Data for the cell
  76441. * @param {array|object} rowData The data for the whole row
  76442. * @param {int} row The row index for the aoData data store
  76443. * @param {int} col The column index for aoColumns
  76444. *
  76445. * @name DataTable.defaults.column.createdCell
  76446. * @dtopt Columns
  76447. *
  76448. * @example
  76449. * $(document).ready( function() {
  76450. * $('#example').dataTable( {
  76451. * "columnDefs": [ {
  76452. * "targets": [3],
  76453. * "createdCell": function (td, cellData, rowData, row, col) {
  76454. * if ( cellData == "1.7" ) {
  76455. * $(td).css('color', 'blue')
  76456. * }
  76457. * }
  76458. * } ]
  76459. * });
  76460. * } );
  76461. */
  76462. "fnCreatedCell": null,
  76463. /**
  76464. * This parameter has been replaced by `data` in DataTables to ensure naming
  76465. * consistency. `dataProp` can still be used, as there is backwards
  76466. * compatibility in DataTables for this option, but it is strongly
  76467. * recommended that you use `data` in preference to `dataProp`.
  76468. * @name DataTable.defaults.column.dataProp
  76469. */
  76470. /**
  76471. * This property can be used to read data from any data source property,
  76472. * including deeply nested objects / properties. `data` can be given in a
  76473. * number of different ways which effect its behaviour:
  76474. *
  76475. * * `integer` - treated as an array index for the data source. This is the
  76476. * default that DataTables uses (incrementally increased for each column).
  76477. * * `string` - read an object property from the data source. There are
  76478. * three 'special' options that can be used in the string to alter how
  76479. * DataTables reads the data from the source object:
  76480. * * `.` - Dotted Javascript notation. Just as you use a `.` in
  76481. * Javascript to read from nested objects, so to can the options
  76482. * specified in `data`. For example: `browser.version` or
  76483. * `browser.name`. If your object parameter name contains a period, use
  76484. * `\\` to escape it - i.e. `first\\.name`.
  76485. * * `[]` - Array notation. DataTables can automatically combine data
  76486. * from and array source, joining the data with the characters provided
  76487. * between the two brackets. For example: `name[, ]` would provide a
  76488. * comma-space separated list from the source array. If no characters
  76489. * are provided between the brackets, the original array source is
  76490. * returned.
  76491. * * `()` - Function notation. Adding `()` to the end of a parameter will
  76492. * execute a function of the name given. For example: `browser()` for a
  76493. * simple function on the data source, `browser.version()` for a
  76494. * function in a nested property or even `browser().version` to get an
  76495. * object property if the function called returns an object. Note that
  76496. * function notation is recommended for use in `render` rather than
  76497. * `data` as it is much simpler to use as a renderer.
  76498. * * `null` - use the original data source for the row rather than plucking
  76499. * data directly from it. This action has effects on two other
  76500. * initialisation options:
  76501. * * `defaultContent` - When null is given as the `data` option and
  76502. * `defaultContent` is specified for the column, the value defined by
  76503. * `defaultContent` will be used for the cell.
  76504. * * `render` - When null is used for the `data` option and the `render`
  76505. * option is specified for the column, the whole data source for the
  76506. * row is used for the renderer.
  76507. * * `function` - the function given will be executed whenever DataTables
  76508. * needs to set or get the data for a cell in the column. The function
  76509. * takes three parameters:
  76510. * * Parameters:
  76511. * * `{array|object}` The data source for the row
  76512. * * `{string}` The type call data requested - this will be 'set' when
  76513. * setting data or 'filter', 'display', 'type', 'sort' or undefined
  76514. * when gathering data. Note that when `undefined` is given for the
  76515. * type DataTables expects to get the raw data for the object back<
  76516. * * `{*}` Data to set when the second parameter is 'set'.
  76517. * * Return:
  76518. * * The return value from the function is not required when 'set' is
  76519. * the type of call, but otherwise the return is what will be used
  76520. * for the data requested.
  76521. *
  76522. * Note that `data` is a getter and setter option. If you just require
  76523. * formatting of data for output, you will likely want to use `render` which
  76524. * is simply a getter and thus simpler to use.
  76525. *
  76526. * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
  76527. * name change reflects the flexibility of this property and is consistent
  76528. * with the naming of mRender. If 'mDataProp' is given, then it will still
  76529. * be used by DataTables, as it automatically maps the old name to the new
  76530. * if required.
  76531. *
  76532. * @type string|int|function|null
  76533. * @default null <i>Use automatically calculated column index</i>
  76534. *
  76535. * @name DataTable.defaults.column.data
  76536. * @dtopt Columns
  76537. *
  76538. * @example
  76539. * // Read table data from objects
  76540. * // JSON structure for each row:
  76541. * // {
  76542. * // "engine": {value},
  76543. * // "browser": {value},
  76544. * // "platform": {value},
  76545. * // "version": {value},
  76546. * // "grade": {value}
  76547. * // }
  76548. * $(document).ready( function() {
  76549. * $('#example').dataTable( {
  76550. * "ajaxSource": "sources/objects.txt",
  76551. * "columns": [
  76552. * { "data": "engine" },
  76553. * { "data": "browser" },
  76554. * { "data": "platform" },
  76555. * { "data": "version" },
  76556. * { "data": "grade" }
  76557. * ]
  76558. * } );
  76559. * } );
  76560. *
  76561. * @example
  76562. * // Read information from deeply nested objects
  76563. * // JSON structure for each row:
  76564. * // {
  76565. * // "engine": {value},
  76566. * // "browser": {value},
  76567. * // "platform": {
  76568. * // "inner": {value}
  76569. * // },
  76570. * // "details": [
  76571. * // {value}, {value}
  76572. * // ]
  76573. * // }
  76574. * $(document).ready( function() {
  76575. * $('#example').dataTable( {
  76576. * "ajaxSource": "sources/deep.txt",
  76577. * "columns": [
  76578. * { "data": "engine" },
  76579. * { "data": "browser" },
  76580. * { "data": "platform.inner" },
  76581. * { "data": "platform.details.0" },
  76582. * { "data": "platform.details.1" }
  76583. * ]
  76584. * } );
  76585. * } );
  76586. *
  76587. * @example
  76588. * // Using `data` as a function to provide different information for
  76589. * // sorting, filtering and display. In this case, currency (price)
  76590. * $(document).ready( function() {
  76591. * $('#example').dataTable( {
  76592. * "columnDefs": [ {
  76593. * "targets": [ 0 ],
  76594. * "data": function ( source, type, val ) {
  76595. * if (type === 'set') {
  76596. * source.price = val;
  76597. * // Store the computed dislay and filter values for efficiency
  76598. * source.price_display = val=="" ? "" : "$"+numberFormat(val);
  76599. * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val;
  76600. * return;
  76601. * }
  76602. * else if (type === 'display') {
  76603. * return source.price_display;
  76604. * }
  76605. * else if (type === 'filter') {
  76606. * return source.price_filter;
  76607. * }
  76608. * // 'sort', 'type' and undefined all just use the integer
  76609. * return source.price;
  76610. * }
  76611. * } ]
  76612. * } );
  76613. * } );
  76614. *
  76615. * @example
  76616. * // Using default content
  76617. * $(document).ready( function() {
  76618. * $('#example').dataTable( {
  76619. * "columnDefs": [ {
  76620. * "targets": [ 0 ],
  76621. * "data": null,
  76622. * "defaultContent": "Click to edit"
  76623. * } ]
  76624. * } );
  76625. * } );
  76626. *
  76627. * @example
  76628. * // Using array notation - outputting a list from an array
  76629. * $(document).ready( function() {
  76630. * $('#example').dataTable( {
  76631. * "columnDefs": [ {
  76632. * "targets": [ 0 ],
  76633. * "data": "name[, ]"
  76634. * } ]
  76635. * } );
  76636. * } );
  76637. *
  76638. */
  76639. "mData": null,
  76640. /**
  76641. * This property is the rendering partner to `data` and it is suggested that
  76642. * when you want to manipulate data for display (including filtering,
  76643. * sorting etc) without altering the underlying data for the table, use this
  76644. * property. `render` can be considered to be the the read only companion to
  76645. * `data` which is read / write (then as such more complex). Like `data`
  76646. * this option can be given in a number of different ways to effect its
  76647. * behaviour:
  76648. *
  76649. * * `integer` - treated as an array index for the data source. This is the
  76650. * default that DataTables uses (incrementally increased for each column).
  76651. * * `string` - read an object property from the data source. There are
  76652. * three 'special' options that can be used in the string to alter how
  76653. * DataTables reads the data from the source object:
  76654. * * `.` - Dotted Javascript notation. Just as you use a `.` in
  76655. * Javascript to read from nested objects, so to can the options
  76656. * specified in `data`. For example: `browser.version` or
  76657. * `browser.name`. If your object parameter name contains a period, use
  76658. * `\\` to escape it - i.e. `first\\.name`.
  76659. * * `[]` - Array notation. DataTables can automatically combine data
  76660. * from and array source, joining the data with the characters provided
  76661. * between the two brackets. For example: `name[, ]` would provide a
  76662. * comma-space separated list from the source array. If no characters
  76663. * are provided between the brackets, the original array source is
  76664. * returned.
  76665. * * `()` - Function notation. Adding `()` to the end of a parameter will
  76666. * execute a function of the name given. For example: `browser()` for a
  76667. * simple function on the data source, `browser.version()` for a
  76668. * function in a nested property or even `browser().version` to get an
  76669. * object property if the function called returns an object.
  76670. * * `object` - use different data for the different data types requested by
  76671. * DataTables ('filter', 'display', 'type' or 'sort'). The property names
  76672. * of the object is the data type the property refers to and the value can
  76673. * defined using an integer, string or function using the same rules as
  76674. * `render` normally does. Note that an `_` option _must_ be specified.
  76675. * This is the default value to use if you haven't specified a value for
  76676. * the data type requested by DataTables.
  76677. * * `function` - the function given will be executed whenever DataTables
  76678. * needs to set or get the data for a cell in the column. The function
  76679. * takes three parameters:
  76680. * * Parameters:
  76681. * * {array|object} The data source for the row (based on `data`)
  76682. * * {string} The type call data requested - this will be 'filter',
  76683. * 'display', 'type' or 'sort'.
  76684. * * {array|object} The full data source for the row (not based on
  76685. * `data`)
  76686. * * Return:
  76687. * * The return value from the function is what will be used for the
  76688. * data requested.
  76689. *
  76690. * @type string|int|function|object|null
  76691. * @default null Use the data source value.
  76692. *
  76693. * @name DataTable.defaults.column.render
  76694. * @dtopt Columns
  76695. *
  76696. * @example
  76697. * // Create a comma separated list from an array of objects
  76698. * $(document).ready( function() {
  76699. * $('#example').dataTable( {
  76700. * "ajaxSource": "sources/deep.txt",
  76701. * "columns": [
  76702. * { "data": "engine" },
  76703. * { "data": "browser" },
  76704. * {
  76705. * "data": "platform",
  76706. * "render": "[, ].name"
  76707. * }
  76708. * ]
  76709. * } );
  76710. * } );
  76711. *
  76712. * @example
  76713. * // Execute a function to obtain data
  76714. * $(document).ready( function() {
  76715. * $('#example').dataTable( {
  76716. * "columnDefs": [ {
  76717. * "targets": [ 0 ],
  76718. * "data": null, // Use the full data source object for the renderer's source
  76719. * "render": "browserName()"
  76720. * } ]
  76721. * } );
  76722. * } );
  76723. *
  76724. * @example
  76725. * // As an object, extracting different data for the different types
  76726. * // This would be used with a data source such as:
  76727. * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
  76728. * // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
  76729. * // (which has both forms) is used for filtering for if a user inputs either format, while
  76730. * // the formatted phone number is the one that is shown in the table.
  76731. * $(document).ready( function() {
  76732. * $('#example').dataTable( {
  76733. * "columnDefs": [ {
  76734. * "targets": [ 0 ],
  76735. * "data": null, // Use the full data source object for the renderer's source
  76736. * "render": {
  76737. * "_": "phone",
  76738. * "filter": "phone_filter",
  76739. * "display": "phone_display"
  76740. * }
  76741. * } ]
  76742. * } );
  76743. * } );
  76744. *
  76745. * @example
  76746. * // Use as a function to create a link from the data source
  76747. * $(document).ready( function() {
  76748. * $('#example').dataTable( {
  76749. * "columnDefs": [ {
  76750. * "targets": [ 0 ],
  76751. * "data": "download_link",
  76752. * "render": function ( data, type, full ) {
  76753. * return '<a href="'+data+'">Download</a>';
  76754. * }
  76755. * } ]
  76756. * } );
  76757. * } );
  76758. */
  76759. "mRender": null,
  76760. /**
  76761. * Change the cell type created for the column - either TD cells or TH cells. This
  76762. * can be useful as TH cells have semantic meaning in the table body, allowing them
  76763. * to act as a header for a row (you may wish to add scope='row' to the TH elements).
  76764. * @type string
  76765. * @default td
  76766. *
  76767. * @name DataTable.defaults.column.cellType
  76768. * @dtopt Columns
  76769. *
  76770. * @example
  76771. * // Make the first column use TH cells
  76772. * $(document).ready( function() {
  76773. * $('#example').dataTable( {
  76774. * "columnDefs": [ {
  76775. * "targets": [ 0 ],
  76776. * "cellType": "th"
  76777. * } ]
  76778. * } );
  76779. * } );
  76780. */
  76781. "sCellType": "td",
  76782. /**
  76783. * Class to give to each cell in this column.
  76784. * @type string
  76785. * @default <i>Empty string</i>
  76786. *
  76787. * @name DataTable.defaults.column.class
  76788. * @dtopt Columns
  76789. *
  76790. * @example
  76791. * // Using `columnDefs`
  76792. * $(document).ready( function() {
  76793. * $('#example').dataTable( {
  76794. * "columnDefs": [
  76795. * { "class": "my_class", "targets": [ 0 ] }
  76796. * ]
  76797. * } );
  76798. * } );
  76799. *
  76800. * @example
  76801. * // Using `columns`
  76802. * $(document).ready( function() {
  76803. * $('#example').dataTable( {
  76804. * "columns": [
  76805. * { "class": "my_class" },
  76806. * null,
  76807. * null,
  76808. * null,
  76809. * null
  76810. * ]
  76811. * } );
  76812. * } );
  76813. */
  76814. "sClass": "",
  76815. /**
  76816. * When DataTables calculates the column widths to assign to each column,
  76817. * it finds the longest string in each column and then constructs a
  76818. * temporary table and reads the widths from that. The problem with this
  76819. * is that "mmm" is much wider then "iiii", but the latter is a longer
  76820. * string - thus the calculation can go wrong (doing it properly and putting
  76821. * it into an DOM object and measuring that is horribly(!) slow). Thus as
  76822. * a "work around" we provide this option. It will append its value to the
  76823. * text that is found to be the longest string for the column - i.e. padding.
  76824. * Generally you shouldn't need this!
  76825. * @type string
  76826. * @default <i>Empty string<i>
  76827. *
  76828. * @name DataTable.defaults.column.contentPadding
  76829. * @dtopt Columns
  76830. *
  76831. * @example
  76832. * // Using `columns`
  76833. * $(document).ready( function() {
  76834. * $('#example').dataTable( {
  76835. * "columns": [
  76836. * null,
  76837. * null,
  76838. * null,
  76839. * {
  76840. * "contentPadding": "mmm"
  76841. * }
  76842. * ]
  76843. * } );
  76844. * } );
  76845. */
  76846. "sContentPadding": "",
  76847. /**
  76848. * Allows a default value to be given for a column's data, and will be used
  76849. * whenever a null data source is encountered (this can be because `data`
  76850. * is set to null, or because the data source itself is null).
  76851. * @type string
  76852. * @default null
  76853. *
  76854. * @name DataTable.defaults.column.defaultContent
  76855. * @dtopt Columns
  76856. *
  76857. * @example
  76858. * // Using `columnDefs`
  76859. * $(document).ready( function() {
  76860. * $('#example').dataTable( {
  76861. * "columnDefs": [
  76862. * {
  76863. * "data": null,
  76864. * "defaultContent": "Edit",
  76865. * "targets": [ -1 ]
  76866. * }
  76867. * ]
  76868. * } );
  76869. * } );
  76870. *
  76871. * @example
  76872. * // Using `columns`
  76873. * $(document).ready( function() {
  76874. * $('#example').dataTable( {
  76875. * "columns": [
  76876. * null,
  76877. * null,
  76878. * null,
  76879. * {
  76880. * "data": null,
  76881. * "defaultContent": "Edit"
  76882. * }
  76883. * ]
  76884. * } );
  76885. * } );
  76886. */
  76887. "sDefaultContent": null,
  76888. /**
  76889. * This parameter is only used in DataTables' server-side processing. It can
  76890. * be exceptionally useful to know what columns are being displayed on the
  76891. * client side, and to map these to database fields. When defined, the names
  76892. * also allow DataTables to reorder information from the server if it comes
  76893. * back in an unexpected order (i.e. if you switch your columns around on the
  76894. * client-side, your server-side code does not also need updating).
  76895. * @type string
  76896. * @default <i>Empty string</i>
  76897. *
  76898. * @name DataTable.defaults.column.name
  76899. * @dtopt Columns
  76900. *
  76901. * @example
  76902. * // Using `columnDefs`
  76903. * $(document).ready( function() {
  76904. * $('#example').dataTable( {
  76905. * "columnDefs": [
  76906. * { "name": "engine", "targets": [ 0 ] },
  76907. * { "name": "browser", "targets": [ 1 ] },
  76908. * { "name": "platform", "targets": [ 2 ] },
  76909. * { "name": "version", "targets": [ 3 ] },
  76910. * { "name": "grade", "targets": [ 4 ] }
  76911. * ]
  76912. * } );
  76913. * } );
  76914. *
  76915. * @example
  76916. * // Using `columns`
  76917. * $(document).ready( function() {
  76918. * $('#example').dataTable( {
  76919. * "columns": [
  76920. * { "name": "engine" },
  76921. * { "name": "browser" },
  76922. * { "name": "platform" },
  76923. * { "name": "version" },
  76924. * { "name": "grade" }
  76925. * ]
  76926. * } );
  76927. * } );
  76928. */
  76929. "sName": "",
  76930. /**
  76931. * Defines a data source type for the ordering which can be used to read
  76932. * real-time information from the table (updating the internally cached
  76933. * version) prior to ordering. This allows ordering to occur on user
  76934. * editable elements such as form inputs.
  76935. * @type string
  76936. * @default std
  76937. *
  76938. * @name DataTable.defaults.column.orderDataType
  76939. * @dtopt Columns
  76940. *
  76941. * @example
  76942. * // Using `columnDefs`
  76943. * $(document).ready( function() {
  76944. * $('#example').dataTable( {
  76945. * "columnDefs": [
  76946. * { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
  76947. * { "type": "numeric", "targets": [ 3 ] },
  76948. * { "orderDataType": "dom-select", "targets": [ 4 ] },
  76949. * { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
  76950. * ]
  76951. * } );
  76952. * } );
  76953. *
  76954. * @example
  76955. * // Using `columns`
  76956. * $(document).ready( function() {
  76957. * $('#example').dataTable( {
  76958. * "columns": [
  76959. * null,
  76960. * null,
  76961. * { "orderDataType": "dom-text" },
  76962. * { "orderDataType": "dom-text", "type": "numeric" },
  76963. * { "orderDataType": "dom-select" },
  76964. * { "orderDataType": "dom-checkbox" }
  76965. * ]
  76966. * } );
  76967. * } );
  76968. */
  76969. "sSortDataType": "std",
  76970. /**
  76971. * The title of this column.
  76972. * @type string
  76973. * @default null <i>Derived from the 'TH' value for this column in the
  76974. * original HTML table.</i>
  76975. *
  76976. * @name DataTable.defaults.column.title
  76977. * @dtopt Columns
  76978. *
  76979. * @example
  76980. * // Using `columnDefs`
  76981. * $(document).ready( function() {
  76982. * $('#example').dataTable( {
  76983. * "columnDefs": [
  76984. * { "title": "My column title", "targets": [ 0 ] }
  76985. * ]
  76986. * } );
  76987. * } );
  76988. *
  76989. * @example
  76990. * // Using `columns`
  76991. * $(document).ready( function() {
  76992. * $('#example').dataTable( {
  76993. * "columns": [
  76994. * { "title": "My column title" },
  76995. * null,
  76996. * null,
  76997. * null,
  76998. * null
  76999. * ]
  77000. * } );
  77001. * } );
  77002. */
  77003. "sTitle": null,
  77004. /**
  77005. * The type allows you to specify how the data for this column will be
  77006. * ordered. Four types (string, numeric, date and html (which will strip
  77007. * HTML tags before ordering)) are currently available. Note that only date
  77008. * formats understood by Javascript's Date() object will be accepted as type
  77009. * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
  77010. * 'numeric', 'date' or 'html' (by default). Further types can be adding
  77011. * through plug-ins.
  77012. * @type string
  77013. * @default null <i>Auto-detected from raw data</i>
  77014. *
  77015. * @name DataTable.defaults.column.type
  77016. * @dtopt Columns
  77017. *
  77018. * @example
  77019. * // Using `columnDefs`
  77020. * $(document).ready( function() {
  77021. * $('#example').dataTable( {
  77022. * "columnDefs": [
  77023. * { "type": "html", "targets": [ 0 ] }
  77024. * ]
  77025. * } );
  77026. * } );
  77027. *
  77028. * @example
  77029. * // Using `columns`
  77030. * $(document).ready( function() {
  77031. * $('#example').dataTable( {
  77032. * "columns": [
  77033. * { "type": "html" },
  77034. * null,
  77035. * null,
  77036. * null,
  77037. * null
  77038. * ]
  77039. * } );
  77040. * } );
  77041. */
  77042. "sType": null,
  77043. /**
  77044. * Defining the width of the column, this parameter may take any CSS value
  77045. * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
  77046. * been given a specific width through this interface ensuring that the table
  77047. * remains readable.
  77048. * @type string
  77049. * @default null <i>Automatic</i>
  77050. *
  77051. * @name DataTable.defaults.column.width
  77052. * @dtopt Columns
  77053. *
  77054. * @example
  77055. * // Using `columnDefs`
  77056. * $(document).ready( function() {
  77057. * $('#example').dataTable( {
  77058. * "columnDefs": [
  77059. * { "width": "20%", "targets": [ 0 ] }
  77060. * ]
  77061. * } );
  77062. * } );
  77063. *
  77064. * @example
  77065. * // Using `columns`
  77066. * $(document).ready( function() {
  77067. * $('#example').dataTable( {
  77068. * "columns": [
  77069. * { "width": "20%" },
  77070. * null,
  77071. * null,
  77072. * null,
  77073. * null
  77074. * ]
  77075. * } );
  77076. * } );
  77077. */
  77078. "sWidth": null
  77079. };
  77080. _fnHungarianMap( DataTable.defaults.column );
  77081. /**
  77082. * DataTables settings object - this holds all the information needed for a
  77083. * given table, including configuration, data and current application of the
  77084. * table options. DataTables does not have a single instance for each DataTable
  77085. * with the settings attached to that instance, but rather instances of the
  77086. * DataTable "class" are created on-the-fly as needed (typically by a
  77087. * $().dataTable() call) and the settings object is then applied to that
  77088. * instance.
  77089. *
  77090. * Note that this object is related to {@link DataTable.defaults} but this
  77091. * one is the internal data store for DataTables's cache of columns. It should
  77092. * NOT be manipulated outside of DataTables. Any configuration should be done
  77093. * through the initialisation options.
  77094. * @namespace
  77095. * @todo Really should attach the settings object to individual instances so we
  77096. * don't need to create new instances on each $().dataTable() call (if the
  77097. * table already exists). It would also save passing oSettings around and
  77098. * into every single function. However, this is a very significant
  77099. * architecture change for DataTables and will almost certainly break
  77100. * backwards compatibility with older installations. This is something that
  77101. * will be done in 2.0.
  77102. */
  77103. DataTable.models.oSettings = {
  77104. /**
  77105. * Primary features of DataTables and their enablement state.
  77106. * @namespace
  77107. */
  77108. "oFeatures": {
  77109. /**
  77110. * Flag to say if DataTables should automatically try to calculate the
  77111. * optimum table and columns widths (true) or not (false).
  77112. * Note that this parameter will be set by the initialisation routine. To
  77113. * set a default use {@link DataTable.defaults}.
  77114. * @type boolean
  77115. */
  77116. "bAutoWidth": null,
  77117. /**
  77118. * Delay the creation of TR and TD elements until they are actually
  77119. * needed by a driven page draw. This can give a significant speed
  77120. * increase for Ajax source and Javascript source data, but makes no
  77121. * difference at all fro DOM and server-side processing tables.
  77122. * Note that this parameter will be set by the initialisation routine. To
  77123. * set a default use {@link DataTable.defaults}.
  77124. * @type boolean
  77125. */
  77126. "bDeferRender": null,
  77127. /**
  77128. * Enable filtering on the table or not. Note that if this is disabled
  77129. * then there is no filtering at all on the table, including fnFilter.
  77130. * To just remove the filtering input use sDom and remove the 'f' option.
  77131. * Note that this parameter will be set by the initialisation routine. To
  77132. * set a default use {@link DataTable.defaults}.
  77133. * @type boolean
  77134. */
  77135. "bFilter": null,
  77136. /**
  77137. * Table information element (the 'Showing x of y records' div) enable
  77138. * flag.
  77139. * Note that this parameter will be set by the initialisation routine. To
  77140. * set a default use {@link DataTable.defaults}.
  77141. * @type boolean
  77142. */
  77143. "bInfo": null,
  77144. /**
  77145. * Present a user control allowing the end user to change the page size
  77146. * when pagination is enabled.
  77147. * Note that this parameter will be set by the initialisation routine. To
  77148. * set a default use {@link DataTable.defaults}.
  77149. * @type boolean
  77150. */
  77151. "bLengthChange": null,
  77152. /**
  77153. * Pagination enabled or not. Note that if this is disabled then length
  77154. * changing must also be disabled.
  77155. * Note that this parameter will be set by the initialisation routine. To
  77156. * set a default use {@link DataTable.defaults}.
  77157. * @type boolean
  77158. */
  77159. "bPaginate": null,
  77160. /**
  77161. * Processing indicator enable flag whenever DataTables is enacting a
  77162. * user request - typically an Ajax request for server-side processing.
  77163. * Note that this parameter will be set by the initialisation routine. To
  77164. * set a default use {@link DataTable.defaults}.
  77165. * @type boolean
  77166. */
  77167. "bProcessing": null,
  77168. /**
  77169. * Server-side processing enabled flag - when enabled DataTables will
  77170. * get all data from the server for every draw - there is no filtering,
  77171. * sorting or paging done on the client-side.
  77172. * Note that this parameter will be set by the initialisation routine. To
  77173. * set a default use {@link DataTable.defaults}.
  77174. * @type boolean
  77175. */
  77176. "bServerSide": null,
  77177. /**
  77178. * Sorting enablement flag.
  77179. * Note that this parameter will be set by the initialisation routine. To
  77180. * set a default use {@link DataTable.defaults}.
  77181. * @type boolean
  77182. */
  77183. "bSort": null,
  77184. /**
  77185. * Multi-column sorting
  77186. * Note that this parameter will be set by the initialisation routine. To
  77187. * set a default use {@link DataTable.defaults}.
  77188. * @type boolean
  77189. */
  77190. "bSortMulti": null,
  77191. /**
  77192. * Apply a class to the columns which are being sorted to provide a
  77193. * visual highlight or not. This can slow things down when enabled since
  77194. * there is a lot of DOM interaction.
  77195. * Note that this parameter will be set by the initialisation routine. To
  77196. * set a default use {@link DataTable.defaults}.
  77197. * @type boolean
  77198. */
  77199. "bSortClasses": null,
  77200. /**
  77201. * State saving enablement flag.
  77202. * Note that this parameter will be set by the initialisation routine. To
  77203. * set a default use {@link DataTable.defaults}.
  77204. * @type boolean
  77205. */
  77206. "bStateSave": null
  77207. },
  77208. /**
  77209. * Scrolling settings for a table.
  77210. * @namespace
  77211. */
  77212. "oScroll": {
  77213. /**
  77214. * When the table is shorter in height than sScrollY, collapse the
  77215. * table container down to the height of the table (when true).
  77216. * Note that this parameter will be set by the initialisation routine. To
  77217. * set a default use {@link DataTable.defaults}.
  77218. * @type boolean
  77219. */
  77220. "bCollapse": null,
  77221. /**
  77222. * Width of the scrollbar for the web-browser's platform. Calculated
  77223. * during table initialisation.
  77224. * @type int
  77225. * @default 0
  77226. */
  77227. "iBarWidth": 0,
  77228. /**
  77229. * Viewport width for horizontal scrolling. Horizontal scrolling is
  77230. * disabled if an empty string.
  77231. * Note that this parameter will be set by the initialisation routine. To
  77232. * set a default use {@link DataTable.defaults}.
  77233. * @type string
  77234. */
  77235. "sX": null,
  77236. /**
  77237. * Width to expand the table to when using x-scrolling. Typically you
  77238. * should not need to use this.
  77239. * Note that this parameter will be set by the initialisation routine. To
  77240. * set a default use {@link DataTable.defaults}.
  77241. * @type string
  77242. * @deprecated
  77243. */
  77244. "sXInner": null,
  77245. /**
  77246. * Viewport height for vertical scrolling. Vertical scrolling is disabled
  77247. * if an empty string.
  77248. * Note that this parameter will be set by the initialisation routine. To
  77249. * set a default use {@link DataTable.defaults}.
  77250. * @type string
  77251. */
  77252. "sY": null
  77253. },
  77254. /**
  77255. * Language information for the table.
  77256. * @namespace
  77257. * @extends DataTable.defaults.oLanguage
  77258. */
  77259. "oLanguage": {
  77260. /**
  77261. * Information callback function. See
  77262. * {@link DataTable.defaults.fnInfoCallback}
  77263. * @type function
  77264. * @default null
  77265. */
  77266. "fnInfoCallback": null
  77267. },
  77268. /**
  77269. * Browser support parameters
  77270. * @namespace
  77271. */
  77272. "oBrowser": {
  77273. /**
  77274. * Indicate if the browser incorrectly calculates width:100% inside a
  77275. * scrolling element (IE6/7)
  77276. * @type boolean
  77277. * @default false
  77278. */
  77279. "bScrollOversize": false,
  77280. /**
  77281. * Determine if the vertical scrollbar is on the right or left of the
  77282. * scrolling container - needed for rtl language layout, although not
  77283. * all browsers move the scrollbar (Safari).
  77284. * @type boolean
  77285. * @default false
  77286. */
  77287. "bScrollbarLeft": false,
  77288. /**
  77289. * Flag for if `getBoundingClientRect` is fully supported or not
  77290. * @type boolean
  77291. * @default false
  77292. */
  77293. "bBounding": false,
  77294. /**
  77295. * Browser scrollbar width
  77296. * @type integer
  77297. * @default 0
  77298. */
  77299. "barWidth": 0
  77300. },
  77301. "ajax": null,
  77302. /**
  77303. * Array referencing the nodes which are used for the features. The
  77304. * parameters of this object match what is allowed by sDom - i.e.
  77305. * <ul>
  77306. * <li>'l' - Length changing</li>
  77307. * <li>'f' - Filtering input</li>
  77308. * <li>'t' - The table!</li>
  77309. * <li>'i' - Information</li>
  77310. * <li>'p' - Pagination</li>
  77311. * <li>'r' - pRocessing</li>
  77312. * </ul>
  77313. * @type array
  77314. * @default []
  77315. */
  77316. "aanFeatures": [],
  77317. /**
  77318. * Store data information - see {@link DataTable.models.oRow} for detailed
  77319. * information.
  77320. * @type array
  77321. * @default []
  77322. */
  77323. "aoData": [],
  77324. /**
  77325. * Array of indexes which are in the current display (after filtering etc)
  77326. * @type array
  77327. * @default []
  77328. */
  77329. "aiDisplay": [],
  77330. /**
  77331. * Array of indexes for display - no filtering
  77332. * @type array
  77333. * @default []
  77334. */
  77335. "aiDisplayMaster": [],
  77336. /**
  77337. * Map of row ids to data indexes
  77338. * @type object
  77339. * @default {}
  77340. */
  77341. "aIds": {},
  77342. /**
  77343. * Store information about each column that is in use
  77344. * @type array
  77345. * @default []
  77346. */
  77347. "aoColumns": [],
  77348. /**
  77349. * Store information about the table's header
  77350. * @type array
  77351. * @default []
  77352. */
  77353. "aoHeader": [],
  77354. /**
  77355. * Store information about the table's footer
  77356. * @type array
  77357. * @default []
  77358. */
  77359. "aoFooter": [],
  77360. /**
  77361. * Store the applied global search information in case we want to force a
  77362. * research or compare the old search to a new one.
  77363. * Note that this parameter will be set by the initialisation routine. To
  77364. * set a default use {@link DataTable.defaults}.
  77365. * @namespace
  77366. * @extends DataTable.models.oSearch
  77367. */
  77368. "oPreviousSearch": {},
  77369. /**
  77370. * Store the applied search for each column - see
  77371. * {@link DataTable.models.oSearch} for the format that is used for the
  77372. * filtering information for each column.
  77373. * @type array
  77374. * @default []
  77375. */
  77376. "aoPreSearchCols": [],
  77377. /**
  77378. * Sorting that is applied to the table. Note that the inner arrays are
  77379. * used in the following manner:
  77380. * <ul>
  77381. * <li>Index 0 - column number</li>
  77382. * <li>Index 1 - current sorting direction</li>
  77383. * </ul>
  77384. * Note that this parameter will be set by the initialisation routine. To
  77385. * set a default use {@link DataTable.defaults}.
  77386. * @type array
  77387. * @todo These inner arrays should really be objects
  77388. */
  77389. "aaSorting": null,
  77390. /**
  77391. * Sorting that is always applied to the table (i.e. prefixed in front of
  77392. * aaSorting).
  77393. * Note that this parameter will be set by the initialisation routine. To
  77394. * set a default use {@link DataTable.defaults}.
  77395. * @type array
  77396. * @default []
  77397. */
  77398. "aaSortingFixed": [],
  77399. /**
  77400. * Classes to use for the striping of a table.
  77401. * Note that this parameter will be set by the initialisation routine. To
  77402. * set a default use {@link DataTable.defaults}.
  77403. * @type array
  77404. * @default []
  77405. */
  77406. "asStripeClasses": null,
  77407. /**
  77408. * If restoring a table - we should restore its striping classes as well
  77409. * @type array
  77410. * @default []
  77411. */
  77412. "asDestroyStripes": [],
  77413. /**
  77414. * If restoring a table - we should restore its width
  77415. * @type int
  77416. * @default 0
  77417. */
  77418. "sDestroyWidth": 0,
  77419. /**
  77420. * Callback functions array for every time a row is inserted (i.e. on a draw).
  77421. * @type array
  77422. * @default []
  77423. */
  77424. "aoRowCallback": [],
  77425. /**
  77426. * Callback functions for the header on each draw.
  77427. * @type array
  77428. * @default []
  77429. */
  77430. "aoHeaderCallback": [],
  77431. /**
  77432. * Callback function for the footer on each draw.
  77433. * @type array
  77434. * @default []
  77435. */
  77436. "aoFooterCallback": [],
  77437. /**
  77438. * Array of callback functions for draw callback functions
  77439. * @type array
  77440. * @default []
  77441. */
  77442. "aoDrawCallback": [],
  77443. /**
  77444. * Array of callback functions for row created function
  77445. * @type array
  77446. * @default []
  77447. */
  77448. "aoRowCreatedCallback": [],
  77449. /**
  77450. * Callback functions for just before the table is redrawn. A return of
  77451. * false will be used to cancel the draw.
  77452. * @type array
  77453. * @default []
  77454. */
  77455. "aoPreDrawCallback": [],
  77456. /**
  77457. * Callback functions for when the table has been initialised.
  77458. * @type array
  77459. * @default []
  77460. */
  77461. "aoInitComplete": [],
  77462. /**
  77463. * Callbacks for modifying the settings to be stored for state saving, prior to
  77464. * saving state.
  77465. * @type array
  77466. * @default []
  77467. */
  77468. "aoStateSaveParams": [],
  77469. /**
  77470. * Callbacks for modifying the settings that have been stored for state saving
  77471. * prior to using the stored values to restore the state.
  77472. * @type array
  77473. * @default []
  77474. */
  77475. "aoStateLoadParams": [],
  77476. /**
  77477. * Callbacks for operating on the settings object once the saved state has been
  77478. * loaded
  77479. * @type array
  77480. * @default []
  77481. */
  77482. "aoStateLoaded": [],
  77483. /**
  77484. * Cache the table ID for quick access
  77485. * @type string
  77486. * @default <i>Empty string</i>
  77487. */
  77488. "sTableId": "",
  77489. /**
  77490. * The TABLE node for the main table
  77491. * @type node
  77492. * @default null
  77493. */
  77494. "nTable": null,
  77495. /**
  77496. * Permanent ref to the thead element
  77497. * @type node
  77498. * @default null
  77499. */
  77500. "nTHead": null,
  77501. /**
  77502. * Permanent ref to the tfoot element - if it exists
  77503. * @type node
  77504. * @default null
  77505. */
  77506. "nTFoot": null,
  77507. /**
  77508. * Permanent ref to the tbody element
  77509. * @type node
  77510. * @default null
  77511. */
  77512. "nTBody": null,
  77513. /**
  77514. * Cache the wrapper node (contains all DataTables controlled elements)
  77515. * @type node
  77516. * @default null
  77517. */
  77518. "nTableWrapper": null,
  77519. /**
  77520. * Indicate if when using server-side processing the loading of data
  77521. * should be deferred until the second draw.
  77522. * Note that this parameter will be set by the initialisation routine. To
  77523. * set a default use {@link DataTable.defaults}.
  77524. * @type boolean
  77525. * @default false
  77526. */
  77527. "bDeferLoading": false,
  77528. /**
  77529. * Indicate if all required information has been read in
  77530. * @type boolean
  77531. * @default false
  77532. */
  77533. "bInitialised": false,
  77534. /**
  77535. * Information about open rows. Each object in the array has the parameters
  77536. * 'nTr' and 'nParent'
  77537. * @type array
  77538. * @default []
  77539. */
  77540. "aoOpenRows": [],
  77541. /**
  77542. * Dictate the positioning of DataTables' control elements - see
  77543. * {@link DataTable.model.oInit.sDom}.
  77544. * Note that this parameter will be set by the initialisation routine. To
  77545. * set a default use {@link DataTable.defaults}.
  77546. * @type string
  77547. * @default null
  77548. */
  77549. "sDom": null,
  77550. /**
  77551. * Search delay (in mS)
  77552. * @type integer
  77553. * @default null
  77554. */
  77555. "searchDelay": null,
  77556. /**
  77557. * Which type of pagination should be used.
  77558. * Note that this parameter will be set by the initialisation routine. To
  77559. * set a default use {@link DataTable.defaults}.
  77560. * @type string
  77561. * @default two_button
  77562. */
  77563. "sPaginationType": "two_button",
  77564. /**
  77565. * The state duration (for `stateSave`) in seconds.
  77566. * Note that this parameter will be set by the initialisation routine. To
  77567. * set a default use {@link DataTable.defaults}.
  77568. * @type int
  77569. * @default 0
  77570. */
  77571. "iStateDuration": 0,
  77572. /**
  77573. * Array of callback functions for state saving. Each array element is an
  77574. * object with the following parameters:
  77575. * <ul>
  77576. * <li>function:fn - function to call. Takes two parameters, oSettings
  77577. * and the JSON string to save that has been thus far created. Returns
  77578. * a JSON string to be inserted into a json object
  77579. * (i.e. '"param": [ 0, 1, 2]')</li>
  77580. * <li>string:sName - name of callback</li>
  77581. * </ul>
  77582. * @type array
  77583. * @default []
  77584. */
  77585. "aoStateSave": [],
  77586. /**
  77587. * Array of callback functions for state loading. Each array element is an
  77588. * object with the following parameters:
  77589. * <ul>
  77590. * <li>function:fn - function to call. Takes two parameters, oSettings
  77591. * and the object stored. May return false to cancel state loading</li>
  77592. * <li>string:sName - name of callback</li>
  77593. * </ul>
  77594. * @type array
  77595. * @default []
  77596. */
  77597. "aoStateLoad": [],
  77598. /**
  77599. * State that was saved. Useful for back reference
  77600. * @type object
  77601. * @default null
  77602. */
  77603. "oSavedState": null,
  77604. /**
  77605. * State that was loaded. Useful for back reference
  77606. * @type object
  77607. * @default null
  77608. */
  77609. "oLoadedState": null,
  77610. /**
  77611. * Source url for AJAX data for the table.
  77612. * Note that this parameter will be set by the initialisation routine. To
  77613. * set a default use {@link DataTable.defaults}.
  77614. * @type string
  77615. * @default null
  77616. */
  77617. "sAjaxSource": null,
  77618. /**
  77619. * Property from a given object from which to read the table data from. This
  77620. * can be an empty string (when not server-side processing), in which case
  77621. * it is assumed an an array is given directly.
  77622. * Note that this parameter will be set by the initialisation routine. To
  77623. * set a default use {@link DataTable.defaults}.
  77624. * @type string
  77625. */
  77626. "sAjaxDataProp": null,
  77627. /**
  77628. * Note if draw should be blocked while getting data
  77629. * @type boolean
  77630. * @default true
  77631. */
  77632. "bAjaxDataGet": true,
  77633. /**
  77634. * The last jQuery XHR object that was used for server-side data gathering.
  77635. * This can be used for working with the XHR information in one of the
  77636. * callbacks
  77637. * @type object
  77638. * @default null
  77639. */
  77640. "jqXHR": null,
  77641. /**
  77642. * JSON returned from the server in the last Ajax request
  77643. * @type object
  77644. * @default undefined
  77645. */
  77646. "json": undefined,
  77647. /**
  77648. * Data submitted as part of the last Ajax request
  77649. * @type object
  77650. * @default undefined
  77651. */
  77652. "oAjaxData": undefined,
  77653. /**
  77654. * Function to get the server-side data.
  77655. * Note that this parameter will be set by the initialisation routine. To
  77656. * set a default use {@link DataTable.defaults}.
  77657. * @type function
  77658. */
  77659. "fnServerData": null,
  77660. /**
  77661. * Functions which are called prior to sending an Ajax request so extra
  77662. * parameters can easily be sent to the server
  77663. * @type array
  77664. * @default []
  77665. */
  77666. "aoServerParams": [],
  77667. /**
  77668. * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
  77669. * required).
  77670. * Note that this parameter will be set by the initialisation routine. To
  77671. * set a default use {@link DataTable.defaults}.
  77672. * @type string
  77673. */
  77674. "sServerMethod": null,
  77675. /**
  77676. * Format numbers for display.
  77677. * Note that this parameter will be set by the initialisation routine. To
  77678. * set a default use {@link DataTable.defaults}.
  77679. * @type function
  77680. */
  77681. "fnFormatNumber": null,
  77682. /**
  77683. * List of options that can be used for the user selectable length menu.
  77684. * Note that this parameter will be set by the initialisation routine. To
  77685. * set a default use {@link DataTable.defaults}.
  77686. * @type array
  77687. * @default []
  77688. */
  77689. "aLengthMenu": null,
  77690. /**
  77691. * Counter for the draws that the table does. Also used as a tracker for
  77692. * server-side processing
  77693. * @type int
  77694. * @default 0
  77695. */
  77696. "iDraw": 0,
  77697. /**
  77698. * Indicate if a redraw is being done - useful for Ajax
  77699. * @type boolean
  77700. * @default false
  77701. */
  77702. "bDrawing": false,
  77703. /**
  77704. * Draw index (iDraw) of the last error when parsing the returned data
  77705. * @type int
  77706. * @default -1
  77707. */
  77708. "iDrawError": -1,
  77709. /**
  77710. * Paging display length
  77711. * @type int
  77712. * @default 10
  77713. */
  77714. "_iDisplayLength": 10,
  77715. /**
  77716. * Paging start point - aiDisplay index
  77717. * @type int
  77718. * @default 0
  77719. */
  77720. "_iDisplayStart": 0,
  77721. /**
  77722. * Server-side processing - number of records in the result set
  77723. * (i.e. before filtering), Use fnRecordsTotal rather than
  77724. * this property to get the value of the number of records, regardless of
  77725. * the server-side processing setting.
  77726. * @type int
  77727. * @default 0
  77728. * @private
  77729. */
  77730. "_iRecordsTotal": 0,
  77731. /**
  77732. * Server-side processing - number of records in the current display set
  77733. * (i.e. after filtering). Use fnRecordsDisplay rather than
  77734. * this property to get the value of the number of records, regardless of
  77735. * the server-side processing setting.
  77736. * @type boolean
  77737. * @default 0
  77738. * @private
  77739. */
  77740. "_iRecordsDisplay": 0,
  77741. /**
  77742. * The classes to use for the table
  77743. * @type object
  77744. * @default {}
  77745. */
  77746. "oClasses": {},
  77747. /**
  77748. * Flag attached to the settings object so you can check in the draw
  77749. * callback if filtering has been done in the draw. Deprecated in favour of
  77750. * events.
  77751. * @type boolean
  77752. * @default false
  77753. * @deprecated
  77754. */
  77755. "bFiltered": false,
  77756. /**
  77757. * Flag attached to the settings object so you can check in the draw
  77758. * callback if sorting has been done in the draw. Deprecated in favour of
  77759. * events.
  77760. * @type boolean
  77761. * @default false
  77762. * @deprecated
  77763. */
  77764. "bSorted": false,
  77765. /**
  77766. * Indicate that if multiple rows are in the header and there is more than
  77767. * one unique cell per column, if the top one (true) or bottom one (false)
  77768. * should be used for sorting / title by DataTables.
  77769. * Note that this parameter will be set by the initialisation routine. To
  77770. * set a default use {@link DataTable.defaults}.
  77771. * @type boolean
  77772. */
  77773. "bSortCellsTop": null,
  77774. /**
  77775. * Initialisation object that is used for the table
  77776. * @type object
  77777. * @default null
  77778. */
  77779. "oInit": null,
  77780. /**
  77781. * Destroy callback functions - for plug-ins to attach themselves to the
  77782. * destroy so they can clean up markup and events.
  77783. * @type array
  77784. * @default []
  77785. */
  77786. "aoDestroyCallback": [],
  77787. /**
  77788. * Get the number of records in the current record set, before filtering
  77789. * @type function
  77790. */
  77791. "fnRecordsTotal": function ()
  77792. {
  77793. return _fnDataSource( this ) == 'ssp' ?
  77794. this._iRecordsTotal * 1 :
  77795. this.aiDisplayMaster.length;
  77796. },
  77797. /**
  77798. * Get the number of records in the current record set, after filtering
  77799. * @type function
  77800. */
  77801. "fnRecordsDisplay": function ()
  77802. {
  77803. return _fnDataSource( this ) == 'ssp' ?
  77804. this._iRecordsDisplay * 1 :
  77805. this.aiDisplay.length;
  77806. },
  77807. /**
  77808. * Get the display end point - aiDisplay index
  77809. * @type function
  77810. */
  77811. "fnDisplayEnd": function ()
  77812. {
  77813. var
  77814. len = this._iDisplayLength,
  77815. start = this._iDisplayStart,
  77816. calc = start + len,
  77817. records = this.aiDisplay.length,
  77818. features = this.oFeatures,
  77819. paginate = features.bPaginate;
  77820. if ( features.bServerSide ) {
  77821. return paginate === false || len === -1 ?
  77822. start + records :
  77823. Math.min( start+len, this._iRecordsDisplay );
  77824. }
  77825. else {
  77826. return ! paginate || calc>records || len===-1 ?
  77827. records :
  77828. calc;
  77829. }
  77830. },
  77831. /**
  77832. * The DataTables object for this table
  77833. * @type object
  77834. * @default null
  77835. */
  77836. "oInstance": null,
  77837. /**
  77838. * Unique identifier for each instance of the DataTables object. If there
  77839. * is an ID on the table node, then it takes that value, otherwise an
  77840. * incrementing internal counter is used.
  77841. * @type string
  77842. * @default null
  77843. */
  77844. "sInstance": null,
  77845. /**
  77846. * tabindex attribute value that is added to DataTables control elements, allowing
  77847. * keyboard navigation of the table and its controls.
  77848. */
  77849. "iTabIndex": 0,
  77850. /**
  77851. * DIV container for the footer scrolling table if scrolling
  77852. */
  77853. "nScrollHead": null,
  77854. /**
  77855. * DIV container for the footer scrolling table if scrolling
  77856. */
  77857. "nScrollFoot": null,
  77858. /**
  77859. * Last applied sort
  77860. * @type array
  77861. * @default []
  77862. */
  77863. "aLastSort": [],
  77864. /**
  77865. * Stored plug-in instances
  77866. * @type object
  77867. * @default {}
  77868. */
  77869. "oPlugins": {},
  77870. /**
  77871. * Function used to get a row's id from the row's data
  77872. * @type function
  77873. * @default null
  77874. */
  77875. "rowIdFn": null,
  77876. /**
  77877. * Data location where to store a row's id
  77878. * @type string
  77879. * @default null
  77880. */
  77881. "rowId": null
  77882. };
  77883. /**
  77884. * Extension object for DataTables that is used to provide all extension
  77885. * options.
  77886. *
  77887. * Note that the `DataTable.ext` object is available through
  77888. * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
  77889. * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
  77890. * @namespace
  77891. * @extends DataTable.models.ext
  77892. */
  77893. /**
  77894. * DataTables extensions
  77895. *
  77896. * This namespace acts as a collection area for plug-ins that can be used to
  77897. * extend DataTables capabilities. Indeed many of the build in methods
  77898. * use this method to provide their own capabilities (sorting methods for
  77899. * example).
  77900. *
  77901. * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
  77902. * reasons
  77903. *
  77904. * @namespace
  77905. */
  77906. DataTable.ext = _ext = {
  77907. /**
  77908. * Buttons. For use with the Buttons extension for DataTables. This is
  77909. * defined here so other extensions can define buttons regardless of load
  77910. * order. It is _not_ used by DataTables core.
  77911. *
  77912. * @type object
  77913. * @default {}
  77914. */
  77915. buttons: {},
  77916. /**
  77917. * Element class names
  77918. *
  77919. * @type object
  77920. * @default {}
  77921. */
  77922. classes: {},
  77923. /**
  77924. * DataTables build type (expanded by the download builder)
  77925. *
  77926. * @type string
  77927. */
  77928. build:"bs4/jszip-2.5.0/pdfmake-0.1.32/dt-1.10.16/af-2.2.2/b-1.5.1/b-colvis-1.5.1/b-flash-1.5.1/b-html5-1.5.1/b-print-1.5.1/cr-1.4.1/fc-3.2.4/fh-3.1.3/kt-2.3.2/r-2.2.1/rg-1.0.2/rr-1.2.3/sc-1.4.4/sl-1.2.5",
  77929. /**
  77930. * Error reporting.
  77931. *
  77932. * How should DataTables report an error. Can take the value 'alert',
  77933. * 'throw', 'none' or a function.
  77934. *
  77935. * @type string|function
  77936. * @default alert
  77937. */
  77938. errMode: "alert",
  77939. /**
  77940. * Feature plug-ins.
  77941. *
  77942. * This is an array of objects which describe the feature plug-ins that are
  77943. * available to DataTables. These feature plug-ins are then available for
  77944. * use through the `dom` initialisation option.
  77945. *
  77946. * Each feature plug-in is described by an object which must have the
  77947. * following properties:
  77948. *
  77949. * * `fnInit` - function that is used to initialise the plug-in,
  77950. * * `cFeature` - a character so the feature can be enabled by the `dom`
  77951. * instillation option. This is case sensitive.
  77952. *
  77953. * The `fnInit` function has the following input parameters:
  77954. *
  77955. * 1. `{object}` DataTables settings object: see
  77956. * {@link DataTable.models.oSettings}
  77957. *
  77958. * And the following return is expected:
  77959. *
  77960. * * {node|null} The element which contains your feature. Note that the
  77961. * return may also be void if your plug-in does not require to inject any
  77962. * DOM elements into DataTables control (`dom`) - for example this might
  77963. * be useful when developing a plug-in which allows table control via
  77964. * keyboard entry
  77965. *
  77966. * @type array
  77967. *
  77968. * @example
  77969. * $.fn.dataTable.ext.features.push( {
  77970. * "fnInit": function( oSettings ) {
  77971. * return new TableTools( { "oDTSettings": oSettings } );
  77972. * },
  77973. * "cFeature": "T"
  77974. * } );
  77975. */
  77976. feature: [],
  77977. /**
  77978. * Row searching.
  77979. *
  77980. * This method of searching is complimentary to the default type based
  77981. * searching, and a lot more comprehensive as it allows you complete control
  77982. * over the searching logic. Each element in this array is a function
  77983. * (parameters described below) that is called for every row in the table,
  77984. * and your logic decides if it should be included in the searching data set
  77985. * or not.
  77986. *
  77987. * Searching functions have the following input parameters:
  77988. *
  77989. * 1. `{object}` DataTables settings object: see
  77990. * {@link DataTable.models.oSettings}
  77991. * 2. `{array|object}` Data for the row to be processed (same as the
  77992. * original format that was passed in as the data source, or an array
  77993. * from a DOM data source
  77994. * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
  77995. * can be useful to retrieve the `TR` element if you need DOM interaction.
  77996. *
  77997. * And the following return is expected:
  77998. *
  77999. * * {boolean} Include the row in the searched result set (true) or not
  78000. * (false)
  78001. *
  78002. * Note that as with the main search ability in DataTables, technically this
  78003. * is "filtering", since it is subtractive. However, for consistency in
  78004. * naming we call it searching here.
  78005. *
  78006. * @type array
  78007. * @default []
  78008. *
  78009. * @example
  78010. * // The following example shows custom search being applied to the
  78011. * // fourth column (i.e. the data[3] index) based on two input values
  78012. * // from the end-user, matching the data in a certain range.
  78013. * $.fn.dataTable.ext.search.push(
  78014. * function( settings, data, dataIndex ) {
  78015. * var min = document.getElementById('min').value * 1;
  78016. * var max = document.getElementById('max').value * 1;
  78017. * var version = data[3] == "-" ? 0 : data[3]*1;
  78018. *
  78019. * if ( min == "" && max == "" ) {
  78020. * return true;
  78021. * }
  78022. * else if ( min == "" && version < max ) {
  78023. * return true;
  78024. * }
  78025. * else if ( min < version && "" == max ) {
  78026. * return true;
  78027. * }
  78028. * else if ( min < version && version < max ) {
  78029. * return true;
  78030. * }
  78031. * return false;
  78032. * }
  78033. * );
  78034. */
  78035. search: [],
  78036. /**
  78037. * Selector extensions
  78038. *
  78039. * The `selector` option can be used to extend the options available for the
  78040. * selector modifier options (`selector-modifier` object data type) that
  78041. * each of the three built in selector types offer (row, column and cell +
  78042. * their plural counterparts). For example the Select extension uses this
  78043. * mechanism to provide an option to select only rows, columns and cells
  78044. * that have been marked as selected by the end user (`{selected: true}`),
  78045. * which can be used in conjunction with the existing built in selector
  78046. * options.
  78047. *
  78048. * Each property is an array to which functions can be pushed. The functions
  78049. * take three attributes:
  78050. *
  78051. * * Settings object for the host table
  78052. * * Options object (`selector-modifier` object type)
  78053. * * Array of selected item indexes
  78054. *
  78055. * The return is an array of the resulting item indexes after the custom
  78056. * selector has been applied.
  78057. *
  78058. * @type object
  78059. */
  78060. selector: {
  78061. cell: [],
  78062. column: [],
  78063. row: []
  78064. },
  78065. /**
  78066. * Internal functions, exposed for used in plug-ins.
  78067. *
  78068. * Please note that you should not need to use the internal methods for
  78069. * anything other than a plug-in (and even then, try to avoid if possible).
  78070. * The internal function may change between releases.
  78071. *
  78072. * @type object
  78073. * @default {}
  78074. */
  78075. internal: {},
  78076. /**
  78077. * Legacy configuration options. Enable and disable legacy options that
  78078. * are available in DataTables.
  78079. *
  78080. * @type object
  78081. */
  78082. legacy: {
  78083. /**
  78084. * Enable / disable DataTables 1.9 compatible server-side processing
  78085. * requests
  78086. *
  78087. * @type boolean
  78088. * @default null
  78089. */
  78090. ajax: null
  78091. },
  78092. /**
  78093. * Pagination plug-in methods.
  78094. *
  78095. * Each entry in this object is a function and defines which buttons should
  78096. * be shown by the pagination rendering method that is used for the table:
  78097. * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
  78098. * buttons are displayed in the document, while the functions here tell it
  78099. * what buttons to display. This is done by returning an array of button
  78100. * descriptions (what each button will do).
  78101. *
  78102. * Pagination types (the four built in options and any additional plug-in
  78103. * options defined here) can be used through the `paginationType`
  78104. * initialisation parameter.
  78105. *
  78106. * The functions defined take two parameters:
  78107. *
  78108. * 1. `{int} page` The current page index
  78109. * 2. `{int} pages` The number of pages in the table
  78110. *
  78111. * Each function is expected to return an array where each element of the
  78112. * array can be one of:
  78113. *
  78114. * * `first` - Jump to first page when activated
  78115. * * `last` - Jump to last page when activated
  78116. * * `previous` - Show previous page when activated
  78117. * * `next` - Show next page when activated
  78118. * * `{int}` - Show page of the index given
  78119. * * `{array}` - A nested array containing the above elements to add a
  78120. * containing 'DIV' element (might be useful for styling).
  78121. *
  78122. * Note that DataTables v1.9- used this object slightly differently whereby
  78123. * an object with two functions would be defined for each plug-in. That
  78124. * ability is still supported by DataTables 1.10+ to provide backwards
  78125. * compatibility, but this option of use is now decremented and no longer
  78126. * documented in DataTables 1.10+.
  78127. *
  78128. * @type object
  78129. * @default {}
  78130. *
  78131. * @example
  78132. * // Show previous, next and current page buttons only
  78133. * $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
  78134. * return [ 'previous', page, 'next' ];
  78135. * };
  78136. */
  78137. pager: {},
  78138. renderer: {
  78139. pageButton: {},
  78140. header: {}
  78141. },
  78142. /**
  78143. * Ordering plug-ins - custom data source
  78144. *
  78145. * The extension options for ordering of data available here is complimentary
  78146. * to the default type based ordering that DataTables typically uses. It
  78147. * allows much greater control over the the data that is being used to
  78148. * order a column, but is necessarily therefore more complex.
  78149. *
  78150. * This type of ordering is useful if you want to do ordering based on data
  78151. * live from the DOM (for example the contents of an 'input' element) rather
  78152. * than just the static string that DataTables knows of.
  78153. *
  78154. * The way these plug-ins work is that you create an array of the values you
  78155. * wish to be ordering for the column in question and then return that
  78156. * array. The data in the array much be in the index order of the rows in
  78157. * the table (not the currently ordering order!). Which order data gathering
  78158. * function is run here depends on the `dt-init columns.orderDataType`
  78159. * parameter that is used for the column (if any).
  78160. *
  78161. * The functions defined take two parameters:
  78162. *
  78163. * 1. `{object}` DataTables settings object: see
  78164. * {@link DataTable.models.oSettings}
  78165. * 2. `{int}` Target column index
  78166. *
  78167. * Each function is expected to return an array:
  78168. *
  78169. * * `{array}` Data for the column to be ordering upon
  78170. *
  78171. * @type array
  78172. *
  78173. * @example
  78174. * // Ordering using `input` node values
  78175. * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col )
  78176. * {
  78177. * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
  78178. * return $('input', td).val();
  78179. * } );
  78180. * }
  78181. */
  78182. order: {},
  78183. /**
  78184. * Type based plug-ins.
  78185. *
  78186. * Each column in DataTables has a type assigned to it, either by automatic
  78187. * detection or by direct assignment using the `type` option for the column.
  78188. * The type of a column will effect how it is ordering and search (plug-ins
  78189. * can also make use of the column type if required).
  78190. *
  78191. * @namespace
  78192. */
  78193. type: {
  78194. /**
  78195. * Type detection functions.
  78196. *
  78197. * The functions defined in this object are used to automatically detect
  78198. * a column's type, making initialisation of DataTables super easy, even
  78199. * when complex data is in the table.
  78200. *
  78201. * The functions defined take two parameters:
  78202. *
  78203. * 1. `{*}` Data from the column cell to be analysed
  78204. * 2. `{settings}` DataTables settings object. This can be used to
  78205. * perform context specific type detection - for example detection
  78206. * based on language settings such as using a comma for a decimal
  78207. * place. Generally speaking the options from the settings will not
  78208. * be required
  78209. *
  78210. * Each function is expected to return:
  78211. *
  78212. * * `{string|null}` Data type detected, or null if unknown (and thus
  78213. * pass it on to the other type detection functions.
  78214. *
  78215. * @type array
  78216. *
  78217. * @example
  78218. * // Currency type detection plug-in:
  78219. * $.fn.dataTable.ext.type.detect.push(
  78220. * function ( data, settings ) {
  78221. * // Check the numeric part
  78222. * if ( ! $.isNumeric( data.substring(1) ) ) {
  78223. * return null;
  78224. * }
  78225. *
  78226. * // Check prefixed by currency
  78227. * if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
  78228. * return 'currency';
  78229. * }
  78230. * return null;
  78231. * }
  78232. * );
  78233. */
  78234. detect: [],
  78235. /**
  78236. * Type based search formatting.
  78237. *
  78238. * The type based searching functions can be used to pre-format the
  78239. * data to be search on. For example, it can be used to strip HTML
  78240. * tags or to de-format telephone numbers for numeric only searching.
  78241. *
  78242. * Note that is a search is not defined for a column of a given type,
  78243. * no search formatting will be performed.
  78244. *
  78245. * Pre-processing of searching data plug-ins - When you assign the sType
  78246. * for a column (or have it automatically detected for you by DataTables
  78247. * or a type detection plug-in), you will typically be using this for
  78248. * custom sorting, but it can also be used to provide custom searching
  78249. * by allowing you to pre-processing the data and returning the data in
  78250. * the format that should be searched upon. This is done by adding
  78251. * functions this object with a parameter name which matches the sType
  78252. * for that target column. This is the corollary of <i>afnSortData</i>
  78253. * for searching data.
  78254. *
  78255. * The functions defined take a single parameter:
  78256. *
  78257. * 1. `{*}` Data from the column cell to be prepared for searching
  78258. *
  78259. * Each function is expected to return:
  78260. *
  78261. * * `{string|null}` Formatted string that will be used for the searching.
  78262. *
  78263. * @type object
  78264. * @default {}
  78265. *
  78266. * @example
  78267. * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
  78268. * return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
  78269. * }
  78270. */
  78271. search: {},
  78272. /**
  78273. * Type based ordering.
  78274. *
  78275. * The column type tells DataTables what ordering to apply to the table
  78276. * when a column is sorted upon. The order for each type that is defined,
  78277. * is defined by the functions available in this object.
  78278. *
  78279. * Each ordering option can be described by three properties added to
  78280. * this object:
  78281. *
  78282. * * `{type}-pre` - Pre-formatting function
  78283. * * `{type}-asc` - Ascending order function
  78284. * * `{type}-desc` - Descending order function
  78285. *
  78286. * All three can be used together, only `{type}-pre` or only
  78287. * `{type}-asc` and `{type}-desc` together. It is generally recommended
  78288. * that only `{type}-pre` is used, as this provides the optimal
  78289. * implementation in terms of speed, although the others are provided
  78290. * for compatibility with existing Javascript sort functions.
  78291. *
  78292. * `{type}-pre`: Functions defined take a single parameter:
  78293. *
  78294. * 1. `{*}` Data from the column cell to be prepared for ordering
  78295. *
  78296. * And return:
  78297. *
  78298. * * `{*}` Data to be sorted upon
  78299. *
  78300. * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
  78301. * functions, taking two parameters:
  78302. *
  78303. * 1. `{*}` Data to compare to the second parameter
  78304. * 2. `{*}` Data to compare to the first parameter
  78305. *
  78306. * And returning:
  78307. *
  78308. * * `{*}` Ordering match: <0 if first parameter should be sorted lower
  78309. * than the second parameter, ===0 if the two parameters are equal and
  78310. * >0 if the first parameter should be sorted height than the second
  78311. * parameter.
  78312. *
  78313. * @type object
  78314. * @default {}
  78315. *
  78316. * @example
  78317. * // Numeric ordering of formatted numbers with a pre-formatter
  78318. * $.extend( $.fn.dataTable.ext.type.order, {
  78319. * "string-pre": function(x) {
  78320. * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
  78321. * return parseFloat( a );
  78322. * }
  78323. * } );
  78324. *
  78325. * @example
  78326. * // Case-sensitive string ordering, with no pre-formatting method
  78327. * $.extend( $.fn.dataTable.ext.order, {
  78328. * "string-case-asc": function(x,y) {
  78329. * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  78330. * },
  78331. * "string-case-desc": function(x,y) {
  78332. * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
  78333. * }
  78334. * } );
  78335. */
  78336. order: {}
  78337. },
  78338. /**
  78339. * Unique DataTables instance counter
  78340. *
  78341. * @type int
  78342. * @private
  78343. */
  78344. _unique: 0,
  78345. //
  78346. // Depreciated
  78347. // The following properties are retained for backwards compatiblity only.
  78348. // The should not be used in new projects and will be removed in a future
  78349. // version
  78350. //
  78351. /**
  78352. * Version check function.
  78353. * @type function
  78354. * @depreciated Since 1.10
  78355. */
  78356. fnVersionCheck: DataTable.fnVersionCheck,
  78357. /**
  78358. * Index for what 'this' index API functions should use
  78359. * @type int
  78360. * @deprecated Since v1.10
  78361. */
  78362. iApiIndex: 0,
  78363. /**
  78364. * jQuery UI class container
  78365. * @type object
  78366. * @deprecated Since v1.10
  78367. */
  78368. oJUIClasses: {},
  78369. /**
  78370. * Software version
  78371. * @type string
  78372. * @deprecated Since v1.10
  78373. */
  78374. sVersion: DataTable.version
  78375. };
  78376. //
  78377. // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
  78378. //
  78379. $.extend( _ext, {
  78380. afnFiltering: _ext.search,
  78381. aTypes: _ext.type.detect,
  78382. ofnSearch: _ext.type.search,
  78383. oSort: _ext.type.order,
  78384. afnSortData: _ext.order,
  78385. aoFeatures: _ext.feature,
  78386. oApi: _ext.internal,
  78387. oStdClasses: _ext.classes,
  78388. oPagination: _ext.pager
  78389. } );
  78390. $.extend( DataTable.ext.classes, {
  78391. "sTable": "dataTable",
  78392. "sNoFooter": "no-footer",
  78393. /* Paging buttons */
  78394. "sPageButton": "paginate_button",
  78395. "sPageButtonActive": "current",
  78396. "sPageButtonDisabled": "disabled",
  78397. /* Striping classes */
  78398. "sStripeOdd": "odd",
  78399. "sStripeEven": "even",
  78400. /* Empty row */
  78401. "sRowEmpty": "dataTables_empty",
  78402. /* Features */
  78403. "sWrapper": "dataTables_wrapper",
  78404. "sFilter": "dataTables_filter",
  78405. "sInfo": "dataTables_info",
  78406. "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
  78407. "sLength": "dataTables_length",
  78408. "sProcessing": "dataTables_processing",
  78409. /* Sorting */
  78410. "sSortAsc": "sorting_asc",
  78411. "sSortDesc": "sorting_desc",
  78412. "sSortable": "sorting", /* Sortable in both directions */
  78413. "sSortableAsc": "sorting_asc_disabled",
  78414. "sSortableDesc": "sorting_desc_disabled",
  78415. "sSortableNone": "sorting_disabled",
  78416. "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
  78417. /* Filtering */
  78418. "sFilterInput": "",
  78419. /* Page length */
  78420. "sLengthSelect": "",
  78421. /* Scrolling */
  78422. "sScrollWrapper": "dataTables_scroll",
  78423. "sScrollHead": "dataTables_scrollHead",
  78424. "sScrollHeadInner": "dataTables_scrollHeadInner",
  78425. "sScrollBody": "dataTables_scrollBody",
  78426. "sScrollFoot": "dataTables_scrollFoot",
  78427. "sScrollFootInner": "dataTables_scrollFootInner",
  78428. /* Misc */
  78429. "sHeaderTH": "",
  78430. "sFooterTH": "",
  78431. // Deprecated
  78432. "sSortJUIAsc": "",
  78433. "sSortJUIDesc": "",
  78434. "sSortJUI": "",
  78435. "sSortJUIAscAllowed": "",
  78436. "sSortJUIDescAllowed": "",
  78437. "sSortJUIWrapper": "",
  78438. "sSortIcon": "",
  78439. "sJUIHeader": "",
  78440. "sJUIFooter": ""
  78441. } );
  78442. var extPagination = DataTable.ext.pager;
  78443. function _numbers ( page, pages ) {
  78444. var
  78445. numbers = [],
  78446. buttons = extPagination.numbers_length,
  78447. half = Math.floor( buttons / 2 ),
  78448. i = 1;
  78449. if ( pages <= buttons ) {
  78450. numbers = _range( 0, pages );
  78451. }
  78452. else if ( page <= half ) {
  78453. numbers = _range( 0, buttons-2 );
  78454. numbers.push( 'ellipsis' );
  78455. numbers.push( pages-1 );
  78456. }
  78457. else if ( page >= pages - 1 - half ) {
  78458. numbers = _range( pages-(buttons-2), pages );
  78459. numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
  78460. numbers.splice( 0, 0, 0 );
  78461. }
  78462. else {
  78463. numbers = _range( page-half+2, page+half-1 );
  78464. numbers.push( 'ellipsis' );
  78465. numbers.push( pages-1 );
  78466. numbers.splice( 0, 0, 'ellipsis' );
  78467. numbers.splice( 0, 0, 0 );
  78468. }
  78469. numbers.DT_el = 'span';
  78470. return numbers;
  78471. }
  78472. $.extend( extPagination, {
  78473. simple: function ( page, pages ) {
  78474. return [ 'previous', 'next' ];
  78475. },
  78476. full: function ( page, pages ) {
  78477. return [ 'first', 'previous', 'next', 'last' ];
  78478. },
  78479. numbers: function ( page, pages ) {
  78480. return [ _numbers(page, pages) ];
  78481. },
  78482. simple_numbers: function ( page, pages ) {
  78483. return [ 'previous', _numbers(page, pages), 'next' ];
  78484. },
  78485. full_numbers: function ( page, pages ) {
  78486. return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
  78487. },
  78488. first_last_numbers: function (page, pages) {
  78489. return ['first', _numbers(page, pages), 'last'];
  78490. },
  78491. // For testing and plug-ins to use
  78492. _numbers: _numbers,
  78493. // Number of number buttons (including ellipsis) to show. _Must be odd!_
  78494. numbers_length: 7
  78495. } );
  78496. $.extend( true, DataTable.ext.renderer, {
  78497. pageButton: {
  78498. _: function ( settings, host, idx, buttons, page, pages ) {
  78499. var classes = settings.oClasses;
  78500. var lang = settings.oLanguage.oPaginate;
  78501. var aria = settings.oLanguage.oAria.paginate || {};
  78502. var btnDisplay, btnClass, counter=0;
  78503. var attach = function( container, buttons ) {
  78504. var i, ien, node, button;
  78505. var clickHandler = function ( e ) {
  78506. _fnPageChange( settings, e.data.action, true );
  78507. };
  78508. for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
  78509. button = buttons[i];
  78510. if ( $.isArray( button ) ) {
  78511. var inner = $( '<'+(button.DT_el || 'div')+'/>' )
  78512. .appendTo( container );
  78513. attach( inner, button );
  78514. }
  78515. else {
  78516. btnDisplay = null;
  78517. btnClass = '';
  78518. switch ( button ) {
  78519. case 'ellipsis':
  78520. container.append('<span class="ellipsis">&#x2026;</span>');
  78521. break;
  78522. case 'first':
  78523. btnDisplay = lang.sFirst;
  78524. btnClass = button + (page > 0 ?
  78525. '' : ' '+classes.sPageButtonDisabled);
  78526. break;
  78527. case 'previous':
  78528. btnDisplay = lang.sPrevious;
  78529. btnClass = button + (page > 0 ?
  78530. '' : ' '+classes.sPageButtonDisabled);
  78531. break;
  78532. case 'next':
  78533. btnDisplay = lang.sNext;
  78534. btnClass = button + (page < pages-1 ?
  78535. '' : ' '+classes.sPageButtonDisabled);
  78536. break;
  78537. case 'last':
  78538. btnDisplay = lang.sLast;
  78539. btnClass = button + (page < pages-1 ?
  78540. '' : ' '+classes.sPageButtonDisabled);
  78541. break;
  78542. default:
  78543. btnDisplay = button + 1;
  78544. btnClass = page === button ?
  78545. classes.sPageButtonActive : '';
  78546. break;
  78547. }
  78548. if ( btnDisplay !== null ) {
  78549. node = $('<a>', {
  78550. 'class': classes.sPageButton+' '+btnClass,
  78551. 'aria-controls': settings.sTableId,
  78552. 'aria-label': aria[ button ],
  78553. 'data-dt-idx': counter,
  78554. 'tabindex': settings.iTabIndex,
  78555. 'id': idx === 0 && typeof button === 'string' ?
  78556. settings.sTableId +'_'+ button :
  78557. null
  78558. } )
  78559. .html( btnDisplay )
  78560. .appendTo( container );
  78561. _fnBindAction(
  78562. node, {action: button}, clickHandler
  78563. );
  78564. counter++;
  78565. }
  78566. }
  78567. }
  78568. };
  78569. // IE9 throws an 'unknown error' if document.activeElement is used
  78570. // inside an iframe or frame. Try / catch the error. Not good for
  78571. // accessibility, but neither are frames.
  78572. var activeEl;
  78573. try {
  78574. // Because this approach is destroying and recreating the paging
  78575. // elements, focus is lost on the select button which is bad for
  78576. // accessibility. So we want to restore focus once the draw has
  78577. // completed
  78578. activeEl = $(host).find(document.activeElement).data('dt-idx');
  78579. }
  78580. catch (e) {}
  78581. attach( $(host).empty(), buttons );
  78582. if ( activeEl !== undefined ) {
  78583. $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
  78584. }
  78585. }
  78586. }
  78587. } );
  78588. // Built in type detection. See model.ext.aTypes for information about
  78589. // what is required from this methods.
  78590. $.extend( DataTable.ext.type.detect, [
  78591. // Plain numbers - first since V8 detects some plain numbers as dates
  78592. // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
  78593. function ( d, settings )
  78594. {
  78595. var decimal = settings.oLanguage.sDecimal;
  78596. return _isNumber( d, decimal ) ? 'num'+decimal : null;
  78597. },
  78598. // Dates (only those recognised by the browser's Date.parse)
  78599. function ( d, settings )
  78600. {
  78601. // V8 tries _very_ hard to make a string passed into `Date.parse()`
  78602. // valid, so we need to use a regex to restrict date formats. Use a
  78603. // plug-in for anything other than ISO8601 style strings
  78604. if ( d && !(d instanceof Date) && ! _re_date.test(d) ) {
  78605. return null;
  78606. }
  78607. var parsed = Date.parse(d);
  78608. return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
  78609. },
  78610. // Formatted numbers
  78611. function ( d, settings )
  78612. {
  78613. var decimal = settings.oLanguage.sDecimal;
  78614. return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
  78615. },
  78616. // HTML numeric
  78617. function ( d, settings )
  78618. {
  78619. var decimal = settings.oLanguage.sDecimal;
  78620. return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
  78621. },
  78622. // HTML numeric, formatted
  78623. function ( d, settings )
  78624. {
  78625. var decimal = settings.oLanguage.sDecimal;
  78626. return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
  78627. },
  78628. // HTML (this is strict checking - there must be html)
  78629. function ( d, settings )
  78630. {
  78631. return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
  78632. 'html' : null;
  78633. }
  78634. ] );
  78635. // Filter formatting functions. See model.ext.ofnSearch for information about
  78636. // what is required from these methods.
  78637. //
  78638. // Note that additional search methods are added for the html numbers and
  78639. // html formatted numbers by `_addNumericSort()` when we know what the decimal
  78640. // place is
  78641. $.extend( DataTable.ext.type.search, {
  78642. html: function ( data ) {
  78643. return _empty(data) ?
  78644. data :
  78645. typeof data === 'string' ?
  78646. data
  78647. .replace( _re_new_lines, " " )
  78648. .replace( _re_html, "" ) :
  78649. '';
  78650. },
  78651. string: function ( data ) {
  78652. return _empty(data) ?
  78653. data :
  78654. typeof data === 'string' ?
  78655. data.replace( _re_new_lines, " " ) :
  78656. data;
  78657. }
  78658. } );
  78659. var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
  78660. if ( d !== 0 && (!d || d === '-') ) {
  78661. return -Infinity;
  78662. }
  78663. // If a decimal place other than `.` is used, it needs to be given to the
  78664. // function so we can detect it and replace with a `.` which is the only
  78665. // decimal place Javascript recognises - it is not locale aware.
  78666. if ( decimalPlace ) {
  78667. d = _numToDecimal( d, decimalPlace );
  78668. }
  78669. if ( d.replace ) {
  78670. if ( re1 ) {
  78671. d = d.replace( re1, '' );
  78672. }
  78673. if ( re2 ) {
  78674. d = d.replace( re2, '' );
  78675. }
  78676. }
  78677. return d * 1;
  78678. };
  78679. // Add the numeric 'deformatting' functions for sorting and search. This is done
  78680. // in a function to provide an easy ability for the language options to add
  78681. // additional methods if a non-period decimal place is used.
  78682. function _addNumericSort ( decimalPlace ) {
  78683. $.each(
  78684. {
  78685. // Plain numbers
  78686. "num": function ( d ) {
  78687. return __numericReplace( d, decimalPlace );
  78688. },
  78689. // Formatted numbers
  78690. "num-fmt": function ( d ) {
  78691. return __numericReplace( d, decimalPlace, _re_formatted_numeric );
  78692. },
  78693. // HTML numeric
  78694. "html-num": function ( d ) {
  78695. return __numericReplace( d, decimalPlace, _re_html );
  78696. },
  78697. // HTML numeric, formatted
  78698. "html-num-fmt": function ( d ) {
  78699. return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
  78700. }
  78701. },
  78702. function ( key, fn ) {
  78703. // Add the ordering method
  78704. _ext.type.order[ key+decimalPlace+'-pre' ] = fn;
  78705. // For HTML types add a search formatter that will strip the HTML
  78706. if ( key.match(/^html\-/) ) {
  78707. _ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
  78708. }
  78709. }
  78710. );
  78711. }
  78712. // Default sort methods
  78713. $.extend( _ext.type.order, {
  78714. // Dates
  78715. "date-pre": function ( d ) {
  78716. return Date.parse( d ) || -Infinity;
  78717. },
  78718. // html
  78719. "html-pre": function ( a ) {
  78720. return _empty(a) ?
  78721. '' :
  78722. a.replace ?
  78723. a.replace( /<.*?>/g, "" ).toLowerCase() :
  78724. a+'';
  78725. },
  78726. // string
  78727. "string-pre": function ( a ) {
  78728. // This is a little complex, but faster than always calling toString,
  78729. // http://jsperf.com/tostring-v-check
  78730. return _empty(a) ?
  78731. '' :
  78732. typeof a === 'string' ?
  78733. a.toLowerCase() :
  78734. ! a.toString ?
  78735. '' :
  78736. a.toString();
  78737. },
  78738. // string-asc and -desc are retained only for compatibility with the old
  78739. // sort methods
  78740. "string-asc": function ( x, y ) {
  78741. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  78742. },
  78743. "string-desc": function ( x, y ) {
  78744. return ((x < y) ? 1 : ((x > y) ? -1 : 0));
  78745. }
  78746. } );
  78747. // Numeric sorting types - order doesn't matter here
  78748. _addNumericSort( '' );
  78749. $.extend( true, DataTable.ext.renderer, {
  78750. header: {
  78751. _: function ( settings, cell, column, classes ) {
  78752. // No additional mark-up required
  78753. // Attach a sort listener to update on sort - note that using the
  78754. // `DT` namespace will allow the event to be removed automatically
  78755. // on destroy, while the `dt` namespaced event is the one we are
  78756. // listening for
  78757. $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
  78758. if ( settings !== ctx ) { // need to check this this is the host
  78759. return; // table, not a nested one
  78760. }
  78761. var colIdx = column.idx;
  78762. cell
  78763. .removeClass(
  78764. column.sSortingClass +' '+
  78765. classes.sSortAsc +' '+
  78766. classes.sSortDesc
  78767. )
  78768. .addClass( columns[ colIdx ] == 'asc' ?
  78769. classes.sSortAsc : columns[ colIdx ] == 'desc' ?
  78770. classes.sSortDesc :
  78771. column.sSortingClass
  78772. );
  78773. } );
  78774. },
  78775. jqueryui: function ( settings, cell, column, classes ) {
  78776. $('<div/>')
  78777. .addClass( classes.sSortJUIWrapper )
  78778. .append( cell.contents() )
  78779. .append( $('<span/>')
  78780. .addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
  78781. )
  78782. .appendTo( cell );
  78783. // Attach a sort listener to update on sort
  78784. $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
  78785. if ( settings !== ctx ) {
  78786. return;
  78787. }
  78788. var colIdx = column.idx;
  78789. cell
  78790. .removeClass( classes.sSortAsc +" "+classes.sSortDesc )
  78791. .addClass( columns[ colIdx ] == 'asc' ?
  78792. classes.sSortAsc : columns[ colIdx ] == 'desc' ?
  78793. classes.sSortDesc :
  78794. column.sSortingClass
  78795. );
  78796. cell
  78797. .find( 'span.'+classes.sSortIcon )
  78798. .removeClass(
  78799. classes.sSortJUIAsc +" "+
  78800. classes.sSortJUIDesc +" "+
  78801. classes.sSortJUI +" "+
  78802. classes.sSortJUIAscAllowed +" "+
  78803. classes.sSortJUIDescAllowed
  78804. )
  78805. .addClass( columns[ colIdx ] == 'asc' ?
  78806. classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
  78807. classes.sSortJUIDesc :
  78808. column.sSortingClassJUI
  78809. );
  78810. } );
  78811. }
  78812. }
  78813. } );
  78814. /*
  78815. * Public helper functions. These aren't used internally by DataTables, or
  78816. * called by any of the options passed into DataTables, but they can be used
  78817. * externally by developers working with DataTables. They are helper functions
  78818. * to make working with DataTables a little bit easier.
  78819. */
  78820. var __htmlEscapeEntities = function ( d ) {
  78821. return typeof d === 'string' ?
  78822. d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
  78823. d;
  78824. };
  78825. /**
  78826. * Helpers for `columns.render`.
  78827. *
  78828. * The options defined here can be used with the `columns.render` initialisation
  78829. * option to provide a display renderer. The following functions are defined:
  78830. *
  78831. * * `number` - Will format numeric data (defined by `columns.data`) for
  78832. * display, retaining the original unformatted data for sorting and filtering.
  78833. * It takes 5 parameters:
  78834. * * `string` - Thousands grouping separator
  78835. * * `string` - Decimal point indicator
  78836. * * `integer` - Number of decimal points to show
  78837. * * `string` (optional) - Prefix.
  78838. * * `string` (optional) - Postfix (/suffix).
  78839. * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
  78840. * parameters.
  78841. *
  78842. * @example
  78843. * // Column definition using the number renderer
  78844. * {
  78845. * data: "salary",
  78846. * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
  78847. * }
  78848. *
  78849. * @namespace
  78850. */
  78851. DataTable.render = {
  78852. number: function ( thousands, decimal, precision, prefix, postfix ) {
  78853. return {
  78854. display: function ( d ) {
  78855. if ( typeof d !== 'number' && typeof d !== 'string' ) {
  78856. return d;
  78857. }
  78858. var negative = d < 0 ? '-' : '';
  78859. var flo = parseFloat( d );
  78860. // If NaN then there isn't much formatting that we can do - just
  78861. // return immediately, escaping any HTML (this was supposed to
  78862. // be a number after all)
  78863. if ( isNaN( flo ) ) {
  78864. return __htmlEscapeEntities( d );
  78865. }
  78866. flo = flo.toFixed( precision );
  78867. d = Math.abs( flo );
  78868. var intPart = parseInt( d, 10 );
  78869. var floatPart = precision ?
  78870. decimal+(d - intPart).toFixed( precision ).substring( 2 ):
  78871. '';
  78872. return negative + (prefix||'') +
  78873. intPart.toString().replace(
  78874. /\B(?=(\d{3})+(?!\d))/g, thousands
  78875. ) +
  78876. floatPart +
  78877. (postfix||'');
  78878. }
  78879. };
  78880. },
  78881. text: function () {
  78882. return {
  78883. display: __htmlEscapeEntities
  78884. };
  78885. }
  78886. };
  78887. /*
  78888. * This is really a good bit rubbish this method of exposing the internal methods
  78889. * publicly... - To be fixed in 2.0 using methods on the prototype
  78890. */
  78891. /**
  78892. * Create a wrapper function for exporting an internal functions to an external API.
  78893. * @param {string} fn API function name
  78894. * @returns {function} wrapped function
  78895. * @memberof DataTable#internal
  78896. */
  78897. function _fnExternApiFunc (fn)
  78898. {
  78899. return function() {
  78900. var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
  78901. Array.prototype.slice.call(arguments)
  78902. );
  78903. return DataTable.ext.internal[fn].apply( this, args );
  78904. };
  78905. }
  78906. /**
  78907. * Reference to internal functions for use by plug-in developers. Note that
  78908. * these methods are references to internal functions and are considered to be
  78909. * private. If you use these methods, be aware that they are liable to change
  78910. * between versions.
  78911. * @namespace
  78912. */
  78913. $.extend( DataTable.ext.internal, {
  78914. _fnExternApiFunc: _fnExternApiFunc,
  78915. _fnBuildAjax: _fnBuildAjax,
  78916. _fnAjaxUpdate: _fnAjaxUpdate,
  78917. _fnAjaxParameters: _fnAjaxParameters,
  78918. _fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
  78919. _fnAjaxDataSrc: _fnAjaxDataSrc,
  78920. _fnAddColumn: _fnAddColumn,
  78921. _fnColumnOptions: _fnColumnOptions,
  78922. _fnAdjustColumnSizing: _fnAdjustColumnSizing,
  78923. _fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
  78924. _fnColumnIndexToVisible: _fnColumnIndexToVisible,
  78925. _fnVisbleColumns: _fnVisbleColumns,
  78926. _fnGetColumns: _fnGetColumns,
  78927. _fnColumnTypes: _fnColumnTypes,
  78928. _fnApplyColumnDefs: _fnApplyColumnDefs,
  78929. _fnHungarianMap: _fnHungarianMap,
  78930. _fnCamelToHungarian: _fnCamelToHungarian,
  78931. _fnLanguageCompat: _fnLanguageCompat,
  78932. _fnBrowserDetect: _fnBrowserDetect,
  78933. _fnAddData: _fnAddData,
  78934. _fnAddTr: _fnAddTr,
  78935. _fnNodeToDataIndex: _fnNodeToDataIndex,
  78936. _fnNodeToColumnIndex: _fnNodeToColumnIndex,
  78937. _fnGetCellData: _fnGetCellData,
  78938. _fnSetCellData: _fnSetCellData,
  78939. _fnSplitObjNotation: _fnSplitObjNotation,
  78940. _fnGetObjectDataFn: _fnGetObjectDataFn,
  78941. _fnSetObjectDataFn: _fnSetObjectDataFn,
  78942. _fnGetDataMaster: _fnGetDataMaster,
  78943. _fnClearTable: _fnClearTable,
  78944. _fnDeleteIndex: _fnDeleteIndex,
  78945. _fnInvalidate: _fnInvalidate,
  78946. _fnGetRowElements: _fnGetRowElements,
  78947. _fnCreateTr: _fnCreateTr,
  78948. _fnBuildHead: _fnBuildHead,
  78949. _fnDrawHead: _fnDrawHead,
  78950. _fnDraw: _fnDraw,
  78951. _fnReDraw: _fnReDraw,
  78952. _fnAddOptionsHtml: _fnAddOptionsHtml,
  78953. _fnDetectHeader: _fnDetectHeader,
  78954. _fnGetUniqueThs: _fnGetUniqueThs,
  78955. _fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
  78956. _fnFilterComplete: _fnFilterComplete,
  78957. _fnFilterCustom: _fnFilterCustom,
  78958. _fnFilterColumn: _fnFilterColumn,
  78959. _fnFilter: _fnFilter,
  78960. _fnFilterCreateSearch: _fnFilterCreateSearch,
  78961. _fnEscapeRegex: _fnEscapeRegex,
  78962. _fnFilterData: _fnFilterData,
  78963. _fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
  78964. _fnUpdateInfo: _fnUpdateInfo,
  78965. _fnInfoMacros: _fnInfoMacros,
  78966. _fnInitialise: _fnInitialise,
  78967. _fnInitComplete: _fnInitComplete,
  78968. _fnLengthChange: _fnLengthChange,
  78969. _fnFeatureHtmlLength: _fnFeatureHtmlLength,
  78970. _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
  78971. _fnPageChange: _fnPageChange,
  78972. _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
  78973. _fnProcessingDisplay: _fnProcessingDisplay,
  78974. _fnFeatureHtmlTable: _fnFeatureHtmlTable,
  78975. _fnScrollDraw: _fnScrollDraw,
  78976. _fnApplyToChildren: _fnApplyToChildren,
  78977. _fnCalculateColumnWidths: _fnCalculateColumnWidths,
  78978. _fnThrottle: _fnThrottle,
  78979. _fnConvertToWidth: _fnConvertToWidth,
  78980. _fnGetWidestNode: _fnGetWidestNode,
  78981. _fnGetMaxLenString: _fnGetMaxLenString,
  78982. _fnStringToCss: _fnStringToCss,
  78983. _fnSortFlatten: _fnSortFlatten,
  78984. _fnSort: _fnSort,
  78985. _fnSortAria: _fnSortAria,
  78986. _fnSortListener: _fnSortListener,
  78987. _fnSortAttachListener: _fnSortAttachListener,
  78988. _fnSortingClasses: _fnSortingClasses,
  78989. _fnSortData: _fnSortData,
  78990. _fnSaveState: _fnSaveState,
  78991. _fnLoadState: _fnLoadState,
  78992. _fnSettingsFromNode: _fnSettingsFromNode,
  78993. _fnLog: _fnLog,
  78994. _fnMap: _fnMap,
  78995. _fnBindAction: _fnBindAction,
  78996. _fnCallbackReg: _fnCallbackReg,
  78997. _fnCallbackFire: _fnCallbackFire,
  78998. _fnLengthOverflow: _fnLengthOverflow,
  78999. _fnRenderer: _fnRenderer,
  79000. _fnDataSource: _fnDataSource,
  79001. _fnRowAttributes: _fnRowAttributes,
  79002. _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
  79003. // in 1.10, so this dead-end function is
  79004. // added to prevent errors
  79005. } );
  79006. // jQuery access
  79007. $.fn.dataTable = DataTable;
  79008. // Provide access to the host jQuery object (circular reference)
  79009. DataTable.$ = $;
  79010. // Legacy aliases
  79011. $.fn.dataTableSettings = DataTable.settings;
  79012. $.fn.dataTableExt = DataTable.ext;
  79013. // With a capital `D` we return a DataTables API instance rather than a
  79014. // jQuery object
  79015. $.fn.DataTable = function ( opts ) {
  79016. return $(this).dataTable( opts ).api();
  79017. };
  79018. // All properties that are available to $.fn.dataTable should also be
  79019. // available on $.fn.DataTable
  79020. $.each( DataTable, function ( prop, val ) {
  79021. $.fn.DataTable[ prop ] = val;
  79022. } );
  79023. // Information about events fired by DataTables - for documentation.
  79024. /**
  79025. * Draw event, fired whenever the table is redrawn on the page, at the same
  79026. * point as fnDrawCallback. This may be useful for binding events or
  79027. * performing calculations when the table is altered at all.
  79028. * @name DataTable#draw.dt
  79029. * @event
  79030. * @param {event} e jQuery event object
  79031. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79032. */
  79033. /**
  79034. * Search event, fired when the searching applied to the table (using the
  79035. * built-in global search, or column filters) is altered.
  79036. * @name DataTable#search.dt
  79037. * @event
  79038. * @param {event} e jQuery event object
  79039. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79040. */
  79041. /**
  79042. * Page change event, fired when the paging of the table is altered.
  79043. * @name DataTable#page.dt
  79044. * @event
  79045. * @param {event} e jQuery event object
  79046. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79047. */
  79048. /**
  79049. * Order event, fired when the ordering applied to the table is altered.
  79050. * @name DataTable#order.dt
  79051. * @event
  79052. * @param {event} e jQuery event object
  79053. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79054. */
  79055. /**
  79056. * DataTables initialisation complete event, fired when the table is fully
  79057. * drawn, including Ajax data loaded, if Ajax data is required.
  79058. * @name DataTable#init.dt
  79059. * @event
  79060. * @param {event} e jQuery event object
  79061. * @param {object} oSettings DataTables settings object
  79062. * @param {object} json The JSON object request from the server - only
  79063. * present if client-side Ajax sourced data is used</li></ol>
  79064. */
  79065. /**
  79066. * State save event, fired when the table has changed state a new state save
  79067. * is required. This event allows modification of the state saving object
  79068. * prior to actually doing the save, including addition or other state
  79069. * properties (for plug-ins) or modification of a DataTables core property.
  79070. * @name DataTable#stateSaveParams.dt
  79071. * @event
  79072. * @param {event} e jQuery event object
  79073. * @param {object} oSettings DataTables settings object
  79074. * @param {object} json The state information to be saved
  79075. */
  79076. /**
  79077. * State load event, fired when the table is loading state from the stored
  79078. * data, but prior to the settings object being modified by the saved state
  79079. * - allowing modification of the saved state is required or loading of
  79080. * state for a plug-in.
  79081. * @name DataTable#stateLoadParams.dt
  79082. * @event
  79083. * @param {event} e jQuery event object
  79084. * @param {object} oSettings DataTables settings object
  79085. * @param {object} json The saved state information
  79086. */
  79087. /**
  79088. * State loaded event, fired when state has been loaded from stored data and
  79089. * the settings object has been modified by the loaded data.
  79090. * @name DataTable#stateLoaded.dt
  79091. * @event
  79092. * @param {event} e jQuery event object
  79093. * @param {object} oSettings DataTables settings object
  79094. * @param {object} json The saved state information
  79095. */
  79096. /**
  79097. * Processing event, fired when DataTables is doing some kind of processing
  79098. * (be it, order, searcg or anything else). It can be used to indicate to
  79099. * the end user that there is something happening, or that something has
  79100. * finished.
  79101. * @name DataTable#processing.dt
  79102. * @event
  79103. * @param {event} e jQuery event object
  79104. * @param {object} oSettings DataTables settings object
  79105. * @param {boolean} bShow Flag for if DataTables is doing processing or not
  79106. */
  79107. /**
  79108. * Ajax (XHR) event, fired whenever an Ajax request is completed from a
  79109. * request to made to the server for new data. This event is called before
  79110. * DataTables processed the returned data, so it can also be used to pre-
  79111. * process the data returned from the server, if needed.
  79112. *
  79113. * Note that this trigger is called in `fnServerData`, if you override
  79114. * `fnServerData` and which to use this event, you need to trigger it in you
  79115. * success function.
  79116. * @name DataTable#xhr.dt
  79117. * @event
  79118. * @param {event} e jQuery event object
  79119. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79120. * @param {object} json JSON returned from the server
  79121. *
  79122. * @example
  79123. * // Use a custom property returned from the server in another DOM element
  79124. * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
  79125. * $('#status').html( json.status );
  79126. * } );
  79127. *
  79128. * @example
  79129. * // Pre-process the data returned from the server
  79130. * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
  79131. * for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
  79132. * json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
  79133. * }
  79134. * // Note no return - manipulate the data directly in the JSON object.
  79135. * } );
  79136. */
  79137. /**
  79138. * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
  79139. * or passing the bDestroy:true parameter in the initialisation object. This
  79140. * can be used to remove bound events, added DOM nodes, etc.
  79141. * @name DataTable#destroy.dt
  79142. * @event
  79143. * @param {event} e jQuery event object
  79144. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79145. */
  79146. /**
  79147. * Page length change event, fired when number of records to show on each
  79148. * page (the length) is changed.
  79149. * @name DataTable#length.dt
  79150. * @event
  79151. * @param {event} e jQuery event object
  79152. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79153. * @param {integer} len New length
  79154. */
  79155. /**
  79156. * Column sizing has changed.
  79157. * @name DataTable#column-sizing.dt
  79158. * @event
  79159. * @param {event} e jQuery event object
  79160. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79161. */
  79162. /**
  79163. * Column visibility has changed.
  79164. * @name DataTable#column-visibility.dt
  79165. * @event
  79166. * @param {event} e jQuery event object
  79167. * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
  79168. * @param {int} column Column index
  79169. * @param {bool} vis `false` if column now hidden, or `true` if visible
  79170. */
  79171. return $.fn.dataTable;
  79172. }));
  79173. /*! DataTables Bootstrap 3 integration
  79174. * ©2011-2015 SpryMedia Ltd - datatables.net/license
  79175. */
  79176. /**
  79177. * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
  79178. * DataTables 1.10 or newer.
  79179. *
  79180. * This file sets the defaults and adds options to DataTables to style its
  79181. * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
  79182. * for further information.
  79183. */
  79184. (function( factory ){
  79185. if ( typeof define === 'function' && define.amd ) {
  79186. // AMD
  79187. define( ['jquery', 'datatables.net'], function ( $ ) {
  79188. return factory( $, window, document );
  79189. } );
  79190. }
  79191. else if ( typeof exports === 'object' ) {
  79192. // CommonJS
  79193. module.exports = function (root, $) {
  79194. if ( ! root ) {
  79195. root = window;
  79196. }
  79197. if ( ! $ || ! $.fn.dataTable ) {
  79198. // Require DataTables, which attaches to jQuery, including
  79199. // jQuery if needed and have a $ property so we can access the
  79200. // jQuery object that is used
  79201. $ = require('datatables.net')(root, $).$;
  79202. }
  79203. return factory( $, root, root.document );
  79204. };
  79205. }
  79206. else {
  79207. // Browser
  79208. factory( jQuery, window, document );
  79209. }
  79210. }(function( $, window, document, undefined ) {
  79211. 'use strict';
  79212. var DataTable = $.fn.dataTable;
  79213. /* Set the defaults for DataTables initialisation */
  79214. $.extend( true, DataTable.defaults, {
  79215. dom:
  79216. "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
  79217. "<'row'<'col-sm-12'tr>>" +
  79218. "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
  79219. renderer: 'bootstrap'
  79220. } );
  79221. /* Default class modification */
  79222. $.extend( DataTable.ext.classes, {
  79223. sWrapper: "dataTables_wrapper container-fluid dt-bootstrap4",
  79224. sFilterInput: "form-control form-control-sm",
  79225. sLengthSelect: "form-select form-control-sm",
  79226. sProcessing: "dataTables_processing card",
  79227. sPageButton: "paginate_button page-item"
  79228. } );
  79229. /* Bootstrap paging button renderer */
  79230. DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
  79231. var api = new DataTable.Api( settings );
  79232. var classes = settings.oClasses;
  79233. var lang = settings.oLanguage.oPaginate;
  79234. var aria = settings.oLanguage.oAria.paginate || {};
  79235. var btnDisplay, btnClass, counter=0;
  79236. var attach = function( container, buttons ) {
  79237. var i, ien, node, button;
  79238. var clickHandler = function ( e ) {
  79239. e.preventDefault();
  79240. if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
  79241. api.page( e.data.action ).draw( 'page' );
  79242. }
  79243. };
  79244. for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
  79245. button = buttons[i];
  79246. if ( $.isArray( button ) ) {
  79247. attach( container, button );
  79248. }
  79249. else {
  79250. btnDisplay = '';
  79251. btnClass = '';
  79252. switch ( button ) {
  79253. case 'ellipsis':
  79254. btnDisplay = '&#x2026;';
  79255. btnClass = 'disabled';
  79256. break;
  79257. case 'first':
  79258. btnDisplay = lang.sFirst;
  79259. btnClass = button + (page > 0 ?
  79260. '' : ' disabled');
  79261. break;
  79262. case 'previous':
  79263. btnDisplay = lang.sPrevious;
  79264. btnClass = button + (page > 0 ?
  79265. '' : ' disabled');
  79266. break;
  79267. case 'next':
  79268. btnDisplay = lang.sNext;
  79269. btnClass = button + (page < pages-1 ?
  79270. '' : ' disabled');
  79271. break;
  79272. case 'last':
  79273. btnDisplay = lang.sLast;
  79274. btnClass = button + (page < pages-1 ?
  79275. '' : ' disabled');
  79276. break;
  79277. default:
  79278. btnDisplay = button + 1;
  79279. btnClass = page === button ?
  79280. 'active' : '';
  79281. break;
  79282. }
  79283. if ( btnDisplay ) {
  79284. node = $('<li>', {
  79285. 'class': classes.sPageButton+' '+btnClass,
  79286. 'id': idx === 0 && typeof button === 'string' ?
  79287. settings.sTableId +'_'+ button :
  79288. null
  79289. } )
  79290. .append( $('<a>', {
  79291. 'href': '#',
  79292. 'aria-controls': settings.sTableId,
  79293. 'aria-label': aria[ button ],
  79294. 'data-dt-idx': counter,
  79295. 'tabindex': settings.iTabIndex,
  79296. 'class': 'page-link'
  79297. } )
  79298. .html( btnDisplay )
  79299. )
  79300. .appendTo( container );
  79301. settings.oApi._fnBindAction(
  79302. node, {action: button}, clickHandler
  79303. );
  79304. counter++;
  79305. }
  79306. }
  79307. }
  79308. };
  79309. // IE9 throws an 'unknown error' if document.activeElement is used
  79310. // inside an iframe or frame.
  79311. var activeEl;
  79312. try {
  79313. // Because this approach is destroying and recreating the paging
  79314. // elements, focus is lost on the select button which is bad for
  79315. // accessibility. So we want to restore focus once the draw has
  79316. // completed
  79317. activeEl = $(host).find(document.activeElement).data('dt-idx');
  79318. }
  79319. catch (e) {}
  79320. attach(
  79321. $(host).empty().html('<ul class="pagination"/>').children('ul'),
  79322. buttons
  79323. );
  79324. if ( activeEl !== undefined ) {
  79325. $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
  79326. }
  79327. };
  79328. return DataTable;
  79329. }));
  79330. /*! AutoFill 2.2.2
  79331. * ©2008-2017 SpryMedia Ltd - datatables.net/license
  79332. */
  79333. /**
  79334. * @summary AutoFill
  79335. * @description Add Excel like click and drag auto-fill options to DataTables
  79336. * @version 2.2.2
  79337. * @file dataTables.autoFill.js
  79338. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  79339. * @contact www.sprymedia.co.uk/contact
  79340. * @copyright Copyright 2010-2017 SpryMedia Ltd.
  79341. *
  79342. * This source file is free software, available under the following license:
  79343. * MIT license - http://datatables.net/license/mit
  79344. *
  79345. * This source file is distributed in the hope that it will be useful, but
  79346. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  79347. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  79348. *
  79349. * For details please refer to: http://www.datatables.net
  79350. */
  79351. (function( factory ){
  79352. if ( typeof define === 'function' && define.amd ) {
  79353. // AMD
  79354. define( ['jquery', 'datatables.net'], function ( $ ) {
  79355. return factory( $, window, document );
  79356. } );
  79357. }
  79358. else if ( typeof exports === 'object' ) {
  79359. // CommonJS
  79360. module.exports = function (root, $) {
  79361. if ( ! root ) {
  79362. root = window;
  79363. }
  79364. if ( ! $ || ! $.fn.dataTable ) {
  79365. $ = require('datatables.net')(root, $).$;
  79366. }
  79367. return factory( $, root, root.document );
  79368. };
  79369. }
  79370. else {
  79371. // Browser
  79372. factory( jQuery, window, document );
  79373. }
  79374. }(function( $, window, document, undefined ) {
  79375. 'use strict';
  79376. var DataTable = $.fn.dataTable;
  79377. var _instance = 0;
  79378. /**
  79379. * AutoFill provides Excel like auto-fill features for a DataTable
  79380. *
  79381. * @class AutoFill
  79382. * @constructor
  79383. * @param {object} oTD DataTables settings object
  79384. * @param {object} oConfig Configuration object for AutoFill
  79385. */
  79386. var AutoFill = function( dt, opts )
  79387. {
  79388. if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) {
  79389. throw( "Warning: AutoFill requires DataTables 1.10.8 or greater");
  79390. }
  79391. // User and defaults configuration object
  79392. this.c = $.extend( true, {},
  79393. DataTable.defaults.autoFill,
  79394. AutoFill.defaults,
  79395. opts
  79396. );
  79397. /**
  79398. * @namespace Settings object which contains customisable information for AutoFill instance
  79399. */
  79400. this.s = {
  79401. /** @type {DataTable.Api} DataTables' API instance */
  79402. dt: new DataTable.Api( dt ),
  79403. /** @type {String} Unique namespace for events attached to the document */
  79404. namespace: '.autoFill'+(_instance++),
  79405. /** @type {Object} Cached dimension information for use in the mouse move event handler */
  79406. scroll: {},
  79407. /** @type {integer} Interval object used for smooth scrolling */
  79408. scrollInterval: null,
  79409. handle: {
  79410. height: 0,
  79411. width: 0
  79412. },
  79413. /**
  79414. * Enabled setting
  79415. * @type {Boolean}
  79416. */
  79417. enabled: false
  79418. };
  79419. /**
  79420. * @namespace Common and useful DOM elements for the class instance
  79421. */
  79422. this.dom = {
  79423. /** @type {jQuery} AutoFill handle */
  79424. handle: $('<div class="dt-autofill-handle"/>'),
  79425. /**
  79426. * @type {Object} Selected cells outline - Need to use 4 elements,
  79427. * otherwise the mouse over if you back into the selected rectangle
  79428. * will be over that element, rather than the cells!
  79429. */
  79430. select: {
  79431. top: $('<div class="dt-autofill-select top"/>'),
  79432. right: $('<div class="dt-autofill-select right"/>'),
  79433. bottom: $('<div class="dt-autofill-select bottom"/>'),
  79434. left: $('<div class="dt-autofill-select left"/>')
  79435. },
  79436. /** @type {jQuery} Fill type chooser background */
  79437. background: $('<div class="dt-autofill-background"/>'),
  79438. /** @type {jQuery} Fill type chooser */
  79439. list: $('<div class="dt-autofill-list">'+this.s.dt.i18n('autoFill.info', '')+'<ul/></div>'),
  79440. /** @type {jQuery} DataTables scrolling container */
  79441. dtScroll: null,
  79442. /** @type {jQuery} Offset parent element */
  79443. offsetParent: null
  79444. };
  79445. /* Constructor logic */
  79446. this._constructor();
  79447. };
  79448. $.extend( AutoFill.prototype, {
  79449. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  79450. * Public methods (exposed via the DataTables API below)
  79451. */
  79452. enabled: function ()
  79453. {
  79454. return this.s.enabled;
  79455. },
  79456. enable: function ( flag )
  79457. {
  79458. var that = this;
  79459. if ( flag === false ) {
  79460. return this.disable();
  79461. }
  79462. this.s.enabled = true;
  79463. this._focusListener();
  79464. this.dom.handle.on( 'mousedown', function (e) {
  79465. that._mousedown( e );
  79466. return false;
  79467. } );
  79468. return this;
  79469. },
  79470. disable: function ()
  79471. {
  79472. this.s.enabled = false;
  79473. this._focusListenerRemove();
  79474. return this;
  79475. },
  79476. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  79477. * Constructor
  79478. */
  79479. /**
  79480. * Initialise the RowReorder instance
  79481. *
  79482. * @private
  79483. */
  79484. _constructor: function ()
  79485. {
  79486. var that = this;
  79487. var dt = this.s.dt;
  79488. var dtScroll = $('div.dataTables_scrollBody', this.s.dt.table().container());
  79489. // Make the instance accessible to the API
  79490. dt.settings()[0].autoFill = this;
  79491. if ( dtScroll.length ) {
  79492. this.dom.dtScroll = dtScroll;
  79493. // Need to scroll container to be the offset parent
  79494. if ( dtScroll.css('position') === 'static' ) {
  79495. dtScroll.css( 'position', 'relative' );
  79496. }
  79497. }
  79498. if ( this.c.enable !== false ) {
  79499. this.enable();
  79500. }
  79501. dt.on( 'destroy.autoFill', function () {
  79502. that._focusListenerRemove();
  79503. } );
  79504. },
  79505. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  79506. * Private methods
  79507. */
  79508. /**
  79509. * Display the AutoFill drag handle by appending it to a table cell. This
  79510. * is the opposite of the _detach method.
  79511. *
  79512. * @param {node} node TD/TH cell to insert the handle into
  79513. * @private
  79514. */
  79515. _attach: function ( node )
  79516. {
  79517. var dt = this.s.dt;
  79518. var idx = dt.cell( node ).index();
  79519. var handle = this.dom.handle;
  79520. var handleDim = this.s.handle;
  79521. if ( ! idx || dt.columns( this.c.columns ).indexes().indexOf( idx.column ) === -1 ) {
  79522. this._detach();
  79523. return;
  79524. }
  79525. if ( ! this.dom.offsetParent ) {
  79526. // We attach to the table's offset parent
  79527. this.dom.offsetParent = $( dt.table().node() ).offsetParent();
  79528. }
  79529. if ( ! handleDim.height || ! handleDim.width ) {
  79530. // Append to document so we can get its size. Not expecting it to
  79531. // change during the life time of the page
  79532. handle.appendTo( 'body' );
  79533. handleDim.height = handle.outerHeight();
  79534. handleDim.width = handle.outerWidth();
  79535. }
  79536. // Might need to go through multiple offset parents
  79537. var offset = this._getPosition( node, this.dom.offsetParent );
  79538. this.dom.attachedTo = node;
  79539. handle
  79540. .css( {
  79541. top: offset.top + node.offsetHeight - handleDim.height,
  79542. left: offset.left + node.offsetWidth - handleDim.width
  79543. } )
  79544. .appendTo( this.dom.offsetParent );
  79545. },
  79546. /**
  79547. * Determine can the fill type should be. This can be automatic, or ask the
  79548. * end user.
  79549. *
  79550. * @param {array} cells Information about the selected cells from the key
  79551. * up function
  79552. * @private
  79553. */
  79554. _actionSelector: function ( cells )
  79555. {
  79556. var that = this;
  79557. var dt = this.s.dt;
  79558. var actions = AutoFill.actions;
  79559. var available = [];
  79560. // "Ask" each plug-in if it wants to handle this data
  79561. $.each( actions, function ( key, action ) {
  79562. if ( action.available( dt, cells ) ) {
  79563. available.push( key );
  79564. }
  79565. } );
  79566. if ( available.length === 1 && this.c.alwaysAsk === false ) {
  79567. // Only one action available - enact it immediately
  79568. var result = actions[ available[0] ].execute( dt, cells );
  79569. this._update( result, cells );
  79570. }
  79571. else {
  79572. // Multiple actions available - ask the end user what they want to do
  79573. var list = this.dom.list.children('ul').empty();
  79574. // Add a cancel option
  79575. available.push( 'cancel' );
  79576. $.each( available, function ( i, name ) {
  79577. list.append( $('<li/>')
  79578. .append(
  79579. '<div class="dt-autofill-question">'+
  79580. actions[ name ].option( dt, cells )+
  79581. '<div>'
  79582. )
  79583. .append( $('<div class="dt-autofill-button">' )
  79584. .append( $('<button class="'+AutoFill.classes.btn+'">'+dt.i18n('autoFill.button', '&gt;')+'</button>')
  79585. .on( 'click', function () {
  79586. var result = actions[ name ].execute(
  79587. dt, cells, $(this).closest('li')
  79588. );
  79589. that._update( result, cells );
  79590. that.dom.background.remove();
  79591. that.dom.list.remove();
  79592. } )
  79593. )
  79594. )
  79595. );
  79596. } );
  79597. this.dom.background.appendTo( 'body' );
  79598. this.dom.list.appendTo( 'body' );
  79599. this.dom.list.css( 'margin-top', this.dom.list.outerHeight()/2 * -1 );
  79600. }
  79601. },
  79602. /**
  79603. * Remove the AutoFill handle from the document
  79604. *
  79605. * @private
  79606. */
  79607. _detach: function ()
  79608. {
  79609. this.dom.attachedTo = null;
  79610. this.dom.handle.detach();
  79611. },
  79612. /**
  79613. * Draw the selection outline by calculating the range between the start
  79614. * and end cells, then placing the highlighting elements to draw a rectangle
  79615. *
  79616. * @param {node} target End cell
  79617. * @param {object} e Originating event
  79618. * @private
  79619. */
  79620. _drawSelection: function ( target, e )
  79621. {
  79622. // Calculate boundary for start cell to this one
  79623. var dt = this.s.dt;
  79624. var start = this.s.start;
  79625. var startCell = $(this.dom.start);
  79626. var endCell = $(target);
  79627. var end = {
  79628. row: dt.rows( { page: 'current' } ).nodes().indexOf( endCell.parent()[0] ),
  79629. column: endCell.index()
  79630. };
  79631. var colIndx = dt.column.index( 'toData', end.column );
  79632. // Be sure that is a DataTables controlled cell
  79633. if ( ! dt.cell( endCell ).any() ) {
  79634. return;
  79635. }
  79636. // if target is not in the columns available - do nothing
  79637. if ( dt.columns( this.c.columns ).indexes().indexOf( colIndx ) === -1 ) {
  79638. return;
  79639. }
  79640. this.s.end = end;
  79641. var top, bottom, left, right, height, width;
  79642. top = start.row < end.row ? startCell : endCell;
  79643. bottom = start.row < end.row ? endCell : startCell;
  79644. left = start.column < end.column ? startCell : endCell;
  79645. right = start.column < end.column ? endCell : startCell;
  79646. top = this._getPosition( top ).top;
  79647. left = this._getPosition( left ).left;
  79648. height = this._getPosition( bottom ).top + bottom.outerHeight() - top;
  79649. width = this._getPosition( right ).left + right.outerWidth() - left;
  79650. var select = this.dom.select;
  79651. select.top.css( {
  79652. top: top,
  79653. left: left,
  79654. width: width
  79655. } );
  79656. select.left.css( {
  79657. top: top,
  79658. left: left,
  79659. height: height
  79660. } );
  79661. select.bottom.css( {
  79662. top: top + height,
  79663. left: left,
  79664. width: width
  79665. } );
  79666. select.right.css( {
  79667. top: top,
  79668. left: left + width,
  79669. height: height
  79670. } );
  79671. },
  79672. /**
  79673. * Use the Editor API to perform an update based on the new data for the
  79674. * cells
  79675. *
  79676. * @param {array} cells Information about the selected cells from the key
  79677. * up function
  79678. * @private
  79679. */
  79680. _editor: function ( cells )
  79681. {
  79682. var dt = this.s.dt;
  79683. var editor = this.c.editor;
  79684. if ( ! editor ) {
  79685. return;
  79686. }
  79687. // Build the object structure for Editor's multi-row editing
  79688. var idValues = {};
  79689. var nodes = [];
  79690. var fields = editor.fields();
  79691. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  79692. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  79693. var cell = cells[i][j];
  79694. // Determine the field name for the cell being edited
  79695. var col = dt.settings()[0].aoColumns[ cell.index.column ];
  79696. var fieldName = col.editField;
  79697. if ( fieldName === undefined ) {
  79698. var dataSrc = col.mData;
  79699. // dataSrc is the `field.data` property, but we need to set
  79700. // using the field name, so we need to translate from the
  79701. // data to the name
  79702. for ( var k=0, ken=fields.length ; k<ken ; k++ ) {
  79703. var field = editor.field( fields[k] );
  79704. if ( field.dataSrc() === dataSrc ) {
  79705. fieldName = field.name();
  79706. break;
  79707. }
  79708. }
  79709. }
  79710. if ( ! fieldName ) {
  79711. throw 'Could not automatically determine field data. '+
  79712. 'Please see https://datatables.net/tn/11';
  79713. }
  79714. if ( ! idValues[ fieldName ] ) {
  79715. idValues[ fieldName ] = {};
  79716. }
  79717. var id = dt.row( cell.index.row ).id();
  79718. idValues[ fieldName ][ id ] = cell.set;
  79719. // Keep a list of cells so we can activate the bubble editing
  79720. // with them
  79721. nodes.push( cell.index );
  79722. }
  79723. }
  79724. // Perform the edit using bubble editing as it allows us to specify
  79725. // the cells to be edited, rather than using full rows
  79726. editor
  79727. .bubble( nodes, false )
  79728. .multiSet( idValues )
  79729. .submit();
  79730. },
  79731. /**
  79732. * Emit an event on the DataTable for listeners
  79733. *
  79734. * @param {string} name Event name
  79735. * @param {array} args Event arguments
  79736. * @private
  79737. */
  79738. _emitEvent: function ( name, args )
  79739. {
  79740. this.s.dt.iterator( 'table', function ( ctx, i ) {
  79741. $(ctx.nTable).triggerHandler( name+'.dt', args );
  79742. } );
  79743. },
  79744. /**
  79745. * Attach suitable listeners (based on the configuration) that will attach
  79746. * and detach the AutoFill handle in the document.
  79747. *
  79748. * @private
  79749. */
  79750. _focusListener: function ()
  79751. {
  79752. var that = this;
  79753. var dt = this.s.dt;
  79754. var namespace = this.s.namespace;
  79755. var focus = this.c.focus !== null ?
  79756. this.c.focus :
  79757. dt.init().keys || dt.settings()[0].keytable ?
  79758. 'focus' :
  79759. 'hover';
  79760. // All event listeners attached here are removed in the `destroy`
  79761. // callback in the constructor
  79762. if ( focus === 'focus' ) {
  79763. dt
  79764. .on( 'key-focus.autoFill', function ( e, dt, cell ) {
  79765. that._attach( cell.node() );
  79766. } )
  79767. .on( 'key-blur.autoFill', function ( e, dt, cell ) {
  79768. that._detach();
  79769. } );
  79770. }
  79771. else if ( focus === 'click' ) {
  79772. $(dt.table().body()).on( 'click'+namespace, 'td, th', function (e) {
  79773. that._attach( this );
  79774. } );
  79775. $(document.body).on( 'click'+namespace, function (e) {
  79776. if ( ! $(e.target).parents().filter( dt.table().body() ).length ) {
  79777. that._detach();
  79778. }
  79779. } );
  79780. }
  79781. else {
  79782. $(dt.table().body())
  79783. .on( 'mouseenter'+namespace, 'td, th', function (e) {
  79784. that._attach( this );
  79785. } )
  79786. .on( 'mouseleave'+namespace, function (e) {
  79787. if ( $(e.relatedTarget).hasClass('dt-autofill-handle') ) {
  79788. return;
  79789. }
  79790. that._detach();
  79791. } );
  79792. }
  79793. },
  79794. _focusListenerRemove: function ()
  79795. {
  79796. var dt = this.s.dt;
  79797. dt.off( '.autoFill' );
  79798. $(dt.table().body()).off( this.s.namespace );
  79799. $(document.body).off( this.s.namespace );
  79800. },
  79801. /**
  79802. * Get the position of a node, relative to another, including any scrolling
  79803. * offsets.
  79804. * @param {Node} node Node to get the position of
  79805. * @param {jQuery} targetParent Node to use as the parent
  79806. * @return {object} Offset calculation
  79807. * @private
  79808. */
  79809. _getPosition: function ( node, targetParent )
  79810. {
  79811. var
  79812. currNode = $(node),
  79813. currOffsetParent,
  79814. position,
  79815. top = 0,
  79816. left = 0;
  79817. if ( ! targetParent ) {
  79818. targetParent = $( this.s.dt.table().node() ).offsetParent();
  79819. }
  79820. do {
  79821. position = currNode.position();
  79822. currOffsetParent = currNode.offsetParent();
  79823. top += position.top + currOffsetParent.scrollTop();
  79824. left += position.left + currOffsetParent.scrollLeft();
  79825. // Emergency fall back. Shouldn't happen, but just in case!
  79826. if ( currNode.get(0).nodeName.toLowerCase() === 'body' ) {
  79827. break;
  79828. }
  79829. currNode = currOffsetParent; // for next loop
  79830. }
  79831. while ( currOffsetParent.get(0) !== targetParent.get(0) )
  79832. return {
  79833. top: top,
  79834. left: left
  79835. };
  79836. },
  79837. /**
  79838. * Start mouse drag - selects the start cell
  79839. *
  79840. * @param {object} e Mouse down event
  79841. * @private
  79842. */
  79843. _mousedown: function ( e )
  79844. {
  79845. var that = this;
  79846. var dt = this.s.dt;
  79847. this.dom.start = this.dom.attachedTo;
  79848. this.s.start = {
  79849. row: dt.rows( { page: 'current' } ).nodes().indexOf( $(this.dom.start).parent()[0] ),
  79850. column: $(this.dom.start).index()
  79851. };
  79852. $(document.body)
  79853. .on( 'mousemove.autoFill', function (e) {
  79854. that._mousemove( e );
  79855. } )
  79856. .on( 'mouseup.autoFill', function (e) {
  79857. that._mouseup( e );
  79858. } );
  79859. var select = this.dom.select;
  79860. var offsetParent = $( dt.table().node() ).offsetParent();
  79861. select.top.appendTo( offsetParent );
  79862. select.left.appendTo( offsetParent );
  79863. select.right.appendTo( offsetParent );
  79864. select.bottom.appendTo( offsetParent );
  79865. this._drawSelection( this.dom.start, e );
  79866. this.dom.handle.css( 'display', 'none' );
  79867. // Cache scrolling information so mouse move doesn't need to read.
  79868. // This assumes that the window and DT scroller will not change size
  79869. // during an AutoFill drag, which I think is a fair assumption
  79870. var scrollWrapper = this.dom.dtScroll;
  79871. this.s.scroll = {
  79872. windowHeight: $(window).height(),
  79873. windowWidth: $(window).width(),
  79874. dtTop: scrollWrapper ? scrollWrapper.offset().top : null,
  79875. dtLeft: scrollWrapper ? scrollWrapper.offset().left : null,
  79876. dtHeight: scrollWrapper ? scrollWrapper.outerHeight() : null,
  79877. dtWidth: scrollWrapper ? scrollWrapper.outerWidth() : null
  79878. };
  79879. },
  79880. /**
  79881. * Mouse drag - selects the end cell and update the selection display for
  79882. * the end user
  79883. *
  79884. * @param {object} e Mouse move event
  79885. * @private
  79886. */
  79887. _mousemove: function ( e )
  79888. {
  79889. var that = this;
  79890. var dt = this.s.dt;
  79891. var name = e.target.nodeName.toLowerCase();
  79892. if ( name !== 'td' && name !== 'th' ) {
  79893. return;
  79894. }
  79895. this._drawSelection( e.target, e );
  79896. this._shiftScroll( e );
  79897. },
  79898. /**
  79899. * End mouse drag - perform the update actions
  79900. *
  79901. * @param {object} e Mouse up event
  79902. * @private
  79903. */
  79904. _mouseup: function ( e )
  79905. {
  79906. $(document.body).off( '.autoFill' );
  79907. var dt = this.s.dt;
  79908. var select = this.dom.select;
  79909. select.top.remove();
  79910. select.left.remove();
  79911. select.right.remove();
  79912. select.bottom.remove();
  79913. this.dom.handle.css( 'display', 'block' );
  79914. // Display complete - now do something useful with the selection!
  79915. var start = this.s.start;
  79916. var end = this.s.end;
  79917. // Haven't selected multiple cells, so nothing to do
  79918. if ( start.row === end.row && start.column === end.column ) {
  79919. return;
  79920. }
  79921. // Build a matrix representation of the selected rows
  79922. var rows = this._range( start.row, end.row );
  79923. var columns = this._range( start.column, end.column );
  79924. var selected = [];
  79925. var dtSettings = dt.settings()[0];
  79926. var dtColumns = dtSettings.aoColumns;
  79927. // Can't use Array.prototype.map as IE8 doesn't support it
  79928. // Can't use $.map as jQuery flattens 2D arrays
  79929. // Need to use a good old fashioned for loop
  79930. for ( var rowIdx=0 ; rowIdx<rows.length ; rowIdx++ ) {
  79931. selected.push(
  79932. $.map( columns, function (column) {
  79933. var cell = dt.cell( ':eq('+rows[rowIdx]+')', column+':visible', {page:'current'} );
  79934. var data = cell.data();
  79935. var cellIndex = cell.index();
  79936. var editField = dtColumns[ cellIndex.column ].editField;
  79937. if ( editField !== undefined ) {
  79938. data = dtSettings.oApi._fnGetObjectDataFn( editField )( dt.row( cellIndex.row ).data() );
  79939. }
  79940. return {
  79941. cell: cell,
  79942. data: data,
  79943. label: cell.data(),
  79944. index: cellIndex
  79945. };
  79946. } )
  79947. );
  79948. }
  79949. this._actionSelector( selected );
  79950. // Stop shiftScroll
  79951. clearInterval( this.s.scrollInterval );
  79952. this.s.scrollInterval = null;
  79953. },
  79954. /**
  79955. * Create an array with a range of numbers defined by the start and end
  79956. * parameters passed in (inclusive!).
  79957. *
  79958. * @param {integer} start Start
  79959. * @param {integer} end End
  79960. * @private
  79961. */
  79962. _range: function ( start, end )
  79963. {
  79964. var out = [];
  79965. var i;
  79966. if ( start <= end ) {
  79967. for ( i=start ; i<=end ; i++ ) {
  79968. out.push( i );
  79969. }
  79970. }
  79971. else {
  79972. for ( i=start ; i>=end ; i-- ) {
  79973. out.push( i );
  79974. }
  79975. }
  79976. return out;
  79977. },
  79978. /**
  79979. * Move the window and DataTables scrolling during a drag to scroll new
  79980. * content into view. This is done by proximity to the edge of the scrolling
  79981. * container of the mouse - for example near the top edge of the window
  79982. * should scroll up. This is a little complicated as there are two elements
  79983. * that can be scrolled - the window and the DataTables scrolling view port
  79984. * (if scrollX and / or scrollY is enabled).
  79985. *
  79986. * @param {object} e Mouse move event object
  79987. * @private
  79988. */
  79989. _shiftScroll: function ( e )
  79990. {
  79991. var that = this;
  79992. var dt = this.s.dt;
  79993. var scroll = this.s.scroll;
  79994. var runInterval = false;
  79995. var scrollSpeed = 5;
  79996. var buffer = 65;
  79997. var
  79998. windowY = e.pageY - document.body.scrollTop,
  79999. windowX = e.pageX - document.body.scrollLeft,
  80000. windowVert, windowHoriz,
  80001. dtVert, dtHoriz;
  80002. // Window calculations - based on the mouse position in the window,
  80003. // regardless of scrolling
  80004. if ( windowY < buffer ) {
  80005. windowVert = scrollSpeed * -1;
  80006. }
  80007. else if ( windowY > scroll.windowHeight - buffer ) {
  80008. windowVert = scrollSpeed;
  80009. }
  80010. if ( windowX < buffer ) {
  80011. windowHoriz = scrollSpeed * -1;
  80012. }
  80013. else if ( windowX > scroll.windowWidth - buffer ) {
  80014. windowHoriz = scrollSpeed;
  80015. }
  80016. // DataTables scrolling calculations - based on the table's position in
  80017. // the document and the mouse position on the page
  80018. if ( scroll.dtTop !== null && e.pageY < scroll.dtTop + buffer ) {
  80019. dtVert = scrollSpeed * -1;
  80020. }
  80021. else if ( scroll.dtTop !== null && e.pageY > scroll.dtTop + scroll.dtHeight - buffer ) {
  80022. dtVert = scrollSpeed;
  80023. }
  80024. if ( scroll.dtLeft !== null && e.pageX < scroll.dtLeft + buffer ) {
  80025. dtHoriz = scrollSpeed * -1;
  80026. }
  80027. else if ( scroll.dtLeft !== null && e.pageX > scroll.dtLeft + scroll.dtWidth - buffer ) {
  80028. dtHoriz = scrollSpeed;
  80029. }
  80030. // This is where it gets interesting. We want to continue scrolling
  80031. // without requiring a mouse move, so we need an interval to be
  80032. // triggered. The interval should continue until it is no longer needed,
  80033. // but it must also use the latest scroll commands (for example consider
  80034. // that the mouse might move from scrolling up to scrolling left, all
  80035. // with the same interval running. We use the `scroll` object to "pass"
  80036. // this information to the interval. Can't use local variables as they
  80037. // wouldn't be the ones that are used by an already existing interval!
  80038. if ( windowVert || windowHoriz || dtVert || dtHoriz ) {
  80039. scroll.windowVert = windowVert;
  80040. scroll.windowHoriz = windowHoriz;
  80041. scroll.dtVert = dtVert;
  80042. scroll.dtHoriz = dtHoriz;
  80043. runInterval = true;
  80044. }
  80045. else if ( this.s.scrollInterval ) {
  80046. // Don't need to scroll - remove any existing timer
  80047. clearInterval( this.s.scrollInterval );
  80048. this.s.scrollInterval = null;
  80049. }
  80050. // If we need to run the interval to scroll and there is no existing
  80051. // interval (if there is an existing one, it will continue to run)
  80052. if ( ! this.s.scrollInterval && runInterval ) {
  80053. this.s.scrollInterval = setInterval( function () {
  80054. // Don't need to worry about setting scroll <0 or beyond the
  80055. // scroll bound as the browser will just reject that.
  80056. if ( scroll.windowVert ) {
  80057. document.body.scrollTop += scroll.windowVert;
  80058. }
  80059. if ( scroll.windowHoriz ) {
  80060. document.body.scrollLeft += scroll.windowHoriz;
  80061. }
  80062. // DataTables scrolling
  80063. if ( scroll.dtVert || scroll.dtHoriz ) {
  80064. var scroller = that.dom.dtScroll[0];
  80065. if ( scroll.dtVert ) {
  80066. scroller.scrollTop += scroll.dtVert;
  80067. }
  80068. if ( scroll.dtHoriz ) {
  80069. scroller.scrollLeft += scroll.dtHoriz;
  80070. }
  80071. }
  80072. }, 20 );
  80073. }
  80074. },
  80075. /**
  80076. * Update the DataTable after the user has selected what they want to do
  80077. *
  80078. * @param {false|undefined} result Return from the `execute` method - can
  80079. * be false internally to do nothing. This is not documented for plug-ins
  80080. * and is used only by the cancel option.
  80081. * @param {array} cells Information about the selected cells from the key
  80082. * up function, argumented with the set values
  80083. * @private
  80084. */
  80085. _update: function ( result, cells )
  80086. {
  80087. // Do nothing on `false` return from an execute function
  80088. if ( result === false ) {
  80089. return;
  80090. }
  80091. var dt = this.s.dt;
  80092. var cell;
  80093. // Potentially allow modifications to the cells matrix
  80094. this._emitEvent( 'preAutoFill', [ dt, cells ] );
  80095. this._editor( cells );
  80096. // Automatic updates are not performed if `update` is null and the
  80097. // `editor` parameter is passed in - the reason being that Editor will
  80098. // update the data once submitted
  80099. var update = this.c.update !== null ?
  80100. this.c.update :
  80101. this.c.editor ?
  80102. false :
  80103. true;
  80104. if ( update ) {
  80105. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  80106. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  80107. cell = cells[i][j];
  80108. cell.cell.data( cell.set );
  80109. }
  80110. }
  80111. dt.draw(false);
  80112. }
  80113. this._emitEvent( 'autoFill', [ dt, cells ] );
  80114. }
  80115. } );
  80116. /**
  80117. * AutoFill actions. The options here determine how AutoFill will fill the data
  80118. * in the table when the user has selected a range of cells. Please see the
  80119. * documentation on the DataTables site for full details on how to create plug-
  80120. * ins.
  80121. *
  80122. * @type {Object}
  80123. */
  80124. AutoFill.actions = {
  80125. increment: {
  80126. available: function ( dt, cells ) {
  80127. return $.isNumeric( cells[0][0].label );
  80128. },
  80129. option: function ( dt, cells ) {
  80130. return dt.i18n(
  80131. 'autoFill.increment',
  80132. 'Increment / decrement each cell by: <input type="number" value="1">'
  80133. );
  80134. },
  80135. execute: function ( dt, cells, node ) {
  80136. var value = cells[0][0].data * 1;
  80137. var increment = $('input', node).val() * 1;
  80138. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  80139. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  80140. cells[i][j].set = value;
  80141. value += increment;
  80142. }
  80143. }
  80144. }
  80145. },
  80146. fill: {
  80147. available: function ( dt, cells ) {
  80148. return true;
  80149. },
  80150. option: function ( dt, cells ) {
  80151. return dt.i18n('autoFill.fill', 'Fill all cells with <i>'+cells[0][0].label+'</i>' );
  80152. },
  80153. execute: function ( dt, cells, node ) {
  80154. var value = cells[0][0].data;
  80155. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  80156. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  80157. cells[i][j].set = value;
  80158. }
  80159. }
  80160. }
  80161. },
  80162. fillHorizontal: {
  80163. available: function ( dt, cells ) {
  80164. return cells.length > 1 && cells[0].length > 1;
  80165. },
  80166. option: function ( dt, cells ) {
  80167. return dt.i18n('autoFill.fillHorizontal', 'Fill cells horizontally' );
  80168. },
  80169. execute: function ( dt, cells, node ) {
  80170. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  80171. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  80172. cells[i][j].set = cells[i][0].data;
  80173. }
  80174. }
  80175. }
  80176. },
  80177. fillVertical: {
  80178. available: function ( dt, cells ) {
  80179. return cells.length > 1 && cells[0].length > 1;
  80180. },
  80181. option: function ( dt, cells ) {
  80182. return dt.i18n('autoFill.fillVertical', 'Fill cells vertically' );
  80183. },
  80184. execute: function ( dt, cells, node ) {
  80185. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  80186. for ( var j=0, jen=cells[i].length ; j<jen ; j++ ) {
  80187. cells[i][j].set = cells[0][j].data;
  80188. }
  80189. }
  80190. }
  80191. },
  80192. // Special type that does not make itself available, but is added
  80193. // automatically by AutoFill if a multi-choice list is shown. This allows
  80194. // sensible code reuse
  80195. cancel: {
  80196. available: function () {
  80197. return false;
  80198. },
  80199. option: function ( dt ) {
  80200. return dt.i18n('autoFill.cancel', 'Cancel' );
  80201. },
  80202. execute: function () {
  80203. return false;
  80204. }
  80205. }
  80206. };
  80207. /**
  80208. * AutoFill version
  80209. *
  80210. * @static
  80211. * @type String
  80212. */
  80213. AutoFill.version = '2.2.2';
  80214. /**
  80215. * AutoFill defaults
  80216. *
  80217. * @namespace
  80218. */
  80219. AutoFill.defaults = {
  80220. /** @type {Boolean} Ask user what they want to do, even for a single option */
  80221. alwaysAsk: false,
  80222. /** @type {string|null} What will trigger a focus */
  80223. focus: null, // focus, click, hover
  80224. /** @type {column-selector} Columns to provide auto fill for */
  80225. columns: '', // all
  80226. /** @type {Boolean} Enable AutoFill on load */
  80227. enable: true,
  80228. /** @type {boolean|null} Update the cells after a drag */
  80229. update: null, // false is editor given, true otherwise
  80230. /** @type {DataTable.Editor} Editor instance for automatic submission */
  80231. editor: null
  80232. };
  80233. /**
  80234. * Classes used by AutoFill that are configurable
  80235. *
  80236. * @namespace
  80237. */
  80238. AutoFill.classes = {
  80239. /** @type {String} Class used by the selection button */
  80240. btn: 'btn'
  80241. };
  80242. /*
  80243. * API
  80244. */
  80245. var Api = $.fn.dataTable.Api;
  80246. // Doesn't do anything - Not documented
  80247. Api.register( 'autoFill()', function () {
  80248. return this;
  80249. } );
  80250. Api.register( 'autoFill().enabled()', function () {
  80251. var ctx = this.context[0];
  80252. return ctx.autoFill ?
  80253. ctx.autoFill.enabled() :
  80254. false;
  80255. } );
  80256. Api.register( 'autoFill().enable()', function ( flag ) {
  80257. return this.iterator( 'table', function ( ctx ) {
  80258. if ( ctx.autoFill ) {
  80259. ctx.autoFill.enable( flag );
  80260. }
  80261. } );
  80262. } );
  80263. Api.register( 'autoFill().disable()', function () {
  80264. return this.iterator( 'table', function ( ctx ) {
  80265. if ( ctx.autoFill ) {
  80266. ctx.autoFill.disable();
  80267. }
  80268. } );
  80269. } );
  80270. // Attach a listener to the document which listens for DataTables initialisation
  80271. // events so we can automatically initialise
  80272. $(document).on( 'preInit.dt.autofill', function (e, settings, json) {
  80273. if ( e.namespace !== 'dt' ) {
  80274. return;
  80275. }
  80276. var init = settings.oInit.autoFill;
  80277. var defaults = DataTable.defaults.autoFill;
  80278. if ( init || defaults ) {
  80279. var opts = $.extend( {}, init, defaults );
  80280. if ( init !== false ) {
  80281. new AutoFill( settings, opts );
  80282. }
  80283. }
  80284. } );
  80285. // Alias for access
  80286. DataTable.AutoFill = AutoFill;
  80287. DataTable.AutoFill = AutoFill;
  80288. return AutoFill;
  80289. }));
  80290. /*! Bootstrap integration for DataTables' AutoFill
  80291. * ©2015 SpryMedia Ltd - datatables.net/license
  80292. */
  80293. (function( factory ){
  80294. if ( typeof define === 'function' && define.amd ) {
  80295. // AMD
  80296. define( ['jquery', 'datatables.net-bs4', 'datatables.net-autofill'], function ( $ ) {
  80297. return factory( $, window, document );
  80298. } );
  80299. }
  80300. else if ( typeof exports === 'object' ) {
  80301. // CommonJS
  80302. module.exports = function (root, $) {
  80303. if ( ! root ) {
  80304. root = window;
  80305. }
  80306. if ( ! $ || ! $.fn.dataTable ) {
  80307. $ = require('datatables.net-bs4')(root, $).$;
  80308. }
  80309. if ( ! $.fn.dataTable.AutoFill ) {
  80310. require('datatables.net-autofill')(root, $);
  80311. }
  80312. return factory( $, root, root.document );
  80313. };
  80314. }
  80315. else {
  80316. // Browser
  80317. factory( jQuery, window, document );
  80318. }
  80319. }(function( $, window, document, undefined ) {
  80320. 'use strict';
  80321. var DataTable = $.fn.dataTable;
  80322. DataTable.AutoFill.classes.btn = 'btn btn-primary';
  80323. return DataTable;
  80324. }));
  80325. /*! Buttons for DataTables 1.5.1
  80326. * ©2016-2017 SpryMedia Ltd - datatables.net/license
  80327. */
  80328. (function( factory ){
  80329. if ( typeof define === 'function' && define.amd ) {
  80330. // AMD
  80331. define( ['jquery', 'datatables.net'], function ( $ ) {
  80332. return factory( $, window, document );
  80333. } );
  80334. }
  80335. else if ( typeof exports === 'object' ) {
  80336. // CommonJS
  80337. module.exports = function (root, $) {
  80338. if ( ! root ) {
  80339. root = window;
  80340. }
  80341. if ( ! $ || ! $.fn.dataTable ) {
  80342. $ = require('datatables.net')(root, $).$;
  80343. }
  80344. return factory( $, root, root.document );
  80345. };
  80346. }
  80347. else {
  80348. // Browser
  80349. factory( jQuery, window, document );
  80350. }
  80351. }(function( $, window, document, undefined ) {
  80352. 'use strict';
  80353. var DataTable = $.fn.dataTable;
  80354. // Used for namespacing events added to the document by each instance, so they
  80355. // can be removed on destroy
  80356. var _instCounter = 0;
  80357. // Button namespacing counter for namespacing events on individual buttons
  80358. var _buttonCounter = 0;
  80359. var _dtButtons = DataTable.ext.buttons;
  80360. /**
  80361. * [Buttons description]
  80362. * @param {[type]}
  80363. * @param {[type]}
  80364. */
  80365. var Buttons = function( dt, config )
  80366. {
  80367. // If there is no config set it to an empty object
  80368. if ( typeof( config ) === 'undefined' ) {
  80369. config = {};
  80370. }
  80371. // Allow a boolean true for defaults
  80372. if ( config === true ) {
  80373. config = {};
  80374. }
  80375. // For easy configuration of buttons an array can be given
  80376. if ( $.isArray( config ) ) {
  80377. config = { buttons: config };
  80378. }
  80379. this.c = $.extend( true, {}, Buttons.defaults, config );
  80380. // Don't want a deep copy for the buttons
  80381. if ( config.buttons ) {
  80382. this.c.buttons = config.buttons;
  80383. }
  80384. this.s = {
  80385. dt: new DataTable.Api( dt ),
  80386. buttons: [],
  80387. listenKeys: '',
  80388. namespace: 'dtb'+(_instCounter++)
  80389. };
  80390. this.dom = {
  80391. container: $('<'+this.c.dom.container.tag+'/>')
  80392. .addClass( this.c.dom.container.className )
  80393. };
  80394. this._constructor();
  80395. };
  80396. $.extend( Buttons.prototype, {
  80397. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  80398. * Public methods
  80399. */
  80400. /**
  80401. * Get the action of a button
  80402. * @param {int|string} Button index
  80403. * @return {function}
  80404. *//**
  80405. * Set the action of a button
  80406. * @param {node} node Button element
  80407. * @param {function} action Function to set
  80408. * @return {Buttons} Self for chaining
  80409. */
  80410. action: function ( node, action )
  80411. {
  80412. var button = this._nodeToButton( node );
  80413. if ( action === undefined ) {
  80414. return button.conf.action;
  80415. }
  80416. button.conf.action = action;
  80417. return this;
  80418. },
  80419. /**
  80420. * Add an active class to the button to make to look active or get current
  80421. * active state.
  80422. * @param {node} node Button element
  80423. * @param {boolean} [flag] Enable / disable flag
  80424. * @return {Buttons} Self for chaining or boolean for getter
  80425. */
  80426. active: function ( node, flag ) {
  80427. var button = this._nodeToButton( node );
  80428. var klass = this.c.dom.button.active;
  80429. var jqNode = $(button.node);
  80430. if ( flag === undefined ) {
  80431. return jqNode.hasClass( klass );
  80432. }
  80433. jqNode.toggleClass( klass, flag === undefined ? true : flag );
  80434. return this;
  80435. },
  80436. /**
  80437. * Add a new button
  80438. * @param {object} config Button configuration object, base string name or function
  80439. * @param {int|string} [idx] Button index for where to insert the button
  80440. * @return {Buttons} Self for chaining
  80441. */
  80442. add: function ( config, idx )
  80443. {
  80444. var buttons = this.s.buttons;
  80445. if ( typeof idx === 'string' ) {
  80446. var split = idx.split('-');
  80447. var base = this.s;
  80448. for ( var i=0, ien=split.length-1 ; i<ien ; i++ ) {
  80449. base = base.buttons[ split[i]*1 ];
  80450. }
  80451. buttons = base.buttons;
  80452. idx = split[ split.length-1 ]*1;
  80453. }
  80454. this._expandButton( buttons, config, false, idx );
  80455. this._draw();
  80456. return this;
  80457. },
  80458. /**
  80459. * Get the container node for the buttons
  80460. * @return {jQuery} Buttons node
  80461. */
  80462. container: function ()
  80463. {
  80464. return this.dom.container;
  80465. },
  80466. /**
  80467. * Disable a button
  80468. * @param {node} node Button node
  80469. * @return {Buttons} Self for chaining
  80470. */
  80471. disable: function ( node ) {
  80472. var button = this._nodeToButton( node );
  80473. $(button.node).addClass( this.c.dom.button.disabled );
  80474. return this;
  80475. },
  80476. /**
  80477. * Destroy the instance, cleaning up event handlers and removing DOM
  80478. * elements
  80479. * @return {Buttons} Self for chaining
  80480. */
  80481. destroy: function ()
  80482. {
  80483. // Key event listener
  80484. $('body').off( 'keyup.'+this.s.namespace );
  80485. // Individual button destroy (so they can remove their own events if
  80486. // needed). Take a copy as the array is modified by `remove`
  80487. var buttons = this.s.buttons.slice();
  80488. var i, ien;
  80489. for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
  80490. this.remove( buttons[i].node );
  80491. }
  80492. // Container
  80493. this.dom.container.remove();
  80494. // Remove from the settings object collection
  80495. var buttonInsts = this.s.dt.settings()[0];
  80496. for ( i=0, ien=buttonInsts.length ; i<ien ; i++ ) {
  80497. if ( buttonInsts.inst === this ) {
  80498. buttonInsts.splice( i, 1 );
  80499. break;
  80500. }
  80501. }
  80502. return this;
  80503. },
  80504. /**
  80505. * Enable / disable a button
  80506. * @param {node} node Button node
  80507. * @param {boolean} [flag=true] Enable / disable flag
  80508. * @return {Buttons} Self for chaining
  80509. */
  80510. enable: function ( node, flag )
  80511. {
  80512. if ( flag === false ) {
  80513. return this.disable( node );
  80514. }
  80515. var button = this._nodeToButton( node );
  80516. $(button.node).removeClass( this.c.dom.button.disabled );
  80517. return this;
  80518. },
  80519. /**
  80520. * Get the instance name for the button set selector
  80521. * @return {string} Instance name
  80522. */
  80523. name: function ()
  80524. {
  80525. return this.c.name;
  80526. },
  80527. /**
  80528. * Get a button's node
  80529. * @param {node} node Button node
  80530. * @return {jQuery} Button element
  80531. */
  80532. node: function ( node )
  80533. {
  80534. var button = this._nodeToButton( node );
  80535. return $(button.node);
  80536. },
  80537. /**
  80538. * Set / get a processing class on the selected button
  80539. * @param {boolean} flag true to add, false to remove, undefined to get
  80540. * @return {boolean|Buttons} Getter value or this if a setter.
  80541. */
  80542. processing: function ( node, flag )
  80543. {
  80544. var button = this._nodeToButton( node );
  80545. if ( flag === undefined ) {
  80546. return $(button.node).hasClass( 'processing' );
  80547. }
  80548. $(button.node).toggleClass( 'processing', flag );
  80549. return this;
  80550. },
  80551. /**
  80552. * Remove a button.
  80553. * @param {node} node Button node
  80554. * @return {Buttons} Self for chaining
  80555. */
  80556. remove: function ( node )
  80557. {
  80558. var button = this._nodeToButton( node );
  80559. var host = this._nodeToHost( node );
  80560. var dt = this.s.dt;
  80561. // Remove any child buttons first
  80562. if ( button.buttons.length ) {
  80563. for ( var i=button.buttons.length-1 ; i>=0 ; i-- ) {
  80564. this.remove( button.buttons[i].node );
  80565. }
  80566. }
  80567. // Allow the button to remove event handlers, etc
  80568. if ( button.conf.destroy ) {
  80569. button.conf.destroy.call( dt.button(node), dt, $(node), button.conf );
  80570. }
  80571. this._removeKey( button.conf );
  80572. $(button.node).remove();
  80573. var idx = $.inArray( button, host );
  80574. host.splice( idx, 1 );
  80575. return this;
  80576. },
  80577. /**
  80578. * Get the text for a button
  80579. * @param {int|string} node Button index
  80580. * @return {string} Button text
  80581. *//**
  80582. * Set the text for a button
  80583. * @param {int|string|function} node Button index
  80584. * @param {string} label Text
  80585. * @return {Buttons} Self for chaining
  80586. */
  80587. text: function ( node, label )
  80588. {
  80589. var button = this._nodeToButton( node );
  80590. var buttonLiner = this.c.dom.collection.buttonLiner;
  80591. var linerTag = button.inCollection && buttonLiner && buttonLiner.tag ?
  80592. buttonLiner.tag :
  80593. this.c.dom.buttonLiner.tag;
  80594. var dt = this.s.dt;
  80595. var jqNode = $(button.node);
  80596. var text = function ( opt ) {
  80597. return typeof opt === 'function' ?
  80598. opt( dt, jqNode, button.conf ) :
  80599. opt;
  80600. };
  80601. if ( label === undefined ) {
  80602. return text( button.conf.text );
  80603. }
  80604. button.conf.text = label;
  80605. if ( linerTag ) {
  80606. jqNode.children( linerTag ).html( text(label) );
  80607. }
  80608. else {
  80609. jqNode.html( text(label) );
  80610. }
  80611. return this;
  80612. },
  80613. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  80614. * Constructor
  80615. */
  80616. /**
  80617. * Buttons constructor
  80618. * @private
  80619. */
  80620. _constructor: function ()
  80621. {
  80622. var that = this;
  80623. var dt = this.s.dt;
  80624. var dtSettings = dt.settings()[0];
  80625. var buttons = this.c.buttons;
  80626. if ( ! dtSettings._buttons ) {
  80627. dtSettings._buttons = [];
  80628. }
  80629. dtSettings._buttons.push( {
  80630. inst: this,
  80631. name: this.c.name
  80632. } );
  80633. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  80634. this.add( buttons[i] );
  80635. }
  80636. dt.on( 'destroy', function () {
  80637. that.destroy();
  80638. } );
  80639. // Global key event binding to listen for button keys
  80640. $('body').on( 'keyup.'+this.s.namespace, function ( e ) {
  80641. if ( ! document.activeElement || document.activeElement === document.body ) {
  80642. // SUse a string of characters for fast lookup of if we need to
  80643. // handle this
  80644. var character = String.fromCharCode(e.keyCode).toLowerCase();
  80645. if ( that.s.listenKeys.toLowerCase().indexOf( character ) !== -1 ) {
  80646. that._keypress( character, e );
  80647. }
  80648. }
  80649. } );
  80650. },
  80651. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  80652. * Private methods
  80653. */
  80654. /**
  80655. * Add a new button to the key press listener
  80656. * @param {object} conf Resolved button configuration object
  80657. * @private
  80658. */
  80659. _addKey: function ( conf )
  80660. {
  80661. if ( conf.key ) {
  80662. this.s.listenKeys += $.isPlainObject( conf.key ) ?
  80663. conf.key.key :
  80664. conf.key;
  80665. }
  80666. },
  80667. /**
  80668. * Insert the buttons into the container. Call without parameters!
  80669. * @param {node} [container] Recursive only - Insert point
  80670. * @param {array} [buttons] Recursive only - Buttons array
  80671. * @private
  80672. */
  80673. _draw: function ( container, buttons )
  80674. {
  80675. if ( ! container ) {
  80676. container = this.dom.container;
  80677. buttons = this.s.buttons;
  80678. }
  80679. container.children().detach();
  80680. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  80681. container.append( buttons[i].inserter );
  80682. container.append( ' ' );
  80683. if ( buttons[i].buttons && buttons[i].buttons.length ) {
  80684. this._draw( buttons[i].collection, buttons[i].buttons );
  80685. }
  80686. }
  80687. },
  80688. /**
  80689. * Create buttons from an array of buttons
  80690. * @param {array} attachTo Buttons array to attach to
  80691. * @param {object} button Button definition
  80692. * @param {boolean} inCollection true if the button is in a collection
  80693. * @private
  80694. */
  80695. _expandButton: function ( attachTo, button, inCollection, attachPoint )
  80696. {
  80697. var dt = this.s.dt;
  80698. var buttonCounter = 0;
  80699. var buttons = ! $.isArray( button ) ?
  80700. [ button ] :
  80701. button;
  80702. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  80703. var conf = this._resolveExtends( buttons[i] );
  80704. if ( ! conf ) {
  80705. continue;
  80706. }
  80707. // If the configuration is an array, then expand the buttons at this
  80708. // point
  80709. if ( $.isArray( conf ) ) {
  80710. this._expandButton( attachTo, conf, inCollection, attachPoint );
  80711. continue;
  80712. }
  80713. var built = this._buildButton( conf, inCollection );
  80714. if ( ! built ) {
  80715. continue;
  80716. }
  80717. if ( attachPoint !== undefined ) {
  80718. attachTo.splice( attachPoint, 0, built );
  80719. attachPoint++;
  80720. }
  80721. else {
  80722. attachTo.push( built );
  80723. }
  80724. if ( built.conf.buttons ) {
  80725. var collectionDom = this.c.dom.collection;
  80726. built.collection = $('<'+collectionDom.tag+'/>')
  80727. .addClass( collectionDom.className )
  80728. .attr( 'role', 'menu') ;
  80729. built.conf._collection = built.collection;
  80730. this._expandButton( built.buttons, built.conf.buttons, true, attachPoint );
  80731. }
  80732. // init call is made here, rather than buildButton as it needs to
  80733. // be selectable, and for that it needs to be in the buttons array
  80734. if ( conf.init ) {
  80735. conf.init.call( dt.button( built.node ), dt, $(built.node), conf );
  80736. }
  80737. buttonCounter++;
  80738. }
  80739. },
  80740. /**
  80741. * Create an individual button
  80742. * @param {object} config Resolved button configuration
  80743. * @param {boolean} inCollection `true` if a collection button
  80744. * @return {jQuery} Created button node (jQuery)
  80745. * @private
  80746. */
  80747. _buildButton: function ( config, inCollection )
  80748. {
  80749. var buttonDom = this.c.dom.button;
  80750. var linerDom = this.c.dom.buttonLiner;
  80751. var collectionDom = this.c.dom.collection;
  80752. var dt = this.s.dt;
  80753. var text = function ( opt ) {
  80754. return typeof opt === 'function' ?
  80755. opt( dt, button, config ) :
  80756. opt;
  80757. };
  80758. if ( inCollection && collectionDom.button ) {
  80759. buttonDom = collectionDom.button;
  80760. }
  80761. if ( inCollection && collectionDom.buttonLiner ) {
  80762. linerDom = collectionDom.buttonLiner;
  80763. }
  80764. // Make sure that the button is available based on whatever requirements
  80765. // it has. For example, Flash buttons require Flash
  80766. if ( config.available && ! config.available( dt, config ) ) {
  80767. return false;
  80768. }
  80769. var action = function ( e, dt, button, config ) {
  80770. config.action.call( dt.button( button ), e, dt, button, config );
  80771. $(dt.table().node()).triggerHandler( 'buttons-action.dt', [
  80772. dt.button( button ), dt, button, config
  80773. ] );
  80774. };
  80775. var button = $('<'+buttonDom.tag+'/>')
  80776. .addClass( buttonDom.className )
  80777. .attr( 'tabindex', this.s.dt.settings()[0].iTabIndex )
  80778. .attr( 'aria-controls', this.s.dt.table().node().id )
  80779. .on( 'click.dtb', function (e) {
  80780. e.preventDefault();
  80781. if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
  80782. action( e, dt, button, config );
  80783. }
  80784. button.blur();
  80785. } )
  80786. .on( 'keyup.dtb', function (e) {
  80787. if ( e.keyCode === 13 ) {
  80788. if ( ! button.hasClass( buttonDom.disabled ) && config.action ) {
  80789. action( e, dt, button, config );
  80790. }
  80791. }
  80792. } );
  80793. // Make `a` tags act like a link
  80794. if ( buttonDom.tag.toLowerCase() === 'a' ) {
  80795. button.attr( 'href', '#' );
  80796. }
  80797. if ( linerDom.tag ) {
  80798. var liner = $('<'+linerDom.tag+'/>')
  80799. .html( text( config.text ) )
  80800. .addClass( linerDom.className );
  80801. if ( linerDom.tag.toLowerCase() === 'a' ) {
  80802. liner.attr( 'href', '#' );
  80803. }
  80804. button.append( liner );
  80805. }
  80806. else {
  80807. button.html( text( config.text ) );
  80808. }
  80809. if ( config.enabled === false ) {
  80810. button.addClass( buttonDom.disabled );
  80811. }
  80812. if ( config.className ) {
  80813. button.addClass( config.className );
  80814. }
  80815. if ( config.titleAttr ) {
  80816. button.attr( 'title', text( config.titleAttr ) );
  80817. }
  80818. if ( config.attr ) {
  80819. button.attr( config.attr );
  80820. }
  80821. if ( ! config.namespace ) {
  80822. config.namespace = '.dt-button-'+(_buttonCounter++);
  80823. }
  80824. var buttonContainer = this.c.dom.buttonContainer;
  80825. var inserter;
  80826. if ( buttonContainer && buttonContainer.tag ) {
  80827. inserter = $('<'+buttonContainer.tag+'/>')
  80828. .addClass( buttonContainer.className )
  80829. .append( button );
  80830. }
  80831. else {
  80832. inserter = button;
  80833. }
  80834. this._addKey( config );
  80835. return {
  80836. conf: config,
  80837. node: button.get(0),
  80838. inserter: inserter,
  80839. buttons: [],
  80840. inCollection: inCollection,
  80841. collection: null
  80842. };
  80843. },
  80844. /**
  80845. * Get the button object from a node (recursive)
  80846. * @param {node} node Button node
  80847. * @param {array} [buttons] Button array, uses base if not defined
  80848. * @return {object} Button object
  80849. * @private
  80850. */
  80851. _nodeToButton: function ( node, buttons )
  80852. {
  80853. if ( ! buttons ) {
  80854. buttons = this.s.buttons;
  80855. }
  80856. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  80857. if ( buttons[i].node === node ) {
  80858. return buttons[i];
  80859. }
  80860. if ( buttons[i].buttons.length ) {
  80861. var ret = this._nodeToButton( node, buttons[i].buttons );
  80862. if ( ret ) {
  80863. return ret;
  80864. }
  80865. }
  80866. }
  80867. },
  80868. /**
  80869. * Get container array for a button from a button node (recursive)
  80870. * @param {node} node Button node
  80871. * @param {array} [buttons] Button array, uses base if not defined
  80872. * @return {array} Button's host array
  80873. * @private
  80874. */
  80875. _nodeToHost: function ( node, buttons )
  80876. {
  80877. if ( ! buttons ) {
  80878. buttons = this.s.buttons;
  80879. }
  80880. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  80881. if ( buttons[i].node === node ) {
  80882. return buttons;
  80883. }
  80884. if ( buttons[i].buttons.length ) {
  80885. var ret = this._nodeToHost( node, buttons[i].buttons );
  80886. if ( ret ) {
  80887. return ret;
  80888. }
  80889. }
  80890. }
  80891. },
  80892. /**
  80893. * Handle a key press - determine if any button's key configured matches
  80894. * what was typed and trigger the action if so.
  80895. * @param {string} character The character pressed
  80896. * @param {object} e Key event that triggered this call
  80897. * @private
  80898. */
  80899. _keypress: function ( character, e )
  80900. {
  80901. // Check if this button press already activated on another instance of Buttons
  80902. if ( e._buttonsHandled ) {
  80903. return;
  80904. }
  80905. var run = function ( conf, node ) {
  80906. if ( ! conf.key ) {
  80907. return;
  80908. }
  80909. if ( conf.key === character ) {
  80910. e._buttonsHandled = true;
  80911. $(node).click();
  80912. }
  80913. else if ( $.isPlainObject( conf.key ) ) {
  80914. if ( conf.key.key !== character ) {
  80915. return;
  80916. }
  80917. if ( conf.key.shiftKey && ! e.shiftKey ) {
  80918. return;
  80919. }
  80920. if ( conf.key.altKey && ! e.altKey ) {
  80921. return;
  80922. }
  80923. if ( conf.key.ctrlKey && ! e.ctrlKey ) {
  80924. return;
  80925. }
  80926. if ( conf.key.metaKey && ! e.metaKey ) {
  80927. return;
  80928. }
  80929. // Made it this far - it is good
  80930. e._buttonsHandled = true;
  80931. $(node).click();
  80932. }
  80933. };
  80934. var recurse = function ( a ) {
  80935. for ( var i=0, ien=a.length ; i<ien ; i++ ) {
  80936. run( a[i].conf, a[i].node );
  80937. if ( a[i].buttons.length ) {
  80938. recurse( a[i].buttons );
  80939. }
  80940. }
  80941. };
  80942. recurse( this.s.buttons );
  80943. },
  80944. /**
  80945. * Remove a key from the key listener for this instance (to be used when a
  80946. * button is removed)
  80947. * @param {object} conf Button configuration
  80948. * @private
  80949. */
  80950. _removeKey: function ( conf )
  80951. {
  80952. if ( conf.key ) {
  80953. var character = $.isPlainObject( conf.key ) ?
  80954. conf.key.key :
  80955. conf.key;
  80956. // Remove only one character, as multiple buttons could have the
  80957. // same listening key
  80958. var a = this.s.listenKeys.split('');
  80959. var idx = $.inArray( character, a );
  80960. a.splice( idx, 1 );
  80961. this.s.listenKeys = a.join('');
  80962. }
  80963. },
  80964. /**
  80965. * Resolve a button configuration
  80966. * @param {string|function|object} conf Button config to resolve
  80967. * @return {object} Button configuration
  80968. * @private
  80969. */
  80970. _resolveExtends: function ( conf )
  80971. {
  80972. var dt = this.s.dt;
  80973. var i, ien;
  80974. var toConfObject = function ( base ) {
  80975. var loop = 0;
  80976. // Loop until we have resolved to a button configuration, or an
  80977. // array of button configurations (which will be iterated
  80978. // separately)
  80979. while ( ! $.isPlainObject(base) && ! $.isArray(base) ) {
  80980. if ( base === undefined ) {
  80981. return;
  80982. }
  80983. if ( typeof base === 'function' ) {
  80984. base = base( dt, conf );
  80985. if ( ! base ) {
  80986. return false;
  80987. }
  80988. }
  80989. else if ( typeof base === 'string' ) {
  80990. if ( ! _dtButtons[ base ] ) {
  80991. throw 'Unknown button type: '+base;
  80992. }
  80993. base = _dtButtons[ base ];
  80994. }
  80995. loop++;
  80996. if ( loop > 30 ) {
  80997. // Protect against misconfiguration killing the browser
  80998. throw 'Buttons: Too many iterations';
  80999. }
  81000. }
  81001. return $.isArray( base ) ?
  81002. base :
  81003. $.extend( {}, base );
  81004. };
  81005. conf = toConfObject( conf );
  81006. while ( conf && conf.extend ) {
  81007. // Use `toConfObject` in case the button definition being extended
  81008. // is itself a string or a function
  81009. if ( ! _dtButtons[ conf.extend ] ) {
  81010. throw 'Cannot extend unknown button type: '+conf.extend;
  81011. }
  81012. var objArray = toConfObject( _dtButtons[ conf.extend ] );
  81013. if ( $.isArray( objArray ) ) {
  81014. return objArray;
  81015. }
  81016. else if ( ! objArray ) {
  81017. // This is a little brutal as it might be possible to have a
  81018. // valid button without the extend, but if there is no extend
  81019. // then the host button would be acting in an undefined state
  81020. return false;
  81021. }
  81022. // Stash the current class name
  81023. var originalClassName = objArray.className;
  81024. conf = $.extend( {}, objArray, conf );
  81025. // The extend will have overwritten the original class name if the
  81026. // `conf` object also assigned a class, but we want to concatenate
  81027. // them so they are list that is combined from all extended buttons
  81028. if ( originalClassName && conf.className !== originalClassName ) {
  81029. conf.className = originalClassName+' '+conf.className;
  81030. }
  81031. // Buttons to be added to a collection -gives the ability to define
  81032. // if buttons should be added to the start or end of a collection
  81033. var postfixButtons = conf.postfixButtons;
  81034. if ( postfixButtons ) {
  81035. if ( ! conf.buttons ) {
  81036. conf.buttons = [];
  81037. }
  81038. for ( i=0, ien=postfixButtons.length ; i<ien ; i++ ) {
  81039. conf.buttons.push( postfixButtons[i] );
  81040. }
  81041. conf.postfixButtons = null;
  81042. }
  81043. var prefixButtons = conf.prefixButtons;
  81044. if ( prefixButtons ) {
  81045. if ( ! conf.buttons ) {
  81046. conf.buttons = [];
  81047. }
  81048. for ( i=0, ien=prefixButtons.length ; i<ien ; i++ ) {
  81049. conf.buttons.splice( i, 0, prefixButtons[i] );
  81050. }
  81051. conf.prefixButtons = null;
  81052. }
  81053. // Although we want the `conf` object to overwrite almost all of
  81054. // the properties of the object being extended, the `extend`
  81055. // property should come from the object being extended
  81056. conf.extend = objArray.extend;
  81057. }
  81058. return conf;
  81059. }
  81060. } );
  81061. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  81062. * Statics
  81063. */
  81064. /**
  81065. * Show / hide a background layer behind a collection
  81066. * @param {boolean} Flag to indicate if the background should be shown or
  81067. * hidden
  81068. * @param {string} Class to assign to the background
  81069. * @static
  81070. */
  81071. Buttons.background = function ( show, className, fade ) {
  81072. if ( fade === undefined ) {
  81073. fade = 400;
  81074. }
  81075. if ( show ) {
  81076. $('<div/>')
  81077. .addClass( className )
  81078. .css( 'display', 'none' )
  81079. .appendTo( 'body' )
  81080. .fadeIn( fade );
  81081. }
  81082. else {
  81083. $('body > div.'+className)
  81084. .fadeOut( fade, function () {
  81085. $(this)
  81086. .removeClass( className )
  81087. .remove();
  81088. } );
  81089. }
  81090. };
  81091. /**
  81092. * Instance selector - select Buttons instances based on an instance selector
  81093. * value from the buttons assigned to a DataTable. This is only useful if
  81094. * multiple instances are attached to a DataTable.
  81095. * @param {string|int|array} Instance selector - see `instance-selector`
  81096. * documentation on the DataTables site
  81097. * @param {array} Button instance array that was attached to the DataTables
  81098. * settings object
  81099. * @return {array} Buttons instances
  81100. * @static
  81101. */
  81102. Buttons.instanceSelector = function ( group, buttons )
  81103. {
  81104. if ( ! group ) {
  81105. return $.map( buttons, function ( v ) {
  81106. return v.inst;
  81107. } );
  81108. }
  81109. var ret = [];
  81110. var names = $.map( buttons, function ( v ) {
  81111. return v.name;
  81112. } );
  81113. // Flatten the group selector into an array of single options
  81114. var process = function ( input ) {
  81115. if ( $.isArray( input ) ) {
  81116. for ( var i=0, ien=input.length ; i<ien ; i++ ) {
  81117. process( input[i] );
  81118. }
  81119. return;
  81120. }
  81121. if ( typeof input === 'string' ) {
  81122. if ( input.indexOf( ',' ) !== -1 ) {
  81123. // String selector, list of names
  81124. process( input.split(',') );
  81125. }
  81126. else {
  81127. // String selector individual name
  81128. var idx = $.inArray( $.trim(input), names );
  81129. if ( idx !== -1 ) {
  81130. ret.push( buttons[ idx ].inst );
  81131. }
  81132. }
  81133. }
  81134. else if ( typeof input === 'number' ) {
  81135. // Index selector
  81136. ret.push( buttons[ input ].inst );
  81137. }
  81138. };
  81139. process( group );
  81140. return ret;
  81141. };
  81142. /**
  81143. * Button selector - select one or more buttons from a selector input so some
  81144. * operation can be performed on them.
  81145. * @param {array} Button instances array that the selector should operate on
  81146. * @param {string|int|node|jQuery|array} Button selector - see
  81147. * `button-selector` documentation on the DataTables site
  81148. * @return {array} Array of objects containing `inst` and `idx` properties of
  81149. * the selected buttons so you know which instance each button belongs to.
  81150. * @static
  81151. */
  81152. Buttons.buttonSelector = function ( insts, selector )
  81153. {
  81154. var ret = [];
  81155. var nodeBuilder = function ( a, buttons, baseIdx ) {
  81156. var button;
  81157. var idx;
  81158. for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
  81159. button = buttons[i];
  81160. if ( button ) {
  81161. idx = baseIdx !== undefined ?
  81162. baseIdx+i :
  81163. i+'';
  81164. a.push( {
  81165. node: button.node,
  81166. name: button.conf.name,
  81167. idx: idx
  81168. } );
  81169. if ( button.buttons ) {
  81170. nodeBuilder( a, button.buttons, idx+'-' );
  81171. }
  81172. }
  81173. }
  81174. };
  81175. var run = function ( selector, inst ) {
  81176. var i, ien;
  81177. var buttons = [];
  81178. nodeBuilder( buttons, inst.s.buttons );
  81179. var nodes = $.map( buttons, function (v) {
  81180. return v.node;
  81181. } );
  81182. if ( $.isArray( selector ) || selector instanceof $ ) {
  81183. for ( i=0, ien=selector.length ; i<ien ; i++ ) {
  81184. run( selector[i], inst );
  81185. }
  81186. return;
  81187. }
  81188. if ( selector === null || selector === undefined || selector === '*' ) {
  81189. // Select all
  81190. for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
  81191. ret.push( {
  81192. inst: inst,
  81193. node: buttons[i].node
  81194. } );
  81195. }
  81196. }
  81197. else if ( typeof selector === 'number' ) {
  81198. // Main button index selector
  81199. ret.push( {
  81200. inst: inst,
  81201. node: inst.s.buttons[ selector ].node
  81202. } );
  81203. }
  81204. else if ( typeof selector === 'string' ) {
  81205. if ( selector.indexOf( ',' ) !== -1 ) {
  81206. // Split
  81207. var a = selector.split(',');
  81208. for ( i=0, ien=a.length ; i<ien ; i++ ) {
  81209. run( $.trim(a[i]), inst );
  81210. }
  81211. }
  81212. else if ( selector.match( /^\d+(\-\d+)*$/ ) ) {
  81213. // Sub-button index selector
  81214. var indexes = $.map( buttons, function (v) {
  81215. return v.idx;
  81216. } );
  81217. ret.push( {
  81218. inst: inst,
  81219. node: buttons[ $.inArray( selector, indexes ) ].node
  81220. } );
  81221. }
  81222. else if ( selector.indexOf( ':name' ) !== -1 ) {
  81223. // Button name selector
  81224. var name = selector.replace( ':name', '' );
  81225. for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
  81226. if ( buttons[i].name === name ) {
  81227. ret.push( {
  81228. inst: inst,
  81229. node: buttons[i].node
  81230. } );
  81231. }
  81232. }
  81233. }
  81234. else {
  81235. // jQuery selector on the nodes
  81236. $( nodes ).filter( selector ).each( function () {
  81237. ret.push( {
  81238. inst: inst,
  81239. node: this
  81240. } );
  81241. } );
  81242. }
  81243. }
  81244. else if ( typeof selector === 'object' && selector.nodeName ) {
  81245. // Node selector
  81246. var idx = $.inArray( selector, nodes );
  81247. if ( idx !== -1 ) {
  81248. ret.push( {
  81249. inst: inst,
  81250. node: nodes[ idx ]
  81251. } );
  81252. }
  81253. }
  81254. };
  81255. for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
  81256. var inst = insts[i];
  81257. run( selector, inst );
  81258. }
  81259. return ret;
  81260. };
  81261. /**
  81262. * Buttons defaults. For full documentation, please refer to the docs/option
  81263. * directory or the DataTables site.
  81264. * @type {Object}
  81265. * @static
  81266. */
  81267. Buttons.defaults = {
  81268. buttons: [ 'copy', 'excel', 'csv', 'pdf', 'print' ],
  81269. name: 'main',
  81270. tabIndex: 0,
  81271. dom: {
  81272. container: {
  81273. tag: 'div',
  81274. className: 'dt-buttons'
  81275. },
  81276. collection: {
  81277. tag: 'div',
  81278. className: 'dt-button-collection'
  81279. },
  81280. button: {
  81281. tag: 'button',
  81282. className: 'dt-button',
  81283. active: 'active',
  81284. disabled: 'disabled'
  81285. },
  81286. buttonLiner: {
  81287. tag: 'span',
  81288. className: ''
  81289. }
  81290. }
  81291. };
  81292. /**
  81293. * Version information
  81294. * @type {string}
  81295. * @static
  81296. */
  81297. Buttons.version = '1.5.1';
  81298. $.extend( _dtButtons, {
  81299. collection: {
  81300. text: function ( dt ) {
  81301. return dt.i18n( 'buttons.collection', 'Collection' );
  81302. },
  81303. className: 'buttons-collection',
  81304. action: function ( e, dt, button, config ) {
  81305. var host = button;
  81306. var collectionParent = $(button).parents('div.dt-button-collection');
  81307. var hostPosition = host.position();
  81308. var tableContainer = $( dt.table().container() );
  81309. var multiLevel = false;
  81310. var insertPoint = host;
  81311. // Remove any old collection
  81312. if ( collectionParent.length ) {
  81313. multiLevel = $('.dt-button-collection').position();
  81314. insertPoint = collectionParent;
  81315. $('body').trigger( 'click.dtb-collection' );
  81316. }
  81317. config._collection
  81318. .addClass( config.collectionLayout )
  81319. .css( 'display', 'none' )
  81320. .insertAfter( insertPoint )
  81321. .fadeIn( config.fade );
  81322. var position = config._collection.css( 'position' );
  81323. if ( multiLevel && position === 'absolute' ) {
  81324. config._collection.css( {
  81325. top: multiLevel.top,
  81326. left: multiLevel.left
  81327. } );
  81328. }
  81329. else if ( position === 'absolute' ) {
  81330. config._collection.css( {
  81331. top: hostPosition.top + host.outerHeight(),
  81332. left: hostPosition.left
  81333. } );
  81334. // calculate overflow when positioned beneath
  81335. var tableBottom = tableContainer.offset().top + tableContainer.height();
  81336. var listBottom = hostPosition.top + host.outerHeight() + config._collection.outerHeight();
  81337. var bottomOverflow = listBottom - tableBottom;
  81338. // calculate overflow when positioned above
  81339. var listTop = hostPosition.top - config._collection.outerHeight();
  81340. var tableTop = tableContainer.offset().top;
  81341. var topOverflow = tableTop - listTop;
  81342. // if bottom overflow is larger, move to the top because it fits better
  81343. if (bottomOverflow > topOverflow) {
  81344. config._collection.css( 'top', hostPosition.top - config._collection.outerHeight() - 5);
  81345. }
  81346. var listRight = hostPosition.left + config._collection.outerWidth();
  81347. var tableRight = tableContainer.offset().left + tableContainer.width();
  81348. if ( listRight > tableRight ) {
  81349. config._collection.css( 'left', hostPosition.left - ( listRight - tableRight ) );
  81350. }
  81351. }
  81352. else {
  81353. // Fix position - centre on screen
  81354. var top = config._collection.height() / 2;
  81355. if ( top > $(window).height() / 2 ) {
  81356. top = $(window).height() / 2;
  81357. }
  81358. config._collection.css( 'marginTop', top*-1 );
  81359. }
  81360. if ( config.background ) {
  81361. Buttons.background( true, config.backgroundClassName, config.fade );
  81362. }
  81363. // Need to break the 'thread' for the collection button being
  81364. // activated by a click - it would also trigger this event
  81365. setTimeout( function () {
  81366. // This is bonkers, but if we don't have a click listener on the
  81367. // background element, iOS Safari will ignore the body click
  81368. // listener below. An empty function here is all that is
  81369. // required to make it work...
  81370. $('div.dt-button-background').on( 'click.dtb-collection', function () {} );
  81371. $('body').on( 'click.dtb-collection', function (e) {
  81372. // andSelf is deprecated in jQ1.8, but we want 1.7 compat
  81373. var back = $.fn.addBack ? 'addBack' : 'andSelf';
  81374. if ( ! $(e.target).parents()[back]().filter( config._collection ).length ) {
  81375. config._collection
  81376. .fadeOut( config.fade, function () {
  81377. config._collection.detach();
  81378. } );
  81379. $('div.dt-button-background').off( 'click.dtb-collection' );
  81380. Buttons.background( false, config.backgroundClassName, config.fade );
  81381. $('body').off( 'click.dtb-collection' );
  81382. dt.off( 'buttons-action.b-internal' );
  81383. }
  81384. } );
  81385. }, 10 );
  81386. if ( config.autoClose ) {
  81387. dt.on( 'buttons-action.b-internal', function () {
  81388. $('div.dt-button-background').click();
  81389. } );
  81390. }
  81391. },
  81392. background: true,
  81393. collectionLayout: '',
  81394. backgroundClassName: 'dt-button-background',
  81395. autoClose: false,
  81396. fade: 400,
  81397. attr: {
  81398. 'aria-haspopup': true
  81399. }
  81400. },
  81401. copy: function ( dt, conf ) {
  81402. if ( _dtButtons.copyHtml5 ) {
  81403. return 'copyHtml5';
  81404. }
  81405. if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) {
  81406. return 'copyFlash';
  81407. }
  81408. },
  81409. csv: function ( dt, conf ) {
  81410. // Common option that will use the HTML5 or Flash export buttons
  81411. if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) {
  81412. return 'csvHtml5';
  81413. }
  81414. if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) {
  81415. return 'csvFlash';
  81416. }
  81417. },
  81418. excel: function ( dt, conf ) {
  81419. // Common option that will use the HTML5 or Flash export buttons
  81420. if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) {
  81421. return 'excelHtml5';
  81422. }
  81423. if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) {
  81424. return 'excelFlash';
  81425. }
  81426. },
  81427. pdf: function ( dt, conf ) {
  81428. // Common option that will use the HTML5 or Flash export buttons
  81429. if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) {
  81430. return 'pdfHtml5';
  81431. }
  81432. if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) {
  81433. return 'pdfFlash';
  81434. }
  81435. },
  81436. pageLength: function ( dt ) {
  81437. var lengthMenu = dt.settings()[0].aLengthMenu;
  81438. var vals = $.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu;
  81439. var lang = $.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu;
  81440. var text = function ( dt ) {
  81441. return dt.i18n( 'buttons.pageLength', {
  81442. "-1": 'Show all rows',
  81443. _: 'Show %d rows'
  81444. }, dt.page.len() );
  81445. };
  81446. return {
  81447. extend: 'collection',
  81448. text: text,
  81449. className: 'buttons-page-length',
  81450. autoClose: true,
  81451. buttons: $.map( vals, function ( val, i ) {
  81452. return {
  81453. text: lang[i],
  81454. className: 'button-page-length',
  81455. action: function ( e, dt ) {
  81456. dt.page.len( val ).draw();
  81457. },
  81458. init: function ( dt, node, conf ) {
  81459. var that = this;
  81460. var fn = function () {
  81461. that.active( dt.page.len() === val );
  81462. };
  81463. dt.on( 'length.dt'+conf.namespace, fn );
  81464. fn();
  81465. },
  81466. destroy: function ( dt, node, conf ) {
  81467. dt.off( 'length.dt'+conf.namespace );
  81468. }
  81469. };
  81470. } ),
  81471. init: function ( dt, node, conf ) {
  81472. var that = this;
  81473. dt.on( 'length.dt'+conf.namespace, function () {
  81474. that.text( text( dt ) );
  81475. } );
  81476. },
  81477. destroy: function ( dt, node, conf ) {
  81478. dt.off( 'length.dt'+conf.namespace );
  81479. }
  81480. };
  81481. }
  81482. } );
  81483. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  81484. * DataTables API
  81485. *
  81486. * For complete documentation, please refer to the docs/api directory or the
  81487. * DataTables site
  81488. */
  81489. // Buttons group and individual button selector
  81490. DataTable.Api.register( 'buttons()', function ( group, selector ) {
  81491. // Argument shifting
  81492. if ( selector === undefined ) {
  81493. selector = group;
  81494. group = undefined;
  81495. }
  81496. this.selector.buttonGroup = group;
  81497. var res = this.iterator( true, 'table', function ( ctx ) {
  81498. if ( ctx._buttons ) {
  81499. return Buttons.buttonSelector(
  81500. Buttons.instanceSelector( group, ctx._buttons ),
  81501. selector
  81502. );
  81503. }
  81504. }, true );
  81505. res._groupSelector = group;
  81506. return res;
  81507. } );
  81508. // Individual button selector
  81509. DataTable.Api.register( 'button()', function ( group, selector ) {
  81510. // just run buttons() and truncate
  81511. var buttons = this.buttons( group, selector );
  81512. if ( buttons.length > 1 ) {
  81513. buttons.splice( 1, buttons.length );
  81514. }
  81515. return buttons;
  81516. } );
  81517. // Active buttons
  81518. DataTable.Api.registerPlural( 'buttons().active()', 'button().active()', function ( flag ) {
  81519. if ( flag === undefined ) {
  81520. return this.map( function ( set ) {
  81521. return set.inst.active( set.node );
  81522. } );
  81523. }
  81524. return this.each( function ( set ) {
  81525. set.inst.active( set.node, flag );
  81526. } );
  81527. } );
  81528. // Get / set button action
  81529. DataTable.Api.registerPlural( 'buttons().action()', 'button().action()', function ( action ) {
  81530. if ( action === undefined ) {
  81531. return this.map( function ( set ) {
  81532. return set.inst.action( set.node );
  81533. } );
  81534. }
  81535. return this.each( function ( set ) {
  81536. set.inst.action( set.node, action );
  81537. } );
  81538. } );
  81539. // Enable / disable buttons
  81540. DataTable.Api.register( ['buttons().enable()', 'button().enable()'], function ( flag ) {
  81541. return this.each( function ( set ) {
  81542. set.inst.enable( set.node, flag );
  81543. } );
  81544. } );
  81545. // Disable buttons
  81546. DataTable.Api.register( ['buttons().disable()', 'button().disable()'], function () {
  81547. return this.each( function ( set ) {
  81548. set.inst.disable( set.node );
  81549. } );
  81550. } );
  81551. // Get button nodes
  81552. DataTable.Api.registerPlural( 'buttons().nodes()', 'button().node()', function () {
  81553. var jq = $();
  81554. // jQuery will automatically reduce duplicates to a single entry
  81555. $( this.each( function ( set ) {
  81556. jq = jq.add( set.inst.node( set.node ) );
  81557. } ) );
  81558. return jq;
  81559. } );
  81560. // Get / set button processing state
  81561. DataTable.Api.registerPlural( 'buttons().processing()', 'button().processing()', function ( flag ) {
  81562. if ( flag === undefined ) {
  81563. return this.map( function ( set ) {
  81564. return set.inst.processing( set.node );
  81565. } );
  81566. }
  81567. return this.each( function ( set ) {
  81568. set.inst.processing( set.node, flag );
  81569. } );
  81570. } );
  81571. // Get / set button text (i.e. the button labels)
  81572. DataTable.Api.registerPlural( 'buttons().text()', 'button().text()', function ( label ) {
  81573. if ( label === undefined ) {
  81574. return this.map( function ( set ) {
  81575. return set.inst.text( set.node );
  81576. } );
  81577. }
  81578. return this.each( function ( set ) {
  81579. set.inst.text( set.node, label );
  81580. } );
  81581. } );
  81582. // Trigger a button's action
  81583. DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', function () {
  81584. return this.each( function ( set ) {
  81585. set.inst.node( set.node ).trigger( 'click' );
  81586. } );
  81587. } );
  81588. // Get the container elements
  81589. DataTable.Api.registerPlural( 'buttons().containers()', 'buttons().container()', function () {
  81590. var jq = $();
  81591. var groupSelector = this._groupSelector;
  81592. // We need to use the group selector directly, since if there are no buttons
  81593. // the result set will be empty
  81594. this.iterator( true, 'table', function ( ctx ) {
  81595. if ( ctx._buttons ) {
  81596. var insts = Buttons.instanceSelector( groupSelector, ctx._buttons );
  81597. for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
  81598. jq = jq.add( insts[i].container() );
  81599. }
  81600. }
  81601. } );
  81602. return jq;
  81603. } );
  81604. // Add a new button
  81605. DataTable.Api.register( 'button().add()', function ( idx, conf ) {
  81606. var ctx = this.context;
  81607. // Don't use `this` as it could be empty - select the instances directly
  81608. if ( ctx.length ) {
  81609. var inst = Buttons.instanceSelector( this._groupSelector, ctx[0]._buttons );
  81610. if ( inst.length ) {
  81611. inst[0].add( conf, idx );
  81612. }
  81613. }
  81614. return this.button( this._groupSelector, idx );
  81615. } );
  81616. // Destroy the button sets selected
  81617. DataTable.Api.register( 'buttons().destroy()', function () {
  81618. this.pluck( 'inst' ).unique().each( function ( inst ) {
  81619. inst.destroy();
  81620. } );
  81621. return this;
  81622. } );
  81623. // Remove a button
  81624. DataTable.Api.registerPlural( 'buttons().remove()', 'buttons().remove()', function () {
  81625. this.each( function ( set ) {
  81626. set.inst.remove( set.node );
  81627. } );
  81628. return this;
  81629. } );
  81630. // Information box that can be used by buttons
  81631. var _infoTimer;
  81632. DataTable.Api.register( 'buttons.info()', function ( title, message, time ) {
  81633. var that = this;
  81634. if ( title === false ) {
  81635. $('#datatables_buttons_info').fadeOut( function () {
  81636. $(this).remove();
  81637. } );
  81638. clearTimeout( _infoTimer );
  81639. _infoTimer = null;
  81640. return this;
  81641. }
  81642. if ( _infoTimer ) {
  81643. clearTimeout( _infoTimer );
  81644. }
  81645. if ( $('#datatables_buttons_info').length ) {
  81646. $('#datatables_buttons_info').remove();
  81647. }
  81648. title = title ? '<h2>'+title+'</h2>' : '';
  81649. $('<div id="datatables_buttons_info" class="dt-button-info"/>')
  81650. .html( title )
  81651. .append( $('<div/>')[ typeof message === 'string' ? 'html' : 'append' ]( message ) )
  81652. .css( 'display', 'none' )
  81653. .appendTo( 'body' )
  81654. .fadeIn();
  81655. if ( time !== undefined && time !== 0 ) {
  81656. _infoTimer = setTimeout( function () {
  81657. that.buttons.info( false );
  81658. }, time );
  81659. }
  81660. return this;
  81661. } );
  81662. // Get data from the table for export - this is common to a number of plug-in
  81663. // buttons so it is included in the Buttons core library
  81664. DataTable.Api.register( 'buttons.exportData()', function ( options ) {
  81665. if ( this.context.length ) {
  81666. return _exportData( new DataTable.Api( this.context[0] ), options );
  81667. }
  81668. } );
  81669. // Get information about the export that is common to many of the export data
  81670. // types (DRY)
  81671. DataTable.Api.register( 'buttons.exportInfo()', function ( conf ) {
  81672. if ( ! conf ) {
  81673. conf = {};
  81674. }
  81675. return {
  81676. filename: _filename( conf ),
  81677. title: _title( conf ),
  81678. messageTop: _message(this, conf.message || conf.messageTop, 'top'),
  81679. messageBottom: _message(this, conf.messageBottom, 'bottom')
  81680. };
  81681. } );
  81682. /**
  81683. * Get the file name for an exported file.
  81684. *
  81685. * @param {object} config Button configuration
  81686. * @param {boolean} incExtension Include the file name extension
  81687. */
  81688. var _filename = function ( config )
  81689. {
  81690. // Backwards compatibility
  81691. var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined && config.title !== null && config.title !== '' ?
  81692. config.title :
  81693. config.filename;
  81694. if ( typeof filename === 'function' ) {
  81695. filename = filename();
  81696. }
  81697. if ( filename === undefined || filename === null ) {
  81698. return null;
  81699. }
  81700. if ( filename.indexOf( '*' ) !== -1 ) {
  81701. filename = $.trim( filename.replace( '*', $('head > title').text() ) );
  81702. }
  81703. // Strip characters which the OS will object to
  81704. filename = filename.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
  81705. var extension = _stringOrFunction( config.extension );
  81706. if ( ! extension ) {
  81707. extension = '';
  81708. }
  81709. return filename + extension;
  81710. };
  81711. /**
  81712. * Simply utility method to allow parameters to be given as a function
  81713. *
  81714. * @param {undefined|string|function} option Option
  81715. * @return {null|string} Resolved value
  81716. */
  81717. var _stringOrFunction = function ( option )
  81718. {
  81719. if ( option === null || option === undefined ) {
  81720. return null;
  81721. }
  81722. else if ( typeof option === 'function' ) {
  81723. return option();
  81724. }
  81725. return option;
  81726. };
  81727. /**
  81728. * Get the title for an exported file.
  81729. *
  81730. * @param {object} config Button configuration
  81731. */
  81732. var _title = function ( config )
  81733. {
  81734. var title = _stringOrFunction( config.title );
  81735. return title === null ?
  81736. null : title.indexOf( '*' ) !== -1 ?
  81737. title.replace( '*', $('head > title').text() || 'Exported data' ) :
  81738. title;
  81739. };
  81740. var _message = function ( dt, option, position )
  81741. {
  81742. var message = _stringOrFunction( option );
  81743. if ( message === null ) {
  81744. return null;
  81745. }
  81746. var caption = $('caption', dt.table().container()).eq(0);
  81747. if ( message === '*' ) {
  81748. var side = caption.css( 'caption-side' );
  81749. if ( side !== position ) {
  81750. return null;
  81751. }
  81752. return caption.length ?
  81753. caption.text() :
  81754. '';
  81755. }
  81756. return message;
  81757. };
  81758. var _exportTextarea = $('<textarea/>')[0];
  81759. var _exportData = function ( dt, inOpts )
  81760. {
  81761. var config = $.extend( true, {}, {
  81762. rows: null,
  81763. columns: '',
  81764. modifier: {
  81765. search: 'applied',
  81766. order: 'applied'
  81767. },
  81768. orthogonal: 'display',
  81769. stripHtml: true,
  81770. stripNewlines: true,
  81771. decodeEntities: true,
  81772. trim: true,
  81773. format: {
  81774. header: function ( d ) {
  81775. return strip( d );
  81776. },
  81777. footer: function ( d ) {
  81778. return strip( d );
  81779. },
  81780. body: function ( d ) {
  81781. return strip( d );
  81782. }
  81783. }
  81784. }, inOpts );
  81785. var strip = function ( str ) {
  81786. if ( typeof str !== 'string' ) {
  81787. return str;
  81788. }
  81789. // Always remove script tags
  81790. str = str.replace( /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '' );
  81791. if ( config.stripHtml ) {
  81792. str = str.replace( /<[^>]*>/g, '' );
  81793. }
  81794. if ( config.trim ) {
  81795. str = str.replace( /^\s+|\s+$/g, '' );
  81796. }
  81797. if ( config.stripNewlines ) {
  81798. str = str.replace( /\n/g, ' ' );
  81799. }
  81800. if ( config.decodeEntities ) {
  81801. _exportTextarea.innerHTML = str;
  81802. str = _exportTextarea.value;
  81803. }
  81804. return str;
  81805. };
  81806. var header = dt.columns( config.columns ).indexes().map( function (idx) {
  81807. var el = dt.column( idx ).header();
  81808. return config.format.header( el.innerHTML, idx, el );
  81809. } ).toArray();
  81810. var footer = dt.table().footer() ?
  81811. dt.columns( config.columns ).indexes().map( function (idx) {
  81812. var el = dt.column( idx ).footer();
  81813. return config.format.footer( el ? el.innerHTML : '', idx, el );
  81814. } ).toArray() :
  81815. null;
  81816. // If Select is available on this table, and any rows are selected, limit the export
  81817. // to the selected rows. If no rows are selected, all rows will be exported. Specify
  81818. // a `selected` modifier to control directly.
  81819. var modifier = $.extend( {}, config.modifier );
  81820. if ( dt.select && typeof dt.select.info === 'function' && modifier.selected === undefined ) {
  81821. if ( dt.rows( config.rows, $.extend( { selected: true }, modifier ) ).any() ) {
  81822. $.extend( modifier, { selected: true } )
  81823. }
  81824. }
  81825. var rowIndexes = dt.rows( config.rows, modifier ).indexes().toArray();
  81826. var selectedCells = dt.cells( rowIndexes, config.columns );
  81827. var cells = selectedCells
  81828. .render( config.orthogonal )
  81829. .toArray();
  81830. var cellNodes = selectedCells
  81831. .nodes()
  81832. .toArray();
  81833. var columns = header.length;
  81834. var rows = columns > 0 ? cells.length / columns : 0;
  81835. var body = [ rows ];
  81836. var cellCounter = 0;
  81837. for ( var i=0, ien=rows ; i<ien ; i++ ) {
  81838. var row = [ columns ];
  81839. for ( var j=0 ; j<columns ; j++ ) {
  81840. row[j] = config.format.body( cells[ cellCounter ], i, j, cellNodes[ cellCounter ] );
  81841. cellCounter++;
  81842. }
  81843. body[i] = row;
  81844. }
  81845. return {
  81846. header: header,
  81847. footer: footer,
  81848. body: body
  81849. };
  81850. };
  81851. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  81852. * DataTables interface
  81853. */
  81854. // Attach to DataTables objects for global access
  81855. $.fn.dataTable.Buttons = Buttons;
  81856. $.fn.DataTable.Buttons = Buttons;
  81857. // DataTables creation - check if the buttons have been defined for this table,
  81858. // they will have been if the `B` option was used in `dom`, otherwise we should
  81859. // create the buttons instance here so they can be inserted into the document
  81860. // using the API. Listen for `init` for compatibility with pre 1.10.10, but to
  81861. // be removed in future.
  81862. $(document).on( 'init.dt plugin-init.dt', function (e, settings) {
  81863. if ( e.namespace !== 'dt' ) {
  81864. return;
  81865. }
  81866. var opts = settings.oInit.buttons || DataTable.defaults.buttons;
  81867. if ( opts && ! settings._buttons ) {
  81868. new Buttons( settings, opts ).container();
  81869. }
  81870. } );
  81871. // DataTables `dom` feature option
  81872. DataTable.ext.feature.push( {
  81873. fnInit: function( settings ) {
  81874. var api = new DataTable.Api( settings );
  81875. var opts = api.init().buttons || DataTable.defaults.buttons;
  81876. return new Buttons( api, opts ).container();
  81877. },
  81878. cFeature: "B"
  81879. } );
  81880. return Buttons;
  81881. }));
  81882. /*! Bootstrap integration for DataTables' Buttons
  81883. * ©2016 SpryMedia Ltd - datatables.net/license
  81884. */
  81885. (function( factory ){
  81886. if ( typeof define === 'function' && define.amd ) {
  81887. // AMD
  81888. define( ['jquery', 'datatables.net-bs4', 'datatables.net-buttons'], function ( $ ) {
  81889. return factory( $, window, document );
  81890. } );
  81891. }
  81892. else if ( typeof exports === 'object' ) {
  81893. // CommonJS
  81894. module.exports = function (root, $) {
  81895. if ( ! root ) {
  81896. root = window;
  81897. }
  81898. if ( ! $ || ! $.fn.dataTable ) {
  81899. $ = require('datatables.net-bs4')(root, $).$;
  81900. }
  81901. if ( ! $.fn.dataTable.Buttons ) {
  81902. require('datatables.net-buttons')(root, $);
  81903. }
  81904. return factory( $, root, root.document );
  81905. };
  81906. }
  81907. else {
  81908. // Browser
  81909. factory( jQuery, window, document );
  81910. }
  81911. }(function( $, window, document, undefined ) {
  81912. 'use strict';
  81913. var DataTable = $.fn.dataTable;
  81914. $.extend( true, DataTable.Buttons.defaults, {
  81915. dom: {
  81916. container: {
  81917. className: 'dt-buttons btn-group'
  81918. },
  81919. button: {
  81920. className: 'btn btn-secondary'
  81921. },
  81922. collection: {
  81923. tag: 'div',
  81924. className: 'dt-button-collection dropdown-menu',
  81925. button: {
  81926. tag: 'a',
  81927. className: 'dt-button dropdown-item',
  81928. active: 'active',
  81929. disabled: 'disabled'
  81930. }
  81931. }
  81932. }
  81933. } );
  81934. DataTable.ext.buttons.collection.className += ' dropdown-toggle';
  81935. return DataTable.Buttons;
  81936. }));
  81937. /*!
  81938. * Column visibility buttons for Buttons and DataTables.
  81939. * 2016 SpryMedia Ltd - datatables.net/license
  81940. */
  81941. (function( factory ){
  81942. if ( typeof define === 'function' && define.amd ) {
  81943. // AMD
  81944. define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
  81945. return factory( $, window, document );
  81946. } );
  81947. }
  81948. else if ( typeof exports === 'object' ) {
  81949. // CommonJS
  81950. module.exports = function (root, $) {
  81951. if ( ! root ) {
  81952. root = window;
  81953. }
  81954. if ( ! $ || ! $.fn.dataTable ) {
  81955. $ = require('datatables.net')(root, $).$;
  81956. }
  81957. if ( ! $.fn.dataTable.Buttons ) {
  81958. require('datatables.net-buttons')(root, $);
  81959. }
  81960. return factory( $, root, root.document );
  81961. };
  81962. }
  81963. else {
  81964. // Browser
  81965. factory( jQuery, window, document );
  81966. }
  81967. }(function( $, window, document, undefined ) {
  81968. 'use strict';
  81969. var DataTable = $.fn.dataTable;
  81970. $.extend( DataTable.ext.buttons, {
  81971. // A collection of column visibility buttons
  81972. colvis: function ( dt, conf ) {
  81973. return {
  81974. extend: 'collection',
  81975. text: function ( dt ) {
  81976. return dt.i18n( 'buttons.colvis', 'Column visibility' );
  81977. },
  81978. className: 'buttons-colvis',
  81979. buttons: [ {
  81980. extend: 'columnsToggle',
  81981. columns: conf.columns,
  81982. columnText: conf.columnText
  81983. } ]
  81984. };
  81985. },
  81986. // Selected columns with individual buttons - toggle column visibility
  81987. columnsToggle: function ( dt, conf ) {
  81988. var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
  81989. return {
  81990. extend: 'columnToggle',
  81991. columns: idx,
  81992. columnText: conf.columnText
  81993. };
  81994. } ).toArray();
  81995. return columns;
  81996. },
  81997. // Single button to toggle column visibility
  81998. columnToggle: function ( dt, conf ) {
  81999. return {
  82000. extend: 'columnVisibility',
  82001. columns: conf.columns,
  82002. columnText: conf.columnText
  82003. };
  82004. },
  82005. // Selected columns with individual buttons - set column visibility
  82006. columnsVisibility: function ( dt, conf ) {
  82007. var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
  82008. return {
  82009. extend: 'columnVisibility',
  82010. columns: idx,
  82011. visibility: conf.visibility,
  82012. columnText: conf.columnText
  82013. };
  82014. } ).toArray();
  82015. return columns;
  82016. },
  82017. // Single button to set column visibility
  82018. columnVisibility: {
  82019. columns: undefined, // column selector
  82020. text: function ( dt, button, conf ) {
  82021. return conf._columnText( dt, conf );
  82022. },
  82023. className: 'buttons-columnVisibility',
  82024. action: function ( e, dt, button, conf ) {
  82025. var col = dt.columns( conf.columns );
  82026. var curr = col.visible();
  82027. col.visible( conf.visibility !== undefined ?
  82028. conf.visibility :
  82029. ! (curr.length ? curr[0] : false )
  82030. );
  82031. },
  82032. init: function ( dt, button, conf ) {
  82033. var that = this;
  82034. dt
  82035. .on( 'column-visibility.dt'+conf.namespace, function (e, settings) {
  82036. if ( ! settings.bDestroying && settings.nTable == dt.settings()[0].nTable ) {
  82037. that.active( dt.column( conf.columns ).visible() );
  82038. }
  82039. } )
  82040. .on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) {
  82041. // Don't rename buttons based on column name if the button
  82042. // controls more than one column!
  82043. if ( dt.columns( conf.columns ).count() !== 1 ) {
  82044. return;
  82045. }
  82046. if ( typeof conf.columns === 'number' ) {
  82047. conf.columns = details.mapping[ conf.columns ];
  82048. }
  82049. var col = dt.column( conf.columns );
  82050. that.text( conf._columnText( dt, conf ) );
  82051. that.active( col.visible() );
  82052. } );
  82053. this.active( dt.column( conf.columns ).visible() );
  82054. },
  82055. destroy: function ( dt, button, conf ) {
  82056. dt
  82057. .off( 'column-visibility.dt'+conf.namespace )
  82058. .off( 'column-reorder.dt'+conf.namespace );
  82059. },
  82060. _columnText: function ( dt, conf ) {
  82061. // Use DataTables' internal data structure until this is presented
  82062. // is a public API. The other option is to use
  82063. // `$( column(col).node() ).text()` but the node might not have been
  82064. // populated when Buttons is constructed.
  82065. var idx = dt.column( conf.columns ).index();
  82066. var title = dt.settings()[0].aoColumns[ idx ].sTitle
  82067. .replace(/\n/g," ") // remove new lines
  82068. .replace(/<br\s*\/?>/gi, " ") // replace line breaks with spaces
  82069. .replace(/<select(.*?)<\/select>/g, "") // remove select tags, including options text
  82070. .replace(/<.*?>/g, "") // strip HTML
  82071. .replace(/^\s+|\s+$/g,""); // trim
  82072. return conf.columnText ?
  82073. conf.columnText( dt, idx, title ) :
  82074. title;
  82075. }
  82076. },
  82077. colvisRestore: {
  82078. className: 'buttons-colvisRestore',
  82079. text: function ( dt ) {
  82080. return dt.i18n( 'buttons.colvisRestore', 'Restore visibility' );
  82081. },
  82082. init: function ( dt, button, conf ) {
  82083. conf._visOriginal = dt.columns().indexes().map( function ( idx ) {
  82084. return dt.column( idx ).visible();
  82085. } ).toArray();
  82086. },
  82087. action: function ( e, dt, button, conf ) {
  82088. dt.columns().every( function ( i ) {
  82089. // Take into account that ColReorder might have disrupted our
  82090. // indexes
  82091. var idx = dt.colReorder && dt.colReorder.transpose ?
  82092. dt.colReorder.transpose( i, 'toOriginal' ) :
  82093. i;
  82094. this.visible( conf._visOriginal[ idx ] );
  82095. } );
  82096. }
  82097. },
  82098. colvisGroup: {
  82099. className: 'buttons-colvisGroup',
  82100. action: function ( e, dt, button, conf ) {
  82101. dt.columns( conf.show ).visible( true, false );
  82102. dt.columns( conf.hide ).visible( false, false );
  82103. dt.columns.adjust();
  82104. },
  82105. show: [],
  82106. hide: []
  82107. }
  82108. } );
  82109. return DataTable.Buttons;
  82110. }));
  82111. /*!
  82112. * Flash export buttons for Buttons and DataTables.
  82113. * 2015-2017 SpryMedia Ltd - datatables.net/license
  82114. *
  82115. * ZeroClipbaord - MIT license
  82116. * Copyright (c) 2012 Joseph Huckaby
  82117. */
  82118. (function( factory ){
  82119. if ( typeof define === 'function' && define.amd ) {
  82120. // AMD
  82121. define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
  82122. return factory( $, window, document );
  82123. } );
  82124. }
  82125. else if ( typeof exports === 'object' ) {
  82126. // CommonJS
  82127. module.exports = function (root, $) {
  82128. if ( ! root ) {
  82129. root = window;
  82130. }
  82131. if ( ! $ || ! $.fn.dataTable ) {
  82132. $ = require('datatables.net')(root, $).$;
  82133. }
  82134. if ( ! $.fn.dataTable.Buttons ) {
  82135. require('datatables.net-buttons')(root, $);
  82136. }
  82137. return factory( $, root, root.document );
  82138. };
  82139. }
  82140. else {
  82141. // Browser
  82142. factory( jQuery, window, document );
  82143. }
  82144. }(function( $, window, document, undefined ) {
  82145. 'use strict';
  82146. var DataTable = $.fn.dataTable;
  82147. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  82148. * ZeroClipboard dependency
  82149. */
  82150. /*
  82151. * ZeroClipboard 1.0.4 with modifications
  82152. * Author: Joseph Huckaby
  82153. * License: MIT
  82154. *
  82155. * Copyright (c) 2012 Joseph Huckaby
  82156. */
  82157. var ZeroClipboard_TableTools = {
  82158. version: "1.0.4-TableTools2",
  82159. clients: {}, // registered upload clients on page, indexed by id
  82160. moviePath: '', // URL to movie
  82161. nextId: 1, // ID of next movie
  82162. $: function(thingy) {
  82163. // simple DOM lookup utility function
  82164. if (typeof(thingy) == 'string') {
  82165. thingy = document.getElementById(thingy);
  82166. }
  82167. if (!thingy.addClass) {
  82168. // extend element with a few useful methods
  82169. thingy.hide = function() { this.style.display = 'none'; };
  82170. thingy.show = function() { this.style.display = ''; };
  82171. thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
  82172. thingy.removeClass = function(name) {
  82173. this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
  82174. };
  82175. thingy.hasClass = function(name) {
  82176. return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
  82177. };
  82178. }
  82179. return thingy;
  82180. },
  82181. setMoviePath: function(path) {
  82182. // set path to ZeroClipboard.swf
  82183. this.moviePath = path;
  82184. },
  82185. dispatch: function(id, eventName, args) {
  82186. // receive event from flash movie, send to client
  82187. var client = this.clients[id];
  82188. if (client) {
  82189. client.receiveEvent(eventName, args);
  82190. }
  82191. },
  82192. log: function ( str ) {
  82193. console.log( 'Flash: '+str );
  82194. },
  82195. register: function(id, client) {
  82196. // register new client to receive events
  82197. this.clients[id] = client;
  82198. },
  82199. getDOMObjectPosition: function(obj) {
  82200. // get absolute coordinates for dom element
  82201. var info = {
  82202. left: 0,
  82203. top: 0,
  82204. width: obj.width ? obj.width : obj.offsetWidth,
  82205. height: obj.height ? obj.height : obj.offsetHeight
  82206. };
  82207. if ( obj.style.width !== "" ) {
  82208. info.width = obj.style.width.replace("px","");
  82209. }
  82210. if ( obj.style.height !== "" ) {
  82211. info.height = obj.style.height.replace("px","");
  82212. }
  82213. while (obj) {
  82214. info.left += obj.offsetLeft;
  82215. info.top += obj.offsetTop;
  82216. obj = obj.offsetParent;
  82217. }
  82218. return info;
  82219. },
  82220. Client: function(elem) {
  82221. // constructor for new simple upload client
  82222. this.handlers = {};
  82223. // unique ID
  82224. this.id = ZeroClipboard_TableTools.nextId++;
  82225. this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id;
  82226. // register client with singleton to receive flash events
  82227. ZeroClipboard_TableTools.register(this.id, this);
  82228. // create movie
  82229. if (elem) {
  82230. this.glue(elem);
  82231. }
  82232. }
  82233. };
  82234. ZeroClipboard_TableTools.Client.prototype = {
  82235. id: 0, // unique ID for us
  82236. ready: false, // whether movie is ready to receive events or not
  82237. movie: null, // reference to movie object
  82238. clipText: '', // text to copy to clipboard
  82239. fileName: '', // default file save name
  82240. action: 'copy', // action to perform
  82241. handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
  82242. cssEffects: true, // enable CSS mouse effects on dom container
  82243. handlers: null, // user event handlers
  82244. sized: false,
  82245. sheetName: '', // default sheet name for excel export
  82246. glue: function(elem, title) {
  82247. // glue to DOM element
  82248. // elem can be ID or actual DOM element object
  82249. this.domElement = ZeroClipboard_TableTools.$(elem);
  82250. // float just above object, or zIndex 99 if dom element isn't set
  82251. var zIndex = 99;
  82252. if (this.domElement.style.zIndex) {
  82253. zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
  82254. }
  82255. // find X/Y position of domElement
  82256. var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
  82257. // create floating DIV above element
  82258. this.div = document.createElement('div');
  82259. var style = this.div.style;
  82260. style.position = 'absolute';
  82261. style.left = '0px';
  82262. style.top = '0px';
  82263. style.width = (box.width) + 'px';
  82264. style.height = box.height + 'px';
  82265. style.zIndex = zIndex;
  82266. if ( typeof title != "undefined" && title !== "" ) {
  82267. this.div.title = title;
  82268. }
  82269. if ( box.width !== 0 && box.height !== 0 ) {
  82270. this.sized = true;
  82271. }
  82272. // style.backgroundColor = '#f00'; // debug
  82273. if ( this.domElement ) {
  82274. this.domElement.appendChild(this.div);
  82275. this.div.innerHTML = this.getHTML( box.width, box.height ).replace(/&/g, '&amp;');
  82276. }
  82277. },
  82278. positionElement: function() {
  82279. var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
  82280. var style = this.div.style;
  82281. style.position = 'absolute';
  82282. //style.left = (this.domElement.offsetLeft)+'px';
  82283. //style.top = this.domElement.offsetTop+'px';
  82284. style.width = box.width + 'px';
  82285. style.height = box.height + 'px';
  82286. if ( box.width !== 0 && box.height !== 0 ) {
  82287. this.sized = true;
  82288. } else {
  82289. return;
  82290. }
  82291. var flash = this.div.childNodes[0];
  82292. flash.width = box.width;
  82293. flash.height = box.height;
  82294. },
  82295. getHTML: function(width, height) {
  82296. // return HTML for movie
  82297. var html = '';
  82298. var flashvars = 'id=' + this.id +
  82299. '&width=' + width +
  82300. '&height=' + height;
  82301. if (navigator.userAgent.match(/MSIE/)) {
  82302. // IE gets an OBJECT tag
  82303. var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
  82304. html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard_TableTools.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
  82305. }
  82306. else {
  82307. // all other browsers get an EMBED tag
  82308. html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard_TableTools.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
  82309. }
  82310. return html;
  82311. },
  82312. hide: function() {
  82313. // temporarily hide floater offscreen
  82314. if (this.div) {
  82315. this.div.style.left = '-2000px';
  82316. }
  82317. },
  82318. show: function() {
  82319. // show ourselves after a call to hide()
  82320. this.reposition();
  82321. },
  82322. destroy: function() {
  82323. // destroy control and floater
  82324. var that = this;
  82325. if (this.domElement && this.div) {
  82326. $(this.div).remove();
  82327. this.domElement = null;
  82328. this.div = null;
  82329. $.each( ZeroClipboard_TableTools.clients, function ( id, client ) {
  82330. if ( client === that ) {
  82331. delete ZeroClipboard_TableTools.clients[ id ];
  82332. }
  82333. } );
  82334. }
  82335. },
  82336. reposition: function(elem) {
  82337. // reposition our floating div, optionally to new container
  82338. // warning: container CANNOT change size, only position
  82339. if (elem) {
  82340. this.domElement = ZeroClipboard_TableTools.$(elem);
  82341. if (!this.domElement) {
  82342. this.hide();
  82343. }
  82344. }
  82345. if (this.domElement && this.div) {
  82346. var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
  82347. var style = this.div.style;
  82348. style.left = '' + box.left + 'px';
  82349. style.top = '' + box.top + 'px';
  82350. }
  82351. },
  82352. clearText: function() {
  82353. // clear the text to be copy / saved
  82354. this.clipText = '';
  82355. if (this.ready) {
  82356. this.movie.clearText();
  82357. }
  82358. },
  82359. appendText: function(newText) {
  82360. // append text to that which is to be copied / saved
  82361. this.clipText += newText;
  82362. if (this.ready) { this.movie.appendText(newText) ;}
  82363. },
  82364. setText: function(newText) {
  82365. // set text to be copied to be copied / saved
  82366. this.clipText = newText;
  82367. if (this.ready) { this.movie.setText(newText) ;}
  82368. },
  82369. setFileName: function(newText) {
  82370. // set the file name
  82371. this.fileName = newText;
  82372. if (this.ready) {
  82373. this.movie.setFileName(newText);
  82374. }
  82375. },
  82376. setSheetData: function(data) {
  82377. // set the xlsx sheet data
  82378. if (this.ready) {
  82379. this.movie.setSheetData( JSON.stringify( data ) );
  82380. }
  82381. },
  82382. setAction: function(newText) {
  82383. // set action (save or copy)
  82384. this.action = newText;
  82385. if (this.ready) {
  82386. this.movie.setAction(newText);
  82387. }
  82388. },
  82389. addEventListener: function(eventName, func) {
  82390. // add user event listener for event
  82391. // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
  82392. eventName = eventName.toString().toLowerCase().replace(/^on/, '');
  82393. if (!this.handlers[eventName]) {
  82394. this.handlers[eventName] = [];
  82395. }
  82396. this.handlers[eventName].push(func);
  82397. },
  82398. setHandCursor: function(enabled) {
  82399. // enable hand cursor (true), or default arrow cursor (false)
  82400. this.handCursorEnabled = enabled;
  82401. if (this.ready) {
  82402. this.movie.setHandCursor(enabled);
  82403. }
  82404. },
  82405. setCSSEffects: function(enabled) {
  82406. // enable or disable CSS effects on DOM container
  82407. this.cssEffects = !!enabled;
  82408. },
  82409. receiveEvent: function(eventName, args) {
  82410. var self;
  82411. // receive event from flash
  82412. eventName = eventName.toString().toLowerCase().replace(/^on/, '');
  82413. // special behavior for certain events
  82414. switch (eventName) {
  82415. case 'load':
  82416. // movie claims it is ready, but in IE this isn't always the case...
  82417. // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
  82418. this.movie = document.getElementById(this.movieId);
  82419. if (!this.movie) {
  82420. self = this;
  82421. setTimeout( function() { self.receiveEvent('load', null); }, 1 );
  82422. return;
  82423. }
  82424. // firefox on pc needs a "kick" in order to set these in certain cases
  82425. if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
  82426. self = this;
  82427. setTimeout( function() { self.receiveEvent('load', null); }, 100 );
  82428. this.ready = true;
  82429. return;
  82430. }
  82431. this.ready = true;
  82432. this.movie.clearText();
  82433. this.movie.appendText( this.clipText );
  82434. this.movie.setFileName( this.fileName );
  82435. this.movie.setAction( this.action );
  82436. this.movie.setHandCursor( this.handCursorEnabled );
  82437. break;
  82438. case 'mouseover':
  82439. if (this.domElement && this.cssEffects) {
  82440. //this.domElement.addClass('hover');
  82441. if (this.recoverActive) {
  82442. this.domElement.addClass('active');
  82443. }
  82444. }
  82445. break;
  82446. case 'mouseout':
  82447. if (this.domElement && this.cssEffects) {
  82448. this.recoverActive = false;
  82449. if (this.domElement.hasClass('active')) {
  82450. this.domElement.removeClass('active');
  82451. this.recoverActive = true;
  82452. }
  82453. //this.domElement.removeClass('hover');
  82454. }
  82455. break;
  82456. case 'mousedown':
  82457. if (this.domElement && this.cssEffects) {
  82458. this.domElement.addClass('active');
  82459. }
  82460. break;
  82461. case 'mouseup':
  82462. if (this.domElement && this.cssEffects) {
  82463. this.domElement.removeClass('active');
  82464. this.recoverActive = false;
  82465. }
  82466. break;
  82467. } // switch eventName
  82468. if (this.handlers[eventName]) {
  82469. for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
  82470. var func = this.handlers[eventName][idx];
  82471. if (typeof(func) == 'function') {
  82472. // actual function reference
  82473. func(this, args);
  82474. }
  82475. else if ((typeof(func) == 'object') && (func.length == 2)) {
  82476. // PHP style object + method, i.e. [myObject, 'myMethod']
  82477. func[0][ func[1] ](this, args);
  82478. }
  82479. else if (typeof(func) == 'string') {
  82480. // name of function
  82481. window[func](this, args);
  82482. }
  82483. } // foreach event handler defined
  82484. } // user defined handler for event
  82485. }
  82486. };
  82487. ZeroClipboard_TableTools.hasFlash = function ()
  82488. {
  82489. try {
  82490. var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  82491. if (fo) {
  82492. return true;
  82493. }
  82494. }
  82495. catch (e) {
  82496. if (
  82497. navigator.mimeTypes &&
  82498. navigator.mimeTypes['application/x-shockwave-flash'] !== undefined &&
  82499. navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin
  82500. ) {
  82501. return true;
  82502. }
  82503. }
  82504. return false;
  82505. };
  82506. // For the Flash binding to work, ZeroClipboard_TableTools must be on the global
  82507. // object list
  82508. window.ZeroClipboard_TableTools = ZeroClipboard_TableTools;
  82509. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  82510. * Local (private) functions
  82511. */
  82512. /**
  82513. * If a Buttons instance is initlaised before it is placed into the DOM, Flash
  82514. * won't be able to bind to it, so we need to wait until it is available, this
  82515. * method abstracts that out.
  82516. *
  82517. * @param {ZeroClipboard} flash ZeroClipboard instance
  82518. * @param {jQuery} node Button
  82519. */
  82520. var _glue = function ( flash, node )
  82521. {
  82522. var id = node.attr('id');
  82523. if ( node.parents('html').length ) {
  82524. flash.glue( node[0], '' );
  82525. }
  82526. else {
  82527. setTimeout( function () {
  82528. _glue( flash, node );
  82529. }, 500 );
  82530. }
  82531. };
  82532. /**
  82533. * Get the sheet name for Excel exports.
  82534. *
  82535. * @param {object} config Button configuration
  82536. */
  82537. var _sheetname = function ( config )
  82538. {
  82539. var sheetName = 'Sheet1';
  82540. if ( config.sheetName ) {
  82541. sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, '');
  82542. }
  82543. return sheetName;
  82544. };
  82545. /**
  82546. * Set the flash text. This has to be broken up into chunks as the Javascript /
  82547. * Flash bridge has a size limit. There is no indication in the Flash
  82548. * documentation what this is, and it probably depends upon the browser.
  82549. * Experimentation shows that the point is around 50k when data starts to get
  82550. * lost, so an 8K limit used here is safe.
  82551. *
  82552. * @param {ZeroClipboard} flash ZeroClipboard instance
  82553. * @param {string} data Data to send to Flash
  82554. */
  82555. var _setText = function ( flash, data )
  82556. {
  82557. var parts = data.match(/[\s\S]{1,8192}/g) || [];
  82558. flash.clearText();
  82559. for ( var i=0, len=parts.length ; i<len ; i++ )
  82560. {
  82561. flash.appendText( parts[i] );
  82562. }
  82563. };
  82564. /**
  82565. * Get the newline character(s)
  82566. *
  82567. * @param {object} config Button configuration
  82568. * @return {string} Newline character
  82569. */
  82570. var _newLine = function ( config )
  82571. {
  82572. return config.newline ?
  82573. config.newline :
  82574. navigator.userAgent.match(/Windows/) ?
  82575. '\r\n' :
  82576. '\n';
  82577. };
  82578. /**
  82579. * Combine the data from the `buttons.exportData` method into a string that
  82580. * will be used in the export file.
  82581. *
  82582. * @param {DataTable.Api} dt DataTables API instance
  82583. * @param {object} config Button configuration
  82584. * @return {object} The data to export
  82585. */
  82586. var _exportData = function ( dt, config )
  82587. {
  82588. var newLine = _newLine( config );
  82589. var data = dt.buttons.exportData( config.exportOptions );
  82590. var boundary = config.fieldBoundary;
  82591. var separator = config.fieldSeparator;
  82592. var reBoundary = new RegExp( boundary, 'g' );
  82593. var escapeChar = config.escapeChar !== undefined ?
  82594. config.escapeChar :
  82595. '\\';
  82596. var join = function ( a ) {
  82597. var s = '';
  82598. // If there is a field boundary, then we might need to escape it in
  82599. // the source data
  82600. for ( var i=0, ien=a.length ; i<ien ; i++ ) {
  82601. if ( i > 0 ) {
  82602. s += separator;
  82603. }
  82604. s += boundary ?
  82605. boundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary :
  82606. a[i];
  82607. }
  82608. return s;
  82609. };
  82610. var header = config.header ? join( data.header )+newLine : '';
  82611. var footer = config.footer && data.footer ? newLine+join( data.footer ) : '';
  82612. var body = [];
  82613. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  82614. body.push( join( data.body[i] ) );
  82615. }
  82616. return {
  82617. str: header + body.join( newLine ) + footer,
  82618. rows: body.length
  82619. };
  82620. };
  82621. // Basic initialisation for the buttons is common between them
  82622. var flashButton = {
  82623. available: function () {
  82624. return ZeroClipboard_TableTools.hasFlash();
  82625. },
  82626. init: function ( dt, button, config ) {
  82627. // Insert the Flash movie
  82628. ZeroClipboard_TableTools.moviePath = DataTable.Buttons.swfPath;
  82629. var flash = new ZeroClipboard_TableTools.Client();
  82630. flash.setHandCursor( true );
  82631. flash.addEventListener('mouseDown', function(client) {
  82632. config._fromFlash = true;
  82633. dt.button( button[0] ).trigger();
  82634. config._fromFlash = false;
  82635. } );
  82636. _glue( flash, button );
  82637. config._flash = flash;
  82638. },
  82639. destroy: function ( dt, button, config ) {
  82640. config._flash.destroy();
  82641. },
  82642. fieldSeparator: ',',
  82643. fieldBoundary: '"',
  82644. exportOptions: {},
  82645. title: '*',
  82646. messageTop: '*',
  82647. messageBottom: '*',
  82648. filename: '*',
  82649. extension: '.csv',
  82650. header: true,
  82651. footer: false
  82652. };
  82653. /**
  82654. * Convert from numeric position to letter for column names in Excel
  82655. * @param {int} n Column number
  82656. * @return {string} Column letter(s) name
  82657. */
  82658. function createCellPos( n ){
  82659. var ordA = 'A'.charCodeAt(0);
  82660. var ordZ = 'Z'.charCodeAt(0);
  82661. var len = ordZ - ordA + 1;
  82662. var s = "";
  82663. while( n >= 0 ) {
  82664. s = String.fromCharCode(n % len + ordA) + s;
  82665. n = Math.floor(n / len) - 1;
  82666. }
  82667. return s;
  82668. }
  82669. /**
  82670. * Create an XML node and add any children, attributes, etc without needing to
  82671. * be verbose in the DOM.
  82672. *
  82673. * @param {object} doc XML document
  82674. * @param {string} nodeName Node name
  82675. * @param {object} opts Options - can be `attr` (attributes), `children`
  82676. * (child nodes) and `text` (text content)
  82677. * @return {node} Created node
  82678. */
  82679. function _createNode( doc, nodeName, opts ){
  82680. var tempNode = doc.createElement( nodeName );
  82681. if ( opts ) {
  82682. if ( opts.attr ) {
  82683. $(tempNode).attr( opts.attr );
  82684. }
  82685. if ( opts.children ) {
  82686. $.each( opts.children, function ( key, value ) {
  82687. tempNode.appendChild( value );
  82688. } );
  82689. }
  82690. if ( opts.text !== null && opts.text !== undefined ) {
  82691. tempNode.appendChild( doc.createTextNode( opts.text ) );
  82692. }
  82693. }
  82694. return tempNode;
  82695. }
  82696. /**
  82697. * Get the width for an Excel column based on the contents of that column
  82698. * @param {object} data Data for export
  82699. * @param {int} col Column index
  82700. * @return {int} Column width
  82701. */
  82702. function _excelColWidth( data, col ) {
  82703. var max = data.header[col].length;
  82704. var len, lineSplit, str;
  82705. if ( data.footer && data.footer[col].length > max ) {
  82706. max = data.footer[col].length;
  82707. }
  82708. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  82709. var point = data.body[i][col];
  82710. str = point !== null && point !== undefined ?
  82711. point.toString() :
  82712. '';
  82713. // If there is a newline character, workout the width of the column
  82714. // based on the longest line in the string
  82715. if ( str.indexOf('\n') !== -1 ) {
  82716. lineSplit = str.split('\n');
  82717. lineSplit.sort( function (a, b) {
  82718. return b.length - a.length;
  82719. } );
  82720. len = lineSplit[0].length;
  82721. }
  82722. else {
  82723. len = str.length;
  82724. }
  82725. if ( len > max ) {
  82726. max = len;
  82727. }
  82728. // Max width rather than having potentially massive column widths
  82729. if ( max > 40 ) {
  82730. return 52; // 40 * 1.3
  82731. }
  82732. }
  82733. max *= 1.3;
  82734. // And a min width
  82735. return max > 6 ? max : 6;
  82736. }
  82737. var _serialiser = "";
  82738. if (typeof window.XMLSerializer === 'undefined') {
  82739. _serialiser = new function () {
  82740. this.serializeToString = function (input) {
  82741. return input.xml
  82742. }
  82743. };
  82744. } else {
  82745. _serialiser = new XMLSerializer();
  82746. }
  82747. var _ieExcel;
  82748. /**
  82749. * Convert XML documents in an object to strings
  82750. * @param {object} obj XLSX document object
  82751. */
  82752. function _xlsxToStrings( obj ) {
  82753. if ( _ieExcel === undefined ) {
  82754. // Detect if we are dealing with IE's _awful_ serialiser by seeing if it
  82755. // drop attributes
  82756. _ieExcel = _serialiser
  82757. .serializeToString(
  82758. $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] )
  82759. )
  82760. .indexOf( 'xmlns:r' ) === -1;
  82761. }
  82762. $.each( obj, function ( name, val ) {
  82763. if ( $.isPlainObject( val ) ) {
  82764. _xlsxToStrings( val );
  82765. }
  82766. else {
  82767. if ( _ieExcel ) {
  82768. // IE's XML serialiser will drop some name space attributes from
  82769. // from the root node, so we need to save them. Do this by
  82770. // replacing the namespace nodes with a regular attribute that
  82771. // we convert back when serialised. Edge does not have this
  82772. // issue
  82773. var worksheet = val.childNodes[0];
  82774. var i, ien;
  82775. var attrs = [];
  82776. for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) {
  82777. var attrName = worksheet.attributes[i].nodeName;
  82778. var attrValue = worksheet.attributes[i].nodeValue;
  82779. if ( attrName.indexOf( ':' ) !== -1 ) {
  82780. attrs.push( { name: attrName, value: attrValue } );
  82781. worksheet.removeAttribute( attrName );
  82782. }
  82783. }
  82784. for ( i=0, ien=attrs.length ; i<ien ; i++ ) {
  82785. var attr = val.createAttribute( attrs[i].name.replace( ':', '_dt_b_namespace_token_' ) );
  82786. attr.value = attrs[i].value;
  82787. worksheet.setAttributeNode( attr );
  82788. }
  82789. }
  82790. var str = _serialiser.serializeToString(val);
  82791. // Fix IE's XML
  82792. if ( _ieExcel ) {
  82793. // IE doesn't include the XML declaration
  82794. if ( str.indexOf( '<?xml' ) === -1 ) {
  82795. str = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+str;
  82796. }
  82797. // Return namespace attributes to being as such
  82798. str = str.replace( /_dt_b_namespace_token_/g, ':' );
  82799. }
  82800. // Safari, IE and Edge will put empty name space attributes onto
  82801. // various elements making them useless. This strips them out
  82802. str = str.replace( /<([^<>]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>' );
  82803. obj[ name ] = str;
  82804. }
  82805. } );
  82806. }
  82807. // Excel - Pre-defined strings to build a basic XLSX file
  82808. var excelStrings = {
  82809. "_rels/.rels":
  82810. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  82811. '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
  82812. '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>'+
  82813. '</Relationships>',
  82814. "xl/_rels/workbook.xml.rels":
  82815. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  82816. '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
  82817. '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>'+
  82818. '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>'+
  82819. '</Relationships>',
  82820. "[Content_Types].xml":
  82821. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  82822. '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'+
  82823. '<Default Extension="xml" ContentType="application/xml" />'+
  82824. '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />'+
  82825. '<Default Extension="jpeg" ContentType="image/jpeg" />'+
  82826. '<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" />'+
  82827. '<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" />'+
  82828. '<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" />'+
  82829. '</Types>',
  82830. "xl/workbook.xml":
  82831. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  82832. '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'+
  82833. '<fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/>'+
  82834. '<workbookPr showInkAnnotation="0" autoCompressPictures="0"/>'+
  82835. '<bookViews>'+
  82836. '<workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/>'+
  82837. '</bookViews>'+
  82838. '<sheets>'+
  82839. '<sheet name="" sheetId="1" r:id="rId1"/>'+
  82840. '</sheets>'+
  82841. '</workbook>',
  82842. "xl/worksheets/sheet1.xml":
  82843. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  82844. '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
  82845. '<sheetData/>'+
  82846. '<mergeCells count="0"/>'+
  82847. '</worksheet>',
  82848. "xl/styles.xml":
  82849. '<?xml version="1.0" encoding="UTF-8"?>'+
  82850. '<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
  82851. '<numFmts count="6">'+
  82852. '<numFmt numFmtId="164" formatCode="#,##0.00_-\ [$$-45C]"/>'+
  82853. '<numFmt numFmtId="165" formatCode="&quot;£&quot;#,##0.00"/>'+
  82854. '<numFmt numFmtId="166" formatCode="[$€-2]\ #,##0.00"/>'+
  82855. '<numFmt numFmtId="167" formatCode="0.0%"/>'+
  82856. '<numFmt numFmtId="168" formatCode="#,##0;(#,##0)"/>'+
  82857. '<numFmt numFmtId="169" formatCode="#,##0.00;(#,##0.00)"/>'+
  82858. '</numFmts>'+
  82859. '<fonts count="5" x14ac:knownFonts="1">'+
  82860. '<font>'+
  82861. '<sz val="11" />'+
  82862. '<name val="Calibri" />'+
  82863. '</font>'+
  82864. '<font>'+
  82865. '<sz val="11" />'+
  82866. '<name val="Calibri" />'+
  82867. '<color rgb="FFFFFFFF" />'+
  82868. '</font>'+
  82869. '<font>'+
  82870. '<sz val="11" />'+
  82871. '<name val="Calibri" />'+
  82872. '<b />'+
  82873. '</font>'+
  82874. '<font>'+
  82875. '<sz val="11" />'+
  82876. '<name val="Calibri" />'+
  82877. '<i />'+
  82878. '</font>'+
  82879. '<font>'+
  82880. '<sz val="11" />'+
  82881. '<name val="Calibri" />'+
  82882. '<u />'+
  82883. '</font>'+
  82884. '</fonts>'+
  82885. '<fills count="6">'+
  82886. '<fill>'+
  82887. '<patternFill patternType="none" />'+
  82888. '</fill>'+
  82889. '<fill>'+ // Excel appears to use this as a dotted background regardless of values but
  82890. '<patternFill patternType="none" />'+ // to be valid to the schema, use a patternFill
  82891. '</fill>'+
  82892. '<fill>'+
  82893. '<patternFill patternType="solid">'+
  82894. '<fgColor rgb="FFD9D9D9" />'+
  82895. '<bgColor indexed="64" />'+
  82896. '</patternFill>'+
  82897. '</fill>'+
  82898. '<fill>'+
  82899. '<patternFill patternType="solid">'+
  82900. '<fgColor rgb="FFD99795" />'+
  82901. '<bgColor indexed="64" />'+
  82902. '</patternFill>'+
  82903. '</fill>'+
  82904. '<fill>'+
  82905. '<patternFill patternType="solid">'+
  82906. '<fgColor rgb="ffc6efce" />'+
  82907. '<bgColor indexed="64" />'+
  82908. '</patternFill>'+
  82909. '</fill>'+
  82910. '<fill>'+
  82911. '<patternFill patternType="solid">'+
  82912. '<fgColor rgb="ffc6cfef" />'+
  82913. '<bgColor indexed="64" />'+
  82914. '</patternFill>'+
  82915. '</fill>'+
  82916. '</fills>'+
  82917. '<borders count="2">'+
  82918. '<border>'+
  82919. '<left />'+
  82920. '<right />'+
  82921. '<top />'+
  82922. '<bottom />'+
  82923. '<diagonal />'+
  82924. '</border>'+
  82925. '<border diagonalUp="false" diagonalDown="false">'+
  82926. '<left style="thin">'+
  82927. '<color auto="1" />'+
  82928. '</left>'+
  82929. '<right style="thin">'+
  82930. '<color auto="1" />'+
  82931. '</right>'+
  82932. '<top style="thin">'+
  82933. '<color auto="1" />'+
  82934. '</top>'+
  82935. '<bottom style="thin">'+
  82936. '<color auto="1" />'+
  82937. '</bottom>'+
  82938. '<diagonal />'+
  82939. '</border>'+
  82940. '</borders>'+
  82941. '<cellStyleXfs count="1">'+
  82942. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />'+
  82943. '</cellStyleXfs>'+
  82944. '<cellXfs count="61">'+
  82945. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82946. '<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82947. '<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82948. '<xf numFmtId="0" fontId="3" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82949. '<xf numFmtId="0" fontId="4" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82950. '<xf numFmtId="0" fontId="0" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82951. '<xf numFmtId="0" fontId="1" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82952. '<xf numFmtId="0" fontId="2" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82953. '<xf numFmtId="0" fontId="3" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82954. '<xf numFmtId="0" fontId="4" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82955. '<xf numFmtId="0" fontId="0" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82956. '<xf numFmtId="0" fontId="1" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82957. '<xf numFmtId="0" fontId="2" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82958. '<xf numFmtId="0" fontId="3" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82959. '<xf numFmtId="0" fontId="4" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82960. '<xf numFmtId="0" fontId="0" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82961. '<xf numFmtId="0" fontId="1" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82962. '<xf numFmtId="0" fontId="2" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82963. '<xf numFmtId="0" fontId="3" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82964. '<xf numFmtId="0" fontId="4" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82965. '<xf numFmtId="0" fontId="0" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82966. '<xf numFmtId="0" fontId="1" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82967. '<xf numFmtId="0" fontId="2" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82968. '<xf numFmtId="0" fontId="3" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82969. '<xf numFmtId="0" fontId="4" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82970. '<xf numFmtId="0" fontId="0" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82971. '<xf numFmtId="0" fontId="1" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82972. '<xf numFmtId="0" fontId="2" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82973. '<xf numFmtId="0" fontId="3" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82974. '<xf numFmtId="0" fontId="4" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82975. '<xf numFmtId="0" fontId="0" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82976. '<xf numFmtId="0" fontId="1" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82977. '<xf numFmtId="0" fontId="2" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82978. '<xf numFmtId="0" fontId="3" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82979. '<xf numFmtId="0" fontId="4" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82980. '<xf numFmtId="0" fontId="0" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82981. '<xf numFmtId="0" fontId="1" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82982. '<xf numFmtId="0" fontId="2" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82983. '<xf numFmtId="0" fontId="3" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82984. '<xf numFmtId="0" fontId="4" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82985. '<xf numFmtId="0" fontId="0" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82986. '<xf numFmtId="0" fontId="1" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82987. '<xf numFmtId="0" fontId="2" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82988. '<xf numFmtId="0" fontId="3" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82989. '<xf numFmtId="0" fontId="4" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82990. '<xf numFmtId="0" fontId="0" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82991. '<xf numFmtId="0" fontId="1" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82992. '<xf numFmtId="0" fontId="2" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82993. '<xf numFmtId="0" fontId="3" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82994. '<xf numFmtId="0" fontId="4" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  82995. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  82996. '<alignment horizontal="left"/>'+
  82997. '</xf>'+
  82998. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  82999. '<alignment horizontal="center"/>'+
  83000. '</xf>'+
  83001. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83002. '<alignment horizontal="right"/>'+
  83003. '</xf>'+
  83004. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83005. '<alignment horizontal="fill"/>'+
  83006. '</xf>'+
  83007. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83008. '<alignment textRotation="90"/>'+
  83009. '</xf>'+
  83010. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83011. '<alignment wrapText="1"/>'+
  83012. '</xf>'+
  83013. '<xf numFmtId="9" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83014. '<xf numFmtId="164" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83015. '<xf numFmtId="165" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83016. '<xf numFmtId="166" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83017. '<xf numFmtId="167" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83018. '<xf numFmtId="168" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83019. '<xf numFmtId="169" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83020. '<xf numFmtId="3" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83021. '<xf numFmtId="4" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  83022. '</cellXfs>'+
  83023. '<cellStyles count="1">'+
  83024. '<cellStyle name="Normal" xfId="0" builtinId="0" />'+
  83025. '</cellStyles>'+
  83026. '<dxfs count="0" />'+
  83027. '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4" />'+
  83028. '</styleSheet>'
  83029. };
  83030. // Note we could use 3 `for` loops for the styles, but when gzipped there is
  83031. // virtually no difference in size, since the above can be easily compressed
  83032. // Pattern matching for special number formats. Perhaps this should be exposed
  83033. // via an API in future?
  83034. var _excelSpecials = [
  83035. { match: /^\-?\d+\.\d%$/, style: 60, fmt: function (d) { return d/100; } }, // Precent with d.p.
  83036. { match: /^\-?\d+\.?\d*%$/, style: 56, fmt: function (d) { return d/100; } }, // Percent
  83037. { match: /^\-?\$[\d,]+.?\d*$/, style: 57 }, // Dollars
  83038. { match: /^\-?£[\d,]+.?\d*$/, style: 58 }, // Pounds
  83039. { match: /^\-?€[\d,]+.?\d*$/, style: 59 }, // Euros
  83040. { match: /^\([\d,]+\)$/, style: 61, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets
  83041. { match: /^\([\d,]+\.\d{2}\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets - 2d.p.
  83042. { match: /^[\d,]+$/, style: 63 }, // Numbers with thousand separators
  83043. { match: /^[\d,]+\.\d{2}$/, style: 64 } // Numbers with 2d.p. and thousands separators
  83044. ];
  83045. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83046. * DataTables options and methods
  83047. */
  83048. // Set the default SWF path
  83049. DataTable.Buttons.swfPath = '//cdn.datatables.net/buttons/'+DataTable.Buttons.version+'/swf/flashExport.swf';
  83050. // Method to allow Flash buttons to be resized when made visible - as they are
  83051. // of zero height and width if initialised hidden
  83052. DataTable.Api.register( 'buttons.resize()', function () {
  83053. $.each( ZeroClipboard_TableTools.clients, function ( i, client ) {
  83054. if ( client.domElement !== undefined && client.domElement.parentNode ) {
  83055. client.positionElement();
  83056. }
  83057. } );
  83058. } );
  83059. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83060. * Button definitions
  83061. */
  83062. // Copy to clipboard
  83063. DataTable.ext.buttons.copyFlash = $.extend( {}, flashButton, {
  83064. className: 'buttons-copy buttons-flash',
  83065. text: function ( dt ) {
  83066. return dt.i18n( 'buttons.copy', 'Copy' );
  83067. },
  83068. action: function ( e, dt, button, config ) {
  83069. // Check that the trigger did actually occur due to a Flash activation
  83070. if ( ! config._fromFlash ) {
  83071. return;
  83072. }
  83073. this.processing( true );
  83074. var flash = config._flash;
  83075. var exportData = _exportData( dt, config );
  83076. var info = dt.buttons.exportInfo( config );
  83077. var newline = _newLine(config);
  83078. var output = exportData.str;
  83079. if ( info.title ) {
  83080. output = info.title + newline + newline + output;
  83081. }
  83082. if ( info.messageTop ) {
  83083. output = info.messageTop + newline + newline + output;
  83084. }
  83085. if ( info.messageBottom ) {
  83086. output = output + newline + newline + info.messageBottom;
  83087. }
  83088. if ( config.customize ) {
  83089. output = config.customize( output, config );
  83090. }
  83091. flash.setAction( 'copy' );
  83092. _setText( flash, output );
  83093. this.processing( false );
  83094. dt.buttons.info(
  83095. dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ),
  83096. dt.i18n( 'buttons.copySuccess', {
  83097. _: 'Copied %d rows to clipboard',
  83098. 1: 'Copied 1 row to clipboard'
  83099. }, data.rows ),
  83100. 3000
  83101. );
  83102. },
  83103. fieldSeparator: '\t',
  83104. fieldBoundary: ''
  83105. } );
  83106. // CSV save file
  83107. DataTable.ext.buttons.csvFlash = $.extend( {}, flashButton, {
  83108. className: 'buttons-csv buttons-flash',
  83109. text: function ( dt ) {
  83110. return dt.i18n( 'buttons.csv', 'CSV' );
  83111. },
  83112. action: function ( e, dt, button, config ) {
  83113. // Set the text
  83114. var flash = config._flash;
  83115. var data = _exportData( dt, config );
  83116. var output = config.customize ?
  83117. config.customize( data.str, config ) :
  83118. data.str;
  83119. flash.setAction( 'csv' );
  83120. flash.setFileName( _filename( config ) );
  83121. _setText( flash, output );
  83122. },
  83123. escapeChar: '"'
  83124. } );
  83125. // Excel save file - this is really a CSV file using UTF-8 that Excel can read
  83126. DataTable.ext.buttons.excelFlash = $.extend( {}, flashButton, {
  83127. className: 'buttons-excel buttons-flash',
  83128. text: function ( dt ) {
  83129. return dt.i18n( 'buttons.excel', 'Excel' );
  83130. },
  83131. action: function ( e, dt, button, config ) {
  83132. this.processing( true );
  83133. var flash = config._flash;
  83134. var rowPos = 0;
  83135. var rels = $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] ) ; //Parses xml
  83136. var relsGet = rels.getElementsByTagName( "sheetData" )[0];
  83137. var xlsx = {
  83138. _rels: {
  83139. ".rels": $.parseXML( excelStrings['_rels/.rels'] )
  83140. },
  83141. xl: {
  83142. _rels: {
  83143. "workbook.xml.rels": $.parseXML( excelStrings['xl/_rels/workbook.xml.rels'] )
  83144. },
  83145. "workbook.xml": $.parseXML( excelStrings['xl/workbook.xml'] ),
  83146. "styles.xml": $.parseXML( excelStrings['xl/styles.xml'] ),
  83147. "worksheets": {
  83148. "sheet1.xml": rels
  83149. }
  83150. },
  83151. "[Content_Types].xml": $.parseXML( excelStrings['[Content_Types].xml'])
  83152. };
  83153. var data = dt.buttons.exportData( config.exportOptions );
  83154. var currentRow, rowNode;
  83155. var addRow = function ( row ) {
  83156. currentRow = rowPos+1;
  83157. rowNode = _createNode( rels, "row", { attr: {r:currentRow} } );
  83158. for ( var i=0, ien=row.length ; i<ien ; i++ ) {
  83159. // Concat both the Cell Columns as a letter and the Row of the cell.
  83160. var cellId = createCellPos(i) + '' + currentRow;
  83161. var cell = null;
  83162. // For null, undefined of blank cell, continue so it doesn't create the _createNode
  83163. if ( row[i] === null || row[i] === undefined || row[i] === '' ) {
  83164. if ( config.createEmptyCells === true ) {
  83165. row[i] = '';
  83166. }
  83167. else {
  83168. continue;
  83169. }
  83170. }
  83171. row[i] = $.trim( row[i] );
  83172. // Special number formatting options
  83173. for ( var j=0, jen=_excelSpecials.length ; j<jen ; j++ ) {
  83174. var special = _excelSpecials[j];
  83175. // TODO Need to provide the ability for the specials to say
  83176. // if they are returning a string, since at the moment it is
  83177. // assumed to be a number
  83178. if ( row[i].match && ! row[i].match(/^0\d+/) && row[i].match( special.match ) ) {
  83179. var val = row[i].replace(/[^\d\.\-]/g, '');
  83180. if ( special.fmt ) {
  83181. val = special.fmt( val );
  83182. }
  83183. cell = _createNode( rels, 'c', {
  83184. attr: {
  83185. r: cellId,
  83186. s: special.style
  83187. },
  83188. children: [
  83189. _createNode( rels, 'v', { text: val } )
  83190. ]
  83191. } );
  83192. break;
  83193. }
  83194. }
  83195. if ( ! cell ) {
  83196. if ( typeof row[i] === 'number' || (
  83197. row[i].match &&
  83198. row[i].match(/^-?\d+(\.\d+)?$/) &&
  83199. ! row[i].match(/^0\d+/) )
  83200. ) {
  83201. // Detect numbers - don't match numbers with leading zeros
  83202. // or a negative anywhere but the start
  83203. cell = _createNode( rels, 'c', {
  83204. attr: {
  83205. t: 'n',
  83206. r: cellId
  83207. },
  83208. children: [
  83209. _createNode( rels, 'v', { text: row[i] } )
  83210. ]
  83211. } );
  83212. }
  83213. else {
  83214. // String output - replace non standard characters for text output
  83215. var text = ! row[i].replace ?
  83216. row[i] :
  83217. row[i].replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');
  83218. cell = _createNode( rels, 'c', {
  83219. attr: {
  83220. t: 'inlineStr',
  83221. r: cellId
  83222. },
  83223. children:{
  83224. row: _createNode( rels, 'is', {
  83225. children: {
  83226. row: _createNode( rels, 't', {
  83227. text: text
  83228. } )
  83229. }
  83230. } )
  83231. }
  83232. } );
  83233. }
  83234. }
  83235. rowNode.appendChild( cell );
  83236. }
  83237. relsGet.appendChild(rowNode);
  83238. rowPos++;
  83239. };
  83240. $( 'sheets sheet', xlsx.xl['workbook.xml'] ).attr( 'name', _sheetname( config ) );
  83241. if ( config.customizeData ) {
  83242. config.customizeData( data );
  83243. }
  83244. var mergeCells = function ( row, colspan ) {
  83245. var mergeCells = $('mergeCells', rels);
  83246. mergeCells[0].appendChild( _createNode( rels, 'mergeCell', {
  83247. attr: {
  83248. ref: 'A'+row+':'+createCellPos(colspan)+row
  83249. }
  83250. } ) );
  83251. mergeCells.attr( 'count', mergeCells.attr( 'count' )+1 );
  83252. $('row:eq('+(row-1)+') c', rels).attr( 's', '51' ); // centre
  83253. };
  83254. // Title and top messages
  83255. var exportInfo = dt.buttons.exportInfo( config );
  83256. if ( exportInfo.title ) {
  83257. addRow( [exportInfo.title], rowPos );
  83258. mergeCells( rowPos, data.header.length-1 );
  83259. }
  83260. if ( exportInfo.messageTop ) {
  83261. addRow( [exportInfo.messageTop], rowPos );
  83262. mergeCells( rowPos, data.header.length-1 );
  83263. }
  83264. // Table itself
  83265. if ( config.header ) {
  83266. addRow( data.header, rowPos );
  83267. $('row:last c', rels).attr( 's', '2' ); // bold
  83268. }
  83269. for ( var n=0, ie=data.body.length ; n<ie ; n++ ) {
  83270. addRow( data.body[n], rowPos );
  83271. }
  83272. if ( config.footer && data.footer ) {
  83273. addRow( data.footer, rowPos);
  83274. $('row:last c', rels).attr( 's', '2' ); // bold
  83275. }
  83276. // Below the table
  83277. if ( exportInfo.messageBottom ) {
  83278. addRow( [exportInfo.messageBottom], rowPos );
  83279. mergeCells( rowPos, data.header.length-1 );
  83280. }
  83281. // Set column widths
  83282. var cols = _createNode( rels, 'cols' );
  83283. $('worksheet', rels).prepend( cols );
  83284. for ( var i=0, ien=data.header.length ; i<ien ; i++ ) {
  83285. cols.appendChild( _createNode( rels, 'col', {
  83286. attr: {
  83287. min: i+1,
  83288. max: i+1,
  83289. width: _excelColWidth( data, i ),
  83290. customWidth: 1
  83291. }
  83292. } ) );
  83293. }
  83294. // Let the developer customise the document if they want to
  83295. if ( config.customize ) {
  83296. config.customize( xlsx );
  83297. }
  83298. _xlsxToStrings( xlsx );
  83299. flash.setAction( 'excel' );
  83300. flash.setFileName( exportInfo.filename );
  83301. flash.setSheetData( xlsx );
  83302. _setText( flash, '' );
  83303. this.processing( false );
  83304. },
  83305. extension: '.xlsx',
  83306. createEmptyCells: false
  83307. } );
  83308. // PDF export
  83309. DataTable.ext.buttons.pdfFlash = $.extend( {}, flashButton, {
  83310. className: 'buttons-pdf buttons-flash',
  83311. text: function ( dt ) {
  83312. return dt.i18n( 'buttons.pdf', 'PDF' );
  83313. },
  83314. action: function ( e, dt, button, config ) {
  83315. this.processing( true );
  83316. // Set the text
  83317. var flash = config._flash;
  83318. var data = dt.buttons.exportData( config.exportOptions );
  83319. var info = dt.buttons.exportInfo( config );
  83320. var totalWidth = dt.table().node().offsetWidth;
  83321. // Calculate the column width ratios for layout of the table in the PDF
  83322. var ratios = dt.columns( config.columns ).indexes().map( function ( idx ) {
  83323. return dt.column( idx ).header().offsetWidth / totalWidth;
  83324. } );
  83325. flash.setAction( 'pdf' );
  83326. flash.setFileName( info.filename );
  83327. _setText( flash, JSON.stringify( {
  83328. title: info.title || '',
  83329. messageTop: info.messageTop || '',
  83330. messageBottom: info.messageBottom || '',
  83331. colWidth: ratios.toArray(),
  83332. orientation: config.orientation,
  83333. size: config.pageSize,
  83334. header: config.header ? data.header : null,
  83335. footer: config.footer ? data.footer : null,
  83336. body: data.body
  83337. } ) );
  83338. this.processing( false );
  83339. },
  83340. extension: '.pdf',
  83341. orientation: 'portrait',
  83342. pageSize: 'A4',
  83343. newline: '\n'
  83344. } );
  83345. return DataTable.Buttons;
  83346. }));
  83347. /*!
  83348. * HTML5 export buttons for Buttons and DataTables.
  83349. * 2016 SpryMedia Ltd - datatables.net/license
  83350. *
  83351. * FileSaver.js (1.3.3) - MIT license
  83352. * Copyright © 2016 Eli Grey - http://eligrey.com
  83353. */
  83354. (function( factory ){
  83355. if ( typeof define === 'function' && define.amd ) {
  83356. // AMD
  83357. define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
  83358. return factory( $, window, document );
  83359. } );
  83360. }
  83361. else if ( typeof exports === 'object' ) {
  83362. // CommonJS
  83363. module.exports = function (root, $, jszip, pdfmake) {
  83364. if ( ! root ) {
  83365. root = window;
  83366. }
  83367. if ( ! $ || ! $.fn.dataTable ) {
  83368. $ = require('datatables.net')(root, $).$;
  83369. }
  83370. if ( ! $.fn.dataTable.Buttons ) {
  83371. require('datatables.net-buttons')(root, $);
  83372. }
  83373. return factory( $, root, root.document, jszip, pdfmake );
  83374. };
  83375. }
  83376. else {
  83377. // Browser
  83378. factory( jQuery, window, document );
  83379. }
  83380. }(function( $, window, document, jszip, pdfmake, undefined ) {
  83381. 'use strict';
  83382. var DataTable = $.fn.dataTable;
  83383. // Allow the constructor to pass in JSZip and PDFMake from external requires.
  83384. // Otherwise, use globally defined variables, if they are available.
  83385. function _jsZip () {
  83386. return jszip || window.JSZip;
  83387. }
  83388. function _pdfMake () {
  83389. return pdfmake || window.pdfMake;
  83390. }
  83391. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83392. * FileSaver.js dependency
  83393. */
  83394. /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
  83395. var _saveAs = (function(view) {
  83396. "use strict";
  83397. // IE <10 is explicitly unsupported
  83398. if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
  83399. return;
  83400. }
  83401. var
  83402. doc = view.document
  83403. // only get URL when necessary in case Blob.js hasn't overridden it yet
  83404. , get_URL = function() {
  83405. return view.URL || view.webkitURL || view;
  83406. }
  83407. , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
  83408. , can_use_save_link = "download" in save_link
  83409. , click = function(node) {
  83410. var event = new MouseEvent("click");
  83411. node.dispatchEvent(event);
  83412. }
  83413. , is_safari = /constructor/i.test(view.HTMLElement) || view.safari
  83414. , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
  83415. , throw_outside = function(ex) {
  83416. (view.setImmediate || view.setTimeout)(function() {
  83417. throw ex;
  83418. }, 0);
  83419. }
  83420. , force_saveable_type = "application/octet-stream"
  83421. // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
  83422. , arbitrary_revoke_timeout = 1000 * 40 // in ms
  83423. , revoke = function(file) {
  83424. var revoker = function() {
  83425. if (typeof file === "string") { // file is an object URL
  83426. get_URL().revokeObjectURL(file);
  83427. } else { // file is a File
  83428. file.remove();
  83429. }
  83430. };
  83431. setTimeout(revoker, arbitrary_revoke_timeout);
  83432. }
  83433. , dispatch = function(filesaver, event_types, event) {
  83434. event_types = [].concat(event_types);
  83435. var i = event_types.length;
  83436. while (i--) {
  83437. var listener = filesaver["on" + event_types[i]];
  83438. if (typeof listener === "function") {
  83439. try {
  83440. listener.call(filesaver, event || filesaver);
  83441. } catch (ex) {
  83442. throw_outside(ex);
  83443. }
  83444. }
  83445. }
  83446. }
  83447. , auto_bom = function(blob) {
  83448. // prepend BOM for UTF-8 XML and text/* types (including HTML)
  83449. // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
  83450. if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
  83451. return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
  83452. }
  83453. return blob;
  83454. }
  83455. , FileSaver = function(blob, name, no_auto_bom) {
  83456. if (!no_auto_bom) {
  83457. blob = auto_bom(blob);
  83458. }
  83459. // First try a.download, then web filesystem, then object URLs
  83460. var
  83461. filesaver = this
  83462. , type = blob.type
  83463. , force = type === force_saveable_type
  83464. , object_url
  83465. , dispatch_all = function() {
  83466. dispatch(filesaver, "writestart progress write writeend".split(" "));
  83467. }
  83468. // on any filesys errors revert to saving with object URLs
  83469. , fs_error = function() {
  83470. if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
  83471. // Safari doesn't allow downloading of blob urls
  83472. var reader = new FileReader();
  83473. reader.onloadend = function() {
  83474. var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
  83475. var popup = view.open(url, '_blank');
  83476. if(!popup) view.location.href = url;
  83477. url=undefined; // release reference before dispatching
  83478. filesaver.readyState = filesaver.DONE;
  83479. dispatch_all();
  83480. };
  83481. reader.readAsDataURL(blob);
  83482. filesaver.readyState = filesaver.INIT;
  83483. return;
  83484. }
  83485. // don't create more object URLs than needed
  83486. if (!object_url) {
  83487. object_url = get_URL().createObjectURL(blob);
  83488. }
  83489. if (force) {
  83490. view.location.href = object_url;
  83491. } else {
  83492. var opened = view.open(object_url, "_blank");
  83493. if (!opened) {
  83494. // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
  83495. view.location.href = object_url;
  83496. }
  83497. }
  83498. filesaver.readyState = filesaver.DONE;
  83499. dispatch_all();
  83500. revoke(object_url);
  83501. }
  83502. ;
  83503. filesaver.readyState = filesaver.INIT;
  83504. if (can_use_save_link) {
  83505. object_url = get_URL().createObjectURL(blob);
  83506. setTimeout(function() {
  83507. save_link.href = object_url;
  83508. save_link.download = name;
  83509. click(save_link);
  83510. dispatch_all();
  83511. revoke(object_url);
  83512. filesaver.readyState = filesaver.DONE;
  83513. });
  83514. return;
  83515. }
  83516. fs_error();
  83517. }
  83518. , FS_proto = FileSaver.prototype
  83519. , saveAs = function(blob, name, no_auto_bom) {
  83520. return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
  83521. }
  83522. ;
  83523. // IE 10+ (native saveAs)
  83524. if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
  83525. return function(blob, name, no_auto_bom) {
  83526. name = name || blob.name || "download";
  83527. if (!no_auto_bom) {
  83528. blob = auto_bom(blob);
  83529. }
  83530. return navigator.msSaveOrOpenBlob(blob, name);
  83531. };
  83532. }
  83533. FS_proto.abort = function(){};
  83534. FS_proto.readyState = FS_proto.INIT = 0;
  83535. FS_proto.WRITING = 1;
  83536. FS_proto.DONE = 2;
  83537. FS_proto.error =
  83538. FS_proto.onwritestart =
  83539. FS_proto.onprogress =
  83540. FS_proto.onwrite =
  83541. FS_proto.onabort =
  83542. FS_proto.onerror =
  83543. FS_proto.onwriteend =
  83544. null;
  83545. return saveAs;
  83546. }(
  83547. typeof self !== "undefined" && self
  83548. || typeof window !== "undefined" && window
  83549. || this.content
  83550. ));
  83551. // Expose file saver on the DataTables API. Can't attach to `DataTables.Buttons`
  83552. // since this file can be loaded before Button's core!
  83553. DataTable.fileSave = _saveAs;
  83554. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  83555. * Local (private) functions
  83556. */
  83557. /**
  83558. * Get the sheet name for Excel exports.
  83559. *
  83560. * @param {object} config Button configuration
  83561. */
  83562. var _sheetname = function ( config )
  83563. {
  83564. var sheetName = 'Sheet1';
  83565. if ( config.sheetName ) {
  83566. sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, '');
  83567. }
  83568. return sheetName;
  83569. };
  83570. /**
  83571. * Get the newline character(s)
  83572. *
  83573. * @param {object} config Button configuration
  83574. * @return {string} Newline character
  83575. */
  83576. var _newLine = function ( config )
  83577. {
  83578. return config.newline ?
  83579. config.newline :
  83580. navigator.userAgent.match(/Windows/) ?
  83581. '\r\n' :
  83582. '\n';
  83583. };
  83584. /**
  83585. * Combine the data from the `buttons.exportData` method into a string that
  83586. * will be used in the export file.
  83587. *
  83588. * @param {DataTable.Api} dt DataTables API instance
  83589. * @param {object} config Button configuration
  83590. * @return {object} The data to export
  83591. */
  83592. var _exportData = function ( dt, config )
  83593. {
  83594. var newLine = _newLine( config );
  83595. var data = dt.buttons.exportData( config.exportOptions );
  83596. var boundary = config.fieldBoundary;
  83597. var separator = config.fieldSeparator;
  83598. var reBoundary = new RegExp( boundary, 'g' );
  83599. var escapeChar = config.escapeChar !== undefined ?
  83600. config.escapeChar :
  83601. '\\';
  83602. var join = function ( a ) {
  83603. var s = '';
  83604. // If there is a field boundary, then we might need to escape it in
  83605. // the source data
  83606. for ( var i=0, ien=a.length ; i<ien ; i++ ) {
  83607. if ( i > 0 ) {
  83608. s += separator;
  83609. }
  83610. s += boundary ?
  83611. boundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary :
  83612. a[i];
  83613. }
  83614. return s;
  83615. };
  83616. var header = config.header ? join( data.header )+newLine : '';
  83617. var footer = config.footer && data.footer ? newLine+join( data.footer ) : '';
  83618. var body = [];
  83619. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  83620. body.push( join( data.body[i] ) );
  83621. }
  83622. return {
  83623. str: header + body.join( newLine ) + footer,
  83624. rows: body.length
  83625. };
  83626. };
  83627. /**
  83628. * Older versions of Safari (prior to tech preview 18) don't support the
  83629. * download option required.
  83630. *
  83631. * @return {Boolean} `true` if old Safari
  83632. */
  83633. var _isDuffSafari = function ()
  83634. {
  83635. var safari = navigator.userAgent.indexOf('Safari') !== -1 &&
  83636. navigator.userAgent.indexOf('Chrome') === -1 &&
  83637. navigator.userAgent.indexOf('Opera') === -1;
  83638. if ( ! safari ) {
  83639. return false;
  83640. }
  83641. var version = navigator.userAgent.match( /AppleWebKit\/(\d+\.\d+)/ );
  83642. if ( version && version.length > 1 && version[1]*1 < 603.1 ) {
  83643. return true;
  83644. }
  83645. return false;
  83646. };
  83647. /**
  83648. * Convert from numeric position to letter for column names in Excel
  83649. * @param {int} n Column number
  83650. * @return {string} Column letter(s) name
  83651. */
  83652. function createCellPos( n ){
  83653. var ordA = 'A'.charCodeAt(0);
  83654. var ordZ = 'Z'.charCodeAt(0);
  83655. var len = ordZ - ordA + 1;
  83656. var s = "";
  83657. while( n >= 0 ) {
  83658. s = String.fromCharCode(n % len + ordA) + s;
  83659. n = Math.floor(n / len) - 1;
  83660. }
  83661. return s;
  83662. }
  83663. try {
  83664. var _serialiser = new XMLSerializer();
  83665. var _ieExcel;
  83666. }
  83667. catch (t) {}
  83668. /**
  83669. * Recursively add XML files from an object's structure to a ZIP file. This
  83670. * allows the XSLX file to be easily defined with an object's structure matching
  83671. * the files structure.
  83672. *
  83673. * @param {JSZip} zip ZIP package
  83674. * @param {object} obj Object to add (recursive)
  83675. */
  83676. function _addToZip( zip, obj ) {
  83677. if ( _ieExcel === undefined ) {
  83678. // Detect if we are dealing with IE's _awful_ serialiser by seeing if it
  83679. // drop attributes
  83680. _ieExcel = _serialiser
  83681. .serializeToString(
  83682. $.parseXML( excelStrings['xl/worksheets/sheet1.xml'] )
  83683. )
  83684. .indexOf( 'xmlns:r' ) === -1;
  83685. }
  83686. $.each( obj, function ( name, val ) {
  83687. if ( $.isPlainObject( val ) ) {
  83688. var newDir = zip.folder( name );
  83689. _addToZip( newDir, val );
  83690. }
  83691. else {
  83692. if ( _ieExcel ) {
  83693. // IE's XML serialiser will drop some name space attributes from
  83694. // from the root node, so we need to save them. Do this by
  83695. // replacing the namespace nodes with a regular attribute that
  83696. // we convert back when serialised. Edge does not have this
  83697. // issue
  83698. var worksheet = val.childNodes[0];
  83699. var i, ien;
  83700. var attrs = [];
  83701. for ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) {
  83702. var attrName = worksheet.attributes[i].nodeName;
  83703. var attrValue = worksheet.attributes[i].nodeValue;
  83704. if ( attrName.indexOf( ':' ) !== -1 ) {
  83705. attrs.push( { name: attrName, value: attrValue } );
  83706. worksheet.removeAttribute( attrName );
  83707. }
  83708. }
  83709. for ( i=0, ien=attrs.length ; i<ien ; i++ ) {
  83710. var attr = val.createAttribute( attrs[i].name.replace( ':', '_dt_b_namespace_token_' ) );
  83711. attr.value = attrs[i].value;
  83712. worksheet.setAttributeNode( attr );
  83713. }
  83714. }
  83715. var str = _serialiser.serializeToString(val);
  83716. // Fix IE's XML
  83717. if ( _ieExcel ) {
  83718. // IE doesn't include the XML declaration
  83719. if ( str.indexOf( '<?xml' ) === -1 ) {
  83720. str = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+str;
  83721. }
  83722. // Return namespace attributes to being as such
  83723. str = str.replace( /_dt_b_namespace_token_/g, ':' );
  83724. }
  83725. // Safari, IE and Edge will put empty name space attributes onto
  83726. // various elements making them useless. This strips them out
  83727. str = str.replace( /<([^<>]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>' );
  83728. zip.file( name, str );
  83729. }
  83730. } );
  83731. }
  83732. /**
  83733. * Create an XML node and add any children, attributes, etc without needing to
  83734. * be verbose in the DOM.
  83735. *
  83736. * @param {object} doc XML document
  83737. * @param {string} nodeName Node name
  83738. * @param {object} opts Options - can be `attr` (attributes), `children`
  83739. * (child nodes) and `text` (text content)
  83740. * @return {node} Created node
  83741. */
  83742. function _createNode( doc, nodeName, opts ) {
  83743. var tempNode = doc.createElement( nodeName );
  83744. if ( opts ) {
  83745. if ( opts.attr ) {
  83746. $(tempNode).attr( opts.attr );
  83747. }
  83748. if ( opts.children ) {
  83749. $.each( opts.children, function ( key, value ) {
  83750. tempNode.appendChild( value );
  83751. } );
  83752. }
  83753. if ( opts.text !== null && opts.text !== undefined ) {
  83754. tempNode.appendChild( doc.createTextNode( opts.text ) );
  83755. }
  83756. }
  83757. return tempNode;
  83758. }
  83759. /**
  83760. * Get the width for an Excel column based on the contents of that column
  83761. * @param {object} data Data for export
  83762. * @param {int} col Column index
  83763. * @return {int} Column width
  83764. */
  83765. function _excelColWidth( data, col ) {
  83766. var max = data.header[col].length;
  83767. var len, lineSplit, str;
  83768. if ( data.footer && data.footer[col].length > max ) {
  83769. max = data.footer[col].length;
  83770. }
  83771. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  83772. var point = data.body[i][col];
  83773. str = point !== null && point !== undefined ?
  83774. point.toString() :
  83775. '';
  83776. // If there is a newline character, workout the width of the column
  83777. // based on the longest line in the string
  83778. if ( str.indexOf('\n') !== -1 ) {
  83779. lineSplit = str.split('\n');
  83780. lineSplit.sort( function (a, b) {
  83781. return b.length - a.length;
  83782. } );
  83783. len = lineSplit[0].length;
  83784. }
  83785. else {
  83786. len = str.length;
  83787. }
  83788. if ( len > max ) {
  83789. max = len;
  83790. }
  83791. // Max width rather than having potentially massive column widths
  83792. if ( max > 40 ) {
  83793. return 52; // 40 * 1.3
  83794. }
  83795. }
  83796. max *= 1.3;
  83797. // And a min width
  83798. return max > 6 ? max : 6;
  83799. }
  83800. // Excel - Pre-defined strings to build a basic XLSX file
  83801. var excelStrings = {
  83802. "_rels/.rels":
  83803. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  83804. '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
  83805. '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>'+
  83806. '</Relationships>',
  83807. "xl/_rels/workbook.xml.rels":
  83808. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  83809. '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">'+
  83810. '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/>'+
  83811. '<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>'+
  83812. '</Relationships>',
  83813. "[Content_Types].xml":
  83814. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  83815. '<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">'+
  83816. '<Default Extension="xml" ContentType="application/xml" />'+
  83817. '<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />'+
  83818. '<Default Extension="jpeg" ContentType="image/jpeg" />'+
  83819. '<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" />'+
  83820. '<Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" />'+
  83821. '<Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" />'+
  83822. '</Types>',
  83823. "xl/workbook.xml":
  83824. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  83825. '<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'+
  83826. '<fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="24816"/>'+
  83827. '<workbookPr showInkAnnotation="0" autoCompressPictures="0"/>'+
  83828. '<bookViews>'+
  83829. '<workbookView xWindow="0" yWindow="0" windowWidth="25600" windowHeight="19020" tabRatio="500"/>'+
  83830. '</bookViews>'+
  83831. '<sheets>'+
  83832. '<sheet name="" sheetId="1" r:id="rId1"/>'+
  83833. '</sheets>'+
  83834. '</workbook>',
  83835. "xl/worksheets/sheet1.xml":
  83836. '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
  83837. '<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
  83838. '<sheetData/>'+
  83839. '<mergeCells count="0"/>'+
  83840. '</worksheet>',
  83841. "xl/styles.xml":
  83842. '<?xml version="1.0" encoding="UTF-8"?>'+
  83843. '<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
  83844. '<numFmts count="6">'+
  83845. '<numFmt numFmtId="164" formatCode="#,##0.00_-\ [$$-45C]"/>'+
  83846. '<numFmt numFmtId="165" formatCode="&quot;£&quot;#,##0.00"/>'+
  83847. '<numFmt numFmtId="166" formatCode="[$€-2]\ #,##0.00"/>'+
  83848. '<numFmt numFmtId="167" formatCode="0.0%"/>'+
  83849. '<numFmt numFmtId="168" formatCode="#,##0;(#,##0)"/>'+
  83850. '<numFmt numFmtId="169" formatCode="#,##0.00;(#,##0.00)"/>'+
  83851. '</numFmts>'+
  83852. '<fonts count="5" x14ac:knownFonts="1">'+
  83853. '<font>'+
  83854. '<sz val="11" />'+
  83855. '<name val="Calibri" />'+
  83856. '</font>'+
  83857. '<font>'+
  83858. '<sz val="11" />'+
  83859. '<name val="Calibri" />'+
  83860. '<color rgb="FFFFFFFF" />'+
  83861. '</font>'+
  83862. '<font>'+
  83863. '<sz val="11" />'+
  83864. '<name val="Calibri" />'+
  83865. '<b />'+
  83866. '</font>'+
  83867. '<font>'+
  83868. '<sz val="11" />'+
  83869. '<name val="Calibri" />'+
  83870. '<i />'+
  83871. '</font>'+
  83872. '<font>'+
  83873. '<sz val="11" />'+
  83874. '<name val="Calibri" />'+
  83875. '<u />'+
  83876. '</font>'+
  83877. '</fonts>'+
  83878. '<fills count="6">'+
  83879. '<fill>'+
  83880. '<patternFill patternType="none" />'+
  83881. '</fill>'+
  83882. '<fill>'+ // Excel appears to use this as a dotted background regardless of values but
  83883. '<patternFill patternType="none" />'+ // to be valid to the schema, use a patternFill
  83884. '</fill>'+
  83885. '<fill>'+
  83886. '<patternFill patternType="solid">'+
  83887. '<fgColor rgb="FFD9D9D9" />'+
  83888. '<bgColor indexed="64" />'+
  83889. '</patternFill>'+
  83890. '</fill>'+
  83891. '<fill>'+
  83892. '<patternFill patternType="solid">'+
  83893. '<fgColor rgb="FFD99795" />'+
  83894. '<bgColor indexed="64" />'+
  83895. '</patternFill>'+
  83896. '</fill>'+
  83897. '<fill>'+
  83898. '<patternFill patternType="solid">'+
  83899. '<fgColor rgb="ffc6efce" />'+
  83900. '<bgColor indexed="64" />'+
  83901. '</patternFill>'+
  83902. '</fill>'+
  83903. '<fill>'+
  83904. '<patternFill patternType="solid">'+
  83905. '<fgColor rgb="ffc6cfef" />'+
  83906. '<bgColor indexed="64" />'+
  83907. '</patternFill>'+
  83908. '</fill>'+
  83909. '</fills>'+
  83910. '<borders count="2">'+
  83911. '<border>'+
  83912. '<left />'+
  83913. '<right />'+
  83914. '<top />'+
  83915. '<bottom />'+
  83916. '<diagonal />'+
  83917. '</border>'+
  83918. '<border diagonalUp="false" diagonalDown="false">'+
  83919. '<left style="thin">'+
  83920. '<color auto="1" />'+
  83921. '</left>'+
  83922. '<right style="thin">'+
  83923. '<color auto="1" />'+
  83924. '</right>'+
  83925. '<top style="thin">'+
  83926. '<color auto="1" />'+
  83927. '</top>'+
  83928. '<bottom style="thin">'+
  83929. '<color auto="1" />'+
  83930. '</bottom>'+
  83931. '<diagonal />'+
  83932. '</border>'+
  83933. '</borders>'+
  83934. '<cellStyleXfs count="1">'+
  83935. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" />'+
  83936. '</cellStyleXfs>'+
  83937. '<cellXfs count="67">'+
  83938. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83939. '<xf numFmtId="0" fontId="1" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83940. '<xf numFmtId="0" fontId="2" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83941. '<xf numFmtId="0" fontId="3" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83942. '<xf numFmtId="0" fontId="4" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83943. '<xf numFmtId="0" fontId="0" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83944. '<xf numFmtId="0" fontId="1" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83945. '<xf numFmtId="0" fontId="2" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83946. '<xf numFmtId="0" fontId="3" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83947. '<xf numFmtId="0" fontId="4" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83948. '<xf numFmtId="0" fontId="0" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83949. '<xf numFmtId="0" fontId="1" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83950. '<xf numFmtId="0" fontId="2" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83951. '<xf numFmtId="0" fontId="3" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83952. '<xf numFmtId="0" fontId="4" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83953. '<xf numFmtId="0" fontId="0" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83954. '<xf numFmtId="0" fontId="1" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83955. '<xf numFmtId="0" fontId="2" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83956. '<xf numFmtId="0" fontId="3" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83957. '<xf numFmtId="0" fontId="4" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83958. '<xf numFmtId="0" fontId="0" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83959. '<xf numFmtId="0" fontId="1" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83960. '<xf numFmtId="0" fontId="2" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83961. '<xf numFmtId="0" fontId="3" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83962. '<xf numFmtId="0" fontId="4" fillId="5" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83963. '<xf numFmtId="0" fontId="0" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83964. '<xf numFmtId="0" fontId="1" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83965. '<xf numFmtId="0" fontId="2" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83966. '<xf numFmtId="0" fontId="3" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83967. '<xf numFmtId="0" fontId="4" fillId="0" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83968. '<xf numFmtId="0" fontId="0" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83969. '<xf numFmtId="0" fontId="1" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83970. '<xf numFmtId="0" fontId="2" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83971. '<xf numFmtId="0" fontId="3" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83972. '<xf numFmtId="0" fontId="4" fillId="2" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83973. '<xf numFmtId="0" fontId="0" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83974. '<xf numFmtId="0" fontId="1" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83975. '<xf numFmtId="0" fontId="2" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83976. '<xf numFmtId="0" fontId="3" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83977. '<xf numFmtId="0" fontId="4" fillId="3" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83978. '<xf numFmtId="0" fontId="0" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83979. '<xf numFmtId="0" fontId="1" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83980. '<xf numFmtId="0" fontId="2" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83981. '<xf numFmtId="0" fontId="3" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83982. '<xf numFmtId="0" fontId="4" fillId="4" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83983. '<xf numFmtId="0" fontId="0" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83984. '<xf numFmtId="0" fontId="1" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83985. '<xf numFmtId="0" fontId="2" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83986. '<xf numFmtId="0" fontId="3" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83987. '<xf numFmtId="0" fontId="4" fillId="5" borderId="1" applyFont="1" applyFill="1" applyBorder="1"/>'+
  83988. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83989. '<alignment horizontal="left"/>'+
  83990. '</xf>'+
  83991. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83992. '<alignment horizontal="center"/>'+
  83993. '</xf>'+
  83994. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83995. '<alignment horizontal="right"/>'+
  83996. '</xf>'+
  83997. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  83998. '<alignment horizontal="fill"/>'+
  83999. '</xf>'+
  84000. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  84001. '<alignment textRotation="90"/>'+
  84002. '</xf>'+
  84003. '<xf numFmtId="0" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyAlignment="1">'+
  84004. '<alignment wrapText="1"/>'+
  84005. '</xf>'+
  84006. '<xf numFmtId="9" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84007. '<xf numFmtId="164" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84008. '<xf numFmtId="165" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84009. '<xf numFmtId="166" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84010. '<xf numFmtId="167" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84011. '<xf numFmtId="168" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84012. '<xf numFmtId="169" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84013. '<xf numFmtId="3" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84014. '<xf numFmtId="4" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84015. '<xf numFmtId="1" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84016. '<xf numFmtId="2" fontId="0" fillId="0" borderId="0" applyFont="1" applyFill="1" applyBorder="1" xfId="0" applyNumberFormat="1"/>'+
  84017. '</cellXfs>'+
  84018. '<cellStyles count="1">'+
  84019. '<cellStyle name="Normal" xfId="0" builtinId="0" />'+
  84020. '</cellStyles>'+
  84021. '<dxfs count="0" />'+
  84022. '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4" />'+
  84023. '</styleSheet>'
  84024. };
  84025. // Note we could use 3 `for` loops for the styles, but when gzipped there is
  84026. // virtually no difference in size, since the above can be easily compressed
  84027. // Pattern matching for special number formats. Perhaps this should be exposed
  84028. // via an API in future?
  84029. // Ref: section 3.8.30 - built in formatters in open spreadsheet
  84030. // https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf
  84031. var _excelSpecials = [
  84032. { match: /^\-?\d+\.\d%$/, style: 60, fmt: function (d) { return d/100; } }, // Precent with d.p.
  84033. { match: /^\-?\d+\.?\d*%$/, style: 56, fmt: function (d) { return d/100; } }, // Percent
  84034. { match: /^\-?\$[\d,]+.?\d*$/, style: 57 }, // Dollars
  84035. { match: /^\-?£[\d,]+.?\d*$/, style: 58 }, // Pounds
  84036. { match: /^\-?€[\d,]+.?\d*$/, style: 59 }, // Euros
  84037. { match: /^\-?\d+$/, style: 65 }, // Numbers without thousand separators
  84038. { match: /^\-?\d+\.\d{2}$/, style: 66 }, // Numbers 2 d.p. without thousands separators
  84039. { match: /^\([\d,]+\)$/, style: 61, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets
  84040. { match: /^\([\d,]+\.\d{2}\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\(\)]/g, ''); } }, // Negative numbers indicated by brackets - 2d.p.
  84041. { match: /^\-?[\d,]+$/, style: 63 }, // Numbers with thousand separators
  84042. { match: /^\-?[\d,]+\.\d{2}$/, style: 64 } // Numbers with 2 d.p. and thousands separators
  84043. ];
  84044. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  84045. * Buttons
  84046. */
  84047. //
  84048. // Copy to clipboard
  84049. //
  84050. DataTable.ext.buttons.copyHtml5 = {
  84051. className: 'buttons-copy buttons-html5',
  84052. text: function ( dt ) {
  84053. return dt.i18n( 'buttons.copy', 'Copy' );
  84054. },
  84055. action: function ( e, dt, button, config ) {
  84056. this.processing( true );
  84057. var that = this;
  84058. var exportData = _exportData( dt, config );
  84059. var info = dt.buttons.exportInfo( config );
  84060. var newline = _newLine(config);
  84061. var output = exportData.str;
  84062. var hiddenDiv = $('<div/>')
  84063. .css( {
  84064. height: 1,
  84065. width: 1,
  84066. overflow: 'hidden',
  84067. position: 'fixed',
  84068. top: 0,
  84069. left: 0
  84070. } );
  84071. if ( info.title ) {
  84072. output = info.title + newline + newline + output;
  84073. }
  84074. if ( info.messageTop ) {
  84075. output = info.messageTop + newline + newline + output;
  84076. }
  84077. if ( info.messageBottom ) {
  84078. output = output + newline + newline + info.messageBottom;
  84079. }
  84080. if ( config.customize ) {
  84081. output = config.customize( output, config );
  84082. }
  84083. var textarea = $('<textarea readonly/>')
  84084. .val( output )
  84085. .appendTo( hiddenDiv );
  84086. // For browsers that support the copy execCommand, try to use it
  84087. if ( document.queryCommandSupported('copy') ) {
  84088. hiddenDiv.appendTo( dt.table().container() );
  84089. textarea[0].focus();
  84090. textarea[0].select();
  84091. try {
  84092. var successful = document.execCommand( 'copy' );
  84093. hiddenDiv.remove();
  84094. if (successful) {
  84095. dt.buttons.info(
  84096. dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ),
  84097. dt.i18n( 'buttons.copySuccess', {
  84098. 1: 'Copied one row to clipboard',
  84099. _: 'Copied %d rows to clipboard'
  84100. }, exportData.rows ),
  84101. 2000
  84102. );
  84103. this.processing( false );
  84104. return;
  84105. }
  84106. }
  84107. catch (t) {}
  84108. }
  84109. // Otherwise we show the text box and instruct the user to use it
  84110. var message = $('<span>'+dt.i18n( 'buttons.copyKeys',
  84111. 'Press <i>ctrl</i> or <i>\u2318</i> + <i>C</i> to copy the table data<br>to your system clipboard.<br><br>'+
  84112. 'To cancel, click this message or press escape.' )+'</span>'
  84113. )
  84114. .append( hiddenDiv );
  84115. dt.buttons.info( dt.i18n( 'buttons.copyTitle', 'Copy to clipboard' ), message, 0 );
  84116. // Select the text so when the user activates their system clipboard
  84117. // it will copy that text
  84118. textarea[0].focus();
  84119. textarea[0].select();
  84120. // Event to hide the message when the user is done
  84121. var container = $(message).closest('.dt-button-info');
  84122. var close = function () {
  84123. container.off( 'click.buttons-copy' );
  84124. $(document).off( '.buttons-copy' );
  84125. dt.buttons.info( false );
  84126. };
  84127. container.on( 'click.buttons-copy', close );
  84128. $(document)
  84129. .on( 'keydown.buttons-copy', function (e) {
  84130. if ( e.keyCode === 27 ) { // esc
  84131. close();
  84132. that.processing( false );
  84133. }
  84134. } )
  84135. .on( 'copy.buttons-copy cut.buttons-copy', function () {
  84136. close();
  84137. that.processing( false );
  84138. } );
  84139. },
  84140. exportOptions: {},
  84141. fieldSeparator: '\t',
  84142. fieldBoundary: '',
  84143. header: true,
  84144. footer: false,
  84145. title: '*',
  84146. messageTop: '*',
  84147. messageBottom: '*'
  84148. };
  84149. //
  84150. // CSV export
  84151. //
  84152. DataTable.ext.buttons.csvHtml5 = {
  84153. bom: false,
  84154. className: 'buttons-csv buttons-html5',
  84155. available: function () {
  84156. return window.FileReader !== undefined && window.Blob;
  84157. },
  84158. text: function ( dt ) {
  84159. return dt.i18n( 'buttons.csv', 'CSV' );
  84160. },
  84161. action: function ( e, dt, button, config ) {
  84162. this.processing( true );
  84163. // Set the text
  84164. var output = _exportData( dt, config ).str;
  84165. var info = dt.buttons.exportInfo(config);
  84166. var charset = config.charset;
  84167. if ( config.customize ) {
  84168. output = config.customize( output, config );
  84169. }
  84170. if ( charset !== false ) {
  84171. if ( ! charset ) {
  84172. charset = document.characterSet || document.charset;
  84173. }
  84174. if ( charset ) {
  84175. charset = ';charset='+charset;
  84176. }
  84177. }
  84178. else {
  84179. charset = '';
  84180. }
  84181. if ( config.bom ) {
  84182. output = '\ufeff' + output;
  84183. }
  84184. _saveAs(
  84185. new Blob( [output], {type: 'text/csv'+charset} ),
  84186. info.filename,
  84187. true
  84188. );
  84189. this.processing( false );
  84190. },
  84191. filename: '*',
  84192. extension: '.csv',
  84193. exportOptions: {},
  84194. fieldSeparator: ',',
  84195. fieldBoundary: '"',
  84196. escapeChar: '"',
  84197. charset: null,
  84198. header: true,
  84199. footer: false
  84200. };
  84201. //
  84202. // Excel (xlsx) export
  84203. //
  84204. DataTable.ext.buttons.excelHtml5 = {
  84205. className: 'buttons-excel buttons-html5',
  84206. available: function () {
  84207. return window.FileReader !== undefined && _jsZip() !== undefined && ! _isDuffSafari() && _serialiser;
  84208. },
  84209. text: function ( dt ) {
  84210. return dt.i18n( 'buttons.excel', 'Excel' );
  84211. },
  84212. action: function ( e, dt, button, config ) {
  84213. this.processing( true );
  84214. var that = this;
  84215. var rowPos = 0;
  84216. var getXml = function ( type ) {
  84217. var str = excelStrings[ type ];
  84218. //str = str.replace( /xmlns:/g, 'xmlns_' ).replace( /mc:/g, 'mc_' );
  84219. return $.parseXML( str );
  84220. };
  84221. var rels = getXml('xl/worksheets/sheet1.xml');
  84222. var relsGet = rels.getElementsByTagName( "sheetData" )[0];
  84223. var xlsx = {
  84224. _rels: {
  84225. ".rels": getXml('_rels/.rels')
  84226. },
  84227. xl: {
  84228. _rels: {
  84229. "workbook.xml.rels": getXml('xl/_rels/workbook.xml.rels')
  84230. },
  84231. "workbook.xml": getXml('xl/workbook.xml'),
  84232. "styles.xml": getXml('xl/styles.xml'),
  84233. "worksheets": {
  84234. "sheet1.xml": rels
  84235. }
  84236. },
  84237. "[Content_Types].xml": getXml('[Content_Types].xml')
  84238. };
  84239. var data = dt.buttons.exportData( config.exportOptions );
  84240. var currentRow, rowNode;
  84241. var addRow = function ( row ) {
  84242. currentRow = rowPos+1;
  84243. rowNode = _createNode( rels, "row", { attr: {r:currentRow} } );
  84244. for ( var i=0, ien=row.length ; i<ien ; i++ ) {
  84245. // Concat both the Cell Columns as a letter and the Row of the cell.
  84246. var cellId = createCellPos(i) + '' + currentRow;
  84247. var cell = null;
  84248. // For null, undefined of blank cell, continue so it doesn't create the _createNode
  84249. if ( row[i] === null || row[i] === undefined || row[i] === '' ) {
  84250. if ( config.createEmptyCells === true ) {
  84251. row[i] = '';
  84252. }
  84253. else {
  84254. continue;
  84255. }
  84256. }
  84257. row[i] = $.trim( row[i] );
  84258. // Special number formatting options
  84259. for ( var j=0, jen=_excelSpecials.length ; j<jen ; j++ ) {
  84260. var special = _excelSpecials[j];
  84261. // TODO Need to provide the ability for the specials to say
  84262. // if they are returning a string, since at the moment it is
  84263. // assumed to be a number
  84264. if ( row[i].match && ! row[i].match(/^0\d+/) && row[i].match( special.match ) ) {
  84265. var val = row[i].replace(/[^\d\.\-]/g, '');
  84266. if ( special.fmt ) {
  84267. val = special.fmt( val );
  84268. }
  84269. cell = _createNode( rels, 'c', {
  84270. attr: {
  84271. r: cellId,
  84272. s: special.style
  84273. },
  84274. children: [
  84275. _createNode( rels, 'v', { text: val } )
  84276. ]
  84277. } );
  84278. break;
  84279. }
  84280. }
  84281. if ( ! cell ) {
  84282. if ( typeof row[i] === 'number' || (
  84283. row[i].match &&
  84284. row[i].match(/^-?\d+(\.\d+)?$/) &&
  84285. ! row[i].match(/^0\d+/) )
  84286. ) {
  84287. // Detect numbers - don't match numbers with leading zeros
  84288. // or a negative anywhere but the start
  84289. cell = _createNode( rels, 'c', {
  84290. attr: {
  84291. t: 'n',
  84292. r: cellId
  84293. },
  84294. children: [
  84295. _createNode( rels, 'v', { text: row[i] } )
  84296. ]
  84297. } );
  84298. }
  84299. else {
  84300. // String output - replace non standard characters for text output
  84301. var text = ! row[i].replace ?
  84302. row[i] :
  84303. row[i].replace(/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F-\x9F]/g, '');
  84304. cell = _createNode( rels, 'c', {
  84305. attr: {
  84306. t: 'inlineStr',
  84307. r: cellId
  84308. },
  84309. children:{
  84310. row: _createNode( rels, 'is', {
  84311. children: {
  84312. row: _createNode( rels, 't', {
  84313. text: text
  84314. } )
  84315. }
  84316. } )
  84317. }
  84318. } );
  84319. }
  84320. }
  84321. rowNode.appendChild( cell );
  84322. }
  84323. relsGet.appendChild(rowNode);
  84324. rowPos++;
  84325. };
  84326. $( 'sheets sheet', xlsx.xl['workbook.xml'] ).attr( 'name', _sheetname( config ) );
  84327. if ( config.customizeData ) {
  84328. config.customizeData( data );
  84329. }
  84330. var mergeCells = function ( row, colspan ) {
  84331. var mergeCells = $('mergeCells', rels);
  84332. mergeCells[0].appendChild( _createNode( rels, 'mergeCell', {
  84333. attr: {
  84334. ref: 'A'+row+':'+createCellPos(colspan)+row
  84335. }
  84336. } ) );
  84337. mergeCells.attr( 'count', parseFloat(mergeCells.attr( 'count' ))+1 );
  84338. $('row:eq('+(row-1)+') c', rels).attr( 's', '51' ); // centre
  84339. };
  84340. // Title and top messages
  84341. var exportInfo = dt.buttons.exportInfo( config );
  84342. if ( exportInfo.title ) {
  84343. addRow( [exportInfo.title], rowPos );
  84344. mergeCells( rowPos, data.header.length-1 );
  84345. }
  84346. if ( exportInfo.messageTop ) {
  84347. addRow( [exportInfo.messageTop], rowPos );
  84348. mergeCells( rowPos, data.header.length-1 );
  84349. }
  84350. // Table itself
  84351. if ( config.header ) {
  84352. addRow( data.header, rowPos );
  84353. $('row:last c', rels).attr( 's', '2' ); // bold
  84354. }
  84355. for ( var n=0, ie=data.body.length ; n<ie ; n++ ) {
  84356. addRow( data.body[n], rowPos );
  84357. }
  84358. if ( config.footer && data.footer ) {
  84359. addRow( data.footer, rowPos);
  84360. $('row:last c', rels).attr( 's', '2' ); // bold
  84361. }
  84362. // Below the table
  84363. if ( exportInfo.messageBottom ) {
  84364. addRow( [exportInfo.messageBottom], rowPos );
  84365. mergeCells( rowPos, data.header.length-1 );
  84366. }
  84367. // Set column widths
  84368. var cols = _createNode( rels, 'cols' );
  84369. $('worksheet', rels).prepend( cols );
  84370. for ( var i=0, ien=data.header.length ; i<ien ; i++ ) {
  84371. cols.appendChild( _createNode( rels, 'col', {
  84372. attr: {
  84373. min: i+1,
  84374. max: i+1,
  84375. width: _excelColWidth( data, i ),
  84376. customWidth: 1
  84377. }
  84378. } ) );
  84379. }
  84380. // Let the developer customise the document if they want to
  84381. if ( config.customize ) {
  84382. config.customize( xlsx );
  84383. }
  84384. // Excel doesn't like an empty mergeCells tag
  84385. if ( $('mergeCells', rels).children().length === 0 ) {
  84386. $('mergeCells', rels).remove();
  84387. }
  84388. var jszip = _jsZip();
  84389. var zip = new jszip();
  84390. var zipConfig = {
  84391. type: 'blob',
  84392. mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  84393. };
  84394. _addToZip( zip, xlsx );
  84395. if ( zip.generateAsync ) {
  84396. // JSZip 3+
  84397. zip
  84398. .generateAsync( zipConfig )
  84399. .then( function ( blob ) {
  84400. _saveAs( blob, exportInfo.filename );
  84401. that.processing( false );
  84402. } );
  84403. }
  84404. else {
  84405. // JSZip 2.5
  84406. _saveAs(
  84407. zip.generate( zipConfig ),
  84408. exportInfo.filename
  84409. );
  84410. this.processing( false );
  84411. }
  84412. },
  84413. filename: '*',
  84414. extension: '.xlsx',
  84415. exportOptions: {},
  84416. header: true,
  84417. footer: false,
  84418. title: '*',
  84419. messageTop: '*',
  84420. messageBottom: '*',
  84421. createEmptyCells: false
  84422. };
  84423. //
  84424. // PDF export - using pdfMake - http://pdfmake.org
  84425. //
  84426. DataTable.ext.buttons.pdfHtml5 = {
  84427. className: 'buttons-pdf buttons-html5',
  84428. available: function () {
  84429. return window.FileReader !== undefined && _pdfMake();
  84430. },
  84431. text: function ( dt ) {
  84432. return dt.i18n( 'buttons.pdf', 'PDF' );
  84433. },
  84434. action: function ( e, dt, button, config ) {
  84435. this.processing( true );
  84436. var that = this;
  84437. var data = dt.buttons.exportData( config.exportOptions );
  84438. var info = dt.buttons.exportInfo( config );
  84439. var rows = [];
  84440. if ( config.header ) {
  84441. rows.push( $.map( data.header, function ( d ) {
  84442. return {
  84443. text: typeof d === 'string' ? d : d+'',
  84444. style: 'tableHeader'
  84445. };
  84446. } ) );
  84447. }
  84448. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  84449. rows.push( $.map( data.body[i], function ( d ) {
  84450. return {
  84451. text: typeof d === 'string' ? d : d+'',
  84452. style: i % 2 ? 'tableBodyEven' : 'tableBodyOdd'
  84453. };
  84454. } ) );
  84455. }
  84456. if ( config.footer && data.footer) {
  84457. rows.push( $.map( data.footer, function ( d ) {
  84458. return {
  84459. text: typeof d === 'string' ? d : d+'',
  84460. style: 'tableFooter'
  84461. };
  84462. } ) );
  84463. }
  84464. var doc = {
  84465. pageSize: config.pageSize,
  84466. pageOrientation: config.orientation,
  84467. content: [
  84468. {
  84469. table: {
  84470. headerRows: 1,
  84471. body: rows
  84472. },
  84473. layout: 'noBorders'
  84474. }
  84475. ],
  84476. styles: {
  84477. tableHeader: {
  84478. bold: true,
  84479. fontSize: 11,
  84480. color: 'white',
  84481. fillColor: '#2d4154',
  84482. alignment: 'center'
  84483. },
  84484. tableBodyEven: {},
  84485. tableBodyOdd: {
  84486. fillColor: '#f3f3f3'
  84487. },
  84488. tableFooter: {
  84489. bold: true,
  84490. fontSize: 11,
  84491. color: 'white',
  84492. fillColor: '#2d4154'
  84493. },
  84494. title: {
  84495. alignment: 'center',
  84496. fontSize: 15
  84497. },
  84498. message: {}
  84499. },
  84500. defaultStyle: {
  84501. fontSize: 10
  84502. }
  84503. };
  84504. if ( info.messageTop ) {
  84505. doc.content.unshift( {
  84506. text: info.messageTop,
  84507. style: 'message',
  84508. margin: [ 0, 0, 0, 12 ]
  84509. } );
  84510. }
  84511. if ( info.messageBottom ) {
  84512. doc.content.push( {
  84513. text: info.messageBottom,
  84514. style: 'message',
  84515. margin: [ 0, 0, 0, 12 ]
  84516. } );
  84517. }
  84518. if ( info.title ) {
  84519. doc.content.unshift( {
  84520. text: info.title,
  84521. style: 'title',
  84522. margin: [ 0, 0, 0, 12 ]
  84523. } );
  84524. }
  84525. if ( config.customize ) {
  84526. config.customize( doc, config );
  84527. }
  84528. var pdf = _pdfMake().createPdf( doc );
  84529. if ( config.download === 'open' && ! _isDuffSafari() ) {
  84530. pdf.open();
  84531. }
  84532. else {
  84533. pdf.download( info.filename );
  84534. }
  84535. this.processing( false );
  84536. },
  84537. title: '*',
  84538. filename: '*',
  84539. extension: '.pdf',
  84540. exportOptions: {},
  84541. orientation: 'portrait',
  84542. pageSize: 'A4',
  84543. header: true,
  84544. footer: false,
  84545. messageTop: '*',
  84546. messageBottom: '*',
  84547. customize: null,
  84548. download: 'download'
  84549. };
  84550. return DataTable.Buttons;
  84551. }));
  84552. /*!
  84553. * Print button for Buttons and DataTables.
  84554. * 2016 SpryMedia Ltd - datatables.net/license
  84555. */
  84556. (function( factory ){
  84557. if ( typeof define === 'function' && define.amd ) {
  84558. // AMD
  84559. define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
  84560. return factory( $, window, document );
  84561. } );
  84562. }
  84563. else if ( typeof exports === 'object' ) {
  84564. // CommonJS
  84565. module.exports = function (root, $) {
  84566. if ( ! root ) {
  84567. root = window;
  84568. }
  84569. if ( ! $ || ! $.fn.dataTable ) {
  84570. $ = require('datatables.net')(root, $).$;
  84571. }
  84572. if ( ! $.fn.dataTable.Buttons ) {
  84573. require('datatables.net-buttons')(root, $);
  84574. }
  84575. return factory( $, root, root.document );
  84576. };
  84577. }
  84578. else {
  84579. // Browser
  84580. factory( jQuery, window, document );
  84581. }
  84582. }(function( $, window, document, undefined ) {
  84583. 'use strict';
  84584. var DataTable = $.fn.dataTable;
  84585. var _link = document.createElement( 'a' );
  84586. /**
  84587. * Clone link and style tags, taking into account the need to change the source
  84588. * path.
  84589. *
  84590. * @param {node} el Element to convert
  84591. */
  84592. var _styleToAbs = function( el ) {
  84593. var url;
  84594. var clone = $(el).clone()[0];
  84595. var linkHost;
  84596. if ( clone.nodeName.toLowerCase() === 'link' ) {
  84597. clone.href = _relToAbs( clone.href );
  84598. }
  84599. return clone.outerHTML;
  84600. };
  84601. /**
  84602. * Convert a URL from a relative to an absolute address so it will work
  84603. * correctly in the popup window which has no base URL.
  84604. *
  84605. * @param {string} href URL
  84606. */
  84607. var _relToAbs = function( href ) {
  84608. // Assign to a link on the original page so the browser will do all the
  84609. // hard work of figuring out where the file actually is
  84610. _link.href = href;
  84611. var linkHost = _link.host;
  84612. // IE doesn't have a trailing slash on the host
  84613. // Chrome has it on the pathname
  84614. if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
  84615. linkHost += '/';
  84616. }
  84617. return _link.protocol+"//"+linkHost+_link.pathname+_link.search;
  84618. };
  84619. DataTable.ext.buttons.print = {
  84620. className: 'buttons-print',
  84621. text: function ( dt ) {
  84622. return dt.i18n( 'buttons.print', 'Print' );
  84623. },
  84624. action: function ( e, dt, button, config ) {
  84625. var data = dt.buttons.exportData(
  84626. $.extend( {decodeEntities: false}, config.exportOptions ) // XSS protection
  84627. );
  84628. var exportInfo = dt.buttons.exportInfo( config );
  84629. var addRow = function ( d, tag ) {
  84630. var str = '<tr>';
  84631. for ( var i=0, ien=d.length ; i<ien ; i++ ) {
  84632. str += '<'+tag+'>'+d[i]+'</'+tag+'>';
  84633. }
  84634. return str + '</tr>';
  84635. };
  84636. // Construct a table for printing
  84637. var html = '<table class="'+dt.table().node().className+'">';
  84638. if ( config.header ) {
  84639. html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
  84640. }
  84641. html += '<tbody>';
  84642. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  84643. html += addRow( data.body[i], 'td' );
  84644. }
  84645. html += '</tbody>';
  84646. if ( config.footer && data.footer ) {
  84647. html += '<tfoot>'+ addRow( data.footer, 'th' ) +'</tfoot>';
  84648. }
  84649. html += '</table>';
  84650. // Open a new window for the printable table
  84651. var win = window.open( '', '' );
  84652. win.document.close();
  84653. // Inject the title and also a copy of the style and link tags from this
  84654. // document so the table can retain its base styling. Note that we have
  84655. // to use string manipulation as IE won't allow elements to be created
  84656. // in the host document and then appended to the new window.
  84657. var head = '<title>'+exportInfo.title+'</title>';
  84658. $('style, link').each( function () {
  84659. head += _styleToAbs( this );
  84660. } );
  84661. try {
  84662. win.document.head.innerHTML = head; // Work around for Edge
  84663. }
  84664. catch (e) {
  84665. $(win.document.head).html( head ); // Old IE
  84666. }
  84667. // Inject the table and other surrounding information
  84668. win.document.body.innerHTML =
  84669. '<h1>'+exportInfo.title+'</h1>'+
  84670. '<div>'+(exportInfo.messageTop || '')+'</div>'+
  84671. html+
  84672. '<div>'+(exportInfo.messageBottom || '')+'</div>';
  84673. $(win.document.body).addClass('dt-print-view');
  84674. $('img', win.document.body).each( function ( i, img ) {
  84675. img.setAttribute( 'src', _relToAbs( img.getAttribute('src') ) );
  84676. } );
  84677. if ( config.customize ) {
  84678. config.customize( win );
  84679. }
  84680. // Allow stylesheets time to load
  84681. setTimeout( function () {
  84682. if ( config.autoPrint ) {
  84683. win.print(); // blocking - so close will not
  84684. win.close(); // execute until this is done
  84685. }
  84686. }, 1000 );
  84687. },
  84688. title: '*',
  84689. messageTop: '*',
  84690. messageBottom: '*',
  84691. exportOptions: {},
  84692. header: true,
  84693. footer: false,
  84694. autoPrint: true,
  84695. customize: null
  84696. };
  84697. return DataTable.Buttons;
  84698. }));
  84699. /*! ColReorder 1.4.1
  84700. * ©2010-2017 SpryMedia Ltd - datatables.net/license
  84701. */
  84702. /**
  84703. * @summary ColReorder
  84704. * @description Provide the ability to reorder columns in a DataTable
  84705. * @version 1.4.1
  84706. * @file dataTables.colReorder.js
  84707. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  84708. * @contact www.sprymedia.co.uk/contact
  84709. * @copyright Copyright 2010-2017 SpryMedia Ltd.
  84710. *
  84711. * This source file is free software, available under the following license:
  84712. * MIT license - http://datatables.net/license/mit
  84713. *
  84714. * This source file is distributed in the hope that it will be useful, but
  84715. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  84716. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  84717. *
  84718. * For details please refer to: http://www.datatables.net
  84719. */
  84720. (function( factory ){
  84721. if ( typeof define === 'function' && define.amd ) {
  84722. // AMD
  84723. define( ['jquery', 'datatables.net'], function ( $ ) {
  84724. return factory( $, window, document );
  84725. } );
  84726. }
  84727. else if ( typeof exports === 'object' ) {
  84728. // CommonJS
  84729. module.exports = function (root, $) {
  84730. if ( ! root ) {
  84731. root = window;
  84732. }
  84733. if ( ! $ || ! $.fn.dataTable ) {
  84734. $ = require('datatables.net')(root, $).$;
  84735. }
  84736. return factory( $, root, root.document );
  84737. };
  84738. }
  84739. else {
  84740. // Browser
  84741. factory( jQuery, window, document );
  84742. }
  84743. }(function( $, window, document, undefined ) {
  84744. 'use strict';
  84745. var DataTable = $.fn.dataTable;
  84746. /**
  84747. * Switch the key value pairing of an index array to be value key (i.e. the old value is now the
  84748. * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ].
  84749. * @method fnInvertKeyValues
  84750. * @param array aIn Array to switch around
  84751. * @returns array
  84752. */
  84753. function fnInvertKeyValues( aIn )
  84754. {
  84755. var aRet=[];
  84756. for ( var i=0, iLen=aIn.length ; i<iLen ; i++ )
  84757. {
  84758. aRet[ aIn[i] ] = i;
  84759. }
  84760. return aRet;
  84761. }
  84762. /**
  84763. * Modify an array by switching the position of two elements
  84764. * @method fnArraySwitch
  84765. * @param array aArray Array to consider, will be modified by reference (i.e. no return)
  84766. * @param int iFrom From point
  84767. * @param int iTo Insert point
  84768. * @returns void
  84769. */
  84770. function fnArraySwitch( aArray, iFrom, iTo )
  84771. {
  84772. var mStore = aArray.splice( iFrom, 1 )[0];
  84773. aArray.splice( iTo, 0, mStore );
  84774. }
  84775. /**
  84776. * Switch the positions of nodes in a parent node (note this is specifically designed for
  84777. * table rows). Note this function considers all element nodes under the parent!
  84778. * @method fnDomSwitch
  84779. * @param string sTag Tag to consider
  84780. * @param int iFrom Element to move
  84781. * @param int Point to element the element to (before this point), can be null for append
  84782. * @returns void
  84783. */
  84784. function fnDomSwitch( nParent, iFrom, iTo )
  84785. {
  84786. var anTags = [];
  84787. for ( var i=0, iLen=nParent.childNodes.length ; i<iLen ; i++ )
  84788. {
  84789. if ( nParent.childNodes[i].nodeType == 1 )
  84790. {
  84791. anTags.push( nParent.childNodes[i] );
  84792. }
  84793. }
  84794. var nStore = anTags[ iFrom ];
  84795. if ( iTo !== null )
  84796. {
  84797. nParent.insertBefore( nStore, anTags[iTo] );
  84798. }
  84799. else
  84800. {
  84801. nParent.appendChild( nStore );
  84802. }
  84803. }
  84804. /**
  84805. * Plug-in for DataTables which will reorder the internal column structure by taking the column
  84806. * from one position (iFrom) and insert it into a given point (iTo).
  84807. * @method $.fn.dataTableExt.oApi.fnColReorder
  84808. * @param object oSettings DataTables settings object - automatically added by DataTables!
  84809. * @param int iFrom Take the column to be repositioned from this point
  84810. * @param int iTo and insert it into this point
  84811. * @param bool drop Indicate if the reorder is the final one (i.e. a drop)
  84812. * not a live reorder
  84813. * @param bool invalidateRows speeds up processing if false passed
  84814. * @returns void
  84815. */
  84816. $.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo, drop, invalidateRows )
  84817. {
  84818. var i, iLen, j, jLen, jen, iCols=oSettings.aoColumns.length, nTrs, oCol;
  84819. var attrMap = function ( obj, prop, mapping ) {
  84820. if ( ! obj[ prop ] || typeof obj[ prop ] === 'function' ) {
  84821. return;
  84822. }
  84823. var a = obj[ prop ].split('.');
  84824. var num = a.shift();
  84825. if ( isNaN( num*1 ) ) {
  84826. return;
  84827. }
  84828. obj[ prop ] = mapping[ num*1 ]+'.'+a.join('.');
  84829. };
  84830. /* Sanity check in the input */
  84831. if ( iFrom == iTo )
  84832. {
  84833. /* Pointless reorder */
  84834. return;
  84835. }
  84836. if ( iFrom < 0 || iFrom >= iCols )
  84837. {
  84838. this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom );
  84839. return;
  84840. }
  84841. if ( iTo < 0 || iTo >= iCols )
  84842. {
  84843. this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo );
  84844. return;
  84845. }
  84846. /*
  84847. * Calculate the new column array index, so we have a mapping between the old and new
  84848. */
  84849. var aiMapping = [];
  84850. for ( i=0, iLen=iCols ; i<iLen ; i++ )
  84851. {
  84852. aiMapping[i] = i;
  84853. }
  84854. fnArraySwitch( aiMapping, iFrom, iTo );
  84855. var aiInvertMapping = fnInvertKeyValues( aiMapping );
  84856. /*
  84857. * Convert all internal indexing to the new column order indexes
  84858. */
  84859. /* Sorting */
  84860. for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
  84861. {
  84862. oSettings.aaSorting[i][0] = aiInvertMapping[ oSettings.aaSorting[i][0] ];
  84863. }
  84864. /* Fixed sorting */
  84865. if ( oSettings.aaSortingFixed !== null )
  84866. {
  84867. for ( i=0, iLen=oSettings.aaSortingFixed.length ; i<iLen ; i++ )
  84868. {
  84869. oSettings.aaSortingFixed[i][0] = aiInvertMapping[ oSettings.aaSortingFixed[i][0] ];
  84870. }
  84871. }
  84872. /* Data column sorting (the column which the sort for a given column should take place on) */
  84873. for ( i=0, iLen=iCols ; i<iLen ; i++ )
  84874. {
  84875. oCol = oSettings.aoColumns[i];
  84876. for ( j=0, jLen=oCol.aDataSort.length ; j<jLen ; j++ )
  84877. {
  84878. oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ];
  84879. }
  84880. // Update the column indexes
  84881. oCol.idx = aiInvertMapping[ oCol.idx ];
  84882. }
  84883. // Update 1.10 optimised sort class removal variable
  84884. $.each( oSettings.aLastSort, function (i, val) {
  84885. oSettings.aLastSort[i].src = aiInvertMapping[ val.src ];
  84886. } );
  84887. /* Update the Get and Set functions for each column */
  84888. for ( i=0, iLen=iCols ; i<iLen ; i++ )
  84889. {
  84890. oCol = oSettings.aoColumns[i];
  84891. if ( typeof oCol.mData == 'number' ) {
  84892. oCol.mData = aiInvertMapping[ oCol.mData ];
  84893. }
  84894. else if ( $.isPlainObject( oCol.mData ) ) {
  84895. // HTML5 data sourced
  84896. attrMap( oCol.mData, '_', aiInvertMapping );
  84897. attrMap( oCol.mData, 'filter', aiInvertMapping );
  84898. attrMap( oCol.mData, 'sort', aiInvertMapping );
  84899. attrMap( oCol.mData, 'type', aiInvertMapping );
  84900. }
  84901. }
  84902. /*
  84903. * Move the DOM elements
  84904. */
  84905. if ( oSettings.aoColumns[iFrom].bVisible )
  84906. {
  84907. /* Calculate the current visible index and the point to insert the node before. The insert
  84908. * before needs to take into account that there might not be an element to insert before,
  84909. * in which case it will be null, and an appendChild should be used
  84910. */
  84911. var iVisibleIndex = this.oApi._fnColumnIndexToVisible( oSettings, iFrom );
  84912. var iInsertBeforeIndex = null;
  84913. i = iTo < iFrom ? iTo : iTo + 1;
  84914. while ( iInsertBeforeIndex === null && i < iCols )
  84915. {
  84916. iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible( oSettings, i );
  84917. i++;
  84918. }
  84919. /* Header */
  84920. nTrs = oSettings.nTHead.getElementsByTagName('tr');
  84921. for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
  84922. {
  84923. fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
  84924. }
  84925. /* Footer */
  84926. if ( oSettings.nTFoot !== null )
  84927. {
  84928. nTrs = oSettings.nTFoot.getElementsByTagName('tr');
  84929. for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
  84930. {
  84931. fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex );
  84932. }
  84933. }
  84934. /* Body */
  84935. for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
  84936. {
  84937. if ( oSettings.aoData[i].nTr !== null )
  84938. {
  84939. fnDomSwitch( oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex );
  84940. }
  84941. }
  84942. }
  84943. /*
  84944. * Move the internal array elements
  84945. */
  84946. /* Columns */
  84947. fnArraySwitch( oSettings.aoColumns, iFrom, iTo );
  84948. // regenerate the get / set functions
  84949. for ( i=0, iLen=iCols ; i<iLen ; i++ ) {
  84950. oSettings.oApi._fnColumnOptions( oSettings, i, {} );
  84951. }
  84952. /* Search columns */
  84953. fnArraySwitch( oSettings.aoPreSearchCols, iFrom, iTo );
  84954. /* Array array - internal data anodes cache */
  84955. for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
  84956. {
  84957. var data = oSettings.aoData[i];
  84958. var cells = data.anCells;
  84959. if ( cells ) {
  84960. fnArraySwitch( cells, iFrom, iTo );
  84961. // Longer term, should this be moved into the DataTables' invalidate
  84962. // methods?
  84963. for ( j=0, jen=cells.length ; j<jen ; j++ ) {
  84964. if ( cells[j] && cells[j]._DT_CellIndex ) {
  84965. cells[j]._DT_CellIndex.column = j;
  84966. }
  84967. }
  84968. }
  84969. // For DOM sourced data, the invalidate will reread the cell into
  84970. // the data array, but for data sources as an array, they need to
  84971. // be flipped
  84972. if ( data.src !== 'dom' && $.isArray( data._aData ) ) {
  84973. fnArraySwitch( data._aData, iFrom, iTo );
  84974. }
  84975. }
  84976. /* Reposition the header elements in the header layout array */
  84977. for ( i=0, iLen=oSettings.aoHeader.length ; i<iLen ; i++ )
  84978. {
  84979. fnArraySwitch( oSettings.aoHeader[i], iFrom, iTo );
  84980. }
  84981. if ( oSettings.aoFooter !== null )
  84982. {
  84983. for ( i=0, iLen=oSettings.aoFooter.length ; i<iLen ; i++ )
  84984. {
  84985. fnArraySwitch( oSettings.aoFooter[i], iFrom, iTo );
  84986. }
  84987. }
  84988. if ( invalidateRows || invalidateRows === undefined )
  84989. {
  84990. $.fn.dataTable.Api( oSettings ).rows().invalidate();
  84991. }
  84992. /*
  84993. * Update DataTables' event handlers
  84994. */
  84995. /* Sort listener */
  84996. for ( i=0, iLen=iCols ; i<iLen ; i++ )
  84997. {
  84998. $(oSettings.aoColumns[i].nTh).off('click.DT');
  84999. this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
  85000. }
  85001. /* Fire an event so other plug-ins can update */
  85002. $(oSettings.oInstance).trigger( 'column-reorder.dt', [ oSettings, {
  85003. from: iFrom,
  85004. to: iTo,
  85005. mapping: aiInvertMapping,
  85006. drop: drop,
  85007. // Old style parameters for compatibility
  85008. iFrom: iFrom,
  85009. iTo: iTo,
  85010. aiInvertMapping: aiInvertMapping
  85011. } ] );
  85012. };
  85013. /**
  85014. * ColReorder provides column visibility control for DataTables
  85015. * @class ColReorder
  85016. * @constructor
  85017. * @param {object} dt DataTables settings object
  85018. * @param {object} opts ColReorder options
  85019. */
  85020. var ColReorder = function( dt, opts )
  85021. {
  85022. var settings = new $.fn.dataTable.Api( dt ).settings()[0];
  85023. // Ensure that we can't initialise on the same table twice
  85024. if ( settings._colReorder ) {
  85025. return settings._colReorder;
  85026. }
  85027. // Allow the options to be a boolean for defaults
  85028. if ( opts === true ) {
  85029. opts = {};
  85030. }
  85031. // Convert from camelCase to Hungarian, just as DataTables does
  85032. var camelToHungarian = $.fn.dataTable.camelToHungarian;
  85033. if ( camelToHungarian ) {
  85034. camelToHungarian( ColReorder.defaults, ColReorder.defaults, true );
  85035. camelToHungarian( ColReorder.defaults, opts || {} );
  85036. }
  85037. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85038. * Public class variables
  85039. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85040. /**
  85041. * @namespace Settings object which contains customisable information for ColReorder instance
  85042. */
  85043. this.s = {
  85044. /**
  85045. * DataTables settings object
  85046. * @property dt
  85047. * @type Object
  85048. * @default null
  85049. */
  85050. "dt": null,
  85051. /**
  85052. * Initialisation object used for this instance
  85053. * @property init
  85054. * @type object
  85055. * @default {}
  85056. */
  85057. "init": $.extend( true, {}, ColReorder.defaults, opts ),
  85058. /**
  85059. * Number of columns to fix (not allow to be reordered)
  85060. * @property fixed
  85061. * @type int
  85062. * @default 0
  85063. */
  85064. "fixed": 0,
  85065. /**
  85066. * Number of columns to fix counting from right (not allow to be reordered)
  85067. * @property fixedRight
  85068. * @type int
  85069. * @default 0
  85070. */
  85071. "fixedRight": 0,
  85072. /**
  85073. * Callback function for once the reorder has been done
  85074. * @property reorderCallback
  85075. * @type function
  85076. * @default null
  85077. */
  85078. "reorderCallback": null,
  85079. /**
  85080. * @namespace Information used for the mouse drag
  85081. */
  85082. "mouse": {
  85083. "startX": -1,
  85084. "startY": -1,
  85085. "offsetX": -1,
  85086. "offsetY": -1,
  85087. "target": -1,
  85088. "targetIndex": -1,
  85089. "fromIndex": -1
  85090. },
  85091. /**
  85092. * Information which is used for positioning the insert cusor and knowing where to do the
  85093. * insert. Array of objects with the properties:
  85094. * x: x-axis position
  85095. * to: insert point
  85096. * @property aoTargets
  85097. * @type array
  85098. * @default []
  85099. */
  85100. "aoTargets": []
  85101. };
  85102. /**
  85103. * @namespace Common and useful DOM elements for the class instance
  85104. */
  85105. this.dom = {
  85106. /**
  85107. * Dragging element (the one the mouse is moving)
  85108. * @property drag
  85109. * @type element
  85110. * @default null
  85111. */
  85112. "drag": null,
  85113. /**
  85114. * The insert cursor
  85115. * @property pointer
  85116. * @type element
  85117. * @default null
  85118. */
  85119. "pointer": null
  85120. };
  85121. /* Constructor logic */
  85122. this.s.dt = settings;
  85123. this.s.dt._colReorder = this;
  85124. this._fnConstruct();
  85125. return this;
  85126. };
  85127. $.extend( ColReorder.prototype, {
  85128. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85129. * Public methods
  85130. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85131. /**
  85132. * Reset the column ordering to the original ordering that was detected on
  85133. * start up.
  85134. * @return {this} Returns `this` for chaining.
  85135. *
  85136. * @example
  85137. * // DataTables initialisation with ColReorder
  85138. * var table = $('#example').dataTable( {
  85139. * "sDom": 'Rlfrtip'
  85140. * } );
  85141. *
  85142. * // Add click event to a button to reset the ordering
  85143. * $('#resetOrdering').click( function (e) {
  85144. * e.preventDefault();
  85145. * $.fn.dataTable.ColReorder( table ).fnReset();
  85146. * } );
  85147. */
  85148. "fnReset": function ()
  85149. {
  85150. this._fnOrderColumns( this.fnOrder() );
  85151. return this;
  85152. },
  85153. /**
  85154. * `Deprecated` - Get the current order of the columns, as an array.
  85155. * @return {array} Array of column identifiers
  85156. * @deprecated `fnOrder` should be used in preference to this method.
  85157. * `fnOrder` acts as a getter/setter.
  85158. */
  85159. "fnGetCurrentOrder": function ()
  85160. {
  85161. return this.fnOrder();
  85162. },
  85163. /**
  85164. * Get the current order of the columns, as an array. Note that the values
  85165. * given in the array are unique identifiers for each column. Currently
  85166. * these are the original ordering of the columns that was detected on
  85167. * start up, but this could potentially change in future.
  85168. * @return {array} Array of column identifiers
  85169. *
  85170. * @example
  85171. * // Get column ordering for the table
  85172. * var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder();
  85173. *//**
  85174. * Set the order of the columns, from the positions identified in the
  85175. * ordering array given. Note that ColReorder takes a brute force approach
  85176. * to reordering, so it is possible multiple reordering events will occur
  85177. * before the final order is settled upon.
  85178. * @param {array} [set] Array of column identifiers in the new order. Note
  85179. * that every column must be included, uniquely, in this array.
  85180. * @return {this} Returns `this` for chaining.
  85181. *
  85182. * @example
  85183. * // Swap the first and second columns
  85184. * $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] );
  85185. *
  85186. * @example
  85187. * // Move the first column to the end for the table `#example`
  85188. * var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder();
  85189. * var first = curr.shift();
  85190. * curr.push( first );
  85191. * $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr );
  85192. *
  85193. * @example
  85194. * // Reverse the table's order
  85195. * $.fn.dataTable.ColReorder( '#example' ).fnOrder(
  85196. * $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse()
  85197. * );
  85198. */
  85199. "fnOrder": function ( set, original )
  85200. {
  85201. var a = [], i, ien, j, jen;
  85202. var columns = this.s.dt.aoColumns;
  85203. if ( set === undefined ){
  85204. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  85205. a.push( columns[i]._ColReorder_iOrigCol );
  85206. }
  85207. return a;
  85208. }
  85209. // The order given is based on the original indexes, rather than the
  85210. // existing ones, so we need to translate from the original to current
  85211. // before then doing the order
  85212. if ( original ) {
  85213. var order = this.fnOrder();
  85214. for ( i=0, ien=set.length ; i<ien ; i++ ) {
  85215. a.push( $.inArray( set[i], order ) );
  85216. }
  85217. set = a;
  85218. }
  85219. this._fnOrderColumns( fnInvertKeyValues( set ) );
  85220. return this;
  85221. },
  85222. /**
  85223. * Convert from the original column index, to the original
  85224. *
  85225. * @param {int|array} idx Index(es) to convert
  85226. * @param {string} dir Transpose direction - `fromOriginal` / `toCurrent`
  85227. * or `'toOriginal` / `fromCurrent`
  85228. * @return {int|array} Converted values
  85229. */
  85230. fnTranspose: function ( idx, dir )
  85231. {
  85232. if ( ! dir ) {
  85233. dir = 'toCurrent';
  85234. }
  85235. var order = this.fnOrder();
  85236. var columns = this.s.dt.aoColumns;
  85237. if ( dir === 'toCurrent' ) {
  85238. // Given an original index, want the current
  85239. return ! $.isArray( idx ) ?
  85240. $.inArray( idx, order ) :
  85241. $.map( idx, function ( index ) {
  85242. return $.inArray( index, order );
  85243. } );
  85244. }
  85245. else {
  85246. // Given a current index, want the original
  85247. return ! $.isArray( idx ) ?
  85248. columns[idx]._ColReorder_iOrigCol :
  85249. $.map( idx, function ( index ) {
  85250. return columns[index]._ColReorder_iOrigCol;
  85251. } );
  85252. }
  85253. },
  85254. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85255. * Private methods (they are of course public in JS, but recommended as private)
  85256. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85257. /**
  85258. * Constructor logic
  85259. * @method _fnConstruct
  85260. * @returns void
  85261. * @private
  85262. */
  85263. "_fnConstruct": function ()
  85264. {
  85265. var that = this;
  85266. var iLen = this.s.dt.aoColumns.length;
  85267. var table = this.s.dt.nTable;
  85268. var i;
  85269. /* Columns discounted from reordering - counting left to right */
  85270. if ( this.s.init.iFixedColumns )
  85271. {
  85272. this.s.fixed = this.s.init.iFixedColumns;
  85273. }
  85274. if ( this.s.init.iFixedColumnsLeft )
  85275. {
  85276. this.s.fixed = this.s.init.iFixedColumnsLeft;
  85277. }
  85278. /* Columns discounted from reordering - counting right to left */
  85279. this.s.fixedRight = this.s.init.iFixedColumnsRight ?
  85280. this.s.init.iFixedColumnsRight :
  85281. 0;
  85282. /* Drop callback initialisation option */
  85283. if ( this.s.init.fnReorderCallback )
  85284. {
  85285. this.s.reorderCallback = this.s.init.fnReorderCallback;
  85286. }
  85287. /* Add event handlers for the drag and drop, and also mark the original column order */
  85288. for ( i = 0; i < iLen; i++ )
  85289. {
  85290. if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight )
  85291. {
  85292. this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh );
  85293. }
  85294. /* Mark the original column order for later reference */
  85295. this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i;
  85296. }
  85297. /* State saving */
  85298. this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) {
  85299. that._fnStateSave.call( that, oData );
  85300. }, "ColReorder_State" );
  85301. /* An initial column order has been specified */
  85302. var aiOrder = null;
  85303. if ( this.s.init.aiOrder )
  85304. {
  85305. aiOrder = this.s.init.aiOrder.slice();
  85306. }
  85307. /* State loading, overrides the column order given */
  85308. if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' &&
  85309. this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length )
  85310. {
  85311. aiOrder = this.s.dt.oLoadedState.ColReorder;
  85312. }
  85313. /* If we have an order to apply - do so */
  85314. if ( aiOrder )
  85315. {
  85316. /* We might be called during or after the DataTables initialisation. If before, then we need
  85317. * to wait until the draw is done, if after, then do what we need to do right away
  85318. */
  85319. if ( !that.s.dt._bInitComplete )
  85320. {
  85321. var bDone = false;
  85322. $(table).on( 'draw.dt.colReorder', function () {
  85323. if ( !that.s.dt._bInitComplete && !bDone )
  85324. {
  85325. bDone = true;
  85326. var resort = fnInvertKeyValues( aiOrder );
  85327. that._fnOrderColumns.call( that, resort );
  85328. }
  85329. } );
  85330. }
  85331. else
  85332. {
  85333. var resort = fnInvertKeyValues( aiOrder );
  85334. that._fnOrderColumns.call( that, resort );
  85335. }
  85336. }
  85337. else {
  85338. this._fnSetColumnIndexes();
  85339. }
  85340. // Destroy clean up
  85341. $(table).on( 'destroy.dt.colReorder', function () {
  85342. $(table).off( 'destroy.dt.colReorder draw.dt.colReorder' );
  85343. $(that.s.dt.nTHead).find( '*' ).off( '.ColReorder' );
  85344. $.each( that.s.dt.aoColumns, function (i, column) {
  85345. $(column.nTh).removeAttr('data-column-index');
  85346. } );
  85347. that.s.dt._colReorder = null;
  85348. that.s = null;
  85349. } );
  85350. },
  85351. /**
  85352. * Set the column order from an array
  85353. * @method _fnOrderColumns
  85354. * @param array a An array of integers which dictate the column order that should be applied
  85355. * @returns void
  85356. * @private
  85357. */
  85358. "_fnOrderColumns": function ( a )
  85359. {
  85360. var changed = false;
  85361. if ( a.length != this.s.dt.aoColumns.length )
  85362. {
  85363. this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+
  85364. "match known number of columns. Skipping." );
  85365. return;
  85366. }
  85367. for ( var i=0, iLen=a.length ; i<iLen ; i++ )
  85368. {
  85369. var currIndex = $.inArray( i, a );
  85370. if ( i != currIndex )
  85371. {
  85372. /* Reorder our switching array */
  85373. fnArraySwitch( a, currIndex, i );
  85374. /* Do the column reorder in the table */
  85375. this.s.dt.oInstance.fnColReorder( currIndex, i, true, false );
  85376. changed = true;
  85377. }
  85378. }
  85379. $.fn.dataTable.Api( this.s.dt ).rows().invalidate();
  85380. this._fnSetColumnIndexes();
  85381. // Has anything actually changed? If not, then nothing else to do
  85382. if ( ! changed ) {
  85383. return;
  85384. }
  85385. /* When scrolling we need to recalculate the column sizes to allow for the shift */
  85386. if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
  85387. {
  85388. this.s.dt.oInstance.fnAdjustColumnSizing( false );
  85389. }
  85390. /* Save the state */
  85391. this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
  85392. if ( this.s.reorderCallback !== null )
  85393. {
  85394. this.s.reorderCallback.call( this );
  85395. }
  85396. },
  85397. /**
  85398. * Because we change the indexes of columns in the table, relative to their starting point
  85399. * we need to reorder the state columns to what they are at the starting point so we can
  85400. * then rearrange them again on state load!
  85401. * @method _fnStateSave
  85402. * @param object oState DataTables state
  85403. * @returns string JSON encoded cookie string for DataTables
  85404. * @private
  85405. */
  85406. "_fnStateSave": function ( oState )
  85407. {
  85408. var i, iLen, aCopy, iOrigColumn;
  85409. var oSettings = this.s.dt;
  85410. var columns = oSettings.aoColumns;
  85411. oState.ColReorder = [];
  85412. /* Sorting */
  85413. if ( oState.aaSorting ) {
  85414. // 1.10.0-
  85415. for ( i=0 ; i<oState.aaSorting.length ; i++ ) {
  85416. oState.aaSorting[i][0] = columns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol;
  85417. }
  85418. var aSearchCopy = $.extend( true, [], oState.aoSearchCols );
  85419. for ( i=0, iLen=columns.length ; i<iLen ; i++ )
  85420. {
  85421. iOrigColumn = columns[i]._ColReorder_iOrigCol;
  85422. /* Column filter */
  85423. oState.aoSearchCols[ iOrigColumn ] = aSearchCopy[i];
  85424. /* Visibility */
  85425. oState.abVisCols[ iOrigColumn ] = columns[i].bVisible;
  85426. /* Column reordering */
  85427. oState.ColReorder.push( iOrigColumn );
  85428. }
  85429. }
  85430. else if ( oState.order ) {
  85431. // 1.10.1+
  85432. for ( i=0 ; i<oState.order.length ; i++ ) {
  85433. oState.order[i][0] = columns[ oState.order[i][0] ]._ColReorder_iOrigCol;
  85434. }
  85435. var stateColumnsCopy = $.extend( true, [], oState.columns );
  85436. for ( i=0, iLen=columns.length ; i<iLen ; i++ )
  85437. {
  85438. iOrigColumn = columns[i]._ColReorder_iOrigCol;
  85439. /* Columns */
  85440. oState.columns[ iOrigColumn ] = stateColumnsCopy[i];
  85441. /* Column reordering */
  85442. oState.ColReorder.push( iOrigColumn );
  85443. }
  85444. }
  85445. },
  85446. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85447. * Mouse drop and drag
  85448. */
  85449. /**
  85450. * Add a mouse down listener to a particluar TH element
  85451. * @method _fnMouseListener
  85452. * @param int i Column index
  85453. * @param element nTh TH element clicked on
  85454. * @returns void
  85455. * @private
  85456. */
  85457. "_fnMouseListener": function ( i, nTh )
  85458. {
  85459. var that = this;
  85460. $(nTh)
  85461. .on( 'mousedown.ColReorder', function (e) {
  85462. that._fnMouseDown.call( that, e, nTh );
  85463. } )
  85464. .on( 'touchstart.ColReorder', function (e) {
  85465. that._fnMouseDown.call( that, e, nTh );
  85466. } );
  85467. },
  85468. /**
  85469. * Mouse down on a TH element in the table header
  85470. * @method _fnMouseDown
  85471. * @param event e Mouse event
  85472. * @param element nTh TH element to be dragged
  85473. * @returns void
  85474. * @private
  85475. */
  85476. "_fnMouseDown": function ( e, nTh )
  85477. {
  85478. var that = this;
  85479. /* Store information about the mouse position */
  85480. var target = $(e.target).closest('th, td');
  85481. var offset = target.offset();
  85482. var idx = parseInt( $(nTh).attr('data-column-index'), 10 );
  85483. if ( idx === undefined ) {
  85484. return;
  85485. }
  85486. this.s.mouse.startX = this._fnCursorPosition( e, 'pageX' );
  85487. this.s.mouse.startY = this._fnCursorPosition( e, 'pageY' );
  85488. this.s.mouse.offsetX = this._fnCursorPosition( e, 'pageX' ) - offset.left;
  85489. this.s.mouse.offsetY = this._fnCursorPosition( e, 'pageY' ) - offset.top;
  85490. this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0];
  85491. this.s.mouse.targetIndex = idx;
  85492. this.s.mouse.fromIndex = idx;
  85493. this._fnRegions();
  85494. /* Add event handlers to the document */
  85495. $(document)
  85496. .on( 'mousemove.ColReorder touchmove.ColReorder', function (e) {
  85497. that._fnMouseMove.call( that, e );
  85498. } )
  85499. .on( 'mouseup.ColReorder touchend.ColReorder', function (e) {
  85500. that._fnMouseUp.call( that, e );
  85501. } );
  85502. },
  85503. /**
  85504. * Deal with a mouse move event while dragging a node
  85505. * @method _fnMouseMove
  85506. * @param event e Mouse event
  85507. * @returns void
  85508. * @private
  85509. */
  85510. "_fnMouseMove": function ( e )
  85511. {
  85512. var that = this;
  85513. if ( this.dom.drag === null )
  85514. {
  85515. /* Only create the drag element if the mouse has moved a specific distance from the start
  85516. * point - this allows the user to make small mouse movements when sorting and not have a
  85517. * possibly confusing drag element showing up
  85518. */
  85519. if ( Math.pow(
  85520. Math.pow(this._fnCursorPosition( e, 'pageX') - this.s.mouse.startX, 2) +
  85521. Math.pow(this._fnCursorPosition( e, 'pageY') - this.s.mouse.startY, 2), 0.5 ) < 5 )
  85522. {
  85523. return;
  85524. }
  85525. this._fnCreateDragNode();
  85526. }
  85527. /* Position the element - we respect where in the element the click occured */
  85528. this.dom.drag.css( {
  85529. left: this._fnCursorPosition( e, 'pageX' ) - this.s.mouse.offsetX,
  85530. top: this._fnCursorPosition( e, 'pageY' ) - this.s.mouse.offsetY
  85531. } );
  85532. /* Based on the current mouse position, calculate where the insert should go */
  85533. var bSet = false;
  85534. var lastToIndex = this.s.mouse.toIndex;
  85535. for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ )
  85536. {
  85537. if ( this._fnCursorPosition(e, 'pageX') < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) )
  85538. {
  85539. this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x );
  85540. this.s.mouse.toIndex = this.s.aoTargets[i-1].to;
  85541. bSet = true;
  85542. break;
  85543. }
  85544. }
  85545. // The insert element wasn't positioned in the array (less than
  85546. // operator), so we put it at the end
  85547. if ( !bSet )
  85548. {
  85549. this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x );
  85550. this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to;
  85551. }
  85552. // Perform reordering if realtime updating is on and the column has moved
  85553. if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) {
  85554. this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, false );
  85555. this.s.mouse.fromIndex = this.s.mouse.toIndex;
  85556. this._fnRegions();
  85557. }
  85558. },
  85559. /**
  85560. * Finish off the mouse drag and insert the column where needed
  85561. * @method _fnMouseUp
  85562. * @param event e Mouse event
  85563. * @returns void
  85564. * @private
  85565. */
  85566. "_fnMouseUp": function ( e )
  85567. {
  85568. var that = this;
  85569. $(document).off( '.ColReorder' );
  85570. if ( this.dom.drag !== null )
  85571. {
  85572. /* Remove the guide elements */
  85573. this.dom.drag.remove();
  85574. this.dom.pointer.remove();
  85575. this.dom.drag = null;
  85576. this.dom.pointer = null;
  85577. /* Actually do the reorder */
  85578. this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, true );
  85579. this._fnSetColumnIndexes();
  85580. /* When scrolling we need to recalculate the column sizes to allow for the shift */
  85581. if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" )
  85582. {
  85583. this.s.dt.oInstance.fnAdjustColumnSizing( false );
  85584. }
  85585. /* Save the state */
  85586. this.s.dt.oInstance.oApi._fnSaveState( this.s.dt );
  85587. if ( this.s.reorderCallback !== null )
  85588. {
  85589. this.s.reorderCallback.call( this );
  85590. }
  85591. }
  85592. },
  85593. /**
  85594. * Calculate a cached array with the points of the column inserts, and the
  85595. * 'to' points
  85596. * @method _fnRegions
  85597. * @returns void
  85598. * @private
  85599. */
  85600. "_fnRegions": function ()
  85601. {
  85602. var aoColumns = this.s.dt.aoColumns;
  85603. this.s.aoTargets.splice( 0, this.s.aoTargets.length );
  85604. this.s.aoTargets.push( {
  85605. "x": $(this.s.dt.nTable).offset().left,
  85606. "to": 0
  85607. } );
  85608. var iToPoint = 0;
  85609. var total = this.s.aoTargets[0].x;
  85610. for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ )
  85611. {
  85612. /* For the column / header in question, we want it's position to remain the same if the
  85613. * position is just to it's immediate left or right, so we only increment the counter for
  85614. * other columns
  85615. */
  85616. if ( i != this.s.mouse.fromIndex )
  85617. {
  85618. iToPoint++;
  85619. }
  85620. if ( aoColumns[i].bVisible && aoColumns[i].nTh.style.display !=='none' )
  85621. {
  85622. total += $(aoColumns[i].nTh).outerWidth();
  85623. this.s.aoTargets.push( {
  85624. "x": total,
  85625. "to": iToPoint
  85626. } );
  85627. }
  85628. }
  85629. /* Disallow columns for being reordered by drag and drop, counting right to left */
  85630. if ( this.s.fixedRight !== 0 )
  85631. {
  85632. this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight );
  85633. }
  85634. /* Disallow columns for being reordered by drag and drop, counting left to right */
  85635. if ( this.s.fixed !== 0 )
  85636. {
  85637. this.s.aoTargets.splice( 0, this.s.fixed );
  85638. }
  85639. },
  85640. /**
  85641. * Copy the TH element that is being drags so the user has the idea that they are actually
  85642. * moving it around the page.
  85643. * @method _fnCreateDragNode
  85644. * @returns void
  85645. * @private
  85646. */
  85647. "_fnCreateDragNode": function ()
  85648. {
  85649. var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "";
  85650. var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh;
  85651. var origTr = origCell.parentNode;
  85652. var origThead = origTr.parentNode;
  85653. var origTable = origThead.parentNode;
  85654. var cloneCell = $(origCell).clone();
  85655. // This is a slightly odd combination of jQuery and DOM, but it is the
  85656. // fastest and least resource intensive way I could think of cloning
  85657. // the table with just a single header cell in it.
  85658. this.dom.drag = $(origTable.cloneNode(false))
  85659. .addClass( 'DTCR_clonedTable' )
  85660. .append(
  85661. $(origThead.cloneNode(false)).append(
  85662. $(origTr.cloneNode(false)).append(
  85663. cloneCell[0]
  85664. )
  85665. )
  85666. )
  85667. .css( {
  85668. position: 'absolute',
  85669. top: 0,
  85670. left: 0,
  85671. width: $(origCell).outerWidth(),
  85672. height: $(origCell).outerHeight()
  85673. } )
  85674. .appendTo( 'body' );
  85675. this.dom.pointer = $('<div></div>')
  85676. .addClass( 'DTCR_pointer' )
  85677. .css( {
  85678. position: 'absolute',
  85679. top: scrolling ?
  85680. $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top :
  85681. $(this.s.dt.nTable).offset().top,
  85682. height : scrolling ?
  85683. $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() :
  85684. $(this.s.dt.nTable).height()
  85685. } )
  85686. .appendTo( 'body' );
  85687. },
  85688. /**
  85689. * Add a data attribute to the column headers, so we know the index of
  85690. * the row to be reordered. This allows fast detection of the index, and
  85691. * for this plug-in to work with FixedHeader which clones the nodes.
  85692. * @private
  85693. */
  85694. "_fnSetColumnIndexes": function ()
  85695. {
  85696. $.each( this.s.dt.aoColumns, function (i, column) {
  85697. $(column.nTh).attr('data-column-index', i);
  85698. } );
  85699. },
  85700. /**
  85701. * Get cursor position regardless of mouse or touch input
  85702. * @param {Event} e jQuery Event
  85703. * @param {string} prop Property to get
  85704. * @return {number} Value
  85705. */
  85706. _fnCursorPosition: function ( e, prop ) {
  85707. if ( e.type.indexOf('touch') !== -1 ) {
  85708. return e.originalEvent.touches[0][ prop ];
  85709. }
  85710. return e[ prop ];
  85711. }
  85712. } );
  85713. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85714. * Static parameters
  85715. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85716. /**
  85717. * ColReorder default settings for initialisation
  85718. * @namespace
  85719. * @static
  85720. */
  85721. ColReorder.defaults = {
  85722. /**
  85723. * Predefined ordering for the columns that will be applied automatically
  85724. * on initialisation. If not specified then the order that the columns are
  85725. * found to be in the HTML is the order used.
  85726. * @type array
  85727. * @default null
  85728. * @static
  85729. */
  85730. aiOrder: null,
  85731. /**
  85732. * Redraw the table's column ordering as the end user draws the column
  85733. * (`true`) or wait until the mouse is released (`false` - default). Note
  85734. * that this will perform a redraw on each reordering, which involves an
  85735. * Ajax request each time if you are using server-side processing in
  85736. * DataTables.
  85737. * @type boolean
  85738. * @default false
  85739. * @static
  85740. */
  85741. bRealtime: true,
  85742. /**
  85743. * Indicate how many columns should be fixed in position (counting from the
  85744. * left). This will typically be 1 if used, but can be as high as you like.
  85745. * @type int
  85746. * @default 0
  85747. * @static
  85748. */
  85749. iFixedColumnsLeft: 0,
  85750. /**
  85751. * As `iFixedColumnsRight` but counting from the right.
  85752. * @type int
  85753. * @default 0
  85754. * @static
  85755. */
  85756. iFixedColumnsRight: 0,
  85757. /**
  85758. * Callback function that is fired when columns are reordered. The `column-
  85759. * reorder` event is preferred over this callback
  85760. * @type function():void
  85761. * @default null
  85762. * @static
  85763. */
  85764. fnReorderCallback: null
  85765. };
  85766. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85767. * Constants
  85768. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85769. /**
  85770. * ColReorder version
  85771. * @constant version
  85772. * @type String
  85773. * @default As code
  85774. */
  85775. ColReorder.version = "1.4.1";
  85776. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  85777. * DataTables interfaces
  85778. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  85779. // Expose
  85780. $.fn.dataTable.ColReorder = ColReorder;
  85781. $.fn.DataTable.ColReorder = ColReorder;
  85782. // Register a new feature with DataTables
  85783. if ( typeof $.fn.dataTable == "function" &&
  85784. typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
  85785. $.fn.dataTableExt.fnVersionCheck('1.10.8') )
  85786. {
  85787. $.fn.dataTableExt.aoFeatures.push( {
  85788. "fnInit": function( settings ) {
  85789. var table = settings.oInstance;
  85790. if ( ! settings._colReorder ) {
  85791. var dtInit = settings.oInit;
  85792. var opts = dtInit.colReorder || dtInit.oColReorder || {};
  85793. new ColReorder( settings, opts );
  85794. }
  85795. else {
  85796. table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" );
  85797. }
  85798. return null; /* No node for DataTables to insert */
  85799. },
  85800. "cFeature": "R",
  85801. "sFeature": "ColReorder"
  85802. } );
  85803. }
  85804. else {
  85805. alert( "Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download");
  85806. }
  85807. // Attach a listener to the document which listens for DataTables initialisation
  85808. // events so we can automatically initialise
  85809. $(document).on( 'preInit.dt.colReorder', function (e, settings) {
  85810. if ( e.namespace !== 'dt' ) {
  85811. return;
  85812. }
  85813. var init = settings.oInit.colReorder;
  85814. var defaults = DataTable.defaults.colReorder;
  85815. if ( init || defaults ) {
  85816. var opts = $.extend( {}, init, defaults );
  85817. if ( init !== false ) {
  85818. new ColReorder( settings, opts );
  85819. }
  85820. }
  85821. } );
  85822. // API augmentation
  85823. $.fn.dataTable.Api.register( 'colReorder.reset()', function () {
  85824. return this.iterator( 'table', function ( ctx ) {
  85825. ctx._colReorder.fnReset();
  85826. } );
  85827. } );
  85828. $.fn.dataTable.Api.register( 'colReorder.order()', function ( set, original ) {
  85829. if ( set ) {
  85830. return this.iterator( 'table', function ( ctx ) {
  85831. ctx._colReorder.fnOrder( set, original );
  85832. } );
  85833. }
  85834. return this.context.length ?
  85835. this.context[0]._colReorder.fnOrder() :
  85836. null;
  85837. } );
  85838. $.fn.dataTable.Api.register( 'colReorder.transpose()', function ( idx, dir ) {
  85839. return this.context.length && this.context[0]._colReorder ?
  85840. this.context[0]._colReorder.fnTranspose( idx, dir ) :
  85841. idx;
  85842. } );
  85843. $.fn.dataTable.Api.register( 'colReorder.move()', function( from, to, drop, invalidateRows ) {
  85844. if (this.context.length) {
  85845. this.context[0]._colReorder.s.dt.oInstance.fnColReorder( from, to, drop, invalidateRows );
  85846. }
  85847. return this;
  85848. } );
  85849. return ColReorder;
  85850. }));
  85851. /*! FixedColumns 3.2.4
  85852. * ©2010-2017 SpryMedia Ltd - datatables.net/license
  85853. */
  85854. /**
  85855. * @summary FixedColumns
  85856. * @description Freeze columns in place on a scrolling DataTable
  85857. * @version 3.2.4
  85858. * @file dataTables.fixedColumns.js
  85859. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  85860. * @contact www.sprymedia.co.uk/contact
  85861. * @copyright Copyright 2010-2017 SpryMedia Ltd.
  85862. *
  85863. * This source file is free software, available under the following license:
  85864. * MIT license - http://datatables.net/license/mit
  85865. *
  85866. * This source file is distributed in the hope that it will be useful, but
  85867. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  85868. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  85869. *
  85870. * For details please refer to: http://www.datatables.net
  85871. */
  85872. (function( factory ){
  85873. if ( typeof define === 'function' && define.amd ) {
  85874. // AMD
  85875. define( ['jquery', 'datatables.net'], function ( $ ) {
  85876. return factory( $, window, document );
  85877. } );
  85878. }
  85879. else if ( typeof exports === 'object' ) {
  85880. // CommonJS
  85881. module.exports = function (root, $) {
  85882. if ( ! root ) {
  85883. root = window;
  85884. }
  85885. if ( ! $ || ! $.fn.dataTable ) {
  85886. $ = require('datatables.net')(root, $).$;
  85887. }
  85888. return factory( $, root, root.document );
  85889. };
  85890. }
  85891. else {
  85892. // Browser
  85893. factory( jQuery, window, document );
  85894. }
  85895. }(function( $, window, document, undefined ) {
  85896. 'use strict';
  85897. var DataTable = $.fn.dataTable;
  85898. var _firefoxScroll;
  85899. /**
  85900. * When making use of DataTables' x-axis scrolling feature, you may wish to
  85901. * fix the left most column in place. This plug-in for DataTables provides
  85902. * exactly this option (note for non-scrolling tables, please use the
  85903. * FixedHeader plug-in, which can fix headers and footers). Key
  85904. * features include:
  85905. *
  85906. * * Freezes the left or right most columns to the side of the table
  85907. * * Option to freeze two or more columns
  85908. * * Full integration with DataTables' scrolling options
  85909. * * Speed - FixedColumns is fast in its operation
  85910. *
  85911. * @class
  85912. * @constructor
  85913. * @global
  85914. * @param {object} dt DataTables instance. With DataTables 1.10 this can also
  85915. * be a jQuery collection, a jQuery selector, DataTables API instance or
  85916. * settings object.
  85917. * @param {object} [init={}] Configuration object for FixedColumns. Options are
  85918. * defined by {@link FixedColumns.defaults}
  85919. *
  85920. * @requires jQuery 1.7+
  85921. * @requires DataTables 1.8.0+
  85922. *
  85923. * @example
  85924. * var table = $('#example').dataTable( {
  85925. * "scrollX": "100%"
  85926. * } );
  85927. * new $.fn.dataTable.fixedColumns( table );
  85928. */
  85929. var FixedColumns = function ( dt, init ) {
  85930. var that = this;
  85931. /* Sanity check - you just know it will happen */
  85932. if ( ! ( this instanceof FixedColumns ) ) {
  85933. alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." );
  85934. return;
  85935. }
  85936. if ( init === undefined || init === true ) {
  85937. init = {};
  85938. }
  85939. // Use the DataTables Hungarian notation mapping method, if it exists to
  85940. // provide forwards compatibility for camel case variables
  85941. var camelToHungarian = $.fn.dataTable.camelToHungarian;
  85942. if ( camelToHungarian ) {
  85943. camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true );
  85944. camelToHungarian( FixedColumns.defaults, init );
  85945. }
  85946. // v1.10 allows the settings object to be got form a number of sources
  85947. var dtSettings = new $.fn.dataTable.Api( dt ).settings()[0];
  85948. /**
  85949. * Settings object which contains customisable information for FixedColumns instance
  85950. * @namespace
  85951. * @extends FixedColumns.defaults
  85952. * @private
  85953. */
  85954. this.s = {
  85955. /**
  85956. * DataTables settings objects
  85957. * @type object
  85958. * @default Obtained from DataTables instance
  85959. */
  85960. "dt": dtSettings,
  85961. /**
  85962. * Number of columns in the DataTable - stored for quick access
  85963. * @type int
  85964. * @default Obtained from DataTables instance
  85965. */
  85966. "iTableColumns": dtSettings.aoColumns.length,
  85967. /**
  85968. * Original outer widths of the columns as rendered by DataTables - used to calculate
  85969. * the FixedColumns grid bounding box
  85970. * @type array.<int>
  85971. * @default []
  85972. */
  85973. "aiOuterWidths": [],
  85974. /**
  85975. * Original inner widths of the columns as rendered by DataTables - used to apply widths
  85976. * to the columns
  85977. * @type array.<int>
  85978. * @default []
  85979. */
  85980. "aiInnerWidths": [],
  85981. /**
  85982. * Is the document layout right-to-left
  85983. * @type boolean
  85984. */
  85985. rtl: $(dtSettings.nTable).css('direction') === 'rtl'
  85986. };
  85987. /**
  85988. * DOM elements used by the class instance
  85989. * @namespace
  85990. * @private
  85991. *
  85992. */
  85993. this.dom = {
  85994. /**
  85995. * DataTables scrolling element
  85996. * @type node
  85997. * @default null
  85998. */
  85999. "scroller": null,
  86000. /**
  86001. * DataTables header table
  86002. * @type node
  86003. * @default null
  86004. */
  86005. "header": null,
  86006. /**
  86007. * DataTables body table
  86008. * @type node
  86009. * @default null
  86010. */
  86011. "body": null,
  86012. /**
  86013. * DataTables footer table
  86014. * @type node
  86015. * @default null
  86016. */
  86017. "footer": null,
  86018. /**
  86019. * Display grid elements
  86020. * @namespace
  86021. */
  86022. "grid": {
  86023. /**
  86024. * Grid wrapper. This is the container element for the 3x3 grid
  86025. * @type node
  86026. * @default null
  86027. */
  86028. "wrapper": null,
  86029. /**
  86030. * DataTables scrolling element. This element is the DataTables
  86031. * component in the display grid (making up the main table - i.e.
  86032. * not the fixed columns).
  86033. * @type node
  86034. * @default null
  86035. */
  86036. "dt": null,
  86037. /**
  86038. * Left fixed column grid components
  86039. * @namespace
  86040. */
  86041. "left": {
  86042. "wrapper": null,
  86043. "head": null,
  86044. "body": null,
  86045. "foot": null
  86046. },
  86047. /**
  86048. * Right fixed column grid components
  86049. * @namespace
  86050. */
  86051. "right": {
  86052. "wrapper": null,
  86053. "head": null,
  86054. "body": null,
  86055. "foot": null
  86056. }
  86057. },
  86058. /**
  86059. * Cloned table nodes
  86060. * @namespace
  86061. */
  86062. "clone": {
  86063. /**
  86064. * Left column cloned table nodes
  86065. * @namespace
  86066. */
  86067. "left": {
  86068. /**
  86069. * Cloned header table
  86070. * @type node
  86071. * @default null
  86072. */
  86073. "header": null,
  86074. /**
  86075. * Cloned body table
  86076. * @type node
  86077. * @default null
  86078. */
  86079. "body": null,
  86080. /**
  86081. * Cloned footer table
  86082. * @type node
  86083. * @default null
  86084. */
  86085. "footer": null
  86086. },
  86087. /**
  86088. * Right column cloned table nodes
  86089. * @namespace
  86090. */
  86091. "right": {
  86092. /**
  86093. * Cloned header table
  86094. * @type node
  86095. * @default null
  86096. */
  86097. "header": null,
  86098. /**
  86099. * Cloned body table
  86100. * @type node
  86101. * @default null
  86102. */
  86103. "body": null,
  86104. /**
  86105. * Cloned footer table
  86106. * @type node
  86107. * @default null
  86108. */
  86109. "footer": null
  86110. }
  86111. }
  86112. };
  86113. if ( dtSettings._oFixedColumns ) {
  86114. throw 'FixedColumns already initialised on this table';
  86115. }
  86116. /* Attach the instance to the DataTables instance so it can be accessed easily */
  86117. dtSettings._oFixedColumns = this;
  86118. /* Let's do it */
  86119. if ( ! dtSettings._bInitComplete )
  86120. {
  86121. dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () {
  86122. that._fnConstruct( init );
  86123. }, 'FixedColumns' );
  86124. }
  86125. else
  86126. {
  86127. this._fnConstruct( init );
  86128. }
  86129. };
  86130. $.extend( FixedColumns.prototype , {
  86131. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86132. * Public methods
  86133. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  86134. /**
  86135. * Update the fixed columns - including headers and footers. Note that FixedColumns will
  86136. * automatically update the display whenever the host DataTable redraws.
  86137. * @returns {void}
  86138. * @example
  86139. * var table = $('#example').dataTable( {
  86140. * "scrollX": "100%"
  86141. * } );
  86142. * var fc = new $.fn.dataTable.fixedColumns( table );
  86143. *
  86144. * // at some later point when the table has been manipulated....
  86145. * fc.fnUpdate();
  86146. */
  86147. "fnUpdate": function ()
  86148. {
  86149. this._fnDraw( true );
  86150. },
  86151. /**
  86152. * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table.
  86153. * This is useful if you update the width of the table container. Note that FixedColumns will
  86154. * perform this function automatically when the window.resize event is fired.
  86155. * @returns {void}
  86156. * @example
  86157. * var table = $('#example').dataTable( {
  86158. * "scrollX": "100%"
  86159. * } );
  86160. * var fc = new $.fn.dataTable.fixedColumns( table );
  86161. *
  86162. * // Resize the table container and then have FixedColumns adjust its layout....
  86163. * $('#content').width( 1200 );
  86164. * fc.fnRedrawLayout();
  86165. */
  86166. "fnRedrawLayout": function ()
  86167. {
  86168. this._fnColCalc();
  86169. this._fnGridLayout();
  86170. this.fnUpdate();
  86171. },
  86172. /**
  86173. * Mark a row such that it's height should be recalculated when using 'semiauto' row
  86174. * height matching. This function will have no effect when 'none' or 'auto' row height
  86175. * matching is used.
  86176. * @param {Node} nTr TR element that should have it's height recalculated
  86177. * @returns {void}
  86178. * @example
  86179. * var table = $('#example').dataTable( {
  86180. * "scrollX": "100%"
  86181. * } );
  86182. * var fc = new $.fn.dataTable.fixedColumns( table );
  86183. *
  86184. * // manipulate the table - mark the row as needing an update then update the table
  86185. * // this allows the redraw performed by DataTables fnUpdate to recalculate the row
  86186. * // height
  86187. * fc.fnRecalculateHeight();
  86188. * table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]);
  86189. */
  86190. "fnRecalculateHeight": function ( nTr )
  86191. {
  86192. delete nTr._DTTC_iHeight;
  86193. nTr.style.height = 'auto';
  86194. },
  86195. /**
  86196. * Set the height of a given row - provides cross browser compatibility
  86197. * @param {Node} nTarget TR element that should have it's height recalculated
  86198. * @param {int} iHeight Height in pixels to set
  86199. * @returns {void}
  86200. * @example
  86201. * var table = $('#example').dataTable( {
  86202. * "scrollX": "100%"
  86203. * } );
  86204. * var fc = new $.fn.dataTable.fixedColumns( table );
  86205. *
  86206. * // You may want to do this after manipulating a row in the fixed column
  86207. * fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 );
  86208. */
  86209. "fnSetRowHeight": function ( nTarget, iHeight )
  86210. {
  86211. nTarget.style.height = iHeight+"px";
  86212. },
  86213. /**
  86214. * Get data index information about a row or cell in the table body.
  86215. * This function is functionally identical to fnGetPosition in DataTables,
  86216. * taking the same parameter (TH, TD or TR node) and returning exactly the
  86217. * the same information (data index information). THe difference between
  86218. * the two is that this method takes into account the fixed columns in the
  86219. * table, so you can pass in nodes from the master table, or the cloned
  86220. * tables and get the index position for the data in the main table.
  86221. * @param {node} node TR, TH or TD element to get the information about
  86222. * @returns {int} If nNode is given as a TR, then a single index is
  86223. * returned, or if given as a cell, an array of [row index, column index
  86224. * (visible), column index (all)] is given.
  86225. */
  86226. "fnGetPosition": function ( node )
  86227. {
  86228. var idx;
  86229. var inst = this.s.dt.oInstance;
  86230. if ( ! $(node).parents('.DTFC_Cloned').length )
  86231. {
  86232. // Not in a cloned table
  86233. return inst.fnGetPosition( node );
  86234. }
  86235. else
  86236. {
  86237. // Its in the cloned table, so need to look up position
  86238. if ( node.nodeName.toLowerCase() === 'tr' ) {
  86239. idx = $(node).index();
  86240. return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
  86241. }
  86242. else
  86243. {
  86244. var colIdx = $(node).index();
  86245. idx = $(node.parentNode).index();
  86246. var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] );
  86247. return [
  86248. row,
  86249. colIdx,
  86250. inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx )
  86251. ];
  86252. }
  86253. }
  86254. },
  86255. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86256. * Private methods (they are of course public in JS, but recommended as private)
  86257. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  86258. /**
  86259. * Initialisation for FixedColumns
  86260. * @param {Object} oInit User settings for initialisation
  86261. * @returns {void}
  86262. * @private
  86263. */
  86264. "_fnConstruct": function ( oInit )
  86265. {
  86266. var i, iLen, iWidth,
  86267. that = this;
  86268. /* Sanity checking */
  86269. if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' ||
  86270. this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true )
  86271. {
  86272. alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+
  86273. "Please upgrade your DataTables installation" );
  86274. return;
  86275. }
  86276. if ( this.s.dt.oScroll.sX === "" )
  86277. {
  86278. this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+
  86279. "x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+
  86280. "column fixing when scrolling is not enabled" );
  86281. return;
  86282. }
  86283. /* Apply the settings from the user / defaults */
  86284. this.s = $.extend( true, this.s, FixedColumns.defaults, oInit );
  86285. /* Set up the DOM as we need it and cache nodes */
  86286. var classes = this.s.dt.oClasses;
  86287. this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0];
  86288. this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0];
  86289. /* Set up the DOM that we want for the fixed column layout grid */
  86290. this._fnColCalc();
  86291. this._fnGridSetup();
  86292. /* Event handlers */
  86293. var mouseController;
  86294. var mouseDown = false;
  86295. // When the mouse is down (drag scroll) the mouse controller cannot
  86296. // change, as the browser keeps the original element as the scrolling one
  86297. $(this.s.dt.nTableWrapper).on( 'mousedown.DTFC', function (e) {
  86298. if ( e.button === 0 ) {
  86299. mouseDown = true;
  86300. $(document).one( 'mouseup', function () {
  86301. mouseDown = false;
  86302. } );
  86303. }
  86304. } );
  86305. // When the body is scrolled - scroll the left and right columns
  86306. $(this.dom.scroller)
  86307. .on( 'mouseover.DTFC touchstart.DTFC', function () {
  86308. if ( ! mouseDown ) {
  86309. mouseController = 'main';
  86310. }
  86311. } )
  86312. .on( 'scroll.DTFC', function (e) {
  86313. if ( ! mouseController && e.originalEvent ) {
  86314. mouseController = 'main';
  86315. }
  86316. if ( mouseController === 'main' ) {
  86317. if ( that.s.iLeftColumns > 0 ) {
  86318. that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop;
  86319. }
  86320. if ( that.s.iRightColumns > 0 ) {
  86321. that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop;
  86322. }
  86323. }
  86324. } );
  86325. var wheelType = 'onwheel' in document.createElement('div') ?
  86326. 'wheel.DTFC' :
  86327. 'mousewheel.DTFC';
  86328. if ( that.s.iLeftColumns > 0 ) {
  86329. // When scrolling the left column, scroll the body and right column
  86330. $(that.dom.grid.left.liner)
  86331. .on( 'mouseover.DTFC touchstart.DTFC', function () {
  86332. if ( ! mouseDown ) {
  86333. mouseController = 'left';
  86334. }
  86335. } )
  86336. .on( 'scroll.DTFC', function ( e ) {
  86337. if ( ! mouseController && e.originalEvent ) {
  86338. mouseController = 'left';
  86339. }
  86340. if ( mouseController === 'left' ) {
  86341. that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop;
  86342. if ( that.s.iRightColumns > 0 ) {
  86343. that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop;
  86344. }
  86345. }
  86346. } )
  86347. .on( wheelType, function(e) {
  86348. // Pass horizontal scrolling through
  86349. var xDelta = e.type === 'wheel' ?
  86350. -e.originalEvent.deltaX :
  86351. e.originalEvent.wheelDeltaX;
  86352. that.dom.scroller.scrollLeft -= xDelta;
  86353. } );
  86354. }
  86355. if ( that.s.iRightColumns > 0 ) {
  86356. // When scrolling the right column, scroll the body and the left column
  86357. $(that.dom.grid.right.liner)
  86358. .on( 'mouseover.DTFC touchstart.DTFC', function () {
  86359. if ( ! mouseDown ) {
  86360. mouseController = 'right';
  86361. }
  86362. } )
  86363. .on( 'scroll.DTFC', function ( e ) {
  86364. if ( ! mouseController && e.originalEvent ) {
  86365. mouseController = 'right';
  86366. }
  86367. if ( mouseController === 'right' ) {
  86368. that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop;
  86369. if ( that.s.iLeftColumns > 0 ) {
  86370. that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop;
  86371. }
  86372. }
  86373. } )
  86374. .on( wheelType, function(e) {
  86375. // Pass horizontal scrolling through
  86376. var xDelta = e.type === 'wheel' ?
  86377. -e.originalEvent.deltaX :
  86378. e.originalEvent.wheelDeltaX;
  86379. that.dom.scroller.scrollLeft -= xDelta;
  86380. } );
  86381. }
  86382. $(window).on( 'resize.DTFC', function () {
  86383. that._fnGridLayout.call( that );
  86384. } );
  86385. var bFirstDraw = true;
  86386. var jqTable = $(this.s.dt.nTable);
  86387. jqTable
  86388. .on( 'draw.dt.DTFC', function () {
  86389. that._fnColCalc();
  86390. that._fnDraw.call( that, bFirstDraw );
  86391. bFirstDraw = false;
  86392. } )
  86393. .on( 'column-sizing.dt.DTFC', function () {
  86394. that._fnColCalc();
  86395. that._fnGridLayout( that );
  86396. } )
  86397. .on( 'column-visibility.dt.DTFC', function ( e, settings, column, vis, recalc ) {
  86398. if ( recalc === undefined || recalc ) {
  86399. that._fnColCalc();
  86400. that._fnGridLayout( that );
  86401. that._fnDraw( true );
  86402. }
  86403. } )
  86404. .on( 'select.dt.DTFC deselect.dt.DTFC', function ( e, dt, type, indexes ) {
  86405. if ( e.namespace === 'dt' ) {
  86406. that._fnDraw( false );
  86407. }
  86408. } )
  86409. .on( 'destroy.dt.DTFC', function () {
  86410. jqTable.off( '.DTFC' );
  86411. $(that.dom.scroller).off( '.DTFC' );
  86412. $(window).off( '.DTFC' );
  86413. $(that.s.dt.nTableWrapper).off( '.DTFC' );
  86414. $(that.dom.grid.left.liner).off( '.DTFC '+wheelType );
  86415. $(that.dom.grid.left.wrapper).remove();
  86416. $(that.dom.grid.right.liner).off( '.DTFC '+wheelType );
  86417. $(that.dom.grid.right.wrapper).remove();
  86418. } );
  86419. /* Get things right to start with - note that due to adjusting the columns, there must be
  86420. * another redraw of the main table. It doesn't need to be a full redraw however.
  86421. */
  86422. this._fnGridLayout();
  86423. this.s.dt.oInstance.fnDraw(false);
  86424. },
  86425. /**
  86426. * Calculate the column widths for the grid layout
  86427. * @returns {void}
  86428. * @private
  86429. */
  86430. "_fnColCalc": function ()
  86431. {
  86432. var that = this;
  86433. var iLeftWidth = 0;
  86434. var iRightWidth = 0;
  86435. this.s.aiInnerWidths = [];
  86436. this.s.aiOuterWidths = [];
  86437. $.each( this.s.dt.aoColumns, function (i, col) {
  86438. var th = $(col.nTh);
  86439. var border;
  86440. if ( ! th.filter(':visible').length ) {
  86441. that.s.aiInnerWidths.push( 0 );
  86442. that.s.aiOuterWidths.push( 0 );
  86443. }
  86444. else
  86445. {
  86446. // Inner width is used to assign widths to cells
  86447. // Outer width is used to calculate the container
  86448. var iWidth = th.outerWidth();
  86449. // When working with the left most-cell, need to add on the
  86450. // table's border to the outerWidth, since we need to take
  86451. // account of it, but it isn't in any cell
  86452. if ( that.s.aiOuterWidths.length === 0 ) {
  86453. border = $(that.s.dt.nTable).css('border-left-width');
  86454. iWidth += typeof border === 'string' && border.indexOf('px') === -1 ?
  86455. 1 :
  86456. parseInt( border, 10 );
  86457. }
  86458. // Likewise with the final column on the right
  86459. if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) {
  86460. border = $(that.s.dt.nTable).css('border-right-width');
  86461. iWidth += typeof border === 'string' && border.indexOf('px') === -1 ?
  86462. 1 :
  86463. parseInt( border, 10 );
  86464. }
  86465. that.s.aiOuterWidths.push( iWidth );
  86466. that.s.aiInnerWidths.push( th.width() );
  86467. if ( i < that.s.iLeftColumns )
  86468. {
  86469. iLeftWidth += iWidth;
  86470. }
  86471. if ( that.s.iTableColumns-that.s.iRightColumns <= i )
  86472. {
  86473. iRightWidth += iWidth;
  86474. }
  86475. }
  86476. } );
  86477. this.s.iLeftWidth = iLeftWidth;
  86478. this.s.iRightWidth = iRightWidth;
  86479. },
  86480. /**
  86481. * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid
  86482. * for the left column, the DataTable (for which we just reuse the scrolling element DataTable
  86483. * puts into the DOM) and the right column. In each of he two fixed column elements there is a
  86484. * grouping wrapper element and then a head, body and footer wrapper. In each of these we then
  86485. * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure.
  86486. * @returns {void}
  86487. * @private
  86488. */
  86489. "_fnGridSetup": function ()
  86490. {
  86491. var that = this;
  86492. var oOverflow = this._fnDTOverflow();
  86493. var block;
  86494. this.dom.body = this.s.dt.nTable;
  86495. this.dom.header = this.s.dt.nTHead.parentNode;
  86496. this.dom.header.parentNode.parentNode.style.position = "relative";
  86497. var nSWrapper =
  86498. $('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;">'+
  86499. '<div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;" aria-hidden="true">'+
  86500. '<div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
  86501. '<div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+
  86502. '<div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
  86503. '</div>'+
  86504. '<div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+
  86505. '</div>'+
  86506. '<div class="DTFC_RightWrapper" style="position:absolute; top:0; right:0;" aria-hidden="true">'+
  86507. '<div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;">'+
  86508. '<div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
  86509. '</div>'+
  86510. '<div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+
  86511. '<div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+
  86512. '</div>'+
  86513. '<div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;">'+
  86514. '<div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+
  86515. '</div>'+
  86516. '</div>'+
  86517. '</div>')[0];
  86518. var nLeft = nSWrapper.childNodes[0];
  86519. var nRight = nSWrapper.childNodes[1];
  86520. this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt );
  86521. nSWrapper.appendChild( this.dom.grid.dt );
  86522. this.dom.grid.wrapper = nSWrapper;
  86523. if ( this.s.iLeftColumns > 0 )
  86524. {
  86525. this.dom.grid.left.wrapper = nLeft;
  86526. this.dom.grid.left.head = nLeft.childNodes[0];
  86527. this.dom.grid.left.body = nLeft.childNodes[1];
  86528. this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0];
  86529. nSWrapper.appendChild( nLeft );
  86530. }
  86531. if ( this.s.iRightColumns > 0 )
  86532. {
  86533. this.dom.grid.right.wrapper = nRight;
  86534. this.dom.grid.right.head = nRight.childNodes[0];
  86535. this.dom.grid.right.body = nRight.childNodes[1];
  86536. this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0];
  86537. nRight.style.right = oOverflow.bar+"px";
  86538. block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0];
  86539. block.style.width = oOverflow.bar+"px";
  86540. block.style.right = -oOverflow.bar+"px";
  86541. this.dom.grid.right.headBlock = block;
  86542. block = $('div.DTFC_RightFootBlocker', nSWrapper)[0];
  86543. block.style.width = oOverflow.bar+"px";
  86544. block.style.right = -oOverflow.bar+"px";
  86545. this.dom.grid.right.footBlock = block;
  86546. nSWrapper.appendChild( nRight );
  86547. }
  86548. if ( this.s.dt.nTFoot )
  86549. {
  86550. this.dom.footer = this.s.dt.nTFoot.parentNode;
  86551. if ( this.s.iLeftColumns > 0 )
  86552. {
  86553. this.dom.grid.left.foot = nLeft.childNodes[2];
  86554. }
  86555. if ( this.s.iRightColumns > 0 )
  86556. {
  86557. this.dom.grid.right.foot = nRight.childNodes[2];
  86558. }
  86559. }
  86560. // RTL support - swap the position of the left and right columns (#48)
  86561. if ( this.s.rtl ) {
  86562. $('div.DTFC_RightHeadBlocker', nSWrapper).css( {
  86563. left: -oOverflow.bar+'px',
  86564. right: ''
  86565. } );
  86566. }
  86567. },
  86568. /**
  86569. * Style and position the grid used for the FixedColumns layout
  86570. * @returns {void}
  86571. * @private
  86572. */
  86573. "_fnGridLayout": function ()
  86574. {
  86575. var that = this;
  86576. var oGrid = this.dom.grid;
  86577. var iWidth = $(oGrid.wrapper).width();
  86578. var iBodyHeight = this.s.dt.nTable.parentNode.offsetHeight;
  86579. var iFullHeight = this.s.dt.nTable.parentNode.parentNode.offsetHeight;
  86580. var oOverflow = this._fnDTOverflow();
  86581. var iLeftWidth = this.s.iLeftWidth;
  86582. var iRightWidth = this.s.iRightWidth;
  86583. var rtl = $(this.dom.body).css('direction') === 'rtl';
  86584. var wrapper;
  86585. var scrollbarAdjust = function ( node, width ) {
  86586. if ( ! oOverflow.bar ) {
  86587. // If there is no scrollbar (Macs) we need to hide the auto scrollbar
  86588. node.style.width = (width+20)+"px";
  86589. node.style.paddingRight = "20px";
  86590. node.style.boxSizing = "border-box";
  86591. }
  86592. else if ( that._firefoxScrollError() ) {
  86593. // See the above function for why this is required
  86594. if ( $(node).height() > 34 ) {
  86595. node.style.width = (width+oOverflow.bar)+"px";
  86596. }
  86597. }
  86598. else {
  86599. // Otherwise just overflow by the scrollbar
  86600. node.style.width = (width+oOverflow.bar)+"px";
  86601. }
  86602. };
  86603. // When x scrolling - don't paint the fixed columns over the x scrollbar
  86604. if ( oOverflow.x )
  86605. {
  86606. iBodyHeight -= oOverflow.bar;
  86607. }
  86608. oGrid.wrapper.style.height = iFullHeight+"px";
  86609. if ( this.s.iLeftColumns > 0 )
  86610. {
  86611. wrapper = oGrid.left.wrapper;
  86612. wrapper.style.width = iLeftWidth+'px';
  86613. wrapper.style.height = '1px';
  86614. // Swap the position of the left and right columns for rtl (#48)
  86615. // This is always up against the edge, scrollbar on the far side
  86616. if ( rtl ) {
  86617. wrapper.style.left = '';
  86618. wrapper.style.right = 0;
  86619. }
  86620. else {
  86621. wrapper.style.left = 0;
  86622. wrapper.style.right = '';
  86623. }
  86624. oGrid.left.body.style.height = iBodyHeight+"px";
  86625. if ( oGrid.left.foot ) {
  86626. oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar
  86627. }
  86628. scrollbarAdjust( oGrid.left.liner, iLeftWidth );
  86629. oGrid.left.liner.style.height = iBodyHeight+"px";
  86630. oGrid.left.liner.style.maxHeight = iBodyHeight+"px";
  86631. }
  86632. if ( this.s.iRightColumns > 0 )
  86633. {
  86634. wrapper = oGrid.right.wrapper;
  86635. wrapper.style.width = iRightWidth+'px';
  86636. wrapper.style.height = '1px';
  86637. // Need to take account of the vertical scrollbar
  86638. if ( this.s.rtl ) {
  86639. wrapper.style.left = oOverflow.y ? oOverflow.bar+'px' : 0;
  86640. wrapper.style.right = '';
  86641. }
  86642. else {
  86643. wrapper.style.left = '';
  86644. wrapper.style.right = oOverflow.y ? oOverflow.bar+'px' : 0;
  86645. }
  86646. oGrid.right.body.style.height = iBodyHeight+"px";
  86647. if ( oGrid.right.foot ) {
  86648. oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px";
  86649. }
  86650. scrollbarAdjust( oGrid.right.liner, iRightWidth );
  86651. oGrid.right.liner.style.height = iBodyHeight+"px";
  86652. oGrid.right.liner.style.maxHeight = iBodyHeight+"px";
  86653. oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none';
  86654. oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none';
  86655. }
  86656. },
  86657. /**
  86658. * Get information about the DataTable's scrolling state - specifically if the table is scrolling
  86659. * on either the x or y axis, and also the scrollbar width.
  86660. * @returns {object} Information about the DataTables scrolling state with the properties:
  86661. * 'x', 'y' and 'bar'
  86662. * @private
  86663. */
  86664. "_fnDTOverflow": function ()
  86665. {
  86666. var nTable = this.s.dt.nTable;
  86667. var nTableScrollBody = nTable.parentNode;
  86668. var out = {
  86669. "x": false,
  86670. "y": false,
  86671. "bar": this.s.dt.oScroll.iBarWidth
  86672. };
  86673. if ( nTable.offsetWidth > nTableScrollBody.clientWidth )
  86674. {
  86675. out.x = true;
  86676. }
  86677. if ( nTable.offsetHeight > nTableScrollBody.clientHeight )
  86678. {
  86679. out.y = true;
  86680. }
  86681. return out;
  86682. },
  86683. /**
  86684. * Clone and position the fixed columns
  86685. * @returns {void}
  86686. * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true)
  86687. * @private
  86688. */
  86689. "_fnDraw": function ( bAll )
  86690. {
  86691. this._fnGridLayout();
  86692. this._fnCloneLeft( bAll );
  86693. this._fnCloneRight( bAll );
  86694. /* Draw callback function */
  86695. if ( this.s.fnDrawCallback !== null )
  86696. {
  86697. this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right );
  86698. }
  86699. /* Event triggering */
  86700. $(this).trigger( 'draw.dtfc', {
  86701. "leftClone": this.dom.clone.left,
  86702. "rightClone": this.dom.clone.right
  86703. } );
  86704. },
  86705. /**
  86706. * Clone the right columns
  86707. * @returns {void}
  86708. * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true)
  86709. * @private
  86710. */
  86711. "_fnCloneRight": function ( bAll )
  86712. {
  86713. if ( this.s.iRightColumns <= 0 ) {
  86714. return;
  86715. }
  86716. var that = this,
  86717. i, jq,
  86718. aiColumns = [];
  86719. for ( i=this.s.iTableColumns-this.s.iRightColumns ; i<this.s.iTableColumns ; i++ ) {
  86720. if ( this.s.dt.aoColumns[i].bVisible ) {
  86721. aiColumns.push( i );
  86722. }
  86723. }
  86724. this._fnClone( this.dom.clone.right, this.dom.grid.right, aiColumns, bAll );
  86725. },
  86726. /**
  86727. * Clone the left columns
  86728. * @returns {void}
  86729. * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true)
  86730. * @private
  86731. */
  86732. "_fnCloneLeft": function ( bAll )
  86733. {
  86734. if ( this.s.iLeftColumns <= 0 ) {
  86735. return;
  86736. }
  86737. var that = this,
  86738. i, jq,
  86739. aiColumns = [];
  86740. for ( i=0 ; i<this.s.iLeftColumns ; i++ ) {
  86741. if ( this.s.dt.aoColumns[i].bVisible ) {
  86742. aiColumns.push( i );
  86743. }
  86744. }
  86745. this._fnClone( this.dom.clone.left, this.dom.grid.left, aiColumns, bAll );
  86746. },
  86747. /**
  86748. * Make a copy of the layout object for a header or footer element from DataTables. Note that
  86749. * this method will clone the nodes in the layout object.
  86750. * @returns {Array} Copy of the layout array
  86751. * @param {Object} aoOriginal Layout array from DataTables (aoHeader or aoFooter)
  86752. * @param {Object} aiColumns Columns to copy
  86753. * @param {boolean} events Copy cell events or not
  86754. * @private
  86755. */
  86756. "_fnCopyLayout": function ( aoOriginal, aiColumns, events )
  86757. {
  86758. var aReturn = [];
  86759. var aClones = [];
  86760. var aCloned = [];
  86761. for ( var i=0, iLen=aoOriginal.length ; i<iLen ; i++ )
  86762. {
  86763. var aRow = [];
  86764. aRow.nTr = $(aoOriginal[i].nTr).clone(events, false)[0];
  86765. for ( var j=0, jLen=this.s.iTableColumns ; j<jLen ; j++ )
  86766. {
  86767. if ( $.inArray( j, aiColumns ) === -1 )
  86768. {
  86769. continue;
  86770. }
  86771. var iCloned = $.inArray( aoOriginal[i][j].cell, aCloned );
  86772. if ( iCloned === -1 )
  86773. {
  86774. var nClone = $(aoOriginal[i][j].cell).clone(events, false)[0];
  86775. aClones.push( nClone );
  86776. aCloned.push( aoOriginal[i][j].cell );
  86777. aRow.push( {
  86778. "cell": nClone,
  86779. "unique": aoOriginal[i][j].unique
  86780. } );
  86781. }
  86782. else
  86783. {
  86784. aRow.push( {
  86785. "cell": aClones[ iCloned ],
  86786. "unique": aoOriginal[i][j].unique
  86787. } );
  86788. }
  86789. }
  86790. aReturn.push( aRow );
  86791. }
  86792. return aReturn;
  86793. },
  86794. /**
  86795. * Clone the DataTable nodes and place them in the DOM (sized correctly)
  86796. * @returns {void}
  86797. * @param {Object} oClone Object containing the header, footer and body cloned DOM elements
  86798. * @param {Object} oGrid Grid object containing the display grid elements for the cloned
  86799. * column (left or right)
  86800. * @param {Array} aiColumns Column indexes which should be operated on from the DataTable
  86801. * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true)
  86802. * @private
  86803. */
  86804. "_fnClone": function ( oClone, oGrid, aiColumns, bAll )
  86805. {
  86806. var that = this,
  86807. i, iLen, j, jLen, jq, nTarget, iColumn, nClone, iIndex, aoCloneLayout,
  86808. jqCloneThead, aoFixedHeader,
  86809. dt = this.s.dt;
  86810. /*
  86811. * Header
  86812. */
  86813. if ( bAll )
  86814. {
  86815. $(oClone.header).remove();
  86816. oClone.header = $(this.dom.header).clone(true, false)[0];
  86817. oClone.header.className += " DTFC_Cloned";
  86818. oClone.header.style.width = "100%";
  86819. oGrid.head.appendChild( oClone.header );
  86820. /* Copy the DataTables layout cache for the header for our floating column */
  86821. aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, true );
  86822. jqCloneThead = $('>thead', oClone.header);
  86823. jqCloneThead.empty();
  86824. /* Add the created cloned TR elements to the table */
  86825. for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
  86826. {
  86827. jqCloneThead[0].appendChild( aoCloneLayout[i].nTr );
  86828. }
  86829. /* Use the handy _fnDrawHead function in DataTables to do the rowspan/colspan
  86830. * calculations for us
  86831. */
  86832. dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
  86833. }
  86834. else
  86835. {
  86836. /* To ensure that we copy cell classes exactly, regardless of colspan, multiple rows
  86837. * etc, we make a copy of the header from the DataTable again, but don't insert the
  86838. * cloned cells, just copy the classes across. To get the matching layout for the
  86839. * fixed component, we use the DataTables _fnDetectHeader method, allowing 1:1 mapping
  86840. */
  86841. aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, false );
  86842. aoFixedHeader=[];
  86843. dt.oApi._fnDetectHeader( aoFixedHeader, $('>thead', oClone.header)[0] );
  86844. for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
  86845. {
  86846. for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
  86847. {
  86848. aoFixedHeader[i][j].cell.className = aoCloneLayout[i][j].cell.className;
  86849. // If jQuery UI theming is used we need to copy those elements as well
  86850. $('span.DataTables_sort_icon', aoFixedHeader[i][j].cell).each( function () {
  86851. this.className = $('span.DataTables_sort_icon', aoCloneLayout[i][j].cell)[0].className;
  86852. } );
  86853. }
  86854. }
  86855. }
  86856. this._fnEqualiseHeights( 'thead', this.dom.header, oClone.header );
  86857. /*
  86858. * Body
  86859. */
  86860. if ( this.s.sHeightMatch == 'auto' )
  86861. {
  86862. /* Remove any heights which have been applied already and let the browser figure it out */
  86863. $('>tbody>tr', that.dom.body).css('height', 'auto');
  86864. }
  86865. if ( oClone.body !== null )
  86866. {
  86867. $(oClone.body).remove();
  86868. oClone.body = null;
  86869. }
  86870. oClone.body = $(this.dom.body).clone(true)[0];
  86871. oClone.body.className += " DTFC_Cloned";
  86872. oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px";
  86873. oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */
  86874. if ( oClone.body.getAttribute('id') !== null )
  86875. {
  86876. oClone.body.removeAttribute('id');
  86877. }
  86878. $('>thead>tr', oClone.body).empty();
  86879. $('>tfoot', oClone.body).remove();
  86880. var nBody = $('tbody', oClone.body)[0];
  86881. $(nBody).empty();
  86882. if ( dt.aiDisplay.length > 0 )
  86883. {
  86884. /* Copy the DataTables' header elements to force the column width in exactly the
  86885. * same way that DataTables does it - have the header element, apply the width and
  86886. * colapse it down
  86887. */
  86888. var nInnerThead = $('>thead>tr', oClone.body)[0];
  86889. for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
  86890. {
  86891. iColumn = aiColumns[iIndex];
  86892. nClone = $(dt.aoColumns[iColumn].nTh).clone(true)[0];
  86893. nClone.innerHTML = "";
  86894. var oStyle = nClone.style;
  86895. oStyle.paddingTop = "0";
  86896. oStyle.paddingBottom = "0";
  86897. oStyle.borderTopWidth = "0";
  86898. oStyle.borderBottomWidth = "0";
  86899. oStyle.height = 0;
  86900. oStyle.width = that.s.aiInnerWidths[iColumn]+"px";
  86901. nInnerThead.appendChild( nClone );
  86902. }
  86903. /* Add in the tbody elements, cloning form the master table */
  86904. $('>tbody>tr', that.dom.body).each( function (z) {
  86905. var i = that.s.dt.oFeatures.bServerSide===false ?
  86906. that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z;
  86907. var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th');
  86908. var n = this.cloneNode(false);
  86909. n.removeAttribute('id');
  86910. n.setAttribute( 'data-dt-row', i );
  86911. for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ )
  86912. {
  86913. iColumn = aiColumns[iIndex];
  86914. if ( aTds.length > 0 )
  86915. {
  86916. nClone = $( aTds[iColumn] ).clone(true, true)[0];
  86917. nClone.removeAttribute( 'id' );
  86918. nClone.setAttribute( 'data-dt-row', i );
  86919. nClone.setAttribute( 'data-dt-column', dt.oApi._fnVisibleToColumnIndex( dt, iColumn ) );
  86920. n.appendChild( nClone );
  86921. }
  86922. }
  86923. nBody.appendChild( n );
  86924. } );
  86925. }
  86926. else
  86927. {
  86928. $('>tbody>tr', that.dom.body).each( function (z) {
  86929. nClone = this.cloneNode(true);
  86930. nClone.className += ' DTFC_NoData';
  86931. $('td', nClone).html('');
  86932. nBody.appendChild( nClone );
  86933. } );
  86934. }
  86935. oClone.body.style.width = "100%";
  86936. oClone.body.style.margin = "0";
  86937. oClone.body.style.padding = "0";
  86938. // Interop with Scroller - need to use a height forcing element in the
  86939. // scrolling area in the same way that Scroller does in the body scroll.
  86940. if ( dt.oScroller !== undefined )
  86941. {
  86942. var scrollerForcer = dt.oScroller.dom.force;
  86943. if ( ! oGrid.forcer ) {
  86944. oGrid.forcer = scrollerForcer.cloneNode( true );
  86945. oGrid.liner.appendChild( oGrid.forcer );
  86946. }
  86947. else {
  86948. oGrid.forcer.style.height = scrollerForcer.style.height;
  86949. }
  86950. }
  86951. oGrid.liner.appendChild( oClone.body );
  86952. this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body );
  86953. /*
  86954. * Footer
  86955. */
  86956. if ( dt.nTFoot !== null )
  86957. {
  86958. if ( bAll )
  86959. {
  86960. if ( oClone.footer !== null )
  86961. {
  86962. oClone.footer.parentNode.removeChild( oClone.footer );
  86963. }
  86964. oClone.footer = $(this.dom.footer).clone(true, true)[0];
  86965. oClone.footer.className += " DTFC_Cloned";
  86966. oClone.footer.style.width = "100%";
  86967. oGrid.foot.appendChild( oClone.footer );
  86968. /* Copy the footer just like we do for the header */
  86969. aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, true );
  86970. var jqCloneTfoot = $('>tfoot', oClone.footer);
  86971. jqCloneTfoot.empty();
  86972. for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
  86973. {
  86974. jqCloneTfoot[0].appendChild( aoCloneLayout[i].nTr );
  86975. }
  86976. dt.oApi._fnDrawHead( dt, aoCloneLayout, true );
  86977. }
  86978. else
  86979. {
  86980. aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, false );
  86981. var aoCurrFooter=[];
  86982. dt.oApi._fnDetectHeader( aoCurrFooter, $('>tfoot', oClone.footer)[0] );
  86983. for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ )
  86984. {
  86985. for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ )
  86986. {
  86987. aoCurrFooter[i][j].cell.className = aoCloneLayout[i][j].cell.className;
  86988. }
  86989. }
  86990. }
  86991. this._fnEqualiseHeights( 'tfoot', this.dom.footer, oClone.footer );
  86992. }
  86993. /* Equalise the column widths between the header footer and body - body get's priority */
  86994. var anUnique = dt.oApi._fnGetUniqueThs( dt, $('>thead', oClone.header)[0] );
  86995. $(anUnique).each( function (i) {
  86996. iColumn = aiColumns[i];
  86997. this.style.width = that.s.aiInnerWidths[iColumn]+"px";
  86998. } );
  86999. if ( that.s.dt.nTFoot !== null )
  87000. {
  87001. anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] );
  87002. $(anUnique).each( function (i) {
  87003. iColumn = aiColumns[i];
  87004. this.style.width = that.s.aiInnerWidths[iColumn]+"px";
  87005. } );
  87006. }
  87007. },
  87008. /**
  87009. * From a given table node (THEAD etc), get a list of TR direct child elements
  87010. * @param {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element)
  87011. * @returns {Array} List of TR elements found
  87012. * @private
  87013. */
  87014. "_fnGetTrNodes": function ( nIn )
  87015. {
  87016. var aOut = [];
  87017. for ( var i=0, iLen=nIn.childNodes.length ; i<iLen ; i++ )
  87018. {
  87019. if ( nIn.childNodes[i].nodeName.toUpperCase() == "TR" )
  87020. {
  87021. aOut.push( nIn.childNodes[i] );
  87022. }
  87023. }
  87024. return aOut;
  87025. },
  87026. /**
  87027. * Equalise the heights of the rows in a given table node in a cross browser way
  87028. * @returns {void}
  87029. * @param {String} nodeName Node type - thead, tbody or tfoot
  87030. * @param {Node} original Original node to take the heights from
  87031. * @param {Node} clone Copy the heights to
  87032. * @private
  87033. */
  87034. "_fnEqualiseHeights": function ( nodeName, original, clone )
  87035. {
  87036. if ( this.s.sHeightMatch == 'none' && nodeName !== 'thead' && nodeName !== 'tfoot' )
  87037. {
  87038. return;
  87039. }
  87040. var that = this,
  87041. i, iLen, iHeight, iHeight2, iHeightOriginal, iHeightClone,
  87042. rootOriginal = original.getElementsByTagName(nodeName)[0],
  87043. rootClone = clone.getElementsByTagName(nodeName)[0],
  87044. jqBoxHack = $('>'+nodeName+'>tr:eq(0)', original).children(':first'),
  87045. iBoxHack = jqBoxHack.outerHeight() - jqBoxHack.height(),
  87046. anOriginal = this._fnGetTrNodes( rootOriginal ),
  87047. anClone = this._fnGetTrNodes( rootClone ),
  87048. heights = [];
  87049. for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
  87050. {
  87051. iHeightOriginal = anOriginal[i].offsetHeight;
  87052. iHeightClone = anClone[i].offsetHeight;
  87053. iHeight = iHeightClone > iHeightOriginal ? iHeightClone : iHeightOriginal;
  87054. if ( this.s.sHeightMatch == 'semiauto' )
  87055. {
  87056. anOriginal[i]._DTTC_iHeight = iHeight;
  87057. }
  87058. heights.push( iHeight );
  87059. }
  87060. for ( i=0, iLen=anClone.length ; i<iLen ; i++ )
  87061. {
  87062. anClone[i].style.height = heights[i]+"px";
  87063. anOriginal[i].style.height = heights[i]+"px";
  87064. }
  87065. },
  87066. /**
  87067. * Determine if the UA suffers from Firefox's overflow:scroll scrollbars
  87068. * not being shown bug.
  87069. *
  87070. * Firefox doesn't draw scrollbars, even if it is told to using
  87071. * overflow:scroll, if the div is less than 34px height. See bugs 292284 and
  87072. * 781885. Using UA detection here since this is particularly hard to detect
  87073. * using objects - its a straight up rendering error in Firefox.
  87074. *
  87075. * @return {boolean} True if Firefox error is present, false otherwise
  87076. */
  87077. _firefoxScrollError: function () {
  87078. if ( _firefoxScroll === undefined ) {
  87079. var test = $('<div/>')
  87080. .css( {
  87081. position: 'absolute',
  87082. top: 0,
  87083. left: 0,
  87084. height: 10,
  87085. width: 50,
  87086. overflow: 'scroll'
  87087. } )
  87088. .appendTo( 'body' );
  87089. // Make sure this doesn't apply on Macs with 0 width scrollbars
  87090. _firefoxScroll = (
  87091. test[0].clientWidth === test[0].offsetWidth && this._fnDTOverflow().bar !== 0
  87092. );
  87093. test.remove();
  87094. }
  87095. return _firefoxScroll;
  87096. }
  87097. } );
  87098. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87099. * Statics
  87100. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  87101. /**
  87102. * FixedColumns default settings for initialisation
  87103. * @name FixedColumns.defaults
  87104. * @namespace
  87105. * @static
  87106. */
  87107. FixedColumns.defaults = /** @lends FixedColumns.defaults */{
  87108. /**
  87109. * Number of left hand columns to fix in position
  87110. * @type int
  87111. * @default 1
  87112. * @static
  87113. * @example
  87114. * var = $('#example').dataTable( {
  87115. * "scrollX": "100%"
  87116. * } );
  87117. * new $.fn.dataTable.fixedColumns( table, {
  87118. * "leftColumns": 2
  87119. * } );
  87120. */
  87121. "iLeftColumns": 1,
  87122. /**
  87123. * Number of right hand columns to fix in position
  87124. * @type int
  87125. * @default 0
  87126. * @static
  87127. * @example
  87128. * var table = $('#example').dataTable( {
  87129. * "scrollX": "100%"
  87130. * } );
  87131. * new $.fn.dataTable.fixedColumns( table, {
  87132. * "rightColumns": 1
  87133. * } );
  87134. */
  87135. "iRightColumns": 0,
  87136. /**
  87137. * Draw callback function which is called when FixedColumns has redrawn the fixed assets
  87138. * @type function(object, object):void
  87139. * @default null
  87140. * @static
  87141. * @example
  87142. * var table = $('#example').dataTable( {
  87143. * "scrollX": "100%"
  87144. * } );
  87145. * new $.fn.dataTable.fixedColumns( table, {
  87146. * "drawCallback": function () {
  87147. * alert( "FixedColumns redraw" );
  87148. * }
  87149. * } );
  87150. */
  87151. "fnDrawCallback": null,
  87152. /**
  87153. * Height matching algorthim to use. This can be "none" which will result in no height
  87154. * matching being applied by FixedColumns (height matching could be forced by CSS in this
  87155. * case), "semiauto" whereby the height calculation will be performed once, and the result
  87156. * cached to be used again (fnRecalculateHeight can be used to force recalculation), or
  87157. * "auto" when height matching is performed on every draw (slowest but must accurate)
  87158. * @type string
  87159. * @default semiauto
  87160. * @static
  87161. * @example
  87162. * var table = $('#example').dataTable( {
  87163. * "scrollX": "100%"
  87164. * } );
  87165. * new $.fn.dataTable.fixedColumns( table, {
  87166. * "heightMatch": "auto"
  87167. * } );
  87168. */
  87169. "sHeightMatch": "semiauto"
  87170. };
  87171. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87172. * Constants
  87173. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  87174. /**
  87175. * FixedColumns version
  87176. * @name FixedColumns.version
  87177. * @type String
  87178. * @default See code
  87179. * @static
  87180. */
  87181. FixedColumns.version = "3.2.4";
  87182. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87183. * DataTables API integration
  87184. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  87185. DataTable.Api.register( 'fixedColumns()', function () {
  87186. return this;
  87187. } );
  87188. DataTable.Api.register( 'fixedColumns().update()', function () {
  87189. return this.iterator( 'table', function ( ctx ) {
  87190. if ( ctx._oFixedColumns ) {
  87191. ctx._oFixedColumns.fnUpdate();
  87192. }
  87193. } );
  87194. } );
  87195. DataTable.Api.register( 'fixedColumns().relayout()', function () {
  87196. return this.iterator( 'table', function ( ctx ) {
  87197. if ( ctx._oFixedColumns ) {
  87198. ctx._oFixedColumns.fnRedrawLayout();
  87199. }
  87200. } );
  87201. } );
  87202. DataTable.Api.register( 'rows().recalcHeight()', function () {
  87203. return this.iterator( 'row', function ( ctx, idx ) {
  87204. if ( ctx._oFixedColumns ) {
  87205. ctx._oFixedColumns.fnRecalculateHeight( this.row(idx).node() );
  87206. }
  87207. } );
  87208. } );
  87209. DataTable.Api.register( 'fixedColumns().rowIndex()', function ( row ) {
  87210. row = $(row);
  87211. return row.parents('.DTFC_Cloned').length ?
  87212. this.rows( { page: 'current' } ).indexes()[ row.index() ] :
  87213. this.row( row ).index();
  87214. } );
  87215. DataTable.Api.register( 'fixedColumns().cellIndex()', function ( cell ) {
  87216. cell = $(cell);
  87217. if ( cell.parents('.DTFC_Cloned').length ) {
  87218. var rowClonedIdx = cell.parent().index();
  87219. var rowIdx = this.rows( { page: 'current' } ).indexes()[ rowClonedIdx ];
  87220. var columnIdx;
  87221. if ( cell.parents('.DTFC_LeftWrapper').length ) {
  87222. columnIdx = cell.index();
  87223. }
  87224. else {
  87225. var columns = this.columns().flatten().length;
  87226. columnIdx = columns - this.context[0]._oFixedColumns.s.iRightColumns + cell.index();
  87227. }
  87228. return {
  87229. row: rowIdx,
  87230. column: this.column.index( 'toData', columnIdx ),
  87231. columnVisible: columnIdx
  87232. };
  87233. }
  87234. else {
  87235. return this.cell( cell ).index();
  87236. }
  87237. } );
  87238. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87239. * Initialisation
  87240. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  87241. // Attach a listener to the document which listens for DataTables initialisation
  87242. // events so we can automatically initialise
  87243. $(document).on( 'init.dt.fixedColumns', function (e, settings) {
  87244. if ( e.namespace !== 'dt' ) {
  87245. return;
  87246. }
  87247. var init = settings.oInit.fixedColumns;
  87248. var defaults = DataTable.defaults.fixedColumns;
  87249. if ( init || defaults ) {
  87250. var opts = $.extend( {}, init, defaults );
  87251. if ( init !== false ) {
  87252. new FixedColumns( settings, opts );
  87253. }
  87254. }
  87255. } );
  87256. // Make FixedColumns accessible from the DataTables instance
  87257. $.fn.dataTable.FixedColumns = FixedColumns;
  87258. $.fn.DataTable.FixedColumns = FixedColumns;
  87259. return FixedColumns;
  87260. }));
  87261. /*! FixedHeader 3.1.3
  87262. * ©2009-2017 SpryMedia Ltd - datatables.net/license
  87263. */
  87264. /**
  87265. * @summary FixedHeader
  87266. * @description Fix a table's header or footer, so it is always visible while
  87267. * scrolling
  87268. * @version 3.1.3
  87269. * @file dataTables.fixedHeader.js
  87270. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  87271. * @contact www.sprymedia.co.uk/contact
  87272. * @copyright Copyright 2009-2017 SpryMedia Ltd.
  87273. *
  87274. * This source file is free software, available under the following license:
  87275. * MIT license - http://datatables.net/license/mit
  87276. *
  87277. * This source file is distributed in the hope that it will be useful, but
  87278. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  87279. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  87280. *
  87281. * For details please refer to: http://www.datatables.net
  87282. */
  87283. (function( factory ){
  87284. if ( typeof define === 'function' && define.amd ) {
  87285. // AMD
  87286. define( ['jquery', 'datatables.net'], function ( $ ) {
  87287. return factory( $, window, document );
  87288. } );
  87289. }
  87290. else if ( typeof exports === 'object' ) {
  87291. // CommonJS
  87292. module.exports = function (root, $) {
  87293. if ( ! root ) {
  87294. root = window;
  87295. }
  87296. if ( ! $ || ! $.fn.dataTable ) {
  87297. $ = require('datatables.net')(root, $).$;
  87298. }
  87299. return factory( $, root, root.document );
  87300. };
  87301. }
  87302. else {
  87303. // Browser
  87304. factory( jQuery, window, document );
  87305. }
  87306. }(function( $, window, document, undefined ) {
  87307. 'use strict';
  87308. var DataTable = $.fn.dataTable;
  87309. var _instCounter = 0;
  87310. var FixedHeader = function ( dt, config ) {
  87311. // Sanity check - you just know it will happen
  87312. if ( ! (this instanceof FixedHeader) ) {
  87313. throw "FixedHeader must be initialised with the 'new' keyword.";
  87314. }
  87315. // Allow a boolean true for defaults
  87316. if ( config === true ) {
  87317. config = {};
  87318. }
  87319. dt = new DataTable.Api( dt );
  87320. this.c = $.extend( true, {}, FixedHeader.defaults, config );
  87321. this.s = {
  87322. dt: dt,
  87323. position: {
  87324. theadTop: 0,
  87325. tbodyTop: 0,
  87326. tfootTop: 0,
  87327. tfootBottom: 0,
  87328. width: 0,
  87329. left: 0,
  87330. tfootHeight: 0,
  87331. theadHeight: 0,
  87332. windowHeight: $(window).height(),
  87333. visible: true
  87334. },
  87335. headerMode: null,
  87336. footerMode: null,
  87337. autoWidth: dt.settings()[0].oFeatures.bAutoWidth,
  87338. namespace: '.dtfc'+(_instCounter++),
  87339. scrollLeft: {
  87340. header: -1,
  87341. footer: -1
  87342. },
  87343. enable: true
  87344. };
  87345. this.dom = {
  87346. floatingHeader: null,
  87347. thead: $(dt.table().header()),
  87348. tbody: $(dt.table().body()),
  87349. tfoot: $(dt.table().footer()),
  87350. header: {
  87351. host: null,
  87352. floating: null,
  87353. placeholder: null
  87354. },
  87355. footer: {
  87356. host: null,
  87357. floating: null,
  87358. placeholder: null
  87359. }
  87360. };
  87361. this.dom.header.host = this.dom.thead.parent();
  87362. this.dom.footer.host = this.dom.tfoot.parent();
  87363. var dtSettings = dt.settings()[0];
  87364. if ( dtSettings._fixedHeader ) {
  87365. throw "FixedHeader already initialised on table "+dtSettings.nTable.id;
  87366. }
  87367. dtSettings._fixedHeader = this;
  87368. this._constructor();
  87369. };
  87370. /*
  87371. * Variable: FixedHeader
  87372. * Purpose: Prototype for FixedHeader
  87373. * Scope: global
  87374. */
  87375. $.extend( FixedHeader.prototype, {
  87376. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87377. * API methods
  87378. */
  87379. /**
  87380. * Enable / disable the fixed elements
  87381. *
  87382. * @param {boolean} enable `true` to enable, `false` to disable
  87383. */
  87384. enable: function ( enable )
  87385. {
  87386. this.s.enable = enable;
  87387. if ( this.c.header ) {
  87388. this._modeChange( 'in-place', 'header', true );
  87389. }
  87390. if ( this.c.footer && this.dom.tfoot.length ) {
  87391. this._modeChange( 'in-place', 'footer', true );
  87392. }
  87393. this.update();
  87394. },
  87395. /**
  87396. * Set header offset
  87397. *
  87398. * @param {int} new value for headerOffset
  87399. */
  87400. headerOffset: function ( offset )
  87401. {
  87402. if ( offset !== undefined ) {
  87403. this.c.headerOffset = offset;
  87404. this.update();
  87405. }
  87406. return this.c.headerOffset;
  87407. },
  87408. /**
  87409. * Set footer offset
  87410. *
  87411. * @param {int} new value for footerOffset
  87412. */
  87413. footerOffset: function ( offset )
  87414. {
  87415. if ( offset !== undefined ) {
  87416. this.c.footerOffset = offset;
  87417. this.update();
  87418. }
  87419. return this.c.footerOffset;
  87420. },
  87421. /**
  87422. * Recalculate the position of the fixed elements and force them into place
  87423. */
  87424. update: function ()
  87425. {
  87426. this._positions();
  87427. this._scroll( true );
  87428. },
  87429. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87430. * Constructor
  87431. */
  87432. /**
  87433. * FixedHeader constructor - adding the required event listeners and
  87434. * simple initialisation
  87435. *
  87436. * @private
  87437. */
  87438. _constructor: function ()
  87439. {
  87440. var that = this;
  87441. var dt = this.s.dt;
  87442. $(window)
  87443. .on( 'scroll'+this.s.namespace, function () {
  87444. that._scroll();
  87445. } )
  87446. .on( 'resize'+this.s.namespace, function () {
  87447. that.s.position.windowHeight = $(window).height();
  87448. that.update();
  87449. } );
  87450. var autoHeader = $('.fh-fixedHeader');
  87451. if ( ! this.c.headerOffset && autoHeader.length ) {
  87452. this.c.headerOffset = autoHeader.outerHeight();
  87453. }
  87454. var autoFooter = $('.fh-fixedFooter');
  87455. if ( ! this.c.footerOffset && autoFooter.length ) {
  87456. this.c.footerOffset = autoFooter.outerHeight();
  87457. }
  87458. dt.on( 'column-reorder.dt.dtfc column-visibility.dt.dtfc draw.dt.dtfc column-sizing.dt.dtfc', function () {
  87459. that.update();
  87460. } );
  87461. dt.on( 'destroy.dtfc', function () {
  87462. dt.off( '.dtfc' );
  87463. $(window).off( that.s.namespace );
  87464. } );
  87465. this._positions();
  87466. this._scroll();
  87467. },
  87468. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87469. * Private methods
  87470. */
  87471. /**
  87472. * Clone a fixed item to act as a place holder for the original element
  87473. * which is moved into a clone of the table element, and moved around the
  87474. * document to give the fixed effect.
  87475. *
  87476. * @param {string} item 'header' or 'footer'
  87477. * @param {boolean} force Force the clone to happen, or allow automatic
  87478. * decision (reuse existing if available)
  87479. * @private
  87480. */
  87481. _clone: function ( item, force )
  87482. {
  87483. var dt = this.s.dt;
  87484. var itemDom = this.dom[ item ];
  87485. var itemElement = item === 'header' ?
  87486. this.dom.thead :
  87487. this.dom.tfoot;
  87488. if ( ! force && itemDom.floating ) {
  87489. // existing floating element - reuse it
  87490. itemDom.floating.removeClass( 'fixedHeader-floating fixedHeader-locked' );
  87491. }
  87492. else {
  87493. if ( itemDom.floating ) {
  87494. itemDom.placeholder.remove();
  87495. this._unsize( item );
  87496. itemDom.floating.children().detach();
  87497. itemDom.floating.remove();
  87498. }
  87499. itemDom.floating = $( dt.table().node().cloneNode( false ) )
  87500. .css( 'table-layout', 'fixed' )
  87501. .removeAttr( 'id' )
  87502. .append( itemElement )
  87503. .appendTo( 'body' );
  87504. // Insert a fake thead/tfoot into the DataTable to stop it jumping around
  87505. itemDom.placeholder = itemElement.clone( false )
  87506. itemDom.placeholder
  87507. .find( '*[id]' )
  87508. .removeAttr( 'id' );
  87509. itemDom.host.prepend( itemDom.placeholder );
  87510. // Clone widths
  87511. this._matchWidths( itemDom.placeholder, itemDom.floating );
  87512. }
  87513. },
  87514. /**
  87515. * Copy widths from the cells in one element to another. This is required
  87516. * for the footer as the footer in the main table takes its sizes from the
  87517. * header columns. That isn't present in the footer so to have it still
  87518. * align correctly, the sizes need to be copied over. It is also required
  87519. * for the header when auto width is not enabled
  87520. *
  87521. * @param {jQuery} from Copy widths from
  87522. * @param {jQuery} to Copy widths to
  87523. * @private
  87524. */
  87525. _matchWidths: function ( from, to ) {
  87526. var get = function ( name ) {
  87527. return $(name, from)
  87528. .map( function () {
  87529. return $(this).width();
  87530. } ).toArray();
  87531. };
  87532. var set = function ( name, toWidths ) {
  87533. $(name, to).each( function ( i ) {
  87534. $(this).css( {
  87535. width: toWidths[i],
  87536. minWidth: toWidths[i]
  87537. } );
  87538. } );
  87539. };
  87540. var thWidths = get( 'th' );
  87541. var tdWidths = get( 'td' );
  87542. set( 'th', thWidths );
  87543. set( 'td', tdWidths );
  87544. },
  87545. /**
  87546. * Remove assigned widths from the cells in an element. This is required
  87547. * when inserting the footer back into the main table so the size is defined
  87548. * by the header columns and also when auto width is disabled in the
  87549. * DataTable.
  87550. *
  87551. * @param {string} item The `header` or `footer`
  87552. * @private
  87553. */
  87554. _unsize: function ( item ) {
  87555. var el = this.dom[ item ].floating;
  87556. if ( el && (item === 'footer' || (item === 'header' && ! this.s.autoWidth)) ) {
  87557. $('th, td', el).css( {
  87558. width: '',
  87559. minWidth: ''
  87560. } );
  87561. }
  87562. else if ( el && item === 'header' ) {
  87563. $('th, td', el).css( 'min-width', '' );
  87564. }
  87565. },
  87566. /**
  87567. * Reposition the floating elements to take account of horizontal page
  87568. * scroll
  87569. *
  87570. * @param {string} item The `header` or `footer`
  87571. * @param {int} scrollLeft Document scrollLeft
  87572. * @private
  87573. */
  87574. _horizontal: function ( item, scrollLeft )
  87575. {
  87576. var itemDom = this.dom[ item ];
  87577. var position = this.s.position;
  87578. var lastScrollLeft = this.s.scrollLeft;
  87579. if ( itemDom.floating && lastScrollLeft[ item ] !== scrollLeft ) {
  87580. itemDom.floating.css( 'left', position.left - scrollLeft );
  87581. lastScrollLeft[ item ] = scrollLeft;
  87582. }
  87583. },
  87584. /**
  87585. * Change from one display mode to another. Each fixed item can be in one
  87586. * of:
  87587. *
  87588. * * `in-place` - In the main DataTable
  87589. * * `in` - Floating over the DataTable
  87590. * * `below` - (Header only) Fixed to the bottom of the table body
  87591. * * `above` - (Footer only) Fixed to the top of the table body
  87592. *
  87593. * @param {string} mode Mode that the item should be shown in
  87594. * @param {string} item 'header' or 'footer'
  87595. * @param {boolean} forceChange Force a redraw of the mode, even if already
  87596. * in that mode.
  87597. * @private
  87598. */
  87599. _modeChange: function ( mode, item, forceChange )
  87600. {
  87601. var dt = this.s.dt;
  87602. var itemDom = this.dom[ item ];
  87603. var position = this.s.position;
  87604. // Record focus. Browser's will cause input elements to loose focus if
  87605. // they are inserted else where in the doc
  87606. var tablePart = this.dom[ item==='footer' ? 'tfoot' : 'thead' ];
  87607. var focus = $.contains( tablePart[0], document.activeElement ) ?
  87608. document.activeElement :
  87609. null;
  87610. if ( mode === 'in-place' ) {
  87611. // Insert the header back into the table's real header
  87612. if ( itemDom.placeholder ) {
  87613. itemDom.placeholder.remove();
  87614. itemDom.placeholder = null;
  87615. }
  87616. this._unsize( item );
  87617. if ( item === 'header' ) {
  87618. itemDom.host.prepend( this.dom.thead );
  87619. }
  87620. else {
  87621. itemDom.host.append( this.dom.tfoot );
  87622. }
  87623. if ( itemDom.floating ) {
  87624. itemDom.floating.remove();
  87625. itemDom.floating = null;
  87626. }
  87627. }
  87628. else if ( mode === 'in' ) {
  87629. // Remove the header from the read header and insert into a fixed
  87630. // positioned floating table clone
  87631. this._clone( item, forceChange );
  87632. itemDom.floating
  87633. .addClass( 'fixedHeader-floating' )
  87634. .css( item === 'header' ? 'top' : 'bottom', this.c[item+'Offset'] )
  87635. .css( 'left', position.left+'px' )
  87636. .css( 'width', position.width+'px' );
  87637. if ( item === 'footer' ) {
  87638. itemDom.floating.css( 'top', '' );
  87639. }
  87640. }
  87641. else if ( mode === 'below' ) { // only used for the header
  87642. // Fix the position of the floating header at base of the table body
  87643. this._clone( item, forceChange );
  87644. itemDom.floating
  87645. .addClass( 'fixedHeader-locked' )
  87646. .css( 'top', position.tfootTop - position.theadHeight )
  87647. .css( 'left', position.left+'px' )
  87648. .css( 'width', position.width+'px' );
  87649. }
  87650. else if ( mode === 'above' ) { // only used for the footer
  87651. // Fix the position of the floating footer at top of the table body
  87652. this._clone( item, forceChange );
  87653. itemDom.floating
  87654. .addClass( 'fixedHeader-locked' )
  87655. .css( 'top', position.tbodyTop )
  87656. .css( 'left', position.left+'px' )
  87657. .css( 'width', position.width+'px' );
  87658. }
  87659. // Restore focus if it was lost
  87660. if ( focus && focus !== document.activeElement ) {
  87661. focus.focus();
  87662. }
  87663. this.s.scrollLeft.header = -1;
  87664. this.s.scrollLeft.footer = -1;
  87665. this.s[item+'Mode'] = mode;
  87666. },
  87667. /**
  87668. * Cache the positional information that is required for the mode
  87669. * calculations that FixedHeader performs.
  87670. *
  87671. * @private
  87672. */
  87673. _positions: function ()
  87674. {
  87675. var dt = this.s.dt;
  87676. var table = dt.table();
  87677. var position = this.s.position;
  87678. var dom = this.dom;
  87679. var tableNode = $(table.node());
  87680. // Need to use the header and footer that are in the main table,
  87681. // regardless of if they are clones, since they hold the positions we
  87682. // want to measure from
  87683. var thead = tableNode.children('thead');
  87684. var tfoot = tableNode.children('tfoot');
  87685. var tbody = dom.tbody;
  87686. position.visible = tableNode.is(':visible');
  87687. position.width = tableNode.outerWidth();
  87688. position.left = tableNode.offset().left;
  87689. position.theadTop = thead.offset().top;
  87690. position.tbodyTop = tbody.offset().top;
  87691. position.theadHeight = position.tbodyTop - position.theadTop;
  87692. if ( tfoot.length ) {
  87693. position.tfootTop = tfoot.offset().top;
  87694. position.tfootBottom = position.tfootTop + tfoot.outerHeight();
  87695. position.tfootHeight = position.tfootBottom - position.tfootTop;
  87696. }
  87697. else {
  87698. position.tfootTop = position.tbodyTop + tbody.outerHeight();
  87699. position.tfootBottom = position.tfootTop;
  87700. position.tfootHeight = position.tfootTop;
  87701. }
  87702. },
  87703. /**
  87704. * Mode calculation - determine what mode the fixed items should be placed
  87705. * into.
  87706. *
  87707. * @param {boolean} forceChange Force a redraw of the mode, even if already
  87708. * in that mode.
  87709. * @private
  87710. */
  87711. _scroll: function ( forceChange )
  87712. {
  87713. var windowTop = $(document).scrollTop();
  87714. var windowLeft = $(document).scrollLeft();
  87715. var position = this.s.position;
  87716. var headerMode, footerMode;
  87717. if ( ! this.s.enable ) {
  87718. return;
  87719. }
  87720. if ( this.c.header ) {
  87721. if ( ! position.visible || windowTop <= position.theadTop - this.c.headerOffset ) {
  87722. headerMode = 'in-place';
  87723. }
  87724. else if ( windowTop <= position.tfootTop - position.theadHeight - this.c.headerOffset ) {
  87725. headerMode = 'in';
  87726. }
  87727. else {
  87728. headerMode = 'below';
  87729. }
  87730. if ( forceChange || headerMode !== this.s.headerMode ) {
  87731. this._modeChange( headerMode, 'header', forceChange );
  87732. }
  87733. this._horizontal( 'header', windowLeft );
  87734. }
  87735. if ( this.c.footer && this.dom.tfoot.length ) {
  87736. if ( ! position.visible || windowTop + position.windowHeight >= position.tfootBottom + this.c.footerOffset ) {
  87737. footerMode = 'in-place';
  87738. }
  87739. else if ( position.windowHeight + windowTop > position.tbodyTop + position.tfootHeight + this.c.footerOffset ) {
  87740. footerMode = 'in';
  87741. }
  87742. else {
  87743. footerMode = 'above';
  87744. }
  87745. if ( forceChange || footerMode !== this.s.footerMode ) {
  87746. this._modeChange( footerMode, 'footer', forceChange );
  87747. }
  87748. this._horizontal( 'footer', windowLeft );
  87749. }
  87750. }
  87751. } );
  87752. /**
  87753. * Version
  87754. * @type {String}
  87755. * @static
  87756. */
  87757. FixedHeader.version = "3.1.3";
  87758. /**
  87759. * Defaults
  87760. * @type {Object}
  87761. * @static
  87762. */
  87763. FixedHeader.defaults = {
  87764. header: true,
  87765. footer: false,
  87766. headerOffset: 0,
  87767. footerOffset: 0
  87768. };
  87769. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87770. * DataTables interfaces
  87771. */
  87772. // Attach for constructor access
  87773. $.fn.dataTable.FixedHeader = FixedHeader;
  87774. $.fn.DataTable.FixedHeader = FixedHeader;
  87775. // DataTables creation - check if the FixedHeader option has been defined on the
  87776. // table and if so, initialise
  87777. $(document).on( 'init.dt.dtfh', function (e, settings, json) {
  87778. if ( e.namespace !== 'dt' ) {
  87779. return;
  87780. }
  87781. var init = settings.oInit.fixedHeader;
  87782. var defaults = DataTable.defaults.fixedHeader;
  87783. if ( (init || defaults) && ! settings._fixedHeader ) {
  87784. var opts = $.extend( {}, defaults, init );
  87785. if ( init !== false ) {
  87786. new FixedHeader( settings, opts );
  87787. }
  87788. }
  87789. } );
  87790. // DataTables API methods
  87791. DataTable.Api.register( 'fixedHeader()', function () {} );
  87792. DataTable.Api.register( 'fixedHeader.adjust()', function () {
  87793. return this.iterator( 'table', function ( ctx ) {
  87794. var fh = ctx._fixedHeader;
  87795. if ( fh ) {
  87796. fh.update();
  87797. }
  87798. } );
  87799. } );
  87800. DataTable.Api.register( 'fixedHeader.enable()', function ( flag ) {
  87801. return this.iterator( 'table', function ( ctx ) {
  87802. var fh = ctx._fixedHeader;
  87803. flag = ( flag !== undefined ? flag : true );
  87804. if ( fh && flag !== fh.s.enable ) {
  87805. fh.enable( flag );
  87806. }
  87807. } );
  87808. } );
  87809. DataTable.Api.register( 'fixedHeader.disable()', function ( ) {
  87810. return this.iterator( 'table', function ( ctx ) {
  87811. var fh = ctx._fixedHeader;
  87812. if ( fh && fh.s.enable ) {
  87813. fh.enable( false );
  87814. }
  87815. } );
  87816. } );
  87817. $.each( ['header', 'footer'], function ( i, el ) {
  87818. DataTable.Api.register( 'fixedHeader.'+el+'Offset()', function ( offset ) {
  87819. var ctx = this.context;
  87820. if ( offset === undefined ) {
  87821. return ctx.length && ctx[0]._fixedHeader ?
  87822. ctx[0]._fixedHeader[el +'Offset']() :
  87823. undefined;
  87824. }
  87825. return this.iterator( 'table', function ( ctx ) {
  87826. var fh = ctx._fixedHeader;
  87827. if ( fh ) {
  87828. fh[ el +'Offset' ]( offset );
  87829. }
  87830. } );
  87831. } );
  87832. } );
  87833. return FixedHeader;
  87834. }));
  87835. /*! KeyTable 2.3.2
  87836. * ©2009-2017 SpryMedia Ltd - datatables.net/license
  87837. */
  87838. /**
  87839. * @summary KeyTable
  87840. * @description Spreadsheet like keyboard navigation for DataTables
  87841. * @version 2.3.2
  87842. * @file dataTables.keyTable.js
  87843. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  87844. * @contact www.sprymedia.co.uk/contact
  87845. * @copyright Copyright 2009-2017 SpryMedia Ltd.
  87846. *
  87847. * This source file is free software, available under the following license:
  87848. * MIT license - http://datatables.net/license/mit
  87849. *
  87850. * This source file is distributed in the hope that it will be useful, but
  87851. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  87852. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  87853. *
  87854. * For details please refer to: http://www.datatables.net
  87855. */
  87856. (function( factory ){
  87857. if ( typeof define === 'function' && define.amd ) {
  87858. // AMD
  87859. define( ['jquery', 'datatables.net'], function ( $ ) {
  87860. return factory( $, window, document );
  87861. } );
  87862. }
  87863. else if ( typeof exports === 'object' ) {
  87864. // CommonJS
  87865. module.exports = function (root, $) {
  87866. if ( ! root ) {
  87867. root = window;
  87868. }
  87869. if ( ! $ || ! $.fn.dataTable ) {
  87870. $ = require('datatables.net')(root, $).$;
  87871. }
  87872. return factory( $, root, root.document );
  87873. };
  87874. }
  87875. else {
  87876. // Browser
  87877. factory( jQuery, window, document );
  87878. }
  87879. }(function( $, window, document, undefined ) {
  87880. 'use strict';
  87881. var DataTable = $.fn.dataTable;
  87882. var KeyTable = function ( dt, opts ) {
  87883. // Sanity check that we are using DataTables 1.10 or newer
  87884. if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) {
  87885. throw 'KeyTable requires DataTables 1.10.8 or newer';
  87886. }
  87887. // User and defaults configuration object
  87888. this.c = $.extend( true, {},
  87889. DataTable.defaults.keyTable,
  87890. KeyTable.defaults,
  87891. opts
  87892. );
  87893. // Internal settings
  87894. this.s = {
  87895. /** @type {DataTable.Api} DataTables' API instance */
  87896. dt: new DataTable.Api( dt ),
  87897. enable: true,
  87898. /** @type {bool} Flag for if a draw is triggered by focus */
  87899. focusDraw: false,
  87900. /** @type {bool} Flag to indicate when waiting for a draw to happen.
  87901. * Will ignore key presses at this point
  87902. */
  87903. waitingForDraw: false,
  87904. /** @type {object} Information about the last cell that was focused */
  87905. lastFocus: null
  87906. };
  87907. // DOM items
  87908. this.dom = {
  87909. };
  87910. // Check if row reorder has already been initialised on this table
  87911. var settings = this.s.dt.settings()[0];
  87912. var exisiting = settings.keytable;
  87913. if ( exisiting ) {
  87914. return exisiting;
  87915. }
  87916. settings.keytable = this;
  87917. this._constructor();
  87918. };
  87919. $.extend( KeyTable.prototype, {
  87920. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87921. * API methods for DataTables API interface
  87922. */
  87923. /**
  87924. * Blur the table's cell focus
  87925. */
  87926. blur: function ()
  87927. {
  87928. this._blur();
  87929. },
  87930. /**
  87931. * Enable cell focus for the table
  87932. *
  87933. * @param {string} state Can be `true`, `false` or `-string navigation-only`
  87934. */
  87935. enable: function ( state )
  87936. {
  87937. this.s.enable = state;
  87938. },
  87939. /**
  87940. * Focus on a cell
  87941. * @param {integer} row Row index
  87942. * @param {integer} column Column index
  87943. */
  87944. focus: function ( row, column )
  87945. {
  87946. this._focus( this.s.dt.cell( row, column ) );
  87947. },
  87948. /**
  87949. * Is the cell focused
  87950. * @param {object} cell Cell index to check
  87951. * @returns {boolean} true if focused, false otherwise
  87952. */
  87953. focused: function ( cell )
  87954. {
  87955. var lastFocus = this.s.lastFocus;
  87956. if ( ! lastFocus ) {
  87957. return false;
  87958. }
  87959. var lastIdx = this.s.lastFocus.cell.index();
  87960. return cell.row === lastIdx.row && cell.column === lastIdx.column;
  87961. },
  87962. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87963. * Constructor
  87964. */
  87965. /**
  87966. * Initialise the KeyTable instance
  87967. *
  87968. * @private
  87969. */
  87970. _constructor: function ()
  87971. {
  87972. this._tabInput();
  87973. var that = this;
  87974. var dt = this.s.dt;
  87975. var table = $( dt.table().node() );
  87976. // Need to be able to calculate the cell positions relative to the table
  87977. if ( table.css('position') === 'static' ) {
  87978. table.css( 'position', 'relative' );
  87979. }
  87980. // Click to focus
  87981. $( dt.table().body() ).on( 'click.keyTable', 'th, td', function (e) {
  87982. if ( that.s.enable === false ) {
  87983. return;
  87984. }
  87985. var cell = dt.cell( this );
  87986. if ( ! cell.any() ) {
  87987. return;
  87988. }
  87989. that._focus( cell, null, false, e );
  87990. } );
  87991. // Key events
  87992. $( document ).on( 'keydown.keyTable', function (e) {
  87993. that._key( e );
  87994. } );
  87995. // Click blur
  87996. if ( this.c.blurable ) {
  87997. $( document ).on( 'mousedown.keyTable', function ( e ) {
  87998. // Click on the search input will blur focus
  87999. if ( $(e.target).parents( '.dataTables_filter' ).length ) {
  88000. that._blur();
  88001. }
  88002. // If the click was inside the DataTables container, don't blur
  88003. if ( $(e.target).parents().filter( dt.table().container() ).length ) {
  88004. return;
  88005. }
  88006. // Don't blur in Editor form
  88007. if ( $(e.target).parents('div.DTE').length ) {
  88008. return;
  88009. }
  88010. // Or an Editor date input
  88011. if ( $(e.target).parents('div.editor-datetime').length ) {
  88012. return;
  88013. }
  88014. //If the click was inside the fixed columns container, don't blur
  88015. if ( $(e.target).parents().filter('.DTFC_Cloned').length ) {
  88016. return;
  88017. }
  88018. that._blur();
  88019. } );
  88020. }
  88021. if ( this.c.editor ) {
  88022. var editor = this.c.editor;
  88023. // Need to disable KeyTable when the main editor is shown
  88024. editor.on( 'open.keyTableMain', function (e, mode, action) {
  88025. if ( mode !== 'inline' && that.s.enable ) {
  88026. that.enable( false );
  88027. editor.one( 'close.keyTable', function () {
  88028. that.enable( true );
  88029. } );
  88030. }
  88031. } );
  88032. if ( this.c.editOnFocus ) {
  88033. dt.on( 'key-focus.keyTable key-refocus.keyTable', function ( e, dt, cell, orig ) {
  88034. that._editor( null, orig );
  88035. } );
  88036. }
  88037. // Activate Editor when a key is pressed (will be ignored, if
  88038. // already active).
  88039. dt.on( 'key.keyTable', function ( e, dt, key, cell, orig ) {
  88040. that._editor( key, orig );
  88041. } );
  88042. }
  88043. // Stave saving
  88044. if ( dt.settings()[0].oFeatures.bStateSave ) {
  88045. dt.on( 'stateSaveParams.keyTable', function (e, s, d) {
  88046. d.keyTable = that.s.lastFocus ?
  88047. that.s.lastFocus.cell.index() :
  88048. null;
  88049. } );
  88050. }
  88051. // Redraw - retain focus on the current cell
  88052. dt.on( 'draw.keyTable', function (e) {
  88053. if ( that.s.focusDraw ) {
  88054. return;
  88055. }
  88056. var lastFocus = that.s.lastFocus;
  88057. if ( lastFocus && lastFocus.node && $(lastFocus.node).closest('body') === document.body ) {
  88058. var relative = that.s.lastFocus.relative;
  88059. var info = dt.page.info();
  88060. var row = relative.row + info.start;
  88061. if ( info.recordsDisplay === 0 ) {
  88062. return;
  88063. }
  88064. // Reverse if needed
  88065. if ( row >= info.recordsDisplay ) {
  88066. row = info.recordsDisplay - 1;
  88067. }
  88068. that._focus( row, relative.column, true, e );
  88069. }
  88070. } );
  88071. dt.on( 'destroy.keyTable', function () {
  88072. dt.off( '.keyTable' );
  88073. $( dt.table().body() ).off( 'click.keyTable', 'th, td' );
  88074. $( document.body )
  88075. .off( 'keydown.keyTable' )
  88076. .off( 'click.keyTable' );
  88077. } );
  88078. // Initial focus comes from state or options
  88079. var state = dt.state.loaded();
  88080. if ( state && state.keyTable ) {
  88081. // Wait until init is done
  88082. dt.one( 'init', function () {
  88083. var cell = dt.cell( state.keyTable );
  88084. // Ensure that the saved cell still exists
  88085. if ( cell.any() ) {
  88086. cell.focus();
  88087. }
  88088. } );
  88089. }
  88090. else if ( this.c.focus ) {
  88091. dt.cell( this.c.focus ).focus();
  88092. }
  88093. },
  88094. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  88095. * Private methods
  88096. */
  88097. /**
  88098. * Blur the control
  88099. *
  88100. * @private
  88101. */
  88102. _blur: function ()
  88103. {
  88104. if ( ! this.s.enable || ! this.s.lastFocus ) {
  88105. return;
  88106. }
  88107. var cell = this.s.lastFocus.cell;
  88108. $( cell.node() ).removeClass( this.c.className );
  88109. this.s.lastFocus = null;
  88110. this._updateFixedColumns(cell.index().column);
  88111. this._emitEvent( 'key-blur', [ this.s.dt, cell ] );
  88112. },
  88113. /**
  88114. * Copy text from the focused cell to clipboard
  88115. *
  88116. * @private
  88117. */
  88118. _clipboardCopy: function ()
  88119. {
  88120. var dt = this.s.dt;
  88121. // If there is a cell focused, and there is no other text selected
  88122. // allow the focused cell's text to be copied to clipboard
  88123. if ( this.s.lastFocus && window.getSelection && !window.getSelection().toString() ) {
  88124. var cell = this.s.lastFocus.cell;
  88125. var text = cell.render('display');
  88126. var hiddenDiv = $('<div/>')
  88127. .css( {
  88128. height: 1,
  88129. width: 1,
  88130. overflow: 'hidden',
  88131. position: 'fixed',
  88132. top: 0,
  88133. left: 0
  88134. } );
  88135. var textarea = $('<textarea readonly/>')
  88136. .val( text )
  88137. .appendTo( hiddenDiv );
  88138. try {
  88139. hiddenDiv.appendTo( dt.table().container() );
  88140. textarea[0].focus();
  88141. textarea[0].select();
  88142. document.execCommand( 'copy' );
  88143. }
  88144. catch (e) {}
  88145. hiddenDiv.remove();
  88146. }
  88147. },
  88148. /**
  88149. * Get an array of the column indexes that KeyTable can operate on. This
  88150. * is a merge of the user supplied columns and the visible columns.
  88151. *
  88152. * @private
  88153. */
  88154. _columns: function ()
  88155. {
  88156. var dt = this.s.dt;
  88157. var user = dt.columns( this.c.columns ).indexes();
  88158. var out = [];
  88159. dt.columns( ':visible' ).every( function (i) {
  88160. if ( user.indexOf( i ) !== -1 ) {
  88161. out.push( i );
  88162. }
  88163. } );
  88164. return out;
  88165. },
  88166. /**
  88167. * Perform excel like navigation for Editor by triggering an edit on key
  88168. * press
  88169. *
  88170. * @param {integer} key Key code for the pressed key
  88171. * @param {object} orig Original event
  88172. * @private
  88173. */
  88174. _editor: function ( key, orig )
  88175. {
  88176. var that = this;
  88177. var dt = this.s.dt;
  88178. var editor = this.c.editor;
  88179. // Do nothing if there is already an inline edit in this cell
  88180. if ( $('div.DTE', this.s.lastFocus.cell.node()).length ) {
  88181. return;
  88182. }
  88183. // Don't activate inline editing when the shift key is pressed
  88184. if ( key === 16 ) {
  88185. return;
  88186. }
  88187. orig.stopPropagation();
  88188. // Return key should do nothing - for textareas it would empty the
  88189. // contents
  88190. if ( key === 13 ) {
  88191. orig.preventDefault();
  88192. }
  88193. editor
  88194. .one( 'open.keyTable', function () {
  88195. // Remove cancel open
  88196. editor.off( 'cancelOpen.keyTable' );
  88197. // Excel style - select all text
  88198. if ( that.c.editAutoSelect ) {
  88199. $('div.DTE_Field_InputControl input, div.DTE_Field_InputControl textarea').select();
  88200. }
  88201. // Reduce the keys the Keys listens for
  88202. dt.keys.enable( that.c.editorKeys );
  88203. // On blur of the navigation submit
  88204. dt.one( 'key-blur.editor', function () {
  88205. if ( editor.displayed() ) {
  88206. editor.submit();
  88207. }
  88208. } );
  88209. // Restore full key navigation on close
  88210. editor.one( 'close', function () {
  88211. dt.keys.enable( true );
  88212. dt.off( 'key-blur.editor' );
  88213. } );
  88214. } )
  88215. .one( 'cancelOpen.keyTable', function () {
  88216. // `preOpen` can cancel the display of the form, so it
  88217. // might be that the open event handler isn't needed
  88218. editor.off( 'open.keyTable' );
  88219. } )
  88220. .inline( this.s.lastFocus.cell.index() );
  88221. },
  88222. /**
  88223. * Emit an event on the DataTable for listeners
  88224. *
  88225. * @param {string} name Event name
  88226. * @param {array} args Event arguments
  88227. * @private
  88228. */
  88229. _emitEvent: function ( name, args )
  88230. {
  88231. this.s.dt.iterator( 'table', function ( ctx, i ) {
  88232. $(ctx.nTable).triggerHandler( name, args );
  88233. } );
  88234. },
  88235. /**
  88236. * Focus on a particular cell, shifting the table's paging if required
  88237. *
  88238. * @param {DataTables.Api|integer} row Can be given as an API instance that
  88239. * contains the cell to focus or as an integer. As the latter it is the
  88240. * visible row index (from the whole data set) - NOT the data index
  88241. * @param {integer} [column] Not required if a cell is given as the first
  88242. * parameter. Otherwise this is the column data index for the cell to
  88243. * focus on
  88244. * @param {boolean} [shift=true] Should the viewport be moved to show cell
  88245. * @private
  88246. */
  88247. _focus: function ( row, column, shift, originalEvent )
  88248. {
  88249. var that = this;
  88250. var dt = this.s.dt;
  88251. var pageInfo = dt.page.info();
  88252. var lastFocus = this.s.lastFocus;
  88253. if ( ! originalEvent) {
  88254. originalEvent = null;
  88255. }
  88256. if ( ! this.s.enable ) {
  88257. return;
  88258. }
  88259. if ( typeof row !== 'number' ) {
  88260. // Convert the cell to a row and column
  88261. var index = row.index();
  88262. column = index.column;
  88263. row = dt
  88264. .rows( { filter: 'applied', order: 'applied' } )
  88265. .indexes()
  88266. .indexOf( index.row );
  88267. // For server-side processing normalise the row by adding the start
  88268. // point, since `rows().indexes()` includes only rows that are
  88269. // available at the client-side
  88270. if ( pageInfo.serverSide ) {
  88271. row += pageInfo.start;
  88272. }
  88273. }
  88274. // Is the row on the current page? If not, we need to redraw to show the
  88275. // page
  88276. if ( pageInfo.length !== -1 && (row < pageInfo.start || row >= pageInfo.start+pageInfo.length) ) {
  88277. this.s.focusDraw = true;
  88278. this.s.waitingForDraw = true;
  88279. dt
  88280. .one( 'draw', function () {
  88281. that.s.focusDraw = false;
  88282. that.s.waitingForDraw = false;
  88283. that._focus( row, column, undefined, originalEvent );
  88284. } )
  88285. .page( Math.floor( row / pageInfo.length ) )
  88286. .draw( false );
  88287. return;
  88288. }
  88289. // In the available columns?
  88290. if ( $.inArray( column, this._columns() ) === -1 ) {
  88291. return;
  88292. }
  88293. // De-normalise the server-side processing row, so we select the row
  88294. // in its displayed position
  88295. if ( pageInfo.serverSide ) {
  88296. row -= pageInfo.start;
  88297. }
  88298. // Get the cell from the current position - ignoring any cells which might
  88299. // not have been rendered (therefore can't use `:eq()` selector).
  88300. var cells = dt.cells( null, column, {search: 'applied', order: 'applied'} ).flatten();
  88301. var cell = dt.cell( cells[ row ] );
  88302. if ( lastFocus ) {
  88303. // Don't trigger a refocus on the same cell
  88304. if ( lastFocus.node === cell.node() ) {
  88305. this._emitEvent( 'key-refocus', [ this.s.dt, cell, originalEvent || null ] );
  88306. return;
  88307. }
  88308. // Otherwise blur the old focus
  88309. this._blur();
  88310. }
  88311. var node = $( cell.node() );
  88312. node.addClass( this.c.className );
  88313. this._updateFixedColumns(column);
  88314. // Shift viewpoint and page to make cell visible
  88315. if ( shift === undefined || shift === true ) {
  88316. this._scroll( $(window), $(document.body), node, 'offset' );
  88317. var bodyParent = dt.table().body().parentNode;
  88318. if ( bodyParent !== dt.table().header().parentNode ) {
  88319. var parent = $(bodyParent.parentNode);
  88320. this._scroll( parent, parent, node, 'position' );
  88321. }
  88322. }
  88323. // Event and finish
  88324. this.s.lastFocus = {
  88325. cell: cell,
  88326. node: cell.node(),
  88327. relative: {
  88328. row: dt.rows( { page: 'current' } ).indexes().indexOf( cell.index().row ),
  88329. column: cell.index().column
  88330. }
  88331. };
  88332. this._emitEvent( 'key-focus', [ this.s.dt, cell, originalEvent || null ] );
  88333. dt.state.save();
  88334. },
  88335. /**
  88336. * Handle key press
  88337. *
  88338. * @param {object} e Event
  88339. * @private
  88340. */
  88341. _key: function ( e )
  88342. {
  88343. // If we are waiting for a draw to happen from another key event, then
  88344. // do nothing for this new key press.
  88345. if ( this.s.waitingForDraw ) {
  88346. e.preventDefault();
  88347. return;
  88348. }
  88349. var enable = this.s.enable;
  88350. var navEnable = enable === true || enable === 'navigation-only';
  88351. if ( ! enable ) {
  88352. return;
  88353. }
  88354. if ( e.ctrlKey && e.keyCode === 67 ) { // c
  88355. this._clipboardCopy();
  88356. return;
  88357. }
  88358. if ( e.keyCode === 0 || e.ctrlKey || e.metaKey || e.altKey ) {
  88359. return;
  88360. }
  88361. // If not focused, then there is no key action to take
  88362. var lastFocus = this.s.lastFocus;
  88363. if ( ! lastFocus ) {
  88364. return;
  88365. }
  88366. var that = this;
  88367. var dt = this.s.dt;
  88368. // If we are not listening for this key, do nothing
  88369. if ( this.c.keys && $.inArray( e.keyCode, this.c.keys ) === -1 ) {
  88370. return;
  88371. }
  88372. switch( e.keyCode ) {
  88373. case 9: // tab
  88374. // `enable` can be tab-only
  88375. this._shift( e, e.shiftKey ? 'left' : 'right', true );
  88376. break;
  88377. case 27: // esc
  88378. if ( this.s.blurable && enable === true ) {
  88379. this._blur();
  88380. }
  88381. break;
  88382. case 33: // page up (previous page)
  88383. case 34: // page down (next page)
  88384. if ( navEnable ) {
  88385. e.preventDefault();
  88386. dt
  88387. .page( e.keyCode === 33 ? 'previous' : 'next' )
  88388. .draw( false );
  88389. }
  88390. break;
  88391. case 35: // end (end of current page)
  88392. case 36: // home (start of current page)
  88393. if ( navEnable ) {
  88394. e.preventDefault();
  88395. var indexes = dt.cells( {page: 'current'} ).indexes();
  88396. var colIndexes = this._columns();
  88397. this._focus( dt.cell(
  88398. indexes[ e.keyCode === 35 ? indexes.length-1 : colIndexes[0] ]
  88399. ), null, true, e );
  88400. }
  88401. break;
  88402. case 37: // left arrow
  88403. if ( navEnable ) {
  88404. this._shift( e, 'left' );
  88405. }
  88406. break;
  88407. case 38: // up arrow
  88408. if ( navEnable ) {
  88409. this._shift( e, 'up' );
  88410. }
  88411. break;
  88412. case 39: // right arrow
  88413. if ( navEnable ) {
  88414. this._shift( e, 'right' );
  88415. }
  88416. break;
  88417. case 40: // down arrow
  88418. if ( navEnable ) {
  88419. this._shift( e, 'down' );
  88420. }
  88421. break;
  88422. default:
  88423. // Everything else - pass through only when fully enabled
  88424. if ( enable === true ) {
  88425. this._emitEvent( 'key', [ dt, e.keyCode, this.s.lastFocus.cell, e ] );
  88426. }
  88427. break;
  88428. }
  88429. },
  88430. /**
  88431. * Scroll a container to make a cell visible in it. This can be used for
  88432. * both DataTables scrolling and native window scrolling.
  88433. *
  88434. * @param {jQuery} container Scrolling container
  88435. * @param {jQuery} scroller Item being scrolled
  88436. * @param {jQuery} cell Cell in the scroller
  88437. * @param {string} posOff `position` or `offset` - which to use for the
  88438. * calculation. `offset` for the document, otherwise `position`
  88439. * @private
  88440. */
  88441. _scroll: function ( container, scroller, cell, posOff )
  88442. {
  88443. var offset = cell[posOff]();
  88444. var height = cell.outerHeight();
  88445. var width = cell.outerWidth();
  88446. var scrollTop = scroller.scrollTop();
  88447. var scrollLeft = scroller.scrollLeft();
  88448. var containerHeight = container.height();
  88449. var containerWidth = container.width();
  88450. // If Scroller is being used, the table can be `position: absolute` and that
  88451. // needs to be taken account of in the offset. If no Scroller, this will be 0
  88452. if ( posOff === 'position' ) {
  88453. offset.top += parseInt( cell.closest('table').css('top'), 10 );
  88454. }
  88455. // Top correction
  88456. if ( offset.top < scrollTop ) {
  88457. scroller.scrollTop( offset.top );
  88458. }
  88459. // Left correction
  88460. if ( offset.left < scrollLeft ) {
  88461. scroller.scrollLeft( offset.left );
  88462. }
  88463. // Bottom correction
  88464. if ( offset.top + height > scrollTop + containerHeight && height < containerHeight ) {
  88465. scroller.scrollTop( offset.top + height - containerHeight );
  88466. }
  88467. // Right correction
  88468. if ( offset.left + width > scrollLeft + containerWidth && width < containerWidth ) {
  88469. scroller.scrollLeft( offset.left + width - containerWidth );
  88470. }
  88471. },
  88472. /**
  88473. * Calculate a single offset movement in the table - up, down, left and
  88474. * right and then perform the focus if possible
  88475. *
  88476. * @param {object} e Event object
  88477. * @param {string} direction Movement direction
  88478. * @param {boolean} keyBlurable `true` if the key press can result in the
  88479. * table being blurred. This is so arrow keys won't blur the table, but
  88480. * tab will.
  88481. * @private
  88482. */
  88483. _shift: function ( e, direction, keyBlurable )
  88484. {
  88485. var that = this;
  88486. var dt = this.s.dt;
  88487. var pageInfo = dt.page.info();
  88488. var rows = pageInfo.recordsDisplay;
  88489. var currentCell = this.s.lastFocus.cell;
  88490. var columns = this._columns();
  88491. if ( ! currentCell ) {
  88492. return;
  88493. }
  88494. var currRow = dt
  88495. .rows( { filter: 'applied', order: 'applied' } )
  88496. .indexes()
  88497. .indexOf( currentCell.index().row );
  88498. // When server-side processing, `rows().indexes()` only gives the rows
  88499. // that are available at the client-side, so we need to normalise the
  88500. // row's current position by the display start point
  88501. if ( pageInfo.serverSide ) {
  88502. currRow += pageInfo.start;
  88503. }
  88504. var currCol = dt
  88505. .columns( columns )
  88506. .indexes()
  88507. .indexOf( currentCell.index().column );
  88508. var
  88509. row = currRow,
  88510. column = columns[ currCol ]; // row is the display, column is an index
  88511. if ( direction === 'right' ) {
  88512. if ( currCol >= columns.length - 1 ) {
  88513. row++;
  88514. column = columns[0];
  88515. }
  88516. else {
  88517. column = columns[ currCol+1 ];
  88518. }
  88519. }
  88520. else if ( direction === 'left' ) {
  88521. if ( currCol === 0 ) {
  88522. row--;
  88523. column = columns[ columns.length - 1 ];
  88524. }
  88525. else {
  88526. column = columns[ currCol-1 ];
  88527. }
  88528. }
  88529. else if ( direction === 'up' ) {
  88530. row--;
  88531. }
  88532. else if ( direction === 'down' ) {
  88533. row++;
  88534. }
  88535. if ( row >= 0 && row < rows && $.inArray( column, columns ) !== -1
  88536. ) {
  88537. e.preventDefault();
  88538. this._focus( row, column, true, e );
  88539. }
  88540. else if ( ! keyBlurable || ! this.c.blurable ) {
  88541. // No new focus, but if the table isn't blurable, then don't loose
  88542. // focus
  88543. e.preventDefault();
  88544. }
  88545. else {
  88546. this._blur();
  88547. }
  88548. },
  88549. /**
  88550. * Create a hidden input element that can receive focus on behalf of the
  88551. * table
  88552. *
  88553. * @private
  88554. */
  88555. _tabInput: function ()
  88556. {
  88557. var that = this;
  88558. var dt = this.s.dt;
  88559. var tabIndex = this.c.tabIndex !== null ?
  88560. this.c.tabIndex :
  88561. dt.settings()[0].iTabIndex;
  88562. if ( tabIndex == -1 ) {
  88563. return;
  88564. }
  88565. var div = $('<div><input type="text" tabindex="'+tabIndex+'"/></div>')
  88566. .css( {
  88567. position: 'absolute',
  88568. height: 1,
  88569. width: 0,
  88570. overflow: 'hidden'
  88571. } )
  88572. .insertBefore( dt.table().node() );
  88573. div.children().on( 'focus', function (e) {
  88574. if ( dt.cell(':eq(0)', {page: 'current'}).any() ) {
  88575. that._focus( dt.cell(':eq(0)', '0:visible', {page: 'current'}), null, true, e );
  88576. }
  88577. } );
  88578. },
  88579. /**
  88580. * Update fixed columns if they are enabled and if the cell we are
  88581. * focusing is inside a fixed column
  88582. * @param {integer} column Index of the column being changed
  88583. * @private
  88584. */
  88585. _updateFixedColumns: function( column )
  88586. {
  88587. var dt = this.s.dt;
  88588. var settings = dt.settings()[0];
  88589. if ( settings._oFixedColumns ) {
  88590. var leftCols = settings._oFixedColumns.s.iLeftColumns;
  88591. var rightCols = settings.aoColumns.length - settings._oFixedColumns.s.iRightColumns;
  88592. if (column < leftCols || column >= rightCols) {
  88593. dt.fixedColumns().update();
  88594. }
  88595. }
  88596. }
  88597. } );
  88598. /**
  88599. * KeyTable default settings for initialisation
  88600. *
  88601. * @namespace
  88602. * @name KeyTable.defaults
  88603. * @static
  88604. */
  88605. KeyTable.defaults = {
  88606. /**
  88607. * Can focus be removed from the table
  88608. * @type {Boolean}
  88609. */
  88610. blurable: true,
  88611. /**
  88612. * Class to give to the focused cell
  88613. * @type {String}
  88614. */
  88615. className: 'focus',
  88616. /**
  88617. * Columns that can be focused. This is automatically merged with the
  88618. * visible columns as only visible columns can gain focus.
  88619. * @type {String}
  88620. */
  88621. columns: '', // all
  88622. /**
  88623. * Editor instance to automatically perform Excel like navigation
  88624. * @type {Editor}
  88625. */
  88626. editor: null,
  88627. /**
  88628. * Option that defines what KeyTable's behaviour will be when used with
  88629. * Editor's inline editing. Can be `navigation-only` or `tab-only`.
  88630. * @type {String}
  88631. */
  88632. editorKeys: 'navigation-only',
  88633. /**
  88634. * Set if Editor should automatically select the text in the input
  88635. * @type {Boolean}
  88636. */
  88637. editAutoSelect: true,
  88638. /**
  88639. * Control if editing should be activated immediately upon focus
  88640. * @type {Boolean}
  88641. */
  88642. editOnFocus: false,
  88643. /**
  88644. * Select a cell to automatically select on start up. `null` for no
  88645. * automatic selection
  88646. * @type {cell-selector}
  88647. */
  88648. focus: null,
  88649. /**
  88650. * Array of keys to listen for
  88651. * @type {null|array}
  88652. */
  88653. keys: null,
  88654. /**
  88655. * Tab index for where the table should sit in the document's tab flow
  88656. * @type {integer|null}
  88657. */
  88658. tabIndex: null
  88659. };
  88660. KeyTable.version = "2.3.2";
  88661. $.fn.dataTable.KeyTable = KeyTable;
  88662. $.fn.DataTable.KeyTable = KeyTable;
  88663. DataTable.Api.register( 'cell.blur()', function () {
  88664. return this.iterator( 'table', function (ctx) {
  88665. if ( ctx.keytable ) {
  88666. ctx.keytable.blur();
  88667. }
  88668. } );
  88669. } );
  88670. DataTable.Api.register( 'cell().focus()', function () {
  88671. return this.iterator( 'cell', function (ctx, row, column) {
  88672. if ( ctx.keytable ) {
  88673. ctx.keytable.focus( row, column );
  88674. }
  88675. } );
  88676. } );
  88677. DataTable.Api.register( 'keys.disable()', function () {
  88678. return this.iterator( 'table', function (ctx) {
  88679. if ( ctx.keytable ) {
  88680. ctx.keytable.enable( false );
  88681. }
  88682. } );
  88683. } );
  88684. DataTable.Api.register( 'keys.enable()', function ( opts ) {
  88685. return this.iterator( 'table', function (ctx) {
  88686. if ( ctx.keytable ) {
  88687. ctx.keytable.enable( opts === undefined ? true : opts );
  88688. }
  88689. } );
  88690. } );
  88691. // Cell selector
  88692. DataTable.ext.selector.cell.push( function ( settings, opts, cells ) {
  88693. var focused = opts.focused;
  88694. var kt = settings.keytable;
  88695. var out = [];
  88696. if ( ! kt || focused === undefined ) {
  88697. return cells;
  88698. }
  88699. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  88700. if ( (focused === true && kt.focused( cells[i] ) ) ||
  88701. (focused === false && ! kt.focused( cells[i] ) )
  88702. ) {
  88703. out.push( cells[i] );
  88704. }
  88705. }
  88706. return out;
  88707. } );
  88708. // Attach a listener to the document which listens for DataTables initialisation
  88709. // events so we can automatically initialise
  88710. $(document).on( 'preInit.dt.dtk', function (e, settings, json) {
  88711. if ( e.namespace !== 'dt' ) {
  88712. return;
  88713. }
  88714. var init = settings.oInit.keys;
  88715. var defaults = DataTable.defaults.keys;
  88716. if ( init || defaults ) {
  88717. var opts = $.extend( {}, defaults, init );
  88718. if ( init !== false ) {
  88719. new KeyTable( settings, opts );
  88720. }
  88721. }
  88722. } );
  88723. return KeyTable;
  88724. }));
  88725. /*! Responsive 2.2.1
  88726. * 2014-2017 SpryMedia Ltd - datatables.net/license
  88727. */
  88728. /**
  88729. * @summary Responsive
  88730. * @description Responsive tables plug-in for DataTables
  88731. * @version 2.2.1
  88732. * @file dataTables.responsive.js
  88733. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  88734. * @contact www.sprymedia.co.uk/contact
  88735. * @copyright Copyright 2014-2017 SpryMedia Ltd.
  88736. *
  88737. * This source file is free software, available under the following license:
  88738. * MIT license - http://datatables.net/license/mit
  88739. *
  88740. * This source file is distributed in the hope that it will be useful, but
  88741. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  88742. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  88743. *
  88744. * For details please refer to: http://www.datatables.net
  88745. */
  88746. (function( factory ){
  88747. if ( typeof define === 'function' && define.amd ) {
  88748. // AMD
  88749. define( ['jquery', 'datatables.net'], function ( $ ) {
  88750. return factory( $, window, document );
  88751. } );
  88752. }
  88753. else if ( typeof exports === 'object' ) {
  88754. // CommonJS
  88755. module.exports = function (root, $) {
  88756. if ( ! root ) {
  88757. root = window;
  88758. }
  88759. if ( ! $ || ! $.fn.dataTable ) {
  88760. $ = require('datatables.net')(root, $).$;
  88761. }
  88762. return factory( $, root, root.document );
  88763. };
  88764. }
  88765. else {
  88766. // Browser
  88767. factory( jQuery, window, document );
  88768. }
  88769. }(function( $, window, document, undefined ) {
  88770. 'use strict';
  88771. var DataTable = $.fn.dataTable;
  88772. /**
  88773. * Responsive is a plug-in for the DataTables library that makes use of
  88774. * DataTables' ability to change the visibility of columns, changing the
  88775. * visibility of columns so the displayed columns fit into the table container.
  88776. * The end result is that complex tables will be dynamically adjusted to fit
  88777. * into the viewport, be it on a desktop, tablet or mobile browser.
  88778. *
  88779. * Responsive for DataTables has two modes of operation, which can used
  88780. * individually or combined:
  88781. *
  88782. * * Class name based control - columns assigned class names that match the
  88783. * breakpoint logic can be shown / hidden as required for each breakpoint.
  88784. * * Automatic control - columns are automatically hidden when there is no
  88785. * room left to display them. Columns removed from the right.
  88786. *
  88787. * In additional to column visibility control, Responsive also has built into
  88788. * options to use DataTables' child row display to show / hide the information
  88789. * from the table that has been hidden. There are also two modes of operation
  88790. * for this child row display:
  88791. *
  88792. * * Inline - when the control element that the user can use to show / hide
  88793. * child rows is displayed inside the first column of the table.
  88794. * * Column - where a whole column is dedicated to be the show / hide control.
  88795. *
  88796. * Initialisation of Responsive is performed by:
  88797. *
  88798. * * Adding the class `responsive` or `dt-responsive` to the table. In this case
  88799. * Responsive will automatically be initialised with the default configuration
  88800. * options when the DataTable is created.
  88801. * * Using the `responsive` option in the DataTables configuration options. This
  88802. * can also be used to specify the configuration options, or simply set to
  88803. * `true` to use the defaults.
  88804. *
  88805. * @class
  88806. * @param {object} settings DataTables settings object for the host table
  88807. * @param {object} [opts] Configuration options
  88808. * @requires jQuery 1.7+
  88809. * @requires DataTables 1.10.3+
  88810. *
  88811. * @example
  88812. * $('#example').DataTable( {
  88813. * responsive: true
  88814. * } );
  88815. * } );
  88816. */
  88817. var Responsive = function ( settings, opts ) {
  88818. // Sanity check that we are using DataTables 1.10 or newer
  88819. if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.10' ) ) {
  88820. throw 'DataTables Responsive requires DataTables 1.10.10 or newer';
  88821. }
  88822. this.s = {
  88823. dt: new DataTable.Api( settings ),
  88824. columns: [],
  88825. current: []
  88826. };
  88827. // Check if responsive has already been initialised on this table
  88828. if ( this.s.dt.settings()[0].responsive ) {
  88829. return;
  88830. }
  88831. // details is an object, but for simplicity the user can give it as a string
  88832. // or a boolean
  88833. if ( opts && typeof opts.details === 'string' ) {
  88834. opts.details = { type: opts.details };
  88835. }
  88836. else if ( opts && opts.details === false ) {
  88837. opts.details = { type: false };
  88838. }
  88839. else if ( opts && opts.details === true ) {
  88840. opts.details = { type: 'inline' };
  88841. }
  88842. this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts );
  88843. settings.responsive = this;
  88844. this._constructor();
  88845. };
  88846. $.extend( Responsive.prototype, {
  88847. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  88848. * Constructor
  88849. */
  88850. /**
  88851. * Initialise the Responsive instance
  88852. *
  88853. * @private
  88854. */
  88855. _constructor: function ()
  88856. {
  88857. var that = this;
  88858. var dt = this.s.dt;
  88859. var dtPrivateSettings = dt.settings()[0];
  88860. var oldWindowWidth = $(window).width();
  88861. dt.settings()[0]._responsive = this;
  88862. // Use DataTables' throttle function to avoid processor thrashing on
  88863. // resize
  88864. $(window).on( 'resize.dtr orientationchange.dtr', DataTable.util.throttle( function () {
  88865. // iOS has a bug whereby resize can fire when only scrolling
  88866. // See: http://stackoverflow.com/questions/8898412
  88867. var width = $(window).width();
  88868. if ( width !== oldWindowWidth ) {
  88869. that._resize();
  88870. oldWindowWidth = width;
  88871. }
  88872. } ) );
  88873. // DataTables doesn't currently trigger an event when a row is added, so
  88874. // we need to hook into its private API to enforce the hidden rows when
  88875. // new data is added
  88876. dtPrivateSettings.oApi._fnCallbackReg( dtPrivateSettings, 'aoRowCreatedCallback', function (tr, data, idx) {
  88877. if ( $.inArray( false, that.s.current ) !== -1 ) {
  88878. $('>td, >th', tr).each( function ( i ) {
  88879. var idx = dt.column.index( 'toData', i );
  88880. if ( that.s.current[idx] === false ) {
  88881. $(this).css('display', 'none');
  88882. }
  88883. } );
  88884. }
  88885. } );
  88886. // Destroy event handler
  88887. dt.on( 'destroy.dtr', function () {
  88888. dt.off( '.dtr' );
  88889. $( dt.table().body() ).off( '.dtr' );
  88890. $(window).off( 'resize.dtr orientationchange.dtr' );
  88891. // Restore the columns that we've hidden
  88892. $.each( that.s.current, function ( i, val ) {
  88893. if ( val === false ) {
  88894. that._setColumnVis( i, true );
  88895. }
  88896. } );
  88897. } );
  88898. // Reorder the breakpoints array here in case they have been added out
  88899. // of order
  88900. this.c.breakpoints.sort( function (a, b) {
  88901. return a.width < b.width ? 1 :
  88902. a.width > b.width ? -1 : 0;
  88903. } );
  88904. this._classLogic();
  88905. this._resizeAuto();
  88906. // Details handler
  88907. var details = this.c.details;
  88908. if ( details.type !== false ) {
  88909. that._detailsInit();
  88910. // DataTables will trigger this event on every column it shows and
  88911. // hides individually
  88912. dt.on( 'column-visibility.dtr', function (e, ctx, col, vis, recalc) {
  88913. if ( recalc ) {
  88914. that._classLogic();
  88915. that._resizeAuto();
  88916. that._resize();
  88917. }
  88918. } );
  88919. // Redraw the details box on each draw which will happen if the data
  88920. // has changed. This is used until DataTables implements a native
  88921. // `updated` event for rows
  88922. dt.on( 'draw.dtr', function () {
  88923. that._redrawChildren();
  88924. } );
  88925. $(dt.table().node()).addClass( 'dtr-'+details.type );
  88926. }
  88927. dt.on( 'column-reorder.dtr', function (e, settings, details) {
  88928. that._classLogic();
  88929. that._resizeAuto();
  88930. that._resize();
  88931. } );
  88932. // Change in column sizes means we need to calc
  88933. dt.on( 'column-sizing.dtr', function () {
  88934. that._resizeAuto();
  88935. that._resize();
  88936. });
  88937. // On Ajax reload we want to reopen any child rows which are displayed
  88938. // by responsive
  88939. dt.on( 'preXhr.dtr', function () {
  88940. var rowIds = [];
  88941. dt.rows().every( function () {
  88942. if ( this.child.isShown() ) {
  88943. rowIds.push( this.id(true) );
  88944. }
  88945. } );
  88946. dt.one( 'draw.dtr', function () {
  88947. that._resizeAuto();
  88948. that._resize();
  88949. dt.rows( rowIds ).every( function () {
  88950. that._detailsDisplay( this, false );
  88951. } );
  88952. } );
  88953. });
  88954. dt.on( 'init.dtr', function (e, settings, details) {
  88955. that._resizeAuto();
  88956. that._resize();
  88957. // If columns were hidden, then DataTables needs to adjust the
  88958. // column sizing
  88959. if ( $.inArray( false, that.s.current ) ) {
  88960. dt.columns.adjust();
  88961. }
  88962. } );
  88963. // First pass - draw the table for the current viewport size
  88964. this._resize();
  88965. },
  88966. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  88967. * Private methods
  88968. */
  88969. /**
  88970. * Calculate the visibility for the columns in a table for a given
  88971. * breakpoint. The result is pre-determined based on the class logic if
  88972. * class names are used to control all columns, but the width of the table
  88973. * is also used if there are columns which are to be automatically shown
  88974. * and hidden.
  88975. *
  88976. * @param {string} breakpoint Breakpoint name to use for the calculation
  88977. * @return {array} Array of boolean values initiating the visibility of each
  88978. * column.
  88979. * @private
  88980. */
  88981. _columnsVisiblity: function ( breakpoint )
  88982. {
  88983. var dt = this.s.dt;
  88984. var columns = this.s.columns;
  88985. var i, ien;
  88986. // Create an array that defines the column ordering based first on the
  88987. // column's priority, and secondly the column index. This allows the
  88988. // columns to be removed from the right if the priority matches
  88989. var order = columns
  88990. .map( function ( col, idx ) {
  88991. return {
  88992. columnIdx: idx,
  88993. priority: col.priority
  88994. };
  88995. } )
  88996. .sort( function ( a, b ) {
  88997. if ( a.priority !== b.priority ) {
  88998. return a.priority - b.priority;
  88999. }
  89000. return a.columnIdx - b.columnIdx;
  89001. } );
  89002. // Class logic - determine which columns are in this breakpoint based
  89003. // on the classes. If no class control (i.e. `auto`) then `-` is used
  89004. // to indicate this to the rest of the function
  89005. var display = $.map( columns, function ( col ) {
  89006. return col.auto && col.minWidth === null ?
  89007. false :
  89008. col.auto === true ?
  89009. '-' :
  89010. $.inArray( breakpoint, col.includeIn ) !== -1;
  89011. } );
  89012. // Auto column control - first pass: how much width is taken by the
  89013. // ones that must be included from the non-auto columns
  89014. var requiredWidth = 0;
  89015. for ( i=0, ien=display.length ; i<ien ; i++ ) {
  89016. if ( display[i] === true ) {
  89017. requiredWidth += columns[i].minWidth;
  89018. }
  89019. }
  89020. // Second pass, use up any remaining width for other columns. For
  89021. // scrolling tables we need to subtract the width of the scrollbar. It
  89022. // may not be requires which makes this sub-optimal, but it would
  89023. // require another full redraw to make complete use of those extra few
  89024. // pixels
  89025. var scrolling = dt.settings()[0].oScroll;
  89026. var bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0;
  89027. var widthAvailable = dt.table().container().offsetWidth - bar;
  89028. var usedWidth = widthAvailable - requiredWidth;
  89029. // Control column needs to always be included. This makes it sub-
  89030. // optimal in terms of using the available with, but to stop layout
  89031. // thrashing or overflow. Also we need to account for the control column
  89032. // width first so we know how much width is available for the other
  89033. // columns, since the control column might not be the first one shown
  89034. for ( i=0, ien=display.length ; i<ien ; i++ ) {
  89035. if ( columns[i].control ) {
  89036. usedWidth -= columns[i].minWidth;
  89037. }
  89038. }
  89039. // Allow columns to be shown (counting by priority and then right to
  89040. // left) until we run out of room
  89041. var empty = false;
  89042. for ( i=0, ien=order.length ; i<ien ; i++ ) {
  89043. var colIdx = order[i].columnIdx;
  89044. if ( display[colIdx] === '-' && ! columns[colIdx].control && columns[colIdx].minWidth ) {
  89045. // Once we've found a column that won't fit we don't let any
  89046. // others display either, or columns might disappear in the
  89047. // middle of the table
  89048. if ( empty || usedWidth - columns[colIdx].minWidth < 0 ) {
  89049. empty = true;
  89050. display[colIdx] = false;
  89051. }
  89052. else {
  89053. display[colIdx] = true;
  89054. }
  89055. usedWidth -= columns[colIdx].minWidth;
  89056. }
  89057. }
  89058. // Determine if the 'control' column should be shown (if there is one).
  89059. // This is the case when there is a hidden column (that is not the
  89060. // control column). The two loops look inefficient here, but they are
  89061. // trivial and will fly through. We need to know the outcome from the
  89062. // first , before the action in the second can be taken
  89063. var showControl = false;
  89064. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  89065. if ( ! columns[i].control && ! columns[i].never && ! display[i] ) {
  89066. showControl = true;
  89067. break;
  89068. }
  89069. }
  89070. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  89071. if ( columns[i].control ) {
  89072. display[i] = showControl;
  89073. }
  89074. }
  89075. // Finally we need to make sure that there is at least one column that
  89076. // is visible
  89077. if ( $.inArray( true, display ) === -1 ) {
  89078. display[0] = true;
  89079. }
  89080. return display;
  89081. },
  89082. /**
  89083. * Create the internal `columns` array with information about the columns
  89084. * for the table. This includes determining which breakpoints the column
  89085. * will appear in, based upon class names in the column, which makes up the
  89086. * vast majority of this method.
  89087. *
  89088. * @private
  89089. */
  89090. _classLogic: function ()
  89091. {
  89092. var that = this;
  89093. var calc = {};
  89094. var breakpoints = this.c.breakpoints;
  89095. var dt = this.s.dt;
  89096. var columns = dt.columns().eq(0).map( function (i) {
  89097. var column = this.column(i);
  89098. var className = column.header().className;
  89099. var priority = dt.settings()[0].aoColumns[i].responsivePriority;
  89100. if ( priority === undefined ) {
  89101. var dataPriority = $(column.header()).data('priority');
  89102. priority = dataPriority !== undefined ?
  89103. dataPriority * 1 :
  89104. 10000;
  89105. }
  89106. return {
  89107. className: className,
  89108. includeIn: [],
  89109. auto: false,
  89110. control: false,
  89111. never: className.match(/\bnever\b/) ? true : false,
  89112. priority: priority
  89113. };
  89114. } );
  89115. // Simply add a breakpoint to `includeIn` array, ensuring that there are
  89116. // no duplicates
  89117. var add = function ( colIdx, name ) {
  89118. var includeIn = columns[ colIdx ].includeIn;
  89119. if ( $.inArray( name, includeIn ) === -1 ) {
  89120. includeIn.push( name );
  89121. }
  89122. };
  89123. var column = function ( colIdx, name, operator, matched ) {
  89124. var size, i, ien;
  89125. if ( ! operator ) {
  89126. columns[ colIdx ].includeIn.push( name );
  89127. }
  89128. else if ( operator === 'max-' ) {
  89129. // Add this breakpoint and all smaller
  89130. size = that._find( name ).width;
  89131. for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
  89132. if ( breakpoints[i].width <= size ) {
  89133. add( colIdx, breakpoints[i].name );
  89134. }
  89135. }
  89136. }
  89137. else if ( operator === 'min-' ) {
  89138. // Add this breakpoint and all larger
  89139. size = that._find( name ).width;
  89140. for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
  89141. if ( breakpoints[i].width >= size ) {
  89142. add( colIdx, breakpoints[i].name );
  89143. }
  89144. }
  89145. }
  89146. else if ( operator === 'not-' ) {
  89147. // Add all but this breakpoint
  89148. for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) {
  89149. if ( breakpoints[i].name.indexOf( matched ) === -1 ) {
  89150. add( colIdx, breakpoints[i].name );
  89151. }
  89152. }
  89153. }
  89154. };
  89155. // Loop over each column and determine if it has a responsive control
  89156. // class
  89157. columns.each( function ( col, i ) {
  89158. var classNames = col.className.split(' ');
  89159. var hasClass = false;
  89160. // Split the class name up so multiple rules can be applied if needed
  89161. for ( var k=0, ken=classNames.length ; k<ken ; k++ ) {
  89162. var className = $.trim( classNames[k] );
  89163. if ( className === 'all' ) {
  89164. // Include in all
  89165. hasClass = true;
  89166. col.includeIn = $.map( breakpoints, function (a) {
  89167. return a.name;
  89168. } );
  89169. return;
  89170. }
  89171. else if ( className === 'none' || col.never ) {
  89172. // Include in none (default) and no auto
  89173. hasClass = true;
  89174. return;
  89175. }
  89176. else if ( className === 'control' ) {
  89177. // Special column that is only visible, when one of the other
  89178. // columns is hidden. This is used for the details control
  89179. hasClass = true;
  89180. col.control = true;
  89181. return;
  89182. }
  89183. $.each( breakpoints, function ( j, breakpoint ) {
  89184. // Does this column have a class that matches this breakpoint?
  89185. var brokenPoint = breakpoint.name.split('-');
  89186. var re = new RegExp( '(min\\-|max\\-|not\\-)?('+brokenPoint[0]+')(\\-[_a-zA-Z0-9])?' );
  89187. var match = className.match( re );
  89188. if ( match ) {
  89189. hasClass = true;
  89190. if ( match[2] === brokenPoint[0] && match[3] === '-'+brokenPoint[1] ) {
  89191. // Class name matches breakpoint name fully
  89192. column( i, breakpoint.name, match[1], match[2]+match[3] );
  89193. }
  89194. else if ( match[2] === brokenPoint[0] && ! match[3] ) {
  89195. // Class name matched primary breakpoint name with no qualifier
  89196. column( i, breakpoint.name, match[1], match[2] );
  89197. }
  89198. }
  89199. } );
  89200. }
  89201. // If there was no control class, then automatic sizing is used
  89202. if ( ! hasClass ) {
  89203. col.auto = true;
  89204. }
  89205. } );
  89206. this.s.columns = columns;
  89207. },
  89208. /**
  89209. * Show the details for the child row
  89210. *
  89211. * @param {DataTables.Api} row API instance for the row
  89212. * @param {boolean} update Update flag
  89213. * @private
  89214. */
  89215. _detailsDisplay: function ( row, update )
  89216. {
  89217. var that = this;
  89218. var dt = this.s.dt;
  89219. var details = this.c.details;
  89220. if ( details && details.type !== false ) {
  89221. var res = details.display( row, update, function () {
  89222. return details.renderer(
  89223. dt, row[0], that._detailsObj(row[0])
  89224. );
  89225. } );
  89226. if ( res === true || res === false ) {
  89227. $(dt.table().node()).triggerHandler( 'responsive-display.dt', [dt, row, res, update] );
  89228. }
  89229. }
  89230. },
  89231. /**
  89232. * Initialisation for the details handler
  89233. *
  89234. * @private
  89235. */
  89236. _detailsInit: function ()
  89237. {
  89238. var that = this;
  89239. var dt = this.s.dt;
  89240. var details = this.c.details;
  89241. // The inline type always uses the first child as the target
  89242. if ( details.type === 'inline' ) {
  89243. details.target = 'td:first-child, th:first-child';
  89244. }
  89245. // Keyboard accessibility
  89246. dt.on( 'draw.dtr', function () {
  89247. that._tabIndexes();
  89248. } );
  89249. that._tabIndexes(); // Initial draw has already happened
  89250. $( dt.table().body() ).on( 'keyup.dtr', 'td, th', function (e) {
  89251. if ( e.keyCode === 13 && $(this).data('dtr-keyboard') ) {
  89252. $(this).click();
  89253. }
  89254. } );
  89255. // type.target can be a string jQuery selector or a column index
  89256. var target = details.target;
  89257. var selector = typeof target === 'string' ? target : 'td, th';
  89258. // Click handler to show / hide the details rows when they are available
  89259. $( dt.table().body() )
  89260. .on( 'click.dtr mousedown.dtr mouseup.dtr', selector, function (e) {
  89261. // If the table is not collapsed (i.e. there is no hidden columns)
  89262. // then take no action
  89263. if ( ! $(dt.table().node()).hasClass('collapsed' ) ) {
  89264. return;
  89265. }
  89266. // Check that the row is actually a DataTable's controlled node
  89267. if ( $.inArray( $(this).closest('tr').get(0), dt.rows().nodes().toArray() ) === -1 ) {
  89268. return;
  89269. }
  89270. // For column index, we determine if we should act or not in the
  89271. // handler - otherwise it is already okay
  89272. if ( typeof target === 'number' ) {
  89273. var targetIdx = target < 0 ?
  89274. dt.columns().eq(0).length + target :
  89275. target;
  89276. if ( dt.cell( this ).index().column !== targetIdx ) {
  89277. return;
  89278. }
  89279. }
  89280. // $().closest() includes itself in its check
  89281. var row = dt.row( $(this).closest('tr') );
  89282. // Check event type to do an action
  89283. if ( e.type === 'click' ) {
  89284. // The renderer is given as a function so the caller can execute it
  89285. // only when they need (i.e. if hiding there is no point is running
  89286. // the renderer)
  89287. that._detailsDisplay( row, false );
  89288. }
  89289. else if ( e.type === 'mousedown' ) {
  89290. // For mouse users, prevent the focus ring from showing
  89291. $(this).css('outline', 'none');
  89292. }
  89293. else if ( e.type === 'mouseup' ) {
  89294. // And then re-allow at the end of the click
  89295. $(this).blur().css('outline', '');
  89296. }
  89297. } );
  89298. },
  89299. /**
  89300. * Get the details to pass to a renderer for a row
  89301. * @param {int} rowIdx Row index
  89302. * @private
  89303. */
  89304. _detailsObj: function ( rowIdx )
  89305. {
  89306. var that = this;
  89307. var dt = this.s.dt;
  89308. return $.map( this.s.columns, function( col, i ) {
  89309. // Never and control columns should not be passed to the renderer
  89310. if ( col.never || col.control ) {
  89311. return;
  89312. }
  89313. return {
  89314. title: dt.settings()[0].aoColumns[ i ].sTitle,
  89315. data: dt.cell( rowIdx, i ).render( that.c.orthogonal ),
  89316. hidden: dt.column( i ).visible() && !that.s.current[ i ],
  89317. columnIndex: i,
  89318. rowIndex: rowIdx
  89319. };
  89320. } );
  89321. },
  89322. /**
  89323. * Find a breakpoint object from a name
  89324. *
  89325. * @param {string} name Breakpoint name to find
  89326. * @return {object} Breakpoint description object
  89327. * @private
  89328. */
  89329. _find: function ( name )
  89330. {
  89331. var breakpoints = this.c.breakpoints;
  89332. for ( var i=0, ien=breakpoints.length ; i<ien ; i++ ) {
  89333. if ( breakpoints[i].name === name ) {
  89334. return breakpoints[i];
  89335. }
  89336. }
  89337. },
  89338. /**
  89339. * Re-create the contents of the child rows as the display has changed in
  89340. * some way.
  89341. *
  89342. * @private
  89343. */
  89344. _redrawChildren: function ()
  89345. {
  89346. var that = this;
  89347. var dt = this.s.dt;
  89348. dt.rows( {page: 'current'} ).iterator( 'row', function ( settings, idx ) {
  89349. var row = dt.row( idx );
  89350. that._detailsDisplay( dt.row( idx ), true );
  89351. } );
  89352. },
  89353. /**
  89354. * Alter the table display for a resized viewport. This involves first
  89355. * determining what breakpoint the window currently is in, getting the
  89356. * column visibilities to apply and then setting them.
  89357. *
  89358. * @private
  89359. */
  89360. _resize: function ()
  89361. {
  89362. var that = this;
  89363. var dt = this.s.dt;
  89364. var width = $(window).width();
  89365. var breakpoints = this.c.breakpoints;
  89366. var breakpoint = breakpoints[0].name;
  89367. var columns = this.s.columns;
  89368. var i, ien;
  89369. var oldVis = this.s.current.slice();
  89370. // Determine what breakpoint we are currently at
  89371. for ( i=breakpoints.length-1 ; i>=0 ; i-- ) {
  89372. if ( width <= breakpoints[i].width ) {
  89373. breakpoint = breakpoints[i].name;
  89374. break;
  89375. }
  89376. }
  89377. // Show the columns for that break point
  89378. var columnsVis = this._columnsVisiblity( breakpoint );
  89379. this.s.current = columnsVis;
  89380. // Set the class before the column visibility is changed so event
  89381. // listeners know what the state is. Need to determine if there are
  89382. // any columns that are not visible but can be shown
  89383. var collapsedClass = false;
  89384. for ( i=0, ien=columns.length ; i<ien ; i++ ) {
  89385. if ( columnsVis[i] === false && ! columns[i].never && ! columns[i].control ) {
  89386. collapsedClass = true;
  89387. break;
  89388. }
  89389. }
  89390. $( dt.table().node() ).toggleClass( 'collapsed', collapsedClass );
  89391. var changed = false;
  89392. var visible = 0;
  89393. dt.columns().eq(0).each( function ( colIdx, i ) {
  89394. if ( columnsVis[i] === true ) {
  89395. visible++;
  89396. }
  89397. if ( columnsVis[i] !== oldVis[i] ) {
  89398. changed = true;
  89399. that._setColumnVis( colIdx, columnsVis[i] );
  89400. }
  89401. } );
  89402. if ( changed ) {
  89403. this._redrawChildren();
  89404. // Inform listeners of the change
  89405. $(dt.table().node()).trigger( 'responsive-resize.dt', [dt, this.s.current] );
  89406. // If no records, update the "No records" display element
  89407. if ( dt.page.info().recordsDisplay === 0 ) {
  89408. $('td', dt.table().body()).eq(0).attr('colspan', visible);
  89409. }
  89410. }
  89411. },
  89412. /**
  89413. * Determine the width of each column in the table so the auto column hiding
  89414. * has that information to work with. This method is never going to be 100%
  89415. * perfect since column widths can change slightly per page, but without
  89416. * seriously compromising performance this is quite effective.
  89417. *
  89418. * @private
  89419. */
  89420. _resizeAuto: function ()
  89421. {
  89422. var dt = this.s.dt;
  89423. var columns = this.s.columns;
  89424. // Are we allowed to do auto sizing?
  89425. if ( ! this.c.auto ) {
  89426. return;
  89427. }
  89428. // Are there any columns that actually need auto-sizing, or do they all
  89429. // have classes defined
  89430. if ( $.inArray( true, $.map( columns, function (c) { return c.auto; } ) ) === -1 ) {
  89431. return;
  89432. }
  89433. // Need to restore all children. They will be reinstated by a re-render
  89434. if ( ! $.isEmptyObject( _childNodeStore ) ) {
  89435. $.each( _childNodeStore, function ( key ) {
  89436. var idx = key.split('-');
  89437. _childNodesRestore( dt, idx[0]*1, idx[1]*1 );
  89438. } );
  89439. }
  89440. // Clone the table with the current data in it
  89441. var tableWidth = dt.table().node().offsetWidth;
  89442. var columnWidths = dt.columns;
  89443. var clonedTable = dt.table().node().cloneNode( false );
  89444. var clonedHeader = $( dt.table().header().cloneNode( false ) ).appendTo( clonedTable );
  89445. var clonedBody = $( dt.table().body() ).clone( false, false ).empty().appendTo( clonedTable ); // use jQuery because of IE8
  89446. // Header
  89447. var headerCells = dt.columns()
  89448. .header()
  89449. .filter( function (idx) {
  89450. return dt.column(idx).visible();
  89451. } )
  89452. .to$()
  89453. .clone( false )
  89454. .css( 'display', 'table-cell' )
  89455. .css( 'min-width', 0 );
  89456. // Body rows - we don't need to take account of DataTables' column
  89457. // visibility since we implement our own here (hence the `display` set)
  89458. $(clonedBody)
  89459. .append( $(dt.rows( { page: 'current' } ).nodes()).clone( false ) )
  89460. .find( 'th, td' ).css( 'display', '' );
  89461. // Footer
  89462. var footer = dt.table().footer();
  89463. if ( footer ) {
  89464. var clonedFooter = $( footer.cloneNode( false ) ).appendTo( clonedTable );
  89465. var footerCells = dt.columns()
  89466. .footer()
  89467. .filter( function (idx) {
  89468. return dt.column(idx).visible();
  89469. } )
  89470. .to$()
  89471. .clone( false )
  89472. .css( 'display', 'table-cell' );
  89473. $('<tr/>')
  89474. .append( footerCells )
  89475. .appendTo( clonedFooter );
  89476. }
  89477. $('<tr/>')
  89478. .append( headerCells )
  89479. .appendTo( clonedHeader );
  89480. // In the inline case extra padding is applied to the first column to
  89481. // give space for the show / hide icon. We need to use this in the
  89482. // calculation
  89483. if ( this.c.details.type === 'inline' ) {
  89484. $(clonedTable).addClass( 'dtr-inline collapsed' );
  89485. }
  89486. // It is unsafe to insert elements with the same name into the DOM
  89487. // multiple times. For example, cloning and inserting a checked radio
  89488. // clears the chcecked state of the original radio.
  89489. $( clonedTable ).find( '[name]' ).removeAttr( 'name' );
  89490. var inserted = $('<div/>')
  89491. .css( {
  89492. width: 1,
  89493. height: 1,
  89494. overflow: 'hidden',
  89495. clear: 'both'
  89496. } )
  89497. .append( clonedTable );
  89498. inserted.insertBefore( dt.table().node() );
  89499. // The cloned header now contains the smallest that each column can be
  89500. headerCells.each( function (i) {
  89501. var idx = dt.column.index( 'fromVisible', i );
  89502. columns[ idx ].minWidth = this.offsetWidth || 0;
  89503. } );
  89504. inserted.remove();
  89505. },
  89506. /**
  89507. * Set a column's visibility.
  89508. *
  89509. * We don't use DataTables' column visibility controls in order to ensure
  89510. * that column visibility can Responsive can no-exist. Since only IE8+ is
  89511. * supported (and all evergreen browsers of course) the control of the
  89512. * display attribute works well.
  89513. *
  89514. * @param {integer} col Column index
  89515. * @param {boolean} showHide Show or hide (true or false)
  89516. * @private
  89517. */
  89518. _setColumnVis: function ( col, showHide )
  89519. {
  89520. var dt = this.s.dt;
  89521. var display = showHide ? '' : 'none'; // empty string will remove the attr
  89522. $( dt.column( col ).header() ).css( 'display', display );
  89523. $( dt.column( col ).footer() ).css( 'display', display );
  89524. dt.column( col ).nodes().to$().css( 'display', display );
  89525. // If the are child nodes stored, we might need to reinsert them
  89526. if ( ! $.isEmptyObject( _childNodeStore ) ) {
  89527. dt.cells( null, col ).indexes().each( function (idx) {
  89528. _childNodesRestore( dt, idx.row, idx.column );
  89529. } );
  89530. }
  89531. },
  89532. /**
  89533. * Update the cell tab indexes for keyboard accessibility. This is called on
  89534. * every table draw - that is potentially inefficient, but also the least
  89535. * complex option given that column visibility can change on the fly. Its a
  89536. * shame user-focus was removed from CSS 3 UI, as it would have solved this
  89537. * issue with a single CSS statement.
  89538. *
  89539. * @private
  89540. */
  89541. _tabIndexes: function ()
  89542. {
  89543. var dt = this.s.dt;
  89544. var cells = dt.cells( { page: 'current' } ).nodes().to$();
  89545. var ctx = dt.settings()[0];
  89546. var target = this.c.details.target;
  89547. cells.filter( '[data-dtr-keyboard]' ).removeData( '[data-dtr-keyboard]' );
  89548. var selector = typeof target === 'number' ?
  89549. ':eq('+target+')' :
  89550. target;
  89551. // This is a bit of a hack - we need to limit the selected nodes to just
  89552. // those of this table
  89553. if ( selector === 'td:first-child, th:first-child' ) {
  89554. selector = '>td:first-child, >th:first-child';
  89555. }
  89556. $( selector, dt.rows( { page: 'current' } ).nodes() )
  89557. .attr( 'tabIndex', ctx.iTabIndex )
  89558. .data( 'dtr-keyboard', 1 );
  89559. }
  89560. } );
  89561. /**
  89562. * List of default breakpoints. Each item in the array is an object with two
  89563. * properties:
  89564. *
  89565. * * `name` - the breakpoint name.
  89566. * * `width` - the breakpoint width
  89567. *
  89568. * @name Responsive.breakpoints
  89569. * @static
  89570. */
  89571. Responsive.breakpoints = [
  89572. { name: 'desktop', width: Infinity },
  89573. { name: 'tablet-l', width: 1024 },
  89574. { name: 'tablet-p', width: 768 },
  89575. { name: 'mobile-l', width: 480 },
  89576. { name: 'mobile-p', width: 320 }
  89577. ];
  89578. /**
  89579. * Display methods - functions which define how the hidden data should be shown
  89580. * in the table.
  89581. *
  89582. * @namespace
  89583. * @name Responsive.defaults
  89584. * @static
  89585. */
  89586. Responsive.display = {
  89587. childRow: function ( row, update, render ) {
  89588. if ( update ) {
  89589. if ( $(row.node()).hasClass('parent') ) {
  89590. row.child( render(), 'child' ).show();
  89591. return true;
  89592. }
  89593. }
  89594. else {
  89595. if ( ! row.child.isShown() ) {
  89596. row.child( render(), 'child' ).show();
  89597. $( row.node() ).addClass( 'parent' );
  89598. return true;
  89599. }
  89600. else {
  89601. row.child( false );
  89602. $( row.node() ).removeClass( 'parent' );
  89603. return false;
  89604. }
  89605. }
  89606. },
  89607. childRowImmediate: function ( row, update, render ) {
  89608. if ( (! update && row.child.isShown()) || ! row.responsive.hasHidden() ) {
  89609. // User interaction and the row is show, or nothing to show
  89610. row.child( false );
  89611. $( row.node() ).removeClass( 'parent' );
  89612. return false;
  89613. }
  89614. else {
  89615. // Display
  89616. row.child( render(), 'child' ).show();
  89617. $( row.node() ).addClass( 'parent' );
  89618. return true;
  89619. }
  89620. },
  89621. // This is a wrapper so the modal options for Bootstrap and jQuery UI can
  89622. // have options passed into them. This specific one doesn't need to be a
  89623. // function but it is for consistency in the `modal` name
  89624. modal: function ( options ) {
  89625. return function ( row, update, render ) {
  89626. if ( ! update ) {
  89627. // Show a modal
  89628. var close = function () {
  89629. modal.remove(); // will tidy events for us
  89630. $(document).off( 'keypress.dtr' );
  89631. };
  89632. var modal = $('<div class="dtr-modal"/>')
  89633. .append( $('<div class="dtr-modal-display"/>')
  89634. .append( $('<div class="dtr-modal-content"/>')
  89635. .append( render() )
  89636. )
  89637. .append( $('<div class="dtr-modal-close">&times;</div>' )
  89638. .click( function () {
  89639. close();
  89640. } )
  89641. )
  89642. )
  89643. .append( $('<div class="dtr-modal-background"/>')
  89644. .click( function () {
  89645. close();
  89646. } )
  89647. )
  89648. .appendTo( 'body' );
  89649. $(document).on( 'keyup.dtr', function (e) {
  89650. if ( e.keyCode === 27 ) {
  89651. e.stopPropagation();
  89652. close();
  89653. }
  89654. } );
  89655. }
  89656. else {
  89657. $('div.dtr-modal-content')
  89658. .empty()
  89659. .append( render() );
  89660. }
  89661. if ( options && options.header ) {
  89662. $('div.dtr-modal-content').prepend(
  89663. '<h2>'+options.header( row )+'</h2>'
  89664. );
  89665. }
  89666. };
  89667. }
  89668. };
  89669. var _childNodeStore = {};
  89670. function _childNodes( dt, row, col ) {
  89671. var name = row+'-'+col;
  89672. if ( _childNodeStore[ name ] ) {
  89673. return _childNodeStore[ name ];
  89674. }
  89675. // https://jsperf.com/childnodes-array-slice-vs-loop
  89676. var nodes = [];
  89677. var children = dt.cell( row, col ).node().childNodes;
  89678. for ( var i=0, ien=children.length ; i<ien ; i++ ) {
  89679. nodes.push( children[i] );
  89680. }
  89681. _childNodeStore[ name ] = nodes;
  89682. return nodes;
  89683. }
  89684. function _childNodesRestore( dt, row, col ) {
  89685. var name = row+'-'+col;
  89686. if ( ! _childNodeStore[ name ] ) {
  89687. return;
  89688. }
  89689. var node = dt.cell( row, col ).node();
  89690. var store = _childNodeStore[ name ];
  89691. var parent = store[0].parentNode;
  89692. var parentChildren = parent.childNodes;
  89693. var a = [];
  89694. for ( var i=0, ien=parentChildren.length ; i<ien ; i++ ) {
  89695. a.push( parentChildren[i] );
  89696. }
  89697. for ( var j=0, jen=a.length ; j<jen ; j++ ) {
  89698. node.appendChild( a[j] );
  89699. }
  89700. _childNodeStore[ name ] = undefined;
  89701. }
  89702. /**
  89703. * Display methods - functions which define how the hidden data should be shown
  89704. * in the table.
  89705. *
  89706. * @namespace
  89707. * @name Responsive.defaults
  89708. * @static
  89709. */
  89710. Responsive.renderer = {
  89711. listHiddenNodes: function () {
  89712. return function ( api, rowIdx, columns ) {
  89713. var ul = $('<ul data-dtr-index="'+rowIdx+'" class="dtr-details"/>');
  89714. var found = false;
  89715. var data = $.each( columns, function ( i, col ) {
  89716. if ( col.hidden ) {
  89717. $(
  89718. '<li data-dtr-index="'+col.columnIndex+'" data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
  89719. '<span class="dtr-title">'+
  89720. col.title+
  89721. '</span> '+
  89722. '</li>'
  89723. )
  89724. .append( $('<span class="dtr-data"/>').append( _childNodes( api, col.rowIndex, col.columnIndex ) ) )// api.cell( col.rowIndex, col.columnIndex ).node().childNodes ) )
  89725. .appendTo( ul );
  89726. found = true;
  89727. }
  89728. } );
  89729. return found ?
  89730. ul :
  89731. false;
  89732. };
  89733. },
  89734. listHidden: function () {
  89735. return function ( api, rowIdx, columns ) {
  89736. var data = $.map( columns, function ( col ) {
  89737. return col.hidden ?
  89738. '<li data-dtr-index="'+col.columnIndex+'" data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
  89739. '<span class="dtr-title">'+
  89740. col.title+
  89741. '</span> '+
  89742. '<span class="dtr-data">'+
  89743. col.data+
  89744. '</span>'+
  89745. '</li>' :
  89746. '';
  89747. } ).join('');
  89748. return data ?
  89749. $('<ul data-dtr-index="'+rowIdx+'" class="dtr-details"/>').append( data ) :
  89750. false;
  89751. }
  89752. },
  89753. tableAll: function ( options ) {
  89754. options = $.extend( {
  89755. tableClass: ''
  89756. }, options );
  89757. return function ( api, rowIdx, columns ) {
  89758. var data = $.map( columns, function ( col ) {
  89759. return '<tr data-dt-row="'+col.rowIndex+'" data-dt-column="'+col.columnIndex+'">'+
  89760. '<td>'+col.title+':'+'</td> '+
  89761. '<td>'+col.data+'</td>'+
  89762. '</tr>';
  89763. } ).join('');
  89764. return $('<table class="'+options.tableClass+' dtr-details" width="100%"/>').append( data );
  89765. }
  89766. }
  89767. };
  89768. /**
  89769. * Responsive default settings for initialisation
  89770. *
  89771. * @namespace
  89772. * @name Responsive.defaults
  89773. * @static
  89774. */
  89775. Responsive.defaults = {
  89776. /**
  89777. * List of breakpoints for the instance. Note that this means that each
  89778. * instance can have its own breakpoints. Additionally, the breakpoints
  89779. * cannot be changed once an instance has been creased.
  89780. *
  89781. * @type {Array}
  89782. * @default Takes the value of `Responsive.breakpoints`
  89783. */
  89784. breakpoints: Responsive.breakpoints,
  89785. /**
  89786. * Enable / disable auto hiding calculations. It can help to increase
  89787. * performance slightly if you disable this option, but all columns would
  89788. * need to have breakpoint classes assigned to them
  89789. *
  89790. * @type {Boolean}
  89791. * @default `true`
  89792. */
  89793. auto: true,
  89794. /**
  89795. * Details control. If given as a string value, the `type` property of the
  89796. * default object is set to that value, and the defaults used for the rest
  89797. * of the object - this is for ease of implementation.
  89798. *
  89799. * The object consists of the following properties:
  89800. *
  89801. * * `display` - A function that is used to show and hide the hidden details
  89802. * * `renderer` - function that is called for display of the child row data.
  89803. * The default function will show the data from the hidden columns
  89804. * * `target` - Used as the selector for what objects to attach the child
  89805. * open / close to
  89806. * * `type` - `false` to disable the details display, `inline` or `column`
  89807. * for the two control types
  89808. *
  89809. * @type {Object|string}
  89810. */
  89811. details: {
  89812. display: Responsive.display.childRow,
  89813. renderer: Responsive.renderer.listHidden(),
  89814. target: 0,
  89815. type: 'inline'
  89816. },
  89817. /**
  89818. * Orthogonal data request option. This is used to define the data type
  89819. * requested when Responsive gets the data to show in the child row.
  89820. *
  89821. * @type {String}
  89822. */
  89823. orthogonal: 'display'
  89824. };
  89825. /*
  89826. * API
  89827. */
  89828. var Api = $.fn.dataTable.Api;
  89829. // Doesn't do anything - work around for a bug in DT... Not documented
  89830. Api.register( 'responsive()', function () {
  89831. return this;
  89832. } );
  89833. Api.register( 'responsive.index()', function ( li ) {
  89834. li = $(li);
  89835. return {
  89836. column: li.data('dtr-index'),
  89837. row: li.parent().data('dtr-index')
  89838. };
  89839. } );
  89840. Api.register( 'responsive.rebuild()', function () {
  89841. return this.iterator( 'table', function ( ctx ) {
  89842. if ( ctx._responsive ) {
  89843. ctx._responsive._classLogic();
  89844. }
  89845. } );
  89846. } );
  89847. Api.register( 'responsive.recalc()', function () {
  89848. return this.iterator( 'table', function ( ctx ) {
  89849. if ( ctx._responsive ) {
  89850. ctx._responsive._resizeAuto();
  89851. ctx._responsive._resize();
  89852. }
  89853. } );
  89854. } );
  89855. Api.register( 'responsive.hasHidden()', function () {
  89856. var ctx = this.context[0];
  89857. return ctx._responsive ?
  89858. $.inArray( false, ctx._responsive.s.current ) !== -1 :
  89859. false;
  89860. } );
  89861. Api.registerPlural( 'columns().responsiveHidden()', 'column().responsiveHidden()', function () {
  89862. return this.iterator( 'column', function ( settings, column ) {
  89863. return settings._responsive ?
  89864. settings._responsive.s.current[ column ] :
  89865. false;
  89866. }, 1 );
  89867. } );
  89868. /**
  89869. * Version information
  89870. *
  89871. * @name Responsive.version
  89872. * @static
  89873. */
  89874. Responsive.version = '2.2.1';
  89875. $.fn.dataTable.Responsive = Responsive;
  89876. $.fn.DataTable.Responsive = Responsive;
  89877. // Attach a listener to the document which listens for DataTables initialisation
  89878. // events so we can automatically initialise
  89879. $(document).on( 'preInit.dt.dtr', function (e, settings, json) {
  89880. if ( e.namespace !== 'dt' ) {
  89881. return;
  89882. }
  89883. if ( $(settings.nTable).hasClass( 'responsive' ) ||
  89884. $(settings.nTable).hasClass( 'dt-responsive' ) ||
  89885. settings.oInit.responsive ||
  89886. DataTable.defaults.responsive
  89887. ) {
  89888. var init = settings.oInit.responsive;
  89889. if ( init !== false ) {
  89890. new Responsive( settings, $.isPlainObject( init ) ? init : {} );
  89891. }
  89892. }
  89893. } );
  89894. return Responsive;
  89895. }));
  89896. /*! RowGroup 1.0.2
  89897. * ©2017 SpryMedia Ltd - datatables.net/license
  89898. */
  89899. /**
  89900. * @summary RowGroup
  89901. * @description RowGrouping for DataTables
  89902. * @version 1.0.2
  89903. * @file dataTables.rowGroup.js
  89904. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  89905. * @contact datatables.net
  89906. * @copyright Copyright 2017 SpryMedia Ltd.
  89907. *
  89908. * This source file is free software, available under the following license:
  89909. * MIT license - http://datatables.net/license/mit
  89910. *
  89911. * This source file is distributed in the hope that it will be useful, but
  89912. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  89913. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  89914. *
  89915. * For details please refer to: http://www.datatables.net
  89916. */
  89917. (function( factory ){
  89918. if ( typeof define === 'function' && define.amd ) {
  89919. // AMD
  89920. define( ['jquery', 'datatables.net'], function ( $ ) {
  89921. return factory( $, window, document );
  89922. } );
  89923. }
  89924. else if ( typeof exports === 'object' ) {
  89925. // CommonJS
  89926. module.exports = function (root, $) {
  89927. if ( ! root ) {
  89928. root = window;
  89929. }
  89930. if ( ! $ || ! $.fn.dataTable ) {
  89931. $ = require('datatables.net')(root, $).$;
  89932. }
  89933. return factory( $, root, root.document );
  89934. };
  89935. }
  89936. else {
  89937. // Browser
  89938. factory( jQuery, window, document );
  89939. }
  89940. }(function( $, window, document, undefined ) {
  89941. 'use strict';
  89942. var DataTable = $.fn.dataTable;
  89943. var RowGroup = function ( dt, opts ) {
  89944. // Sanity check that we are using DataTables 1.10 or newer
  89945. if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) {
  89946. throw 'RowGroup requires DataTables 1.10.8 or newer';
  89947. }
  89948. // User and defaults configuration object
  89949. this.c = $.extend( true, {},
  89950. DataTable.defaults.rowGroup,
  89951. RowGroup.defaults,
  89952. opts
  89953. );
  89954. // Internal settings
  89955. this.s = {
  89956. dt: new DataTable.Api( dt ),
  89957. dataFn: DataTable.ext.oApi._fnGetObjectDataFn( this.c.dataSrc )
  89958. };
  89959. // DOM items
  89960. this.dom = {
  89961. };
  89962. // Check if row grouping has already been initialised on this table
  89963. var settings = this.s.dt.settings()[0];
  89964. var existing = settings.rowGroup;
  89965. if ( existing ) {
  89966. return existing;
  89967. }
  89968. settings.rowGroup = this;
  89969. this._constructor();
  89970. };
  89971. $.extend( RowGroup.prototype, {
  89972. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  89973. * API methods for DataTables API interface
  89974. */
  89975. /**
  89976. * Get/set the grouping data source - need to call draw after this is
  89977. * executed as a setter
  89978. * @returns string~RowGroup
  89979. */
  89980. dataSrc: function ( val )
  89981. {
  89982. if ( val === undefined ) {
  89983. return this.c.dataSrc;
  89984. }
  89985. var dt = this.s.dt;
  89986. this.c.dataSrc = val;
  89987. this.s.dataFn = DataTable.ext.oApi._fnGetObjectDataFn( this.c.dataSrc );
  89988. $(dt.table().node()).triggerHandler( 'rowgroup-datasrc.dt', [ dt, val ] );
  89989. return this;
  89990. },
  89991. /**
  89992. * Disable - need to call draw after this is executed
  89993. * @returns RowGroup
  89994. */
  89995. disable: function ()
  89996. {
  89997. this.c.enable = false;
  89998. return this;
  89999. },
  90000. /**
  90001. * Enable - need to call draw after this is executed
  90002. * @returns RowGroup
  90003. */
  90004. enable: function ( flag )
  90005. {
  90006. if ( flag === false ) {
  90007. return this.disable();
  90008. }
  90009. this.c.enable = true;
  90010. return this;
  90011. },
  90012. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  90013. * Constructor
  90014. */
  90015. _constructor: function ()
  90016. {
  90017. var that = this;
  90018. var dt = this.s.dt;
  90019. dt.on( 'draw.dtrg', function () {
  90020. if ( that.c.enable ) {
  90021. that._draw();
  90022. }
  90023. } );
  90024. dt.on( 'column-visibility.dt.dtrg responsive-resize.dt.dtrg', function () {
  90025. that._adjustColspan();
  90026. } );
  90027. dt.on( 'destroy', function () {
  90028. dt.off( '.dtrg' );
  90029. } );
  90030. },
  90031. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  90032. * Private methods
  90033. */
  90034. /**
  90035. * Adjust column span when column visibility changes
  90036. * @private
  90037. */
  90038. _adjustColspan: function ()
  90039. {
  90040. $( 'tr.'+this.c.className, this.s.dt.table().body() )
  90041. .attr( 'colspan', this._colspan() );
  90042. },
  90043. /**
  90044. * Get the number of columns that a grouping row should span
  90045. * @private
  90046. */
  90047. _colspan: function ()
  90048. {
  90049. return this.s.dt.columns().visible().reduce( function (a, b) {
  90050. return a + b;
  90051. }, 0 );
  90052. },
  90053. /**
  90054. * Update function that is called whenever we need to draw the grouping rows
  90055. * @private
  90056. */
  90057. _draw: function ()
  90058. {
  90059. var that = this;
  90060. var dt = this.s.dt;
  90061. var rows = dt.rows( { page: 'current' } );
  90062. var groupedRows = [];
  90063. var last, display;
  90064. rows.every( function () {
  90065. var d = this.data();
  90066. var group = that.s.dataFn( d );
  90067. if ( last === undefined || group !== last ) {
  90068. groupedRows.push( [] );
  90069. last = group;
  90070. }
  90071. groupedRows[ groupedRows.length - 1 ].push( this.index() );
  90072. } );
  90073. for ( var i=0, ien=groupedRows.length ; i<ien ; i++ ) {
  90074. var group = groupedRows[i];
  90075. var firstRow = dt.row(group[0]);
  90076. var groupName = this.s.dataFn( firstRow.data() );
  90077. if ( this.c.startRender ) {
  90078. display = this.c.startRender.call( this, dt.rows(group), groupName );
  90079. this
  90080. ._rowWrap( display, this.c.startClassName )
  90081. .insertBefore( firstRow.node() );
  90082. }
  90083. if ( this.c.endRender ) {
  90084. display = this.c.endRender.call( this, dt.rows(group), groupName );
  90085. this
  90086. ._rowWrap( display, this.c.endClassName )
  90087. .insertAfter( dt.row( group[ group.length-1 ] ).node() );
  90088. }
  90089. }
  90090. },
  90091. /**
  90092. * Take a rendered value from an end user and make it suitable for display
  90093. * as a row, by wrapping it in a row, or detecting that it is a row.
  90094. * @param [node|jQuery|string] display Display value
  90095. * @param [string] className Class to add to the row
  90096. * @private
  90097. */
  90098. _rowWrap: function ( display, className )
  90099. {
  90100. var row;
  90101. if ( typeof display === 'object' && display.nodeName && display.nodeName.toLowerCase() === 'tr') {
  90102. row = $(display);
  90103. }
  90104. else if (display instanceof $ && display.length && display[0].nodeName.toLowerCase() === 'tr') {
  90105. row = display;
  90106. }
  90107. else {
  90108. row = $('<tr/>')
  90109. .append(
  90110. $('<td/>')
  90111. .attr( 'colspan', this._colspan() )
  90112. .append( display )
  90113. );
  90114. }
  90115. return row
  90116. .addClass( this.c.className )
  90117. .addClass( className );
  90118. }
  90119. } );
  90120. /**
  90121. * RowGroup default settings for initialisation
  90122. *
  90123. * @namespace
  90124. * @name RowGroup.defaults
  90125. * @static
  90126. */
  90127. RowGroup.defaults = {
  90128. /**
  90129. * Class to apply to grouping rows - applied to both the start and
  90130. * end grouping rows.
  90131. * @type string
  90132. */
  90133. className: 'group',
  90134. /**
  90135. * Data property from which to read the grouping information
  90136. * @type string|integer
  90137. */
  90138. dataSrc: 0,
  90139. /**
  90140. * Initial enablement state
  90141. * @boolean
  90142. */
  90143. enable: true,
  90144. /**
  90145. * Class name to give to the end grouping row
  90146. * @type string
  90147. */
  90148. endClassName: 'group-end',
  90149. /**
  90150. * End grouping label function
  90151. * @function
  90152. */
  90153. endRender: null,
  90154. /**
  90155. * Class name to give to the start grouping row
  90156. * @type string
  90157. */
  90158. startClassName: 'group-start',
  90159. /**
  90160. * Start grouping label function
  90161. * @function
  90162. */
  90163. startRender: function ( rows, group ) {
  90164. return group;
  90165. }
  90166. };
  90167. RowGroup.version = "1.0.2";
  90168. $.fn.dataTable.RowGroup = RowGroup;
  90169. $.fn.DataTable.RowGroup = RowGroup;
  90170. DataTable.Api.register( 'rowGroup()', function () {
  90171. return this;
  90172. } );
  90173. DataTable.Api.register( 'rowGroup().disable()', function () {
  90174. return this.iterator( 'table', function (ctx) {
  90175. if ( ctx.rowGroup ) {
  90176. ctx.rowGroup.enable( false );
  90177. }
  90178. } );
  90179. } );
  90180. DataTable.Api.register( 'rowGroup().enable()', function ( opts ) {
  90181. return this.iterator( 'table', function (ctx) {
  90182. if ( ctx.rowGroup ) {
  90183. ctx.rowGroup.enable( opts === undefined ? true : opts );
  90184. }
  90185. } );
  90186. } );
  90187. DataTable.Api.register( 'rowGroup().dataSrc()', function ( val ) {
  90188. if ( val === undefined ) {
  90189. return this.context[0].rowGroup.dataSrc();
  90190. }
  90191. return this.iterator( 'table', function (ctx) {
  90192. if ( ctx.rowGroup ) {
  90193. ctx.rowGroup.dataSrc( val );
  90194. }
  90195. } );
  90196. } );
  90197. // Attach a listener to the document which listens for DataTables initialisation
  90198. // events so we can automatically initialise
  90199. $(document).on( 'preInit.dt.dtrg', function (e, settings, json) {
  90200. if ( e.namespace !== 'dt' ) {
  90201. return;
  90202. }
  90203. var init = settings.oInit.rowGroup;
  90204. var defaults = DataTable.defaults.rowGroup;
  90205. if ( init || defaults ) {
  90206. var opts = $.extend( {}, defaults, init );
  90207. if ( init !== false ) {
  90208. new RowGroup( settings, opts );
  90209. }
  90210. }
  90211. } );
  90212. return RowGroup;
  90213. }));
  90214. /*! RowReorder 1.2.3
  90215. * 2015-2017 SpryMedia Ltd - datatables.net/license
  90216. */
  90217. /**
  90218. * @summary RowReorder
  90219. * @description Row reordering extension for DataTables
  90220. * @version 1.2.3
  90221. * @file dataTables.rowReorder.js
  90222. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  90223. * @contact www.sprymedia.co.uk/contact
  90224. * @copyright Copyright 2015-2017 SpryMedia Ltd.
  90225. *
  90226. * This source file is free software, available under the following license:
  90227. * MIT license - http://datatables.net/license/mit
  90228. *
  90229. * This source file is distributed in the hope that it will be useful, but
  90230. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  90231. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  90232. *
  90233. * For details please refer to: http://www.datatables.net
  90234. */
  90235. (function( factory ){
  90236. if ( typeof define === 'function' && define.amd ) {
  90237. // AMD
  90238. define( ['jquery', 'datatables.net'], function ( $ ) {
  90239. return factory( $, window, document );
  90240. } );
  90241. }
  90242. else if ( typeof exports === 'object' ) {
  90243. // CommonJS
  90244. module.exports = function (root, $) {
  90245. if ( ! root ) {
  90246. root = window;
  90247. }
  90248. if ( ! $ || ! $.fn.dataTable ) {
  90249. $ = require('datatables.net')(root, $).$;
  90250. }
  90251. return factory( $, root, root.document );
  90252. };
  90253. }
  90254. else {
  90255. // Browser
  90256. factory( jQuery, window, document );
  90257. }
  90258. }(function( $, window, document, undefined ) {
  90259. 'use strict';
  90260. var DataTable = $.fn.dataTable;
  90261. /**
  90262. * RowReorder provides the ability in DataTables to click and drag rows to
  90263. * reorder them. When a row is dropped the data for the rows effected will be
  90264. * updated to reflect the change. Normally this data point should also be the
  90265. * column being sorted upon in the DataTable but this does not need to be the
  90266. * case. RowReorder implements a "data swap" method - so the rows being
  90267. * reordered take the value of the data point from the row that used to occupy
  90268. * the row's new position.
  90269. *
  90270. * Initialisation is done by either:
  90271. *
  90272. * * `rowReorder` parameter in the DataTable initialisation object
  90273. * * `new $.fn.dataTable.RowReorder( table, opts )` after DataTables
  90274. * initialisation.
  90275. *
  90276. * @class
  90277. * @param {object} settings DataTables settings object for the host table
  90278. * @param {object} [opts] Configuration options
  90279. * @requires jQuery 1.7+
  90280. * @requires DataTables 1.10.7+
  90281. */
  90282. var RowReorder = function ( dt, opts ) {
  90283. // Sanity check that we are using DataTables 1.10 or newer
  90284. if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) {
  90285. throw 'DataTables RowReorder requires DataTables 1.10.8 or newer';
  90286. }
  90287. // User and defaults configuration object
  90288. this.c = $.extend( true, {},
  90289. DataTable.defaults.rowReorder,
  90290. RowReorder.defaults,
  90291. opts
  90292. );
  90293. // Internal settings
  90294. this.s = {
  90295. /** @type {integer} Scroll body top cache */
  90296. bodyTop: null,
  90297. /** @type {DataTable.Api} DataTables' API instance */
  90298. dt: new DataTable.Api( dt ),
  90299. /** @type {function} Data fetch function */
  90300. getDataFn: DataTable.ext.oApi._fnGetObjectDataFn( this.c.dataSrc ),
  90301. /** @type {array} Pixel positions for row insertion calculation */
  90302. middles: null,
  90303. /** @type {Object} Cached dimension information for use in the mouse move event handler */
  90304. scroll: {},
  90305. /** @type {integer} Interval object used for smooth scrolling */
  90306. scrollInterval: null,
  90307. /** @type {function} Data set function */
  90308. setDataFn: DataTable.ext.oApi._fnSetObjectDataFn( this.c.dataSrc ),
  90309. /** @type {Object} Mouse down information */
  90310. start: {
  90311. top: 0,
  90312. left: 0,
  90313. offsetTop: 0,
  90314. offsetLeft: 0,
  90315. nodes: []
  90316. },
  90317. /** @type {integer} Window height cached value */
  90318. windowHeight: 0,
  90319. /** @type {integer} Document outer height cached value */
  90320. documentOuterHeight: 0,
  90321. /** @type {integer} DOM clone outer height cached value */
  90322. domCloneOuterHeight: 0
  90323. };
  90324. // DOM items
  90325. this.dom = {
  90326. /** @type {jQuery} Cloned row being moved around */
  90327. clone: null,
  90328. /** @type {jQuery} DataTables scrolling container */
  90329. dtScroll: $('div.dataTables_scrollBody', this.s.dt.table().container())
  90330. };
  90331. // Check if row reorder has already been initialised on this table
  90332. var settings = this.s.dt.settings()[0];
  90333. var exisiting = settings.rowreorder;
  90334. if ( exisiting ) {
  90335. return exisiting;
  90336. }
  90337. settings.rowreorder = this;
  90338. this._constructor();
  90339. };
  90340. $.extend( RowReorder.prototype, {
  90341. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  90342. * Constructor
  90343. */
  90344. /**
  90345. * Initialise the RowReorder instance
  90346. *
  90347. * @private
  90348. */
  90349. _constructor: function ()
  90350. {
  90351. var that = this;
  90352. var dt = this.s.dt;
  90353. var table = $( dt.table().node() );
  90354. // Need to be able to calculate the row positions relative to the table
  90355. if ( table.css('position') === 'static' ) {
  90356. table.css( 'position', 'relative' );
  90357. }
  90358. // listen for mouse down on the target column - we have to implement
  90359. // this rather than using HTML5 drag and drop as drag and drop doesn't
  90360. // appear to work on table rows at this time. Also mobile browsers are
  90361. // not supported.
  90362. // Use `table().container()` rather than just the table node for IE8 -
  90363. // otherwise it only works once...
  90364. $(dt.table().container()).on( 'mousedown.rowReorder touchstart.rowReorder', this.c.selector, function (e) {
  90365. if ( ! that.c.enable ) {
  90366. return;
  90367. }
  90368. var tr = $(this).closest('tr');
  90369. var row = dt.row( tr );
  90370. // Double check that it is a DataTable row
  90371. if ( row.any() ) {
  90372. that._emitEvent( 'pre-row-reorder', {
  90373. node: row.node(),
  90374. index: row.index()
  90375. } );
  90376. that._mouseDown( e, tr );
  90377. return false;
  90378. }
  90379. } );
  90380. dt.on( 'destroy.rowReorder', function () {
  90381. $(dt.table().container()).off( '.rowReorder' );
  90382. dt.off( '.rowReorder' );
  90383. } );
  90384. },
  90385. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  90386. * Private methods
  90387. */
  90388. /**
  90389. * Cache the measurements that RowReorder needs in the mouse move handler
  90390. * to attempt to speed things up, rather than reading from the DOM.
  90391. *
  90392. * @private
  90393. */
  90394. _cachePositions: function ()
  90395. {
  90396. var dt = this.s.dt;
  90397. // Frustratingly, if we add `position:relative` to the tbody, the
  90398. // position is still relatively to the parent. So we need to adjust
  90399. // for that
  90400. var headerHeight = $( dt.table().node() ).find('thead').outerHeight();
  90401. // Need to pass the nodes through jQuery to get them in document order,
  90402. // not what DataTables thinks it is, since we have been altering the
  90403. // order
  90404. var nodes = $.unique( dt.rows( { page: 'current' } ).nodes().toArray() );
  90405. var tops = $.map( nodes, function ( node, i ) {
  90406. return $(node).position().top - headerHeight;
  90407. } );
  90408. var middles = $.map( tops, function ( top, i ) {
  90409. return tops.length < i-1 ?
  90410. (top + tops[i+1]) / 2 :
  90411. (top + top + $( dt.row( ':last-child' ).node() ).outerHeight() ) / 2;
  90412. } );
  90413. this.s.middles = middles;
  90414. this.s.bodyTop = $( dt.table().body() ).offset().top;
  90415. this.s.windowHeight = $(window).height();
  90416. this.s.documentOuterHeight = $(document).outerHeight();
  90417. },
  90418. /**
  90419. * Clone a row so it can be floated around the screen
  90420. *
  90421. * @param {jQuery} target Node to be cloned
  90422. * @private
  90423. */
  90424. _clone: function ( target )
  90425. {
  90426. var dt = this.s.dt;
  90427. var clone = $( dt.table().node().cloneNode(false) )
  90428. .addClass( 'dt-rowReorder-float' )
  90429. .append('<tbody/>')
  90430. .append( target.clone( false ) );
  90431. // Match the table and column widths - read all sizes before setting
  90432. // to reduce reflows
  90433. var tableWidth = target.outerWidth();
  90434. var tableHeight = target.outerHeight();
  90435. var sizes = target.children().map( function () {
  90436. return $(this).width();
  90437. } );
  90438. clone
  90439. .width( tableWidth )
  90440. .height( tableHeight )
  90441. .find('tr').children().each( function (i) {
  90442. this.style.width = sizes[i]+'px';
  90443. } );
  90444. // Insert into the document to have it floating around
  90445. clone.appendTo( 'body' );
  90446. this.dom.clone = clone;
  90447. this.s.domCloneOuterHeight = clone.outerHeight();
  90448. },
  90449. /**
  90450. * Update the cloned item's position in the document
  90451. *
  90452. * @param {object} e Event giving the mouse's position
  90453. * @private
  90454. */
  90455. _clonePosition: function ( e )
  90456. {
  90457. var start = this.s.start;
  90458. var topDiff = this._eventToPage( e, 'Y' ) - start.top;
  90459. var leftDiff = this._eventToPage( e, 'X' ) - start.left;
  90460. var snap = this.c.snapX;
  90461. var left;
  90462. var top = topDiff + start.offsetTop;
  90463. if ( snap === true ) {
  90464. left = start.offsetLeft;
  90465. }
  90466. else if ( typeof snap === 'number' ) {
  90467. left = start.offsetLeft + snap;
  90468. }
  90469. else {
  90470. left = leftDiff + start.offsetLeft;
  90471. }
  90472. if(top < 0) {
  90473. top = 0
  90474. }
  90475. else if(top + this.s.domCloneOuterHeight > this.s.documentOuterHeight) {
  90476. top = this.s.documentOuterHeight - this.s.domCloneOuterHeight;
  90477. }
  90478. this.dom.clone.css( {
  90479. top: top,
  90480. left: left
  90481. } );
  90482. },
  90483. /**
  90484. * Emit an event on the DataTable for listeners
  90485. *
  90486. * @param {string} name Event name
  90487. * @param {array} args Event arguments
  90488. * @private
  90489. */
  90490. _emitEvent: function ( name, args )
  90491. {
  90492. this.s.dt.iterator( 'table', function ( ctx, i ) {
  90493. $(ctx.nTable).triggerHandler( name+'.dt', args );
  90494. } );
  90495. },
  90496. /**
  90497. * Get pageX/Y position from an event, regardless of if it is a mouse or
  90498. * touch event.
  90499. *
  90500. * @param {object} e Event
  90501. * @param {string} pos X or Y (must be a capital)
  90502. * @private
  90503. */
  90504. _eventToPage: function ( e, pos )
  90505. {
  90506. if ( e.type.indexOf( 'touch' ) !== -1 ) {
  90507. return e.originalEvent.touches[0][ 'page'+pos ];
  90508. }
  90509. return e[ 'page'+pos ];
  90510. },
  90511. /**
  90512. * Mouse down event handler. Read initial positions and add event handlers
  90513. * for the move.
  90514. *
  90515. * @param {object} e Mouse event
  90516. * @param {jQuery} target TR element that is to be moved
  90517. * @private
  90518. */
  90519. _mouseDown: function ( e, target )
  90520. {
  90521. var that = this;
  90522. var dt = this.s.dt;
  90523. var start = this.s.start;
  90524. var offset = target.offset();
  90525. start.top = this._eventToPage( e, 'Y' );
  90526. start.left = this._eventToPage( e, 'X' );
  90527. start.offsetTop = offset.top;
  90528. start.offsetLeft = offset.left;
  90529. start.nodes = $.unique( dt.rows( { page: 'current' } ).nodes().toArray() );
  90530. this._cachePositions();
  90531. this._clone( target );
  90532. this._clonePosition( e );
  90533. this.dom.target = target;
  90534. target.addClass( 'dt-rowReorder-moving' );
  90535. $( document )
  90536. .on( 'mouseup.rowReorder touchend.rowReorder', function (e) {
  90537. that._mouseUp(e);
  90538. } )
  90539. .on( 'mousemove.rowReorder touchmove.rowReorder', function (e) {
  90540. that._mouseMove(e);
  90541. } );
  90542. // Check if window is x-scrolling - if not, disable it for the duration
  90543. // of the drag
  90544. if ( $(window).width() === $(document).width() ) {
  90545. $(document.body).addClass( 'dt-rowReorder-noOverflow' );
  90546. }
  90547. // Cache scrolling information so mouse move doesn't need to read.
  90548. // This assumes that the window and DT scroller will not change size
  90549. // during an row drag, which I think is a fair assumption
  90550. var scrollWrapper = this.dom.dtScroll;
  90551. this.s.scroll = {
  90552. windowHeight: $(window).height(),
  90553. windowWidth: $(window).width(),
  90554. dtTop: scrollWrapper.length ? scrollWrapper.offset().top : null,
  90555. dtLeft: scrollWrapper.length ? scrollWrapper.offset().left : null,
  90556. dtHeight: scrollWrapper.length ? scrollWrapper.outerHeight() : null,
  90557. dtWidth: scrollWrapper.length ? scrollWrapper.outerWidth() : null
  90558. };
  90559. },
  90560. /**
  90561. * Mouse move event handler - move the cloned row and shuffle the table's
  90562. * rows if required.
  90563. *
  90564. * @param {object} e Mouse event
  90565. * @private
  90566. */
  90567. _mouseMove: function ( e )
  90568. {
  90569. this._clonePosition( e );
  90570. // Transform the mouse position into a position in the table's body
  90571. var bodyY = this._eventToPage( e, 'Y' ) - this.s.bodyTop;
  90572. var middles = this.s.middles;
  90573. var insertPoint = null;
  90574. var dt = this.s.dt;
  90575. var body = dt.table().body();
  90576. // Determine where the row should be inserted based on the mouse
  90577. // position
  90578. for ( var i=0, ien=middles.length ; i<ien ; i++ ) {
  90579. if ( bodyY < middles[i] ) {
  90580. insertPoint = i;
  90581. break;
  90582. }
  90583. }
  90584. if ( insertPoint === null ) {
  90585. insertPoint = middles.length;
  90586. }
  90587. // Perform the DOM shuffle if it has changed from last time
  90588. if ( this.s.lastInsert === null || this.s.lastInsert !== insertPoint ) {
  90589. if ( insertPoint === 0 ) {
  90590. this.dom.target.prependTo( body );
  90591. }
  90592. else {
  90593. var nodes = $.unique( dt.rows( { page: 'current' } ).nodes().toArray() );
  90594. if ( insertPoint > this.s.lastInsert ) {
  90595. this.dom.target.insertAfter( nodes[ insertPoint-1 ] );
  90596. }
  90597. else {
  90598. this.dom.target.insertBefore( nodes[ insertPoint ] );
  90599. }
  90600. }
  90601. this._cachePositions();
  90602. this.s.lastInsert = insertPoint;
  90603. }
  90604. this._shiftScroll( e );
  90605. },
  90606. /**
  90607. * Mouse up event handler - release the event handlers and perform the
  90608. * table updates
  90609. *
  90610. * @param {object} e Mouse event
  90611. * @private
  90612. */
  90613. _mouseUp: function ( e )
  90614. {
  90615. var that = this;
  90616. var dt = this.s.dt;
  90617. var i, ien;
  90618. var dataSrc = this.c.dataSrc;
  90619. this.dom.clone.remove();
  90620. this.dom.clone = null;
  90621. this.dom.target.removeClass( 'dt-rowReorder-moving' );
  90622. //this.dom.target = null;
  90623. $(document).off( '.rowReorder' );
  90624. $(document.body).removeClass( 'dt-rowReorder-noOverflow' );
  90625. clearInterval( this.s.scrollInterval );
  90626. this.s.scrollInterval = null;
  90627. // Calculate the difference
  90628. var startNodes = this.s.start.nodes;
  90629. var endNodes = $.unique( dt.rows( { page: 'current' } ).nodes().toArray() );
  90630. var idDiff = {};
  90631. var fullDiff = [];
  90632. var diffNodes = [];
  90633. var getDataFn = this.s.getDataFn;
  90634. var setDataFn = this.s.setDataFn;
  90635. for ( i=0, ien=startNodes.length ; i<ien ; i++ ) {
  90636. if ( startNodes[i] !== endNodes[i] ) {
  90637. var id = dt.row( endNodes[i] ).id();
  90638. var endRowData = dt.row( endNodes[i] ).data();
  90639. var startRowData = dt.row( startNodes[i] ).data();
  90640. if ( id ) {
  90641. idDiff[ id ] = getDataFn( startRowData );
  90642. }
  90643. fullDiff.push( {
  90644. node: endNodes[i],
  90645. oldData: getDataFn( endRowData ),
  90646. newData: getDataFn( startRowData ),
  90647. newPosition: i,
  90648. oldPosition: $.inArray( endNodes[i], startNodes )
  90649. } );
  90650. diffNodes.push( endNodes[i] );
  90651. }
  90652. }
  90653. // Create event args
  90654. var eventArgs = [ fullDiff, {
  90655. dataSrc: dataSrc,
  90656. nodes: diffNodes,
  90657. values: idDiff,
  90658. triggerRow: dt.row( this.dom.target )
  90659. } ];
  90660. // Emit event
  90661. this._emitEvent( 'row-reorder', eventArgs );
  90662. var update = function () {
  90663. if ( that.c.update ) {
  90664. for ( i=0, ien=fullDiff.length ; i<ien ; i++ ) {
  90665. var row = dt.row( fullDiff[i].node );
  90666. var rowData = row.data();
  90667. setDataFn( rowData, fullDiff[i].newData );
  90668. // Invalidate the cell that has the same data source as the dataSrc
  90669. dt.columns().every( function () {
  90670. if ( this.dataSrc() === dataSrc ) {
  90671. dt.cell( fullDiff[i].node, this.index() ).invalidate( 'data' );
  90672. }
  90673. } );
  90674. }
  90675. // Trigger row reordered event
  90676. that._emitEvent( 'row-reordered', eventArgs );
  90677. dt.draw( false );
  90678. }
  90679. };
  90680. // Editor interface
  90681. if ( this.c.editor ) {
  90682. // Disable user interaction while Editor is submitting
  90683. this.c.enable = false;
  90684. this.c.editor
  90685. .edit(
  90686. diffNodes,
  90687. false,
  90688. $.extend( {submit: 'changed'}, this.c.formOptions )
  90689. )
  90690. .multiSet( dataSrc, idDiff )
  90691. .one( 'submitUnsuccessful.rowReorder', function () {
  90692. dt.draw( false );
  90693. } )
  90694. .one( 'submitSuccess.rowReorder', function () {
  90695. update();
  90696. } )
  90697. .one( 'submitComplete', function () {
  90698. that.c.enable = true;
  90699. that.c.editor.off( '.rowReorder' );
  90700. } )
  90701. .submit();
  90702. }
  90703. else {
  90704. update();
  90705. }
  90706. },
  90707. /**
  90708. * Move the window and DataTables scrolling during a drag to scroll new
  90709. * content into view.
  90710. *
  90711. * This matches the `_shiftScroll` method used in AutoFill, but only
  90712. * horizontal scrolling is considered here.
  90713. *
  90714. * @param {object} e Mouse move event object
  90715. * @private
  90716. */
  90717. _shiftScroll: function ( e )
  90718. {
  90719. var that = this;
  90720. var dt = this.s.dt;
  90721. var scroll = this.s.scroll;
  90722. var runInterval = false;
  90723. var scrollSpeed = 5;
  90724. var buffer = 65;
  90725. var
  90726. windowY = e.pageY - document.body.scrollTop,
  90727. windowVert,
  90728. dtVert;
  90729. // Window calculations - based on the mouse position in the window,
  90730. // regardless of scrolling
  90731. if ( windowY < buffer ) {
  90732. windowVert = scrollSpeed * -1;
  90733. }
  90734. else if ( windowY > scroll.windowHeight - buffer ) {
  90735. windowVert = scrollSpeed;
  90736. }
  90737. // DataTables scrolling calculations - based on the table's position in
  90738. // the document and the mouse position on the page
  90739. if ( scroll.dtTop !== null && e.pageY < scroll.dtTop + buffer ) {
  90740. dtVert = scrollSpeed * -1;
  90741. }
  90742. else if ( scroll.dtTop !== null && e.pageY > scroll.dtTop + scroll.dtHeight - buffer ) {
  90743. dtVert = scrollSpeed;
  90744. }
  90745. // This is where it gets interesting. We want to continue scrolling
  90746. // without requiring a mouse move, so we need an interval to be
  90747. // triggered. The interval should continue until it is no longer needed,
  90748. // but it must also use the latest scroll commands (for example consider
  90749. // that the mouse might move from scrolling up to scrolling left, all
  90750. // with the same interval running. We use the `scroll` object to "pass"
  90751. // this information to the interval. Can't use local variables as they
  90752. // wouldn't be the ones that are used by an already existing interval!
  90753. if ( windowVert || dtVert ) {
  90754. scroll.windowVert = windowVert;
  90755. scroll.dtVert = dtVert;
  90756. runInterval = true;
  90757. }
  90758. else if ( this.s.scrollInterval ) {
  90759. // Don't need to scroll - remove any existing timer
  90760. clearInterval( this.s.scrollInterval );
  90761. this.s.scrollInterval = null;
  90762. }
  90763. // If we need to run the interval to scroll and there is no existing
  90764. // interval (if there is an existing one, it will continue to run)
  90765. if ( ! this.s.scrollInterval && runInterval ) {
  90766. this.s.scrollInterval = setInterval( function () {
  90767. // Don't need to worry about setting scroll <0 or beyond the
  90768. // scroll bound as the browser will just reject that.
  90769. if ( scroll.windowVert ) {
  90770. document.body.scrollTop += scroll.windowVert;
  90771. }
  90772. // DataTables scrolling
  90773. if ( scroll.dtVert ) {
  90774. var scroller = that.dom.dtScroll[0];
  90775. if ( scroll.dtVert ) {
  90776. scroller.scrollTop += scroll.dtVert;
  90777. }
  90778. }
  90779. }, 20 );
  90780. }
  90781. }
  90782. } );
  90783. /**
  90784. * RowReorder default settings for initialisation
  90785. *
  90786. * @namespace
  90787. * @name RowReorder.defaults
  90788. * @static
  90789. */
  90790. RowReorder.defaults = {
  90791. /**
  90792. * Data point in the host row's data source object for where to get and set
  90793. * the data to reorder. This will normally also be the sorting column.
  90794. *
  90795. * @type {Number}
  90796. */
  90797. dataSrc: 0,
  90798. /**
  90799. * Editor instance that will be used to perform the update
  90800. *
  90801. * @type {DataTable.Editor}
  90802. */
  90803. editor: null,
  90804. /**
  90805. * Enable / disable RowReorder's user interaction
  90806. * @type {Boolean}
  90807. */
  90808. enable: true,
  90809. /**
  90810. * Form options to pass to Editor when submitting a change in the row order.
  90811. * See the Editor `from-options` object for details of the options
  90812. * available.
  90813. * @type {Object}
  90814. */
  90815. formOptions: {},
  90816. /**
  90817. * Drag handle selector. This defines the element that when dragged will
  90818. * reorder a row.
  90819. *
  90820. * @type {String}
  90821. */
  90822. selector: 'td:first-child',
  90823. /**
  90824. * Optionally lock the dragged row's x-position. This can be `true` to
  90825. * fix the position match the host table's, `false` to allow free movement
  90826. * of the row, or a number to define an offset from the host table.
  90827. *
  90828. * @type {Boolean|number}
  90829. */
  90830. snapX: false,
  90831. /**
  90832. * Update the table's data on drop
  90833. *
  90834. * @type {Boolean}
  90835. */
  90836. update: true
  90837. };
  90838. /*
  90839. * API
  90840. */
  90841. var Api = $.fn.dataTable.Api;
  90842. // Doesn't do anything - work around for a bug in DT... Not documented
  90843. Api.register( 'rowReorder()', function () {
  90844. return this;
  90845. } );
  90846. Api.register( 'rowReorder.enable()', function ( toggle ) {
  90847. if ( toggle === undefined ) {
  90848. toggle = true;
  90849. }
  90850. return this.iterator( 'table', function ( ctx ) {
  90851. if ( ctx.rowreorder ) {
  90852. ctx.rowreorder.c.enable = toggle;
  90853. }
  90854. } );
  90855. } );
  90856. Api.register( 'rowReorder.disable()', function () {
  90857. return this.iterator( 'table', function ( ctx ) {
  90858. if ( ctx.rowreorder ) {
  90859. ctx.rowreorder.c.enable = false;
  90860. }
  90861. } );
  90862. } );
  90863. /**
  90864. * Version information
  90865. *
  90866. * @name RowReorder.version
  90867. * @static
  90868. */
  90869. RowReorder.version = '1.2.3';
  90870. $.fn.dataTable.RowReorder = RowReorder;
  90871. $.fn.DataTable.RowReorder = RowReorder;
  90872. // Attach a listener to the document which listens for DataTables initialisation
  90873. // events so we can automatically initialise
  90874. $(document).on( 'init.dt.dtr', function (e, settings, json) {
  90875. if ( e.namespace !== 'dt' ) {
  90876. return;
  90877. }
  90878. var init = settings.oInit.rowReorder;
  90879. var defaults = DataTable.defaults.rowReorder;
  90880. if ( init || defaults ) {
  90881. var opts = $.extend( {}, init, defaults );
  90882. if ( init !== false ) {
  90883. new RowReorder( settings, opts );
  90884. }
  90885. }
  90886. } );
  90887. return RowReorder;
  90888. }));
  90889. /*! Scroller 1.4.4
  90890. * ©2011-2018 SpryMedia Ltd - datatables.net/license
  90891. */
  90892. /**
  90893. * @summary Scroller
  90894. * @description Virtual rendering for DataTables
  90895. * @version 1.4.4
  90896. * @file dataTables.scroller.js
  90897. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  90898. * @contact www.sprymedia.co.uk/contact
  90899. * @copyright Copyright 2011-2018 SpryMedia Ltd.
  90900. *
  90901. * This source file is free software, available under the following license:
  90902. * MIT license - http://datatables.net/license/mit
  90903. *
  90904. * This source file is distributed in the hope that it will be useful, but
  90905. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  90906. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  90907. *
  90908. * For details please refer to: http://www.datatables.net
  90909. */
  90910. (function( factory ){
  90911. if ( typeof define === 'function' && define.amd ) {
  90912. // AMD
  90913. define( ['jquery', 'datatables.net'], function ( $ ) {
  90914. return factory( $, window, document );
  90915. } );
  90916. }
  90917. else if ( typeof exports === 'object' ) {
  90918. // CommonJS
  90919. module.exports = function (root, $) {
  90920. if ( ! root ) {
  90921. root = window;
  90922. }
  90923. if ( ! $ || ! $.fn.dataTable ) {
  90924. $ = require('datatables.net')(root, $).$;
  90925. }
  90926. return factory( $, root, root.document );
  90927. };
  90928. }
  90929. else {
  90930. // Browser
  90931. factory( jQuery, window, document );
  90932. }
  90933. }(function( $, window, document, undefined ) {
  90934. 'use strict';
  90935. var DataTable = $.fn.dataTable;
  90936. /**
  90937. * Scroller is a virtual rendering plug-in for DataTables which allows large
  90938. * datasets to be drawn on screen every quickly. What the virtual rendering means
  90939. * is that only the visible portion of the table (and a bit to either side to make
  90940. * the scrolling smooth) is drawn, while the scrolling container gives the
  90941. * visual impression that the whole table is visible. This is done by making use
  90942. * of the pagination abilities of DataTables and moving the table around in the
  90943. * scrolling container DataTables adds to the page. The scrolling container is
  90944. * forced to the height it would be for the full table display using an extra
  90945. * element.
  90946. *
  90947. * Note that rows in the table MUST all be the same height. Information in a cell
  90948. * which expands on to multiple lines will cause some odd behaviour in the scrolling.
  90949. *
  90950. * Scroller is initialised by simply including the letter 'S' in the sDom for the
  90951. * table you want to have this feature enabled on. Note that the 'S' must come
  90952. * AFTER the 't' parameter in `dom`.
  90953. *
  90954. * Key features include:
  90955. * <ul class="limit_length">
  90956. * <li>Speed! The aim of Scroller for DataTables is to make rendering large data sets fast</li>
  90957. * <li>Full compatibility with deferred rendering in DataTables for maximum speed</li>
  90958. * <li>Display millions of rows</li>
  90959. * <li>Integration with state saving in DataTables (scrolling position is saved)</li>
  90960. * <li>Easy to use</li>
  90961. * </ul>
  90962. *
  90963. * @class
  90964. * @constructor
  90965. * @global
  90966. * @param {object} dt DataTables settings object or API instance
  90967. * @param {object} [opts={}] Configuration object for FixedColumns. Options
  90968. * are defined by {@link Scroller.defaults}
  90969. *
  90970. * @requires jQuery 1.7+
  90971. * @requires DataTables 1.10.0+
  90972. *
  90973. * @example
  90974. * $(document).ready(function() {
  90975. * $('#example').DataTable( {
  90976. * "scrollY": "200px",
  90977. * "ajax": "media/dataset/large.txt",
  90978. * "dom": "frtiS",
  90979. * "deferRender": true
  90980. * } );
  90981. * } );
  90982. */
  90983. var Scroller = function ( dt, opts ) {
  90984. /* Sanity check - you just know it will happen */
  90985. if ( ! (this instanceof Scroller) ) {
  90986. alert( "Scroller warning: Scroller must be initialised with the 'new' keyword." );
  90987. return;
  90988. }
  90989. if ( opts === undefined ) {
  90990. opts = {};
  90991. }
  90992. /**
  90993. * Settings object which contains customisable information for the Scroller instance
  90994. * @namespace
  90995. * @private
  90996. * @extends Scroller.defaults
  90997. */
  90998. this.s = {
  90999. /**
  91000. * DataTables settings object
  91001. * @type object
  91002. * @default Passed in as first parameter to constructor
  91003. */
  91004. "dt": $.fn.dataTable.Api( dt ).settings()[0],
  91005. /**
  91006. * Pixel location of the top of the drawn table in the viewport
  91007. * @type int
  91008. * @default 0
  91009. */
  91010. "tableTop": 0,
  91011. /**
  91012. * Pixel location of the bottom of the drawn table in the viewport
  91013. * @type int
  91014. * @default 0
  91015. */
  91016. "tableBottom": 0,
  91017. /**
  91018. * Pixel location of the boundary for when the next data set should be loaded and drawn
  91019. * when scrolling up the way.
  91020. * @type int
  91021. * @default 0
  91022. * @private
  91023. */
  91024. "redrawTop": 0,
  91025. /**
  91026. * Pixel location of the boundary for when the next data set should be loaded and drawn
  91027. * when scrolling down the way. Note that this is actually calculated as the offset from
  91028. * the top.
  91029. * @type int
  91030. * @default 0
  91031. * @private
  91032. */
  91033. "redrawBottom": 0,
  91034. /**
  91035. * Auto row height or not indicator
  91036. * @type bool
  91037. * @default 0
  91038. */
  91039. "autoHeight": true,
  91040. /**
  91041. * Number of rows calculated as visible in the visible viewport
  91042. * @type int
  91043. * @default 0
  91044. */
  91045. "viewportRows": 0,
  91046. /**
  91047. * setTimeout reference for state saving, used when state saving is enabled in the DataTable
  91048. * and when the user scrolls the viewport in order to stop the cookie set taking too much
  91049. * CPU!
  91050. * @type int
  91051. * @default 0
  91052. */
  91053. "stateTO": null,
  91054. /**
  91055. * setTimeout reference for the redraw, used when server-side processing is enabled in the
  91056. * DataTables in order to prevent DoSing the server
  91057. * @type int
  91058. * @default null
  91059. */
  91060. "drawTO": null,
  91061. heights: {
  91062. jump: null,
  91063. page: null,
  91064. virtual: null,
  91065. scroll: null,
  91066. /**
  91067. * Height of rows in the table
  91068. * @type int
  91069. * @default 0
  91070. */
  91071. row: null,
  91072. /**
  91073. * Pixel height of the viewport
  91074. * @type int
  91075. * @default 0
  91076. */
  91077. viewport: null
  91078. },
  91079. topRowFloat: 0,
  91080. scrollDrawDiff: null,
  91081. loaderVisible: false,
  91082. forceReposition: false
  91083. };
  91084. // @todo The defaults should extend a `c` property and the internal settings
  91085. // only held in the `s` property. At the moment they are mixed
  91086. this.s = $.extend( this.s, Scroller.oDefaults, opts );
  91087. // Workaround for row height being read from height object (see above comment)
  91088. this.s.heights.row = this.s.rowHeight;
  91089. /**
  91090. * DOM elements used by the class instance
  91091. * @private
  91092. * @namespace
  91093. *
  91094. */
  91095. this.dom = {
  91096. "force": document.createElement('div'),
  91097. "scroller": null,
  91098. "table": null,
  91099. "loader": null
  91100. };
  91101. // Attach the instance to the DataTables instance so it can be accessed in
  91102. // future. Don't initialise Scroller twice on the same table
  91103. if ( this.s.dt.oScroller ) {
  91104. return;
  91105. }
  91106. this.s.dt.oScroller = this;
  91107. /* Let's do it */
  91108. this._fnConstruct();
  91109. };
  91110. $.extend( Scroller.prototype, {
  91111. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  91112. * Public methods
  91113. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  91114. /**
  91115. * Calculate the pixel position from the top of the scrolling container for
  91116. * a given row
  91117. * @param {int} iRow Row number to calculate the position of
  91118. * @returns {int} Pixels
  91119. * @example
  91120. * $(document).ready(function() {
  91121. * $('#example').dataTable( {
  91122. * "sScrollY": "200px",
  91123. * "sAjaxSource": "media/dataset/large.txt",
  91124. * "sDom": "frtiS",
  91125. * "bDeferRender": true,
  91126. * "fnInitComplete": function (o) {
  91127. * // Find where row 25 is
  91128. * alert( o.oScroller.fnRowToPixels( 25 ) );
  91129. * }
  91130. * } );
  91131. * } );
  91132. */
  91133. "fnRowToPixels": function ( rowIdx, intParse, virtual )
  91134. {
  91135. var pixels;
  91136. if ( virtual ) {
  91137. pixels = this._domain( 'virtualToPhysical', rowIdx * this.s.heights.row );
  91138. }
  91139. else {
  91140. var diff = rowIdx - this.s.baseRowTop;
  91141. pixels = this.s.baseScrollTop + (diff * this.s.heights.row);
  91142. }
  91143. return intParse || intParse === undefined ?
  91144. parseInt( pixels, 10 ) :
  91145. pixels;
  91146. },
  91147. /**
  91148. * Calculate the row number that will be found at the given pixel position
  91149. * (y-scroll).
  91150. *
  91151. * Please note that when the height of the full table exceeds 1 million
  91152. * pixels, Scroller switches into a non-linear mode for the scrollbar to fit
  91153. * all of the records into a finite area, but this function returns a linear
  91154. * value (relative to the last non-linear positioning).
  91155. * @param {int} iPixels Offset from top to calculate the row number of
  91156. * @param {int} [intParse=true] If an integer value should be returned
  91157. * @param {int} [virtual=false] Perform the calculations in the virtual domain
  91158. * @returns {int} Row index
  91159. * @example
  91160. * $(document).ready(function() {
  91161. * $('#example').dataTable( {
  91162. * "sScrollY": "200px",
  91163. * "sAjaxSource": "media/dataset/large.txt",
  91164. * "sDom": "frtiS",
  91165. * "bDeferRender": true,
  91166. * "fnInitComplete": function (o) {
  91167. * // Find what row number is at 500px
  91168. * alert( o.oScroller.fnPixelsToRow( 500 ) );
  91169. * }
  91170. * } );
  91171. * } );
  91172. */
  91173. "fnPixelsToRow": function ( pixels, intParse, virtual )
  91174. {
  91175. var diff = pixels - this.s.baseScrollTop;
  91176. var row = virtual ?
  91177. this._domain( 'physicalToVirtual', pixels ) / this.s.heights.row :
  91178. ( diff / this.s.heights.row ) + this.s.baseRowTop;
  91179. return intParse || intParse === undefined ?
  91180. parseInt( row, 10 ) :
  91181. row;
  91182. },
  91183. /**
  91184. * Calculate the row number that will be found at the given pixel position (y-scroll)
  91185. * @param {int} iRow Row index to scroll to
  91186. * @param {bool} [bAnimate=true] Animate the transition or not
  91187. * @returns {void}
  91188. * @example
  91189. * $(document).ready(function() {
  91190. * $('#example').dataTable( {
  91191. * "sScrollY": "200px",
  91192. * "sAjaxSource": "media/dataset/large.txt",
  91193. * "sDom": "frtiS",
  91194. * "bDeferRender": true,
  91195. * "fnInitComplete": function (o) {
  91196. * // Immediately scroll to row 1000
  91197. * o.oScroller.fnScrollToRow( 1000 );
  91198. * }
  91199. * } );
  91200. *
  91201. * // Sometime later on use the following to scroll to row 500...
  91202. * var oSettings = $('#example').dataTable().fnSettings();
  91203. * oSettings.oScroller.fnScrollToRow( 500 );
  91204. * } );
  91205. */
  91206. "fnScrollToRow": function ( iRow, bAnimate )
  91207. {
  91208. var that = this;
  91209. var ani = false;
  91210. var px = this.fnRowToPixels( iRow );
  91211. // We need to know if the table will redraw or not before doing the
  91212. // scroll. If it will not redraw, then we need to use the currently
  91213. // displayed table, and scroll with the physical pixels. Otherwise, we
  91214. // need to calculate the table's new position from the virtual
  91215. // transform.
  91216. var preRows = ((this.s.displayBuffer-1)/2) * this.s.viewportRows;
  91217. var drawRow = iRow - preRows;
  91218. if ( drawRow < 0 ) {
  91219. drawRow = 0;
  91220. }
  91221. if ( (px > this.s.redrawBottom || px < this.s.redrawTop) && this.s.dt._iDisplayStart !== drawRow ) {
  91222. ani = true;
  91223. px = this.fnRowToPixels( iRow, false, true );
  91224. // If we need records outside the current draw region, but the new
  91225. // scrolling position is inside that (due to the non-linear nature
  91226. // for larger numbers of records), we need to force position update.
  91227. if ( this.s.redrawTop < px && px < this.s.redrawBottom ) {
  91228. this.s.forceReposition = true;
  91229. bAnimate = false;
  91230. }
  91231. }
  91232. if ( typeof bAnimate == 'undefined' || bAnimate )
  91233. {
  91234. this.s.ani = ani;
  91235. $(this.dom.scroller).animate( {
  91236. "scrollTop": px
  91237. }, function () {
  91238. // This needs to happen after the animation has completed and
  91239. // the final scroll event fired
  91240. setTimeout( function () {
  91241. that.s.ani = false;
  91242. }, 25 );
  91243. } );
  91244. }
  91245. else
  91246. {
  91247. $(this.dom.scroller).scrollTop( px );
  91248. }
  91249. },
  91250. /**
  91251. * Calculate and store information about how many rows are to be displayed
  91252. * in the scrolling viewport, based on current dimensions in the browser's
  91253. * rendering. This can be particularly useful if the table is initially
  91254. * drawn in a hidden element - for example in a tab.
  91255. * @param {bool} [bRedraw=true] Redraw the table automatically after the recalculation, with
  91256. * the new dimensions forming the basis for the draw.
  91257. * @returns {void}
  91258. * @example
  91259. * $(document).ready(function() {
  91260. * // Make the example container hidden to throw off the browser's sizing
  91261. * document.getElementById('container').style.display = "none";
  91262. * var oTable = $('#example').dataTable( {
  91263. * "sScrollY": "200px",
  91264. * "sAjaxSource": "media/dataset/large.txt",
  91265. * "sDom": "frtiS",
  91266. * "bDeferRender": true,
  91267. * "fnInitComplete": function (o) {
  91268. * // Immediately scroll to row 1000
  91269. * o.oScroller.fnScrollToRow( 1000 );
  91270. * }
  91271. * } );
  91272. *
  91273. * setTimeout( function () {
  91274. * // Make the example container visible and recalculate the scroller sizes
  91275. * document.getElementById('container').style.display = "block";
  91276. * oTable.fnSettings().oScroller.fnMeasure();
  91277. * }, 3000 );
  91278. */
  91279. "fnMeasure": function ( bRedraw )
  91280. {
  91281. if ( this.s.autoHeight )
  91282. {
  91283. this._fnCalcRowHeight();
  91284. }
  91285. var heights = this.s.heights;
  91286. if ( heights.row ) {
  91287. heights.viewport = $.contains(document, this.dom.scroller) ?
  91288. $(this.dom.scroller).height() :
  91289. this._parseHeight($(this.dom.scroller).css('height'));
  91290. // If collapsed (no height) use the max-height parameter
  91291. if ( ! heights.viewport ) {
  91292. heights.viewport = this._parseHeight($(this.dom.scroller).css('max-height'));
  91293. }
  91294. this.s.viewportRows = parseInt( heights.viewport / heights.row, 10 )+1;
  91295. this.s.dt._iDisplayLength = this.s.viewportRows * this.s.displayBuffer;
  91296. }
  91297. if ( bRedraw === undefined || bRedraw )
  91298. {
  91299. this.s.dt.oInstance.fnDraw( false );
  91300. }
  91301. },
  91302. /**
  91303. * Get information about current displayed record range. This corresponds to
  91304. * the information usually displayed in the "Info" block of the table.
  91305. *
  91306. * @returns {object} info as an object:
  91307. * {
  91308. * start: {int}, // the 0-indexed record at the top of the viewport
  91309. * end: {int}, // the 0-indexed record at the bottom of the viewport
  91310. * }
  91311. */
  91312. "fnPageInfo": function()
  91313. {
  91314. var
  91315. dt = this.s.dt,
  91316. iScrollTop = this.dom.scroller.scrollTop,
  91317. iTotal = dt.fnRecordsDisplay(),
  91318. iPossibleEnd = Math.ceil(this.fnPixelsToRow(iScrollTop + this.s.heights.viewport, false, this.s.ani));
  91319. return {
  91320. start: Math.floor(this.fnPixelsToRow(iScrollTop, false, this.s.ani)),
  91321. end: iTotal < iPossibleEnd ? iTotal-1 : iPossibleEnd-1
  91322. };
  91323. },
  91324. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  91325. * Private methods (they are of course public in JS, but recommended as private)
  91326. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  91327. /**
  91328. * Initialisation for Scroller
  91329. * @returns {void}
  91330. * @private
  91331. */
  91332. "_fnConstruct": function ()
  91333. {
  91334. var that = this;
  91335. /* Sanity check */
  91336. if ( !this.s.dt.oFeatures.bPaginate ) {
  91337. this.s.dt.oApi._fnLog( this.s.dt, 0, 'Pagination must be enabled for Scroller' );
  91338. return;
  91339. }
  91340. /* Insert a div element that we can use to force the DT scrolling container to
  91341. * the height that would be required if the whole table was being displayed
  91342. */
  91343. this.dom.force.style.position = "relative";
  91344. this.dom.force.style.top = "0px";
  91345. this.dom.force.style.left = "0px";
  91346. this.dom.force.style.width = "1px";
  91347. this.dom.scroller = $('div.'+this.s.dt.oClasses.sScrollBody, this.s.dt.nTableWrapper)[0];
  91348. this.dom.scroller.appendChild( this.dom.force );
  91349. this.dom.scroller.style.position = "relative";
  91350. this.dom.table = $('>table', this.dom.scroller)[0];
  91351. this.dom.table.style.position = "absolute";
  91352. this.dom.table.style.top = "0px";
  91353. this.dom.table.style.left = "0px";
  91354. // Add class to 'announce' that we are a Scroller table
  91355. $(this.s.dt.nTableWrapper).addClass('DTS');
  91356. // Add a 'loading' indicator
  91357. if ( this.s.loadingIndicator )
  91358. {
  91359. this.dom.loader = $('<div class="dataTables_processing DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+'</div>')
  91360. .css('display', 'none');
  91361. $(this.dom.scroller.parentNode)
  91362. .css('position', 'relative')
  91363. .append( this.dom.loader );
  91364. }
  91365. /* Initial size calculations */
  91366. if ( this.s.heights.row && this.s.heights.row != 'auto' )
  91367. {
  91368. this.s.autoHeight = false;
  91369. }
  91370. this.fnMeasure( false );
  91371. /* Scrolling callback to see if a page change is needed - use a throttled
  91372. * function for the save save callback so we aren't hitting it on every
  91373. * scroll
  91374. */
  91375. this.s.ingnoreScroll = true;
  91376. this.s.stateSaveThrottle = this.s.dt.oApi._fnThrottle( function () {
  91377. that.s.dt.oApi._fnSaveState( that.s.dt );
  91378. }, 500 );
  91379. $(this.dom.scroller).on( 'scroll.DTS', function (e) {
  91380. that._fnScroll.call( that );
  91381. } );
  91382. /* In iOS we catch the touchstart event in case the user tries to scroll
  91383. * while the display is already scrolling
  91384. */
  91385. $(this.dom.scroller).on('touchstart.DTS', function () {
  91386. that._fnScroll.call( that );
  91387. } );
  91388. /* Update the scroller when the DataTable is redrawn */
  91389. this.s.dt.aoDrawCallback.push( {
  91390. "fn": function () {
  91391. if ( that.s.dt.bInitialised ) {
  91392. that._fnDrawCallback.call( that );
  91393. }
  91394. },
  91395. "sName": "Scroller"
  91396. } );
  91397. /* On resize, update the information element, since the number of rows shown might change */
  91398. $(window).on( 'resize.DTS', function () {
  91399. that.fnMeasure( false );
  91400. that._fnInfo();
  91401. } );
  91402. /* Add a state saving parameter to the DT state saving so we can restore the exact
  91403. * position of the scrolling
  91404. */
  91405. var initialStateSave = true;
  91406. this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) {
  91407. /* Set iScroller to saved scroll position on initialization.
  91408. */
  91409. if(initialStateSave && that.s.dt.oLoadedState){
  91410. oData.iScroller = that.s.dt.oLoadedState.iScroller;
  91411. oData.iScrollerTopRow = that.s.dt.oLoadedState.iScrollerTopRow;
  91412. initialStateSave = false;
  91413. } else {
  91414. oData.iScroller = that.dom.scroller.scrollTop;
  91415. oData.iScrollerTopRow = that.s.topRowFloat;
  91416. }
  91417. }, "Scroller_State" );
  91418. if ( this.s.dt.oLoadedState ) {
  91419. this.s.topRowFloat = this.s.dt.oLoadedState.iScrollerTopRow || 0;
  91420. }
  91421. // Measure immediately. Scroller will have been added using preInit, so
  91422. // we can reliably do this here. We could potentially also measure on
  91423. // init complete, which would be useful for cases where the data is Ajax
  91424. // loaded and longer than a single line.
  91425. $(this.s.dt.nTable).one( 'init.dt', function () {
  91426. that.fnMeasure();
  91427. } );
  91428. /* Destructor */
  91429. this.s.dt.aoDestroyCallback.push( {
  91430. "sName": "Scroller",
  91431. "fn": function () {
  91432. $(window).off( 'resize.DTS' );
  91433. $(that.dom.scroller).off('touchstart.DTS scroll.DTS');
  91434. $(that.s.dt.nTableWrapper).removeClass('DTS');
  91435. $('div.DTS_Loading', that.dom.scroller.parentNode).remove();
  91436. $(that.s.dt.nTable).off( 'init.dt' );
  91437. that.dom.table.style.position = "";
  91438. that.dom.table.style.top = "";
  91439. that.dom.table.style.left = "";
  91440. }
  91441. } );
  91442. },
  91443. /**
  91444. * Scrolling function - fired whenever the scrolling position is changed.
  91445. * This method needs to use the stored values to see if the table should be
  91446. * redrawn as we are moving towards the end of the information that is
  91447. * currently drawn or not. If needed, then it will redraw the table based on
  91448. * the new position.
  91449. * @returns {void}
  91450. * @private
  91451. */
  91452. "_fnScroll": function ()
  91453. {
  91454. var
  91455. that = this,
  91456. heights = this.s.heights,
  91457. iScrollTop = this.dom.scroller.scrollTop,
  91458. iTopRow;
  91459. if ( this.s.skip ) {
  91460. return;
  91461. }
  91462. if ( this.s.ingnoreScroll ) {
  91463. return;
  91464. }
  91465. /* If the table has been sorted or filtered, then we use the redraw that
  91466. * DataTables as done, rather than performing our own
  91467. */
  91468. if ( this.s.dt.bFiltered || this.s.dt.bSorted ) {
  91469. this.s.lastScrollTop = 0;
  91470. return;
  91471. }
  91472. /* Update the table's information display for what is now in the viewport */
  91473. this._fnInfo();
  91474. /* We don't want to state save on every scroll event - that's heavy
  91475. * handed, so use a timeout to update the state saving only when the
  91476. * scrolling has finished
  91477. */
  91478. clearTimeout( this.s.stateTO );
  91479. this.s.stateTO = setTimeout( function () {
  91480. that.s.dt.oApi._fnSaveState( that.s.dt );
  91481. }, 250 );
  91482. /* Check if the scroll point is outside the trigger boundary which would required
  91483. * a DataTables redraw
  91484. */
  91485. if ( this.s.forceReposition || iScrollTop < this.s.redrawTop || iScrollTop > this.s.redrawBottom ) {
  91486. var preRows = Math.ceil( ((this.s.displayBuffer-1)/2) * this.s.viewportRows );
  91487. if ( Math.abs( iScrollTop - this.s.lastScrollTop ) > heights.viewport || this.s.ani || this.s.forceReposition ) {
  91488. iTopRow = parseInt(this._domain( 'physicalToVirtual', iScrollTop ) / heights.row, 10) - preRows;
  91489. this.s.topRowFloat = this._domain( 'physicalToVirtual', iScrollTop ) / heights.row;
  91490. }
  91491. else {
  91492. iTopRow = this.fnPixelsToRow( iScrollTop ) - preRows;
  91493. this.s.topRowFloat = this.fnPixelsToRow( iScrollTop, false );
  91494. }
  91495. this.s.forceReposition = false;
  91496. if ( iTopRow <= 0 ) {
  91497. /* At the start of the table */
  91498. iTopRow = 0;
  91499. }
  91500. else if ( iTopRow + this.s.dt._iDisplayLength > this.s.dt.fnRecordsDisplay() ) {
  91501. /* At the end of the table */
  91502. iTopRow = this.s.dt.fnRecordsDisplay() - this.s.dt._iDisplayLength;
  91503. if ( iTopRow < 0 ) {
  91504. iTopRow = 0;
  91505. }
  91506. }
  91507. else if ( iTopRow % 2 !== 0 ) {
  91508. // For the row-striping classes (odd/even) we want only to start
  91509. // on evens otherwise the stripes will change between draws and
  91510. // look rubbish
  91511. iTopRow++;
  91512. }
  91513. if ( iTopRow != this.s.dt._iDisplayStart ) {
  91514. /* Cache the new table position for quick lookups */
  91515. this.s.tableTop = $(this.s.dt.nTable).offset().top;
  91516. this.s.tableBottom = $(this.s.dt.nTable).height() + this.s.tableTop;
  91517. var draw = function () {
  91518. if ( that.s.scrollDrawReq === null ) {
  91519. that.s.scrollDrawReq = iScrollTop;
  91520. }
  91521. that.s.dt._iDisplayStart = iTopRow;
  91522. that.s.dt.oApi._fnDraw( that.s.dt );
  91523. };
  91524. /* Do the DataTables redraw based on the calculated start point - note that when
  91525. * using server-side processing we introduce a small delay to not DoS the server...
  91526. */
  91527. if ( this.s.dt.oFeatures.bServerSide ) {
  91528. clearTimeout( this.s.drawTO );
  91529. this.s.drawTO = setTimeout( draw, this.s.serverWait );
  91530. }
  91531. else {
  91532. draw();
  91533. }
  91534. if ( this.dom.loader && ! this.s.loaderVisible ) {
  91535. this.dom.loader.css( 'display', 'block' );
  91536. this.s.loaderVisible = true;
  91537. }
  91538. }
  91539. }
  91540. else {
  91541. this.s.topRowFloat = this._domain( 'physicalToVirtual', iScrollTop ) / heights.row;
  91542. }
  91543. this.s.lastScrollTop = iScrollTop;
  91544. this.s.stateSaveThrottle();
  91545. },
  91546. /**
  91547. * Convert from one domain to another. The physical domain is the actual
  91548. * pixel count on the screen, while the virtual is if we had browsers which
  91549. * had scrolling containers of infinite height (i.e. the absolute value)
  91550. *
  91551. * @param {string} dir Domain transform direction, `virtualToPhysical` or
  91552. * `physicalToVirtual`
  91553. * @returns {number} Calculated transform
  91554. * @private
  91555. */
  91556. _domain: function ( dir, val )
  91557. {
  91558. var heights = this.s.heights;
  91559. var coeff;
  91560. // If the virtual and physical height match, then we use a linear
  91561. // transform between the two, allowing the scrollbar to be linear
  91562. if ( heights.virtual === heights.scroll ) {
  91563. return val;
  91564. }
  91565. // Otherwise, we want a non-linear scrollbar to take account of the
  91566. // redrawing regions at the start and end of the table, otherwise these
  91567. // can stutter badly - on large tables 30px (for example) scroll might
  91568. // be hundreds of rows, so the table would be redrawing every few px at
  91569. // the start and end. Use a simple quadratic to stop this. It does mean
  91570. // the scrollbar is non-linear, but with such massive data sets, the
  91571. // scrollbar is going to be a best guess anyway
  91572. var xMax = (heights.scroll - heights.viewport) / 2;
  91573. var yMax = (heights.virtual - heights.viewport) / 2;
  91574. coeff = yMax / ( xMax * xMax );
  91575. if ( dir === 'virtualToPhysical' ) {
  91576. if ( val < yMax ) {
  91577. return Math.pow(val / coeff, 0.5);
  91578. }
  91579. else {
  91580. val = (yMax*2) - val;
  91581. return val < 0 ?
  91582. heights.scroll :
  91583. (xMax*2) - Math.pow(val / coeff, 0.5);
  91584. }
  91585. }
  91586. else if ( dir === 'physicalToVirtual' ) {
  91587. if ( val < xMax ) {
  91588. return val * val * coeff;
  91589. }
  91590. else {
  91591. val = (xMax*2) - val;
  91592. return val < 0 ?
  91593. heights.virtual :
  91594. (yMax*2) - (val * val * coeff);
  91595. }
  91596. }
  91597. },
  91598. /**
  91599. * Parse CSS height property string as number
  91600. *
  91601. * An attempt is made to parse the string as a number. Currently supported units are 'px',
  91602. * 'vh', and 'rem'. 'em' is partially supported; it works as long as the parent element's
  91603. * font size matches the body element. Zero is returned for unrecognized strings.
  91604. * @param {string} cssHeight CSS height property string
  91605. * @returns {number} height
  91606. * @private
  91607. */
  91608. _parseHeight: function(cssHeight) {
  91609. var height;
  91610. var matches = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(px|em|rem|vh)$/.exec(cssHeight);
  91611. if (matches === null) {
  91612. return 0;
  91613. }
  91614. var value = parseFloat(matches[1]);
  91615. var unit = matches[2];
  91616. if ( unit === 'px' ) {
  91617. height = value;
  91618. }
  91619. else if ( unit === 'vh' ) {
  91620. height = ( value / 100 ) * $(window).height();
  91621. }
  91622. else if ( unit === 'rem' ) {
  91623. height = value * parseFloat($(':root').css('font-size'));
  91624. }
  91625. else if ( unit === 'em' ) {
  91626. height = value * parseFloat($('body').css('font-size'));
  91627. }
  91628. return height ?
  91629. height :
  91630. 0;
  91631. },
  91632. /**
  91633. * Draw callback function which is fired when the DataTable is redrawn. The main function of
  91634. * this method is to position the drawn table correctly the scrolling container for the rows
  91635. * that is displays as a result of the scrolling position.
  91636. * @returns {void}
  91637. * @private
  91638. */
  91639. "_fnDrawCallback": function ()
  91640. {
  91641. var
  91642. that = this,
  91643. heights = this.s.heights,
  91644. iScrollTop = this.dom.scroller.scrollTop,
  91645. iActualScrollTop = iScrollTop,
  91646. iScrollBottom = iScrollTop + heights.viewport,
  91647. iTableHeight = $(this.s.dt.nTable).height(),
  91648. displayStart = this.s.dt._iDisplayStart,
  91649. displayLen = this.s.dt._iDisplayLength,
  91650. displayEnd = this.s.dt.fnRecordsDisplay();
  91651. // Disable the scroll event listener while we are updating the DOM
  91652. this.s.skip = true;
  91653. // Resize the scroll forcing element
  91654. this._fnScrollForce();
  91655. // Reposition the scrolling for the updated virtual position if needed
  91656. if ( displayStart === 0 ) {
  91657. // Linear calculation at the top of the table
  91658. iScrollTop = this.s.topRowFloat * heights.row;
  91659. }
  91660. else if ( displayStart + displayLen >= displayEnd ) {
  91661. // Linear calculation that the bottom as well
  91662. iScrollTop = heights.scroll - ((displayEnd - this.s.topRowFloat) * heights.row);
  91663. }
  91664. else {
  91665. // Domain scaled in the middle
  91666. iScrollTop = this._domain( 'virtualToPhysical', this.s.topRowFloat * heights.row );
  91667. }
  91668. this.dom.scroller.scrollTop = iScrollTop;
  91669. // Store positional information so positional calculations can be based
  91670. // upon the current table draw position
  91671. this.s.baseScrollTop = iScrollTop;
  91672. this.s.baseRowTop = this.s.topRowFloat;
  91673. // Position the table in the virtual scroller
  91674. var tableTop = iScrollTop - ((this.s.topRowFloat - displayStart) * heights.row);
  91675. if ( displayStart === 0 ) {
  91676. tableTop = 0;
  91677. }
  91678. else if ( displayStart + displayLen >= displayEnd ) {
  91679. tableTop = heights.scroll - iTableHeight;
  91680. }
  91681. this.dom.table.style.top = tableTop+'px';
  91682. /* Cache some information for the scroller */
  91683. this.s.tableTop = tableTop;
  91684. this.s.tableBottom = iTableHeight + this.s.tableTop;
  91685. // Calculate the boundaries for where a redraw will be triggered by the
  91686. // scroll event listener
  91687. var boundaryPx = (iScrollTop - this.s.tableTop) * this.s.boundaryScale;
  91688. this.s.redrawTop = iScrollTop - boundaryPx;
  91689. this.s.redrawBottom = iScrollTop + boundaryPx > heights.scroll - heights.viewport - heights.row ?
  91690. heights.scroll - heights.viewport - heights.row :
  91691. iScrollTop + boundaryPx;
  91692. this.s.skip = false;
  91693. // Restore the scrolling position that was saved by DataTable's state
  91694. // saving Note that this is done on the second draw when data is Ajax
  91695. // sourced, and the first draw when DOM soured
  91696. if ( this.s.dt.oFeatures.bStateSave && this.s.dt.oLoadedState !== null &&
  91697. typeof this.s.dt.oLoadedState.iScroller != 'undefined' )
  91698. {
  91699. // A quirk of DataTables is that the draw callback will occur on an
  91700. // empty set if Ajax sourced, but not if server-side processing.
  91701. var ajaxSourced = (this.s.dt.sAjaxSource || that.s.dt.ajax) && ! this.s.dt.oFeatures.bServerSide ?
  91702. true :
  91703. false;
  91704. if ( ( ajaxSourced && this.s.dt.iDraw == 2) ||
  91705. (!ajaxSourced && this.s.dt.iDraw == 1) )
  91706. {
  91707. setTimeout( function () {
  91708. $(that.dom.scroller).scrollTop( that.s.dt.oLoadedState.iScroller );
  91709. that.s.redrawTop = that.s.dt.oLoadedState.iScroller - (heights.viewport/2);
  91710. // In order to prevent layout thrashing we need another
  91711. // small delay
  91712. setTimeout( function () {
  91713. that.s.ingnoreScroll = false;
  91714. }, 0 );
  91715. }, 0 );
  91716. }
  91717. }
  91718. else {
  91719. that.s.ingnoreScroll = false;
  91720. }
  91721. // Because of the order of the DT callbacks, the info update will
  91722. // take precedence over the one we want here. So a 'thread' break is
  91723. // needed. Only add the thread break if bInfo is set
  91724. if ( this.s.dt.oFeatures.bInfo ) {
  91725. setTimeout( function () {
  91726. that._fnInfo.call( that );
  91727. }, 0 );
  91728. }
  91729. // Hide the loading indicator
  91730. if ( this.dom.loader && this.s.loaderVisible ) {
  91731. this.dom.loader.css( 'display', 'none' );
  91732. this.s.loaderVisible = false;
  91733. }
  91734. },
  91735. /**
  91736. * Force the scrolling container to have height beyond that of just the
  91737. * table that has been drawn so the user can scroll the whole data set.
  91738. *
  91739. * Note that if the calculated required scrolling height exceeds a maximum
  91740. * value (1 million pixels - hard-coded) the forcing element will be set
  91741. * only to that maximum value and virtual / physical domain transforms will
  91742. * be used to allow Scroller to display tables of any number of records.
  91743. * @returns {void}
  91744. * @private
  91745. */
  91746. _fnScrollForce: function ()
  91747. {
  91748. var heights = this.s.heights;
  91749. var max = 1000000;
  91750. heights.virtual = heights.row * this.s.dt.fnRecordsDisplay();
  91751. heights.scroll = heights.virtual;
  91752. if ( heights.scroll > max ) {
  91753. heights.scroll = max;
  91754. }
  91755. // Minimum height so there is always a row visible (the 'no rows found'
  91756. // if reduced to zero filtering)
  91757. this.dom.force.style.height = heights.scroll > this.s.heights.row ?
  91758. heights.scroll+'px' :
  91759. this.s.heights.row+'px';
  91760. },
  91761. /**
  91762. * Automatic calculation of table row height. This is just a little tricky here as using
  91763. * initialisation DataTables has tale the table out of the document, so we need to create
  91764. * a new table and insert it into the document, calculate the row height and then whip the
  91765. * table out.
  91766. * @returns {void}
  91767. * @private
  91768. */
  91769. "_fnCalcRowHeight": function ()
  91770. {
  91771. var dt = this.s.dt;
  91772. var origTable = dt.nTable;
  91773. var nTable = origTable.cloneNode( false );
  91774. var tbody = $('<tbody/>').appendTo( nTable );
  91775. var container = $(
  91776. '<div class="'+dt.oClasses.sWrapper+' DTS">'+
  91777. '<div class="'+dt.oClasses.sScrollWrapper+'">'+
  91778. '<div class="'+dt.oClasses.sScrollBody+'"></div>'+
  91779. '</div>'+
  91780. '</div>'
  91781. );
  91782. // Want 3 rows in the sizing table so :first-child and :last-child
  91783. // CSS styles don't come into play - take the size of the middle row
  91784. $('tbody tr:lt(4)', origTable).clone().appendTo( tbody );
  91785. while( $('tr', tbody).length < 3 ) {
  91786. tbody.append( '<tr><td>&nbsp;</td></tr>' );
  91787. }
  91788. $('div.'+dt.oClasses.sScrollBody, container).append( nTable );
  91789. // If initialised using `dom`, use the holding element as the insert point
  91790. var insertEl = this.s.dt.nHolding || origTable.parentNode;
  91791. if ( ! $(insertEl).is(':visible') ) {
  91792. insertEl = 'body';
  91793. }
  91794. container.appendTo( insertEl );
  91795. this.s.heights.row = $('tr', tbody).eq(1).outerHeight();
  91796. container.remove();
  91797. },
  91798. /**
  91799. * Update any information elements that are controlled by the DataTable based on the scrolling
  91800. * viewport and what rows are visible in it. This function basically acts in the same way as
  91801. * _fnUpdateInfo in DataTables, and effectively replaces that function.
  91802. * @returns {void}
  91803. * @private
  91804. */
  91805. "_fnInfo": function ()
  91806. {
  91807. if ( !this.s.dt.oFeatures.bInfo )
  91808. {
  91809. return;
  91810. }
  91811. var
  91812. dt = this.s.dt,
  91813. language = dt.oLanguage,
  91814. iScrollTop = this.dom.scroller.scrollTop,
  91815. iStart = Math.floor( this.fnPixelsToRow(iScrollTop, false, this.s.ani)+1 ),
  91816. iMax = dt.fnRecordsTotal(),
  91817. iTotal = dt.fnRecordsDisplay(),
  91818. iPossibleEnd = Math.ceil( this.fnPixelsToRow(iScrollTop+this.s.heights.viewport, false, this.s.ani) ),
  91819. iEnd = iTotal < iPossibleEnd ? iTotal : iPossibleEnd,
  91820. sStart = dt.fnFormatNumber( iStart ),
  91821. sEnd = dt.fnFormatNumber( iEnd ),
  91822. sMax = dt.fnFormatNumber( iMax ),
  91823. sTotal = dt.fnFormatNumber( iTotal ),
  91824. sOut;
  91825. if ( dt.fnRecordsDisplay() === 0 &&
  91826. dt.fnRecordsDisplay() == dt.fnRecordsTotal() )
  91827. {
  91828. /* Empty record set */
  91829. sOut = language.sInfoEmpty+ language.sInfoPostFix;
  91830. }
  91831. else if ( dt.fnRecordsDisplay() === 0 )
  91832. {
  91833. /* Empty record set after filtering */
  91834. sOut = language.sInfoEmpty +' '+
  91835. language.sInfoFiltered.replace('_MAX_', sMax)+
  91836. language.sInfoPostFix;
  91837. }
  91838. else if ( dt.fnRecordsDisplay() == dt.fnRecordsTotal() )
  91839. {
  91840. /* Normal record set */
  91841. sOut = language.sInfo.
  91842. replace('_START_', sStart).
  91843. replace('_END_', sEnd).
  91844. replace('_MAX_', sMax).
  91845. replace('_TOTAL_', sTotal)+
  91846. language.sInfoPostFix;
  91847. }
  91848. else
  91849. {
  91850. /* Record set after filtering */
  91851. sOut = language.sInfo.
  91852. replace('_START_', sStart).
  91853. replace('_END_', sEnd).
  91854. replace('_MAX_', sMax).
  91855. replace('_TOTAL_', sTotal) +' '+
  91856. language.sInfoFiltered.replace(
  91857. '_MAX_',
  91858. dt.fnFormatNumber(dt.fnRecordsTotal())
  91859. )+
  91860. language.sInfoPostFix;
  91861. }
  91862. var callback = language.fnInfoCallback;
  91863. if ( callback ) {
  91864. sOut = callback.call( dt.oInstance,
  91865. dt, iStart, iEnd, iMax, iTotal, sOut
  91866. );
  91867. }
  91868. var n = dt.aanFeatures.i;
  91869. if ( typeof n != 'undefined' )
  91870. {
  91871. for ( var i=0, iLen=n.length ; i<iLen ; i++ )
  91872. {
  91873. $(n[i]).html( sOut );
  91874. }
  91875. }
  91876. // DT doesn't actually (yet) trigger this event, but it will in future
  91877. $(dt.nTable).triggerHandler( 'info.dt' );
  91878. }
  91879. } );
  91880. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  91881. * Statics
  91882. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  91883. /**
  91884. * Scroller default settings for initialisation
  91885. * @namespace
  91886. * @name Scroller.defaults
  91887. * @static
  91888. */
  91889. Scroller.defaults = /** @lends Scroller.defaults */{
  91890. /**
  91891. * Indicate if Scroller show show trace information on the console or not. This can be
  91892. * useful when debugging Scroller or if just curious as to what it is doing, but should
  91893. * be turned off for production.
  91894. * @type bool
  91895. * @default false
  91896. * @static
  91897. * @example
  91898. * var oTable = $('#example').dataTable( {
  91899. * "sScrollY": "200px",
  91900. * "sDom": "frtiS",
  91901. * "bDeferRender": true,
  91902. * "oScroller": {
  91903. * "trace": true
  91904. * }
  91905. * } );
  91906. */
  91907. "trace": false,
  91908. /**
  91909. * Scroller will attempt to automatically calculate the height of rows for it's internal
  91910. * calculations. However the height that is used can be overridden using this parameter.
  91911. * @type int|string
  91912. * @default auto
  91913. * @static
  91914. * @example
  91915. * var oTable = $('#example').dataTable( {
  91916. * "sScrollY": "200px",
  91917. * "sDom": "frtiS",
  91918. * "bDeferRender": true,
  91919. * "oScroller": {
  91920. * "rowHeight": 30
  91921. * }
  91922. * } );
  91923. */
  91924. "rowHeight": "auto",
  91925. /**
  91926. * When using server-side processing, Scroller will wait a small amount of time to allow
  91927. * the scrolling to finish before requesting more data from the server. This prevents
  91928. * you from DoSing your own server! The wait time can be configured by this parameter.
  91929. * @type int
  91930. * @default 200
  91931. * @static
  91932. * @example
  91933. * var oTable = $('#example').dataTable( {
  91934. * "sScrollY": "200px",
  91935. * "sDom": "frtiS",
  91936. * "bDeferRender": true,
  91937. * "oScroller": {
  91938. * "serverWait": 100
  91939. * }
  91940. * } );
  91941. */
  91942. "serverWait": 200,
  91943. /**
  91944. * The display buffer is what Scroller uses to calculate how many rows it should pre-fetch
  91945. * for scrolling. Scroller automatically adjusts DataTables' display length to pre-fetch
  91946. * rows that will be shown in "near scrolling" (i.e. just beyond the current display area).
  91947. * The value is based upon the number of rows that can be displayed in the viewport (i.e.
  91948. * a value of 1), and will apply the display range to records before before and after the
  91949. * current viewport - i.e. a factor of 3 will allow Scroller to pre-fetch 1 viewport's worth
  91950. * of rows before the current viewport, the current viewport's rows and 1 viewport's worth
  91951. * of rows after the current viewport. Adjusting this value can be useful for ensuring
  91952. * smooth scrolling based on your data set.
  91953. * @type int
  91954. * @default 7
  91955. * @static
  91956. * @example
  91957. * var oTable = $('#example').dataTable( {
  91958. * "sScrollY": "200px",
  91959. * "sDom": "frtiS",
  91960. * "bDeferRender": true,
  91961. * "oScroller": {
  91962. * "displayBuffer": 10
  91963. * }
  91964. * } );
  91965. */
  91966. "displayBuffer": 9,
  91967. /**
  91968. * Scroller uses the boundary scaling factor to decide when to redraw the table - which it
  91969. * typically does before you reach the end of the currently loaded data set (in order to
  91970. * allow the data to look continuous to a user scrolling through the data). If given as 0
  91971. * then the table will be redrawn whenever the viewport is scrolled, while 1 would not
  91972. * redraw the table until the currently loaded data has all been shown. You will want
  91973. * something in the middle - the default factor of 0.5 is usually suitable.
  91974. * @type float
  91975. * @default 0.5
  91976. * @static
  91977. * @example
  91978. * var oTable = $('#example').dataTable( {
  91979. * "sScrollY": "200px",
  91980. * "sDom": "frtiS",
  91981. * "bDeferRender": true,
  91982. * "oScroller": {
  91983. * "boundaryScale": 0.75
  91984. * }
  91985. * } );
  91986. */
  91987. "boundaryScale": 0.5,
  91988. /**
  91989. * Show (or not) the loading element in the background of the table. Note that you should
  91990. * include the dataTables.scroller.css file for this to be displayed correctly.
  91991. * @type boolean
  91992. * @default false
  91993. * @static
  91994. * @example
  91995. * var oTable = $('#example').dataTable( {
  91996. * "sScrollY": "200px",
  91997. * "sDom": "frtiS",
  91998. * "bDeferRender": true,
  91999. * "oScroller": {
  92000. * "loadingIndicator": true
  92001. * }
  92002. * } );
  92003. */
  92004. "loadingIndicator": false
  92005. };
  92006. Scroller.oDefaults = Scroller.defaults;
  92007. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92008. * Constants
  92009. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  92010. /**
  92011. * Scroller version
  92012. * @type String
  92013. * @default See code
  92014. * @name Scroller.version
  92015. * @static
  92016. */
  92017. Scroller.version = "1.4.4";
  92018. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92019. * Initialisation
  92020. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  92021. // Legacy `dom` parameter initialisation support
  92022. if ( typeof $.fn.dataTable == "function" &&
  92023. typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
  92024. $.fn.dataTableExt.fnVersionCheck('1.10.0') )
  92025. {
  92026. $.fn.dataTableExt.aoFeatures.push( {
  92027. "fnInit": function( oDTSettings ) {
  92028. var init = oDTSettings.oInit;
  92029. var opts = init.scroller || init.oScroller || {};
  92030. new Scroller( oDTSettings, opts );
  92031. },
  92032. "cFeature": "S",
  92033. "sFeature": "Scroller"
  92034. } );
  92035. }
  92036. else
  92037. {
  92038. alert( "Warning: Scroller requires DataTables 1.10.0 or greater - www.datatables.net/download");
  92039. }
  92040. // Attach a listener to the document which listens for DataTables initialisation
  92041. // events so we can automatically initialise
  92042. $(document).on( 'preInit.dt.dtscroller', function (e, settings) {
  92043. if ( e.namespace !== 'dt' ) {
  92044. return;
  92045. }
  92046. var init = settings.oInit.scroller;
  92047. var defaults = DataTable.defaults.scroller;
  92048. if ( init || defaults ) {
  92049. var opts = $.extend( {}, init, defaults );
  92050. if ( init !== false ) {
  92051. new Scroller( settings, opts );
  92052. }
  92053. }
  92054. } );
  92055. // Attach Scroller to DataTables so it can be accessed as an 'extra'
  92056. $.fn.dataTable.Scroller = Scroller;
  92057. $.fn.DataTable.Scroller = Scroller;
  92058. // DataTables 1.10 API method aliases
  92059. var Api = $.fn.dataTable.Api;
  92060. Api.register( 'scroller()', function () {
  92061. return this;
  92062. } );
  92063. // Undocumented and deprecated - is it actually useful at all?
  92064. Api.register( 'scroller().rowToPixels()', function ( rowIdx, intParse, virtual ) {
  92065. var ctx = this.context;
  92066. if ( ctx.length && ctx[0].oScroller ) {
  92067. return ctx[0].oScroller.fnRowToPixels( rowIdx, intParse, virtual );
  92068. }
  92069. // undefined
  92070. } );
  92071. // Undocumented and deprecated - is it actually useful at all?
  92072. Api.register( 'scroller().pixelsToRow()', function ( pixels, intParse, virtual ) {
  92073. var ctx = this.context;
  92074. if ( ctx.length && ctx[0].oScroller ) {
  92075. return ctx[0].oScroller.fnPixelsToRow( pixels, intParse, virtual );
  92076. }
  92077. // undefined
  92078. } );
  92079. // Undocumented and deprecated - use `row().scrollTo()` instead
  92080. Api.register( 'scroller().scrollToRow()', function ( row, ani ) {
  92081. this.iterator( 'table', function ( ctx ) {
  92082. if ( ctx.oScroller ) {
  92083. ctx.oScroller.fnScrollToRow( row, ani );
  92084. }
  92085. } );
  92086. return this;
  92087. } );
  92088. Api.register( 'row().scrollTo()', function ( ani ) {
  92089. var that = this;
  92090. this.iterator( 'row', function ( ctx, rowIdx ) {
  92091. if ( ctx.oScroller ) {
  92092. var displayIdx = that
  92093. .rows( { order: 'applied', search: 'applied' } )
  92094. .indexes()
  92095. .indexOf( rowIdx );
  92096. ctx.oScroller.fnScrollToRow( displayIdx, ani );
  92097. }
  92098. } );
  92099. return this;
  92100. } );
  92101. Api.register( 'scroller.measure()', function ( redraw ) {
  92102. this.iterator( 'table', function ( ctx ) {
  92103. if ( ctx.oScroller ) {
  92104. ctx.oScroller.fnMeasure( redraw );
  92105. }
  92106. } );
  92107. return this;
  92108. } );
  92109. Api.register( 'scroller.page()', function() {
  92110. var ctx = this.context;
  92111. if ( ctx.length && ctx[0].oScroller ) {
  92112. return ctx[0].oScroller.fnPageInfo();
  92113. }
  92114. // undefined
  92115. } );
  92116. return Scroller;
  92117. }));
  92118. /*! Select for DataTables 1.2.5
  92119. * 2015-2018 SpryMedia Ltd - datatables.net/license/mit
  92120. */
  92121. /**
  92122. * @summary Select for DataTables
  92123. * @description A collection of API methods, events and buttons for DataTables
  92124. * that provides selection options of the items in a DataTable
  92125. * @version 1.2.5
  92126. * @file dataTables.select.js
  92127. * @author SpryMedia Ltd (www.sprymedia.co.uk)
  92128. * @contact datatables.net/forums
  92129. * @copyright Copyright 2015-2018 SpryMedia Ltd.
  92130. *
  92131. * This source file is free software, available under the following license:
  92132. * MIT license - http://datatables.net/license/mit
  92133. *
  92134. * This source file is distributed in the hope that it will be useful, but
  92135. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  92136. * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
  92137. *
  92138. * For details please refer to: http://www.datatables.net/extensions/select
  92139. */
  92140. (function( factory ){
  92141. if ( typeof define === 'function' && define.amd ) {
  92142. // AMD
  92143. define( ['jquery', 'datatables.net'], function ( $ ) {
  92144. return factory( $, window, document );
  92145. } );
  92146. }
  92147. else if ( typeof exports === 'object' ) {
  92148. // CommonJS
  92149. module.exports = function (root, $) {
  92150. if ( ! root ) {
  92151. root = window;
  92152. }
  92153. if ( ! $ || ! $.fn.dataTable ) {
  92154. $ = require('datatables.net')(root, $).$;
  92155. }
  92156. return factory( $, root, root.document );
  92157. };
  92158. }
  92159. else {
  92160. // Browser
  92161. factory( jQuery, window, document );
  92162. }
  92163. }(function( $, window, document, undefined ) {
  92164. 'use strict';
  92165. var DataTable = $.fn.dataTable;
  92166. // Version information for debugger
  92167. DataTable.select = {};
  92168. DataTable.select.version = '1.2.5';
  92169. DataTable.select.init = function ( dt ) {
  92170. var ctx = dt.settings()[0];
  92171. var init = ctx.oInit.select;
  92172. var defaults = DataTable.defaults.select;
  92173. var opts = init === undefined ?
  92174. defaults :
  92175. init;
  92176. // Set defaults
  92177. var items = 'row';
  92178. var style = 'api';
  92179. var blurable = false;
  92180. var info = true;
  92181. var selector = 'td, th';
  92182. var className = 'selected';
  92183. var setStyle = false;
  92184. ctx._select = {};
  92185. // Initialisation customisations
  92186. if ( opts === true ) {
  92187. style = 'os';
  92188. setStyle = true;
  92189. }
  92190. else if ( typeof opts === 'string' ) {
  92191. style = opts;
  92192. setStyle = true;
  92193. }
  92194. else if ( $.isPlainObject( opts ) ) {
  92195. if ( opts.blurable !== undefined ) {
  92196. blurable = opts.blurable;
  92197. }
  92198. if ( opts.info !== undefined ) {
  92199. info = opts.info;
  92200. }
  92201. if ( opts.items !== undefined ) {
  92202. items = opts.items;
  92203. }
  92204. if ( opts.style !== undefined ) {
  92205. style = opts.style;
  92206. setStyle = true;
  92207. }
  92208. if ( opts.selector !== undefined ) {
  92209. selector = opts.selector;
  92210. }
  92211. if ( opts.className !== undefined ) {
  92212. className = opts.className;
  92213. }
  92214. }
  92215. dt.select.selector( selector );
  92216. dt.select.items( items );
  92217. dt.select.style( style );
  92218. dt.select.blurable( blurable );
  92219. dt.select.info( info );
  92220. ctx._select.className = className;
  92221. // Sort table based on selected rows. Requires Select Datatables extension
  92222. $.fn.dataTable.ext.order['select-checkbox'] = function ( settings, col ) {
  92223. return this.api().column( col, {order: 'index'} ).nodes().map( function ( td ) {
  92224. if ( settings._select.items === 'row' ) {
  92225. return $( td ).parent().hasClass( settings._select.className );
  92226. } else if ( settings._select.items === 'cell' ) {
  92227. return $( td ).hasClass( settings._select.className );
  92228. }
  92229. return false;
  92230. });
  92231. };
  92232. // If the init options haven't enabled select, but there is a selectable
  92233. // class name, then enable
  92234. if ( ! setStyle && $( dt.table().node() ).hasClass( 'selectable' ) ) {
  92235. dt.select.style( 'os' );
  92236. }
  92237. };
  92238. /*
  92239. Select is a collection of API methods, event handlers, event emitters and
  92240. buttons (for the `Buttons` extension) for DataTables. It provides the following
  92241. features, with an overview of how they are implemented:
  92242. ## Selection of rows, columns and cells. Whether an item is selected or not is
  92243. stored in:
  92244. * rows: a `_select_selected` property which contains a boolean value of the
  92245. DataTables' `aoData` object for each row
  92246. * columns: a `_select_selected` property which contains a boolean value of the
  92247. DataTables' `aoColumns` object for each column
  92248. * cells: a `_selected_cells` property which contains an array of boolean values
  92249. of the `aoData` object for each row. The array is the same length as the
  92250. columns array, with each element of it representing a cell.
  92251. This method of using boolean flags allows Select to operate when nodes have not
  92252. been created for rows / cells (DataTables' defer rendering feature).
  92253. ## API methods
  92254. A range of API methods are available for triggering selection and de-selection
  92255. of rows. Methods are also available to configure the selection events that can
  92256. be triggered by an end user (such as which items are to be selected). To a large
  92257. extent, these of API methods *is* Select. It is basically a collection of helper
  92258. functions that can be used to select items in a DataTable.
  92259. Configuration of select is held in the object `_select` which is attached to the
  92260. DataTables settings object on initialisation. Select being available on a table
  92261. is not optional when Select is loaded, but its default is for selection only to
  92262. be available via the API - so the end user wouldn't be able to select rows
  92263. without additional configuration.
  92264. The `_select` object contains the following properties:
  92265. ```
  92266. {
  92267. items:string - Can be `rows`, `columns` or `cells`. Defines what item
  92268. will be selected if the user is allowed to activate row
  92269. selection using the mouse.
  92270. style:string - Can be `none`, `single`, `multi` or `os`. Defines the
  92271. interaction style when selecting items
  92272. blurable:boolean - If row selection can be cleared by clicking outside of
  92273. the table
  92274. info:boolean - If the selection summary should be shown in the table
  92275. information elements
  92276. }
  92277. ```
  92278. In addition to the API methods, Select also extends the DataTables selector
  92279. options for rows, columns and cells adding a `selected` option to the selector
  92280. options object, allowing the developer to select only selected items or
  92281. unselected items.
  92282. ## Mouse selection of items
  92283. Clicking on items can be used to select items. This is done by a simple event
  92284. handler that will select the items using the API methods.
  92285. */
  92286. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92287. * Local functions
  92288. */
  92289. /**
  92290. * Add one or more cells to the selection when shift clicking in OS selection
  92291. * style cell selection.
  92292. *
  92293. * Cell range is more complicated than row and column as we want to select
  92294. * in the visible grid rather than by index in sequence. For example, if you
  92295. * click first in cell 1-1 and then shift click in 2-2 - cells 1-2 and 2-1
  92296. * should also be selected (and not 1-3, 1-4. etc)
  92297. *
  92298. * @param {DataTable.Api} dt DataTable
  92299. * @param {object} idx Cell index to select to
  92300. * @param {object} last Cell index to select from
  92301. * @private
  92302. */
  92303. function cellRange( dt, idx, last )
  92304. {
  92305. var indexes;
  92306. var columnIndexes;
  92307. var rowIndexes;
  92308. var selectColumns = function ( start, end ) {
  92309. if ( start > end ) {
  92310. var tmp = end;
  92311. end = start;
  92312. start = tmp;
  92313. }
  92314. var record = false;
  92315. return dt.columns( ':visible' ).indexes().filter( function (i) {
  92316. if ( i === start ) {
  92317. record = true;
  92318. }
  92319. if ( i === end ) { // not else if, as start might === end
  92320. record = false;
  92321. return true;
  92322. }
  92323. return record;
  92324. } );
  92325. };
  92326. var selectRows = function ( start, end ) {
  92327. var indexes = dt.rows( { search: 'applied' } ).indexes();
  92328. // Which comes first - might need to swap
  92329. if ( indexes.indexOf( start ) > indexes.indexOf( end ) ) {
  92330. var tmp = end;
  92331. end = start;
  92332. start = tmp;
  92333. }
  92334. var record = false;
  92335. return indexes.filter( function (i) {
  92336. if ( i === start ) {
  92337. record = true;
  92338. }
  92339. if ( i === end ) {
  92340. record = false;
  92341. return true;
  92342. }
  92343. return record;
  92344. } );
  92345. };
  92346. if ( ! dt.cells( { selected: true } ).any() && ! last ) {
  92347. // select from the top left cell to this one
  92348. columnIndexes = selectColumns( 0, idx.column );
  92349. rowIndexes = selectRows( 0 , idx.row );
  92350. }
  92351. else {
  92352. // Get column indexes between old and new
  92353. columnIndexes = selectColumns( last.column, idx.column );
  92354. rowIndexes = selectRows( last.row , idx.row );
  92355. }
  92356. indexes = dt.cells( rowIndexes, columnIndexes ).flatten();
  92357. if ( ! dt.cells( idx, { selected: true } ).any() ) {
  92358. // Select range
  92359. dt.cells( indexes ).select();
  92360. }
  92361. else {
  92362. // Deselect range
  92363. dt.cells( indexes ).deselect();
  92364. }
  92365. }
  92366. /**
  92367. * Disable mouse selection by removing the selectors
  92368. *
  92369. * @param {DataTable.Api} dt DataTable to remove events from
  92370. * @private
  92371. */
  92372. function disableMouseSelection( dt )
  92373. {
  92374. var ctx = dt.settings()[0];
  92375. var selector = ctx._select.selector;
  92376. $( dt.table().container() )
  92377. .off( 'mousedown.dtSelect', selector )
  92378. .off( 'mouseup.dtSelect', selector )
  92379. .off( 'click.dtSelect', selector );
  92380. $('body').off( 'click.dtSelect' + dt.table().node().id );
  92381. }
  92382. /**
  92383. * Attach mouse listeners to the table to allow mouse selection of items
  92384. *
  92385. * @param {DataTable.Api} dt DataTable to remove events from
  92386. * @private
  92387. */
  92388. function enableMouseSelection ( dt )
  92389. {
  92390. var container = $( dt.table().container() );
  92391. var ctx = dt.settings()[0];
  92392. var selector = ctx._select.selector;
  92393. container
  92394. .on( 'mousedown.dtSelect', selector, function(e) {
  92395. // Disallow text selection for shift clicking on the table so multi
  92396. // element selection doesn't look terrible!
  92397. if ( e.shiftKey || e.metaKey || e.ctrlKey ) {
  92398. container
  92399. .css( '-moz-user-select', 'none' )
  92400. .one('selectstart.dtSelect', selector, function () {
  92401. return false;
  92402. } );
  92403. }
  92404. } )
  92405. .on( 'mouseup.dtSelect', selector, function() {
  92406. // Allow text selection to occur again, Mozilla style (tested in FF
  92407. // 35.0.1 - still required)
  92408. container.css( '-moz-user-select', '' );
  92409. } )
  92410. .on( 'click.dtSelect', selector, function ( e ) {
  92411. var items = dt.select.items();
  92412. var idx;
  92413. // If text was selected (click and drag), then we shouldn't change
  92414. // the row's selected state
  92415. if ( window.getSelection ) {
  92416. var selection = window.getSelection();
  92417. // If the element that contains the selection is not in the table, we can ignore it
  92418. // This can happen if the developer selects text from the click event
  92419. if ( ! selection.anchorNode || $(selection.anchorNode).closest('table')[0] === dt.table().node() ) {
  92420. if ( $.trim(selection.toString()) !== '' ) {
  92421. return;
  92422. }
  92423. }
  92424. }
  92425. var ctx = dt.settings()[0];
  92426. // Ignore clicks inside a sub-table
  92427. if ( $(e.target).closest('div.dataTables_wrapper')[0] != dt.table().container() ) {
  92428. return;
  92429. }
  92430. var cell = dt.cell( $(e.target).closest('td, th') );
  92431. // Check the cell actually belongs to the host DataTable (so child
  92432. // rows, etc, are ignored)
  92433. if ( ! cell.any() ) {
  92434. return;
  92435. }
  92436. var event = $.Event('user-select.dt');
  92437. eventTrigger( dt, event, [ items, cell, e ] );
  92438. if ( event.isDefaultPrevented() ) {
  92439. return;
  92440. }
  92441. var cellIndex = cell.index();
  92442. if ( items === 'row' ) {
  92443. idx = cellIndex.row;
  92444. typeSelect( e, dt, ctx, 'row', idx );
  92445. }
  92446. else if ( items === 'column' ) {
  92447. idx = cell.index().column;
  92448. typeSelect( e, dt, ctx, 'column', idx );
  92449. }
  92450. else if ( items === 'cell' ) {
  92451. idx = cell.index();
  92452. typeSelect( e, dt, ctx, 'cell', idx );
  92453. }
  92454. ctx._select_lastCell = cellIndex;
  92455. } );
  92456. // Blurable
  92457. $('body').on( 'click.dtSelect' + dt.table().node().id, function ( e ) {
  92458. if ( ctx._select.blurable ) {
  92459. // If the click was inside the DataTables container, don't blur
  92460. if ( $(e.target).parents().filter( dt.table().container() ).length ) {
  92461. return;
  92462. }
  92463. // Ignore elements which have been removed from the DOM (i.e. paging
  92464. // buttons)
  92465. if ( $(e.target).parents('html').length === 0 ) {
  92466. return;
  92467. }
  92468. // Don't blur in Editor form
  92469. if ( $(e.target).parents('div.DTE').length ) {
  92470. return;
  92471. }
  92472. clear( ctx, true );
  92473. }
  92474. } );
  92475. }
  92476. /**
  92477. * Trigger an event on a DataTable
  92478. *
  92479. * @param {DataTable.Api} api DataTable to trigger events on
  92480. * @param {boolean} selected true if selected, false if deselected
  92481. * @param {string} type Item type acting on
  92482. * @param {boolean} any Require that there are values before
  92483. * triggering
  92484. * @private
  92485. */
  92486. function eventTrigger ( api, type, args, any )
  92487. {
  92488. if ( any && ! api.flatten().length ) {
  92489. return;
  92490. }
  92491. if ( typeof type === 'string' ) {
  92492. type = type +'.dt';
  92493. }
  92494. args.unshift( api );
  92495. $(api.table().node()).trigger( type, args );
  92496. }
  92497. /**
  92498. * Update the information element of the DataTable showing information about the
  92499. * items selected. This is done by adding tags to the existing text
  92500. *
  92501. * @param {DataTable.Api} api DataTable to update
  92502. * @private
  92503. */
  92504. function info ( api )
  92505. {
  92506. var ctx = api.settings()[0];
  92507. if ( ! ctx._select.info || ! ctx.aanFeatures.i ) {
  92508. return;
  92509. }
  92510. if ( api.select.style() === 'api' ) {
  92511. return;
  92512. }
  92513. var rows = api.rows( { selected: true } ).flatten().length;
  92514. var columns = api.columns( { selected: true } ).flatten().length;
  92515. var cells = api.cells( { selected: true } ).flatten().length;
  92516. var add = function ( el, name, num ) {
  92517. el.append( $('<span class="select-item"/>').append( api.i18n(
  92518. 'select.'+name+'s',
  92519. { _: '%d '+name+'s selected', 0: '', 1: '1 '+name+' selected' },
  92520. num
  92521. ) ) );
  92522. };
  92523. // Internal knowledge of DataTables to loop over all information elements
  92524. $.each( ctx.aanFeatures.i, function ( i, el ) {
  92525. el = $(el);
  92526. var output = $('<span class="select-info"/>');
  92527. add( output, 'row', rows );
  92528. add( output, 'column', columns );
  92529. add( output, 'cell', cells );
  92530. var exisiting = el.children('span.select-info');
  92531. if ( exisiting.length ) {
  92532. exisiting.remove();
  92533. }
  92534. if ( output.text() !== '' ) {
  92535. el.append( output );
  92536. }
  92537. } );
  92538. }
  92539. /**
  92540. * Initialisation of a new table. Attach event handlers and callbacks to allow
  92541. * Select to operate correctly.
  92542. *
  92543. * This will occur _after_ the initial DataTables initialisation, although
  92544. * before Ajax data is rendered, if there is ajax data
  92545. *
  92546. * @param {DataTable.settings} ctx Settings object to operate on
  92547. * @private
  92548. */
  92549. function init ( ctx ) {
  92550. var api = new DataTable.Api( ctx );
  92551. // Row callback so that classes can be added to rows and cells if the item
  92552. // was selected before the element was created. This will happen with the
  92553. // `deferRender` option enabled.
  92554. //
  92555. // This method of attaching to `aoRowCreatedCallback` is a hack until
  92556. // DataTables has proper events for row manipulation If you are reviewing
  92557. // this code to create your own plug-ins, please do not do this!
  92558. ctx.aoRowCreatedCallback.push( {
  92559. fn: function ( row, data, index ) {
  92560. var i, ien;
  92561. var d = ctx.aoData[ index ];
  92562. // Row
  92563. if ( d._select_selected ) {
  92564. $( row ).addClass( ctx._select.className );
  92565. }
  92566. // Cells and columns - if separated out, we would need to do two
  92567. // loops, so it makes sense to combine them into a single one
  92568. for ( i=0, ien=ctx.aoColumns.length ; i<ien ; i++ ) {
  92569. if ( ctx.aoColumns[i]._select_selected || (d._selected_cells && d._selected_cells[i]) ) {
  92570. $(d.anCells[i]).addClass( ctx._select.className );
  92571. }
  92572. }
  92573. },
  92574. sName: 'select-deferRender'
  92575. } );
  92576. // On Ajax reload we want to reselect all rows which are currently selected,
  92577. // if there is an rowId (i.e. a unique value to identify each row with)
  92578. api.on( 'preXhr.dt.dtSelect', function () {
  92579. // note that column selection doesn't need to be cached and then
  92580. // reselected, as they are already selected
  92581. var rows = api.rows( { selected: true } ).ids( true ).filter( function ( d ) {
  92582. return d !== undefined;
  92583. } );
  92584. var cells = api.cells( { selected: true } ).eq(0).map( function ( cellIdx ) {
  92585. var id = api.row( cellIdx.row ).id( true );
  92586. return id ?
  92587. { row: id, column: cellIdx.column } :
  92588. undefined;
  92589. } ).filter( function ( d ) {
  92590. return d !== undefined;
  92591. } );
  92592. // On the next draw, reselect the currently selected items
  92593. api.one( 'draw.dt.dtSelect', function () {
  92594. api.rows( rows ).select();
  92595. // `cells` is not a cell index selector, so it needs a loop
  92596. if ( cells.any() ) {
  92597. cells.each( function ( id ) {
  92598. api.cells( id.row, id.column ).select();
  92599. } );
  92600. }
  92601. } );
  92602. } );
  92603. // Update the table information element with selected item summary
  92604. api.on( 'draw.dtSelect.dt select.dtSelect.dt deselect.dtSelect.dt info.dt', function () {
  92605. info( api );
  92606. } );
  92607. // Clean up and release
  92608. api.on( 'destroy.dtSelect', function () {
  92609. disableMouseSelection( api );
  92610. api.off( '.dtSelect' );
  92611. } );
  92612. }
  92613. /**
  92614. * Add one or more items (rows or columns) to the selection when shift clicking
  92615. * in OS selection style
  92616. *
  92617. * @param {DataTable.Api} dt DataTable
  92618. * @param {string} type Row or column range selector
  92619. * @param {object} idx Item index to select to
  92620. * @param {object} last Item index to select from
  92621. * @private
  92622. */
  92623. function rowColumnRange( dt, type, idx, last )
  92624. {
  92625. // Add a range of rows from the last selected row to this one
  92626. var indexes = dt[type+'s']( { search: 'applied' } ).indexes();
  92627. var idx1 = $.inArray( last, indexes );
  92628. var idx2 = $.inArray( idx, indexes );
  92629. if ( ! dt[type+'s']( { selected: true } ).any() && idx1 === -1 ) {
  92630. // select from top to here - slightly odd, but both Windows and Mac OS
  92631. // do this
  92632. indexes.splice( $.inArray( idx, indexes )+1, indexes.length );
  92633. }
  92634. else {
  92635. // reverse so we can shift click 'up' as well as down
  92636. if ( idx1 > idx2 ) {
  92637. var tmp = idx2;
  92638. idx2 = idx1;
  92639. idx1 = tmp;
  92640. }
  92641. indexes.splice( idx2+1, indexes.length );
  92642. indexes.splice( 0, idx1 );
  92643. }
  92644. if ( ! dt[type]( idx, { selected: true } ).any() ) {
  92645. // Select range
  92646. dt[type+'s']( indexes ).select();
  92647. }
  92648. else {
  92649. // Deselect range - need to keep the clicked on row selected
  92650. indexes.splice( $.inArray( idx, indexes ), 1 );
  92651. dt[type+'s']( indexes ).deselect();
  92652. }
  92653. }
  92654. /**
  92655. * Clear all selected items
  92656. *
  92657. * @param {DataTable.settings} ctx Settings object of the host DataTable
  92658. * @param {boolean} [force=false] Force the de-selection to happen, regardless
  92659. * of selection style
  92660. * @private
  92661. */
  92662. function clear( ctx, force )
  92663. {
  92664. if ( force || ctx._select.style === 'single' ) {
  92665. var api = new DataTable.Api( ctx );
  92666. api.rows( { selected: true } ).deselect();
  92667. api.columns( { selected: true } ).deselect();
  92668. api.cells( { selected: true } ).deselect();
  92669. }
  92670. }
  92671. /**
  92672. * Select items based on the current configuration for style and items.
  92673. *
  92674. * @param {object} e Mouse event object
  92675. * @param {DataTables.Api} dt DataTable
  92676. * @param {DataTable.settings} ctx Settings object of the host DataTable
  92677. * @param {string} type Items to select
  92678. * @param {int|object} idx Index of the item to select
  92679. * @private
  92680. */
  92681. function typeSelect ( e, dt, ctx, type, idx )
  92682. {
  92683. var style = dt.select.style();
  92684. var isSelected = dt[type]( idx, { selected: true } ).any();
  92685. if ( style === 'os' ) {
  92686. if ( e.ctrlKey || e.metaKey ) {
  92687. // Add or remove from the selection
  92688. dt[type]( idx ).select( ! isSelected );
  92689. }
  92690. else if ( e.shiftKey ) {
  92691. if ( type === 'cell' ) {
  92692. cellRange( dt, idx, ctx._select_lastCell || null );
  92693. }
  92694. else {
  92695. rowColumnRange( dt, type, idx, ctx._select_lastCell ?
  92696. ctx._select_lastCell[type] :
  92697. null
  92698. );
  92699. }
  92700. }
  92701. else {
  92702. // No cmd or shift click - deselect if selected, or select
  92703. // this row only
  92704. var selected = dt[type+'s']( { selected: true } );
  92705. if ( isSelected && selected.flatten().length === 1 ) {
  92706. dt[type]( idx ).deselect();
  92707. }
  92708. else {
  92709. selected.deselect();
  92710. dt[type]( idx ).select();
  92711. }
  92712. }
  92713. } else if ( style == 'multi+shift' ) {
  92714. if ( e.shiftKey ) {
  92715. if ( type === 'cell' ) {
  92716. cellRange( dt, idx, ctx._select_lastCell || null );
  92717. }
  92718. else {
  92719. rowColumnRange( dt, type, idx, ctx._select_lastCell ?
  92720. ctx._select_lastCell[type] :
  92721. null
  92722. );
  92723. }
  92724. }
  92725. else {
  92726. dt[ type ]( idx ).select( ! isSelected );
  92727. }
  92728. }
  92729. else {
  92730. dt[ type ]( idx ).select( ! isSelected );
  92731. }
  92732. }
  92733. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92734. * DataTables selectors
  92735. */
  92736. // row and column are basically identical just assigned to different properties
  92737. // and checking a different array, so we can dynamically create the functions to
  92738. // reduce the code size
  92739. $.each( [
  92740. { type: 'row', prop: 'aoData' },
  92741. { type: 'column', prop: 'aoColumns' }
  92742. ], function ( i, o ) {
  92743. DataTable.ext.selector[ o.type ].push( function ( settings, opts, indexes ) {
  92744. var selected = opts.selected;
  92745. var data;
  92746. var out = [];
  92747. if ( selected !== true && selected !== false ) {
  92748. return indexes;
  92749. }
  92750. for ( var i=0, ien=indexes.length ; i<ien ; i++ ) {
  92751. data = settings[ o.prop ][ indexes[i] ];
  92752. if ( (selected === true && data._select_selected === true) ||
  92753. (selected === false && ! data._select_selected )
  92754. ) {
  92755. out.push( indexes[i] );
  92756. }
  92757. }
  92758. return out;
  92759. } );
  92760. } );
  92761. DataTable.ext.selector.cell.push( function ( settings, opts, cells ) {
  92762. var selected = opts.selected;
  92763. var rowData;
  92764. var out = [];
  92765. if ( selected === undefined ) {
  92766. return cells;
  92767. }
  92768. for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
  92769. rowData = settings.aoData[ cells[i].row ];
  92770. if ( (selected === true && rowData._selected_cells && rowData._selected_cells[ cells[i].column ] === true) ||
  92771. (selected === false && ( ! rowData._selected_cells || ! rowData._selected_cells[ cells[i].column ] ) )
  92772. ) {
  92773. out.push( cells[i] );
  92774. }
  92775. }
  92776. return out;
  92777. } );
  92778. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92779. * DataTables API
  92780. *
  92781. * For complete documentation, please refer to the docs/api directory or the
  92782. * DataTables site
  92783. */
  92784. // Local variables to improve compression
  92785. var apiRegister = DataTable.Api.register;
  92786. var apiRegisterPlural = DataTable.Api.registerPlural;
  92787. apiRegister( 'select()', function () {
  92788. return this.iterator( 'table', function ( ctx ) {
  92789. DataTable.select.init( new DataTable.Api( ctx ) );
  92790. } );
  92791. } );
  92792. apiRegister( 'select.blurable()', function ( flag ) {
  92793. if ( flag === undefined ) {
  92794. return this.context[0]._select.blurable;
  92795. }
  92796. return this.iterator( 'table', function ( ctx ) {
  92797. ctx._select.blurable = flag;
  92798. } );
  92799. } );
  92800. apiRegister( 'select.info()', function ( flag ) {
  92801. if ( info === undefined ) {
  92802. return this.context[0]._select.info;
  92803. }
  92804. return this.iterator( 'table', function ( ctx ) {
  92805. ctx._select.info = flag;
  92806. } );
  92807. } );
  92808. apiRegister( 'select.items()', function ( items ) {
  92809. if ( items === undefined ) {
  92810. return this.context[0]._select.items;
  92811. }
  92812. return this.iterator( 'table', function ( ctx ) {
  92813. ctx._select.items = items;
  92814. eventTrigger( new DataTable.Api( ctx ), 'selectItems', [ items ] );
  92815. } );
  92816. } );
  92817. // Takes effect from the _next_ selection. None disables future selection, but
  92818. // does not clear the current selection. Use the `deselect` methods for that
  92819. apiRegister( 'select.style()', function ( style ) {
  92820. if ( style === undefined ) {
  92821. return this.context[0]._select.style;
  92822. }
  92823. return this.iterator( 'table', function ( ctx ) {
  92824. ctx._select.style = style;
  92825. if ( ! ctx._select_init ) {
  92826. init( ctx );
  92827. }
  92828. // Add / remove mouse event handlers. They aren't required when only
  92829. // API selection is available
  92830. var dt = new DataTable.Api( ctx );
  92831. disableMouseSelection( dt );
  92832. if ( style !== 'api' ) {
  92833. enableMouseSelection( dt );
  92834. }
  92835. eventTrigger( new DataTable.Api( ctx ), 'selectStyle', [ style ] );
  92836. } );
  92837. } );
  92838. apiRegister( 'select.selector()', function ( selector ) {
  92839. if ( selector === undefined ) {
  92840. return this.context[0]._select.selector;
  92841. }
  92842. return this.iterator( 'table', function ( ctx ) {
  92843. disableMouseSelection( new DataTable.Api( ctx ) );
  92844. ctx._select.selector = selector;
  92845. if ( ctx._select.style !== 'api' ) {
  92846. enableMouseSelection( new DataTable.Api( ctx ) );
  92847. }
  92848. } );
  92849. } );
  92850. apiRegisterPlural( 'rows().select()', 'row().select()', function ( select ) {
  92851. var api = this;
  92852. if ( select === false ) {
  92853. return this.deselect();
  92854. }
  92855. this.iterator( 'row', function ( ctx, idx ) {
  92856. clear( ctx );
  92857. ctx.aoData[ idx ]._select_selected = true;
  92858. $( ctx.aoData[ idx ].nTr ).addClass( ctx._select.className );
  92859. } );
  92860. this.iterator( 'table', function ( ctx, i ) {
  92861. eventTrigger( api, 'select', [ 'row', api[i] ], true );
  92862. } );
  92863. return this;
  92864. } );
  92865. apiRegisterPlural( 'columns().select()', 'column().select()', function ( select ) {
  92866. var api = this;
  92867. if ( select === false ) {
  92868. return this.deselect();
  92869. }
  92870. this.iterator( 'column', function ( ctx, idx ) {
  92871. clear( ctx );
  92872. ctx.aoColumns[ idx ]._select_selected = true;
  92873. var column = new DataTable.Api( ctx ).column( idx );
  92874. $( column.header() ).addClass( ctx._select.className );
  92875. $( column.footer() ).addClass( ctx._select.className );
  92876. column.nodes().to$().addClass( ctx._select.className );
  92877. } );
  92878. this.iterator( 'table', function ( ctx, i ) {
  92879. eventTrigger( api, 'select', [ 'column', api[i] ], true );
  92880. } );
  92881. return this;
  92882. } );
  92883. apiRegisterPlural( 'cells().select()', 'cell().select()', function ( select ) {
  92884. var api = this;
  92885. if ( select === false ) {
  92886. return this.deselect();
  92887. }
  92888. this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) {
  92889. clear( ctx );
  92890. var data = ctx.aoData[ rowIdx ];
  92891. if ( data._selected_cells === undefined ) {
  92892. data._selected_cells = [];
  92893. }
  92894. data._selected_cells[ colIdx ] = true;
  92895. if ( data.anCells ) {
  92896. $( data.anCells[ colIdx ] ).addClass( ctx._select.className );
  92897. }
  92898. } );
  92899. this.iterator( 'table', function ( ctx, i ) {
  92900. eventTrigger( api, 'select', [ 'cell', api[i] ], true );
  92901. } );
  92902. return this;
  92903. } );
  92904. apiRegisterPlural( 'rows().deselect()', 'row().deselect()', function () {
  92905. var api = this;
  92906. this.iterator( 'row', function ( ctx, idx ) {
  92907. ctx.aoData[ idx ]._select_selected = false;
  92908. $( ctx.aoData[ idx ].nTr ).removeClass( ctx._select.className );
  92909. } );
  92910. this.iterator( 'table', function ( ctx, i ) {
  92911. eventTrigger( api, 'deselect', [ 'row', api[i] ], true );
  92912. } );
  92913. return this;
  92914. } );
  92915. apiRegisterPlural( 'columns().deselect()', 'column().deselect()', function () {
  92916. var api = this;
  92917. this.iterator( 'column', function ( ctx, idx ) {
  92918. ctx.aoColumns[ idx ]._select_selected = false;
  92919. var api = new DataTable.Api( ctx );
  92920. var column = api.column( idx );
  92921. $( column.header() ).removeClass( ctx._select.className );
  92922. $( column.footer() ).removeClass( ctx._select.className );
  92923. // Need to loop over each cell, rather than just using
  92924. // `column().nodes()` as cells which are individually selected should
  92925. // not have the `selected` class removed from them
  92926. api.cells( null, idx ).indexes().each( function (cellIdx) {
  92927. var data = ctx.aoData[ cellIdx.row ];
  92928. var cellSelected = data._selected_cells;
  92929. if ( data.anCells && (! cellSelected || ! cellSelected[ cellIdx.column ]) ) {
  92930. $( data.anCells[ cellIdx.column ] ).removeClass( ctx._select.className );
  92931. }
  92932. } );
  92933. } );
  92934. this.iterator( 'table', function ( ctx, i ) {
  92935. eventTrigger( api, 'deselect', [ 'column', api[i] ], true );
  92936. } );
  92937. return this;
  92938. } );
  92939. apiRegisterPlural( 'cells().deselect()', 'cell().deselect()', function () {
  92940. var api = this;
  92941. this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) {
  92942. var data = ctx.aoData[ rowIdx ];
  92943. data._selected_cells[ colIdx ] = false;
  92944. // Remove class only if the cells exist, and the cell is not column
  92945. // selected, in which case the class should remain (since it is selected
  92946. // in the column)
  92947. if ( data.anCells && ! ctx.aoColumns[ colIdx ]._select_selected ) {
  92948. $( data.anCells[ colIdx ] ).removeClass( ctx._select.className );
  92949. }
  92950. } );
  92951. this.iterator( 'table', function ( ctx, i ) {
  92952. eventTrigger( api, 'deselect', [ 'cell', api[i] ], true );
  92953. } );
  92954. return this;
  92955. } );
  92956. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  92957. * Buttons
  92958. */
  92959. function i18n( label, def ) {
  92960. return function (dt) {
  92961. return dt.i18n( 'buttons.'+label, def );
  92962. };
  92963. }
  92964. // Common events with suitable namespaces
  92965. function namespacedEvents ( config ) {
  92966. var unique = config._eventNamespace;
  92967. return 'draw.dt.DT'+unique+' select.dt.DT'+unique+' deselect.dt.DT'+unique;
  92968. }
  92969. function enabled ( dt, config ) {
  92970. if ( $.inArray( 'rows', config.limitTo ) !== -1 && dt.rows( { selected: true } ).any() ) {
  92971. return true;
  92972. }
  92973. if ( $.inArray( 'columns', config.limitTo ) !== -1 && dt.columns( { selected: true } ).any() ) {
  92974. return true;
  92975. }
  92976. if ( $.inArray( 'cells', config.limitTo ) !== -1 && dt.cells( { selected: true } ).any() ) {
  92977. return true;
  92978. }
  92979. return false;
  92980. }
  92981. var _buttonNamespace = 0;
  92982. $.extend( DataTable.ext.buttons, {
  92983. selected: {
  92984. text: i18n( 'selected', 'Selected' ),
  92985. className: 'buttons-selected',
  92986. limitTo: [ 'rows', 'columns', 'cells' ],
  92987. init: function ( dt, node, config ) {
  92988. var that = this;
  92989. config._eventNamespace = '.select'+(_buttonNamespace++);
  92990. // .DT namespace listeners are removed by DataTables automatically
  92991. // on table destroy
  92992. dt.on( namespacedEvents(config), function () {
  92993. that.enable( enabled(dt, config) );
  92994. } );
  92995. this.disable();
  92996. },
  92997. destroy: function ( dt, node, config ) {
  92998. dt.off( config._eventNamespace );
  92999. }
  93000. },
  93001. selectedSingle: {
  93002. text: i18n( 'selectedSingle', 'Selected single' ),
  93003. className: 'buttons-selected-single',
  93004. init: function ( dt, node, config ) {
  93005. var that = this;
  93006. config._eventNamespace = '.select'+(_buttonNamespace++);
  93007. dt.on( namespacedEvents(config), function () {
  93008. var count = dt.rows( { selected: true } ).flatten().length +
  93009. dt.columns( { selected: true } ).flatten().length +
  93010. dt.cells( { selected: true } ).flatten().length;
  93011. that.enable( count === 1 );
  93012. } );
  93013. this.disable();
  93014. },
  93015. destroy: function ( dt, node, config ) {
  93016. dt.off( config._eventNamespace );
  93017. }
  93018. },
  93019. selectAll: {
  93020. text: i18n( 'selectAll', 'Select all' ),
  93021. className: 'buttons-select-all',
  93022. action: function () {
  93023. var items = this.select.items();
  93024. this[ items+'s' ]().select();
  93025. }
  93026. },
  93027. selectNone: {
  93028. text: i18n( 'selectNone', 'Deselect all' ),
  93029. className: 'buttons-select-none',
  93030. action: function () {
  93031. clear( this.settings()[0], true );
  93032. },
  93033. init: function ( dt, node, config ) {
  93034. var that = this;
  93035. config._eventNamespace = '.select'+(_buttonNamespace++);
  93036. dt.on( namespacedEvents(config), function () {
  93037. var count = dt.rows( { selected: true } ).flatten().length +
  93038. dt.columns( { selected: true } ).flatten().length +
  93039. dt.cells( { selected: true } ).flatten().length;
  93040. that.enable( count > 0 );
  93041. } );
  93042. this.disable();
  93043. },
  93044. destroy: function ( dt, node, config ) {
  93045. dt.off( config._eventNamespace );
  93046. }
  93047. }
  93048. } );
  93049. $.each( [ 'Row', 'Column', 'Cell' ], function ( i, item ) {
  93050. var lc = item.toLowerCase();
  93051. DataTable.ext.buttons[ 'select'+item+'s' ] = {
  93052. text: i18n( 'select'+item+'s', 'Select '+lc+'s' ),
  93053. className: 'buttons-select-'+lc+'s',
  93054. action: function () {
  93055. this.select.items( lc );
  93056. },
  93057. init: function ( dt ) {
  93058. var that = this;
  93059. dt.on( 'selectItems.dt.DT', function ( e, ctx, items ) {
  93060. that.active( items === lc );
  93061. } );
  93062. }
  93063. };
  93064. } );
  93065. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  93066. * Initialisation
  93067. */
  93068. // DataTables creation - check if select has been defined in the options. Note
  93069. // this required that the table be in the document! If it isn't then something
  93070. // needs to trigger this method unfortunately. The next major release of
  93071. // DataTables will rework the events and address this.
  93072. $(document).on( 'preInit.dt.dtSelect', function (e, ctx) {
  93073. if ( e.namespace !== 'dt' ) {
  93074. return;
  93075. }
  93076. DataTable.select.init( new DataTable.Api( ctx ) );
  93077. } );
  93078. return DataTable.select;
  93079. }));