iclient-mapboxgl-react.js 1.4 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504
  1. /*!
  2. *
  3. * @supermap/react-iclient.(https://iclient.supermap.io)
  4. * Copyright© 2000 - 2023 SuperMap Software Co.Ltd
  5. * license: Apache-2.0
  6. * version: v11.1.0
  7. *
  8. */
  9. (function webpackUniversalModuleDefinition(root, factory) {
  10. if(typeof exports === 'object' && typeof module === 'object')
  11. module.exports = factory(require("../public/libs/mapboxgl/mapbox-gl-enhance.js"), require("echarts"), require("three/build/three"), require("../public/libs/deckgl/deck.gl.min.js"), require("../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js"), require("antd"), require("../public/libs/echarts-layer/EchartsLayer.js"), require("react"), require("canvg"));
  12. else if(typeof define === 'function' && define.amd)
  13. define(["../public/libs/mapboxgl/mapbox-gl-enhance.js", "echarts", "three/build/three", "../public/libs/deckgl/deck.gl.min.js", "../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js", "antd", "../public/libs/echarts-layer/EchartsLayer.js", "react", "canvg"], factory);
  14. else if(typeof exports === 'object')
  15. exports["SuperMap"] = factory(require("../public/libs/mapboxgl/mapbox-gl-enhance.js"), require("echarts"), require("three/build/three"), require("../public/libs/deckgl/deck.gl.min.js"), require("../public/libs/iclient-mapboxgl/iclient-mapboxgl.min.js"), require("antd"), require("../public/libs/echarts-layer/EchartsLayer.js"), require("react"), require("canvg"));
  16. else
  17. root["SuperMap"] = root["SuperMap"] || {}, root["SuperMap"]["Components"] = factory(root["mapboxgl"], root["echarts"], root["THREE"], root["DeckGL"], root["SuperMap"], root["antd"], root["EchartsLayer"], root["React"], root["canvg"]);
  18. })(self, function(__WEBPACK_EXTERNAL_MODULE__375__, __WEBPACK_EXTERNAL_MODULE__550__, __WEBPACK_EXTERNAL_MODULE__2069__, __WEBPACK_EXTERNAL_MODULE__2371__, __WEBPACK_EXTERNAL_MODULE__2395__, __WEBPACK_EXTERNAL_MODULE__2721__, __WEBPACK_EXTERNAL_MODULE__3094__, __WEBPACK_EXTERNAL_MODULE__3899__, __WEBPACK_EXTERNAL_MODULE__5973__) {
  19. return /******/ (function() { // webpackBootstrap
  20. /******/ var __webpack_modules__ = ({
  21. /***/ 9705:
  22. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  23. "use strict";
  24. Object.defineProperty(exports, "__esModule", ({ value: true }));
  25. var meta_1 = __webpack_require__(1540);
  26. /**
  27. * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
  28. *
  29. * @name bbox
  30. * @param {GeoJSON} geojson any GeoJSON object
  31. * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
  32. * @example
  33. * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
  34. * var bbox = turf.bbox(line);
  35. * var bboxPolygon = turf.bboxPolygon(bbox);
  36. *
  37. * //addToMap
  38. * var addToMap = [line, bboxPolygon]
  39. */
  40. function bbox(geojson) {
  41. var result = [Infinity, Infinity, -Infinity, -Infinity];
  42. meta_1.coordEach(geojson, function (coord) {
  43. if (result[0] > coord[0]) {
  44. result[0] = coord[0];
  45. }
  46. if (result[1] > coord[1]) {
  47. result[1] = coord[1];
  48. }
  49. if (result[2] < coord[0]) {
  50. result[2] = coord[0];
  51. }
  52. if (result[3] < coord[1]) {
  53. result[3] = coord[1];
  54. }
  55. });
  56. return result;
  57. }
  58. bbox["default"] = bbox;
  59. exports["default"] = bbox;
  60. /***/ }),
  61. /***/ 3880:
  62. /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
  63. "use strict";
  64. // ESM COMPAT FLAG
  65. __webpack_require__.r(__webpack_exports__);
  66. // EXPORTS
  67. __webpack_require__.d(__webpack_exports__, {
  68. "default": function() { return /* binding */ envelope_main_es; }
  69. });
  70. ;// CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/helpers/main.es.js
  71. /**
  72. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  73. */
  74. var earthRadius = 6371008.8;
  75. /**
  76. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  77. */
  78. var factors = {
  79. meters: earthRadius,
  80. metres: earthRadius,
  81. millimeters: earthRadius * 1000,
  82. millimetres: earthRadius * 1000,
  83. centimeters: earthRadius * 100,
  84. centimetres: earthRadius * 100,
  85. kilometers: earthRadius / 1000,
  86. kilometres: earthRadius / 1000,
  87. miles: earthRadius / 1609.344,
  88. nauticalmiles: earthRadius / 1852,
  89. inches: earthRadius * 39.370,
  90. yards: earthRadius / 1.0936,
  91. feet: earthRadius * 3.28084,
  92. radians: 1,
  93. degrees: earthRadius / 111325,
  94. };
  95. /**
  96. * Units of measurement factors based on 1 meter.
  97. */
  98. var unitsFactors = {
  99. meters: 1,
  100. metres: 1,
  101. millimeters: 1000,
  102. millimetres: 1000,
  103. centimeters: 100,
  104. centimetres: 100,
  105. kilometers: 1 / 1000,
  106. kilometres: 1 / 1000,
  107. miles: 1 / 1609.344,
  108. nauticalmiles: 1 / 1852,
  109. inches: 39.370,
  110. yards: 1 / 1.0936,
  111. feet: 3.28084,
  112. radians: 1 / earthRadius,
  113. degrees: 1 / 111325,
  114. };
  115. /**
  116. * Area of measurement factors based on 1 square meter.
  117. */
  118. var areaFactors = {
  119. meters: 1,
  120. metres: 1,
  121. millimeters: 1000000,
  122. millimetres: 1000000,
  123. centimeters: 10000,
  124. centimetres: 10000,
  125. kilometers: 0.000001,
  126. kilometres: 0.000001,
  127. acres: 0.000247105,
  128. miles: 3.86e-7,
  129. yards: 1.195990046,
  130. feet: 10.763910417,
  131. inches: 1550.003100006
  132. };
  133. /**
  134. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  135. *
  136. * @name feature
  137. * @param {Geometry} geometry input geometry
  138. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  139. * @param {Object} [options={}] Optional Parameters
  140. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  141. * @param {string|number} [options.id] Identifier associated with the Feature
  142. * @returns {Feature} a GeoJSON Feature
  143. * @example
  144. * var geometry = {
  145. * "type": "Point",
  146. * "coordinates": [110, 50]
  147. * };
  148. *
  149. * var feature = turf.feature(geometry);
  150. *
  151. * //=feature
  152. */
  153. function main_es_feature(geometry, properties, options) {
  154. // Optional Parameters
  155. options = options || {};
  156. if (!main_es_isObject(options)) throw new Error('options is invalid');
  157. var bbox = options.bbox;
  158. var id = options.id;
  159. // Validation
  160. if (geometry === undefined) throw new Error('geometry is required');
  161. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  162. if (bbox) validateBBox(bbox);
  163. if (id) validateId(id);
  164. // Main
  165. var feat = {type: 'Feature'};
  166. if (id) feat.id = id;
  167. if (bbox) feat.bbox = bbox;
  168. feat.properties = properties || {};
  169. feat.geometry = geometry;
  170. return feat;
  171. }
  172. /**
  173. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  174. * For GeometryCollection type use `helpers.geometryCollection`
  175. *
  176. * @name geometry
  177. * @param {string} type Geometry Type
  178. * @param {Array<number>} coordinates Coordinates
  179. * @param {Object} [options={}] Optional Parameters
  180. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  181. * @returns {Geometry} a GeoJSON Geometry
  182. * @example
  183. * var type = 'Point';
  184. * var coordinates = [110, 50];
  185. *
  186. * var geometry = turf.geometry(type, coordinates);
  187. *
  188. * //=geometry
  189. */
  190. function geometry(type, coordinates, options) {
  191. // Optional Parameters
  192. options = options || {};
  193. if (!main_es_isObject(options)) throw new Error('options is invalid');
  194. var bbox = options.bbox;
  195. // Validation
  196. if (!type) throw new Error('type is required');
  197. if (!coordinates) throw new Error('coordinates is required');
  198. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  199. if (bbox) validateBBox(bbox);
  200. // Main
  201. var geom;
  202. switch (type) {
  203. case 'Point': geom = main_es_point(coordinates).geometry; break;
  204. case 'LineString': geom = main_es_lineString(coordinates).geometry; break;
  205. case 'Polygon': geom = polygon(coordinates).geometry; break;
  206. case 'MultiPoint': geom = multiPoint(coordinates).geometry; break;
  207. case 'MultiLineString': geom = multiLineString(coordinates).geometry; break;
  208. case 'MultiPolygon': geom = multiPolygon(coordinates).geometry; break;
  209. default: throw new Error(type + ' is invalid');
  210. }
  211. if (bbox) geom.bbox = bbox;
  212. return geom;
  213. }
  214. /**
  215. * Creates a {@link Point} {@link Feature} from a Position.
  216. *
  217. * @name point
  218. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  219. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  220. * @param {Object} [options={}] Optional Parameters
  221. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  222. * @param {string|number} [options.id] Identifier associated with the Feature
  223. * @returns {Feature<Point>} a Point feature
  224. * @example
  225. * var point = turf.point([-75.343, 39.984]);
  226. *
  227. * //=point
  228. */
  229. function main_es_point(coordinates, properties, options) {
  230. if (!coordinates) throw new Error('coordinates is required');
  231. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  232. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  233. if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  234. return main_es_feature({
  235. type: 'Point',
  236. coordinates: coordinates
  237. }, properties, options);
  238. }
  239. /**
  240. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  241. *
  242. * @name points
  243. * @param {Array<Array<number>>} coordinates an array of Points
  244. * @param {Object} [properties={}] Translate these properties to each Feature
  245. * @param {Object} [options={}] Optional Parameters
  246. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  247. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  248. * @returns {FeatureCollection<Point>} Point Feature
  249. * @example
  250. * var points = turf.points([
  251. * [-75, 39],
  252. * [-80, 45],
  253. * [-78, 50]
  254. * ]);
  255. *
  256. * //=points
  257. */
  258. function points(coordinates, properties, options) {
  259. if (!coordinates) throw new Error('coordinates is required');
  260. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  261. return featureCollection(coordinates.map(function (coords) {
  262. return main_es_point(coords, properties);
  263. }), options);
  264. }
  265. /**
  266. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  267. *
  268. * @name polygon
  269. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  270. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  271. * @param {Object} [options={}] Optional Parameters
  272. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  273. * @param {string|number} [options.id] Identifier associated with the Feature
  274. * @returns {Feature<Polygon>} Polygon Feature
  275. * @example
  276. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  277. *
  278. * //=polygon
  279. */
  280. function polygon(coordinates, properties, options) {
  281. if (!coordinates) throw new Error('coordinates is required');
  282. for (var i = 0; i < coordinates.length; i++) {
  283. var ring = coordinates[i];
  284. if (ring.length < 4) {
  285. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  286. }
  287. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  288. // Check if first point of Polygon contains two numbers
  289. if (i === 0 && j === 0 && !isNumber(ring[0][0]) || !isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  290. if (ring[ring.length - 1][j] !== ring[0][j]) {
  291. throw new Error('First and last Position are not equivalent.');
  292. }
  293. }
  294. }
  295. return main_es_feature({
  296. type: 'Polygon',
  297. coordinates: coordinates
  298. }, properties, options);
  299. }
  300. /**
  301. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  302. *
  303. * @name polygons
  304. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  305. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  306. * @param {Object} [options={}] Optional Parameters
  307. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  308. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  309. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  310. * @example
  311. * var polygons = turf.polygons([
  312. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  313. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  314. * ]);
  315. *
  316. * //=polygons
  317. */
  318. function polygons(coordinates, properties, options) {
  319. if (!coordinates) throw new Error('coordinates is required');
  320. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  321. return featureCollection(coordinates.map(function (coords) {
  322. return polygon(coords, properties);
  323. }), options);
  324. }
  325. /**
  326. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  327. *
  328. * @name lineString
  329. * @param {Array<Array<number>>} coordinates an array of Positions
  330. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  331. * @param {Object} [options={}] Optional Parameters
  332. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  333. * @param {string|number} [options.id] Identifier associated with the Feature
  334. * @returns {Feature<LineString>} LineString Feature
  335. * @example
  336. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  337. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  338. *
  339. * //=linestring1
  340. * //=linestring2
  341. */
  342. function main_es_lineString(coordinates, properties, options) {
  343. if (!coordinates) throw new Error('coordinates is required');
  344. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  345. // Check if first point of LineString contains two numbers
  346. if (!isNumber(coordinates[0][1]) || !isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  347. return main_es_feature({
  348. type: 'LineString',
  349. coordinates: coordinates
  350. }, properties, options);
  351. }
  352. /**
  353. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  354. *
  355. * @name lineStrings
  356. * @param {Array<Array<number>>} coordinates an array of LinearRings
  357. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  358. * @param {Object} [options={}] Optional Parameters
  359. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  360. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  361. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  362. * @example
  363. * var linestrings = turf.lineStrings([
  364. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  365. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  366. * ]);
  367. *
  368. * //=linestrings
  369. */
  370. function lineStrings(coordinates, properties, options) {
  371. if (!coordinates) throw new Error('coordinates is required');
  372. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  373. return featureCollection(coordinates.map(function (coords) {
  374. return main_es_lineString(coords, properties);
  375. }), options);
  376. }
  377. /**
  378. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  379. *
  380. * @name featureCollection
  381. * @param {Feature[]} features input features
  382. * @param {Object} [options={}] Optional Parameters
  383. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  384. * @param {string|number} [options.id] Identifier associated with the Feature
  385. * @returns {FeatureCollection} FeatureCollection of Features
  386. * @example
  387. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  388. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  389. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  390. *
  391. * var collection = turf.featureCollection([
  392. * locationA,
  393. * locationB,
  394. * locationC
  395. * ]);
  396. *
  397. * //=collection
  398. */
  399. function featureCollection(features, options) {
  400. // Optional Parameters
  401. options = options || {};
  402. if (!main_es_isObject(options)) throw new Error('options is invalid');
  403. var bbox = options.bbox;
  404. var id = options.id;
  405. // Validation
  406. if (!features) throw new Error('No features passed');
  407. if (!Array.isArray(features)) throw new Error('features must be an Array');
  408. if (bbox) validateBBox(bbox);
  409. if (id) validateId(id);
  410. // Main
  411. var fc = {type: 'FeatureCollection'};
  412. if (id) fc.id = id;
  413. if (bbox) fc.bbox = bbox;
  414. fc.features = features;
  415. return fc;
  416. }
  417. /**
  418. * Creates a {@link Feature<MultiLineString>} based on a
  419. * coordinate array. Properties can be added optionally.
  420. *
  421. * @name multiLineString
  422. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  423. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  424. * @param {Object} [options={}] Optional Parameters
  425. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  426. * @param {string|number} [options.id] Identifier associated with the Feature
  427. * @returns {Feature<MultiLineString>} a MultiLineString feature
  428. * @throws {Error} if no coordinates are passed
  429. * @example
  430. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  431. *
  432. * //=multiLine
  433. */
  434. function multiLineString(coordinates, properties, options) {
  435. if (!coordinates) throw new Error('coordinates is required');
  436. return main_es_feature({
  437. type: 'MultiLineString',
  438. coordinates: coordinates
  439. }, properties, options);
  440. }
  441. /**
  442. * Creates a {@link Feature<MultiPoint>} based on a
  443. * coordinate array. Properties can be added optionally.
  444. *
  445. * @name multiPoint
  446. * @param {Array<Array<number>>} coordinates an array of Positions
  447. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  448. * @param {Object} [options={}] Optional Parameters
  449. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  450. * @param {string|number} [options.id] Identifier associated with the Feature
  451. * @returns {Feature<MultiPoint>} a MultiPoint feature
  452. * @throws {Error} if no coordinates are passed
  453. * @example
  454. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  455. *
  456. * //=multiPt
  457. */
  458. function multiPoint(coordinates, properties, options) {
  459. if (!coordinates) throw new Error('coordinates is required');
  460. return main_es_feature({
  461. type: 'MultiPoint',
  462. coordinates: coordinates
  463. }, properties, options);
  464. }
  465. /**
  466. * Creates a {@link Feature<MultiPolygon>} based on a
  467. * coordinate array. Properties can be added optionally.
  468. *
  469. * @name multiPolygon
  470. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  471. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  472. * @param {Object} [options={}] Optional Parameters
  473. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  474. * @param {string|number} [options.id] Identifier associated with the Feature
  475. * @returns {Feature<MultiPolygon>} a multipolygon feature
  476. * @throws {Error} if no coordinates are passed
  477. * @example
  478. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  479. *
  480. * //=multiPoly
  481. *
  482. */
  483. function multiPolygon(coordinates, properties, options) {
  484. if (!coordinates) throw new Error('coordinates is required');
  485. return main_es_feature({
  486. type: 'MultiPolygon',
  487. coordinates: coordinates
  488. }, properties, options);
  489. }
  490. /**
  491. * Creates a {@link Feature<GeometryCollection>} based on a
  492. * coordinate array. Properties can be added optionally.
  493. *
  494. * @name geometryCollection
  495. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  496. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  497. * @param {Object} [options={}] Optional Parameters
  498. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  499. * @param {string|number} [options.id] Identifier associated with the Feature
  500. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  501. * @example
  502. * var pt = {
  503. * "type": "Point",
  504. * "coordinates": [100, 0]
  505. * };
  506. * var line = {
  507. * "type": "LineString",
  508. * "coordinates": [ [101, 0], [102, 1] ]
  509. * };
  510. * var collection = turf.geometryCollection([pt, line]);
  511. *
  512. * //=collection
  513. */
  514. function geometryCollection(geometries, properties, options) {
  515. if (!geometries) throw new Error('geometries is required');
  516. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  517. return main_es_feature({
  518. type: 'GeometryCollection',
  519. geometries: geometries
  520. }, properties, options);
  521. }
  522. /**
  523. * Round number to precision
  524. *
  525. * @param {number} num Number
  526. * @param {number} [precision=0] Precision
  527. * @returns {number} rounded number
  528. * @example
  529. * turf.round(120.4321)
  530. * //=120
  531. *
  532. * turf.round(120.4321, 2)
  533. * //=120.43
  534. */
  535. function round(num, precision) {
  536. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  537. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  538. var multiplier = Math.pow(10, precision || 0);
  539. return Math.round(num * multiplier) / multiplier;
  540. }
  541. /**
  542. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  543. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  544. *
  545. * @name radiansToLength
  546. * @param {number} radians in radians across the sphere
  547. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  548. * @returns {number} distance
  549. */
  550. function radiansToLength(radians, units) {
  551. if (radians === undefined || radians === null) throw new Error('radians is required');
  552. if (units && typeof units !== 'string') throw new Error('units must be a string');
  553. var factor = factors[units || 'kilometers'];
  554. if (!factor) throw new Error(units + ' units is invalid');
  555. return radians * factor;
  556. }
  557. /**
  558. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  559. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  560. *
  561. * @name lengthToRadians
  562. * @param {number} distance in real units
  563. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  564. * @returns {number} radians
  565. */
  566. function lengthToRadians(distance, units) {
  567. if (distance === undefined || distance === null) throw new Error('distance is required');
  568. if (units && typeof units !== 'string') throw new Error('units must be a string');
  569. var factor = factors[units || 'kilometers'];
  570. if (!factor) throw new Error(units + ' units is invalid');
  571. return distance / factor;
  572. }
  573. /**
  574. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  575. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  576. *
  577. * @name lengthToDegrees
  578. * @param {number} distance in real units
  579. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  580. * @returns {number} degrees
  581. */
  582. function lengthToDegrees(distance, units) {
  583. return radiansToDegrees(lengthToRadians(distance, units));
  584. }
  585. /**
  586. * Converts any bearing angle from the north line direction (positive clockwise)
  587. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  588. *
  589. * @name bearingToAzimuth
  590. * @param {number} bearing angle, between -180 and +180 degrees
  591. * @returns {number} angle between 0 and 360 degrees
  592. */
  593. function bearingToAzimuth(bearing) {
  594. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  595. var angle = bearing % 360;
  596. if (angle < 0) angle += 360;
  597. return angle;
  598. }
  599. /**
  600. * Converts an angle in radians to degrees
  601. *
  602. * @name radiansToDegrees
  603. * @param {number} radians angle in radians
  604. * @returns {number} degrees between 0 and 360 degrees
  605. */
  606. function radiansToDegrees(radians) {
  607. if (radians === null || radians === undefined) throw new Error('radians is required');
  608. var degrees = radians % (2 * Math.PI);
  609. return degrees * 180 / Math.PI;
  610. }
  611. /**
  612. * Converts an angle in degrees to radians
  613. *
  614. * @name degreesToRadians
  615. * @param {number} degrees angle between 0 and 360 degrees
  616. * @returns {number} angle in radians
  617. */
  618. function degreesToRadians(degrees) {
  619. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  620. var radians = degrees % 360;
  621. return radians * Math.PI / 180;
  622. }
  623. /**
  624. * Converts a length to the requested unit.
  625. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  626. *
  627. * @param {number} length to be converted
  628. * @param {string} originalUnit of the length
  629. * @param {string} [finalUnit='kilometers'] returned unit
  630. * @returns {number} the converted length
  631. */
  632. function convertLength(length, originalUnit, finalUnit) {
  633. if (length === null || length === undefined) throw new Error('length is required');
  634. if (!(length >= 0)) throw new Error('length must be a positive number');
  635. return radiansToLength(lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  636. }
  637. /**
  638. * Converts a area to the requested unit.
  639. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  640. * @param {number} area to be converted
  641. * @param {string} [originalUnit='meters'] of the distance
  642. * @param {string} [finalUnit='kilometers'] returned unit
  643. * @returns {number} the converted distance
  644. */
  645. function convertArea(area, originalUnit, finalUnit) {
  646. if (area === null || area === undefined) throw new Error('area is required');
  647. if (!(area >= 0)) throw new Error('area must be a positive number');
  648. var startFactor = areaFactors[originalUnit || 'meters'];
  649. if (!startFactor) throw new Error('invalid original units');
  650. var finalFactor = areaFactors[finalUnit || 'kilometers'];
  651. if (!finalFactor) throw new Error('invalid final units');
  652. return (area / startFactor) * finalFactor;
  653. }
  654. /**
  655. * isNumber
  656. *
  657. * @param {*} num Number to validate
  658. * @returns {boolean} true/false
  659. * @example
  660. * turf.isNumber(123)
  661. * //=true
  662. * turf.isNumber('foo')
  663. * //=false
  664. */
  665. function isNumber(num) {
  666. return !isNaN(num) && num !== null && !Array.isArray(num);
  667. }
  668. /**
  669. * isObject
  670. *
  671. * @param {*} input variable to validate
  672. * @returns {boolean} true/false
  673. * @example
  674. * turf.isObject({elevation: 10})
  675. * //=true
  676. * turf.isObject('foo')
  677. * //=false
  678. */
  679. function main_es_isObject(input) {
  680. return (!!input) && (input.constructor === Object);
  681. }
  682. /**
  683. * Validate BBox
  684. *
  685. * @private
  686. * @param {Array<number>} bbox BBox to validate
  687. * @returns {void}
  688. * @throws Error if BBox is not valid
  689. * @example
  690. * validateBBox([-180, -40, 110, 50])
  691. * //=OK
  692. * validateBBox([-180, -40])
  693. * //=Error
  694. * validateBBox('Foo')
  695. * //=Error
  696. * validateBBox(5)
  697. * //=Error
  698. * validateBBox(null)
  699. * //=Error
  700. * validateBBox(undefined)
  701. * //=Error
  702. */
  703. function validateBBox(bbox) {
  704. if (!bbox) throw new Error('bbox is required');
  705. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  706. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  707. bbox.forEach(function (num) {
  708. if (!isNumber(num)) throw new Error('bbox must only contain numbers');
  709. });
  710. }
  711. /**
  712. * Validate Id
  713. *
  714. * @private
  715. * @param {string|number} id Id to validate
  716. * @returns {void}
  717. * @throws Error if Id is not valid
  718. * @example
  719. * validateId([-180, -40, 110, 50])
  720. * //=Error
  721. * validateId([-180, -40])
  722. * //=Error
  723. * validateId('Foo')
  724. * //=OK
  725. * validateId(5)
  726. * //=OK
  727. * validateId(null)
  728. * //=Error
  729. * validateId(undefined)
  730. * //=Error
  731. */
  732. function validateId(id) {
  733. if (!id) throw new Error('id is required');
  734. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  735. }
  736. // Deprecated methods
  737. function radians2degrees() {
  738. throw new Error('method has been renamed to `radiansToDegrees`');
  739. }
  740. function degrees2radians() {
  741. throw new Error('method has been renamed to `degreesToRadians`');
  742. }
  743. function distanceToDegrees() {
  744. throw new Error('method has been renamed to `lengthToDegrees`');
  745. }
  746. function distanceToRadians() {
  747. throw new Error('method has been renamed to `lengthToRadians`');
  748. }
  749. function radiansToDistance() {
  750. throw new Error('method has been renamed to `radiansToLength`');
  751. }
  752. function bearingToAngle() {
  753. throw new Error('method has been renamed to `bearingToAzimuth`');
  754. }
  755. function convertDistance() {
  756. throw new Error('method has been renamed to `convertLength`');
  757. }
  758. ;// CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/meta/main.es.js
  759. /**
  760. * Callback for coordEach
  761. *
  762. * @callback coordEachCallback
  763. * @param {Array<number>} currentCoord The current coordinate being processed.
  764. * @param {number} coordIndex The current index of the coordinate being processed.
  765. * @param {number} featureIndex The current index of the Feature being processed.
  766. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  767. * @param {number} geometryIndex The current index of the Geometry being processed.
  768. */
  769. /**
  770. * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
  771. *
  772. * @name coordEach
  773. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  774. * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
  775. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  776. * @returns {void}
  777. * @example
  778. * var features = turf.featureCollection([
  779. * turf.point([26, 37], {"foo": "bar"}),
  780. * turf.point([36, 53], {"hello": "world"})
  781. * ]);
  782. *
  783. * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  784. * //=currentCoord
  785. * //=coordIndex
  786. * //=featureIndex
  787. * //=multiFeatureIndex
  788. * //=geometryIndex
  789. * });
  790. */
  791. function coordEach(geojson, callback, excludeWrapCoord) {
  792. // Handles null Geometry -- Skips this GeoJSON
  793. if (geojson === null) return;
  794. var j, k, l, geometry, stopG, coords,
  795. geometryMaybeCollection,
  796. wrapShrink = 0,
  797. coordIndex = 0,
  798. isGeometryCollection,
  799. type = geojson.type,
  800. isFeatureCollection = type === 'FeatureCollection',
  801. isFeature = type === 'Feature',
  802. stop = isFeatureCollection ? geojson.features.length : 1;
  803. // This logic may look a little weird. The reason why it is that way
  804. // is because it's trying to be fast. GeoJSON supports multiple kinds
  805. // of objects at its root: FeatureCollection, Features, Geometries.
  806. // This function has the responsibility of handling all of them, and that
  807. // means that some of the `for` loops you see below actually just don't apply
  808. // to certain inputs. For instance, if you give this just a
  809. // Point geometry, then both loops are short-circuited and all we do
  810. // is gradually rename the input until it's called 'geometry'.
  811. //
  812. // This also aims to allocate as few resources as possible: just a
  813. // few numbers and booleans, rather than any temporary arrays as would
  814. // be required with the normalization approach.
  815. for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
  816. geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
  817. (isFeature ? geojson.geometry : geojson));
  818. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  819. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  820. for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
  821. var multiFeatureIndex = 0;
  822. var geometryIndex = 0;
  823. geometry = isGeometryCollection ?
  824. geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
  825. // Handles null Geometry -- Skips this geometry
  826. if (geometry === null) continue;
  827. coords = geometry.coordinates;
  828. var geomType = geometry.type;
  829. wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
  830. switch (geomType) {
  831. case null:
  832. break;
  833. case 'Point':
  834. if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  835. coordIndex++;
  836. multiFeatureIndex++;
  837. break;
  838. case 'LineString':
  839. case 'MultiPoint':
  840. for (j = 0; j < coords.length; j++) {
  841. if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  842. coordIndex++;
  843. if (geomType === 'MultiPoint') multiFeatureIndex++;
  844. }
  845. if (geomType === 'LineString') multiFeatureIndex++;
  846. break;
  847. case 'Polygon':
  848. case 'MultiLineString':
  849. for (j = 0; j < coords.length; j++) {
  850. for (k = 0; k < coords[j].length - wrapShrink; k++) {
  851. if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  852. coordIndex++;
  853. }
  854. if (geomType === 'MultiLineString') multiFeatureIndex++;
  855. if (geomType === 'Polygon') geometryIndex++;
  856. }
  857. if (geomType === 'Polygon') multiFeatureIndex++;
  858. break;
  859. case 'MultiPolygon':
  860. for (j = 0; j < coords.length; j++) {
  861. if (geomType === 'MultiPolygon') geometryIndex = 0;
  862. for (k = 0; k < coords[j].length; k++) {
  863. for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
  864. if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  865. coordIndex++;
  866. }
  867. geometryIndex++;
  868. }
  869. multiFeatureIndex++;
  870. }
  871. break;
  872. case 'GeometryCollection':
  873. for (j = 0; j < geometry.geometries.length; j++)
  874. if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
  875. break;
  876. default:
  877. throw new Error('Unknown Geometry Type');
  878. }
  879. }
  880. }
  881. }
  882. /**
  883. * Callback for coordReduce
  884. *
  885. * The first time the callback function is called, the values provided as arguments depend
  886. * on whether the reduce method has an initialValue argument.
  887. *
  888. * If an initialValue is provided to the reduce method:
  889. * - The previousValue argument is initialValue.
  890. * - The currentValue argument is the value of the first element present in the array.
  891. *
  892. * If an initialValue is not provided:
  893. * - The previousValue argument is the value of the first element present in the array.
  894. * - The currentValue argument is the value of the second element present in the array.
  895. *
  896. * @callback coordReduceCallback
  897. * @param {*} previousValue The accumulated value previously returned in the last invocation
  898. * of the callback, or initialValue, if supplied.
  899. * @param {Array<number>} currentCoord The current coordinate being processed.
  900. * @param {number} coordIndex The current index of the coordinate being processed.
  901. * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
  902. * @param {number} featureIndex The current index of the Feature being processed.
  903. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  904. * @param {number} geometryIndex The current index of the Geometry being processed.
  905. */
  906. /**
  907. * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
  908. *
  909. * @name coordReduce
  910. * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
  911. * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
  912. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  913. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  914. * @returns {*} The value that results from the reduction.
  915. * @example
  916. * var features = turf.featureCollection([
  917. * turf.point([26, 37], {"foo": "bar"}),
  918. * turf.point([36, 53], {"hello": "world"})
  919. * ]);
  920. *
  921. * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  922. * //=previousValue
  923. * //=currentCoord
  924. * //=coordIndex
  925. * //=featureIndex
  926. * //=multiFeatureIndex
  927. * //=geometryIndex
  928. * return currentCoord;
  929. * });
  930. */
  931. function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
  932. var previousValue = initialValue;
  933. coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  934. if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
  935. else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
  936. }, excludeWrapCoord);
  937. return previousValue;
  938. }
  939. /**
  940. * Callback for propEach
  941. *
  942. * @callback propEachCallback
  943. * @param {Object} currentProperties The current Properties being processed.
  944. * @param {number} featureIndex The current index of the Feature being processed.
  945. */
  946. /**
  947. * Iterate over properties in any GeoJSON object, similar to Array.forEach()
  948. *
  949. * @name propEach
  950. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  951. * @param {Function} callback a method that takes (currentProperties, featureIndex)
  952. * @returns {void}
  953. * @example
  954. * var features = turf.featureCollection([
  955. * turf.point([26, 37], {foo: 'bar'}),
  956. * turf.point([36, 53], {hello: 'world'})
  957. * ]);
  958. *
  959. * turf.propEach(features, function (currentProperties, featureIndex) {
  960. * //=currentProperties
  961. * //=featureIndex
  962. * });
  963. */
  964. function propEach(geojson, callback) {
  965. var i;
  966. switch (geojson.type) {
  967. case 'FeatureCollection':
  968. for (i = 0; i < geojson.features.length; i++) {
  969. if (callback(geojson.features[i].properties, i) === false) break;
  970. }
  971. break;
  972. case 'Feature':
  973. callback(geojson.properties, 0);
  974. break;
  975. }
  976. }
  977. /**
  978. * Callback for propReduce
  979. *
  980. * The first time the callback function is called, the values provided as arguments depend
  981. * on whether the reduce method has an initialValue argument.
  982. *
  983. * If an initialValue is provided to the reduce method:
  984. * - The previousValue argument is initialValue.
  985. * - The currentValue argument is the value of the first element present in the array.
  986. *
  987. * If an initialValue is not provided:
  988. * - The previousValue argument is the value of the first element present in the array.
  989. * - The currentValue argument is the value of the second element present in the array.
  990. *
  991. * @callback propReduceCallback
  992. * @param {*} previousValue The accumulated value previously returned in the last invocation
  993. * of the callback, or initialValue, if supplied.
  994. * @param {*} currentProperties The current Properties being processed.
  995. * @param {number} featureIndex The current index of the Feature being processed.
  996. */
  997. /**
  998. * Reduce properties in any GeoJSON object into a single value,
  999. * similar to how Array.reduce works. However, in this case we lazily run
  1000. * the reduction, so an array of all properties is unnecessary.
  1001. *
  1002. * @name propReduce
  1003. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  1004. * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
  1005. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1006. * @returns {*} The value that results from the reduction.
  1007. * @example
  1008. * var features = turf.featureCollection([
  1009. * turf.point([26, 37], {foo: 'bar'}),
  1010. * turf.point([36, 53], {hello: 'world'})
  1011. * ]);
  1012. *
  1013. * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
  1014. * //=previousValue
  1015. * //=currentProperties
  1016. * //=featureIndex
  1017. * return currentProperties
  1018. * });
  1019. */
  1020. function propReduce(geojson, callback, initialValue) {
  1021. var previousValue = initialValue;
  1022. propEach(geojson, function (currentProperties, featureIndex) {
  1023. if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
  1024. else previousValue = callback(previousValue, currentProperties, featureIndex);
  1025. });
  1026. return previousValue;
  1027. }
  1028. /**
  1029. * Callback for featureEach
  1030. *
  1031. * @callback featureEachCallback
  1032. * @param {Feature<any>} currentFeature The current Feature being processed.
  1033. * @param {number} featureIndex The current index of the Feature being processed.
  1034. */
  1035. /**
  1036. * Iterate over features in any GeoJSON object, similar to
  1037. * Array.forEach.
  1038. *
  1039. * @name featureEach
  1040. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1041. * @param {Function} callback a method that takes (currentFeature, featureIndex)
  1042. * @returns {void}
  1043. * @example
  1044. * var features = turf.featureCollection([
  1045. * turf.point([26, 37], {foo: 'bar'}),
  1046. * turf.point([36, 53], {hello: 'world'})
  1047. * ]);
  1048. *
  1049. * turf.featureEach(features, function (currentFeature, featureIndex) {
  1050. * //=currentFeature
  1051. * //=featureIndex
  1052. * });
  1053. */
  1054. function featureEach(geojson, callback) {
  1055. if (geojson.type === 'Feature') {
  1056. callback(geojson, 0);
  1057. } else if (geojson.type === 'FeatureCollection') {
  1058. for (var i = 0; i < geojson.features.length; i++) {
  1059. if (callback(geojson.features[i], i) === false) break;
  1060. }
  1061. }
  1062. }
  1063. /**
  1064. * Callback for featureReduce
  1065. *
  1066. * The first time the callback function is called, the values provided as arguments depend
  1067. * on whether the reduce method has an initialValue argument.
  1068. *
  1069. * If an initialValue is provided to the reduce method:
  1070. * - The previousValue argument is initialValue.
  1071. * - The currentValue argument is the value of the first element present in the array.
  1072. *
  1073. * If an initialValue is not provided:
  1074. * - The previousValue argument is the value of the first element present in the array.
  1075. * - The currentValue argument is the value of the second element present in the array.
  1076. *
  1077. * @callback featureReduceCallback
  1078. * @param {*} previousValue The accumulated value previously returned in the last invocation
  1079. * of the callback, or initialValue, if supplied.
  1080. * @param {Feature} currentFeature The current Feature being processed.
  1081. * @param {number} featureIndex The current index of the Feature being processed.
  1082. */
  1083. /**
  1084. * Reduce features in any GeoJSON object, similar to Array.reduce().
  1085. *
  1086. * @name featureReduce
  1087. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1088. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
  1089. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1090. * @returns {*} The value that results from the reduction.
  1091. * @example
  1092. * var features = turf.featureCollection([
  1093. * turf.point([26, 37], {"foo": "bar"}),
  1094. * turf.point([36, 53], {"hello": "world"})
  1095. * ]);
  1096. *
  1097. * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
  1098. * //=previousValue
  1099. * //=currentFeature
  1100. * //=featureIndex
  1101. * return currentFeature
  1102. * });
  1103. */
  1104. function featureReduce(geojson, callback, initialValue) {
  1105. var previousValue = initialValue;
  1106. featureEach(geojson, function (currentFeature, featureIndex) {
  1107. if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  1108. else previousValue = callback(previousValue, currentFeature, featureIndex);
  1109. });
  1110. return previousValue;
  1111. }
  1112. /**
  1113. * Get all coordinates from any GeoJSON object.
  1114. *
  1115. * @name coordAll
  1116. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1117. * @returns {Array<Array<number>>} coordinate position array
  1118. * @example
  1119. * var features = turf.featureCollection([
  1120. * turf.point([26, 37], {foo: 'bar'}),
  1121. * turf.point([36, 53], {hello: 'world'})
  1122. * ]);
  1123. *
  1124. * var coords = turf.coordAll(features);
  1125. * //= [[26, 37], [36, 53]]
  1126. */
  1127. function coordAll(geojson) {
  1128. var coords = [];
  1129. coordEach(geojson, function (coord) {
  1130. coords.push(coord);
  1131. });
  1132. return coords;
  1133. }
  1134. /**
  1135. * Callback for geomEach
  1136. *
  1137. * @callback geomEachCallback
  1138. * @param {Geometry} currentGeometry The current Geometry being processed.
  1139. * @param {number} featureIndex The current index of the Feature being processed.
  1140. * @param {Object} featureProperties The current Feature Properties being processed.
  1141. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  1142. * @param {number|string} featureId The current Feature Id being processed.
  1143. */
  1144. /**
  1145. * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
  1146. *
  1147. * @name geomEach
  1148. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1149. * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  1150. * @returns {void}
  1151. * @example
  1152. * var features = turf.featureCollection([
  1153. * turf.point([26, 37], {foo: 'bar'}),
  1154. * turf.point([36, 53], {hello: 'world'})
  1155. * ]);
  1156. *
  1157. * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  1158. * //=currentGeometry
  1159. * //=featureIndex
  1160. * //=featureProperties
  1161. * //=featureBBox
  1162. * //=featureId
  1163. * });
  1164. */
  1165. function geomEach(geojson, callback) {
  1166. var i, j, g, geometry, stopG,
  1167. geometryMaybeCollection,
  1168. isGeometryCollection,
  1169. featureProperties,
  1170. featureBBox,
  1171. featureId,
  1172. featureIndex = 0,
  1173. isFeatureCollection = geojson.type === 'FeatureCollection',
  1174. isFeature = geojson.type === 'Feature',
  1175. stop = isFeatureCollection ? geojson.features.length : 1;
  1176. // This logic may look a little weird. The reason why it is that way
  1177. // is because it's trying to be fast. GeoJSON supports multiple kinds
  1178. // of objects at its root: FeatureCollection, Features, Geometries.
  1179. // This function has the responsibility of handling all of them, and that
  1180. // means that some of the `for` loops you see below actually just don't apply
  1181. // to certain inputs. For instance, if you give this just a
  1182. // Point geometry, then both loops are short-circuited and all we do
  1183. // is gradually rename the input until it's called 'geometry'.
  1184. //
  1185. // This also aims to allocate as few resources as possible: just a
  1186. // few numbers and booleans, rather than any temporary arrays as would
  1187. // be required with the normalization approach.
  1188. for (i = 0; i < stop; i++) {
  1189. geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
  1190. (isFeature ? geojson.geometry : geojson));
  1191. featureProperties = (isFeatureCollection ? geojson.features[i].properties :
  1192. (isFeature ? geojson.properties : {}));
  1193. featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
  1194. (isFeature ? geojson.bbox : undefined));
  1195. featureId = (isFeatureCollection ? geojson.features[i].id :
  1196. (isFeature ? geojson.id : undefined));
  1197. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  1198. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  1199. for (g = 0; g < stopG; g++) {
  1200. geometry = isGeometryCollection ?
  1201. geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
  1202. // Handle null Geometry
  1203. if (geometry === null) {
  1204. if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  1205. continue;
  1206. }
  1207. switch (geometry.type) {
  1208. case 'Point':
  1209. case 'LineString':
  1210. case 'MultiPoint':
  1211. case 'Polygon':
  1212. case 'MultiLineString':
  1213. case 'MultiPolygon': {
  1214. if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  1215. break;
  1216. }
  1217. case 'GeometryCollection': {
  1218. for (j = 0; j < geometry.geometries.length; j++) {
  1219. if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  1220. }
  1221. break;
  1222. }
  1223. default:
  1224. throw new Error('Unknown Geometry Type');
  1225. }
  1226. }
  1227. // Only increase `featureIndex` per each feature
  1228. featureIndex++;
  1229. }
  1230. }
  1231. /**
  1232. * Callback for geomReduce
  1233. *
  1234. * The first time the callback function is called, the values provided as arguments depend
  1235. * on whether the reduce method has an initialValue argument.
  1236. *
  1237. * If an initialValue is provided to the reduce method:
  1238. * - The previousValue argument is initialValue.
  1239. * - The currentValue argument is the value of the first element present in the array.
  1240. *
  1241. * If an initialValue is not provided:
  1242. * - The previousValue argument is the value of the first element present in the array.
  1243. * - The currentValue argument is the value of the second element present in the array.
  1244. *
  1245. * @callback geomReduceCallback
  1246. * @param {*} previousValue The accumulated value previously returned in the last invocation
  1247. * of the callback, or initialValue, if supplied.
  1248. * @param {Geometry} currentGeometry The current Geometry being processed.
  1249. * @param {number} featureIndex The current index of the Feature being processed.
  1250. * @param {Object} featureProperties The current Feature Properties being processed.
  1251. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  1252. * @param {number|string} featureId The current Feature Id being processed.
  1253. */
  1254. /**
  1255. * Reduce geometry in any GeoJSON object, similar to Array.reduce().
  1256. *
  1257. * @name geomReduce
  1258. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1259. * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  1260. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1261. * @returns {*} The value that results from the reduction.
  1262. * @example
  1263. * var features = turf.featureCollection([
  1264. * turf.point([26, 37], {foo: 'bar'}),
  1265. * turf.point([36, 53], {hello: 'world'})
  1266. * ]);
  1267. *
  1268. * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  1269. * //=previousValue
  1270. * //=currentGeometry
  1271. * //=featureIndex
  1272. * //=featureProperties
  1273. * //=featureBBox
  1274. * //=featureId
  1275. * return currentGeometry
  1276. * });
  1277. */
  1278. function geomReduce(geojson, callback, initialValue) {
  1279. var previousValue = initialValue;
  1280. geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  1281. if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
  1282. else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
  1283. });
  1284. return previousValue;
  1285. }
  1286. /**
  1287. * Callback for flattenEach
  1288. *
  1289. * @callback flattenEachCallback
  1290. * @param {Feature} currentFeature The current flattened feature being processed.
  1291. * @param {number} featureIndex The current index of the Feature being processed.
  1292. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  1293. */
  1294. /**
  1295. * Iterate over flattened features in any GeoJSON object, similar to
  1296. * Array.forEach.
  1297. *
  1298. * @name flattenEach
  1299. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1300. * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
  1301. * @example
  1302. * var features = turf.featureCollection([
  1303. * turf.point([26, 37], {foo: 'bar'}),
  1304. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  1305. * ]);
  1306. *
  1307. * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
  1308. * //=currentFeature
  1309. * //=featureIndex
  1310. * //=multiFeatureIndex
  1311. * });
  1312. */
  1313. function flattenEach(geojson, callback) {
  1314. geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
  1315. // Callback for single geometry
  1316. var type = (geometry === null) ? null : geometry.type;
  1317. switch (type) {
  1318. case null:
  1319. case 'Point':
  1320. case 'LineString':
  1321. case 'Polygon':
  1322. if (callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
  1323. return;
  1324. }
  1325. var geomType;
  1326. // Callback for multi-geometry
  1327. switch (type) {
  1328. case 'MultiPoint':
  1329. geomType = 'Point';
  1330. break;
  1331. case 'MultiLineString':
  1332. geomType = 'LineString';
  1333. break;
  1334. case 'MultiPolygon':
  1335. geomType = 'Polygon';
  1336. break;
  1337. }
  1338. for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
  1339. var coordinate = geometry.coordinates[multiFeatureIndex];
  1340. var geom = {
  1341. type: geomType,
  1342. coordinates: coordinate
  1343. };
  1344. if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
  1345. }
  1346. });
  1347. }
  1348. /**
  1349. * Callback for flattenReduce
  1350. *
  1351. * The first time the callback function is called, the values provided as arguments depend
  1352. * on whether the reduce method has an initialValue argument.
  1353. *
  1354. * If an initialValue is provided to the reduce method:
  1355. * - The previousValue argument is initialValue.
  1356. * - The currentValue argument is the value of the first element present in the array.
  1357. *
  1358. * If an initialValue is not provided:
  1359. * - The previousValue argument is the value of the first element present in the array.
  1360. * - The currentValue argument is the value of the second element present in the array.
  1361. *
  1362. * @callback flattenReduceCallback
  1363. * @param {*} previousValue The accumulated value previously returned in the last invocation
  1364. * of the callback, or initialValue, if supplied.
  1365. * @param {Feature} currentFeature The current Feature being processed.
  1366. * @param {number} featureIndex The current index of the Feature being processed.
  1367. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  1368. */
  1369. /**
  1370. * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
  1371. *
  1372. * @name flattenReduce
  1373. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  1374. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
  1375. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1376. * @returns {*} The value that results from the reduction.
  1377. * @example
  1378. * var features = turf.featureCollection([
  1379. * turf.point([26, 37], {foo: 'bar'}),
  1380. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  1381. * ]);
  1382. *
  1383. * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
  1384. * //=previousValue
  1385. * //=currentFeature
  1386. * //=featureIndex
  1387. * //=multiFeatureIndex
  1388. * return currentFeature
  1389. * });
  1390. */
  1391. function flattenReduce(geojson, callback, initialValue) {
  1392. var previousValue = initialValue;
  1393. flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
  1394. if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  1395. else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
  1396. });
  1397. return previousValue;
  1398. }
  1399. /**
  1400. * Callback for segmentEach
  1401. *
  1402. * @callback segmentEachCallback
  1403. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  1404. * @param {number} featureIndex The current index of the Feature being processed.
  1405. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  1406. * @param {number} geometryIndex The current index of the Geometry being processed.
  1407. * @param {number} segmentIndex The current index of the Segment being processed.
  1408. * @returns {void}
  1409. */
  1410. /**
  1411. * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
  1412. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  1413. *
  1414. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  1415. * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
  1416. * @returns {void}
  1417. * @example
  1418. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  1419. *
  1420. * // Iterate over GeoJSON by 2-vertex segments
  1421. * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  1422. * //=currentSegment
  1423. * //=featureIndex
  1424. * //=multiFeatureIndex
  1425. * //=geometryIndex
  1426. * //=segmentIndex
  1427. * });
  1428. *
  1429. * // Calculate the total number of segments
  1430. * var total = 0;
  1431. * turf.segmentEach(polygon, function () {
  1432. * total++;
  1433. * });
  1434. */
  1435. function segmentEach(geojson, callback) {
  1436. flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  1437. var segmentIndex = 0;
  1438. // Exclude null Geometries
  1439. if (!feature$$1.geometry) return;
  1440. // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  1441. var type = feature$$1.geometry.type;
  1442. if (type === 'Point' || type === 'MultiPoint') return;
  1443. // Generate 2-vertex line segments
  1444. var previousCoords;
  1445. if (coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
  1446. // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
  1447. if (previousCoords === undefined) {
  1448. previousCoords = currentCoord;
  1449. return;
  1450. }
  1451. var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
  1452. if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
  1453. segmentIndex++;
  1454. previousCoords = currentCoord;
  1455. }) === false) return false;
  1456. });
  1457. }
  1458. /**
  1459. * Callback for segmentReduce
  1460. *
  1461. * The first time the callback function is called, the values provided as arguments depend
  1462. * on whether the reduce method has an initialValue argument.
  1463. *
  1464. * If an initialValue is provided to the reduce method:
  1465. * - The previousValue argument is initialValue.
  1466. * - The currentValue argument is the value of the first element present in the array.
  1467. *
  1468. * If an initialValue is not provided:
  1469. * - The previousValue argument is the value of the first element present in the array.
  1470. * - The currentValue argument is the value of the second element present in the array.
  1471. *
  1472. * @callback segmentReduceCallback
  1473. * @param {*} previousValue The accumulated value previously returned in the last invocation
  1474. * of the callback, or initialValue, if supplied.
  1475. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  1476. * @param {number} featureIndex The current index of the Feature being processed.
  1477. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  1478. * @param {number} geometryIndex The current index of the Geometry being processed.
  1479. * @param {number} segmentIndex The current index of the Segment being processed.
  1480. */
  1481. /**
  1482. * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
  1483. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  1484. *
  1485. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  1486. * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
  1487. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1488. * @returns {void}
  1489. * @example
  1490. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  1491. *
  1492. * // Iterate over GeoJSON by 2-vertex segments
  1493. * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  1494. * //= previousSegment
  1495. * //= currentSegment
  1496. * //= featureIndex
  1497. * //= multiFeatureIndex
  1498. * //= geometryIndex
  1499. * //= segmentInex
  1500. * return currentSegment
  1501. * });
  1502. *
  1503. * // Calculate the total number of segments
  1504. * var initialValue = 0
  1505. * var total = turf.segmentReduce(polygon, function (previousValue) {
  1506. * previousValue++;
  1507. * return previousValue;
  1508. * }, initialValue);
  1509. */
  1510. function segmentReduce(geojson, callback, initialValue) {
  1511. var previousValue = initialValue;
  1512. var started = false;
  1513. segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  1514. if (started === false && initialValue === undefined) previousValue = currentSegment;
  1515. else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
  1516. started = true;
  1517. });
  1518. return previousValue;
  1519. }
  1520. /**
  1521. * Callback for lineEach
  1522. *
  1523. * @callback lineEachCallback
  1524. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
  1525. * @param {number} featureIndex The current index of the Feature being processed
  1526. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  1527. * @param {number} geometryIndex The current index of the Geometry being processed
  1528. */
  1529. /**
  1530. * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
  1531. * similar to Array.forEach.
  1532. *
  1533. * @name lineEach
  1534. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  1535. * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  1536. * @example
  1537. * var multiLine = turf.multiLineString([
  1538. * [[26, 37], [35, 45]],
  1539. * [[36, 53], [38, 50], [41, 55]]
  1540. * ]);
  1541. *
  1542. * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  1543. * //=currentLine
  1544. * //=featureIndex
  1545. * //=multiFeatureIndex
  1546. * //=geometryIndex
  1547. * });
  1548. */
  1549. function lineEach(geojson, callback) {
  1550. // validation
  1551. if (!geojson) throw new Error('geojson is required');
  1552. flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  1553. if (feature$$1.geometry === null) return;
  1554. var type = feature$$1.geometry.type;
  1555. var coords = feature$$1.geometry.coordinates;
  1556. switch (type) {
  1557. case 'LineString':
  1558. if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
  1559. break;
  1560. case 'Polygon':
  1561. for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
  1562. if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  1563. }
  1564. break;
  1565. }
  1566. });
  1567. }
  1568. /**
  1569. * Callback for lineReduce
  1570. *
  1571. * The first time the callback function is called, the values provided as arguments depend
  1572. * on whether the reduce method has an initialValue argument.
  1573. *
  1574. * If an initialValue is provided to the reduce method:
  1575. * - The previousValue argument is initialValue.
  1576. * - The currentValue argument is the value of the first element present in the array.
  1577. *
  1578. * If an initialValue is not provided:
  1579. * - The previousValue argument is the value of the first element present in the array.
  1580. * - The currentValue argument is the value of the second element present in the array.
  1581. *
  1582. * @callback lineReduceCallback
  1583. * @param {*} previousValue The accumulated value previously returned in the last invocation
  1584. * of the callback, or initialValue, if supplied.
  1585. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
  1586. * @param {number} featureIndex The current index of the Feature being processed
  1587. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  1588. * @param {number} geometryIndex The current index of the Geometry being processed
  1589. */
  1590. /**
  1591. * Reduce features in any GeoJSON object, similar to Array.reduce().
  1592. *
  1593. * @name lineReduce
  1594. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  1595. * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  1596. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  1597. * @returns {*} The value that results from the reduction.
  1598. * @example
  1599. * var multiPoly = turf.multiPolygon([
  1600. * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
  1601. * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
  1602. * ]);
  1603. *
  1604. * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  1605. * //=previousValue
  1606. * //=currentLine
  1607. * //=featureIndex
  1608. * //=multiFeatureIndex
  1609. * //=geometryIndex
  1610. * return currentLine
  1611. * });
  1612. */
  1613. function lineReduce(geojson, callback, initialValue) {
  1614. var previousValue = initialValue;
  1615. lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  1616. if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
  1617. else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
  1618. });
  1619. return previousValue;
  1620. }
  1621. /**
  1622. * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
  1623. *
  1624. * Negative indexes are permitted.
  1625. * Point & MultiPoint will always return null.
  1626. *
  1627. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  1628. * @param {Object} [options={}] Optional parameters
  1629. * @param {number} [options.featureIndex=0] Feature Index
  1630. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  1631. * @param {number} [options.geometryIndex=0] Geometry Index
  1632. * @param {number} [options.segmentIndex=0] Segment Index
  1633. * @param {Object} [options.properties={}] Translate Properties to output LineString
  1634. * @param {BBox} [options.bbox={}] Translate BBox to output LineString
  1635. * @param {number|string} [options.id={}] Translate Id to output LineString
  1636. * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
  1637. * @example
  1638. * var multiLine = turf.multiLineString([
  1639. * [[10, 10], [50, 30], [30, 40]],
  1640. * [[-10, -10], [-50, -30], [-30, -40]]
  1641. * ]);
  1642. *
  1643. * // First Segment (defaults are 0)
  1644. * turf.findSegment(multiLine);
  1645. * // => Feature<LineString<[[10, 10], [50, 30]]>>
  1646. *
  1647. * // First Segment of 2nd Multi Feature
  1648. * turf.findSegment(multiLine, {multiFeatureIndex: 1});
  1649. * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
  1650. *
  1651. * // Last Segment of Last Multi Feature
  1652. * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
  1653. * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
  1654. */
  1655. function findSegment(geojson, options) {
  1656. // Optional Parameters
  1657. options = options || {};
  1658. if (!isObject(options)) throw new Error('options is invalid');
  1659. var featureIndex = options.featureIndex || 0;
  1660. var multiFeatureIndex = options.multiFeatureIndex || 0;
  1661. var geometryIndex = options.geometryIndex || 0;
  1662. var segmentIndex = options.segmentIndex || 0;
  1663. // Find FeatureIndex
  1664. var properties = options.properties;
  1665. var geometry;
  1666. switch (geojson.type) {
  1667. case 'FeatureCollection':
  1668. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  1669. properties = properties || geojson.features[featureIndex].properties;
  1670. geometry = geojson.features[featureIndex].geometry;
  1671. break;
  1672. case 'Feature':
  1673. properties = properties || geojson.properties;
  1674. geometry = geojson.geometry;
  1675. break;
  1676. case 'Point':
  1677. case 'MultiPoint':
  1678. return null;
  1679. case 'LineString':
  1680. case 'Polygon':
  1681. case 'MultiLineString':
  1682. case 'MultiPolygon':
  1683. geometry = geojson;
  1684. break;
  1685. default:
  1686. throw new Error('geojson is invalid');
  1687. }
  1688. // Find SegmentIndex
  1689. if (geometry === null) return null;
  1690. var coords = geometry.coordinates;
  1691. switch (geometry.type) {
  1692. case 'Point':
  1693. case 'MultiPoint':
  1694. return null;
  1695. case 'LineString':
  1696. if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
  1697. return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
  1698. case 'Polygon':
  1699. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  1700. if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
  1701. return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
  1702. case 'MultiLineString':
  1703. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  1704. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
  1705. return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
  1706. case 'MultiPolygon':
  1707. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  1708. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  1709. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
  1710. return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
  1711. }
  1712. throw new Error('geojson is invalid');
  1713. }
  1714. /**
  1715. * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
  1716. *
  1717. * Negative indexes are permitted.
  1718. *
  1719. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  1720. * @param {Object} [options={}] Optional parameters
  1721. * @param {number} [options.featureIndex=0] Feature Index
  1722. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  1723. * @param {number} [options.geometryIndex=0] Geometry Index
  1724. * @param {number} [options.coordIndex=0] Coord Index
  1725. * @param {Object} [options.properties={}] Translate Properties to output Point
  1726. * @param {BBox} [options.bbox={}] Translate BBox to output Point
  1727. * @param {number|string} [options.id={}] Translate Id to output Point
  1728. * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
  1729. * @example
  1730. * var multiLine = turf.multiLineString([
  1731. * [[10, 10], [50, 30], [30, 40]],
  1732. * [[-10, -10], [-50, -30], [-30, -40]]
  1733. * ]);
  1734. *
  1735. * // First Segment (defaults are 0)
  1736. * turf.findPoint(multiLine);
  1737. * // => Feature<Point<[10, 10]>>
  1738. *
  1739. * // First Segment of the 2nd Multi-Feature
  1740. * turf.findPoint(multiLine, {multiFeatureIndex: 1});
  1741. * // => Feature<Point<[-10, -10]>>
  1742. *
  1743. * // Last Segment of last Multi-Feature
  1744. * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
  1745. * // => Feature<Point<[-30, -40]>>
  1746. */
  1747. function findPoint(geojson, options) {
  1748. // Optional Parameters
  1749. options = options || {};
  1750. if (!isObject(options)) throw new Error('options is invalid');
  1751. var featureIndex = options.featureIndex || 0;
  1752. var multiFeatureIndex = options.multiFeatureIndex || 0;
  1753. var geometryIndex = options.geometryIndex || 0;
  1754. var coordIndex = options.coordIndex || 0;
  1755. // Find FeatureIndex
  1756. var properties = options.properties;
  1757. var geometry;
  1758. switch (geojson.type) {
  1759. case 'FeatureCollection':
  1760. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  1761. properties = properties || geojson.features[featureIndex].properties;
  1762. geometry = geojson.features[featureIndex].geometry;
  1763. break;
  1764. case 'Feature':
  1765. properties = properties || geojson.properties;
  1766. geometry = geojson.geometry;
  1767. break;
  1768. case 'Point':
  1769. case 'MultiPoint':
  1770. return null;
  1771. case 'LineString':
  1772. case 'Polygon':
  1773. case 'MultiLineString':
  1774. case 'MultiPolygon':
  1775. geometry = geojson;
  1776. break;
  1777. default:
  1778. throw new Error('geojson is invalid');
  1779. }
  1780. // Find Coord Index
  1781. if (geometry === null) return null;
  1782. var coords = geometry.coordinates;
  1783. switch (geometry.type) {
  1784. case 'Point':
  1785. return point(coords, properties, options);
  1786. case 'MultiPoint':
  1787. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  1788. return point(coords[multiFeatureIndex], properties, options);
  1789. case 'LineString':
  1790. if (coordIndex < 0) coordIndex = coords.length + coordIndex;
  1791. return point(coords[coordIndex], properties, options);
  1792. case 'Polygon':
  1793. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  1794. if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
  1795. return point(coords[geometryIndex][coordIndex], properties, options);
  1796. case 'MultiLineString':
  1797. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  1798. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
  1799. return point(coords[multiFeatureIndex][coordIndex], properties, options);
  1800. case 'MultiPolygon':
  1801. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  1802. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  1803. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
  1804. return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
  1805. }
  1806. throw new Error('geojson is invalid');
  1807. }
  1808. ;// CONCATENATED MODULE: ./node_modules/@turf/envelope/node_modules/@turf/bbox/main.es.js
  1809. /**
  1810. * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
  1811. *
  1812. * @name bbox
  1813. * @param {GeoJSON} geojson any GeoJSON object
  1814. * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
  1815. * @example
  1816. * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
  1817. * var bbox = turf.bbox(line);
  1818. * var bboxPolygon = turf.bboxPolygon(bbox);
  1819. *
  1820. * //addToMap
  1821. * var addToMap = [line, bboxPolygon]
  1822. */
  1823. function bbox(geojson) {
  1824. var BBox = [Infinity, Infinity, -Infinity, -Infinity];
  1825. coordEach(geojson, function (coord) {
  1826. if (BBox[0] > coord[0]) BBox[0] = coord[0];
  1827. if (BBox[1] > coord[1]) BBox[1] = coord[1];
  1828. if (BBox[2] < coord[0]) BBox[2] = coord[0];
  1829. if (BBox[3] < coord[1]) BBox[3] = coord[1];
  1830. });
  1831. return BBox;
  1832. }
  1833. /* harmony default export */ var main_es = (bbox);
  1834. ;// CONCATENATED MODULE: ./node_modules/@turf/bbox-polygon/node_modules/@turf/helpers/main.es.js
  1835. /**
  1836. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  1837. */
  1838. var main_es_earthRadius = 6371008.8;
  1839. /**
  1840. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  1841. */
  1842. var main_es_factors = {
  1843. meters: main_es_earthRadius,
  1844. metres: main_es_earthRadius,
  1845. millimeters: main_es_earthRadius * 1000,
  1846. millimetres: main_es_earthRadius * 1000,
  1847. centimeters: main_es_earthRadius * 100,
  1848. centimetres: main_es_earthRadius * 100,
  1849. kilometers: main_es_earthRadius / 1000,
  1850. kilometres: main_es_earthRadius / 1000,
  1851. miles: main_es_earthRadius / 1609.344,
  1852. nauticalmiles: main_es_earthRadius / 1852,
  1853. inches: main_es_earthRadius * 39.370,
  1854. yards: main_es_earthRadius / 1.0936,
  1855. feet: main_es_earthRadius * 3.28084,
  1856. radians: 1,
  1857. degrees: main_es_earthRadius / 111325,
  1858. };
  1859. /**
  1860. * Units of measurement factors based on 1 meter.
  1861. */
  1862. var main_es_unitsFactors = {
  1863. meters: 1,
  1864. metres: 1,
  1865. millimeters: 1000,
  1866. millimetres: 1000,
  1867. centimeters: 100,
  1868. centimetres: 100,
  1869. kilometers: 1 / 1000,
  1870. kilometres: 1 / 1000,
  1871. miles: 1 / 1609.344,
  1872. nauticalmiles: 1 / 1852,
  1873. inches: 39.370,
  1874. yards: 1 / 1.0936,
  1875. feet: 3.28084,
  1876. radians: 1 / main_es_earthRadius,
  1877. degrees: 1 / 111325,
  1878. };
  1879. /**
  1880. * Area of measurement factors based on 1 square meter.
  1881. */
  1882. var main_es_areaFactors = {
  1883. meters: 1,
  1884. metres: 1,
  1885. millimeters: 1000000,
  1886. millimetres: 1000000,
  1887. centimeters: 10000,
  1888. centimetres: 10000,
  1889. kilometers: 0.000001,
  1890. kilometres: 0.000001,
  1891. acres: 0.000247105,
  1892. miles: 3.86e-7,
  1893. yards: 1.195990046,
  1894. feet: 10.763910417,
  1895. inches: 1550.003100006
  1896. };
  1897. /**
  1898. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  1899. *
  1900. * @name feature
  1901. * @param {Geometry} geometry input geometry
  1902. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  1903. * @param {Object} [options={}] Optional Parameters
  1904. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  1905. * @param {string|number} [options.id] Identifier associated with the Feature
  1906. * @returns {Feature} a GeoJSON Feature
  1907. * @example
  1908. * var geometry = {
  1909. * "type": "Point",
  1910. * "coordinates": [110, 50]
  1911. * };
  1912. *
  1913. * var feature = turf.feature(geometry);
  1914. *
  1915. * //=feature
  1916. */
  1917. function helpers_main_es_feature(geometry, properties, options) {
  1918. // Optional Parameters
  1919. options = options || {};
  1920. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  1921. var bbox = options.bbox;
  1922. var id = options.id;
  1923. // Validation
  1924. if (geometry === undefined) throw new Error('geometry is required');
  1925. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  1926. if (bbox) main_es_validateBBox(bbox);
  1927. if (id) main_es_validateId(id);
  1928. // Main
  1929. var feat = {type: 'Feature'};
  1930. if (id) feat.id = id;
  1931. if (bbox) feat.bbox = bbox;
  1932. feat.properties = properties || {};
  1933. feat.geometry = geometry;
  1934. return feat;
  1935. }
  1936. /**
  1937. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  1938. * For GeometryCollection type use `helpers.geometryCollection`
  1939. *
  1940. * @name geometry
  1941. * @param {string} type Geometry Type
  1942. * @param {Array<number>} coordinates Coordinates
  1943. * @param {Object} [options={}] Optional Parameters
  1944. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  1945. * @returns {Geometry} a GeoJSON Geometry
  1946. * @example
  1947. * var type = 'Point';
  1948. * var coordinates = [110, 50];
  1949. *
  1950. * var geometry = turf.geometry(type, coordinates);
  1951. *
  1952. * //=geometry
  1953. */
  1954. function main_es_geometry(type, coordinates, options) {
  1955. // Optional Parameters
  1956. options = options || {};
  1957. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  1958. var bbox = options.bbox;
  1959. // Validation
  1960. if (!type) throw new Error('type is required');
  1961. if (!coordinates) throw new Error('coordinates is required');
  1962. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  1963. if (bbox) main_es_validateBBox(bbox);
  1964. // Main
  1965. var geom;
  1966. switch (type) {
  1967. case 'Point': geom = helpers_main_es_point(coordinates).geometry; break;
  1968. case 'LineString': geom = helpers_main_es_lineString(coordinates).geometry; break;
  1969. case 'Polygon': geom = main_es_polygon(coordinates).geometry; break;
  1970. case 'MultiPoint': geom = main_es_multiPoint(coordinates).geometry; break;
  1971. case 'MultiLineString': geom = main_es_multiLineString(coordinates).geometry; break;
  1972. case 'MultiPolygon': geom = main_es_multiPolygon(coordinates).geometry; break;
  1973. default: throw new Error(type + ' is invalid');
  1974. }
  1975. if (bbox) geom.bbox = bbox;
  1976. return geom;
  1977. }
  1978. /**
  1979. * Creates a {@link Point} {@link Feature} from a Position.
  1980. *
  1981. * @name point
  1982. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  1983. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  1984. * @param {Object} [options={}] Optional Parameters
  1985. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  1986. * @param {string|number} [options.id] Identifier associated with the Feature
  1987. * @returns {Feature<Point>} a Point feature
  1988. * @example
  1989. * var point = turf.point([-75.343, 39.984]);
  1990. *
  1991. * //=point
  1992. */
  1993. function helpers_main_es_point(coordinates, properties, options) {
  1994. if (!coordinates) throw new Error('coordinates is required');
  1995. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  1996. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  1997. if (!main_es_isNumber(coordinates[0]) || !main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  1998. return helpers_main_es_feature({
  1999. type: 'Point',
  2000. coordinates: coordinates
  2001. }, properties, options);
  2002. }
  2003. /**
  2004. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  2005. *
  2006. * @name points
  2007. * @param {Array<Array<number>>} coordinates an array of Points
  2008. * @param {Object} [properties={}] Translate these properties to each Feature
  2009. * @param {Object} [options={}] Optional Parameters
  2010. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  2011. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2012. * @returns {FeatureCollection<Point>} Point Feature
  2013. * @example
  2014. * var points = turf.points([
  2015. * [-75, 39],
  2016. * [-80, 45],
  2017. * [-78, 50]
  2018. * ]);
  2019. *
  2020. * //=points
  2021. */
  2022. function main_es_points(coordinates, properties, options) {
  2023. if (!coordinates) throw new Error('coordinates is required');
  2024. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  2025. return main_es_featureCollection(coordinates.map(function (coords) {
  2026. return helpers_main_es_point(coords, properties);
  2027. }), options);
  2028. }
  2029. /**
  2030. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  2031. *
  2032. * @name polygon
  2033. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  2034. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2035. * @param {Object} [options={}] Optional Parameters
  2036. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2037. * @param {string|number} [options.id] Identifier associated with the Feature
  2038. * @returns {Feature<Polygon>} Polygon Feature
  2039. * @example
  2040. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  2041. *
  2042. * //=polygon
  2043. */
  2044. function main_es_polygon(coordinates, properties, options) {
  2045. if (!coordinates) throw new Error('coordinates is required');
  2046. for (var i = 0; i < coordinates.length; i++) {
  2047. var ring = coordinates[i];
  2048. if (ring.length < 4) {
  2049. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  2050. }
  2051. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  2052. // Check if first point of Polygon contains two numbers
  2053. if (i === 0 && j === 0 && !main_es_isNumber(ring[0][0]) || !main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  2054. if (ring[ring.length - 1][j] !== ring[0][j]) {
  2055. throw new Error('First and last Position are not equivalent.');
  2056. }
  2057. }
  2058. }
  2059. return helpers_main_es_feature({
  2060. type: 'Polygon',
  2061. coordinates: coordinates
  2062. }, properties, options);
  2063. }
  2064. /**
  2065. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  2066. *
  2067. * @name polygons
  2068. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  2069. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2070. * @param {Object} [options={}] Optional Parameters
  2071. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2072. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2073. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  2074. * @example
  2075. * var polygons = turf.polygons([
  2076. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  2077. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  2078. * ]);
  2079. *
  2080. * //=polygons
  2081. */
  2082. function main_es_polygons(coordinates, properties, options) {
  2083. if (!coordinates) throw new Error('coordinates is required');
  2084. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  2085. return main_es_featureCollection(coordinates.map(function (coords) {
  2086. return main_es_polygon(coords, properties);
  2087. }), options);
  2088. }
  2089. /**
  2090. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  2091. *
  2092. * @name lineString
  2093. * @param {Array<Array<number>>} coordinates an array of Positions
  2094. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2095. * @param {Object} [options={}] Optional Parameters
  2096. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2097. * @param {string|number} [options.id] Identifier associated with the Feature
  2098. * @returns {Feature<LineString>} LineString Feature
  2099. * @example
  2100. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  2101. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  2102. *
  2103. * //=linestring1
  2104. * //=linestring2
  2105. */
  2106. function helpers_main_es_lineString(coordinates, properties, options) {
  2107. if (!coordinates) throw new Error('coordinates is required');
  2108. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  2109. // Check if first point of LineString contains two numbers
  2110. if (!main_es_isNumber(coordinates[0][1]) || !main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  2111. return helpers_main_es_feature({
  2112. type: 'LineString',
  2113. coordinates: coordinates
  2114. }, properties, options);
  2115. }
  2116. /**
  2117. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  2118. *
  2119. * @name lineStrings
  2120. * @param {Array<Array<number>>} coordinates an array of LinearRings
  2121. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2122. * @param {Object} [options={}] Optional Parameters
  2123. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  2124. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2125. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  2126. * @example
  2127. * var linestrings = turf.lineStrings([
  2128. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  2129. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  2130. * ]);
  2131. *
  2132. * //=linestrings
  2133. */
  2134. function main_es_lineStrings(coordinates, properties, options) {
  2135. if (!coordinates) throw new Error('coordinates is required');
  2136. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  2137. return main_es_featureCollection(coordinates.map(function (coords) {
  2138. return helpers_main_es_lineString(coords, properties);
  2139. }), options);
  2140. }
  2141. /**
  2142. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  2143. *
  2144. * @name featureCollection
  2145. * @param {Feature[]} features input features
  2146. * @param {Object} [options={}] Optional Parameters
  2147. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2148. * @param {string|number} [options.id] Identifier associated with the Feature
  2149. * @returns {FeatureCollection} FeatureCollection of Features
  2150. * @example
  2151. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  2152. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  2153. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  2154. *
  2155. * var collection = turf.featureCollection([
  2156. * locationA,
  2157. * locationB,
  2158. * locationC
  2159. * ]);
  2160. *
  2161. * //=collection
  2162. */
  2163. function main_es_featureCollection(features, options) {
  2164. // Optional Parameters
  2165. options = options || {};
  2166. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  2167. var bbox = options.bbox;
  2168. var id = options.id;
  2169. // Validation
  2170. if (!features) throw new Error('No features passed');
  2171. if (!Array.isArray(features)) throw new Error('features must be an Array');
  2172. if (bbox) main_es_validateBBox(bbox);
  2173. if (id) main_es_validateId(id);
  2174. // Main
  2175. var fc = {type: 'FeatureCollection'};
  2176. if (id) fc.id = id;
  2177. if (bbox) fc.bbox = bbox;
  2178. fc.features = features;
  2179. return fc;
  2180. }
  2181. /**
  2182. * Creates a {@link Feature<MultiLineString>} based on a
  2183. * coordinate array. Properties can be added optionally.
  2184. *
  2185. * @name multiLineString
  2186. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  2187. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2188. * @param {Object} [options={}] Optional Parameters
  2189. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2190. * @param {string|number} [options.id] Identifier associated with the Feature
  2191. * @returns {Feature<MultiLineString>} a MultiLineString feature
  2192. * @throws {Error} if no coordinates are passed
  2193. * @example
  2194. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  2195. *
  2196. * //=multiLine
  2197. */
  2198. function main_es_multiLineString(coordinates, properties, options) {
  2199. if (!coordinates) throw new Error('coordinates is required');
  2200. return helpers_main_es_feature({
  2201. type: 'MultiLineString',
  2202. coordinates: coordinates
  2203. }, properties, options);
  2204. }
  2205. /**
  2206. * Creates a {@link Feature<MultiPoint>} based on a
  2207. * coordinate array. Properties can be added optionally.
  2208. *
  2209. * @name multiPoint
  2210. * @param {Array<Array<number>>} coordinates an array of Positions
  2211. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2212. * @param {Object} [options={}] Optional Parameters
  2213. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2214. * @param {string|number} [options.id] Identifier associated with the Feature
  2215. * @returns {Feature<MultiPoint>} a MultiPoint feature
  2216. * @throws {Error} if no coordinates are passed
  2217. * @example
  2218. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  2219. *
  2220. * //=multiPt
  2221. */
  2222. function main_es_multiPoint(coordinates, properties, options) {
  2223. if (!coordinates) throw new Error('coordinates is required');
  2224. return helpers_main_es_feature({
  2225. type: 'MultiPoint',
  2226. coordinates: coordinates
  2227. }, properties, options);
  2228. }
  2229. /**
  2230. * Creates a {@link Feature<MultiPolygon>} based on a
  2231. * coordinate array. Properties can be added optionally.
  2232. *
  2233. * @name multiPolygon
  2234. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  2235. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2236. * @param {Object} [options={}] Optional Parameters
  2237. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2238. * @param {string|number} [options.id] Identifier associated with the Feature
  2239. * @returns {Feature<MultiPolygon>} a multipolygon feature
  2240. * @throws {Error} if no coordinates are passed
  2241. * @example
  2242. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  2243. *
  2244. * //=multiPoly
  2245. *
  2246. */
  2247. function main_es_multiPolygon(coordinates, properties, options) {
  2248. if (!coordinates) throw new Error('coordinates is required');
  2249. return helpers_main_es_feature({
  2250. type: 'MultiPolygon',
  2251. coordinates: coordinates
  2252. }, properties, options);
  2253. }
  2254. /**
  2255. * Creates a {@link Feature<GeometryCollection>} based on a
  2256. * coordinate array. Properties can be added optionally.
  2257. *
  2258. * @name geometryCollection
  2259. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  2260. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2261. * @param {Object} [options={}] Optional Parameters
  2262. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2263. * @param {string|number} [options.id] Identifier associated with the Feature
  2264. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  2265. * @example
  2266. * var pt = {
  2267. * "type": "Point",
  2268. * "coordinates": [100, 0]
  2269. * };
  2270. * var line = {
  2271. * "type": "LineString",
  2272. * "coordinates": [ [101, 0], [102, 1] ]
  2273. * };
  2274. * var collection = turf.geometryCollection([pt, line]);
  2275. *
  2276. * //=collection
  2277. */
  2278. function main_es_geometryCollection(geometries, properties, options) {
  2279. if (!geometries) throw new Error('geometries is required');
  2280. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  2281. return helpers_main_es_feature({
  2282. type: 'GeometryCollection',
  2283. geometries: geometries
  2284. }, properties, options);
  2285. }
  2286. /**
  2287. * Round number to precision
  2288. *
  2289. * @param {number} num Number
  2290. * @param {number} [precision=0] Precision
  2291. * @returns {number} rounded number
  2292. * @example
  2293. * turf.round(120.4321)
  2294. * //=120
  2295. *
  2296. * turf.round(120.4321, 2)
  2297. * //=120.43
  2298. */
  2299. function main_es_round(num, precision) {
  2300. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  2301. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  2302. var multiplier = Math.pow(10, precision || 0);
  2303. return Math.round(num * multiplier) / multiplier;
  2304. }
  2305. /**
  2306. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  2307. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  2308. *
  2309. * @name radiansToLength
  2310. * @param {number} radians in radians across the sphere
  2311. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  2312. * @returns {number} distance
  2313. */
  2314. function main_es_radiansToLength(radians, units) {
  2315. if (radians === undefined || radians === null) throw new Error('radians is required');
  2316. if (units && typeof units !== 'string') throw new Error('units must be a string');
  2317. var factor = main_es_factors[units || 'kilometers'];
  2318. if (!factor) throw new Error(units + ' units is invalid');
  2319. return radians * factor;
  2320. }
  2321. /**
  2322. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  2323. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  2324. *
  2325. * @name lengthToRadians
  2326. * @param {number} distance in real units
  2327. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  2328. * @returns {number} radians
  2329. */
  2330. function main_es_lengthToRadians(distance, units) {
  2331. if (distance === undefined || distance === null) throw new Error('distance is required');
  2332. if (units && typeof units !== 'string') throw new Error('units must be a string');
  2333. var factor = main_es_factors[units || 'kilometers'];
  2334. if (!factor) throw new Error(units + ' units is invalid');
  2335. return distance / factor;
  2336. }
  2337. /**
  2338. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  2339. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  2340. *
  2341. * @name lengthToDegrees
  2342. * @param {number} distance in real units
  2343. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  2344. * @returns {number} degrees
  2345. */
  2346. function main_es_lengthToDegrees(distance, units) {
  2347. return main_es_radiansToDegrees(main_es_lengthToRadians(distance, units));
  2348. }
  2349. /**
  2350. * Converts any bearing angle from the north line direction (positive clockwise)
  2351. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  2352. *
  2353. * @name bearingToAzimuth
  2354. * @param {number} bearing angle, between -180 and +180 degrees
  2355. * @returns {number} angle between 0 and 360 degrees
  2356. */
  2357. function main_es_bearingToAzimuth(bearing) {
  2358. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  2359. var angle = bearing % 360;
  2360. if (angle < 0) angle += 360;
  2361. return angle;
  2362. }
  2363. /**
  2364. * Converts an angle in radians to degrees
  2365. *
  2366. * @name radiansToDegrees
  2367. * @param {number} radians angle in radians
  2368. * @returns {number} degrees between 0 and 360 degrees
  2369. */
  2370. function main_es_radiansToDegrees(radians) {
  2371. if (radians === null || radians === undefined) throw new Error('radians is required');
  2372. var degrees = radians % (2 * Math.PI);
  2373. return degrees * 180 / Math.PI;
  2374. }
  2375. /**
  2376. * Converts an angle in degrees to radians
  2377. *
  2378. * @name degreesToRadians
  2379. * @param {number} degrees angle between 0 and 360 degrees
  2380. * @returns {number} angle in radians
  2381. */
  2382. function main_es_degreesToRadians(degrees) {
  2383. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  2384. var radians = degrees % 360;
  2385. return radians * Math.PI / 180;
  2386. }
  2387. /**
  2388. * Converts a length to the requested unit.
  2389. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  2390. *
  2391. * @param {number} length to be converted
  2392. * @param {string} originalUnit of the length
  2393. * @param {string} [finalUnit='kilometers'] returned unit
  2394. * @returns {number} the converted length
  2395. */
  2396. function main_es_convertLength(length, originalUnit, finalUnit) {
  2397. if (length === null || length === undefined) throw new Error('length is required');
  2398. if (!(length >= 0)) throw new Error('length must be a positive number');
  2399. return main_es_radiansToLength(main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  2400. }
  2401. /**
  2402. * Converts a area to the requested unit.
  2403. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  2404. * @param {number} area to be converted
  2405. * @param {string} [originalUnit='meters'] of the distance
  2406. * @param {string} [finalUnit='kilometers'] returned unit
  2407. * @returns {number} the converted distance
  2408. */
  2409. function main_es_convertArea(area, originalUnit, finalUnit) {
  2410. if (area === null || area === undefined) throw new Error('area is required');
  2411. if (!(area >= 0)) throw new Error('area must be a positive number');
  2412. var startFactor = main_es_areaFactors[originalUnit || 'meters'];
  2413. if (!startFactor) throw new Error('invalid original units');
  2414. var finalFactor = main_es_areaFactors[finalUnit || 'kilometers'];
  2415. if (!finalFactor) throw new Error('invalid final units');
  2416. return (area / startFactor) * finalFactor;
  2417. }
  2418. /**
  2419. * isNumber
  2420. *
  2421. * @param {*} num Number to validate
  2422. * @returns {boolean} true/false
  2423. * @example
  2424. * turf.isNumber(123)
  2425. * //=true
  2426. * turf.isNumber('foo')
  2427. * //=false
  2428. */
  2429. function main_es_isNumber(num) {
  2430. return !isNaN(num) && num !== null && !Array.isArray(num);
  2431. }
  2432. /**
  2433. * isObject
  2434. *
  2435. * @param {*} input variable to validate
  2436. * @returns {boolean} true/false
  2437. * @example
  2438. * turf.isObject({elevation: 10})
  2439. * //=true
  2440. * turf.isObject('foo')
  2441. * //=false
  2442. */
  2443. function helpers_main_es_isObject(input) {
  2444. return (!!input) && (input.constructor === Object);
  2445. }
  2446. /**
  2447. * Validate BBox
  2448. *
  2449. * @private
  2450. * @param {Array<number>} bbox BBox to validate
  2451. * @returns {void}
  2452. * @throws Error if BBox is not valid
  2453. * @example
  2454. * validateBBox([-180, -40, 110, 50])
  2455. * //=OK
  2456. * validateBBox([-180, -40])
  2457. * //=Error
  2458. * validateBBox('Foo')
  2459. * //=Error
  2460. * validateBBox(5)
  2461. * //=Error
  2462. * validateBBox(null)
  2463. * //=Error
  2464. * validateBBox(undefined)
  2465. * //=Error
  2466. */
  2467. function main_es_validateBBox(bbox) {
  2468. if (!bbox) throw new Error('bbox is required');
  2469. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  2470. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  2471. bbox.forEach(function (num) {
  2472. if (!main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  2473. });
  2474. }
  2475. /**
  2476. * Validate Id
  2477. *
  2478. * @private
  2479. * @param {string|number} id Id to validate
  2480. * @returns {void}
  2481. * @throws Error if Id is not valid
  2482. * @example
  2483. * validateId([-180, -40, 110, 50])
  2484. * //=Error
  2485. * validateId([-180, -40])
  2486. * //=Error
  2487. * validateId('Foo')
  2488. * //=OK
  2489. * validateId(5)
  2490. * //=OK
  2491. * validateId(null)
  2492. * //=Error
  2493. * validateId(undefined)
  2494. * //=Error
  2495. */
  2496. function main_es_validateId(id) {
  2497. if (!id) throw new Error('id is required');
  2498. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  2499. }
  2500. // Deprecated methods
  2501. function main_es_radians2degrees() {
  2502. throw new Error('method has been renamed to `radiansToDegrees`');
  2503. }
  2504. function main_es_degrees2radians() {
  2505. throw new Error('method has been renamed to `degreesToRadians`');
  2506. }
  2507. function main_es_distanceToDegrees() {
  2508. throw new Error('method has been renamed to `lengthToDegrees`');
  2509. }
  2510. function main_es_distanceToRadians() {
  2511. throw new Error('method has been renamed to `lengthToRadians`');
  2512. }
  2513. function main_es_radiansToDistance() {
  2514. throw new Error('method has been renamed to `radiansToLength`');
  2515. }
  2516. function main_es_bearingToAngle() {
  2517. throw new Error('method has been renamed to `bearingToAzimuth`');
  2518. }
  2519. function main_es_convertDistance() {
  2520. throw new Error('method has been renamed to `convertLength`');
  2521. }
  2522. ;// CONCATENATED MODULE: ./node_modules/@turf/bbox-polygon/main.es.js
  2523. /**
  2524. * Takes a bbox and returns an equivalent {@link Polygon|polygon}.
  2525. *
  2526. * @name bboxPolygon
  2527. * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
  2528. * @returns {Feature<Polygon>} a Polygon representation of the bounding box
  2529. * @example
  2530. * var bbox = [0, 0, 10, 10];
  2531. *
  2532. * var poly = turf.bboxPolygon(bbox);
  2533. *
  2534. * //addToMap
  2535. * var addToMap = [poly]
  2536. */
  2537. function bboxPolygon(bbox) {
  2538. main_es_validateBBox(bbox);
  2539. // Convert BBox positions to Numbers
  2540. // No performance loss for including Number()
  2541. // https://github.com/Turfjs/turf/issues/1119
  2542. var west = Number(bbox[0]);
  2543. var south = Number(bbox[1]);
  2544. var east = Number(bbox[2]);
  2545. var north = Number(bbox[3]);
  2546. if (bbox.length === 6) throw new Error('@turf/bbox-polygon does not support BBox with 6 positions');
  2547. var lowLeft = [west, south];
  2548. var topLeft = [west, north];
  2549. var topRight = [east, north];
  2550. var lowRight = [east, south];
  2551. return main_es_polygon([[
  2552. lowLeft,
  2553. lowRight,
  2554. topRight,
  2555. topLeft,
  2556. lowLeft
  2557. ]]);
  2558. }
  2559. /* harmony default export */ var bbox_polygon_main_es = (bboxPolygon);
  2560. ;// CONCATENATED MODULE: ./node_modules/@turf/envelope/main.es.js
  2561. /**
  2562. * Takes any number of features and returns a rectangular {@link Polygon} that encompasses all vertices.
  2563. *
  2564. * @name envelope
  2565. * @param {GeoJSON} geojson input features
  2566. * @returns {Feature<Polygon>} a rectangular Polygon feature that encompasses all vertices
  2567. * @example
  2568. * var features = turf.featureCollection([
  2569. * turf.point([-75.343, 39.984], {"name": "Location A"}),
  2570. * turf.point([-75.833, 39.284], {"name": "Location B"}),
  2571. * turf.point([-75.534, 39.123], {"name": "Location C"})
  2572. * ]);
  2573. *
  2574. * var enveloped = turf.envelope(features);
  2575. *
  2576. * //addToMap
  2577. * var addToMap = [features, enveloped];
  2578. */
  2579. function envelope(geojson) {
  2580. return bbox_polygon_main_es(main_es(geojson));
  2581. }
  2582. /* harmony default export */ var envelope_main_es = (envelope);
  2583. /***/ }),
  2584. /***/ 4102:
  2585. /***/ (function(__unused_webpack_module, exports) {
  2586. "use strict";
  2587. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2588. /**
  2589. * @module helpers
  2590. */
  2591. /**
  2592. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  2593. *
  2594. * @memberof helpers
  2595. * @type {number}
  2596. */
  2597. exports.earthRadius = 6371008.8;
  2598. /**
  2599. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  2600. *
  2601. * @memberof helpers
  2602. * @type {Object}
  2603. */
  2604. exports.factors = {
  2605. centimeters: exports.earthRadius * 100,
  2606. centimetres: exports.earthRadius * 100,
  2607. degrees: exports.earthRadius / 111325,
  2608. feet: exports.earthRadius * 3.28084,
  2609. inches: exports.earthRadius * 39.37,
  2610. kilometers: exports.earthRadius / 1000,
  2611. kilometres: exports.earthRadius / 1000,
  2612. meters: exports.earthRadius,
  2613. metres: exports.earthRadius,
  2614. miles: exports.earthRadius / 1609.344,
  2615. millimeters: exports.earthRadius * 1000,
  2616. millimetres: exports.earthRadius * 1000,
  2617. nauticalmiles: exports.earthRadius / 1852,
  2618. radians: 1,
  2619. yards: exports.earthRadius * 1.0936,
  2620. };
  2621. /**
  2622. * Units of measurement factors based on 1 meter.
  2623. *
  2624. * @memberof helpers
  2625. * @type {Object}
  2626. */
  2627. exports.unitsFactors = {
  2628. centimeters: 100,
  2629. centimetres: 100,
  2630. degrees: 1 / 111325,
  2631. feet: 3.28084,
  2632. inches: 39.37,
  2633. kilometers: 1 / 1000,
  2634. kilometres: 1 / 1000,
  2635. meters: 1,
  2636. metres: 1,
  2637. miles: 1 / 1609.344,
  2638. millimeters: 1000,
  2639. millimetres: 1000,
  2640. nauticalmiles: 1 / 1852,
  2641. radians: 1 / exports.earthRadius,
  2642. yards: 1.0936133,
  2643. };
  2644. /**
  2645. * Area of measurement factors based on 1 square meter.
  2646. *
  2647. * @memberof helpers
  2648. * @type {Object}
  2649. */
  2650. exports.areaFactors = {
  2651. acres: 0.000247105,
  2652. centimeters: 10000,
  2653. centimetres: 10000,
  2654. feet: 10.763910417,
  2655. hectares: 0.0001,
  2656. inches: 1550.003100006,
  2657. kilometers: 0.000001,
  2658. kilometres: 0.000001,
  2659. meters: 1,
  2660. metres: 1,
  2661. miles: 3.86e-7,
  2662. millimeters: 1000000,
  2663. millimetres: 1000000,
  2664. yards: 1.195990046,
  2665. };
  2666. /**
  2667. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  2668. *
  2669. * @name feature
  2670. * @param {Geometry} geometry input geometry
  2671. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2672. * @param {Object} [options={}] Optional Parameters
  2673. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2674. * @param {string|number} [options.id] Identifier associated with the Feature
  2675. * @returns {Feature} a GeoJSON Feature
  2676. * @example
  2677. * var geometry = {
  2678. * "type": "Point",
  2679. * "coordinates": [110, 50]
  2680. * };
  2681. *
  2682. * var feature = turf.feature(geometry);
  2683. *
  2684. * //=feature
  2685. */
  2686. function feature(geom, properties, options) {
  2687. if (options === void 0) { options = {}; }
  2688. var feat = { type: "Feature" };
  2689. if (options.id === 0 || options.id) {
  2690. feat.id = options.id;
  2691. }
  2692. if (options.bbox) {
  2693. feat.bbox = options.bbox;
  2694. }
  2695. feat.properties = properties || {};
  2696. feat.geometry = geom;
  2697. return feat;
  2698. }
  2699. exports.feature = feature;
  2700. /**
  2701. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  2702. * For GeometryCollection type use `helpers.geometryCollection`
  2703. *
  2704. * @name geometry
  2705. * @param {string} type Geometry Type
  2706. * @param {Array<any>} coordinates Coordinates
  2707. * @param {Object} [options={}] Optional Parameters
  2708. * @returns {Geometry} a GeoJSON Geometry
  2709. * @example
  2710. * var type = "Point";
  2711. * var coordinates = [110, 50];
  2712. * var geometry = turf.geometry(type, coordinates);
  2713. * // => geometry
  2714. */
  2715. function geometry(type, coordinates, _options) {
  2716. if (_options === void 0) { _options = {}; }
  2717. switch (type) {
  2718. case "Point":
  2719. return point(coordinates).geometry;
  2720. case "LineString":
  2721. return lineString(coordinates).geometry;
  2722. case "Polygon":
  2723. return polygon(coordinates).geometry;
  2724. case "MultiPoint":
  2725. return multiPoint(coordinates).geometry;
  2726. case "MultiLineString":
  2727. return multiLineString(coordinates).geometry;
  2728. case "MultiPolygon":
  2729. return multiPolygon(coordinates).geometry;
  2730. default:
  2731. throw new Error(type + " is invalid");
  2732. }
  2733. }
  2734. exports.geometry = geometry;
  2735. /**
  2736. * Creates a {@link Point} {@link Feature} from a Position.
  2737. *
  2738. * @name point
  2739. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  2740. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2741. * @param {Object} [options={}] Optional Parameters
  2742. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2743. * @param {string|number} [options.id] Identifier associated with the Feature
  2744. * @returns {Feature<Point>} a Point feature
  2745. * @example
  2746. * var point = turf.point([-75.343, 39.984]);
  2747. *
  2748. * //=point
  2749. */
  2750. function point(coordinates, properties, options) {
  2751. if (options === void 0) { options = {}; }
  2752. if (!coordinates) {
  2753. throw new Error("coordinates is required");
  2754. }
  2755. if (!Array.isArray(coordinates)) {
  2756. throw new Error("coordinates must be an Array");
  2757. }
  2758. if (coordinates.length < 2) {
  2759. throw new Error("coordinates must be at least 2 numbers long");
  2760. }
  2761. if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {
  2762. throw new Error("coordinates must contain numbers");
  2763. }
  2764. var geom = {
  2765. type: "Point",
  2766. coordinates: coordinates,
  2767. };
  2768. return feature(geom, properties, options);
  2769. }
  2770. exports.point = point;
  2771. /**
  2772. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  2773. *
  2774. * @name points
  2775. * @param {Array<Array<number>>} coordinates an array of Points
  2776. * @param {Object} [properties={}] Translate these properties to each Feature
  2777. * @param {Object} [options={}] Optional Parameters
  2778. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
  2779. * associated with the FeatureCollection
  2780. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2781. * @returns {FeatureCollection<Point>} Point Feature
  2782. * @example
  2783. * var points = turf.points([
  2784. * [-75, 39],
  2785. * [-80, 45],
  2786. * [-78, 50]
  2787. * ]);
  2788. *
  2789. * //=points
  2790. */
  2791. function points(coordinates, properties, options) {
  2792. if (options === void 0) { options = {}; }
  2793. return featureCollection(coordinates.map(function (coords) {
  2794. return point(coords, properties);
  2795. }), options);
  2796. }
  2797. exports.points = points;
  2798. /**
  2799. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  2800. *
  2801. * @name polygon
  2802. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  2803. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2804. * @param {Object} [options={}] Optional Parameters
  2805. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2806. * @param {string|number} [options.id] Identifier associated with the Feature
  2807. * @returns {Feature<Polygon>} Polygon Feature
  2808. * @example
  2809. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  2810. *
  2811. * //=polygon
  2812. */
  2813. function polygon(coordinates, properties, options) {
  2814. if (options === void 0) { options = {}; }
  2815. for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
  2816. var ring = coordinates_1[_i];
  2817. if (ring.length < 4) {
  2818. throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
  2819. }
  2820. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  2821. // Check if first point of Polygon contains two numbers
  2822. if (ring[ring.length - 1][j] !== ring[0][j]) {
  2823. throw new Error("First and last Position are not equivalent.");
  2824. }
  2825. }
  2826. }
  2827. var geom = {
  2828. type: "Polygon",
  2829. coordinates: coordinates,
  2830. };
  2831. return feature(geom, properties, options);
  2832. }
  2833. exports.polygon = polygon;
  2834. /**
  2835. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  2836. *
  2837. * @name polygons
  2838. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  2839. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2840. * @param {Object} [options={}] Optional Parameters
  2841. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2842. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2843. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  2844. * @example
  2845. * var polygons = turf.polygons([
  2846. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  2847. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  2848. * ]);
  2849. *
  2850. * //=polygons
  2851. */
  2852. function polygons(coordinates, properties, options) {
  2853. if (options === void 0) { options = {}; }
  2854. return featureCollection(coordinates.map(function (coords) {
  2855. return polygon(coords, properties);
  2856. }), options);
  2857. }
  2858. exports.polygons = polygons;
  2859. /**
  2860. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  2861. *
  2862. * @name lineString
  2863. * @param {Array<Array<number>>} coordinates an array of Positions
  2864. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2865. * @param {Object} [options={}] Optional Parameters
  2866. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2867. * @param {string|number} [options.id] Identifier associated with the Feature
  2868. * @returns {Feature<LineString>} LineString Feature
  2869. * @example
  2870. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  2871. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  2872. *
  2873. * //=linestring1
  2874. * //=linestring2
  2875. */
  2876. function lineString(coordinates, properties, options) {
  2877. if (options === void 0) { options = {}; }
  2878. if (coordinates.length < 2) {
  2879. throw new Error("coordinates must be an array of two or more positions");
  2880. }
  2881. var geom = {
  2882. type: "LineString",
  2883. coordinates: coordinates,
  2884. };
  2885. return feature(geom, properties, options);
  2886. }
  2887. exports.lineString = lineString;
  2888. /**
  2889. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  2890. *
  2891. * @name lineStrings
  2892. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  2893. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2894. * @param {Object} [options={}] Optional Parameters
  2895. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
  2896. * associated with the FeatureCollection
  2897. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  2898. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  2899. * @example
  2900. * var linestrings = turf.lineStrings([
  2901. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  2902. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  2903. * ]);
  2904. *
  2905. * //=linestrings
  2906. */
  2907. function lineStrings(coordinates, properties, options) {
  2908. if (options === void 0) { options = {}; }
  2909. return featureCollection(coordinates.map(function (coords) {
  2910. return lineString(coords, properties);
  2911. }), options);
  2912. }
  2913. exports.lineStrings = lineStrings;
  2914. /**
  2915. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  2916. *
  2917. * @name featureCollection
  2918. * @param {Feature[]} features input features
  2919. * @param {Object} [options={}] Optional Parameters
  2920. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2921. * @param {string|number} [options.id] Identifier associated with the Feature
  2922. * @returns {FeatureCollection} FeatureCollection of Features
  2923. * @example
  2924. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  2925. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  2926. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  2927. *
  2928. * var collection = turf.featureCollection([
  2929. * locationA,
  2930. * locationB,
  2931. * locationC
  2932. * ]);
  2933. *
  2934. * //=collection
  2935. */
  2936. function featureCollection(features, options) {
  2937. if (options === void 0) { options = {}; }
  2938. var fc = { type: "FeatureCollection" };
  2939. if (options.id) {
  2940. fc.id = options.id;
  2941. }
  2942. if (options.bbox) {
  2943. fc.bbox = options.bbox;
  2944. }
  2945. fc.features = features;
  2946. return fc;
  2947. }
  2948. exports.featureCollection = featureCollection;
  2949. /**
  2950. * Creates a {@link Feature<MultiLineString>} based on a
  2951. * coordinate array. Properties can be added optionally.
  2952. *
  2953. * @name multiLineString
  2954. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  2955. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2956. * @param {Object} [options={}] Optional Parameters
  2957. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2958. * @param {string|number} [options.id] Identifier associated with the Feature
  2959. * @returns {Feature<MultiLineString>} a MultiLineString feature
  2960. * @throws {Error} if no coordinates are passed
  2961. * @example
  2962. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  2963. *
  2964. * //=multiLine
  2965. */
  2966. function multiLineString(coordinates, properties, options) {
  2967. if (options === void 0) { options = {}; }
  2968. var geom = {
  2969. type: "MultiLineString",
  2970. coordinates: coordinates,
  2971. };
  2972. return feature(geom, properties, options);
  2973. }
  2974. exports.multiLineString = multiLineString;
  2975. /**
  2976. * Creates a {@link Feature<MultiPoint>} based on a
  2977. * coordinate array. Properties can be added optionally.
  2978. *
  2979. * @name multiPoint
  2980. * @param {Array<Array<number>>} coordinates an array of Positions
  2981. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  2982. * @param {Object} [options={}] Optional Parameters
  2983. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  2984. * @param {string|number} [options.id] Identifier associated with the Feature
  2985. * @returns {Feature<MultiPoint>} a MultiPoint feature
  2986. * @throws {Error} if no coordinates are passed
  2987. * @example
  2988. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  2989. *
  2990. * //=multiPt
  2991. */
  2992. function multiPoint(coordinates, properties, options) {
  2993. if (options === void 0) { options = {}; }
  2994. var geom = {
  2995. type: "MultiPoint",
  2996. coordinates: coordinates,
  2997. };
  2998. return feature(geom, properties, options);
  2999. }
  3000. exports.multiPoint = multiPoint;
  3001. /**
  3002. * Creates a {@link Feature<MultiPolygon>} based on a
  3003. * coordinate array. Properties can be added optionally.
  3004. *
  3005. * @name multiPolygon
  3006. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  3007. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  3008. * @param {Object} [options={}] Optional Parameters
  3009. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  3010. * @param {string|number} [options.id] Identifier associated with the Feature
  3011. * @returns {Feature<MultiPolygon>} a multipolygon feature
  3012. * @throws {Error} if no coordinates are passed
  3013. * @example
  3014. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  3015. *
  3016. * //=multiPoly
  3017. *
  3018. */
  3019. function multiPolygon(coordinates, properties, options) {
  3020. if (options === void 0) { options = {}; }
  3021. var geom = {
  3022. type: "MultiPolygon",
  3023. coordinates: coordinates,
  3024. };
  3025. return feature(geom, properties, options);
  3026. }
  3027. exports.multiPolygon = multiPolygon;
  3028. /**
  3029. * Creates a {@link Feature<GeometryCollection>} based on a
  3030. * coordinate array. Properties can be added optionally.
  3031. *
  3032. * @name geometryCollection
  3033. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  3034. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  3035. * @param {Object} [options={}] Optional Parameters
  3036. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  3037. * @param {string|number} [options.id] Identifier associated with the Feature
  3038. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  3039. * @example
  3040. * var pt = turf.geometry("Point", [100, 0]);
  3041. * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
  3042. * var collection = turf.geometryCollection([pt, line]);
  3043. *
  3044. * // => collection
  3045. */
  3046. function geometryCollection(geometries, properties, options) {
  3047. if (options === void 0) { options = {}; }
  3048. var geom = {
  3049. type: "GeometryCollection",
  3050. geometries: geometries,
  3051. };
  3052. return feature(geom, properties, options);
  3053. }
  3054. exports.geometryCollection = geometryCollection;
  3055. /**
  3056. * Round number to precision
  3057. *
  3058. * @param {number} num Number
  3059. * @param {number} [precision=0] Precision
  3060. * @returns {number} rounded number
  3061. * @example
  3062. * turf.round(120.4321)
  3063. * //=120
  3064. *
  3065. * turf.round(120.4321, 2)
  3066. * //=120.43
  3067. */
  3068. function round(num, precision) {
  3069. if (precision === void 0) { precision = 0; }
  3070. if (precision && !(precision >= 0)) {
  3071. throw new Error("precision must be a positive number");
  3072. }
  3073. var multiplier = Math.pow(10, precision || 0);
  3074. return Math.round(num * multiplier) / multiplier;
  3075. }
  3076. exports.round = round;
  3077. /**
  3078. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  3079. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  3080. *
  3081. * @name radiansToLength
  3082. * @param {number} radians in radians across the sphere
  3083. * @param {string} [units="kilometers"] can be degrees, radians, miles, inches, yards, metres,
  3084. * meters, kilometres, kilometers.
  3085. * @returns {number} distance
  3086. */
  3087. function radiansToLength(radians, units) {
  3088. if (units === void 0) { units = "kilometers"; }
  3089. var factor = exports.factors[units];
  3090. if (!factor) {
  3091. throw new Error(units + " units is invalid");
  3092. }
  3093. return radians * factor;
  3094. }
  3095. exports.radiansToLength = radiansToLength;
  3096. /**
  3097. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  3098. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  3099. *
  3100. * @name lengthToRadians
  3101. * @param {number} distance in real units
  3102. * @param {string} [units="kilometers"] can be degrees, radians, miles, inches, yards, metres,
  3103. * meters, kilometres, kilometers.
  3104. * @returns {number} radians
  3105. */
  3106. function lengthToRadians(distance, units) {
  3107. if (units === void 0) { units = "kilometers"; }
  3108. var factor = exports.factors[units];
  3109. if (!factor) {
  3110. throw new Error(units + " units is invalid");
  3111. }
  3112. return distance / factor;
  3113. }
  3114. exports.lengthToRadians = lengthToRadians;
  3115. /**
  3116. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  3117. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  3118. *
  3119. * @name lengthToDegrees
  3120. * @param {number} distance in real units
  3121. * @param {string} [units="kilometers"] can be degrees, radians, miles, inches, yards, metres,
  3122. * meters, kilometres, kilometers.
  3123. * @returns {number} degrees
  3124. */
  3125. function lengthToDegrees(distance, units) {
  3126. return radiansToDegrees(lengthToRadians(distance, units));
  3127. }
  3128. exports.lengthToDegrees = lengthToDegrees;
  3129. /**
  3130. * Converts any bearing angle from the north line direction (positive clockwise)
  3131. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  3132. *
  3133. * @name bearingToAzimuth
  3134. * @param {number} bearing angle, between -180 and +180 degrees
  3135. * @returns {number} angle between 0 and 360 degrees
  3136. */
  3137. function bearingToAzimuth(bearing) {
  3138. var angle = bearing % 360;
  3139. if (angle < 0) {
  3140. angle += 360;
  3141. }
  3142. return angle;
  3143. }
  3144. exports.bearingToAzimuth = bearingToAzimuth;
  3145. /**
  3146. * Converts an angle in radians to degrees
  3147. *
  3148. * @name radiansToDegrees
  3149. * @param {number} radians angle in radians
  3150. * @returns {number} degrees between 0 and 360 degrees
  3151. */
  3152. function radiansToDegrees(radians) {
  3153. var degrees = radians % (2 * Math.PI);
  3154. return (degrees * 180) / Math.PI;
  3155. }
  3156. exports.radiansToDegrees = radiansToDegrees;
  3157. /**
  3158. * Converts an angle in degrees to radians
  3159. *
  3160. * @name degreesToRadians
  3161. * @param {number} degrees angle between 0 and 360 degrees
  3162. * @returns {number} angle in radians
  3163. */
  3164. function degreesToRadians(degrees) {
  3165. var radians = degrees % 360;
  3166. return (radians * Math.PI) / 180;
  3167. }
  3168. exports.degreesToRadians = degreesToRadians;
  3169. /**
  3170. * Converts a length to the requested unit.
  3171. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  3172. *
  3173. * @param {number} length to be converted
  3174. * @param {Units} [originalUnit="kilometers"] of the length
  3175. * @param {Units} [finalUnit="kilometers"] returned unit
  3176. * @returns {number} the converted length
  3177. */
  3178. function convertLength(length, originalUnit, finalUnit) {
  3179. if (originalUnit === void 0) { originalUnit = "kilometers"; }
  3180. if (finalUnit === void 0) { finalUnit = "kilometers"; }
  3181. if (!(length >= 0)) {
  3182. throw new Error("length must be a positive number");
  3183. }
  3184. return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
  3185. }
  3186. exports.convertLength = convertLength;
  3187. /**
  3188. * Converts a area to the requested unit.
  3189. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares
  3190. * @param {number} area to be converted
  3191. * @param {Units} [originalUnit="meters"] of the distance
  3192. * @param {Units} [finalUnit="kilometers"] returned unit
  3193. * @returns {number} the converted area
  3194. */
  3195. function convertArea(area, originalUnit, finalUnit) {
  3196. if (originalUnit === void 0) { originalUnit = "meters"; }
  3197. if (finalUnit === void 0) { finalUnit = "kilometers"; }
  3198. if (!(area >= 0)) {
  3199. throw new Error("area must be a positive number");
  3200. }
  3201. var startFactor = exports.areaFactors[originalUnit];
  3202. if (!startFactor) {
  3203. throw new Error("invalid original units");
  3204. }
  3205. var finalFactor = exports.areaFactors[finalUnit];
  3206. if (!finalFactor) {
  3207. throw new Error("invalid final units");
  3208. }
  3209. return (area / startFactor) * finalFactor;
  3210. }
  3211. exports.convertArea = convertArea;
  3212. /**
  3213. * isNumber
  3214. *
  3215. * @param {*} num Number to validate
  3216. * @returns {boolean} true/false
  3217. * @example
  3218. * turf.isNumber(123)
  3219. * //=true
  3220. * turf.isNumber('foo')
  3221. * //=false
  3222. */
  3223. function isNumber(num) {
  3224. return !isNaN(num) && num !== null && !Array.isArray(num);
  3225. }
  3226. exports.isNumber = isNumber;
  3227. /**
  3228. * isObject
  3229. *
  3230. * @param {*} input variable to validate
  3231. * @returns {boolean} true/false
  3232. * @example
  3233. * turf.isObject({elevation: 10})
  3234. * //=true
  3235. * turf.isObject('foo')
  3236. * //=false
  3237. */
  3238. function isObject(input) {
  3239. return !!input && input.constructor === Object;
  3240. }
  3241. exports.isObject = isObject;
  3242. /**
  3243. * Validate BBox
  3244. *
  3245. * @private
  3246. * @param {Array<number>} bbox BBox to validate
  3247. * @returns {void}
  3248. * @throws Error if BBox is not valid
  3249. * @example
  3250. * validateBBox([-180, -40, 110, 50])
  3251. * //=OK
  3252. * validateBBox([-180, -40])
  3253. * //=Error
  3254. * validateBBox('Foo')
  3255. * //=Error
  3256. * validateBBox(5)
  3257. * //=Error
  3258. * validateBBox(null)
  3259. * //=Error
  3260. * validateBBox(undefined)
  3261. * //=Error
  3262. */
  3263. function validateBBox(bbox) {
  3264. if (!bbox) {
  3265. throw new Error("bbox is required");
  3266. }
  3267. if (!Array.isArray(bbox)) {
  3268. throw new Error("bbox must be an Array");
  3269. }
  3270. if (bbox.length !== 4 && bbox.length !== 6) {
  3271. throw new Error("bbox must be an Array of 4 or 6 numbers");
  3272. }
  3273. bbox.forEach(function (num) {
  3274. if (!isNumber(num)) {
  3275. throw new Error("bbox must only contain numbers");
  3276. }
  3277. });
  3278. }
  3279. exports.validateBBox = validateBBox;
  3280. /**
  3281. * Validate Id
  3282. *
  3283. * @private
  3284. * @param {string|number} id Id to validate
  3285. * @returns {void}
  3286. * @throws Error if Id is not valid
  3287. * @example
  3288. * validateId([-180, -40, 110, 50])
  3289. * //=Error
  3290. * validateId([-180, -40])
  3291. * //=Error
  3292. * validateId('Foo')
  3293. * //=OK
  3294. * validateId(5)
  3295. * //=OK
  3296. * validateId(null)
  3297. * //=Error
  3298. * validateId(undefined)
  3299. * //=Error
  3300. */
  3301. function validateId(id) {
  3302. if (!id) {
  3303. throw new Error("id is required");
  3304. }
  3305. if (["string", "number"].indexOf(typeof id) === -1) {
  3306. throw new Error("id must be a number or a string");
  3307. }
  3308. }
  3309. exports.validateId = validateId;
  3310. /***/ }),
  3311. /***/ 1540:
  3312. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  3313. "use strict";
  3314. Object.defineProperty(exports, "__esModule", ({ value: true }));
  3315. var helpers = __webpack_require__(4102);
  3316. /**
  3317. * Callback for coordEach
  3318. *
  3319. * @callback coordEachCallback
  3320. * @param {Array<number>} currentCoord The current coordinate being processed.
  3321. * @param {number} coordIndex The current index of the coordinate being processed.
  3322. * @param {number} featureIndex The current index of the Feature being processed.
  3323. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  3324. * @param {number} geometryIndex The current index of the Geometry being processed.
  3325. */
  3326. /**
  3327. * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
  3328. *
  3329. * @name coordEach
  3330. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3331. * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
  3332. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  3333. * @returns {void}
  3334. * @example
  3335. * var features = turf.featureCollection([
  3336. * turf.point([26, 37], {"foo": "bar"}),
  3337. * turf.point([36, 53], {"hello": "world"})
  3338. * ]);
  3339. *
  3340. * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  3341. * //=currentCoord
  3342. * //=coordIndex
  3343. * //=featureIndex
  3344. * //=multiFeatureIndex
  3345. * //=geometryIndex
  3346. * });
  3347. */
  3348. function coordEach(geojson, callback, excludeWrapCoord) {
  3349. // Handles null Geometry -- Skips this GeoJSON
  3350. if (geojson === null) return;
  3351. var j,
  3352. k,
  3353. l,
  3354. geometry,
  3355. stopG,
  3356. coords,
  3357. geometryMaybeCollection,
  3358. wrapShrink = 0,
  3359. coordIndex = 0,
  3360. isGeometryCollection,
  3361. type = geojson.type,
  3362. isFeatureCollection = type === "FeatureCollection",
  3363. isFeature = type === "Feature",
  3364. stop = isFeatureCollection ? geojson.features.length : 1;
  3365. // This logic may look a little weird. The reason why it is that way
  3366. // is because it's trying to be fast. GeoJSON supports multiple kinds
  3367. // of objects at its root: FeatureCollection, Features, Geometries.
  3368. // This function has the responsibility of handling all of them, and that
  3369. // means that some of the `for` loops you see below actually just don't apply
  3370. // to certain inputs. For instance, if you give this just a
  3371. // Point geometry, then both loops are short-circuited and all we do
  3372. // is gradually rename the input until it's called 'geometry'.
  3373. //
  3374. // This also aims to allocate as few resources as possible: just a
  3375. // few numbers and booleans, rather than any temporary arrays as would
  3376. // be required with the normalization approach.
  3377. for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
  3378. geometryMaybeCollection = isFeatureCollection
  3379. ? geojson.features[featureIndex].geometry
  3380. : isFeature
  3381. ? geojson.geometry
  3382. : geojson;
  3383. isGeometryCollection = geometryMaybeCollection
  3384. ? geometryMaybeCollection.type === "GeometryCollection"
  3385. : false;
  3386. stopG = isGeometryCollection
  3387. ? geometryMaybeCollection.geometries.length
  3388. : 1;
  3389. for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
  3390. var multiFeatureIndex = 0;
  3391. var geometryIndex = 0;
  3392. geometry = isGeometryCollection
  3393. ? geometryMaybeCollection.geometries[geomIndex]
  3394. : geometryMaybeCollection;
  3395. // Handles null Geometry -- Skips this geometry
  3396. if (geometry === null) continue;
  3397. coords = geometry.coordinates;
  3398. var geomType = geometry.type;
  3399. wrapShrink =
  3400. excludeWrapCoord &&
  3401. (geomType === "Polygon" || geomType === "MultiPolygon")
  3402. ? 1
  3403. : 0;
  3404. switch (geomType) {
  3405. case null:
  3406. break;
  3407. case "Point":
  3408. if (
  3409. callback(
  3410. coords,
  3411. coordIndex,
  3412. featureIndex,
  3413. multiFeatureIndex,
  3414. geometryIndex
  3415. ) === false
  3416. )
  3417. return false;
  3418. coordIndex++;
  3419. multiFeatureIndex++;
  3420. break;
  3421. case "LineString":
  3422. case "MultiPoint":
  3423. for (j = 0; j < coords.length; j++) {
  3424. if (
  3425. callback(
  3426. coords[j],
  3427. coordIndex,
  3428. featureIndex,
  3429. multiFeatureIndex,
  3430. geometryIndex
  3431. ) === false
  3432. )
  3433. return false;
  3434. coordIndex++;
  3435. if (geomType === "MultiPoint") multiFeatureIndex++;
  3436. }
  3437. if (geomType === "LineString") multiFeatureIndex++;
  3438. break;
  3439. case "Polygon":
  3440. case "MultiLineString":
  3441. for (j = 0; j < coords.length; j++) {
  3442. for (k = 0; k < coords[j].length - wrapShrink; k++) {
  3443. if (
  3444. callback(
  3445. coords[j][k],
  3446. coordIndex,
  3447. featureIndex,
  3448. multiFeatureIndex,
  3449. geometryIndex
  3450. ) === false
  3451. )
  3452. return false;
  3453. coordIndex++;
  3454. }
  3455. if (geomType === "MultiLineString") multiFeatureIndex++;
  3456. if (geomType === "Polygon") geometryIndex++;
  3457. }
  3458. if (geomType === "Polygon") multiFeatureIndex++;
  3459. break;
  3460. case "MultiPolygon":
  3461. for (j = 0; j < coords.length; j++) {
  3462. geometryIndex = 0;
  3463. for (k = 0; k < coords[j].length; k++) {
  3464. for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
  3465. if (
  3466. callback(
  3467. coords[j][k][l],
  3468. coordIndex,
  3469. featureIndex,
  3470. multiFeatureIndex,
  3471. geometryIndex
  3472. ) === false
  3473. )
  3474. return false;
  3475. coordIndex++;
  3476. }
  3477. geometryIndex++;
  3478. }
  3479. multiFeatureIndex++;
  3480. }
  3481. break;
  3482. case "GeometryCollection":
  3483. for (j = 0; j < geometry.geometries.length; j++)
  3484. if (
  3485. coordEach(geometry.geometries[j], callback, excludeWrapCoord) ===
  3486. false
  3487. )
  3488. return false;
  3489. break;
  3490. default:
  3491. throw new Error("Unknown Geometry Type");
  3492. }
  3493. }
  3494. }
  3495. }
  3496. /**
  3497. * Callback for coordReduce
  3498. *
  3499. * The first time the callback function is called, the values provided as arguments depend
  3500. * on whether the reduce method has an initialValue argument.
  3501. *
  3502. * If an initialValue is provided to the reduce method:
  3503. * - The previousValue argument is initialValue.
  3504. * - The currentValue argument is the value of the first element present in the array.
  3505. *
  3506. * If an initialValue is not provided:
  3507. * - The previousValue argument is the value of the first element present in the array.
  3508. * - The currentValue argument is the value of the second element present in the array.
  3509. *
  3510. * @callback coordReduceCallback
  3511. * @param {*} previousValue The accumulated value previously returned in the last invocation
  3512. * of the callback, or initialValue, if supplied.
  3513. * @param {Array<number>} currentCoord The current coordinate being processed.
  3514. * @param {number} coordIndex The current index of the coordinate being processed.
  3515. * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
  3516. * @param {number} featureIndex The current index of the Feature being processed.
  3517. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  3518. * @param {number} geometryIndex The current index of the Geometry being processed.
  3519. */
  3520. /**
  3521. * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
  3522. *
  3523. * @name coordReduce
  3524. * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
  3525. * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
  3526. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  3527. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  3528. * @returns {*} The value that results from the reduction.
  3529. * @example
  3530. * var features = turf.featureCollection([
  3531. * turf.point([26, 37], {"foo": "bar"}),
  3532. * turf.point([36, 53], {"hello": "world"})
  3533. * ]);
  3534. *
  3535. * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  3536. * //=previousValue
  3537. * //=currentCoord
  3538. * //=coordIndex
  3539. * //=featureIndex
  3540. * //=multiFeatureIndex
  3541. * //=geometryIndex
  3542. * return currentCoord;
  3543. * });
  3544. */
  3545. function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
  3546. var previousValue = initialValue;
  3547. coordEach(
  3548. geojson,
  3549. function (
  3550. currentCoord,
  3551. coordIndex,
  3552. featureIndex,
  3553. multiFeatureIndex,
  3554. geometryIndex
  3555. ) {
  3556. if (coordIndex === 0 && initialValue === undefined)
  3557. previousValue = currentCoord;
  3558. else
  3559. previousValue = callback(
  3560. previousValue,
  3561. currentCoord,
  3562. coordIndex,
  3563. featureIndex,
  3564. multiFeatureIndex,
  3565. geometryIndex
  3566. );
  3567. },
  3568. excludeWrapCoord
  3569. );
  3570. return previousValue;
  3571. }
  3572. /**
  3573. * Callback for propEach
  3574. *
  3575. * @callback propEachCallback
  3576. * @param {Object} currentProperties The current Properties being processed.
  3577. * @param {number} featureIndex The current index of the Feature being processed.
  3578. */
  3579. /**
  3580. * Iterate over properties in any GeoJSON object, similar to Array.forEach()
  3581. *
  3582. * @name propEach
  3583. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  3584. * @param {Function} callback a method that takes (currentProperties, featureIndex)
  3585. * @returns {void}
  3586. * @example
  3587. * var features = turf.featureCollection([
  3588. * turf.point([26, 37], {foo: 'bar'}),
  3589. * turf.point([36, 53], {hello: 'world'})
  3590. * ]);
  3591. *
  3592. * turf.propEach(features, function (currentProperties, featureIndex) {
  3593. * //=currentProperties
  3594. * //=featureIndex
  3595. * });
  3596. */
  3597. function propEach(geojson, callback) {
  3598. var i;
  3599. switch (geojson.type) {
  3600. case "FeatureCollection":
  3601. for (i = 0; i < geojson.features.length; i++) {
  3602. if (callback(geojson.features[i].properties, i) === false) break;
  3603. }
  3604. break;
  3605. case "Feature":
  3606. callback(geojson.properties, 0);
  3607. break;
  3608. }
  3609. }
  3610. /**
  3611. * Callback for propReduce
  3612. *
  3613. * The first time the callback function is called, the values provided as arguments depend
  3614. * on whether the reduce method has an initialValue argument.
  3615. *
  3616. * If an initialValue is provided to the reduce method:
  3617. * - The previousValue argument is initialValue.
  3618. * - The currentValue argument is the value of the first element present in the array.
  3619. *
  3620. * If an initialValue is not provided:
  3621. * - The previousValue argument is the value of the first element present in the array.
  3622. * - The currentValue argument is the value of the second element present in the array.
  3623. *
  3624. * @callback propReduceCallback
  3625. * @param {*} previousValue The accumulated value previously returned in the last invocation
  3626. * of the callback, or initialValue, if supplied.
  3627. * @param {*} currentProperties The current Properties being processed.
  3628. * @param {number} featureIndex The current index of the Feature being processed.
  3629. */
  3630. /**
  3631. * Reduce properties in any GeoJSON object into a single value,
  3632. * similar to how Array.reduce works. However, in this case we lazily run
  3633. * the reduction, so an array of all properties is unnecessary.
  3634. *
  3635. * @name propReduce
  3636. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  3637. * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
  3638. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  3639. * @returns {*} The value that results from the reduction.
  3640. * @example
  3641. * var features = turf.featureCollection([
  3642. * turf.point([26, 37], {foo: 'bar'}),
  3643. * turf.point([36, 53], {hello: 'world'})
  3644. * ]);
  3645. *
  3646. * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
  3647. * //=previousValue
  3648. * //=currentProperties
  3649. * //=featureIndex
  3650. * return currentProperties
  3651. * });
  3652. */
  3653. function propReduce(geojson, callback, initialValue) {
  3654. var previousValue = initialValue;
  3655. propEach(geojson, function (currentProperties, featureIndex) {
  3656. if (featureIndex === 0 && initialValue === undefined)
  3657. previousValue = currentProperties;
  3658. else
  3659. previousValue = callback(previousValue, currentProperties, featureIndex);
  3660. });
  3661. return previousValue;
  3662. }
  3663. /**
  3664. * Callback for featureEach
  3665. *
  3666. * @callback featureEachCallback
  3667. * @param {Feature<any>} currentFeature The current Feature being processed.
  3668. * @param {number} featureIndex The current index of the Feature being processed.
  3669. */
  3670. /**
  3671. * Iterate over features in any GeoJSON object, similar to
  3672. * Array.forEach.
  3673. *
  3674. * @name featureEach
  3675. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3676. * @param {Function} callback a method that takes (currentFeature, featureIndex)
  3677. * @returns {void}
  3678. * @example
  3679. * var features = turf.featureCollection([
  3680. * turf.point([26, 37], {foo: 'bar'}),
  3681. * turf.point([36, 53], {hello: 'world'})
  3682. * ]);
  3683. *
  3684. * turf.featureEach(features, function (currentFeature, featureIndex) {
  3685. * //=currentFeature
  3686. * //=featureIndex
  3687. * });
  3688. */
  3689. function featureEach(geojson, callback) {
  3690. if (geojson.type === "Feature") {
  3691. callback(geojson, 0);
  3692. } else if (geojson.type === "FeatureCollection") {
  3693. for (var i = 0; i < geojson.features.length; i++) {
  3694. if (callback(geojson.features[i], i) === false) break;
  3695. }
  3696. }
  3697. }
  3698. /**
  3699. * Callback for featureReduce
  3700. *
  3701. * The first time the callback function is called, the values provided as arguments depend
  3702. * on whether the reduce method has an initialValue argument.
  3703. *
  3704. * If an initialValue is provided to the reduce method:
  3705. * - The previousValue argument is initialValue.
  3706. * - The currentValue argument is the value of the first element present in the array.
  3707. *
  3708. * If an initialValue is not provided:
  3709. * - The previousValue argument is the value of the first element present in the array.
  3710. * - The currentValue argument is the value of the second element present in the array.
  3711. *
  3712. * @callback featureReduceCallback
  3713. * @param {*} previousValue The accumulated value previously returned in the last invocation
  3714. * of the callback, or initialValue, if supplied.
  3715. * @param {Feature} currentFeature The current Feature being processed.
  3716. * @param {number} featureIndex The current index of the Feature being processed.
  3717. */
  3718. /**
  3719. * Reduce features in any GeoJSON object, similar to Array.reduce().
  3720. *
  3721. * @name featureReduce
  3722. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3723. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
  3724. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  3725. * @returns {*} The value that results from the reduction.
  3726. * @example
  3727. * var features = turf.featureCollection([
  3728. * turf.point([26, 37], {"foo": "bar"}),
  3729. * turf.point([36, 53], {"hello": "world"})
  3730. * ]);
  3731. *
  3732. * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
  3733. * //=previousValue
  3734. * //=currentFeature
  3735. * //=featureIndex
  3736. * return currentFeature
  3737. * });
  3738. */
  3739. function featureReduce(geojson, callback, initialValue) {
  3740. var previousValue = initialValue;
  3741. featureEach(geojson, function (currentFeature, featureIndex) {
  3742. if (featureIndex === 0 && initialValue === undefined)
  3743. previousValue = currentFeature;
  3744. else previousValue = callback(previousValue, currentFeature, featureIndex);
  3745. });
  3746. return previousValue;
  3747. }
  3748. /**
  3749. * Get all coordinates from any GeoJSON object.
  3750. *
  3751. * @name coordAll
  3752. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3753. * @returns {Array<Array<number>>} coordinate position array
  3754. * @example
  3755. * var features = turf.featureCollection([
  3756. * turf.point([26, 37], {foo: 'bar'}),
  3757. * turf.point([36, 53], {hello: 'world'})
  3758. * ]);
  3759. *
  3760. * var coords = turf.coordAll(features);
  3761. * //= [[26, 37], [36, 53]]
  3762. */
  3763. function coordAll(geojson) {
  3764. var coords = [];
  3765. coordEach(geojson, function (coord) {
  3766. coords.push(coord);
  3767. });
  3768. return coords;
  3769. }
  3770. /**
  3771. * Callback for geomEach
  3772. *
  3773. * @callback geomEachCallback
  3774. * @param {Geometry} currentGeometry The current Geometry being processed.
  3775. * @param {number} featureIndex The current index of the Feature being processed.
  3776. * @param {Object} featureProperties The current Feature Properties being processed.
  3777. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  3778. * @param {number|string} featureId The current Feature Id being processed.
  3779. */
  3780. /**
  3781. * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
  3782. *
  3783. * @name geomEach
  3784. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3785. * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  3786. * @returns {void}
  3787. * @example
  3788. * var features = turf.featureCollection([
  3789. * turf.point([26, 37], {foo: 'bar'}),
  3790. * turf.point([36, 53], {hello: 'world'})
  3791. * ]);
  3792. *
  3793. * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  3794. * //=currentGeometry
  3795. * //=featureIndex
  3796. * //=featureProperties
  3797. * //=featureBBox
  3798. * //=featureId
  3799. * });
  3800. */
  3801. function geomEach(geojson, callback) {
  3802. var i,
  3803. j,
  3804. g,
  3805. geometry,
  3806. stopG,
  3807. geometryMaybeCollection,
  3808. isGeometryCollection,
  3809. featureProperties,
  3810. featureBBox,
  3811. featureId,
  3812. featureIndex = 0,
  3813. isFeatureCollection = geojson.type === "FeatureCollection",
  3814. isFeature = geojson.type === "Feature",
  3815. stop = isFeatureCollection ? geojson.features.length : 1;
  3816. // This logic may look a little weird. The reason why it is that way
  3817. // is because it's trying to be fast. GeoJSON supports multiple kinds
  3818. // of objects at its root: FeatureCollection, Features, Geometries.
  3819. // This function has the responsibility of handling all of them, and that
  3820. // means that some of the `for` loops you see below actually just don't apply
  3821. // to certain inputs. For instance, if you give this just a
  3822. // Point geometry, then both loops are short-circuited and all we do
  3823. // is gradually rename the input until it's called 'geometry'.
  3824. //
  3825. // This also aims to allocate as few resources as possible: just a
  3826. // few numbers and booleans, rather than any temporary arrays as would
  3827. // be required with the normalization approach.
  3828. for (i = 0; i < stop; i++) {
  3829. geometryMaybeCollection = isFeatureCollection
  3830. ? geojson.features[i].geometry
  3831. : isFeature
  3832. ? geojson.geometry
  3833. : geojson;
  3834. featureProperties = isFeatureCollection
  3835. ? geojson.features[i].properties
  3836. : isFeature
  3837. ? geojson.properties
  3838. : {};
  3839. featureBBox = isFeatureCollection
  3840. ? geojson.features[i].bbox
  3841. : isFeature
  3842. ? geojson.bbox
  3843. : undefined;
  3844. featureId = isFeatureCollection
  3845. ? geojson.features[i].id
  3846. : isFeature
  3847. ? geojson.id
  3848. : undefined;
  3849. isGeometryCollection = geometryMaybeCollection
  3850. ? geometryMaybeCollection.type === "GeometryCollection"
  3851. : false;
  3852. stopG = isGeometryCollection
  3853. ? geometryMaybeCollection.geometries.length
  3854. : 1;
  3855. for (g = 0; g < stopG; g++) {
  3856. geometry = isGeometryCollection
  3857. ? geometryMaybeCollection.geometries[g]
  3858. : geometryMaybeCollection;
  3859. // Handle null Geometry
  3860. if (geometry === null) {
  3861. if (
  3862. callback(
  3863. null,
  3864. featureIndex,
  3865. featureProperties,
  3866. featureBBox,
  3867. featureId
  3868. ) === false
  3869. )
  3870. return false;
  3871. continue;
  3872. }
  3873. switch (geometry.type) {
  3874. case "Point":
  3875. case "LineString":
  3876. case "MultiPoint":
  3877. case "Polygon":
  3878. case "MultiLineString":
  3879. case "MultiPolygon": {
  3880. if (
  3881. callback(
  3882. geometry,
  3883. featureIndex,
  3884. featureProperties,
  3885. featureBBox,
  3886. featureId
  3887. ) === false
  3888. )
  3889. return false;
  3890. break;
  3891. }
  3892. case "GeometryCollection": {
  3893. for (j = 0; j < geometry.geometries.length; j++) {
  3894. if (
  3895. callback(
  3896. geometry.geometries[j],
  3897. featureIndex,
  3898. featureProperties,
  3899. featureBBox,
  3900. featureId
  3901. ) === false
  3902. )
  3903. return false;
  3904. }
  3905. break;
  3906. }
  3907. default:
  3908. throw new Error("Unknown Geometry Type");
  3909. }
  3910. }
  3911. // Only increase `featureIndex` per each feature
  3912. featureIndex++;
  3913. }
  3914. }
  3915. /**
  3916. * Callback for geomReduce
  3917. *
  3918. * The first time the callback function is called, the values provided as arguments depend
  3919. * on whether the reduce method has an initialValue argument.
  3920. *
  3921. * If an initialValue is provided to the reduce method:
  3922. * - The previousValue argument is initialValue.
  3923. * - The currentValue argument is the value of the first element present in the array.
  3924. *
  3925. * If an initialValue is not provided:
  3926. * - The previousValue argument is the value of the first element present in the array.
  3927. * - The currentValue argument is the value of the second element present in the array.
  3928. *
  3929. * @callback geomReduceCallback
  3930. * @param {*} previousValue The accumulated value previously returned in the last invocation
  3931. * of the callback, or initialValue, if supplied.
  3932. * @param {Geometry} currentGeometry The current Geometry being processed.
  3933. * @param {number} featureIndex The current index of the Feature being processed.
  3934. * @param {Object} featureProperties The current Feature Properties being processed.
  3935. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  3936. * @param {number|string} featureId The current Feature Id being processed.
  3937. */
  3938. /**
  3939. * Reduce geometry in any GeoJSON object, similar to Array.reduce().
  3940. *
  3941. * @name geomReduce
  3942. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  3943. * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  3944. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  3945. * @returns {*} The value that results from the reduction.
  3946. * @example
  3947. * var features = turf.featureCollection([
  3948. * turf.point([26, 37], {foo: 'bar'}),
  3949. * turf.point([36, 53], {hello: 'world'})
  3950. * ]);
  3951. *
  3952. * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  3953. * //=previousValue
  3954. * //=currentGeometry
  3955. * //=featureIndex
  3956. * //=featureProperties
  3957. * //=featureBBox
  3958. * //=featureId
  3959. * return currentGeometry
  3960. * });
  3961. */
  3962. function geomReduce(geojson, callback, initialValue) {
  3963. var previousValue = initialValue;
  3964. geomEach(
  3965. geojson,
  3966. function (
  3967. currentGeometry,
  3968. featureIndex,
  3969. featureProperties,
  3970. featureBBox,
  3971. featureId
  3972. ) {
  3973. if (featureIndex === 0 && initialValue === undefined)
  3974. previousValue = currentGeometry;
  3975. else
  3976. previousValue = callback(
  3977. previousValue,
  3978. currentGeometry,
  3979. featureIndex,
  3980. featureProperties,
  3981. featureBBox,
  3982. featureId
  3983. );
  3984. }
  3985. );
  3986. return previousValue;
  3987. }
  3988. /**
  3989. * Callback for flattenEach
  3990. *
  3991. * @callback flattenEachCallback
  3992. * @param {Feature} currentFeature The current flattened feature being processed.
  3993. * @param {number} featureIndex The current index of the Feature being processed.
  3994. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  3995. */
  3996. /**
  3997. * Iterate over flattened features in any GeoJSON object, similar to
  3998. * Array.forEach.
  3999. *
  4000. * @name flattenEach
  4001. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  4002. * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
  4003. * @example
  4004. * var features = turf.featureCollection([
  4005. * turf.point([26, 37], {foo: 'bar'}),
  4006. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  4007. * ]);
  4008. *
  4009. * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
  4010. * //=currentFeature
  4011. * //=featureIndex
  4012. * //=multiFeatureIndex
  4013. * });
  4014. */
  4015. function flattenEach(geojson, callback) {
  4016. geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
  4017. // Callback for single geometry
  4018. var type = geometry === null ? null : geometry.type;
  4019. switch (type) {
  4020. case null:
  4021. case "Point":
  4022. case "LineString":
  4023. case "Polygon":
  4024. if (
  4025. callback(
  4026. helpers.feature(geometry, properties, { bbox: bbox, id: id }),
  4027. featureIndex,
  4028. 0
  4029. ) === false
  4030. )
  4031. return false;
  4032. return;
  4033. }
  4034. var geomType;
  4035. // Callback for multi-geometry
  4036. switch (type) {
  4037. case "MultiPoint":
  4038. geomType = "Point";
  4039. break;
  4040. case "MultiLineString":
  4041. geomType = "LineString";
  4042. break;
  4043. case "MultiPolygon":
  4044. geomType = "Polygon";
  4045. break;
  4046. }
  4047. for (
  4048. var multiFeatureIndex = 0;
  4049. multiFeatureIndex < geometry.coordinates.length;
  4050. multiFeatureIndex++
  4051. ) {
  4052. var coordinate = geometry.coordinates[multiFeatureIndex];
  4053. var geom = {
  4054. type: geomType,
  4055. coordinates: coordinate,
  4056. };
  4057. if (
  4058. callback(helpers.feature(geom, properties), featureIndex, multiFeatureIndex) ===
  4059. false
  4060. )
  4061. return false;
  4062. }
  4063. });
  4064. }
  4065. /**
  4066. * Callback for flattenReduce
  4067. *
  4068. * The first time the callback function is called, the values provided as arguments depend
  4069. * on whether the reduce method has an initialValue argument.
  4070. *
  4071. * If an initialValue is provided to the reduce method:
  4072. * - The previousValue argument is initialValue.
  4073. * - The currentValue argument is the value of the first element present in the array.
  4074. *
  4075. * If an initialValue is not provided:
  4076. * - The previousValue argument is the value of the first element present in the array.
  4077. * - The currentValue argument is the value of the second element present in the array.
  4078. *
  4079. * @callback flattenReduceCallback
  4080. * @param {*} previousValue The accumulated value previously returned in the last invocation
  4081. * of the callback, or initialValue, if supplied.
  4082. * @param {Feature} currentFeature The current Feature being processed.
  4083. * @param {number} featureIndex The current index of the Feature being processed.
  4084. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  4085. */
  4086. /**
  4087. * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
  4088. *
  4089. * @name flattenReduce
  4090. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  4091. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
  4092. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  4093. * @returns {*} The value that results from the reduction.
  4094. * @example
  4095. * var features = turf.featureCollection([
  4096. * turf.point([26, 37], {foo: 'bar'}),
  4097. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  4098. * ]);
  4099. *
  4100. * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
  4101. * //=previousValue
  4102. * //=currentFeature
  4103. * //=featureIndex
  4104. * //=multiFeatureIndex
  4105. * return currentFeature
  4106. * });
  4107. */
  4108. function flattenReduce(geojson, callback, initialValue) {
  4109. var previousValue = initialValue;
  4110. flattenEach(
  4111. geojson,
  4112. function (currentFeature, featureIndex, multiFeatureIndex) {
  4113. if (
  4114. featureIndex === 0 &&
  4115. multiFeatureIndex === 0 &&
  4116. initialValue === undefined
  4117. )
  4118. previousValue = currentFeature;
  4119. else
  4120. previousValue = callback(
  4121. previousValue,
  4122. currentFeature,
  4123. featureIndex,
  4124. multiFeatureIndex
  4125. );
  4126. }
  4127. );
  4128. return previousValue;
  4129. }
  4130. /**
  4131. * Callback for segmentEach
  4132. *
  4133. * @callback segmentEachCallback
  4134. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  4135. * @param {number} featureIndex The current index of the Feature being processed.
  4136. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  4137. * @param {number} geometryIndex The current index of the Geometry being processed.
  4138. * @param {number} segmentIndex The current index of the Segment being processed.
  4139. * @returns {void}
  4140. */
  4141. /**
  4142. * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
  4143. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  4144. *
  4145. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  4146. * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
  4147. * @returns {void}
  4148. * @example
  4149. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  4150. *
  4151. * // Iterate over GeoJSON by 2-vertex segments
  4152. * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  4153. * //=currentSegment
  4154. * //=featureIndex
  4155. * //=multiFeatureIndex
  4156. * //=geometryIndex
  4157. * //=segmentIndex
  4158. * });
  4159. *
  4160. * // Calculate the total number of segments
  4161. * var total = 0;
  4162. * turf.segmentEach(polygon, function () {
  4163. * total++;
  4164. * });
  4165. */
  4166. function segmentEach(geojson, callback) {
  4167. flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {
  4168. var segmentIndex = 0;
  4169. // Exclude null Geometries
  4170. if (!feature.geometry) return;
  4171. // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  4172. var type = feature.geometry.type;
  4173. if (type === "Point" || type === "MultiPoint") return;
  4174. // Generate 2-vertex line segments
  4175. var previousCoords;
  4176. var previousFeatureIndex = 0;
  4177. var previousMultiIndex = 0;
  4178. var prevGeomIndex = 0;
  4179. if (
  4180. coordEach(
  4181. feature,
  4182. function (
  4183. currentCoord,
  4184. coordIndex,
  4185. featureIndexCoord,
  4186. multiPartIndexCoord,
  4187. geometryIndex
  4188. ) {
  4189. // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
  4190. if (
  4191. previousCoords === undefined ||
  4192. featureIndex > previousFeatureIndex ||
  4193. multiPartIndexCoord > previousMultiIndex ||
  4194. geometryIndex > prevGeomIndex
  4195. ) {
  4196. previousCoords = currentCoord;
  4197. previousFeatureIndex = featureIndex;
  4198. previousMultiIndex = multiPartIndexCoord;
  4199. prevGeomIndex = geometryIndex;
  4200. segmentIndex = 0;
  4201. return;
  4202. }
  4203. var currentSegment = helpers.lineString(
  4204. [previousCoords, currentCoord],
  4205. feature.properties
  4206. );
  4207. if (
  4208. callback(
  4209. currentSegment,
  4210. featureIndex,
  4211. multiFeatureIndex,
  4212. geometryIndex,
  4213. segmentIndex
  4214. ) === false
  4215. )
  4216. return false;
  4217. segmentIndex++;
  4218. previousCoords = currentCoord;
  4219. }
  4220. ) === false
  4221. )
  4222. return false;
  4223. });
  4224. }
  4225. /**
  4226. * Callback for segmentReduce
  4227. *
  4228. * The first time the callback function is called, the values provided as arguments depend
  4229. * on whether the reduce method has an initialValue argument.
  4230. *
  4231. * If an initialValue is provided to the reduce method:
  4232. * - The previousValue argument is initialValue.
  4233. * - The currentValue argument is the value of the first element present in the array.
  4234. *
  4235. * If an initialValue is not provided:
  4236. * - The previousValue argument is the value of the first element present in the array.
  4237. * - The currentValue argument is the value of the second element present in the array.
  4238. *
  4239. * @callback segmentReduceCallback
  4240. * @param {*} previousValue The accumulated value previously returned in the last invocation
  4241. * of the callback, or initialValue, if supplied.
  4242. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  4243. * @param {number} featureIndex The current index of the Feature being processed.
  4244. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  4245. * @param {number} geometryIndex The current index of the Geometry being processed.
  4246. * @param {number} segmentIndex The current index of the Segment being processed.
  4247. */
  4248. /**
  4249. * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
  4250. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  4251. *
  4252. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  4253. * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
  4254. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  4255. * @returns {void}
  4256. * @example
  4257. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  4258. *
  4259. * // Iterate over GeoJSON by 2-vertex segments
  4260. * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  4261. * //= previousSegment
  4262. * //= currentSegment
  4263. * //= featureIndex
  4264. * //= multiFeatureIndex
  4265. * //= geometryIndex
  4266. * //= segmentIndex
  4267. * return currentSegment
  4268. * });
  4269. *
  4270. * // Calculate the total number of segments
  4271. * var initialValue = 0
  4272. * var total = turf.segmentReduce(polygon, function (previousValue) {
  4273. * previousValue++;
  4274. * return previousValue;
  4275. * }, initialValue);
  4276. */
  4277. function segmentReduce(geojson, callback, initialValue) {
  4278. var previousValue = initialValue;
  4279. var started = false;
  4280. segmentEach(
  4281. geojson,
  4282. function (
  4283. currentSegment,
  4284. featureIndex,
  4285. multiFeatureIndex,
  4286. geometryIndex,
  4287. segmentIndex
  4288. ) {
  4289. if (started === false && initialValue === undefined)
  4290. previousValue = currentSegment;
  4291. else
  4292. previousValue = callback(
  4293. previousValue,
  4294. currentSegment,
  4295. featureIndex,
  4296. multiFeatureIndex,
  4297. geometryIndex,
  4298. segmentIndex
  4299. );
  4300. started = true;
  4301. }
  4302. );
  4303. return previousValue;
  4304. }
  4305. /**
  4306. * Callback for lineEach
  4307. *
  4308. * @callback lineEachCallback
  4309. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
  4310. * @param {number} featureIndex The current index of the Feature being processed
  4311. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  4312. * @param {number} geometryIndex The current index of the Geometry being processed
  4313. */
  4314. /**
  4315. * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
  4316. * similar to Array.forEach.
  4317. *
  4318. * @name lineEach
  4319. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  4320. * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  4321. * @example
  4322. * var multiLine = turf.multiLineString([
  4323. * [[26, 37], [35, 45]],
  4324. * [[36, 53], [38, 50], [41, 55]]
  4325. * ]);
  4326. *
  4327. * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  4328. * //=currentLine
  4329. * //=featureIndex
  4330. * //=multiFeatureIndex
  4331. * //=geometryIndex
  4332. * });
  4333. */
  4334. function lineEach(geojson, callback) {
  4335. // validation
  4336. if (!geojson) throw new Error("geojson is required");
  4337. flattenEach(geojson, function (feature, featureIndex, multiFeatureIndex) {
  4338. if (feature.geometry === null) return;
  4339. var type = feature.geometry.type;
  4340. var coords = feature.geometry.coordinates;
  4341. switch (type) {
  4342. case "LineString":
  4343. if (callback(feature, featureIndex, multiFeatureIndex, 0, 0) === false)
  4344. return false;
  4345. break;
  4346. case "Polygon":
  4347. for (
  4348. var geometryIndex = 0;
  4349. geometryIndex < coords.length;
  4350. geometryIndex++
  4351. ) {
  4352. if (
  4353. callback(
  4354. helpers.lineString(coords[geometryIndex], feature.properties),
  4355. featureIndex,
  4356. multiFeatureIndex,
  4357. geometryIndex
  4358. ) === false
  4359. )
  4360. return false;
  4361. }
  4362. break;
  4363. }
  4364. });
  4365. }
  4366. /**
  4367. * Callback for lineReduce
  4368. *
  4369. * The first time the callback function is called, the values provided as arguments depend
  4370. * on whether the reduce method has an initialValue argument.
  4371. *
  4372. * If an initialValue is provided to the reduce method:
  4373. * - The previousValue argument is initialValue.
  4374. * - The currentValue argument is the value of the first element present in the array.
  4375. *
  4376. * If an initialValue is not provided:
  4377. * - The previousValue argument is the value of the first element present in the array.
  4378. * - The currentValue argument is the value of the second element present in the array.
  4379. *
  4380. * @callback lineReduceCallback
  4381. * @param {*} previousValue The accumulated value previously returned in the last invocation
  4382. * of the callback, or initialValue, if supplied.
  4383. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
  4384. * @param {number} featureIndex The current index of the Feature being processed
  4385. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  4386. * @param {number} geometryIndex The current index of the Geometry being processed
  4387. */
  4388. /**
  4389. * Reduce features in any GeoJSON object, similar to Array.reduce().
  4390. *
  4391. * @name lineReduce
  4392. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  4393. * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  4394. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  4395. * @returns {*} The value that results from the reduction.
  4396. * @example
  4397. * var multiPoly = turf.multiPolygon([
  4398. * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
  4399. * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
  4400. * ]);
  4401. *
  4402. * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  4403. * //=previousValue
  4404. * //=currentLine
  4405. * //=featureIndex
  4406. * //=multiFeatureIndex
  4407. * //=geometryIndex
  4408. * return currentLine
  4409. * });
  4410. */
  4411. function lineReduce(geojson, callback, initialValue) {
  4412. var previousValue = initialValue;
  4413. lineEach(
  4414. geojson,
  4415. function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  4416. if (featureIndex === 0 && initialValue === undefined)
  4417. previousValue = currentLine;
  4418. else
  4419. previousValue = callback(
  4420. previousValue,
  4421. currentLine,
  4422. featureIndex,
  4423. multiFeatureIndex,
  4424. geometryIndex
  4425. );
  4426. }
  4427. );
  4428. return previousValue;
  4429. }
  4430. /**
  4431. * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
  4432. *
  4433. * Negative indexes are permitted.
  4434. * Point & MultiPoint will always return null.
  4435. *
  4436. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  4437. * @param {Object} [options={}] Optional parameters
  4438. * @param {number} [options.featureIndex=0] Feature Index
  4439. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  4440. * @param {number} [options.geometryIndex=0] Geometry Index
  4441. * @param {number} [options.segmentIndex=0] Segment Index
  4442. * @param {Object} [options.properties={}] Translate Properties to output LineString
  4443. * @param {BBox} [options.bbox={}] Translate BBox to output LineString
  4444. * @param {number|string} [options.id={}] Translate Id to output LineString
  4445. * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
  4446. * @example
  4447. * var multiLine = turf.multiLineString([
  4448. * [[10, 10], [50, 30], [30, 40]],
  4449. * [[-10, -10], [-50, -30], [-30, -40]]
  4450. * ]);
  4451. *
  4452. * // First Segment (defaults are 0)
  4453. * turf.findSegment(multiLine);
  4454. * // => Feature<LineString<[[10, 10], [50, 30]]>>
  4455. *
  4456. * // First Segment of 2nd Multi Feature
  4457. * turf.findSegment(multiLine, {multiFeatureIndex: 1});
  4458. * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
  4459. *
  4460. * // Last Segment of Last Multi Feature
  4461. * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
  4462. * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
  4463. */
  4464. function findSegment(geojson, options) {
  4465. // Optional Parameters
  4466. options = options || {};
  4467. if (!helpers.isObject(options)) throw new Error("options is invalid");
  4468. var featureIndex = options.featureIndex || 0;
  4469. var multiFeatureIndex = options.multiFeatureIndex || 0;
  4470. var geometryIndex = options.geometryIndex || 0;
  4471. var segmentIndex = options.segmentIndex || 0;
  4472. // Find FeatureIndex
  4473. var properties = options.properties;
  4474. var geometry;
  4475. switch (geojson.type) {
  4476. case "FeatureCollection":
  4477. if (featureIndex < 0)
  4478. featureIndex = geojson.features.length + featureIndex;
  4479. properties = properties || geojson.features[featureIndex].properties;
  4480. geometry = geojson.features[featureIndex].geometry;
  4481. break;
  4482. case "Feature":
  4483. properties = properties || geojson.properties;
  4484. geometry = geojson.geometry;
  4485. break;
  4486. case "Point":
  4487. case "MultiPoint":
  4488. return null;
  4489. case "LineString":
  4490. case "Polygon":
  4491. case "MultiLineString":
  4492. case "MultiPolygon":
  4493. geometry = geojson;
  4494. break;
  4495. default:
  4496. throw new Error("geojson is invalid");
  4497. }
  4498. // Find SegmentIndex
  4499. if (geometry === null) return null;
  4500. var coords = geometry.coordinates;
  4501. switch (geometry.type) {
  4502. case "Point":
  4503. case "MultiPoint":
  4504. return null;
  4505. case "LineString":
  4506. if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
  4507. return helpers.lineString(
  4508. [coords[segmentIndex], coords[segmentIndex + 1]],
  4509. properties,
  4510. options
  4511. );
  4512. case "Polygon":
  4513. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  4514. if (segmentIndex < 0)
  4515. segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
  4516. return helpers.lineString(
  4517. [
  4518. coords[geometryIndex][segmentIndex],
  4519. coords[geometryIndex][segmentIndex + 1],
  4520. ],
  4521. properties,
  4522. options
  4523. );
  4524. case "MultiLineString":
  4525. if (multiFeatureIndex < 0)
  4526. multiFeatureIndex = coords.length + multiFeatureIndex;
  4527. if (segmentIndex < 0)
  4528. segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
  4529. return helpers.lineString(
  4530. [
  4531. coords[multiFeatureIndex][segmentIndex],
  4532. coords[multiFeatureIndex][segmentIndex + 1],
  4533. ],
  4534. properties,
  4535. options
  4536. );
  4537. case "MultiPolygon":
  4538. if (multiFeatureIndex < 0)
  4539. multiFeatureIndex = coords.length + multiFeatureIndex;
  4540. if (geometryIndex < 0)
  4541. geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  4542. if (segmentIndex < 0)
  4543. segmentIndex =
  4544. coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
  4545. return helpers.lineString(
  4546. [
  4547. coords[multiFeatureIndex][geometryIndex][segmentIndex],
  4548. coords[multiFeatureIndex][geometryIndex][segmentIndex + 1],
  4549. ],
  4550. properties,
  4551. options
  4552. );
  4553. }
  4554. throw new Error("geojson is invalid");
  4555. }
  4556. /**
  4557. * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
  4558. *
  4559. * Negative indexes are permitted.
  4560. *
  4561. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  4562. * @param {Object} [options={}] Optional parameters
  4563. * @param {number} [options.featureIndex=0] Feature Index
  4564. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  4565. * @param {number} [options.geometryIndex=0] Geometry Index
  4566. * @param {number} [options.coordIndex=0] Coord Index
  4567. * @param {Object} [options.properties={}] Translate Properties to output Point
  4568. * @param {BBox} [options.bbox={}] Translate BBox to output Point
  4569. * @param {number|string} [options.id={}] Translate Id to output Point
  4570. * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
  4571. * @example
  4572. * var multiLine = turf.multiLineString([
  4573. * [[10, 10], [50, 30], [30, 40]],
  4574. * [[-10, -10], [-50, -30], [-30, -40]]
  4575. * ]);
  4576. *
  4577. * // First Segment (defaults are 0)
  4578. * turf.findPoint(multiLine);
  4579. * // => Feature<Point<[10, 10]>>
  4580. *
  4581. * // First Segment of the 2nd Multi-Feature
  4582. * turf.findPoint(multiLine, {multiFeatureIndex: 1});
  4583. * // => Feature<Point<[-10, -10]>>
  4584. *
  4585. * // Last Segment of last Multi-Feature
  4586. * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
  4587. * // => Feature<Point<[-30, -40]>>
  4588. */
  4589. function findPoint(geojson, options) {
  4590. // Optional Parameters
  4591. options = options || {};
  4592. if (!helpers.isObject(options)) throw new Error("options is invalid");
  4593. var featureIndex = options.featureIndex || 0;
  4594. var multiFeatureIndex = options.multiFeatureIndex || 0;
  4595. var geometryIndex = options.geometryIndex || 0;
  4596. var coordIndex = options.coordIndex || 0;
  4597. // Find FeatureIndex
  4598. var properties = options.properties;
  4599. var geometry;
  4600. switch (geojson.type) {
  4601. case "FeatureCollection":
  4602. if (featureIndex < 0)
  4603. featureIndex = geojson.features.length + featureIndex;
  4604. properties = properties || geojson.features[featureIndex].properties;
  4605. geometry = geojson.features[featureIndex].geometry;
  4606. break;
  4607. case "Feature":
  4608. properties = properties || geojson.properties;
  4609. geometry = geojson.geometry;
  4610. break;
  4611. case "Point":
  4612. case "MultiPoint":
  4613. return null;
  4614. case "LineString":
  4615. case "Polygon":
  4616. case "MultiLineString":
  4617. case "MultiPolygon":
  4618. geometry = geojson;
  4619. break;
  4620. default:
  4621. throw new Error("geojson is invalid");
  4622. }
  4623. // Find Coord Index
  4624. if (geometry === null) return null;
  4625. var coords = geometry.coordinates;
  4626. switch (geometry.type) {
  4627. case "Point":
  4628. return helpers.point(coords, properties, options);
  4629. case "MultiPoint":
  4630. if (multiFeatureIndex < 0)
  4631. multiFeatureIndex = coords.length + multiFeatureIndex;
  4632. return helpers.point(coords[multiFeatureIndex], properties, options);
  4633. case "LineString":
  4634. if (coordIndex < 0) coordIndex = coords.length + coordIndex;
  4635. return helpers.point(coords[coordIndex], properties, options);
  4636. case "Polygon":
  4637. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  4638. if (coordIndex < 0)
  4639. coordIndex = coords[geometryIndex].length + coordIndex;
  4640. return helpers.point(coords[geometryIndex][coordIndex], properties, options);
  4641. case "MultiLineString":
  4642. if (multiFeatureIndex < 0)
  4643. multiFeatureIndex = coords.length + multiFeatureIndex;
  4644. if (coordIndex < 0)
  4645. coordIndex = coords[multiFeatureIndex].length + coordIndex;
  4646. return helpers.point(coords[multiFeatureIndex][coordIndex], properties, options);
  4647. case "MultiPolygon":
  4648. if (multiFeatureIndex < 0)
  4649. multiFeatureIndex = coords.length + multiFeatureIndex;
  4650. if (geometryIndex < 0)
  4651. geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  4652. if (coordIndex < 0)
  4653. coordIndex =
  4654. coords[multiFeatureIndex][geometryIndex].length - coordIndex;
  4655. return helpers.point(
  4656. coords[multiFeatureIndex][geometryIndex][coordIndex],
  4657. properties,
  4658. options
  4659. );
  4660. }
  4661. throw new Error("geojson is invalid");
  4662. }
  4663. exports.coordAll = coordAll;
  4664. exports.coordEach = coordEach;
  4665. exports.coordReduce = coordReduce;
  4666. exports.featureEach = featureEach;
  4667. exports.featureReduce = featureReduce;
  4668. exports.findPoint = findPoint;
  4669. exports.findSegment = findSegment;
  4670. exports.flattenEach = flattenEach;
  4671. exports.flattenReduce = flattenReduce;
  4672. exports.geomEach = geomEach;
  4673. exports.geomReduce = geomReduce;
  4674. exports.lineEach = lineEach;
  4675. exports.lineReduce = lineReduce;
  4676. exports.propEach = propEach;
  4677. exports.propReduce = propReduce;
  4678. exports.segmentEach = segmentEach;
  4679. exports.segmentReduce = segmentReduce;
  4680. /***/ }),
  4681. /***/ 5748:
  4682. /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
  4683. "use strict";
  4684. // ESM COMPAT FLAG
  4685. __webpack_require__.r(__webpack_exports__);
  4686. // EXPORTS
  4687. __webpack_require__.d(__webpack_exports__, {
  4688. "default": function() { return /* binding */ transform_scale_main_es; }
  4689. });
  4690. ;// CONCATENATED MODULE: ./node_modules/@turf/clone/main.es.js
  4691. /**
  4692. * Returns a cloned copy of the passed GeoJSON Object, including possible 'Foreign Members'.
  4693. * ~3-5x faster than the common JSON.parse + JSON.stringify combo method.
  4694. *
  4695. * @name clone
  4696. * @param {GeoJSON} geojson GeoJSON Object
  4697. * @returns {GeoJSON} cloned GeoJSON Object
  4698. * @example
  4699. * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]], {color: 'red'});
  4700. *
  4701. * var lineCloned = turf.clone(line);
  4702. */
  4703. function clone(geojson) {
  4704. if (!geojson) throw new Error('geojson is required');
  4705. switch (geojson.type) {
  4706. case 'Feature':
  4707. return cloneFeature(geojson);
  4708. case 'FeatureCollection':
  4709. return cloneFeatureCollection(geojson);
  4710. case 'Point':
  4711. case 'LineString':
  4712. case 'Polygon':
  4713. case 'MultiPoint':
  4714. case 'MultiLineString':
  4715. case 'MultiPolygon':
  4716. case 'GeometryCollection':
  4717. return cloneGeometry(geojson);
  4718. default:
  4719. throw new Error('unknown GeoJSON type');
  4720. }
  4721. }
  4722. /**
  4723. * Clone Feature
  4724. *
  4725. * @private
  4726. * @param {Feature<any>} geojson GeoJSON Feature
  4727. * @returns {Feature<any>} cloned Feature
  4728. */
  4729. function cloneFeature(geojson) {
  4730. var cloned = {type: 'Feature'};
  4731. // Preserve Foreign Members
  4732. Object.keys(geojson).forEach(function (key) {
  4733. switch (key) {
  4734. case 'type':
  4735. case 'properties':
  4736. case 'geometry':
  4737. return;
  4738. default:
  4739. cloned[key] = geojson[key];
  4740. }
  4741. });
  4742. // Add properties & geometry last
  4743. cloned.properties = cloneProperties(geojson.properties);
  4744. cloned.geometry = cloneGeometry(geojson.geometry);
  4745. return cloned;
  4746. }
  4747. /**
  4748. * Clone Properties
  4749. *
  4750. * @private
  4751. * @param {Object} properties GeoJSON Properties
  4752. * @returns {Object} cloned Properties
  4753. */
  4754. function cloneProperties(properties) {
  4755. var cloned = {};
  4756. if (!properties) return cloned;
  4757. Object.keys(properties).forEach(function (key) {
  4758. var value = properties[key];
  4759. if (typeof value === 'object') {
  4760. if (value === null) {
  4761. // handle null
  4762. cloned[key] = null;
  4763. } else if (value.length) {
  4764. // handle Array
  4765. cloned[key] = value.map(function (item) {
  4766. return item;
  4767. });
  4768. } else {
  4769. // handle generic Object
  4770. cloned[key] = cloneProperties(value);
  4771. }
  4772. } else cloned[key] = value;
  4773. });
  4774. return cloned;
  4775. }
  4776. /**
  4777. * Clone Feature Collection
  4778. *
  4779. * @private
  4780. * @param {FeatureCollection<any>} geojson GeoJSON Feature Collection
  4781. * @returns {FeatureCollection<any>} cloned Feature Collection
  4782. */
  4783. function cloneFeatureCollection(geojson) {
  4784. var cloned = {type: 'FeatureCollection'};
  4785. // Preserve Foreign Members
  4786. Object.keys(geojson).forEach(function (key) {
  4787. switch (key) {
  4788. case 'type':
  4789. case 'features':
  4790. return;
  4791. default:
  4792. cloned[key] = geojson[key];
  4793. }
  4794. });
  4795. // Add features
  4796. cloned.features = geojson.features.map(function (feature) {
  4797. return cloneFeature(feature);
  4798. });
  4799. return cloned;
  4800. }
  4801. /**
  4802. * Clone Geometry
  4803. *
  4804. * @private
  4805. * @param {Geometry<any>} geometry GeoJSON Geometry
  4806. * @returns {Geometry<any>} cloned Geometry
  4807. */
  4808. function cloneGeometry(geometry) {
  4809. var geom = {type: geometry.type};
  4810. if (geometry.bbox) geom.bbox = geometry.bbox;
  4811. if (geometry.type === 'GeometryCollection') {
  4812. geom.geometries = geometry.geometries.map(function (geom) {
  4813. return cloneGeometry(geom);
  4814. });
  4815. return geom;
  4816. }
  4817. geom.coordinates = deepSlice(geometry.coordinates);
  4818. return geom;
  4819. }
  4820. /**
  4821. * Deep Slice coordinates
  4822. *
  4823. * @private
  4824. * @param {Coordinates} coords Coordinates
  4825. * @returns {Coordinates} all coordinates sliced
  4826. */
  4827. function deepSlice(coords) {
  4828. if (typeof coords[0] !== 'object') { return coords.slice(); }
  4829. return coords.map(function (coord) {
  4830. return deepSlice(coord);
  4831. });
  4832. }
  4833. /* harmony default export */ var main_es = (clone);
  4834. ;// CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/helpers/main.es.js
  4835. /**
  4836. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  4837. */
  4838. var earthRadius = 6371008.8;
  4839. /**
  4840. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  4841. */
  4842. var factors = {
  4843. meters: earthRadius,
  4844. metres: earthRadius,
  4845. millimeters: earthRadius * 1000,
  4846. millimetres: earthRadius * 1000,
  4847. centimeters: earthRadius * 100,
  4848. centimetres: earthRadius * 100,
  4849. kilometers: earthRadius / 1000,
  4850. kilometres: earthRadius / 1000,
  4851. miles: earthRadius / 1609.344,
  4852. nauticalmiles: earthRadius / 1852,
  4853. inches: earthRadius * 39.370,
  4854. yards: earthRadius / 1.0936,
  4855. feet: earthRadius * 3.28084,
  4856. radians: 1,
  4857. degrees: earthRadius / 111325,
  4858. };
  4859. /**
  4860. * Units of measurement factors based on 1 meter.
  4861. */
  4862. var unitsFactors = {
  4863. meters: 1,
  4864. metres: 1,
  4865. millimeters: 1000,
  4866. millimetres: 1000,
  4867. centimeters: 100,
  4868. centimetres: 100,
  4869. kilometers: 1 / 1000,
  4870. kilometres: 1 / 1000,
  4871. miles: 1 / 1609.344,
  4872. nauticalmiles: 1 / 1852,
  4873. inches: 39.370,
  4874. yards: 1 / 1.0936,
  4875. feet: 3.28084,
  4876. radians: 1 / earthRadius,
  4877. degrees: 1 / 111325,
  4878. };
  4879. /**
  4880. * Area of measurement factors based on 1 square meter.
  4881. */
  4882. var areaFactors = {
  4883. meters: 1,
  4884. metres: 1,
  4885. millimeters: 1000000,
  4886. millimetres: 1000000,
  4887. centimeters: 10000,
  4888. centimetres: 10000,
  4889. kilometers: 0.000001,
  4890. kilometres: 0.000001,
  4891. acres: 0.000247105,
  4892. miles: 3.86e-7,
  4893. yards: 1.195990046,
  4894. feet: 10.763910417,
  4895. inches: 1550.003100006
  4896. };
  4897. /**
  4898. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  4899. *
  4900. * @name feature
  4901. * @param {Geometry} geometry input geometry
  4902. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  4903. * @param {Object} [options={}] Optional Parameters
  4904. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  4905. * @param {string|number} [options.id] Identifier associated with the Feature
  4906. * @returns {Feature} a GeoJSON Feature
  4907. * @example
  4908. * var geometry = {
  4909. * "type": "Point",
  4910. * "coordinates": [110, 50]
  4911. * };
  4912. *
  4913. * var feature = turf.feature(geometry);
  4914. *
  4915. * //=feature
  4916. */
  4917. function main_es_feature(geometry, properties, options) {
  4918. // Optional Parameters
  4919. options = options || {};
  4920. if (!main_es_isObject(options)) throw new Error('options is invalid');
  4921. var bbox = options.bbox;
  4922. var id = options.id;
  4923. // Validation
  4924. if (geometry === undefined) throw new Error('geometry is required');
  4925. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  4926. if (bbox) validateBBox(bbox);
  4927. if (id) validateId(id);
  4928. // Main
  4929. var feat = {type: 'Feature'};
  4930. if (id) feat.id = id;
  4931. if (bbox) feat.bbox = bbox;
  4932. feat.properties = properties || {};
  4933. feat.geometry = geometry;
  4934. return feat;
  4935. }
  4936. /**
  4937. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  4938. * For GeometryCollection type use `helpers.geometryCollection`
  4939. *
  4940. * @name geometry
  4941. * @param {string} type Geometry Type
  4942. * @param {Array<number>} coordinates Coordinates
  4943. * @param {Object} [options={}] Optional Parameters
  4944. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  4945. * @returns {Geometry} a GeoJSON Geometry
  4946. * @example
  4947. * var type = 'Point';
  4948. * var coordinates = [110, 50];
  4949. *
  4950. * var geometry = turf.geometry(type, coordinates);
  4951. *
  4952. * //=geometry
  4953. */
  4954. function geometry(type, coordinates, options) {
  4955. // Optional Parameters
  4956. options = options || {};
  4957. if (!main_es_isObject(options)) throw new Error('options is invalid');
  4958. var bbox = options.bbox;
  4959. // Validation
  4960. if (!type) throw new Error('type is required');
  4961. if (!coordinates) throw new Error('coordinates is required');
  4962. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  4963. if (bbox) validateBBox(bbox);
  4964. // Main
  4965. var geom;
  4966. switch (type) {
  4967. case 'Point': geom = main_es_point(coordinates).geometry; break;
  4968. case 'LineString': geom = main_es_lineString(coordinates).geometry; break;
  4969. case 'Polygon': geom = polygon(coordinates).geometry; break;
  4970. case 'MultiPoint': geom = multiPoint(coordinates).geometry; break;
  4971. case 'MultiLineString': geom = multiLineString(coordinates).geometry; break;
  4972. case 'MultiPolygon': geom = multiPolygon(coordinates).geometry; break;
  4973. default: throw new Error(type + ' is invalid');
  4974. }
  4975. if (bbox) geom.bbox = bbox;
  4976. return geom;
  4977. }
  4978. /**
  4979. * Creates a {@link Point} {@link Feature} from a Position.
  4980. *
  4981. * @name point
  4982. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  4983. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  4984. * @param {Object} [options={}] Optional Parameters
  4985. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  4986. * @param {string|number} [options.id] Identifier associated with the Feature
  4987. * @returns {Feature<Point>} a Point feature
  4988. * @example
  4989. * var point = turf.point([-75.343, 39.984]);
  4990. *
  4991. * //=point
  4992. */
  4993. function main_es_point(coordinates, properties, options) {
  4994. if (!coordinates) throw new Error('coordinates is required');
  4995. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  4996. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  4997. if (!main_es_isNumber(coordinates[0]) || !main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  4998. return main_es_feature({
  4999. type: 'Point',
  5000. coordinates: coordinates
  5001. }, properties, options);
  5002. }
  5003. /**
  5004. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  5005. *
  5006. * @name points
  5007. * @param {Array<Array<number>>} coordinates an array of Points
  5008. * @param {Object} [properties={}] Translate these properties to each Feature
  5009. * @param {Object} [options={}] Optional Parameters
  5010. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  5011. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  5012. * @returns {FeatureCollection<Point>} Point Feature
  5013. * @example
  5014. * var points = turf.points([
  5015. * [-75, 39],
  5016. * [-80, 45],
  5017. * [-78, 50]
  5018. * ]);
  5019. *
  5020. * //=points
  5021. */
  5022. function points(coordinates, properties, options) {
  5023. if (!coordinates) throw new Error('coordinates is required');
  5024. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  5025. return featureCollection(coordinates.map(function (coords) {
  5026. return main_es_point(coords, properties);
  5027. }), options);
  5028. }
  5029. /**
  5030. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  5031. *
  5032. * @name polygon
  5033. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  5034. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5035. * @param {Object} [options={}] Optional Parameters
  5036. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5037. * @param {string|number} [options.id] Identifier associated with the Feature
  5038. * @returns {Feature<Polygon>} Polygon Feature
  5039. * @example
  5040. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  5041. *
  5042. * //=polygon
  5043. */
  5044. function polygon(coordinates, properties, options) {
  5045. if (!coordinates) throw new Error('coordinates is required');
  5046. for (var i = 0; i < coordinates.length; i++) {
  5047. var ring = coordinates[i];
  5048. if (ring.length < 4) {
  5049. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  5050. }
  5051. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  5052. // Check if first point of Polygon contains two numbers
  5053. if (i === 0 && j === 0 && !main_es_isNumber(ring[0][0]) || !main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  5054. if (ring[ring.length - 1][j] !== ring[0][j]) {
  5055. throw new Error('First and last Position are not equivalent.');
  5056. }
  5057. }
  5058. }
  5059. return main_es_feature({
  5060. type: 'Polygon',
  5061. coordinates: coordinates
  5062. }, properties, options);
  5063. }
  5064. /**
  5065. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  5066. *
  5067. * @name polygons
  5068. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  5069. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5070. * @param {Object} [options={}] Optional Parameters
  5071. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5072. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  5073. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  5074. * @example
  5075. * var polygons = turf.polygons([
  5076. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  5077. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  5078. * ]);
  5079. *
  5080. * //=polygons
  5081. */
  5082. function polygons(coordinates, properties, options) {
  5083. if (!coordinates) throw new Error('coordinates is required');
  5084. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  5085. return featureCollection(coordinates.map(function (coords) {
  5086. return polygon(coords, properties);
  5087. }), options);
  5088. }
  5089. /**
  5090. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  5091. *
  5092. * @name lineString
  5093. * @param {Array<Array<number>>} coordinates an array of Positions
  5094. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5095. * @param {Object} [options={}] Optional Parameters
  5096. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5097. * @param {string|number} [options.id] Identifier associated with the Feature
  5098. * @returns {Feature<LineString>} LineString Feature
  5099. * @example
  5100. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  5101. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  5102. *
  5103. * //=linestring1
  5104. * //=linestring2
  5105. */
  5106. function main_es_lineString(coordinates, properties, options) {
  5107. if (!coordinates) throw new Error('coordinates is required');
  5108. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  5109. // Check if first point of LineString contains two numbers
  5110. if (!main_es_isNumber(coordinates[0][1]) || !main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  5111. return main_es_feature({
  5112. type: 'LineString',
  5113. coordinates: coordinates
  5114. }, properties, options);
  5115. }
  5116. /**
  5117. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  5118. *
  5119. * @name lineStrings
  5120. * @param {Array<Array<number>>} coordinates an array of LinearRings
  5121. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5122. * @param {Object} [options={}] Optional Parameters
  5123. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  5124. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  5125. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  5126. * @example
  5127. * var linestrings = turf.lineStrings([
  5128. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  5129. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  5130. * ]);
  5131. *
  5132. * //=linestrings
  5133. */
  5134. function lineStrings(coordinates, properties, options) {
  5135. if (!coordinates) throw new Error('coordinates is required');
  5136. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  5137. return featureCollection(coordinates.map(function (coords) {
  5138. return main_es_lineString(coords, properties);
  5139. }), options);
  5140. }
  5141. /**
  5142. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  5143. *
  5144. * @name featureCollection
  5145. * @param {Feature[]} features input features
  5146. * @param {Object} [options={}] Optional Parameters
  5147. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5148. * @param {string|number} [options.id] Identifier associated with the Feature
  5149. * @returns {FeatureCollection} FeatureCollection of Features
  5150. * @example
  5151. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  5152. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  5153. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  5154. *
  5155. * var collection = turf.featureCollection([
  5156. * locationA,
  5157. * locationB,
  5158. * locationC
  5159. * ]);
  5160. *
  5161. * //=collection
  5162. */
  5163. function featureCollection(features, options) {
  5164. // Optional Parameters
  5165. options = options || {};
  5166. if (!main_es_isObject(options)) throw new Error('options is invalid');
  5167. var bbox = options.bbox;
  5168. var id = options.id;
  5169. // Validation
  5170. if (!features) throw new Error('No features passed');
  5171. if (!Array.isArray(features)) throw new Error('features must be an Array');
  5172. if (bbox) validateBBox(bbox);
  5173. if (id) validateId(id);
  5174. // Main
  5175. var fc = {type: 'FeatureCollection'};
  5176. if (id) fc.id = id;
  5177. if (bbox) fc.bbox = bbox;
  5178. fc.features = features;
  5179. return fc;
  5180. }
  5181. /**
  5182. * Creates a {@link Feature<MultiLineString>} based on a
  5183. * coordinate array. Properties can be added optionally.
  5184. *
  5185. * @name multiLineString
  5186. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  5187. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5188. * @param {Object} [options={}] Optional Parameters
  5189. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5190. * @param {string|number} [options.id] Identifier associated with the Feature
  5191. * @returns {Feature<MultiLineString>} a MultiLineString feature
  5192. * @throws {Error} if no coordinates are passed
  5193. * @example
  5194. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  5195. *
  5196. * //=multiLine
  5197. */
  5198. function multiLineString(coordinates, properties, options) {
  5199. if (!coordinates) throw new Error('coordinates is required');
  5200. return main_es_feature({
  5201. type: 'MultiLineString',
  5202. coordinates: coordinates
  5203. }, properties, options);
  5204. }
  5205. /**
  5206. * Creates a {@link Feature<MultiPoint>} based on a
  5207. * coordinate array. Properties can be added optionally.
  5208. *
  5209. * @name multiPoint
  5210. * @param {Array<Array<number>>} coordinates an array of Positions
  5211. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5212. * @param {Object} [options={}] Optional Parameters
  5213. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5214. * @param {string|number} [options.id] Identifier associated with the Feature
  5215. * @returns {Feature<MultiPoint>} a MultiPoint feature
  5216. * @throws {Error} if no coordinates are passed
  5217. * @example
  5218. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  5219. *
  5220. * //=multiPt
  5221. */
  5222. function multiPoint(coordinates, properties, options) {
  5223. if (!coordinates) throw new Error('coordinates is required');
  5224. return main_es_feature({
  5225. type: 'MultiPoint',
  5226. coordinates: coordinates
  5227. }, properties, options);
  5228. }
  5229. /**
  5230. * Creates a {@link Feature<MultiPolygon>} based on a
  5231. * coordinate array. Properties can be added optionally.
  5232. *
  5233. * @name multiPolygon
  5234. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  5235. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5236. * @param {Object} [options={}] Optional Parameters
  5237. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5238. * @param {string|number} [options.id] Identifier associated with the Feature
  5239. * @returns {Feature<MultiPolygon>} a multipolygon feature
  5240. * @throws {Error} if no coordinates are passed
  5241. * @example
  5242. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  5243. *
  5244. * //=multiPoly
  5245. *
  5246. */
  5247. function multiPolygon(coordinates, properties, options) {
  5248. if (!coordinates) throw new Error('coordinates is required');
  5249. return main_es_feature({
  5250. type: 'MultiPolygon',
  5251. coordinates: coordinates
  5252. }, properties, options);
  5253. }
  5254. /**
  5255. * Creates a {@link Feature<GeometryCollection>} based on a
  5256. * coordinate array. Properties can be added optionally.
  5257. *
  5258. * @name geometryCollection
  5259. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  5260. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  5261. * @param {Object} [options={}] Optional Parameters
  5262. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  5263. * @param {string|number} [options.id] Identifier associated with the Feature
  5264. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  5265. * @example
  5266. * var pt = {
  5267. * "type": "Point",
  5268. * "coordinates": [100, 0]
  5269. * };
  5270. * var line = {
  5271. * "type": "LineString",
  5272. * "coordinates": [ [101, 0], [102, 1] ]
  5273. * };
  5274. * var collection = turf.geometryCollection([pt, line]);
  5275. *
  5276. * //=collection
  5277. */
  5278. function geometryCollection(geometries, properties, options) {
  5279. if (!geometries) throw new Error('geometries is required');
  5280. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  5281. return main_es_feature({
  5282. type: 'GeometryCollection',
  5283. geometries: geometries
  5284. }, properties, options);
  5285. }
  5286. /**
  5287. * Round number to precision
  5288. *
  5289. * @param {number} num Number
  5290. * @param {number} [precision=0] Precision
  5291. * @returns {number} rounded number
  5292. * @example
  5293. * turf.round(120.4321)
  5294. * //=120
  5295. *
  5296. * turf.round(120.4321, 2)
  5297. * //=120.43
  5298. */
  5299. function round(num, precision) {
  5300. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  5301. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  5302. var multiplier = Math.pow(10, precision || 0);
  5303. return Math.round(num * multiplier) / multiplier;
  5304. }
  5305. /**
  5306. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  5307. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  5308. *
  5309. * @name radiansToLength
  5310. * @param {number} radians in radians across the sphere
  5311. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  5312. * @returns {number} distance
  5313. */
  5314. function radiansToLength(radians, units) {
  5315. if (radians === undefined || radians === null) throw new Error('radians is required');
  5316. if (units && typeof units !== 'string') throw new Error('units must be a string');
  5317. var factor = factors[units || 'kilometers'];
  5318. if (!factor) throw new Error(units + ' units is invalid');
  5319. return radians * factor;
  5320. }
  5321. /**
  5322. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  5323. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  5324. *
  5325. * @name lengthToRadians
  5326. * @param {number} distance in real units
  5327. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  5328. * @returns {number} radians
  5329. */
  5330. function lengthToRadians(distance, units) {
  5331. if (distance === undefined || distance === null) throw new Error('distance is required');
  5332. if (units && typeof units !== 'string') throw new Error('units must be a string');
  5333. var factor = factors[units || 'kilometers'];
  5334. if (!factor) throw new Error(units + ' units is invalid');
  5335. return distance / factor;
  5336. }
  5337. /**
  5338. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  5339. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  5340. *
  5341. * @name lengthToDegrees
  5342. * @param {number} distance in real units
  5343. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  5344. * @returns {number} degrees
  5345. */
  5346. function lengthToDegrees(distance, units) {
  5347. return radiansToDegrees(lengthToRadians(distance, units));
  5348. }
  5349. /**
  5350. * Converts any bearing angle from the north line direction (positive clockwise)
  5351. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  5352. *
  5353. * @name bearingToAzimuth
  5354. * @param {number} bearing angle, between -180 and +180 degrees
  5355. * @returns {number} angle between 0 and 360 degrees
  5356. */
  5357. function bearingToAzimuth(bearing) {
  5358. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  5359. var angle = bearing % 360;
  5360. if (angle < 0) angle += 360;
  5361. return angle;
  5362. }
  5363. /**
  5364. * Converts an angle in radians to degrees
  5365. *
  5366. * @name radiansToDegrees
  5367. * @param {number} radians angle in radians
  5368. * @returns {number} degrees between 0 and 360 degrees
  5369. */
  5370. function radiansToDegrees(radians) {
  5371. if (radians === null || radians === undefined) throw new Error('radians is required');
  5372. var degrees = radians % (2 * Math.PI);
  5373. return degrees * 180 / Math.PI;
  5374. }
  5375. /**
  5376. * Converts an angle in degrees to radians
  5377. *
  5378. * @name degreesToRadians
  5379. * @param {number} degrees angle between 0 and 360 degrees
  5380. * @returns {number} angle in radians
  5381. */
  5382. function degreesToRadians(degrees) {
  5383. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  5384. var radians = degrees % 360;
  5385. return radians * Math.PI / 180;
  5386. }
  5387. /**
  5388. * Converts a length to the requested unit.
  5389. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  5390. *
  5391. * @param {number} length to be converted
  5392. * @param {string} originalUnit of the length
  5393. * @param {string} [finalUnit='kilometers'] returned unit
  5394. * @returns {number} the converted length
  5395. */
  5396. function convertLength(length, originalUnit, finalUnit) {
  5397. if (length === null || length === undefined) throw new Error('length is required');
  5398. if (!(length >= 0)) throw new Error('length must be a positive number');
  5399. return radiansToLength(lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  5400. }
  5401. /**
  5402. * Converts a area to the requested unit.
  5403. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  5404. * @param {number} area to be converted
  5405. * @param {string} [originalUnit='meters'] of the distance
  5406. * @param {string} [finalUnit='kilometers'] returned unit
  5407. * @returns {number} the converted distance
  5408. */
  5409. function convertArea(area, originalUnit, finalUnit) {
  5410. if (area === null || area === undefined) throw new Error('area is required');
  5411. if (!(area >= 0)) throw new Error('area must be a positive number');
  5412. var startFactor = areaFactors[originalUnit || 'meters'];
  5413. if (!startFactor) throw new Error('invalid original units');
  5414. var finalFactor = areaFactors[finalUnit || 'kilometers'];
  5415. if (!finalFactor) throw new Error('invalid final units');
  5416. return (area / startFactor) * finalFactor;
  5417. }
  5418. /**
  5419. * isNumber
  5420. *
  5421. * @param {*} num Number to validate
  5422. * @returns {boolean} true/false
  5423. * @example
  5424. * turf.isNumber(123)
  5425. * //=true
  5426. * turf.isNumber('foo')
  5427. * //=false
  5428. */
  5429. function main_es_isNumber(num) {
  5430. return !isNaN(num) && num !== null && !Array.isArray(num);
  5431. }
  5432. /**
  5433. * isObject
  5434. *
  5435. * @param {*} input variable to validate
  5436. * @returns {boolean} true/false
  5437. * @example
  5438. * turf.isObject({elevation: 10})
  5439. * //=true
  5440. * turf.isObject('foo')
  5441. * //=false
  5442. */
  5443. function main_es_isObject(input) {
  5444. return (!!input) && (input.constructor === Object);
  5445. }
  5446. /**
  5447. * Validate BBox
  5448. *
  5449. * @private
  5450. * @param {Array<number>} bbox BBox to validate
  5451. * @returns {void}
  5452. * @throws Error if BBox is not valid
  5453. * @example
  5454. * validateBBox([-180, -40, 110, 50])
  5455. * //=OK
  5456. * validateBBox([-180, -40])
  5457. * //=Error
  5458. * validateBBox('Foo')
  5459. * //=Error
  5460. * validateBBox(5)
  5461. * //=Error
  5462. * validateBBox(null)
  5463. * //=Error
  5464. * validateBBox(undefined)
  5465. * //=Error
  5466. */
  5467. function validateBBox(bbox) {
  5468. if (!bbox) throw new Error('bbox is required');
  5469. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  5470. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  5471. bbox.forEach(function (num) {
  5472. if (!main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  5473. });
  5474. }
  5475. /**
  5476. * Validate Id
  5477. *
  5478. * @private
  5479. * @param {string|number} id Id to validate
  5480. * @returns {void}
  5481. * @throws Error if Id is not valid
  5482. * @example
  5483. * validateId([-180, -40, 110, 50])
  5484. * //=Error
  5485. * validateId([-180, -40])
  5486. * //=Error
  5487. * validateId('Foo')
  5488. * //=OK
  5489. * validateId(5)
  5490. * //=OK
  5491. * validateId(null)
  5492. * //=Error
  5493. * validateId(undefined)
  5494. * //=Error
  5495. */
  5496. function validateId(id) {
  5497. if (!id) throw new Error('id is required');
  5498. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  5499. }
  5500. // Deprecated methods
  5501. function radians2degrees() {
  5502. throw new Error('method has been renamed to `radiansToDegrees`');
  5503. }
  5504. function degrees2radians() {
  5505. throw new Error('method has been renamed to `degreesToRadians`');
  5506. }
  5507. function distanceToDegrees() {
  5508. throw new Error('method has been renamed to `lengthToDegrees`');
  5509. }
  5510. function distanceToRadians() {
  5511. throw new Error('method has been renamed to `lengthToRadians`');
  5512. }
  5513. function radiansToDistance() {
  5514. throw new Error('method has been renamed to `radiansToLength`');
  5515. }
  5516. function bearingToAngle() {
  5517. throw new Error('method has been renamed to `bearingToAzimuth`');
  5518. }
  5519. function convertDistance() {
  5520. throw new Error('method has been renamed to `convertLength`');
  5521. }
  5522. ;// CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/meta/main.es.js
  5523. /**
  5524. * Callback for coordEach
  5525. *
  5526. * @callback coordEachCallback
  5527. * @param {Array<number>} currentCoord The current coordinate being processed.
  5528. * @param {number} coordIndex The current index of the coordinate being processed.
  5529. * @param {number} featureIndex The current index of the Feature being processed.
  5530. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  5531. * @param {number} geometryIndex The current index of the Geometry being processed.
  5532. */
  5533. /**
  5534. * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
  5535. *
  5536. * @name coordEach
  5537. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  5538. * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
  5539. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  5540. * @returns {void}
  5541. * @example
  5542. * var features = turf.featureCollection([
  5543. * turf.point([26, 37], {"foo": "bar"}),
  5544. * turf.point([36, 53], {"hello": "world"})
  5545. * ]);
  5546. *
  5547. * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  5548. * //=currentCoord
  5549. * //=coordIndex
  5550. * //=featureIndex
  5551. * //=multiFeatureIndex
  5552. * //=geometryIndex
  5553. * });
  5554. */
  5555. function coordEach(geojson, callback, excludeWrapCoord) {
  5556. // Handles null Geometry -- Skips this GeoJSON
  5557. if (geojson === null) return;
  5558. var j, k, l, geometry, stopG, coords,
  5559. geometryMaybeCollection,
  5560. wrapShrink = 0,
  5561. coordIndex = 0,
  5562. isGeometryCollection,
  5563. type = geojson.type,
  5564. isFeatureCollection = type === 'FeatureCollection',
  5565. isFeature = type === 'Feature',
  5566. stop = isFeatureCollection ? geojson.features.length : 1;
  5567. // This logic may look a little weird. The reason why it is that way
  5568. // is because it's trying to be fast. GeoJSON supports multiple kinds
  5569. // of objects at its root: FeatureCollection, Features, Geometries.
  5570. // This function has the responsibility of handling all of them, and that
  5571. // means that some of the `for` loops you see below actually just don't apply
  5572. // to certain inputs. For instance, if you give this just a
  5573. // Point geometry, then both loops are short-circuited and all we do
  5574. // is gradually rename the input until it's called 'geometry'.
  5575. //
  5576. // This also aims to allocate as few resources as possible: just a
  5577. // few numbers and booleans, rather than any temporary arrays as would
  5578. // be required with the normalization approach.
  5579. for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
  5580. geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
  5581. (isFeature ? geojson.geometry : geojson));
  5582. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  5583. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  5584. for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
  5585. var multiFeatureIndex = 0;
  5586. var geometryIndex = 0;
  5587. geometry = isGeometryCollection ?
  5588. geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
  5589. // Handles null Geometry -- Skips this geometry
  5590. if (geometry === null) continue;
  5591. coords = geometry.coordinates;
  5592. var geomType = geometry.type;
  5593. wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
  5594. switch (geomType) {
  5595. case null:
  5596. break;
  5597. case 'Point':
  5598. if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  5599. coordIndex++;
  5600. multiFeatureIndex++;
  5601. break;
  5602. case 'LineString':
  5603. case 'MultiPoint':
  5604. for (j = 0; j < coords.length; j++) {
  5605. if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  5606. coordIndex++;
  5607. if (geomType === 'MultiPoint') multiFeatureIndex++;
  5608. }
  5609. if (geomType === 'LineString') multiFeatureIndex++;
  5610. break;
  5611. case 'Polygon':
  5612. case 'MultiLineString':
  5613. for (j = 0; j < coords.length; j++) {
  5614. for (k = 0; k < coords[j].length - wrapShrink; k++) {
  5615. if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  5616. coordIndex++;
  5617. }
  5618. if (geomType === 'MultiLineString') multiFeatureIndex++;
  5619. if (geomType === 'Polygon') geometryIndex++;
  5620. }
  5621. if (geomType === 'Polygon') multiFeatureIndex++;
  5622. break;
  5623. case 'MultiPolygon':
  5624. for (j = 0; j < coords.length; j++) {
  5625. if (geomType === 'MultiPolygon') geometryIndex = 0;
  5626. for (k = 0; k < coords[j].length; k++) {
  5627. for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
  5628. if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  5629. coordIndex++;
  5630. }
  5631. geometryIndex++;
  5632. }
  5633. multiFeatureIndex++;
  5634. }
  5635. break;
  5636. case 'GeometryCollection':
  5637. for (j = 0; j < geometry.geometries.length; j++)
  5638. if (coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
  5639. break;
  5640. default:
  5641. throw new Error('Unknown Geometry Type');
  5642. }
  5643. }
  5644. }
  5645. }
  5646. /**
  5647. * Callback for coordReduce
  5648. *
  5649. * The first time the callback function is called, the values provided as arguments depend
  5650. * on whether the reduce method has an initialValue argument.
  5651. *
  5652. * If an initialValue is provided to the reduce method:
  5653. * - The previousValue argument is initialValue.
  5654. * - The currentValue argument is the value of the first element present in the array.
  5655. *
  5656. * If an initialValue is not provided:
  5657. * - The previousValue argument is the value of the first element present in the array.
  5658. * - The currentValue argument is the value of the second element present in the array.
  5659. *
  5660. * @callback coordReduceCallback
  5661. * @param {*} previousValue The accumulated value previously returned in the last invocation
  5662. * of the callback, or initialValue, if supplied.
  5663. * @param {Array<number>} currentCoord The current coordinate being processed.
  5664. * @param {number} coordIndex The current index of the coordinate being processed.
  5665. * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
  5666. * @param {number} featureIndex The current index of the Feature being processed.
  5667. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  5668. * @param {number} geometryIndex The current index of the Geometry being processed.
  5669. */
  5670. /**
  5671. * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
  5672. *
  5673. * @name coordReduce
  5674. * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
  5675. * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
  5676. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  5677. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  5678. * @returns {*} The value that results from the reduction.
  5679. * @example
  5680. * var features = turf.featureCollection([
  5681. * turf.point([26, 37], {"foo": "bar"}),
  5682. * turf.point([36, 53], {"hello": "world"})
  5683. * ]);
  5684. *
  5685. * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  5686. * //=previousValue
  5687. * //=currentCoord
  5688. * //=coordIndex
  5689. * //=featureIndex
  5690. * //=multiFeatureIndex
  5691. * //=geometryIndex
  5692. * return currentCoord;
  5693. * });
  5694. */
  5695. function coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
  5696. var previousValue = initialValue;
  5697. coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  5698. if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
  5699. else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
  5700. }, excludeWrapCoord);
  5701. return previousValue;
  5702. }
  5703. /**
  5704. * Callback for propEach
  5705. *
  5706. * @callback propEachCallback
  5707. * @param {Object} currentProperties The current Properties being processed.
  5708. * @param {number} featureIndex The current index of the Feature being processed.
  5709. */
  5710. /**
  5711. * Iterate over properties in any GeoJSON object, similar to Array.forEach()
  5712. *
  5713. * @name propEach
  5714. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  5715. * @param {Function} callback a method that takes (currentProperties, featureIndex)
  5716. * @returns {void}
  5717. * @example
  5718. * var features = turf.featureCollection([
  5719. * turf.point([26, 37], {foo: 'bar'}),
  5720. * turf.point([36, 53], {hello: 'world'})
  5721. * ]);
  5722. *
  5723. * turf.propEach(features, function (currentProperties, featureIndex) {
  5724. * //=currentProperties
  5725. * //=featureIndex
  5726. * });
  5727. */
  5728. function propEach(geojson, callback) {
  5729. var i;
  5730. switch (geojson.type) {
  5731. case 'FeatureCollection':
  5732. for (i = 0; i < geojson.features.length; i++) {
  5733. if (callback(geojson.features[i].properties, i) === false) break;
  5734. }
  5735. break;
  5736. case 'Feature':
  5737. callback(geojson.properties, 0);
  5738. break;
  5739. }
  5740. }
  5741. /**
  5742. * Callback for propReduce
  5743. *
  5744. * The first time the callback function is called, the values provided as arguments depend
  5745. * on whether the reduce method has an initialValue argument.
  5746. *
  5747. * If an initialValue is provided to the reduce method:
  5748. * - The previousValue argument is initialValue.
  5749. * - The currentValue argument is the value of the first element present in the array.
  5750. *
  5751. * If an initialValue is not provided:
  5752. * - The previousValue argument is the value of the first element present in the array.
  5753. * - The currentValue argument is the value of the second element present in the array.
  5754. *
  5755. * @callback propReduceCallback
  5756. * @param {*} previousValue The accumulated value previously returned in the last invocation
  5757. * of the callback, or initialValue, if supplied.
  5758. * @param {*} currentProperties The current Properties being processed.
  5759. * @param {number} featureIndex The current index of the Feature being processed.
  5760. */
  5761. /**
  5762. * Reduce properties in any GeoJSON object into a single value,
  5763. * similar to how Array.reduce works. However, in this case we lazily run
  5764. * the reduction, so an array of all properties is unnecessary.
  5765. *
  5766. * @name propReduce
  5767. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  5768. * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
  5769. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  5770. * @returns {*} The value that results from the reduction.
  5771. * @example
  5772. * var features = turf.featureCollection([
  5773. * turf.point([26, 37], {foo: 'bar'}),
  5774. * turf.point([36, 53], {hello: 'world'})
  5775. * ]);
  5776. *
  5777. * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
  5778. * //=previousValue
  5779. * //=currentProperties
  5780. * //=featureIndex
  5781. * return currentProperties
  5782. * });
  5783. */
  5784. function propReduce(geojson, callback, initialValue) {
  5785. var previousValue = initialValue;
  5786. propEach(geojson, function (currentProperties, featureIndex) {
  5787. if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
  5788. else previousValue = callback(previousValue, currentProperties, featureIndex);
  5789. });
  5790. return previousValue;
  5791. }
  5792. /**
  5793. * Callback for featureEach
  5794. *
  5795. * @callback featureEachCallback
  5796. * @param {Feature<any>} currentFeature The current Feature being processed.
  5797. * @param {number} featureIndex The current index of the Feature being processed.
  5798. */
  5799. /**
  5800. * Iterate over features in any GeoJSON object, similar to
  5801. * Array.forEach.
  5802. *
  5803. * @name featureEach
  5804. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  5805. * @param {Function} callback a method that takes (currentFeature, featureIndex)
  5806. * @returns {void}
  5807. * @example
  5808. * var features = turf.featureCollection([
  5809. * turf.point([26, 37], {foo: 'bar'}),
  5810. * turf.point([36, 53], {hello: 'world'})
  5811. * ]);
  5812. *
  5813. * turf.featureEach(features, function (currentFeature, featureIndex) {
  5814. * //=currentFeature
  5815. * //=featureIndex
  5816. * });
  5817. */
  5818. function featureEach(geojson, callback) {
  5819. if (geojson.type === 'Feature') {
  5820. callback(geojson, 0);
  5821. } else if (geojson.type === 'FeatureCollection') {
  5822. for (var i = 0; i < geojson.features.length; i++) {
  5823. if (callback(geojson.features[i], i) === false) break;
  5824. }
  5825. }
  5826. }
  5827. /**
  5828. * Callback for featureReduce
  5829. *
  5830. * The first time the callback function is called, the values provided as arguments depend
  5831. * on whether the reduce method has an initialValue argument.
  5832. *
  5833. * If an initialValue is provided to the reduce method:
  5834. * - The previousValue argument is initialValue.
  5835. * - The currentValue argument is the value of the first element present in the array.
  5836. *
  5837. * If an initialValue is not provided:
  5838. * - The previousValue argument is the value of the first element present in the array.
  5839. * - The currentValue argument is the value of the second element present in the array.
  5840. *
  5841. * @callback featureReduceCallback
  5842. * @param {*} previousValue The accumulated value previously returned in the last invocation
  5843. * of the callback, or initialValue, if supplied.
  5844. * @param {Feature} currentFeature The current Feature being processed.
  5845. * @param {number} featureIndex The current index of the Feature being processed.
  5846. */
  5847. /**
  5848. * Reduce features in any GeoJSON object, similar to Array.reduce().
  5849. *
  5850. * @name featureReduce
  5851. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  5852. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
  5853. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  5854. * @returns {*} The value that results from the reduction.
  5855. * @example
  5856. * var features = turf.featureCollection([
  5857. * turf.point([26, 37], {"foo": "bar"}),
  5858. * turf.point([36, 53], {"hello": "world"})
  5859. * ]);
  5860. *
  5861. * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
  5862. * //=previousValue
  5863. * //=currentFeature
  5864. * //=featureIndex
  5865. * return currentFeature
  5866. * });
  5867. */
  5868. function featureReduce(geojson, callback, initialValue) {
  5869. var previousValue = initialValue;
  5870. featureEach(geojson, function (currentFeature, featureIndex) {
  5871. if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  5872. else previousValue = callback(previousValue, currentFeature, featureIndex);
  5873. });
  5874. return previousValue;
  5875. }
  5876. /**
  5877. * Get all coordinates from any GeoJSON object.
  5878. *
  5879. * @name coordAll
  5880. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  5881. * @returns {Array<Array<number>>} coordinate position array
  5882. * @example
  5883. * var features = turf.featureCollection([
  5884. * turf.point([26, 37], {foo: 'bar'}),
  5885. * turf.point([36, 53], {hello: 'world'})
  5886. * ]);
  5887. *
  5888. * var coords = turf.coordAll(features);
  5889. * //= [[26, 37], [36, 53]]
  5890. */
  5891. function coordAll(geojson) {
  5892. var coords = [];
  5893. coordEach(geojson, function (coord) {
  5894. coords.push(coord);
  5895. });
  5896. return coords;
  5897. }
  5898. /**
  5899. * Callback for geomEach
  5900. *
  5901. * @callback geomEachCallback
  5902. * @param {Geometry} currentGeometry The current Geometry being processed.
  5903. * @param {number} featureIndex The current index of the Feature being processed.
  5904. * @param {Object} featureProperties The current Feature Properties being processed.
  5905. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  5906. * @param {number|string} featureId The current Feature Id being processed.
  5907. */
  5908. /**
  5909. * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
  5910. *
  5911. * @name geomEach
  5912. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  5913. * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  5914. * @returns {void}
  5915. * @example
  5916. * var features = turf.featureCollection([
  5917. * turf.point([26, 37], {foo: 'bar'}),
  5918. * turf.point([36, 53], {hello: 'world'})
  5919. * ]);
  5920. *
  5921. * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  5922. * //=currentGeometry
  5923. * //=featureIndex
  5924. * //=featureProperties
  5925. * //=featureBBox
  5926. * //=featureId
  5927. * });
  5928. */
  5929. function geomEach(geojson, callback) {
  5930. var i, j, g, geometry, stopG,
  5931. geometryMaybeCollection,
  5932. isGeometryCollection,
  5933. featureProperties,
  5934. featureBBox,
  5935. featureId,
  5936. featureIndex = 0,
  5937. isFeatureCollection = geojson.type === 'FeatureCollection',
  5938. isFeature = geojson.type === 'Feature',
  5939. stop = isFeatureCollection ? geojson.features.length : 1;
  5940. // This logic may look a little weird. The reason why it is that way
  5941. // is because it's trying to be fast. GeoJSON supports multiple kinds
  5942. // of objects at its root: FeatureCollection, Features, Geometries.
  5943. // This function has the responsibility of handling all of them, and that
  5944. // means that some of the `for` loops you see below actually just don't apply
  5945. // to certain inputs. For instance, if you give this just a
  5946. // Point geometry, then both loops are short-circuited and all we do
  5947. // is gradually rename the input until it's called 'geometry'.
  5948. //
  5949. // This also aims to allocate as few resources as possible: just a
  5950. // few numbers and booleans, rather than any temporary arrays as would
  5951. // be required with the normalization approach.
  5952. for (i = 0; i < stop; i++) {
  5953. geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
  5954. (isFeature ? geojson.geometry : geojson));
  5955. featureProperties = (isFeatureCollection ? geojson.features[i].properties :
  5956. (isFeature ? geojson.properties : {}));
  5957. featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
  5958. (isFeature ? geojson.bbox : undefined));
  5959. featureId = (isFeatureCollection ? geojson.features[i].id :
  5960. (isFeature ? geojson.id : undefined));
  5961. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  5962. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  5963. for (g = 0; g < stopG; g++) {
  5964. geometry = isGeometryCollection ?
  5965. geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
  5966. // Handle null Geometry
  5967. if (geometry === null) {
  5968. if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  5969. continue;
  5970. }
  5971. switch (geometry.type) {
  5972. case 'Point':
  5973. case 'LineString':
  5974. case 'MultiPoint':
  5975. case 'Polygon':
  5976. case 'MultiLineString':
  5977. case 'MultiPolygon': {
  5978. if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  5979. break;
  5980. }
  5981. case 'GeometryCollection': {
  5982. for (j = 0; j < geometry.geometries.length; j++) {
  5983. if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  5984. }
  5985. break;
  5986. }
  5987. default:
  5988. throw new Error('Unknown Geometry Type');
  5989. }
  5990. }
  5991. // Only increase `featureIndex` per each feature
  5992. featureIndex++;
  5993. }
  5994. }
  5995. /**
  5996. * Callback for geomReduce
  5997. *
  5998. * The first time the callback function is called, the values provided as arguments depend
  5999. * on whether the reduce method has an initialValue argument.
  6000. *
  6001. * If an initialValue is provided to the reduce method:
  6002. * - The previousValue argument is initialValue.
  6003. * - The currentValue argument is the value of the first element present in the array.
  6004. *
  6005. * If an initialValue is not provided:
  6006. * - The previousValue argument is the value of the first element present in the array.
  6007. * - The currentValue argument is the value of the second element present in the array.
  6008. *
  6009. * @callback geomReduceCallback
  6010. * @param {*} previousValue The accumulated value previously returned in the last invocation
  6011. * of the callback, or initialValue, if supplied.
  6012. * @param {Geometry} currentGeometry The current Geometry being processed.
  6013. * @param {number} featureIndex The current index of the Feature being processed.
  6014. * @param {Object} featureProperties The current Feature Properties being processed.
  6015. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  6016. * @param {number|string} featureId The current Feature Id being processed.
  6017. */
  6018. /**
  6019. * Reduce geometry in any GeoJSON object, similar to Array.reduce().
  6020. *
  6021. * @name geomReduce
  6022. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  6023. * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  6024. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  6025. * @returns {*} The value that results from the reduction.
  6026. * @example
  6027. * var features = turf.featureCollection([
  6028. * turf.point([26, 37], {foo: 'bar'}),
  6029. * turf.point([36, 53], {hello: 'world'})
  6030. * ]);
  6031. *
  6032. * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  6033. * //=previousValue
  6034. * //=currentGeometry
  6035. * //=featureIndex
  6036. * //=featureProperties
  6037. * //=featureBBox
  6038. * //=featureId
  6039. * return currentGeometry
  6040. * });
  6041. */
  6042. function geomReduce(geojson, callback, initialValue) {
  6043. var previousValue = initialValue;
  6044. geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  6045. if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
  6046. else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
  6047. });
  6048. return previousValue;
  6049. }
  6050. /**
  6051. * Callback for flattenEach
  6052. *
  6053. * @callback flattenEachCallback
  6054. * @param {Feature} currentFeature The current flattened feature being processed.
  6055. * @param {number} featureIndex The current index of the Feature being processed.
  6056. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  6057. */
  6058. /**
  6059. * Iterate over flattened features in any GeoJSON object, similar to
  6060. * Array.forEach.
  6061. *
  6062. * @name flattenEach
  6063. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  6064. * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
  6065. * @example
  6066. * var features = turf.featureCollection([
  6067. * turf.point([26, 37], {foo: 'bar'}),
  6068. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  6069. * ]);
  6070. *
  6071. * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
  6072. * //=currentFeature
  6073. * //=featureIndex
  6074. * //=multiFeatureIndex
  6075. * });
  6076. */
  6077. function flattenEach(geojson, callback) {
  6078. geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
  6079. // Callback for single geometry
  6080. var type = (geometry === null) ? null : geometry.type;
  6081. switch (type) {
  6082. case null:
  6083. case 'Point':
  6084. case 'LineString':
  6085. case 'Polygon':
  6086. if (callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
  6087. return;
  6088. }
  6089. var geomType;
  6090. // Callback for multi-geometry
  6091. switch (type) {
  6092. case 'MultiPoint':
  6093. geomType = 'Point';
  6094. break;
  6095. case 'MultiLineString':
  6096. geomType = 'LineString';
  6097. break;
  6098. case 'MultiPolygon':
  6099. geomType = 'Polygon';
  6100. break;
  6101. }
  6102. for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
  6103. var coordinate = geometry.coordinates[multiFeatureIndex];
  6104. var geom = {
  6105. type: geomType,
  6106. coordinates: coordinate
  6107. };
  6108. if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
  6109. }
  6110. });
  6111. }
  6112. /**
  6113. * Callback for flattenReduce
  6114. *
  6115. * The first time the callback function is called, the values provided as arguments depend
  6116. * on whether the reduce method has an initialValue argument.
  6117. *
  6118. * If an initialValue is provided to the reduce method:
  6119. * - The previousValue argument is initialValue.
  6120. * - The currentValue argument is the value of the first element present in the array.
  6121. *
  6122. * If an initialValue is not provided:
  6123. * - The previousValue argument is the value of the first element present in the array.
  6124. * - The currentValue argument is the value of the second element present in the array.
  6125. *
  6126. * @callback flattenReduceCallback
  6127. * @param {*} previousValue The accumulated value previously returned in the last invocation
  6128. * of the callback, or initialValue, if supplied.
  6129. * @param {Feature} currentFeature The current Feature being processed.
  6130. * @param {number} featureIndex The current index of the Feature being processed.
  6131. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  6132. */
  6133. /**
  6134. * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
  6135. *
  6136. * @name flattenReduce
  6137. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  6138. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
  6139. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  6140. * @returns {*} The value that results from the reduction.
  6141. * @example
  6142. * var features = turf.featureCollection([
  6143. * turf.point([26, 37], {foo: 'bar'}),
  6144. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  6145. * ]);
  6146. *
  6147. * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
  6148. * //=previousValue
  6149. * //=currentFeature
  6150. * //=featureIndex
  6151. * //=multiFeatureIndex
  6152. * return currentFeature
  6153. * });
  6154. */
  6155. function flattenReduce(geojson, callback, initialValue) {
  6156. var previousValue = initialValue;
  6157. flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
  6158. if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  6159. else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
  6160. });
  6161. return previousValue;
  6162. }
  6163. /**
  6164. * Callback for segmentEach
  6165. *
  6166. * @callback segmentEachCallback
  6167. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  6168. * @param {number} featureIndex The current index of the Feature being processed.
  6169. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  6170. * @param {number} geometryIndex The current index of the Geometry being processed.
  6171. * @param {number} segmentIndex The current index of the Segment being processed.
  6172. * @returns {void}
  6173. */
  6174. /**
  6175. * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
  6176. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  6177. *
  6178. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  6179. * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
  6180. * @returns {void}
  6181. * @example
  6182. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  6183. *
  6184. * // Iterate over GeoJSON by 2-vertex segments
  6185. * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  6186. * //=currentSegment
  6187. * //=featureIndex
  6188. * //=multiFeatureIndex
  6189. * //=geometryIndex
  6190. * //=segmentIndex
  6191. * });
  6192. *
  6193. * // Calculate the total number of segments
  6194. * var total = 0;
  6195. * turf.segmentEach(polygon, function () {
  6196. * total++;
  6197. * });
  6198. */
  6199. function segmentEach(geojson, callback) {
  6200. flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  6201. var segmentIndex = 0;
  6202. // Exclude null Geometries
  6203. if (!feature$$1.geometry) return;
  6204. // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  6205. var type = feature$$1.geometry.type;
  6206. if (type === 'Point' || type === 'MultiPoint') return;
  6207. // Generate 2-vertex line segments
  6208. var previousCoords;
  6209. if (coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
  6210. // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
  6211. if (previousCoords === undefined) {
  6212. previousCoords = currentCoord;
  6213. return;
  6214. }
  6215. var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
  6216. if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
  6217. segmentIndex++;
  6218. previousCoords = currentCoord;
  6219. }) === false) return false;
  6220. });
  6221. }
  6222. /**
  6223. * Callback for segmentReduce
  6224. *
  6225. * The first time the callback function is called, the values provided as arguments depend
  6226. * on whether the reduce method has an initialValue argument.
  6227. *
  6228. * If an initialValue is provided to the reduce method:
  6229. * - The previousValue argument is initialValue.
  6230. * - The currentValue argument is the value of the first element present in the array.
  6231. *
  6232. * If an initialValue is not provided:
  6233. * - The previousValue argument is the value of the first element present in the array.
  6234. * - The currentValue argument is the value of the second element present in the array.
  6235. *
  6236. * @callback segmentReduceCallback
  6237. * @param {*} previousValue The accumulated value previously returned in the last invocation
  6238. * of the callback, or initialValue, if supplied.
  6239. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  6240. * @param {number} featureIndex The current index of the Feature being processed.
  6241. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  6242. * @param {number} geometryIndex The current index of the Geometry being processed.
  6243. * @param {number} segmentIndex The current index of the Segment being processed.
  6244. */
  6245. /**
  6246. * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
  6247. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  6248. *
  6249. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  6250. * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
  6251. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  6252. * @returns {void}
  6253. * @example
  6254. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  6255. *
  6256. * // Iterate over GeoJSON by 2-vertex segments
  6257. * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  6258. * //= previousSegment
  6259. * //= currentSegment
  6260. * //= featureIndex
  6261. * //= multiFeatureIndex
  6262. * //= geometryIndex
  6263. * //= segmentInex
  6264. * return currentSegment
  6265. * });
  6266. *
  6267. * // Calculate the total number of segments
  6268. * var initialValue = 0
  6269. * var total = turf.segmentReduce(polygon, function (previousValue) {
  6270. * previousValue++;
  6271. * return previousValue;
  6272. * }, initialValue);
  6273. */
  6274. function segmentReduce(geojson, callback, initialValue) {
  6275. var previousValue = initialValue;
  6276. var started = false;
  6277. segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  6278. if (started === false && initialValue === undefined) previousValue = currentSegment;
  6279. else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
  6280. started = true;
  6281. });
  6282. return previousValue;
  6283. }
  6284. /**
  6285. * Callback for lineEach
  6286. *
  6287. * @callback lineEachCallback
  6288. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
  6289. * @param {number} featureIndex The current index of the Feature being processed
  6290. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  6291. * @param {number} geometryIndex The current index of the Geometry being processed
  6292. */
  6293. /**
  6294. * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
  6295. * similar to Array.forEach.
  6296. *
  6297. * @name lineEach
  6298. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  6299. * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  6300. * @example
  6301. * var multiLine = turf.multiLineString([
  6302. * [[26, 37], [35, 45]],
  6303. * [[36, 53], [38, 50], [41, 55]]
  6304. * ]);
  6305. *
  6306. * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  6307. * //=currentLine
  6308. * //=featureIndex
  6309. * //=multiFeatureIndex
  6310. * //=geometryIndex
  6311. * });
  6312. */
  6313. function lineEach(geojson, callback) {
  6314. // validation
  6315. if (!geojson) throw new Error('geojson is required');
  6316. flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  6317. if (feature$$1.geometry === null) return;
  6318. var type = feature$$1.geometry.type;
  6319. var coords = feature$$1.geometry.coordinates;
  6320. switch (type) {
  6321. case 'LineString':
  6322. if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
  6323. break;
  6324. case 'Polygon':
  6325. for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
  6326. if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  6327. }
  6328. break;
  6329. }
  6330. });
  6331. }
  6332. /**
  6333. * Callback for lineReduce
  6334. *
  6335. * The first time the callback function is called, the values provided as arguments depend
  6336. * on whether the reduce method has an initialValue argument.
  6337. *
  6338. * If an initialValue is provided to the reduce method:
  6339. * - The previousValue argument is initialValue.
  6340. * - The currentValue argument is the value of the first element present in the array.
  6341. *
  6342. * If an initialValue is not provided:
  6343. * - The previousValue argument is the value of the first element present in the array.
  6344. * - The currentValue argument is the value of the second element present in the array.
  6345. *
  6346. * @callback lineReduceCallback
  6347. * @param {*} previousValue The accumulated value previously returned in the last invocation
  6348. * of the callback, or initialValue, if supplied.
  6349. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
  6350. * @param {number} featureIndex The current index of the Feature being processed
  6351. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  6352. * @param {number} geometryIndex The current index of the Geometry being processed
  6353. */
  6354. /**
  6355. * Reduce features in any GeoJSON object, similar to Array.reduce().
  6356. *
  6357. * @name lineReduce
  6358. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  6359. * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  6360. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  6361. * @returns {*} The value that results from the reduction.
  6362. * @example
  6363. * var multiPoly = turf.multiPolygon([
  6364. * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
  6365. * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
  6366. * ]);
  6367. *
  6368. * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  6369. * //=previousValue
  6370. * //=currentLine
  6371. * //=featureIndex
  6372. * //=multiFeatureIndex
  6373. * //=geometryIndex
  6374. * return currentLine
  6375. * });
  6376. */
  6377. function lineReduce(geojson, callback, initialValue) {
  6378. var previousValue = initialValue;
  6379. lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  6380. if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
  6381. else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
  6382. });
  6383. return previousValue;
  6384. }
  6385. /**
  6386. * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
  6387. *
  6388. * Negative indexes are permitted.
  6389. * Point & MultiPoint will always return null.
  6390. *
  6391. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  6392. * @param {Object} [options={}] Optional parameters
  6393. * @param {number} [options.featureIndex=0] Feature Index
  6394. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  6395. * @param {number} [options.geometryIndex=0] Geometry Index
  6396. * @param {number} [options.segmentIndex=0] Segment Index
  6397. * @param {Object} [options.properties={}] Translate Properties to output LineString
  6398. * @param {BBox} [options.bbox={}] Translate BBox to output LineString
  6399. * @param {number|string} [options.id={}] Translate Id to output LineString
  6400. * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
  6401. * @example
  6402. * var multiLine = turf.multiLineString([
  6403. * [[10, 10], [50, 30], [30, 40]],
  6404. * [[-10, -10], [-50, -30], [-30, -40]]
  6405. * ]);
  6406. *
  6407. * // First Segment (defaults are 0)
  6408. * turf.findSegment(multiLine);
  6409. * // => Feature<LineString<[[10, 10], [50, 30]]>>
  6410. *
  6411. * // First Segment of 2nd Multi Feature
  6412. * turf.findSegment(multiLine, {multiFeatureIndex: 1});
  6413. * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
  6414. *
  6415. * // Last Segment of Last Multi Feature
  6416. * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
  6417. * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
  6418. */
  6419. function findSegment(geojson, options) {
  6420. // Optional Parameters
  6421. options = options || {};
  6422. if (!isObject(options)) throw new Error('options is invalid');
  6423. var featureIndex = options.featureIndex || 0;
  6424. var multiFeatureIndex = options.multiFeatureIndex || 0;
  6425. var geometryIndex = options.geometryIndex || 0;
  6426. var segmentIndex = options.segmentIndex || 0;
  6427. // Find FeatureIndex
  6428. var properties = options.properties;
  6429. var geometry;
  6430. switch (geojson.type) {
  6431. case 'FeatureCollection':
  6432. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  6433. properties = properties || geojson.features[featureIndex].properties;
  6434. geometry = geojson.features[featureIndex].geometry;
  6435. break;
  6436. case 'Feature':
  6437. properties = properties || geojson.properties;
  6438. geometry = geojson.geometry;
  6439. break;
  6440. case 'Point':
  6441. case 'MultiPoint':
  6442. return null;
  6443. case 'LineString':
  6444. case 'Polygon':
  6445. case 'MultiLineString':
  6446. case 'MultiPolygon':
  6447. geometry = geojson;
  6448. break;
  6449. default:
  6450. throw new Error('geojson is invalid');
  6451. }
  6452. // Find SegmentIndex
  6453. if (geometry === null) return null;
  6454. var coords = geometry.coordinates;
  6455. switch (geometry.type) {
  6456. case 'Point':
  6457. case 'MultiPoint':
  6458. return null;
  6459. case 'LineString':
  6460. if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
  6461. return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
  6462. case 'Polygon':
  6463. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  6464. if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
  6465. return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
  6466. case 'MultiLineString':
  6467. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  6468. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
  6469. return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
  6470. case 'MultiPolygon':
  6471. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  6472. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  6473. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
  6474. return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
  6475. }
  6476. throw new Error('geojson is invalid');
  6477. }
  6478. /**
  6479. * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
  6480. *
  6481. * Negative indexes are permitted.
  6482. *
  6483. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  6484. * @param {Object} [options={}] Optional parameters
  6485. * @param {number} [options.featureIndex=0] Feature Index
  6486. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  6487. * @param {number} [options.geometryIndex=0] Geometry Index
  6488. * @param {number} [options.coordIndex=0] Coord Index
  6489. * @param {Object} [options.properties={}] Translate Properties to output Point
  6490. * @param {BBox} [options.bbox={}] Translate BBox to output Point
  6491. * @param {number|string} [options.id={}] Translate Id to output Point
  6492. * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
  6493. * @example
  6494. * var multiLine = turf.multiLineString([
  6495. * [[10, 10], [50, 30], [30, 40]],
  6496. * [[-10, -10], [-50, -30], [-30, -40]]
  6497. * ]);
  6498. *
  6499. * // First Segment (defaults are 0)
  6500. * turf.findPoint(multiLine);
  6501. * // => Feature<Point<[10, 10]>>
  6502. *
  6503. * // First Segment of the 2nd Multi-Feature
  6504. * turf.findPoint(multiLine, {multiFeatureIndex: 1});
  6505. * // => Feature<Point<[-10, -10]>>
  6506. *
  6507. * // Last Segment of last Multi-Feature
  6508. * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
  6509. * // => Feature<Point<[-30, -40]>>
  6510. */
  6511. function findPoint(geojson, options) {
  6512. // Optional Parameters
  6513. options = options || {};
  6514. if (!isObject(options)) throw new Error('options is invalid');
  6515. var featureIndex = options.featureIndex || 0;
  6516. var multiFeatureIndex = options.multiFeatureIndex || 0;
  6517. var geometryIndex = options.geometryIndex || 0;
  6518. var coordIndex = options.coordIndex || 0;
  6519. // Find FeatureIndex
  6520. var properties = options.properties;
  6521. var geometry;
  6522. switch (geojson.type) {
  6523. case 'FeatureCollection':
  6524. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  6525. properties = properties || geojson.features[featureIndex].properties;
  6526. geometry = geojson.features[featureIndex].geometry;
  6527. break;
  6528. case 'Feature':
  6529. properties = properties || geojson.properties;
  6530. geometry = geojson.geometry;
  6531. break;
  6532. case 'Point':
  6533. case 'MultiPoint':
  6534. return null;
  6535. case 'LineString':
  6536. case 'Polygon':
  6537. case 'MultiLineString':
  6538. case 'MultiPolygon':
  6539. geometry = geojson;
  6540. break;
  6541. default:
  6542. throw new Error('geojson is invalid');
  6543. }
  6544. // Find Coord Index
  6545. if (geometry === null) return null;
  6546. var coords = geometry.coordinates;
  6547. switch (geometry.type) {
  6548. case 'Point':
  6549. return point(coords, properties, options);
  6550. case 'MultiPoint':
  6551. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  6552. return point(coords[multiFeatureIndex], properties, options);
  6553. case 'LineString':
  6554. if (coordIndex < 0) coordIndex = coords.length + coordIndex;
  6555. return point(coords[coordIndex], properties, options);
  6556. case 'Polygon':
  6557. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  6558. if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
  6559. return point(coords[geometryIndex][coordIndex], properties, options);
  6560. case 'MultiLineString':
  6561. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  6562. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
  6563. return point(coords[multiFeatureIndex][coordIndex], properties, options);
  6564. case 'MultiPolygon':
  6565. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  6566. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  6567. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
  6568. return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
  6569. }
  6570. throw new Error('geojson is invalid');
  6571. }
  6572. ;// CONCATENATED MODULE: ./node_modules/@turf/center/node_modules/@turf/bbox/main.es.js
  6573. /**
  6574. * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
  6575. *
  6576. * @name bbox
  6577. * @param {GeoJSON} geojson any GeoJSON object
  6578. * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
  6579. * @example
  6580. * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
  6581. * var bbox = turf.bbox(line);
  6582. * var bboxPolygon = turf.bboxPolygon(bbox);
  6583. *
  6584. * //addToMap
  6585. * var addToMap = [line, bboxPolygon]
  6586. */
  6587. function bbox(geojson) {
  6588. var BBox = [Infinity, Infinity, -Infinity, -Infinity];
  6589. coordEach(geojson, function (coord) {
  6590. if (BBox[0] > coord[0]) BBox[0] = coord[0];
  6591. if (BBox[1] > coord[1]) BBox[1] = coord[1];
  6592. if (BBox[2] < coord[0]) BBox[2] = coord[0];
  6593. if (BBox[3] < coord[1]) BBox[3] = coord[1];
  6594. });
  6595. return BBox;
  6596. }
  6597. /* harmony default export */ var bbox_main_es = (bbox);
  6598. ;// CONCATENATED MODULE: ./node_modules/@turf/center/main.es.js
  6599. /**
  6600. * Takes a {@link Feature} or {@link FeatureCollection} and returns the absolute center point of all features.
  6601. *
  6602. * @name center
  6603. * @param {GeoJSON} geojson GeoJSON to be centered
  6604. * @param {Object} [options={}] Optional parameters
  6605. * @param {Object} [options.properties={}] an Object that is used as the {@link Feature}'s properties
  6606. * @returns {Feature<Point>} a Point feature at the absolute center point of all input features
  6607. * @example
  6608. * var features = turf.featureCollection([
  6609. * turf.point( [-97.522259, 35.4691]),
  6610. * turf.point( [-97.502754, 35.463455]),
  6611. * turf.point( [-97.508269, 35.463245])
  6612. * ]);
  6613. *
  6614. * var center = turf.center(features);
  6615. *
  6616. * //addToMap
  6617. * var addToMap = [features, center]
  6618. * center.properties['marker-size'] = 'large';
  6619. * center.properties['marker-color'] = '#000';
  6620. */
  6621. function center(geojson, options) {
  6622. // Optional parameters
  6623. options = options || {};
  6624. if (!main_es_isObject(options)) throw new Error('options is invalid');
  6625. var properties = options.properties;
  6626. // Input validation
  6627. if (!geojson) throw new Error('geojson is required');
  6628. var ext = bbox_main_es(geojson);
  6629. var x = (ext[0] + ext[2]) / 2;
  6630. var y = (ext[1] + ext[3]) / 2;
  6631. return main_es_point([x, y], properties);
  6632. }
  6633. /* harmony default export */ var center_main_es = (center);
  6634. ;// CONCATENATED MODULE: ./node_modules/@turf/centroid/node_modules/@turf/helpers/main.es.js
  6635. /**
  6636. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  6637. */
  6638. var main_es_earthRadius = 6371008.8;
  6639. /**
  6640. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  6641. */
  6642. var main_es_factors = {
  6643. meters: main_es_earthRadius,
  6644. metres: main_es_earthRadius,
  6645. millimeters: main_es_earthRadius * 1000,
  6646. millimetres: main_es_earthRadius * 1000,
  6647. centimeters: main_es_earthRadius * 100,
  6648. centimetres: main_es_earthRadius * 100,
  6649. kilometers: main_es_earthRadius / 1000,
  6650. kilometres: main_es_earthRadius / 1000,
  6651. miles: main_es_earthRadius / 1609.344,
  6652. nauticalmiles: main_es_earthRadius / 1852,
  6653. inches: main_es_earthRadius * 39.370,
  6654. yards: main_es_earthRadius / 1.0936,
  6655. feet: main_es_earthRadius * 3.28084,
  6656. radians: 1,
  6657. degrees: main_es_earthRadius / 111325,
  6658. };
  6659. /**
  6660. * Units of measurement factors based on 1 meter.
  6661. */
  6662. var main_es_unitsFactors = {
  6663. meters: 1,
  6664. metres: 1,
  6665. millimeters: 1000,
  6666. millimetres: 1000,
  6667. centimeters: 100,
  6668. centimetres: 100,
  6669. kilometers: 1 / 1000,
  6670. kilometres: 1 / 1000,
  6671. miles: 1 / 1609.344,
  6672. nauticalmiles: 1 / 1852,
  6673. inches: 39.370,
  6674. yards: 1 / 1.0936,
  6675. feet: 3.28084,
  6676. radians: 1 / main_es_earthRadius,
  6677. degrees: 1 / 111325,
  6678. };
  6679. /**
  6680. * Area of measurement factors based on 1 square meter.
  6681. */
  6682. var main_es_areaFactors = {
  6683. meters: 1,
  6684. metres: 1,
  6685. millimeters: 1000000,
  6686. millimetres: 1000000,
  6687. centimeters: 10000,
  6688. centimetres: 10000,
  6689. kilometers: 0.000001,
  6690. kilometres: 0.000001,
  6691. acres: 0.000247105,
  6692. miles: 3.86e-7,
  6693. yards: 1.195990046,
  6694. feet: 10.763910417,
  6695. inches: 1550.003100006
  6696. };
  6697. /**
  6698. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  6699. *
  6700. * @name feature
  6701. * @param {Geometry} geometry input geometry
  6702. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6703. * @param {Object} [options={}] Optional Parameters
  6704. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6705. * @param {string|number} [options.id] Identifier associated with the Feature
  6706. * @returns {Feature} a GeoJSON Feature
  6707. * @example
  6708. * var geometry = {
  6709. * "type": "Point",
  6710. * "coordinates": [110, 50]
  6711. * };
  6712. *
  6713. * var feature = turf.feature(geometry);
  6714. *
  6715. * //=feature
  6716. */
  6717. function helpers_main_es_feature(geometry, properties, options) {
  6718. // Optional Parameters
  6719. options = options || {};
  6720. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  6721. var bbox = options.bbox;
  6722. var id = options.id;
  6723. // Validation
  6724. if (geometry === undefined) throw new Error('geometry is required');
  6725. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  6726. if (bbox) main_es_validateBBox(bbox);
  6727. if (id) main_es_validateId(id);
  6728. // Main
  6729. var feat = {type: 'Feature'};
  6730. if (id) feat.id = id;
  6731. if (bbox) feat.bbox = bbox;
  6732. feat.properties = properties || {};
  6733. feat.geometry = geometry;
  6734. return feat;
  6735. }
  6736. /**
  6737. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  6738. * For GeometryCollection type use `helpers.geometryCollection`
  6739. *
  6740. * @name geometry
  6741. * @param {string} type Geometry Type
  6742. * @param {Array<number>} coordinates Coordinates
  6743. * @param {Object} [options={}] Optional Parameters
  6744. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  6745. * @returns {Geometry} a GeoJSON Geometry
  6746. * @example
  6747. * var type = 'Point';
  6748. * var coordinates = [110, 50];
  6749. *
  6750. * var geometry = turf.geometry(type, coordinates);
  6751. *
  6752. * //=geometry
  6753. */
  6754. function main_es_geometry(type, coordinates, options) {
  6755. // Optional Parameters
  6756. options = options || {};
  6757. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  6758. var bbox = options.bbox;
  6759. // Validation
  6760. if (!type) throw new Error('type is required');
  6761. if (!coordinates) throw new Error('coordinates is required');
  6762. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  6763. if (bbox) main_es_validateBBox(bbox);
  6764. // Main
  6765. var geom;
  6766. switch (type) {
  6767. case 'Point': geom = helpers_main_es_point(coordinates).geometry; break;
  6768. case 'LineString': geom = helpers_main_es_lineString(coordinates).geometry; break;
  6769. case 'Polygon': geom = main_es_polygon(coordinates).geometry; break;
  6770. case 'MultiPoint': geom = main_es_multiPoint(coordinates).geometry; break;
  6771. case 'MultiLineString': geom = main_es_multiLineString(coordinates).geometry; break;
  6772. case 'MultiPolygon': geom = main_es_multiPolygon(coordinates).geometry; break;
  6773. default: throw new Error(type + ' is invalid');
  6774. }
  6775. if (bbox) geom.bbox = bbox;
  6776. return geom;
  6777. }
  6778. /**
  6779. * Creates a {@link Point} {@link Feature} from a Position.
  6780. *
  6781. * @name point
  6782. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  6783. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6784. * @param {Object} [options={}] Optional Parameters
  6785. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6786. * @param {string|number} [options.id] Identifier associated with the Feature
  6787. * @returns {Feature<Point>} a Point feature
  6788. * @example
  6789. * var point = turf.point([-75.343, 39.984]);
  6790. *
  6791. * //=point
  6792. */
  6793. function helpers_main_es_point(coordinates, properties, options) {
  6794. if (!coordinates) throw new Error('coordinates is required');
  6795. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  6796. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  6797. if (!helpers_main_es_isNumber(coordinates[0]) || !helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  6798. return helpers_main_es_feature({
  6799. type: 'Point',
  6800. coordinates: coordinates
  6801. }, properties, options);
  6802. }
  6803. /**
  6804. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  6805. *
  6806. * @name points
  6807. * @param {Array<Array<number>>} coordinates an array of Points
  6808. * @param {Object} [properties={}] Translate these properties to each Feature
  6809. * @param {Object} [options={}] Optional Parameters
  6810. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  6811. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  6812. * @returns {FeatureCollection<Point>} Point Feature
  6813. * @example
  6814. * var points = turf.points([
  6815. * [-75, 39],
  6816. * [-80, 45],
  6817. * [-78, 50]
  6818. * ]);
  6819. *
  6820. * //=points
  6821. */
  6822. function main_es_points(coordinates, properties, options) {
  6823. if (!coordinates) throw new Error('coordinates is required');
  6824. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  6825. return main_es_featureCollection(coordinates.map(function (coords) {
  6826. return helpers_main_es_point(coords, properties);
  6827. }), options);
  6828. }
  6829. /**
  6830. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  6831. *
  6832. * @name polygon
  6833. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  6834. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6835. * @param {Object} [options={}] Optional Parameters
  6836. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6837. * @param {string|number} [options.id] Identifier associated with the Feature
  6838. * @returns {Feature<Polygon>} Polygon Feature
  6839. * @example
  6840. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  6841. *
  6842. * //=polygon
  6843. */
  6844. function main_es_polygon(coordinates, properties, options) {
  6845. if (!coordinates) throw new Error('coordinates is required');
  6846. for (var i = 0; i < coordinates.length; i++) {
  6847. var ring = coordinates[i];
  6848. if (ring.length < 4) {
  6849. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  6850. }
  6851. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  6852. // Check if first point of Polygon contains two numbers
  6853. if (i === 0 && j === 0 && !helpers_main_es_isNumber(ring[0][0]) || !helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  6854. if (ring[ring.length - 1][j] !== ring[0][j]) {
  6855. throw new Error('First and last Position are not equivalent.');
  6856. }
  6857. }
  6858. }
  6859. return helpers_main_es_feature({
  6860. type: 'Polygon',
  6861. coordinates: coordinates
  6862. }, properties, options);
  6863. }
  6864. /**
  6865. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  6866. *
  6867. * @name polygons
  6868. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  6869. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6870. * @param {Object} [options={}] Optional Parameters
  6871. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6872. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  6873. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  6874. * @example
  6875. * var polygons = turf.polygons([
  6876. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  6877. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  6878. * ]);
  6879. *
  6880. * //=polygons
  6881. */
  6882. function main_es_polygons(coordinates, properties, options) {
  6883. if (!coordinates) throw new Error('coordinates is required');
  6884. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  6885. return main_es_featureCollection(coordinates.map(function (coords) {
  6886. return main_es_polygon(coords, properties);
  6887. }), options);
  6888. }
  6889. /**
  6890. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  6891. *
  6892. * @name lineString
  6893. * @param {Array<Array<number>>} coordinates an array of Positions
  6894. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6895. * @param {Object} [options={}] Optional Parameters
  6896. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6897. * @param {string|number} [options.id] Identifier associated with the Feature
  6898. * @returns {Feature<LineString>} LineString Feature
  6899. * @example
  6900. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  6901. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  6902. *
  6903. * //=linestring1
  6904. * //=linestring2
  6905. */
  6906. function helpers_main_es_lineString(coordinates, properties, options) {
  6907. if (!coordinates) throw new Error('coordinates is required');
  6908. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  6909. // Check if first point of LineString contains two numbers
  6910. if (!helpers_main_es_isNumber(coordinates[0][1]) || !helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  6911. return helpers_main_es_feature({
  6912. type: 'LineString',
  6913. coordinates: coordinates
  6914. }, properties, options);
  6915. }
  6916. /**
  6917. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  6918. *
  6919. * @name lineStrings
  6920. * @param {Array<Array<number>>} coordinates an array of LinearRings
  6921. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6922. * @param {Object} [options={}] Optional Parameters
  6923. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  6924. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  6925. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  6926. * @example
  6927. * var linestrings = turf.lineStrings([
  6928. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  6929. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  6930. * ]);
  6931. *
  6932. * //=linestrings
  6933. */
  6934. function main_es_lineStrings(coordinates, properties, options) {
  6935. if (!coordinates) throw new Error('coordinates is required');
  6936. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  6937. return main_es_featureCollection(coordinates.map(function (coords) {
  6938. return helpers_main_es_lineString(coords, properties);
  6939. }), options);
  6940. }
  6941. /**
  6942. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  6943. *
  6944. * @name featureCollection
  6945. * @param {Feature[]} features input features
  6946. * @param {Object} [options={}] Optional Parameters
  6947. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6948. * @param {string|number} [options.id] Identifier associated with the Feature
  6949. * @returns {FeatureCollection} FeatureCollection of Features
  6950. * @example
  6951. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  6952. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  6953. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  6954. *
  6955. * var collection = turf.featureCollection([
  6956. * locationA,
  6957. * locationB,
  6958. * locationC
  6959. * ]);
  6960. *
  6961. * //=collection
  6962. */
  6963. function main_es_featureCollection(features, options) {
  6964. // Optional Parameters
  6965. options = options || {};
  6966. if (!helpers_main_es_isObject(options)) throw new Error('options is invalid');
  6967. var bbox = options.bbox;
  6968. var id = options.id;
  6969. // Validation
  6970. if (!features) throw new Error('No features passed');
  6971. if (!Array.isArray(features)) throw new Error('features must be an Array');
  6972. if (bbox) main_es_validateBBox(bbox);
  6973. if (id) main_es_validateId(id);
  6974. // Main
  6975. var fc = {type: 'FeatureCollection'};
  6976. if (id) fc.id = id;
  6977. if (bbox) fc.bbox = bbox;
  6978. fc.features = features;
  6979. return fc;
  6980. }
  6981. /**
  6982. * Creates a {@link Feature<MultiLineString>} based on a
  6983. * coordinate array. Properties can be added optionally.
  6984. *
  6985. * @name multiLineString
  6986. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  6987. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  6988. * @param {Object} [options={}] Optional Parameters
  6989. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  6990. * @param {string|number} [options.id] Identifier associated with the Feature
  6991. * @returns {Feature<MultiLineString>} a MultiLineString feature
  6992. * @throws {Error} if no coordinates are passed
  6993. * @example
  6994. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  6995. *
  6996. * //=multiLine
  6997. */
  6998. function main_es_multiLineString(coordinates, properties, options) {
  6999. if (!coordinates) throw new Error('coordinates is required');
  7000. return helpers_main_es_feature({
  7001. type: 'MultiLineString',
  7002. coordinates: coordinates
  7003. }, properties, options);
  7004. }
  7005. /**
  7006. * Creates a {@link Feature<MultiPoint>} based on a
  7007. * coordinate array. Properties can be added optionally.
  7008. *
  7009. * @name multiPoint
  7010. * @param {Array<Array<number>>} coordinates an array of Positions
  7011. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  7012. * @param {Object} [options={}] Optional Parameters
  7013. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  7014. * @param {string|number} [options.id] Identifier associated with the Feature
  7015. * @returns {Feature<MultiPoint>} a MultiPoint feature
  7016. * @throws {Error} if no coordinates are passed
  7017. * @example
  7018. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  7019. *
  7020. * //=multiPt
  7021. */
  7022. function main_es_multiPoint(coordinates, properties, options) {
  7023. if (!coordinates) throw new Error('coordinates is required');
  7024. return helpers_main_es_feature({
  7025. type: 'MultiPoint',
  7026. coordinates: coordinates
  7027. }, properties, options);
  7028. }
  7029. /**
  7030. * Creates a {@link Feature<MultiPolygon>} based on a
  7031. * coordinate array. Properties can be added optionally.
  7032. *
  7033. * @name multiPolygon
  7034. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  7035. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  7036. * @param {Object} [options={}] Optional Parameters
  7037. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  7038. * @param {string|number} [options.id] Identifier associated with the Feature
  7039. * @returns {Feature<MultiPolygon>} a multipolygon feature
  7040. * @throws {Error} if no coordinates are passed
  7041. * @example
  7042. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  7043. *
  7044. * //=multiPoly
  7045. *
  7046. */
  7047. function main_es_multiPolygon(coordinates, properties, options) {
  7048. if (!coordinates) throw new Error('coordinates is required');
  7049. return helpers_main_es_feature({
  7050. type: 'MultiPolygon',
  7051. coordinates: coordinates
  7052. }, properties, options);
  7053. }
  7054. /**
  7055. * Creates a {@link Feature<GeometryCollection>} based on a
  7056. * coordinate array. Properties can be added optionally.
  7057. *
  7058. * @name geometryCollection
  7059. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  7060. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  7061. * @param {Object} [options={}] Optional Parameters
  7062. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  7063. * @param {string|number} [options.id] Identifier associated with the Feature
  7064. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  7065. * @example
  7066. * var pt = {
  7067. * "type": "Point",
  7068. * "coordinates": [100, 0]
  7069. * };
  7070. * var line = {
  7071. * "type": "LineString",
  7072. * "coordinates": [ [101, 0], [102, 1] ]
  7073. * };
  7074. * var collection = turf.geometryCollection([pt, line]);
  7075. *
  7076. * //=collection
  7077. */
  7078. function main_es_geometryCollection(geometries, properties, options) {
  7079. if (!geometries) throw new Error('geometries is required');
  7080. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  7081. return helpers_main_es_feature({
  7082. type: 'GeometryCollection',
  7083. geometries: geometries
  7084. }, properties, options);
  7085. }
  7086. /**
  7087. * Round number to precision
  7088. *
  7089. * @param {number} num Number
  7090. * @param {number} [precision=0] Precision
  7091. * @returns {number} rounded number
  7092. * @example
  7093. * turf.round(120.4321)
  7094. * //=120
  7095. *
  7096. * turf.round(120.4321, 2)
  7097. * //=120.43
  7098. */
  7099. function main_es_round(num, precision) {
  7100. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  7101. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  7102. var multiplier = Math.pow(10, precision || 0);
  7103. return Math.round(num * multiplier) / multiplier;
  7104. }
  7105. /**
  7106. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  7107. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  7108. *
  7109. * @name radiansToLength
  7110. * @param {number} radians in radians across the sphere
  7111. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  7112. * @returns {number} distance
  7113. */
  7114. function main_es_radiansToLength(radians, units) {
  7115. if (radians === undefined || radians === null) throw new Error('radians is required');
  7116. if (units && typeof units !== 'string') throw new Error('units must be a string');
  7117. var factor = main_es_factors[units || 'kilometers'];
  7118. if (!factor) throw new Error(units + ' units is invalid');
  7119. return radians * factor;
  7120. }
  7121. /**
  7122. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  7123. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  7124. *
  7125. * @name lengthToRadians
  7126. * @param {number} distance in real units
  7127. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  7128. * @returns {number} radians
  7129. */
  7130. function main_es_lengthToRadians(distance, units) {
  7131. if (distance === undefined || distance === null) throw new Error('distance is required');
  7132. if (units && typeof units !== 'string') throw new Error('units must be a string');
  7133. var factor = main_es_factors[units || 'kilometers'];
  7134. if (!factor) throw new Error(units + ' units is invalid');
  7135. return distance / factor;
  7136. }
  7137. /**
  7138. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  7139. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  7140. *
  7141. * @name lengthToDegrees
  7142. * @param {number} distance in real units
  7143. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  7144. * @returns {number} degrees
  7145. */
  7146. function main_es_lengthToDegrees(distance, units) {
  7147. return main_es_radiansToDegrees(main_es_lengthToRadians(distance, units));
  7148. }
  7149. /**
  7150. * Converts any bearing angle from the north line direction (positive clockwise)
  7151. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  7152. *
  7153. * @name bearingToAzimuth
  7154. * @param {number} bearing angle, between -180 and +180 degrees
  7155. * @returns {number} angle between 0 and 360 degrees
  7156. */
  7157. function main_es_bearingToAzimuth(bearing) {
  7158. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  7159. var angle = bearing % 360;
  7160. if (angle < 0) angle += 360;
  7161. return angle;
  7162. }
  7163. /**
  7164. * Converts an angle in radians to degrees
  7165. *
  7166. * @name radiansToDegrees
  7167. * @param {number} radians angle in radians
  7168. * @returns {number} degrees between 0 and 360 degrees
  7169. */
  7170. function main_es_radiansToDegrees(radians) {
  7171. if (radians === null || radians === undefined) throw new Error('radians is required');
  7172. var degrees = radians % (2 * Math.PI);
  7173. return degrees * 180 / Math.PI;
  7174. }
  7175. /**
  7176. * Converts an angle in degrees to radians
  7177. *
  7178. * @name degreesToRadians
  7179. * @param {number} degrees angle between 0 and 360 degrees
  7180. * @returns {number} angle in radians
  7181. */
  7182. function main_es_degreesToRadians(degrees) {
  7183. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  7184. var radians = degrees % 360;
  7185. return radians * Math.PI / 180;
  7186. }
  7187. /**
  7188. * Converts a length to the requested unit.
  7189. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  7190. *
  7191. * @param {number} length to be converted
  7192. * @param {string} originalUnit of the length
  7193. * @param {string} [finalUnit='kilometers'] returned unit
  7194. * @returns {number} the converted length
  7195. */
  7196. function main_es_convertLength(length, originalUnit, finalUnit) {
  7197. if (length === null || length === undefined) throw new Error('length is required');
  7198. if (!(length >= 0)) throw new Error('length must be a positive number');
  7199. return main_es_radiansToLength(main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  7200. }
  7201. /**
  7202. * Converts a area to the requested unit.
  7203. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  7204. * @param {number} area to be converted
  7205. * @param {string} [originalUnit='meters'] of the distance
  7206. * @param {string} [finalUnit='kilometers'] returned unit
  7207. * @returns {number} the converted distance
  7208. */
  7209. function main_es_convertArea(area, originalUnit, finalUnit) {
  7210. if (area === null || area === undefined) throw new Error('area is required');
  7211. if (!(area >= 0)) throw new Error('area must be a positive number');
  7212. var startFactor = main_es_areaFactors[originalUnit || 'meters'];
  7213. if (!startFactor) throw new Error('invalid original units');
  7214. var finalFactor = main_es_areaFactors[finalUnit || 'kilometers'];
  7215. if (!finalFactor) throw new Error('invalid final units');
  7216. return (area / startFactor) * finalFactor;
  7217. }
  7218. /**
  7219. * isNumber
  7220. *
  7221. * @param {*} num Number to validate
  7222. * @returns {boolean} true/false
  7223. * @example
  7224. * turf.isNumber(123)
  7225. * //=true
  7226. * turf.isNumber('foo')
  7227. * //=false
  7228. */
  7229. function helpers_main_es_isNumber(num) {
  7230. return !isNaN(num) && num !== null && !Array.isArray(num);
  7231. }
  7232. /**
  7233. * isObject
  7234. *
  7235. * @param {*} input variable to validate
  7236. * @returns {boolean} true/false
  7237. * @example
  7238. * turf.isObject({elevation: 10})
  7239. * //=true
  7240. * turf.isObject('foo')
  7241. * //=false
  7242. */
  7243. function helpers_main_es_isObject(input) {
  7244. return (!!input) && (input.constructor === Object);
  7245. }
  7246. /**
  7247. * Validate BBox
  7248. *
  7249. * @private
  7250. * @param {Array<number>} bbox BBox to validate
  7251. * @returns {void}
  7252. * @throws Error if BBox is not valid
  7253. * @example
  7254. * validateBBox([-180, -40, 110, 50])
  7255. * //=OK
  7256. * validateBBox([-180, -40])
  7257. * //=Error
  7258. * validateBBox('Foo')
  7259. * //=Error
  7260. * validateBBox(5)
  7261. * //=Error
  7262. * validateBBox(null)
  7263. * //=Error
  7264. * validateBBox(undefined)
  7265. * //=Error
  7266. */
  7267. function main_es_validateBBox(bbox) {
  7268. if (!bbox) throw new Error('bbox is required');
  7269. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  7270. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  7271. bbox.forEach(function (num) {
  7272. if (!helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  7273. });
  7274. }
  7275. /**
  7276. * Validate Id
  7277. *
  7278. * @private
  7279. * @param {string|number} id Id to validate
  7280. * @returns {void}
  7281. * @throws Error if Id is not valid
  7282. * @example
  7283. * validateId([-180, -40, 110, 50])
  7284. * //=Error
  7285. * validateId([-180, -40])
  7286. * //=Error
  7287. * validateId('Foo')
  7288. * //=OK
  7289. * validateId(5)
  7290. * //=OK
  7291. * validateId(null)
  7292. * //=Error
  7293. * validateId(undefined)
  7294. * //=Error
  7295. */
  7296. function main_es_validateId(id) {
  7297. if (!id) throw new Error('id is required');
  7298. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  7299. }
  7300. // Deprecated methods
  7301. function main_es_radians2degrees() {
  7302. throw new Error('method has been renamed to `radiansToDegrees`');
  7303. }
  7304. function main_es_degrees2radians() {
  7305. throw new Error('method has been renamed to `degreesToRadians`');
  7306. }
  7307. function main_es_distanceToDegrees() {
  7308. throw new Error('method has been renamed to `lengthToDegrees`');
  7309. }
  7310. function main_es_distanceToRadians() {
  7311. throw new Error('method has been renamed to `lengthToRadians`');
  7312. }
  7313. function main_es_radiansToDistance() {
  7314. throw new Error('method has been renamed to `radiansToLength`');
  7315. }
  7316. function main_es_bearingToAngle() {
  7317. throw new Error('method has been renamed to `bearingToAzimuth`');
  7318. }
  7319. function main_es_convertDistance() {
  7320. throw new Error('method has been renamed to `convertLength`');
  7321. }
  7322. ;// CONCATENATED MODULE: ./node_modules/@turf/centroid/node_modules/@turf/meta/main.es.js
  7323. /**
  7324. * Callback for coordEach
  7325. *
  7326. * @callback coordEachCallback
  7327. * @param {Array<number>} currentCoord The current coordinate being processed.
  7328. * @param {number} coordIndex The current index of the coordinate being processed.
  7329. * @param {number} featureIndex The current index of the Feature being processed.
  7330. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  7331. * @param {number} geometryIndex The current index of the Geometry being processed.
  7332. */
  7333. /**
  7334. * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
  7335. *
  7336. * @name coordEach
  7337. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7338. * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
  7339. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  7340. * @returns {void}
  7341. * @example
  7342. * var features = turf.featureCollection([
  7343. * turf.point([26, 37], {"foo": "bar"}),
  7344. * turf.point([36, 53], {"hello": "world"})
  7345. * ]);
  7346. *
  7347. * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  7348. * //=currentCoord
  7349. * //=coordIndex
  7350. * //=featureIndex
  7351. * //=multiFeatureIndex
  7352. * //=geometryIndex
  7353. * });
  7354. */
  7355. function main_es_coordEach(geojson, callback, excludeWrapCoord) {
  7356. // Handles null Geometry -- Skips this GeoJSON
  7357. if (geojson === null) return;
  7358. var j, k, l, geometry, stopG, coords,
  7359. geometryMaybeCollection,
  7360. wrapShrink = 0,
  7361. coordIndex = 0,
  7362. isGeometryCollection,
  7363. type = geojson.type,
  7364. isFeatureCollection = type === 'FeatureCollection',
  7365. isFeature = type === 'Feature',
  7366. stop = isFeatureCollection ? geojson.features.length : 1;
  7367. // This logic may look a little weird. The reason why it is that way
  7368. // is because it's trying to be fast. GeoJSON supports multiple kinds
  7369. // of objects at its root: FeatureCollection, Features, Geometries.
  7370. // This function has the responsibility of handling all of them, and that
  7371. // means that some of the `for` loops you see below actually just don't apply
  7372. // to certain inputs. For instance, if you give this just a
  7373. // Point geometry, then both loops are short-circuited and all we do
  7374. // is gradually rename the input until it's called 'geometry'.
  7375. //
  7376. // This also aims to allocate as few resources as possible: just a
  7377. // few numbers and booleans, rather than any temporary arrays as would
  7378. // be required with the normalization approach.
  7379. for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
  7380. geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
  7381. (isFeature ? geojson.geometry : geojson));
  7382. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  7383. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  7384. for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
  7385. var multiFeatureIndex = 0;
  7386. var geometryIndex = 0;
  7387. geometry = isGeometryCollection ?
  7388. geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
  7389. // Handles null Geometry -- Skips this geometry
  7390. if (geometry === null) continue;
  7391. coords = geometry.coordinates;
  7392. var geomType = geometry.type;
  7393. wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
  7394. switch (geomType) {
  7395. case null:
  7396. break;
  7397. case 'Point':
  7398. if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  7399. coordIndex++;
  7400. multiFeatureIndex++;
  7401. break;
  7402. case 'LineString':
  7403. case 'MultiPoint':
  7404. for (j = 0; j < coords.length; j++) {
  7405. if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  7406. coordIndex++;
  7407. if (geomType === 'MultiPoint') multiFeatureIndex++;
  7408. }
  7409. if (geomType === 'LineString') multiFeatureIndex++;
  7410. break;
  7411. case 'Polygon':
  7412. case 'MultiLineString':
  7413. for (j = 0; j < coords.length; j++) {
  7414. for (k = 0; k < coords[j].length - wrapShrink; k++) {
  7415. if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  7416. coordIndex++;
  7417. }
  7418. if (geomType === 'MultiLineString') multiFeatureIndex++;
  7419. if (geomType === 'Polygon') geometryIndex++;
  7420. }
  7421. if (geomType === 'Polygon') multiFeatureIndex++;
  7422. break;
  7423. case 'MultiPolygon':
  7424. for (j = 0; j < coords.length; j++) {
  7425. if (geomType === 'MultiPolygon') geometryIndex = 0;
  7426. for (k = 0; k < coords[j].length; k++) {
  7427. for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
  7428. if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  7429. coordIndex++;
  7430. }
  7431. geometryIndex++;
  7432. }
  7433. multiFeatureIndex++;
  7434. }
  7435. break;
  7436. case 'GeometryCollection':
  7437. for (j = 0; j < geometry.geometries.length; j++)
  7438. if (main_es_coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
  7439. break;
  7440. default:
  7441. throw new Error('Unknown Geometry Type');
  7442. }
  7443. }
  7444. }
  7445. }
  7446. /**
  7447. * Callback for coordReduce
  7448. *
  7449. * The first time the callback function is called, the values provided as arguments depend
  7450. * on whether the reduce method has an initialValue argument.
  7451. *
  7452. * If an initialValue is provided to the reduce method:
  7453. * - The previousValue argument is initialValue.
  7454. * - The currentValue argument is the value of the first element present in the array.
  7455. *
  7456. * If an initialValue is not provided:
  7457. * - The previousValue argument is the value of the first element present in the array.
  7458. * - The currentValue argument is the value of the second element present in the array.
  7459. *
  7460. * @callback coordReduceCallback
  7461. * @param {*} previousValue The accumulated value previously returned in the last invocation
  7462. * of the callback, or initialValue, if supplied.
  7463. * @param {Array<number>} currentCoord The current coordinate being processed.
  7464. * @param {number} coordIndex The current index of the coordinate being processed.
  7465. * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
  7466. * @param {number} featureIndex The current index of the Feature being processed.
  7467. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  7468. * @param {number} geometryIndex The current index of the Geometry being processed.
  7469. */
  7470. /**
  7471. * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
  7472. *
  7473. * @name coordReduce
  7474. * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
  7475. * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
  7476. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  7477. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  7478. * @returns {*} The value that results from the reduction.
  7479. * @example
  7480. * var features = turf.featureCollection([
  7481. * turf.point([26, 37], {"foo": "bar"}),
  7482. * turf.point([36, 53], {"hello": "world"})
  7483. * ]);
  7484. *
  7485. * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  7486. * //=previousValue
  7487. * //=currentCoord
  7488. * //=coordIndex
  7489. * //=featureIndex
  7490. * //=multiFeatureIndex
  7491. * //=geometryIndex
  7492. * return currentCoord;
  7493. * });
  7494. */
  7495. function main_es_coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
  7496. var previousValue = initialValue;
  7497. main_es_coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  7498. if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
  7499. else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
  7500. }, excludeWrapCoord);
  7501. return previousValue;
  7502. }
  7503. /**
  7504. * Callback for propEach
  7505. *
  7506. * @callback propEachCallback
  7507. * @param {Object} currentProperties The current Properties being processed.
  7508. * @param {number} featureIndex The current index of the Feature being processed.
  7509. */
  7510. /**
  7511. * Iterate over properties in any GeoJSON object, similar to Array.forEach()
  7512. *
  7513. * @name propEach
  7514. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  7515. * @param {Function} callback a method that takes (currentProperties, featureIndex)
  7516. * @returns {void}
  7517. * @example
  7518. * var features = turf.featureCollection([
  7519. * turf.point([26, 37], {foo: 'bar'}),
  7520. * turf.point([36, 53], {hello: 'world'})
  7521. * ]);
  7522. *
  7523. * turf.propEach(features, function (currentProperties, featureIndex) {
  7524. * //=currentProperties
  7525. * //=featureIndex
  7526. * });
  7527. */
  7528. function main_es_propEach(geojson, callback) {
  7529. var i;
  7530. switch (geojson.type) {
  7531. case 'FeatureCollection':
  7532. for (i = 0; i < geojson.features.length; i++) {
  7533. if (callback(geojson.features[i].properties, i) === false) break;
  7534. }
  7535. break;
  7536. case 'Feature':
  7537. callback(geojson.properties, 0);
  7538. break;
  7539. }
  7540. }
  7541. /**
  7542. * Callback for propReduce
  7543. *
  7544. * The first time the callback function is called, the values provided as arguments depend
  7545. * on whether the reduce method has an initialValue argument.
  7546. *
  7547. * If an initialValue is provided to the reduce method:
  7548. * - The previousValue argument is initialValue.
  7549. * - The currentValue argument is the value of the first element present in the array.
  7550. *
  7551. * If an initialValue is not provided:
  7552. * - The previousValue argument is the value of the first element present in the array.
  7553. * - The currentValue argument is the value of the second element present in the array.
  7554. *
  7555. * @callback propReduceCallback
  7556. * @param {*} previousValue The accumulated value previously returned in the last invocation
  7557. * of the callback, or initialValue, if supplied.
  7558. * @param {*} currentProperties The current Properties being processed.
  7559. * @param {number} featureIndex The current index of the Feature being processed.
  7560. */
  7561. /**
  7562. * Reduce properties in any GeoJSON object into a single value,
  7563. * similar to how Array.reduce works. However, in this case we lazily run
  7564. * the reduction, so an array of all properties is unnecessary.
  7565. *
  7566. * @name propReduce
  7567. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  7568. * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
  7569. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  7570. * @returns {*} The value that results from the reduction.
  7571. * @example
  7572. * var features = turf.featureCollection([
  7573. * turf.point([26, 37], {foo: 'bar'}),
  7574. * turf.point([36, 53], {hello: 'world'})
  7575. * ]);
  7576. *
  7577. * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
  7578. * //=previousValue
  7579. * //=currentProperties
  7580. * //=featureIndex
  7581. * return currentProperties
  7582. * });
  7583. */
  7584. function main_es_propReduce(geojson, callback, initialValue) {
  7585. var previousValue = initialValue;
  7586. main_es_propEach(geojson, function (currentProperties, featureIndex) {
  7587. if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
  7588. else previousValue = callback(previousValue, currentProperties, featureIndex);
  7589. });
  7590. return previousValue;
  7591. }
  7592. /**
  7593. * Callback for featureEach
  7594. *
  7595. * @callback featureEachCallback
  7596. * @param {Feature<any>} currentFeature The current Feature being processed.
  7597. * @param {number} featureIndex The current index of the Feature being processed.
  7598. */
  7599. /**
  7600. * Iterate over features in any GeoJSON object, similar to
  7601. * Array.forEach.
  7602. *
  7603. * @name featureEach
  7604. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7605. * @param {Function} callback a method that takes (currentFeature, featureIndex)
  7606. * @returns {void}
  7607. * @example
  7608. * var features = turf.featureCollection([
  7609. * turf.point([26, 37], {foo: 'bar'}),
  7610. * turf.point([36, 53], {hello: 'world'})
  7611. * ]);
  7612. *
  7613. * turf.featureEach(features, function (currentFeature, featureIndex) {
  7614. * //=currentFeature
  7615. * //=featureIndex
  7616. * });
  7617. */
  7618. function main_es_featureEach(geojson, callback) {
  7619. if (geojson.type === 'Feature') {
  7620. callback(geojson, 0);
  7621. } else if (geojson.type === 'FeatureCollection') {
  7622. for (var i = 0; i < geojson.features.length; i++) {
  7623. if (callback(geojson.features[i], i) === false) break;
  7624. }
  7625. }
  7626. }
  7627. /**
  7628. * Callback for featureReduce
  7629. *
  7630. * The first time the callback function is called, the values provided as arguments depend
  7631. * on whether the reduce method has an initialValue argument.
  7632. *
  7633. * If an initialValue is provided to the reduce method:
  7634. * - The previousValue argument is initialValue.
  7635. * - The currentValue argument is the value of the first element present in the array.
  7636. *
  7637. * If an initialValue is not provided:
  7638. * - The previousValue argument is the value of the first element present in the array.
  7639. * - The currentValue argument is the value of the second element present in the array.
  7640. *
  7641. * @callback featureReduceCallback
  7642. * @param {*} previousValue The accumulated value previously returned in the last invocation
  7643. * of the callback, or initialValue, if supplied.
  7644. * @param {Feature} currentFeature The current Feature being processed.
  7645. * @param {number} featureIndex The current index of the Feature being processed.
  7646. */
  7647. /**
  7648. * Reduce features in any GeoJSON object, similar to Array.reduce().
  7649. *
  7650. * @name featureReduce
  7651. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7652. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
  7653. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  7654. * @returns {*} The value that results from the reduction.
  7655. * @example
  7656. * var features = turf.featureCollection([
  7657. * turf.point([26, 37], {"foo": "bar"}),
  7658. * turf.point([36, 53], {"hello": "world"})
  7659. * ]);
  7660. *
  7661. * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
  7662. * //=previousValue
  7663. * //=currentFeature
  7664. * //=featureIndex
  7665. * return currentFeature
  7666. * });
  7667. */
  7668. function main_es_featureReduce(geojson, callback, initialValue) {
  7669. var previousValue = initialValue;
  7670. main_es_featureEach(geojson, function (currentFeature, featureIndex) {
  7671. if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  7672. else previousValue = callback(previousValue, currentFeature, featureIndex);
  7673. });
  7674. return previousValue;
  7675. }
  7676. /**
  7677. * Get all coordinates from any GeoJSON object.
  7678. *
  7679. * @name coordAll
  7680. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7681. * @returns {Array<Array<number>>} coordinate position array
  7682. * @example
  7683. * var features = turf.featureCollection([
  7684. * turf.point([26, 37], {foo: 'bar'}),
  7685. * turf.point([36, 53], {hello: 'world'})
  7686. * ]);
  7687. *
  7688. * var coords = turf.coordAll(features);
  7689. * //= [[26, 37], [36, 53]]
  7690. */
  7691. function main_es_coordAll(geojson) {
  7692. var coords = [];
  7693. main_es_coordEach(geojson, function (coord) {
  7694. coords.push(coord);
  7695. });
  7696. return coords;
  7697. }
  7698. /**
  7699. * Callback for geomEach
  7700. *
  7701. * @callback geomEachCallback
  7702. * @param {Geometry} currentGeometry The current Geometry being processed.
  7703. * @param {number} featureIndex The current index of the Feature being processed.
  7704. * @param {Object} featureProperties The current Feature Properties being processed.
  7705. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  7706. * @param {number|string} featureId The current Feature Id being processed.
  7707. */
  7708. /**
  7709. * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
  7710. *
  7711. * @name geomEach
  7712. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7713. * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  7714. * @returns {void}
  7715. * @example
  7716. * var features = turf.featureCollection([
  7717. * turf.point([26, 37], {foo: 'bar'}),
  7718. * turf.point([36, 53], {hello: 'world'})
  7719. * ]);
  7720. *
  7721. * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  7722. * //=currentGeometry
  7723. * //=featureIndex
  7724. * //=featureProperties
  7725. * //=featureBBox
  7726. * //=featureId
  7727. * });
  7728. */
  7729. function main_es_geomEach(geojson, callback) {
  7730. var i, j, g, geometry, stopG,
  7731. geometryMaybeCollection,
  7732. isGeometryCollection,
  7733. featureProperties,
  7734. featureBBox,
  7735. featureId,
  7736. featureIndex = 0,
  7737. isFeatureCollection = geojson.type === 'FeatureCollection',
  7738. isFeature = geojson.type === 'Feature',
  7739. stop = isFeatureCollection ? geojson.features.length : 1;
  7740. // This logic may look a little weird. The reason why it is that way
  7741. // is because it's trying to be fast. GeoJSON supports multiple kinds
  7742. // of objects at its root: FeatureCollection, Features, Geometries.
  7743. // This function has the responsibility of handling all of them, and that
  7744. // means that some of the `for` loops you see below actually just don't apply
  7745. // to certain inputs. For instance, if you give this just a
  7746. // Point geometry, then both loops are short-circuited and all we do
  7747. // is gradually rename the input until it's called 'geometry'.
  7748. //
  7749. // This also aims to allocate as few resources as possible: just a
  7750. // few numbers and booleans, rather than any temporary arrays as would
  7751. // be required with the normalization approach.
  7752. for (i = 0; i < stop; i++) {
  7753. geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
  7754. (isFeature ? geojson.geometry : geojson));
  7755. featureProperties = (isFeatureCollection ? geojson.features[i].properties :
  7756. (isFeature ? geojson.properties : {}));
  7757. featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
  7758. (isFeature ? geojson.bbox : undefined));
  7759. featureId = (isFeatureCollection ? geojson.features[i].id :
  7760. (isFeature ? geojson.id : undefined));
  7761. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  7762. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  7763. for (g = 0; g < stopG; g++) {
  7764. geometry = isGeometryCollection ?
  7765. geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
  7766. // Handle null Geometry
  7767. if (geometry === null) {
  7768. if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  7769. continue;
  7770. }
  7771. switch (geometry.type) {
  7772. case 'Point':
  7773. case 'LineString':
  7774. case 'MultiPoint':
  7775. case 'Polygon':
  7776. case 'MultiLineString':
  7777. case 'MultiPolygon': {
  7778. if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  7779. break;
  7780. }
  7781. case 'GeometryCollection': {
  7782. for (j = 0; j < geometry.geometries.length; j++) {
  7783. if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  7784. }
  7785. break;
  7786. }
  7787. default:
  7788. throw new Error('Unknown Geometry Type');
  7789. }
  7790. }
  7791. // Only increase `featureIndex` per each feature
  7792. featureIndex++;
  7793. }
  7794. }
  7795. /**
  7796. * Callback for geomReduce
  7797. *
  7798. * The first time the callback function is called, the values provided as arguments depend
  7799. * on whether the reduce method has an initialValue argument.
  7800. *
  7801. * If an initialValue is provided to the reduce method:
  7802. * - The previousValue argument is initialValue.
  7803. * - The currentValue argument is the value of the first element present in the array.
  7804. *
  7805. * If an initialValue is not provided:
  7806. * - The previousValue argument is the value of the first element present in the array.
  7807. * - The currentValue argument is the value of the second element present in the array.
  7808. *
  7809. * @callback geomReduceCallback
  7810. * @param {*} previousValue The accumulated value previously returned in the last invocation
  7811. * of the callback, or initialValue, if supplied.
  7812. * @param {Geometry} currentGeometry The current Geometry being processed.
  7813. * @param {number} featureIndex The current index of the Feature being processed.
  7814. * @param {Object} featureProperties The current Feature Properties being processed.
  7815. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  7816. * @param {number|string} featureId The current Feature Id being processed.
  7817. */
  7818. /**
  7819. * Reduce geometry in any GeoJSON object, similar to Array.reduce().
  7820. *
  7821. * @name geomReduce
  7822. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7823. * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  7824. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  7825. * @returns {*} The value that results from the reduction.
  7826. * @example
  7827. * var features = turf.featureCollection([
  7828. * turf.point([26, 37], {foo: 'bar'}),
  7829. * turf.point([36, 53], {hello: 'world'})
  7830. * ]);
  7831. *
  7832. * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  7833. * //=previousValue
  7834. * //=currentGeometry
  7835. * //=featureIndex
  7836. * //=featureProperties
  7837. * //=featureBBox
  7838. * //=featureId
  7839. * return currentGeometry
  7840. * });
  7841. */
  7842. function main_es_geomReduce(geojson, callback, initialValue) {
  7843. var previousValue = initialValue;
  7844. main_es_geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  7845. if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
  7846. else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
  7847. });
  7848. return previousValue;
  7849. }
  7850. /**
  7851. * Callback for flattenEach
  7852. *
  7853. * @callback flattenEachCallback
  7854. * @param {Feature} currentFeature The current flattened feature being processed.
  7855. * @param {number} featureIndex The current index of the Feature being processed.
  7856. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  7857. */
  7858. /**
  7859. * Iterate over flattened features in any GeoJSON object, similar to
  7860. * Array.forEach.
  7861. *
  7862. * @name flattenEach
  7863. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7864. * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
  7865. * @example
  7866. * var features = turf.featureCollection([
  7867. * turf.point([26, 37], {foo: 'bar'}),
  7868. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  7869. * ]);
  7870. *
  7871. * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
  7872. * //=currentFeature
  7873. * //=featureIndex
  7874. * //=multiFeatureIndex
  7875. * });
  7876. */
  7877. function main_es_flattenEach(geojson, callback) {
  7878. main_es_geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
  7879. // Callback for single geometry
  7880. var type = (geometry === null) ? null : geometry.type;
  7881. switch (type) {
  7882. case null:
  7883. case 'Point':
  7884. case 'LineString':
  7885. case 'Polygon':
  7886. if (callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
  7887. return;
  7888. }
  7889. var geomType;
  7890. // Callback for multi-geometry
  7891. switch (type) {
  7892. case 'MultiPoint':
  7893. geomType = 'Point';
  7894. break;
  7895. case 'MultiLineString':
  7896. geomType = 'LineString';
  7897. break;
  7898. case 'MultiPolygon':
  7899. geomType = 'Polygon';
  7900. break;
  7901. }
  7902. for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
  7903. var coordinate = geometry.coordinates[multiFeatureIndex];
  7904. var geom = {
  7905. type: geomType,
  7906. coordinates: coordinate
  7907. };
  7908. if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
  7909. }
  7910. });
  7911. }
  7912. /**
  7913. * Callback for flattenReduce
  7914. *
  7915. * The first time the callback function is called, the values provided as arguments depend
  7916. * on whether the reduce method has an initialValue argument.
  7917. *
  7918. * If an initialValue is provided to the reduce method:
  7919. * - The previousValue argument is initialValue.
  7920. * - The currentValue argument is the value of the first element present in the array.
  7921. *
  7922. * If an initialValue is not provided:
  7923. * - The previousValue argument is the value of the first element present in the array.
  7924. * - The currentValue argument is the value of the second element present in the array.
  7925. *
  7926. * @callback flattenReduceCallback
  7927. * @param {*} previousValue The accumulated value previously returned in the last invocation
  7928. * of the callback, or initialValue, if supplied.
  7929. * @param {Feature} currentFeature The current Feature being processed.
  7930. * @param {number} featureIndex The current index of the Feature being processed.
  7931. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  7932. */
  7933. /**
  7934. * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
  7935. *
  7936. * @name flattenReduce
  7937. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  7938. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
  7939. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  7940. * @returns {*} The value that results from the reduction.
  7941. * @example
  7942. * var features = turf.featureCollection([
  7943. * turf.point([26, 37], {foo: 'bar'}),
  7944. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  7945. * ]);
  7946. *
  7947. * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
  7948. * //=previousValue
  7949. * //=currentFeature
  7950. * //=featureIndex
  7951. * //=multiFeatureIndex
  7952. * return currentFeature
  7953. * });
  7954. */
  7955. function main_es_flattenReduce(geojson, callback, initialValue) {
  7956. var previousValue = initialValue;
  7957. main_es_flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
  7958. if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  7959. else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
  7960. });
  7961. return previousValue;
  7962. }
  7963. /**
  7964. * Callback for segmentEach
  7965. *
  7966. * @callback segmentEachCallback
  7967. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  7968. * @param {number} featureIndex The current index of the Feature being processed.
  7969. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  7970. * @param {number} geometryIndex The current index of the Geometry being processed.
  7971. * @param {number} segmentIndex The current index of the Segment being processed.
  7972. * @returns {void}
  7973. */
  7974. /**
  7975. * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
  7976. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  7977. *
  7978. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  7979. * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
  7980. * @returns {void}
  7981. * @example
  7982. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  7983. *
  7984. * // Iterate over GeoJSON by 2-vertex segments
  7985. * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  7986. * //=currentSegment
  7987. * //=featureIndex
  7988. * //=multiFeatureIndex
  7989. * //=geometryIndex
  7990. * //=segmentIndex
  7991. * });
  7992. *
  7993. * // Calculate the total number of segments
  7994. * var total = 0;
  7995. * turf.segmentEach(polygon, function () {
  7996. * total++;
  7997. * });
  7998. */
  7999. function main_es_segmentEach(geojson, callback) {
  8000. main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  8001. var segmentIndex = 0;
  8002. // Exclude null Geometries
  8003. if (!feature$$1.geometry) return;
  8004. // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  8005. var type = feature$$1.geometry.type;
  8006. if (type === 'Point' || type === 'MultiPoint') return;
  8007. // Generate 2-vertex line segments
  8008. var previousCoords;
  8009. if (main_es_coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
  8010. // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
  8011. if (previousCoords === undefined) {
  8012. previousCoords = currentCoord;
  8013. return;
  8014. }
  8015. var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
  8016. if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
  8017. segmentIndex++;
  8018. previousCoords = currentCoord;
  8019. }) === false) return false;
  8020. });
  8021. }
  8022. /**
  8023. * Callback for segmentReduce
  8024. *
  8025. * The first time the callback function is called, the values provided as arguments depend
  8026. * on whether the reduce method has an initialValue argument.
  8027. *
  8028. * If an initialValue is provided to the reduce method:
  8029. * - The previousValue argument is initialValue.
  8030. * - The currentValue argument is the value of the first element present in the array.
  8031. *
  8032. * If an initialValue is not provided:
  8033. * - The previousValue argument is the value of the first element present in the array.
  8034. * - The currentValue argument is the value of the second element present in the array.
  8035. *
  8036. * @callback segmentReduceCallback
  8037. * @param {*} previousValue The accumulated value previously returned in the last invocation
  8038. * of the callback, or initialValue, if supplied.
  8039. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  8040. * @param {number} featureIndex The current index of the Feature being processed.
  8041. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  8042. * @param {number} geometryIndex The current index of the Geometry being processed.
  8043. * @param {number} segmentIndex The current index of the Segment being processed.
  8044. */
  8045. /**
  8046. * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
  8047. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  8048. *
  8049. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  8050. * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
  8051. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  8052. * @returns {void}
  8053. * @example
  8054. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  8055. *
  8056. * // Iterate over GeoJSON by 2-vertex segments
  8057. * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  8058. * //= previousSegment
  8059. * //= currentSegment
  8060. * //= featureIndex
  8061. * //= multiFeatureIndex
  8062. * //= geometryIndex
  8063. * //= segmentInex
  8064. * return currentSegment
  8065. * });
  8066. *
  8067. * // Calculate the total number of segments
  8068. * var initialValue = 0
  8069. * var total = turf.segmentReduce(polygon, function (previousValue) {
  8070. * previousValue++;
  8071. * return previousValue;
  8072. * }, initialValue);
  8073. */
  8074. function main_es_segmentReduce(geojson, callback, initialValue) {
  8075. var previousValue = initialValue;
  8076. var started = false;
  8077. main_es_segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  8078. if (started === false && initialValue === undefined) previousValue = currentSegment;
  8079. else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
  8080. started = true;
  8081. });
  8082. return previousValue;
  8083. }
  8084. /**
  8085. * Callback for lineEach
  8086. *
  8087. * @callback lineEachCallback
  8088. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
  8089. * @param {number} featureIndex The current index of the Feature being processed
  8090. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  8091. * @param {number} geometryIndex The current index of the Geometry being processed
  8092. */
  8093. /**
  8094. * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
  8095. * similar to Array.forEach.
  8096. *
  8097. * @name lineEach
  8098. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  8099. * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  8100. * @example
  8101. * var multiLine = turf.multiLineString([
  8102. * [[26, 37], [35, 45]],
  8103. * [[36, 53], [38, 50], [41, 55]]
  8104. * ]);
  8105. *
  8106. * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  8107. * //=currentLine
  8108. * //=featureIndex
  8109. * //=multiFeatureIndex
  8110. * //=geometryIndex
  8111. * });
  8112. */
  8113. function main_es_lineEach(geojson, callback) {
  8114. // validation
  8115. if (!geojson) throw new Error('geojson is required');
  8116. main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  8117. if (feature$$1.geometry === null) return;
  8118. var type = feature$$1.geometry.type;
  8119. var coords = feature$$1.geometry.coordinates;
  8120. switch (type) {
  8121. case 'LineString':
  8122. if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
  8123. break;
  8124. case 'Polygon':
  8125. for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
  8126. if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  8127. }
  8128. break;
  8129. }
  8130. });
  8131. }
  8132. /**
  8133. * Callback for lineReduce
  8134. *
  8135. * The first time the callback function is called, the values provided as arguments depend
  8136. * on whether the reduce method has an initialValue argument.
  8137. *
  8138. * If an initialValue is provided to the reduce method:
  8139. * - The previousValue argument is initialValue.
  8140. * - The currentValue argument is the value of the first element present in the array.
  8141. *
  8142. * If an initialValue is not provided:
  8143. * - The previousValue argument is the value of the first element present in the array.
  8144. * - The currentValue argument is the value of the second element present in the array.
  8145. *
  8146. * @callback lineReduceCallback
  8147. * @param {*} previousValue The accumulated value previously returned in the last invocation
  8148. * of the callback, or initialValue, if supplied.
  8149. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
  8150. * @param {number} featureIndex The current index of the Feature being processed
  8151. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  8152. * @param {number} geometryIndex The current index of the Geometry being processed
  8153. */
  8154. /**
  8155. * Reduce features in any GeoJSON object, similar to Array.reduce().
  8156. *
  8157. * @name lineReduce
  8158. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  8159. * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  8160. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  8161. * @returns {*} The value that results from the reduction.
  8162. * @example
  8163. * var multiPoly = turf.multiPolygon([
  8164. * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
  8165. * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
  8166. * ]);
  8167. *
  8168. * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  8169. * //=previousValue
  8170. * //=currentLine
  8171. * //=featureIndex
  8172. * //=multiFeatureIndex
  8173. * //=geometryIndex
  8174. * return currentLine
  8175. * });
  8176. */
  8177. function main_es_lineReduce(geojson, callback, initialValue) {
  8178. var previousValue = initialValue;
  8179. main_es_lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  8180. if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
  8181. else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
  8182. });
  8183. return previousValue;
  8184. }
  8185. /**
  8186. * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
  8187. *
  8188. * Negative indexes are permitted.
  8189. * Point & MultiPoint will always return null.
  8190. *
  8191. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  8192. * @param {Object} [options={}] Optional parameters
  8193. * @param {number} [options.featureIndex=0] Feature Index
  8194. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  8195. * @param {number} [options.geometryIndex=0] Geometry Index
  8196. * @param {number} [options.segmentIndex=0] Segment Index
  8197. * @param {Object} [options.properties={}] Translate Properties to output LineString
  8198. * @param {BBox} [options.bbox={}] Translate BBox to output LineString
  8199. * @param {number|string} [options.id={}] Translate Id to output LineString
  8200. * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
  8201. * @example
  8202. * var multiLine = turf.multiLineString([
  8203. * [[10, 10], [50, 30], [30, 40]],
  8204. * [[-10, -10], [-50, -30], [-30, -40]]
  8205. * ]);
  8206. *
  8207. * // First Segment (defaults are 0)
  8208. * turf.findSegment(multiLine);
  8209. * // => Feature<LineString<[[10, 10], [50, 30]]>>
  8210. *
  8211. * // First Segment of 2nd Multi Feature
  8212. * turf.findSegment(multiLine, {multiFeatureIndex: 1});
  8213. * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
  8214. *
  8215. * // Last Segment of Last Multi Feature
  8216. * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
  8217. * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
  8218. */
  8219. function main_es_findSegment(geojson, options) {
  8220. // Optional Parameters
  8221. options = options || {};
  8222. if (!isObject(options)) throw new Error('options is invalid');
  8223. var featureIndex = options.featureIndex || 0;
  8224. var multiFeatureIndex = options.multiFeatureIndex || 0;
  8225. var geometryIndex = options.geometryIndex || 0;
  8226. var segmentIndex = options.segmentIndex || 0;
  8227. // Find FeatureIndex
  8228. var properties = options.properties;
  8229. var geometry;
  8230. switch (geojson.type) {
  8231. case 'FeatureCollection':
  8232. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  8233. properties = properties || geojson.features[featureIndex].properties;
  8234. geometry = geojson.features[featureIndex].geometry;
  8235. break;
  8236. case 'Feature':
  8237. properties = properties || geojson.properties;
  8238. geometry = geojson.geometry;
  8239. break;
  8240. case 'Point':
  8241. case 'MultiPoint':
  8242. return null;
  8243. case 'LineString':
  8244. case 'Polygon':
  8245. case 'MultiLineString':
  8246. case 'MultiPolygon':
  8247. geometry = geojson;
  8248. break;
  8249. default:
  8250. throw new Error('geojson is invalid');
  8251. }
  8252. // Find SegmentIndex
  8253. if (geometry === null) return null;
  8254. var coords = geometry.coordinates;
  8255. switch (geometry.type) {
  8256. case 'Point':
  8257. case 'MultiPoint':
  8258. return null;
  8259. case 'LineString':
  8260. if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
  8261. return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
  8262. case 'Polygon':
  8263. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  8264. if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
  8265. return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
  8266. case 'MultiLineString':
  8267. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  8268. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
  8269. return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
  8270. case 'MultiPolygon':
  8271. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  8272. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  8273. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
  8274. return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
  8275. }
  8276. throw new Error('geojson is invalid');
  8277. }
  8278. /**
  8279. * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
  8280. *
  8281. * Negative indexes are permitted.
  8282. *
  8283. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  8284. * @param {Object} [options={}] Optional parameters
  8285. * @param {number} [options.featureIndex=0] Feature Index
  8286. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  8287. * @param {number} [options.geometryIndex=0] Geometry Index
  8288. * @param {number} [options.coordIndex=0] Coord Index
  8289. * @param {Object} [options.properties={}] Translate Properties to output Point
  8290. * @param {BBox} [options.bbox={}] Translate BBox to output Point
  8291. * @param {number|string} [options.id={}] Translate Id to output Point
  8292. * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
  8293. * @example
  8294. * var multiLine = turf.multiLineString([
  8295. * [[10, 10], [50, 30], [30, 40]],
  8296. * [[-10, -10], [-50, -30], [-30, -40]]
  8297. * ]);
  8298. *
  8299. * // First Segment (defaults are 0)
  8300. * turf.findPoint(multiLine);
  8301. * // => Feature<Point<[10, 10]>>
  8302. *
  8303. * // First Segment of the 2nd Multi-Feature
  8304. * turf.findPoint(multiLine, {multiFeatureIndex: 1});
  8305. * // => Feature<Point<[-10, -10]>>
  8306. *
  8307. * // Last Segment of last Multi-Feature
  8308. * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
  8309. * // => Feature<Point<[-30, -40]>>
  8310. */
  8311. function main_es_findPoint(geojson, options) {
  8312. // Optional Parameters
  8313. options = options || {};
  8314. if (!isObject(options)) throw new Error('options is invalid');
  8315. var featureIndex = options.featureIndex || 0;
  8316. var multiFeatureIndex = options.multiFeatureIndex || 0;
  8317. var geometryIndex = options.geometryIndex || 0;
  8318. var coordIndex = options.coordIndex || 0;
  8319. // Find FeatureIndex
  8320. var properties = options.properties;
  8321. var geometry;
  8322. switch (geojson.type) {
  8323. case 'FeatureCollection':
  8324. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  8325. properties = properties || geojson.features[featureIndex].properties;
  8326. geometry = geojson.features[featureIndex].geometry;
  8327. break;
  8328. case 'Feature':
  8329. properties = properties || geojson.properties;
  8330. geometry = geojson.geometry;
  8331. break;
  8332. case 'Point':
  8333. case 'MultiPoint':
  8334. return null;
  8335. case 'LineString':
  8336. case 'Polygon':
  8337. case 'MultiLineString':
  8338. case 'MultiPolygon':
  8339. geometry = geojson;
  8340. break;
  8341. default:
  8342. throw new Error('geojson is invalid');
  8343. }
  8344. // Find Coord Index
  8345. if (geometry === null) return null;
  8346. var coords = geometry.coordinates;
  8347. switch (geometry.type) {
  8348. case 'Point':
  8349. return point(coords, properties, options);
  8350. case 'MultiPoint':
  8351. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  8352. return point(coords[multiFeatureIndex], properties, options);
  8353. case 'LineString':
  8354. if (coordIndex < 0) coordIndex = coords.length + coordIndex;
  8355. return point(coords[coordIndex], properties, options);
  8356. case 'Polygon':
  8357. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  8358. if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
  8359. return point(coords[geometryIndex][coordIndex], properties, options);
  8360. case 'MultiLineString':
  8361. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  8362. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
  8363. return point(coords[multiFeatureIndex][coordIndex], properties, options);
  8364. case 'MultiPolygon':
  8365. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  8366. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  8367. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
  8368. return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
  8369. }
  8370. throw new Error('geojson is invalid');
  8371. }
  8372. ;// CONCATENATED MODULE: ./node_modules/@turf/centroid/main.es.js
  8373. /**
  8374. * Takes one or more features and calculates the centroid using the mean of all vertices.
  8375. * This lessens the effect of small islands and artifacts when calculating the centroid of a set of polygons.
  8376. *
  8377. * @name centroid
  8378. * @param {GeoJSON} geojson GeoJSON to be centered
  8379. * @param {Object} [properties={}] an Object that is used as the {@link Feature}'s properties
  8380. * @returns {Feature<Point>} the centroid of the input features
  8381. * @example
  8382. * var polygon = turf.polygon([[[-81, 41], [-88, 36], [-84, 31], [-80, 33], [-77, 39], [-81, 41]]]);
  8383. *
  8384. * var centroid = turf.centroid(polygon);
  8385. *
  8386. * //addToMap
  8387. * var addToMap = [polygon, centroid]
  8388. */
  8389. function centroid(geojson, properties) {
  8390. var xSum = 0;
  8391. var ySum = 0;
  8392. var len = 0;
  8393. main_es_coordEach(geojson, function (coord) {
  8394. xSum += coord[0];
  8395. ySum += coord[1];
  8396. len++;
  8397. }, true);
  8398. return helpers_main_es_point([xSum / len, ySum / len], properties);
  8399. }
  8400. /* harmony default export */ var centroid_main_es = (centroid);
  8401. ;// CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/helpers/main.es.js
  8402. /**
  8403. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  8404. */
  8405. var helpers_main_es_earthRadius = 6371008.8;
  8406. /**
  8407. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  8408. */
  8409. var helpers_main_es_factors = {
  8410. meters: helpers_main_es_earthRadius,
  8411. metres: helpers_main_es_earthRadius,
  8412. millimeters: helpers_main_es_earthRadius * 1000,
  8413. millimetres: helpers_main_es_earthRadius * 1000,
  8414. centimeters: helpers_main_es_earthRadius * 100,
  8415. centimetres: helpers_main_es_earthRadius * 100,
  8416. kilometers: helpers_main_es_earthRadius / 1000,
  8417. kilometres: helpers_main_es_earthRadius / 1000,
  8418. miles: helpers_main_es_earthRadius / 1609.344,
  8419. nauticalmiles: helpers_main_es_earthRadius / 1852,
  8420. inches: helpers_main_es_earthRadius * 39.370,
  8421. yards: helpers_main_es_earthRadius / 1.0936,
  8422. feet: helpers_main_es_earthRadius * 3.28084,
  8423. radians: 1,
  8424. degrees: helpers_main_es_earthRadius / 111325,
  8425. };
  8426. /**
  8427. * Units of measurement factors based on 1 meter.
  8428. */
  8429. var helpers_main_es_unitsFactors = {
  8430. meters: 1,
  8431. metres: 1,
  8432. millimeters: 1000,
  8433. millimetres: 1000,
  8434. centimeters: 100,
  8435. centimetres: 100,
  8436. kilometers: 1 / 1000,
  8437. kilometres: 1 / 1000,
  8438. miles: 1 / 1609.344,
  8439. nauticalmiles: 1 / 1852,
  8440. inches: 39.370,
  8441. yards: 1 / 1.0936,
  8442. feet: 3.28084,
  8443. radians: 1 / helpers_main_es_earthRadius,
  8444. degrees: 1 / 111325,
  8445. };
  8446. /**
  8447. * Area of measurement factors based on 1 square meter.
  8448. */
  8449. var helpers_main_es_areaFactors = {
  8450. meters: 1,
  8451. metres: 1,
  8452. millimeters: 1000000,
  8453. millimetres: 1000000,
  8454. centimeters: 10000,
  8455. centimetres: 10000,
  8456. kilometers: 0.000001,
  8457. kilometres: 0.000001,
  8458. acres: 0.000247105,
  8459. miles: 3.86e-7,
  8460. yards: 1.195990046,
  8461. feet: 10.763910417,
  8462. inches: 1550.003100006
  8463. };
  8464. /**
  8465. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  8466. *
  8467. * @name feature
  8468. * @param {Geometry} geometry input geometry
  8469. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8470. * @param {Object} [options={}] Optional Parameters
  8471. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8472. * @param {string|number} [options.id] Identifier associated with the Feature
  8473. * @returns {Feature} a GeoJSON Feature
  8474. * @example
  8475. * var geometry = {
  8476. * "type": "Point",
  8477. * "coordinates": [110, 50]
  8478. * };
  8479. *
  8480. * var feature = turf.feature(geometry);
  8481. *
  8482. * //=feature
  8483. */
  8484. function _turf_helpers_main_es_feature(geometry, properties, options) {
  8485. // Optional Parameters
  8486. options = options || {};
  8487. if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  8488. var bbox = options.bbox;
  8489. var id = options.id;
  8490. // Validation
  8491. if (geometry === undefined) throw new Error('geometry is required');
  8492. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  8493. if (bbox) helpers_main_es_validateBBox(bbox);
  8494. if (id) helpers_main_es_validateId(id);
  8495. // Main
  8496. var feat = {type: 'Feature'};
  8497. if (id) feat.id = id;
  8498. if (bbox) feat.bbox = bbox;
  8499. feat.properties = properties || {};
  8500. feat.geometry = geometry;
  8501. return feat;
  8502. }
  8503. /**
  8504. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  8505. * For GeometryCollection type use `helpers.geometryCollection`
  8506. *
  8507. * @name geometry
  8508. * @param {string} type Geometry Type
  8509. * @param {Array<number>} coordinates Coordinates
  8510. * @param {Object} [options={}] Optional Parameters
  8511. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  8512. * @returns {Geometry} a GeoJSON Geometry
  8513. * @example
  8514. * var type = 'Point';
  8515. * var coordinates = [110, 50];
  8516. *
  8517. * var geometry = turf.geometry(type, coordinates);
  8518. *
  8519. * //=geometry
  8520. */
  8521. function helpers_main_es_geometry(type, coordinates, options) {
  8522. // Optional Parameters
  8523. options = options || {};
  8524. if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  8525. var bbox = options.bbox;
  8526. // Validation
  8527. if (!type) throw new Error('type is required');
  8528. if (!coordinates) throw new Error('coordinates is required');
  8529. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  8530. if (bbox) helpers_main_es_validateBBox(bbox);
  8531. // Main
  8532. var geom;
  8533. switch (type) {
  8534. case 'Point': geom = _turf_helpers_main_es_point(coordinates).geometry; break;
  8535. case 'LineString': geom = _turf_helpers_main_es_lineString(coordinates).geometry; break;
  8536. case 'Polygon': geom = helpers_main_es_polygon(coordinates).geometry; break;
  8537. case 'MultiPoint': geom = helpers_main_es_multiPoint(coordinates).geometry; break;
  8538. case 'MultiLineString': geom = helpers_main_es_multiLineString(coordinates).geometry; break;
  8539. case 'MultiPolygon': geom = helpers_main_es_multiPolygon(coordinates).geometry; break;
  8540. default: throw new Error(type + ' is invalid');
  8541. }
  8542. if (bbox) geom.bbox = bbox;
  8543. return geom;
  8544. }
  8545. /**
  8546. * Creates a {@link Point} {@link Feature} from a Position.
  8547. *
  8548. * @name point
  8549. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  8550. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8551. * @param {Object} [options={}] Optional Parameters
  8552. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8553. * @param {string|number} [options.id] Identifier associated with the Feature
  8554. * @returns {Feature<Point>} a Point feature
  8555. * @example
  8556. * var point = turf.point([-75.343, 39.984]);
  8557. *
  8558. * //=point
  8559. */
  8560. function _turf_helpers_main_es_point(coordinates, properties, options) {
  8561. if (!coordinates) throw new Error('coordinates is required');
  8562. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  8563. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  8564. if (!_turf_helpers_main_es_isNumber(coordinates[0]) || !_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  8565. return _turf_helpers_main_es_feature({
  8566. type: 'Point',
  8567. coordinates: coordinates
  8568. }, properties, options);
  8569. }
  8570. /**
  8571. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  8572. *
  8573. * @name points
  8574. * @param {Array<Array<number>>} coordinates an array of Points
  8575. * @param {Object} [properties={}] Translate these properties to each Feature
  8576. * @param {Object} [options={}] Optional Parameters
  8577. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  8578. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  8579. * @returns {FeatureCollection<Point>} Point Feature
  8580. * @example
  8581. * var points = turf.points([
  8582. * [-75, 39],
  8583. * [-80, 45],
  8584. * [-78, 50]
  8585. * ]);
  8586. *
  8587. * //=points
  8588. */
  8589. function helpers_main_es_points(coordinates, properties, options) {
  8590. if (!coordinates) throw new Error('coordinates is required');
  8591. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  8592. return helpers_main_es_featureCollection(coordinates.map(function (coords) {
  8593. return _turf_helpers_main_es_point(coords, properties);
  8594. }), options);
  8595. }
  8596. /**
  8597. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  8598. *
  8599. * @name polygon
  8600. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  8601. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8602. * @param {Object} [options={}] Optional Parameters
  8603. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8604. * @param {string|number} [options.id] Identifier associated with the Feature
  8605. * @returns {Feature<Polygon>} Polygon Feature
  8606. * @example
  8607. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  8608. *
  8609. * //=polygon
  8610. */
  8611. function helpers_main_es_polygon(coordinates, properties, options) {
  8612. if (!coordinates) throw new Error('coordinates is required');
  8613. for (var i = 0; i < coordinates.length; i++) {
  8614. var ring = coordinates[i];
  8615. if (ring.length < 4) {
  8616. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  8617. }
  8618. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  8619. // Check if first point of Polygon contains two numbers
  8620. if (i === 0 && j === 0 && !_turf_helpers_main_es_isNumber(ring[0][0]) || !_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  8621. if (ring[ring.length - 1][j] !== ring[0][j]) {
  8622. throw new Error('First and last Position are not equivalent.');
  8623. }
  8624. }
  8625. }
  8626. return _turf_helpers_main_es_feature({
  8627. type: 'Polygon',
  8628. coordinates: coordinates
  8629. }, properties, options);
  8630. }
  8631. /**
  8632. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  8633. *
  8634. * @name polygons
  8635. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  8636. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8637. * @param {Object} [options={}] Optional Parameters
  8638. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8639. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  8640. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  8641. * @example
  8642. * var polygons = turf.polygons([
  8643. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  8644. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  8645. * ]);
  8646. *
  8647. * //=polygons
  8648. */
  8649. function helpers_main_es_polygons(coordinates, properties, options) {
  8650. if (!coordinates) throw new Error('coordinates is required');
  8651. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  8652. return helpers_main_es_featureCollection(coordinates.map(function (coords) {
  8653. return helpers_main_es_polygon(coords, properties);
  8654. }), options);
  8655. }
  8656. /**
  8657. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  8658. *
  8659. * @name lineString
  8660. * @param {Array<Array<number>>} coordinates an array of Positions
  8661. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8662. * @param {Object} [options={}] Optional Parameters
  8663. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8664. * @param {string|number} [options.id] Identifier associated with the Feature
  8665. * @returns {Feature<LineString>} LineString Feature
  8666. * @example
  8667. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  8668. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  8669. *
  8670. * //=linestring1
  8671. * //=linestring2
  8672. */
  8673. function _turf_helpers_main_es_lineString(coordinates, properties, options) {
  8674. if (!coordinates) throw new Error('coordinates is required');
  8675. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  8676. // Check if first point of LineString contains two numbers
  8677. if (!_turf_helpers_main_es_isNumber(coordinates[0][1]) || !_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  8678. return _turf_helpers_main_es_feature({
  8679. type: 'LineString',
  8680. coordinates: coordinates
  8681. }, properties, options);
  8682. }
  8683. /**
  8684. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  8685. *
  8686. * @name lineStrings
  8687. * @param {Array<Array<number>>} coordinates an array of LinearRings
  8688. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8689. * @param {Object} [options={}] Optional Parameters
  8690. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  8691. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  8692. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  8693. * @example
  8694. * var linestrings = turf.lineStrings([
  8695. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  8696. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  8697. * ]);
  8698. *
  8699. * //=linestrings
  8700. */
  8701. function helpers_main_es_lineStrings(coordinates, properties, options) {
  8702. if (!coordinates) throw new Error('coordinates is required');
  8703. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  8704. return helpers_main_es_featureCollection(coordinates.map(function (coords) {
  8705. return _turf_helpers_main_es_lineString(coords, properties);
  8706. }), options);
  8707. }
  8708. /**
  8709. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  8710. *
  8711. * @name featureCollection
  8712. * @param {Feature[]} features input features
  8713. * @param {Object} [options={}] Optional Parameters
  8714. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8715. * @param {string|number} [options.id] Identifier associated with the Feature
  8716. * @returns {FeatureCollection} FeatureCollection of Features
  8717. * @example
  8718. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  8719. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  8720. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  8721. *
  8722. * var collection = turf.featureCollection([
  8723. * locationA,
  8724. * locationB,
  8725. * locationC
  8726. * ]);
  8727. *
  8728. * //=collection
  8729. */
  8730. function helpers_main_es_featureCollection(features, options) {
  8731. // Optional Parameters
  8732. options = options || {};
  8733. if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  8734. var bbox = options.bbox;
  8735. var id = options.id;
  8736. // Validation
  8737. if (!features) throw new Error('No features passed');
  8738. if (!Array.isArray(features)) throw new Error('features must be an Array');
  8739. if (bbox) helpers_main_es_validateBBox(bbox);
  8740. if (id) helpers_main_es_validateId(id);
  8741. // Main
  8742. var fc = {type: 'FeatureCollection'};
  8743. if (id) fc.id = id;
  8744. if (bbox) fc.bbox = bbox;
  8745. fc.features = features;
  8746. return fc;
  8747. }
  8748. /**
  8749. * Creates a {@link Feature<MultiLineString>} based on a
  8750. * coordinate array. Properties can be added optionally.
  8751. *
  8752. * @name multiLineString
  8753. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  8754. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8755. * @param {Object} [options={}] Optional Parameters
  8756. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8757. * @param {string|number} [options.id] Identifier associated with the Feature
  8758. * @returns {Feature<MultiLineString>} a MultiLineString feature
  8759. * @throws {Error} if no coordinates are passed
  8760. * @example
  8761. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  8762. *
  8763. * //=multiLine
  8764. */
  8765. function helpers_main_es_multiLineString(coordinates, properties, options) {
  8766. if (!coordinates) throw new Error('coordinates is required');
  8767. return _turf_helpers_main_es_feature({
  8768. type: 'MultiLineString',
  8769. coordinates: coordinates
  8770. }, properties, options);
  8771. }
  8772. /**
  8773. * Creates a {@link Feature<MultiPoint>} based on a
  8774. * coordinate array. Properties can be added optionally.
  8775. *
  8776. * @name multiPoint
  8777. * @param {Array<Array<number>>} coordinates an array of Positions
  8778. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8779. * @param {Object} [options={}] Optional Parameters
  8780. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8781. * @param {string|number} [options.id] Identifier associated with the Feature
  8782. * @returns {Feature<MultiPoint>} a MultiPoint feature
  8783. * @throws {Error} if no coordinates are passed
  8784. * @example
  8785. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  8786. *
  8787. * //=multiPt
  8788. */
  8789. function helpers_main_es_multiPoint(coordinates, properties, options) {
  8790. if (!coordinates) throw new Error('coordinates is required');
  8791. return _turf_helpers_main_es_feature({
  8792. type: 'MultiPoint',
  8793. coordinates: coordinates
  8794. }, properties, options);
  8795. }
  8796. /**
  8797. * Creates a {@link Feature<MultiPolygon>} based on a
  8798. * coordinate array. Properties can be added optionally.
  8799. *
  8800. * @name multiPolygon
  8801. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  8802. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8803. * @param {Object} [options={}] Optional Parameters
  8804. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8805. * @param {string|number} [options.id] Identifier associated with the Feature
  8806. * @returns {Feature<MultiPolygon>} a multipolygon feature
  8807. * @throws {Error} if no coordinates are passed
  8808. * @example
  8809. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  8810. *
  8811. * //=multiPoly
  8812. *
  8813. */
  8814. function helpers_main_es_multiPolygon(coordinates, properties, options) {
  8815. if (!coordinates) throw new Error('coordinates is required');
  8816. return _turf_helpers_main_es_feature({
  8817. type: 'MultiPolygon',
  8818. coordinates: coordinates
  8819. }, properties, options);
  8820. }
  8821. /**
  8822. * Creates a {@link Feature<GeometryCollection>} based on a
  8823. * coordinate array. Properties can be added optionally.
  8824. *
  8825. * @name geometryCollection
  8826. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  8827. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  8828. * @param {Object} [options={}] Optional Parameters
  8829. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  8830. * @param {string|number} [options.id] Identifier associated with the Feature
  8831. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  8832. * @example
  8833. * var pt = {
  8834. * "type": "Point",
  8835. * "coordinates": [100, 0]
  8836. * };
  8837. * var line = {
  8838. * "type": "LineString",
  8839. * "coordinates": [ [101, 0], [102, 1] ]
  8840. * };
  8841. * var collection = turf.geometryCollection([pt, line]);
  8842. *
  8843. * //=collection
  8844. */
  8845. function helpers_main_es_geometryCollection(geometries, properties, options) {
  8846. if (!geometries) throw new Error('geometries is required');
  8847. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  8848. return _turf_helpers_main_es_feature({
  8849. type: 'GeometryCollection',
  8850. geometries: geometries
  8851. }, properties, options);
  8852. }
  8853. /**
  8854. * Round number to precision
  8855. *
  8856. * @param {number} num Number
  8857. * @param {number} [precision=0] Precision
  8858. * @returns {number} rounded number
  8859. * @example
  8860. * turf.round(120.4321)
  8861. * //=120
  8862. *
  8863. * turf.round(120.4321, 2)
  8864. * //=120.43
  8865. */
  8866. function helpers_main_es_round(num, precision) {
  8867. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  8868. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  8869. var multiplier = Math.pow(10, precision || 0);
  8870. return Math.round(num * multiplier) / multiplier;
  8871. }
  8872. /**
  8873. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  8874. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  8875. *
  8876. * @name radiansToLength
  8877. * @param {number} radians in radians across the sphere
  8878. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  8879. * @returns {number} distance
  8880. */
  8881. function helpers_main_es_radiansToLength(radians, units) {
  8882. if (radians === undefined || radians === null) throw new Error('radians is required');
  8883. if (units && typeof units !== 'string') throw new Error('units must be a string');
  8884. var factor = helpers_main_es_factors[units || 'kilometers'];
  8885. if (!factor) throw new Error(units + ' units is invalid');
  8886. return radians * factor;
  8887. }
  8888. /**
  8889. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  8890. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  8891. *
  8892. * @name lengthToRadians
  8893. * @param {number} distance in real units
  8894. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  8895. * @returns {number} radians
  8896. */
  8897. function helpers_main_es_lengthToRadians(distance, units) {
  8898. if (distance === undefined || distance === null) throw new Error('distance is required');
  8899. if (units && typeof units !== 'string') throw new Error('units must be a string');
  8900. var factor = helpers_main_es_factors[units || 'kilometers'];
  8901. if (!factor) throw new Error(units + ' units is invalid');
  8902. return distance / factor;
  8903. }
  8904. /**
  8905. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  8906. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  8907. *
  8908. * @name lengthToDegrees
  8909. * @param {number} distance in real units
  8910. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  8911. * @returns {number} degrees
  8912. */
  8913. function helpers_main_es_lengthToDegrees(distance, units) {
  8914. return helpers_main_es_radiansToDegrees(helpers_main_es_lengthToRadians(distance, units));
  8915. }
  8916. /**
  8917. * Converts any bearing angle from the north line direction (positive clockwise)
  8918. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  8919. *
  8920. * @name bearingToAzimuth
  8921. * @param {number} bearing angle, between -180 and +180 degrees
  8922. * @returns {number} angle between 0 and 360 degrees
  8923. */
  8924. function helpers_main_es_bearingToAzimuth(bearing) {
  8925. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  8926. var angle = bearing % 360;
  8927. if (angle < 0) angle += 360;
  8928. return angle;
  8929. }
  8930. /**
  8931. * Converts an angle in radians to degrees
  8932. *
  8933. * @name radiansToDegrees
  8934. * @param {number} radians angle in radians
  8935. * @returns {number} degrees between 0 and 360 degrees
  8936. */
  8937. function helpers_main_es_radiansToDegrees(radians) {
  8938. if (radians === null || radians === undefined) throw new Error('radians is required');
  8939. var degrees = radians % (2 * Math.PI);
  8940. return degrees * 180 / Math.PI;
  8941. }
  8942. /**
  8943. * Converts an angle in degrees to radians
  8944. *
  8945. * @name degreesToRadians
  8946. * @param {number} degrees angle between 0 and 360 degrees
  8947. * @returns {number} angle in radians
  8948. */
  8949. function helpers_main_es_degreesToRadians(degrees) {
  8950. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  8951. var radians = degrees % 360;
  8952. return radians * Math.PI / 180;
  8953. }
  8954. /**
  8955. * Converts a length to the requested unit.
  8956. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  8957. *
  8958. * @param {number} length to be converted
  8959. * @param {string} originalUnit of the length
  8960. * @param {string} [finalUnit='kilometers'] returned unit
  8961. * @returns {number} the converted length
  8962. */
  8963. function helpers_main_es_convertLength(length, originalUnit, finalUnit) {
  8964. if (length === null || length === undefined) throw new Error('length is required');
  8965. if (!(length >= 0)) throw new Error('length must be a positive number');
  8966. return helpers_main_es_radiansToLength(helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  8967. }
  8968. /**
  8969. * Converts a area to the requested unit.
  8970. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  8971. * @param {number} area to be converted
  8972. * @param {string} [originalUnit='meters'] of the distance
  8973. * @param {string} [finalUnit='kilometers'] returned unit
  8974. * @returns {number} the converted distance
  8975. */
  8976. function helpers_main_es_convertArea(area, originalUnit, finalUnit) {
  8977. if (area === null || area === undefined) throw new Error('area is required');
  8978. if (!(area >= 0)) throw new Error('area must be a positive number');
  8979. var startFactor = helpers_main_es_areaFactors[originalUnit || 'meters'];
  8980. if (!startFactor) throw new Error('invalid original units');
  8981. var finalFactor = helpers_main_es_areaFactors[finalUnit || 'kilometers'];
  8982. if (!finalFactor) throw new Error('invalid final units');
  8983. return (area / startFactor) * finalFactor;
  8984. }
  8985. /**
  8986. * isNumber
  8987. *
  8988. * @param {*} num Number to validate
  8989. * @returns {boolean} true/false
  8990. * @example
  8991. * turf.isNumber(123)
  8992. * //=true
  8993. * turf.isNumber('foo')
  8994. * //=false
  8995. */
  8996. function _turf_helpers_main_es_isNumber(num) {
  8997. return !isNaN(num) && num !== null && !Array.isArray(num);
  8998. }
  8999. /**
  9000. * isObject
  9001. *
  9002. * @param {*} input variable to validate
  9003. * @returns {boolean} true/false
  9004. * @example
  9005. * turf.isObject({elevation: 10})
  9006. * //=true
  9007. * turf.isObject('foo')
  9008. * //=false
  9009. */
  9010. function _turf_helpers_main_es_isObject(input) {
  9011. return (!!input) && (input.constructor === Object);
  9012. }
  9013. /**
  9014. * Validate BBox
  9015. *
  9016. * @private
  9017. * @param {Array<number>} bbox BBox to validate
  9018. * @returns {void}
  9019. * @throws Error if BBox is not valid
  9020. * @example
  9021. * validateBBox([-180, -40, 110, 50])
  9022. * //=OK
  9023. * validateBBox([-180, -40])
  9024. * //=Error
  9025. * validateBBox('Foo')
  9026. * //=Error
  9027. * validateBBox(5)
  9028. * //=Error
  9029. * validateBBox(null)
  9030. * //=Error
  9031. * validateBBox(undefined)
  9032. * //=Error
  9033. */
  9034. function helpers_main_es_validateBBox(bbox) {
  9035. if (!bbox) throw new Error('bbox is required');
  9036. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  9037. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  9038. bbox.forEach(function (num) {
  9039. if (!_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  9040. });
  9041. }
  9042. /**
  9043. * Validate Id
  9044. *
  9045. * @private
  9046. * @param {string|number} id Id to validate
  9047. * @returns {void}
  9048. * @throws Error if Id is not valid
  9049. * @example
  9050. * validateId([-180, -40, 110, 50])
  9051. * //=Error
  9052. * validateId([-180, -40])
  9053. * //=Error
  9054. * validateId('Foo')
  9055. * //=OK
  9056. * validateId(5)
  9057. * //=OK
  9058. * validateId(null)
  9059. * //=Error
  9060. * validateId(undefined)
  9061. * //=Error
  9062. */
  9063. function helpers_main_es_validateId(id) {
  9064. if (!id) throw new Error('id is required');
  9065. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  9066. }
  9067. // Deprecated methods
  9068. function helpers_main_es_radians2degrees() {
  9069. throw new Error('method has been renamed to `radiansToDegrees`');
  9070. }
  9071. function helpers_main_es_degrees2radians() {
  9072. throw new Error('method has been renamed to `degreesToRadians`');
  9073. }
  9074. function helpers_main_es_distanceToDegrees() {
  9075. throw new Error('method has been renamed to `lengthToDegrees`');
  9076. }
  9077. function helpers_main_es_distanceToRadians() {
  9078. throw new Error('method has been renamed to `lengthToRadians`');
  9079. }
  9080. function helpers_main_es_radiansToDistance() {
  9081. throw new Error('method has been renamed to `radiansToLength`');
  9082. }
  9083. function helpers_main_es_bearingToAngle() {
  9084. throw new Error('method has been renamed to `bearingToAzimuth`');
  9085. }
  9086. function helpers_main_es_convertDistance() {
  9087. throw new Error('method has been renamed to `convertLength`');
  9088. }
  9089. ;// CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/meta/main.es.js
  9090. /**
  9091. * Callback for coordEach
  9092. *
  9093. * @callback coordEachCallback
  9094. * @param {Array<number>} currentCoord The current coordinate being processed.
  9095. * @param {number} coordIndex The current index of the coordinate being processed.
  9096. * @param {number} featureIndex The current index of the Feature being processed.
  9097. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9098. * @param {number} geometryIndex The current index of the Geometry being processed.
  9099. */
  9100. /**
  9101. * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
  9102. *
  9103. * @name coordEach
  9104. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9105. * @param {Function} callback a method that takes (currentCoord, coordIndex, featureIndex, multiFeatureIndex)
  9106. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  9107. * @returns {void}
  9108. * @example
  9109. * var features = turf.featureCollection([
  9110. * turf.point([26, 37], {"foo": "bar"}),
  9111. * turf.point([36, 53], {"hello": "world"})
  9112. * ]);
  9113. *
  9114. * turf.coordEach(features, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  9115. * //=currentCoord
  9116. * //=coordIndex
  9117. * //=featureIndex
  9118. * //=multiFeatureIndex
  9119. * //=geometryIndex
  9120. * });
  9121. */
  9122. function meta_main_es_coordEach(geojson, callback, excludeWrapCoord) {
  9123. // Handles null Geometry -- Skips this GeoJSON
  9124. if (geojson === null) return;
  9125. var j, k, l, geometry, stopG, coords,
  9126. geometryMaybeCollection,
  9127. wrapShrink = 0,
  9128. coordIndex = 0,
  9129. isGeometryCollection,
  9130. type = geojson.type,
  9131. isFeatureCollection = type === 'FeatureCollection',
  9132. isFeature = type === 'Feature',
  9133. stop = isFeatureCollection ? geojson.features.length : 1;
  9134. // This logic may look a little weird. The reason why it is that way
  9135. // is because it's trying to be fast. GeoJSON supports multiple kinds
  9136. // of objects at its root: FeatureCollection, Features, Geometries.
  9137. // This function has the responsibility of handling all of them, and that
  9138. // means that some of the `for` loops you see below actually just don't apply
  9139. // to certain inputs. For instance, if you give this just a
  9140. // Point geometry, then both loops are short-circuited and all we do
  9141. // is gradually rename the input until it's called 'geometry'.
  9142. //
  9143. // This also aims to allocate as few resources as possible: just a
  9144. // few numbers and booleans, rather than any temporary arrays as would
  9145. // be required with the normalization approach.
  9146. for (var featureIndex = 0; featureIndex < stop; featureIndex++) {
  9147. geometryMaybeCollection = (isFeatureCollection ? geojson.features[featureIndex].geometry :
  9148. (isFeature ? geojson.geometry : geojson));
  9149. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  9150. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  9151. for (var geomIndex = 0; geomIndex < stopG; geomIndex++) {
  9152. var multiFeatureIndex = 0;
  9153. var geometryIndex = 0;
  9154. geometry = isGeometryCollection ?
  9155. geometryMaybeCollection.geometries[geomIndex] : geometryMaybeCollection;
  9156. // Handles null Geometry -- Skips this geometry
  9157. if (geometry === null) continue;
  9158. coords = geometry.coordinates;
  9159. var geomType = geometry.type;
  9160. wrapShrink = (excludeWrapCoord && (geomType === 'Polygon' || geomType === 'MultiPolygon')) ? 1 : 0;
  9161. switch (geomType) {
  9162. case null:
  9163. break;
  9164. case 'Point':
  9165. if (callback(coords, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  9166. coordIndex++;
  9167. multiFeatureIndex++;
  9168. break;
  9169. case 'LineString':
  9170. case 'MultiPoint':
  9171. for (j = 0; j < coords.length; j++) {
  9172. if (callback(coords[j], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  9173. coordIndex++;
  9174. if (geomType === 'MultiPoint') multiFeatureIndex++;
  9175. }
  9176. if (geomType === 'LineString') multiFeatureIndex++;
  9177. break;
  9178. case 'Polygon':
  9179. case 'MultiLineString':
  9180. for (j = 0; j < coords.length; j++) {
  9181. for (k = 0; k < coords[j].length - wrapShrink; k++) {
  9182. if (callback(coords[j][k], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  9183. coordIndex++;
  9184. }
  9185. if (geomType === 'MultiLineString') multiFeatureIndex++;
  9186. if (geomType === 'Polygon') geometryIndex++;
  9187. }
  9188. if (geomType === 'Polygon') multiFeatureIndex++;
  9189. break;
  9190. case 'MultiPolygon':
  9191. for (j = 0; j < coords.length; j++) {
  9192. if (geomType === 'MultiPolygon') geometryIndex = 0;
  9193. for (k = 0; k < coords[j].length; k++) {
  9194. for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
  9195. if (callback(coords[j][k][l], coordIndex, featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  9196. coordIndex++;
  9197. }
  9198. geometryIndex++;
  9199. }
  9200. multiFeatureIndex++;
  9201. }
  9202. break;
  9203. case 'GeometryCollection':
  9204. for (j = 0; j < geometry.geometries.length; j++)
  9205. if (meta_main_es_coordEach(geometry.geometries[j], callback, excludeWrapCoord) === false) return false;
  9206. break;
  9207. default:
  9208. throw new Error('Unknown Geometry Type');
  9209. }
  9210. }
  9211. }
  9212. }
  9213. /**
  9214. * Callback for coordReduce
  9215. *
  9216. * The first time the callback function is called, the values provided as arguments depend
  9217. * on whether the reduce method has an initialValue argument.
  9218. *
  9219. * If an initialValue is provided to the reduce method:
  9220. * - The previousValue argument is initialValue.
  9221. * - The currentValue argument is the value of the first element present in the array.
  9222. *
  9223. * If an initialValue is not provided:
  9224. * - The previousValue argument is the value of the first element present in the array.
  9225. * - The currentValue argument is the value of the second element present in the array.
  9226. *
  9227. * @callback coordReduceCallback
  9228. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9229. * of the callback, or initialValue, if supplied.
  9230. * @param {Array<number>} currentCoord The current coordinate being processed.
  9231. * @param {number} coordIndex The current index of the coordinate being processed.
  9232. * Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
  9233. * @param {number} featureIndex The current index of the Feature being processed.
  9234. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9235. * @param {number} geometryIndex The current index of the Geometry being processed.
  9236. */
  9237. /**
  9238. * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
  9239. *
  9240. * @name coordReduce
  9241. * @param {FeatureCollection|Geometry|Feature} geojson any GeoJSON object
  9242. * @param {Function} callback a method that takes (previousValue, currentCoord, coordIndex)
  9243. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9244. * @param {boolean} [excludeWrapCoord=false] whether or not to include the final coordinate of LinearRings that wraps the ring in its iteration.
  9245. * @returns {*} The value that results from the reduction.
  9246. * @example
  9247. * var features = turf.featureCollection([
  9248. * turf.point([26, 37], {"foo": "bar"}),
  9249. * turf.point([36, 53], {"hello": "world"})
  9250. * ]);
  9251. *
  9252. * turf.coordReduce(features, function (previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  9253. * //=previousValue
  9254. * //=currentCoord
  9255. * //=coordIndex
  9256. * //=featureIndex
  9257. * //=multiFeatureIndex
  9258. * //=geometryIndex
  9259. * return currentCoord;
  9260. * });
  9261. */
  9262. function meta_main_es_coordReduce(geojson, callback, initialValue, excludeWrapCoord) {
  9263. var previousValue = initialValue;
  9264. meta_main_es_coordEach(geojson, function (currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex) {
  9265. if (coordIndex === 0 && initialValue === undefined) previousValue = currentCoord;
  9266. else previousValue = callback(previousValue, currentCoord, coordIndex, featureIndex, multiFeatureIndex, geometryIndex);
  9267. }, excludeWrapCoord);
  9268. return previousValue;
  9269. }
  9270. /**
  9271. * Callback for propEach
  9272. *
  9273. * @callback propEachCallback
  9274. * @param {Object} currentProperties The current Properties being processed.
  9275. * @param {number} featureIndex The current index of the Feature being processed.
  9276. */
  9277. /**
  9278. * Iterate over properties in any GeoJSON object, similar to Array.forEach()
  9279. *
  9280. * @name propEach
  9281. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  9282. * @param {Function} callback a method that takes (currentProperties, featureIndex)
  9283. * @returns {void}
  9284. * @example
  9285. * var features = turf.featureCollection([
  9286. * turf.point([26, 37], {foo: 'bar'}),
  9287. * turf.point([36, 53], {hello: 'world'})
  9288. * ]);
  9289. *
  9290. * turf.propEach(features, function (currentProperties, featureIndex) {
  9291. * //=currentProperties
  9292. * //=featureIndex
  9293. * });
  9294. */
  9295. function meta_main_es_propEach(geojson, callback) {
  9296. var i;
  9297. switch (geojson.type) {
  9298. case 'FeatureCollection':
  9299. for (i = 0; i < geojson.features.length; i++) {
  9300. if (callback(geojson.features[i].properties, i) === false) break;
  9301. }
  9302. break;
  9303. case 'Feature':
  9304. callback(geojson.properties, 0);
  9305. break;
  9306. }
  9307. }
  9308. /**
  9309. * Callback for propReduce
  9310. *
  9311. * The first time the callback function is called, the values provided as arguments depend
  9312. * on whether the reduce method has an initialValue argument.
  9313. *
  9314. * If an initialValue is provided to the reduce method:
  9315. * - The previousValue argument is initialValue.
  9316. * - The currentValue argument is the value of the first element present in the array.
  9317. *
  9318. * If an initialValue is not provided:
  9319. * - The previousValue argument is the value of the first element present in the array.
  9320. * - The currentValue argument is the value of the second element present in the array.
  9321. *
  9322. * @callback propReduceCallback
  9323. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9324. * of the callback, or initialValue, if supplied.
  9325. * @param {*} currentProperties The current Properties being processed.
  9326. * @param {number} featureIndex The current index of the Feature being processed.
  9327. */
  9328. /**
  9329. * Reduce properties in any GeoJSON object into a single value,
  9330. * similar to how Array.reduce works. However, in this case we lazily run
  9331. * the reduction, so an array of all properties is unnecessary.
  9332. *
  9333. * @name propReduce
  9334. * @param {FeatureCollection|Feature} geojson any GeoJSON object
  9335. * @param {Function} callback a method that takes (previousValue, currentProperties, featureIndex)
  9336. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9337. * @returns {*} The value that results from the reduction.
  9338. * @example
  9339. * var features = turf.featureCollection([
  9340. * turf.point([26, 37], {foo: 'bar'}),
  9341. * turf.point([36, 53], {hello: 'world'})
  9342. * ]);
  9343. *
  9344. * turf.propReduce(features, function (previousValue, currentProperties, featureIndex) {
  9345. * //=previousValue
  9346. * //=currentProperties
  9347. * //=featureIndex
  9348. * return currentProperties
  9349. * });
  9350. */
  9351. function meta_main_es_propReduce(geojson, callback, initialValue) {
  9352. var previousValue = initialValue;
  9353. meta_main_es_propEach(geojson, function (currentProperties, featureIndex) {
  9354. if (featureIndex === 0 && initialValue === undefined) previousValue = currentProperties;
  9355. else previousValue = callback(previousValue, currentProperties, featureIndex);
  9356. });
  9357. return previousValue;
  9358. }
  9359. /**
  9360. * Callback for featureEach
  9361. *
  9362. * @callback featureEachCallback
  9363. * @param {Feature<any>} currentFeature The current Feature being processed.
  9364. * @param {number} featureIndex The current index of the Feature being processed.
  9365. */
  9366. /**
  9367. * Iterate over features in any GeoJSON object, similar to
  9368. * Array.forEach.
  9369. *
  9370. * @name featureEach
  9371. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9372. * @param {Function} callback a method that takes (currentFeature, featureIndex)
  9373. * @returns {void}
  9374. * @example
  9375. * var features = turf.featureCollection([
  9376. * turf.point([26, 37], {foo: 'bar'}),
  9377. * turf.point([36, 53], {hello: 'world'})
  9378. * ]);
  9379. *
  9380. * turf.featureEach(features, function (currentFeature, featureIndex) {
  9381. * //=currentFeature
  9382. * //=featureIndex
  9383. * });
  9384. */
  9385. function meta_main_es_featureEach(geojson, callback) {
  9386. if (geojson.type === 'Feature') {
  9387. callback(geojson, 0);
  9388. } else if (geojson.type === 'FeatureCollection') {
  9389. for (var i = 0; i < geojson.features.length; i++) {
  9390. if (callback(geojson.features[i], i) === false) break;
  9391. }
  9392. }
  9393. }
  9394. /**
  9395. * Callback for featureReduce
  9396. *
  9397. * The first time the callback function is called, the values provided as arguments depend
  9398. * on whether the reduce method has an initialValue argument.
  9399. *
  9400. * If an initialValue is provided to the reduce method:
  9401. * - The previousValue argument is initialValue.
  9402. * - The currentValue argument is the value of the first element present in the array.
  9403. *
  9404. * If an initialValue is not provided:
  9405. * - The previousValue argument is the value of the first element present in the array.
  9406. * - The currentValue argument is the value of the second element present in the array.
  9407. *
  9408. * @callback featureReduceCallback
  9409. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9410. * of the callback, or initialValue, if supplied.
  9411. * @param {Feature} currentFeature The current Feature being processed.
  9412. * @param {number} featureIndex The current index of the Feature being processed.
  9413. */
  9414. /**
  9415. * Reduce features in any GeoJSON object, similar to Array.reduce().
  9416. *
  9417. * @name featureReduce
  9418. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9419. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex)
  9420. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9421. * @returns {*} The value that results from the reduction.
  9422. * @example
  9423. * var features = turf.featureCollection([
  9424. * turf.point([26, 37], {"foo": "bar"}),
  9425. * turf.point([36, 53], {"hello": "world"})
  9426. * ]);
  9427. *
  9428. * turf.featureReduce(features, function (previousValue, currentFeature, featureIndex) {
  9429. * //=previousValue
  9430. * //=currentFeature
  9431. * //=featureIndex
  9432. * return currentFeature
  9433. * });
  9434. */
  9435. function meta_main_es_featureReduce(geojson, callback, initialValue) {
  9436. var previousValue = initialValue;
  9437. meta_main_es_featureEach(geojson, function (currentFeature, featureIndex) {
  9438. if (featureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  9439. else previousValue = callback(previousValue, currentFeature, featureIndex);
  9440. });
  9441. return previousValue;
  9442. }
  9443. /**
  9444. * Get all coordinates from any GeoJSON object.
  9445. *
  9446. * @name coordAll
  9447. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9448. * @returns {Array<Array<number>>} coordinate position array
  9449. * @example
  9450. * var features = turf.featureCollection([
  9451. * turf.point([26, 37], {foo: 'bar'}),
  9452. * turf.point([36, 53], {hello: 'world'})
  9453. * ]);
  9454. *
  9455. * var coords = turf.coordAll(features);
  9456. * //= [[26, 37], [36, 53]]
  9457. */
  9458. function meta_main_es_coordAll(geojson) {
  9459. var coords = [];
  9460. meta_main_es_coordEach(geojson, function (coord) {
  9461. coords.push(coord);
  9462. });
  9463. return coords;
  9464. }
  9465. /**
  9466. * Callback for geomEach
  9467. *
  9468. * @callback geomEachCallback
  9469. * @param {Geometry} currentGeometry The current Geometry being processed.
  9470. * @param {number} featureIndex The current index of the Feature being processed.
  9471. * @param {Object} featureProperties The current Feature Properties being processed.
  9472. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  9473. * @param {number|string} featureId The current Feature Id being processed.
  9474. */
  9475. /**
  9476. * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
  9477. *
  9478. * @name geomEach
  9479. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9480. * @param {Function} callback a method that takes (currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  9481. * @returns {void}
  9482. * @example
  9483. * var features = turf.featureCollection([
  9484. * turf.point([26, 37], {foo: 'bar'}),
  9485. * turf.point([36, 53], {hello: 'world'})
  9486. * ]);
  9487. *
  9488. * turf.geomEach(features, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  9489. * //=currentGeometry
  9490. * //=featureIndex
  9491. * //=featureProperties
  9492. * //=featureBBox
  9493. * //=featureId
  9494. * });
  9495. */
  9496. function meta_main_es_geomEach(geojson, callback) {
  9497. var i, j, g, geometry, stopG,
  9498. geometryMaybeCollection,
  9499. isGeometryCollection,
  9500. featureProperties,
  9501. featureBBox,
  9502. featureId,
  9503. featureIndex = 0,
  9504. isFeatureCollection = geojson.type === 'FeatureCollection',
  9505. isFeature = geojson.type === 'Feature',
  9506. stop = isFeatureCollection ? geojson.features.length : 1;
  9507. // This logic may look a little weird. The reason why it is that way
  9508. // is because it's trying to be fast. GeoJSON supports multiple kinds
  9509. // of objects at its root: FeatureCollection, Features, Geometries.
  9510. // This function has the responsibility of handling all of them, and that
  9511. // means that some of the `for` loops you see below actually just don't apply
  9512. // to certain inputs. For instance, if you give this just a
  9513. // Point geometry, then both loops are short-circuited and all we do
  9514. // is gradually rename the input until it's called 'geometry'.
  9515. //
  9516. // This also aims to allocate as few resources as possible: just a
  9517. // few numbers and booleans, rather than any temporary arrays as would
  9518. // be required with the normalization approach.
  9519. for (i = 0; i < stop; i++) {
  9520. geometryMaybeCollection = (isFeatureCollection ? geojson.features[i].geometry :
  9521. (isFeature ? geojson.geometry : geojson));
  9522. featureProperties = (isFeatureCollection ? geojson.features[i].properties :
  9523. (isFeature ? geojson.properties : {}));
  9524. featureBBox = (isFeatureCollection ? geojson.features[i].bbox :
  9525. (isFeature ? geojson.bbox : undefined));
  9526. featureId = (isFeatureCollection ? geojson.features[i].id :
  9527. (isFeature ? geojson.id : undefined));
  9528. isGeometryCollection = (geometryMaybeCollection) ? geometryMaybeCollection.type === 'GeometryCollection' : false;
  9529. stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
  9530. for (g = 0; g < stopG; g++) {
  9531. geometry = isGeometryCollection ?
  9532. geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
  9533. // Handle null Geometry
  9534. if (geometry === null) {
  9535. if (callback(null, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  9536. continue;
  9537. }
  9538. switch (geometry.type) {
  9539. case 'Point':
  9540. case 'LineString':
  9541. case 'MultiPoint':
  9542. case 'Polygon':
  9543. case 'MultiLineString':
  9544. case 'MultiPolygon': {
  9545. if (callback(geometry, featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  9546. break;
  9547. }
  9548. case 'GeometryCollection': {
  9549. for (j = 0; j < geometry.geometries.length; j++) {
  9550. if (callback(geometry.geometries[j], featureIndex, featureProperties, featureBBox, featureId) === false) return false;
  9551. }
  9552. break;
  9553. }
  9554. default:
  9555. throw new Error('Unknown Geometry Type');
  9556. }
  9557. }
  9558. // Only increase `featureIndex` per each feature
  9559. featureIndex++;
  9560. }
  9561. }
  9562. /**
  9563. * Callback for geomReduce
  9564. *
  9565. * The first time the callback function is called, the values provided as arguments depend
  9566. * on whether the reduce method has an initialValue argument.
  9567. *
  9568. * If an initialValue is provided to the reduce method:
  9569. * - The previousValue argument is initialValue.
  9570. * - The currentValue argument is the value of the first element present in the array.
  9571. *
  9572. * If an initialValue is not provided:
  9573. * - The previousValue argument is the value of the first element present in the array.
  9574. * - The currentValue argument is the value of the second element present in the array.
  9575. *
  9576. * @callback geomReduceCallback
  9577. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9578. * of the callback, or initialValue, if supplied.
  9579. * @param {Geometry} currentGeometry The current Geometry being processed.
  9580. * @param {number} featureIndex The current index of the Feature being processed.
  9581. * @param {Object} featureProperties The current Feature Properties being processed.
  9582. * @param {Array<number>} featureBBox The current Feature BBox being processed.
  9583. * @param {number|string} featureId The current Feature Id being processed.
  9584. */
  9585. /**
  9586. * Reduce geometry in any GeoJSON object, similar to Array.reduce().
  9587. *
  9588. * @name geomReduce
  9589. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9590. * @param {Function} callback a method that takes (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId)
  9591. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9592. * @returns {*} The value that results from the reduction.
  9593. * @example
  9594. * var features = turf.featureCollection([
  9595. * turf.point([26, 37], {foo: 'bar'}),
  9596. * turf.point([36, 53], {hello: 'world'})
  9597. * ]);
  9598. *
  9599. * turf.geomReduce(features, function (previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  9600. * //=previousValue
  9601. * //=currentGeometry
  9602. * //=featureIndex
  9603. * //=featureProperties
  9604. * //=featureBBox
  9605. * //=featureId
  9606. * return currentGeometry
  9607. * });
  9608. */
  9609. function meta_main_es_geomReduce(geojson, callback, initialValue) {
  9610. var previousValue = initialValue;
  9611. meta_main_es_geomEach(geojson, function (currentGeometry, featureIndex, featureProperties, featureBBox, featureId) {
  9612. if (featureIndex === 0 && initialValue === undefined) previousValue = currentGeometry;
  9613. else previousValue = callback(previousValue, currentGeometry, featureIndex, featureProperties, featureBBox, featureId);
  9614. });
  9615. return previousValue;
  9616. }
  9617. /**
  9618. * Callback for flattenEach
  9619. *
  9620. * @callback flattenEachCallback
  9621. * @param {Feature} currentFeature The current flattened feature being processed.
  9622. * @param {number} featureIndex The current index of the Feature being processed.
  9623. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9624. */
  9625. /**
  9626. * Iterate over flattened features in any GeoJSON object, similar to
  9627. * Array.forEach.
  9628. *
  9629. * @name flattenEach
  9630. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9631. * @param {Function} callback a method that takes (currentFeature, featureIndex, multiFeatureIndex)
  9632. * @example
  9633. * var features = turf.featureCollection([
  9634. * turf.point([26, 37], {foo: 'bar'}),
  9635. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  9636. * ]);
  9637. *
  9638. * turf.flattenEach(features, function (currentFeature, featureIndex, multiFeatureIndex) {
  9639. * //=currentFeature
  9640. * //=featureIndex
  9641. * //=multiFeatureIndex
  9642. * });
  9643. */
  9644. function meta_main_es_flattenEach(geojson, callback) {
  9645. meta_main_es_geomEach(geojson, function (geometry, featureIndex, properties, bbox, id) {
  9646. // Callback for single geometry
  9647. var type = (geometry === null) ? null : geometry.type;
  9648. switch (type) {
  9649. case null:
  9650. case 'Point':
  9651. case 'LineString':
  9652. case 'Polygon':
  9653. if (callback(feature(geometry, properties, {bbox: bbox, id: id}), featureIndex, 0) === false) return false;
  9654. return;
  9655. }
  9656. var geomType;
  9657. // Callback for multi-geometry
  9658. switch (type) {
  9659. case 'MultiPoint':
  9660. geomType = 'Point';
  9661. break;
  9662. case 'MultiLineString':
  9663. geomType = 'LineString';
  9664. break;
  9665. case 'MultiPolygon':
  9666. geomType = 'Polygon';
  9667. break;
  9668. }
  9669. for (var multiFeatureIndex = 0; multiFeatureIndex < geometry.coordinates.length; multiFeatureIndex++) {
  9670. var coordinate = geometry.coordinates[multiFeatureIndex];
  9671. var geom = {
  9672. type: geomType,
  9673. coordinates: coordinate
  9674. };
  9675. if (callback(feature(geom, properties), featureIndex, multiFeatureIndex) === false) return false;
  9676. }
  9677. });
  9678. }
  9679. /**
  9680. * Callback for flattenReduce
  9681. *
  9682. * The first time the callback function is called, the values provided as arguments depend
  9683. * on whether the reduce method has an initialValue argument.
  9684. *
  9685. * If an initialValue is provided to the reduce method:
  9686. * - The previousValue argument is initialValue.
  9687. * - The currentValue argument is the value of the first element present in the array.
  9688. *
  9689. * If an initialValue is not provided:
  9690. * - The previousValue argument is the value of the first element present in the array.
  9691. * - The currentValue argument is the value of the second element present in the array.
  9692. *
  9693. * @callback flattenReduceCallback
  9694. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9695. * of the callback, or initialValue, if supplied.
  9696. * @param {Feature} currentFeature The current Feature being processed.
  9697. * @param {number} featureIndex The current index of the Feature being processed.
  9698. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9699. */
  9700. /**
  9701. * Reduce flattened features in any GeoJSON object, similar to Array.reduce().
  9702. *
  9703. * @name flattenReduce
  9704. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON object
  9705. * @param {Function} callback a method that takes (previousValue, currentFeature, featureIndex, multiFeatureIndex)
  9706. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9707. * @returns {*} The value that results from the reduction.
  9708. * @example
  9709. * var features = turf.featureCollection([
  9710. * turf.point([26, 37], {foo: 'bar'}),
  9711. * turf.multiPoint([[40, 30], [36, 53]], {hello: 'world'})
  9712. * ]);
  9713. *
  9714. * turf.flattenReduce(features, function (previousValue, currentFeature, featureIndex, multiFeatureIndex) {
  9715. * //=previousValue
  9716. * //=currentFeature
  9717. * //=featureIndex
  9718. * //=multiFeatureIndex
  9719. * return currentFeature
  9720. * });
  9721. */
  9722. function meta_main_es_flattenReduce(geojson, callback, initialValue) {
  9723. var previousValue = initialValue;
  9724. meta_main_es_flattenEach(geojson, function (currentFeature, featureIndex, multiFeatureIndex) {
  9725. if (featureIndex === 0 && multiFeatureIndex === 0 && initialValue === undefined) previousValue = currentFeature;
  9726. else previousValue = callback(previousValue, currentFeature, featureIndex, multiFeatureIndex);
  9727. });
  9728. return previousValue;
  9729. }
  9730. /**
  9731. * Callback for segmentEach
  9732. *
  9733. * @callback segmentEachCallback
  9734. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  9735. * @param {number} featureIndex The current index of the Feature being processed.
  9736. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9737. * @param {number} geometryIndex The current index of the Geometry being processed.
  9738. * @param {number} segmentIndex The current index of the Segment being processed.
  9739. * @returns {void}
  9740. */
  9741. /**
  9742. * Iterate over 2-vertex line segment in any GeoJSON object, similar to Array.forEach()
  9743. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  9744. *
  9745. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  9746. * @param {Function} callback a method that takes (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex)
  9747. * @returns {void}
  9748. * @example
  9749. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  9750. *
  9751. * // Iterate over GeoJSON by 2-vertex segments
  9752. * turf.segmentEach(polygon, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  9753. * //=currentSegment
  9754. * //=featureIndex
  9755. * //=multiFeatureIndex
  9756. * //=geometryIndex
  9757. * //=segmentIndex
  9758. * });
  9759. *
  9760. * // Calculate the total number of segments
  9761. * var total = 0;
  9762. * turf.segmentEach(polygon, function () {
  9763. * total++;
  9764. * });
  9765. */
  9766. function meta_main_es_segmentEach(geojson, callback) {
  9767. meta_main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  9768. var segmentIndex = 0;
  9769. // Exclude null Geometries
  9770. if (!feature$$1.geometry) return;
  9771. // (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  9772. var type = feature$$1.geometry.type;
  9773. if (type === 'Point' || type === 'MultiPoint') return;
  9774. // Generate 2-vertex line segments
  9775. var previousCoords;
  9776. if (meta_main_es_coordEach(feature$$1, function (currentCoord, coordIndex, featureIndexCoord, mutliPartIndexCoord, geometryIndex) {
  9777. // Simulating a meta.coordReduce() since `reduce` operations cannot be stopped by returning `false`
  9778. if (previousCoords === undefined) {
  9779. previousCoords = currentCoord;
  9780. return;
  9781. }
  9782. var currentSegment = lineString([previousCoords, currentCoord], feature$$1.properties);
  9783. if (callback(currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) === false) return false;
  9784. segmentIndex++;
  9785. previousCoords = currentCoord;
  9786. }) === false) return false;
  9787. });
  9788. }
  9789. /**
  9790. * Callback for segmentReduce
  9791. *
  9792. * The first time the callback function is called, the values provided as arguments depend
  9793. * on whether the reduce method has an initialValue argument.
  9794. *
  9795. * If an initialValue is provided to the reduce method:
  9796. * - The previousValue argument is initialValue.
  9797. * - The currentValue argument is the value of the first element present in the array.
  9798. *
  9799. * If an initialValue is not provided:
  9800. * - The previousValue argument is the value of the first element present in the array.
  9801. * - The currentValue argument is the value of the second element present in the array.
  9802. *
  9803. * @callback segmentReduceCallback
  9804. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9805. * of the callback, or initialValue, if supplied.
  9806. * @param {Feature<LineString>} currentSegment The current Segment being processed.
  9807. * @param {number} featureIndex The current index of the Feature being processed.
  9808. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed.
  9809. * @param {number} geometryIndex The current index of the Geometry being processed.
  9810. * @param {number} segmentIndex The current index of the Segment being processed.
  9811. */
  9812. /**
  9813. * Reduce 2-vertex line segment in any GeoJSON object, similar to Array.reduce()
  9814. * (Multi)Point geometries do not contain segments therefore they are ignored during this operation.
  9815. *
  9816. * @param {FeatureCollection|Feature|Geometry} geojson any GeoJSON
  9817. * @param {Function} callback a method that takes (previousValue, currentSegment, currentIndex)
  9818. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9819. * @returns {void}
  9820. * @example
  9821. * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]);
  9822. *
  9823. * // Iterate over GeoJSON by 2-vertex segments
  9824. * turf.segmentReduce(polygon, function (previousSegment, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  9825. * //= previousSegment
  9826. * //= currentSegment
  9827. * //= featureIndex
  9828. * //= multiFeatureIndex
  9829. * //= geometryIndex
  9830. * //= segmentInex
  9831. * return currentSegment
  9832. * });
  9833. *
  9834. * // Calculate the total number of segments
  9835. * var initialValue = 0
  9836. * var total = turf.segmentReduce(polygon, function (previousValue) {
  9837. * previousValue++;
  9838. * return previousValue;
  9839. * }, initialValue);
  9840. */
  9841. function meta_main_es_segmentReduce(geojson, callback, initialValue) {
  9842. var previousValue = initialValue;
  9843. var started = false;
  9844. meta_main_es_segmentEach(geojson, function (currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex) {
  9845. if (started === false && initialValue === undefined) previousValue = currentSegment;
  9846. else previousValue = callback(previousValue, currentSegment, featureIndex, multiFeatureIndex, geometryIndex, segmentIndex);
  9847. started = true;
  9848. });
  9849. return previousValue;
  9850. }
  9851. /**
  9852. * Callback for lineEach
  9853. *
  9854. * @callback lineEachCallback
  9855. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed
  9856. * @param {number} featureIndex The current index of the Feature being processed
  9857. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  9858. * @param {number} geometryIndex The current index of the Geometry being processed
  9859. */
  9860. /**
  9861. * Iterate over line or ring coordinates in LineString, Polygon, MultiLineString, MultiPolygon Features or Geometries,
  9862. * similar to Array.forEach.
  9863. *
  9864. * @name lineEach
  9865. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  9866. * @param {Function} callback a method that takes (currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  9867. * @example
  9868. * var multiLine = turf.multiLineString([
  9869. * [[26, 37], [35, 45]],
  9870. * [[36, 53], [38, 50], [41, 55]]
  9871. * ]);
  9872. *
  9873. * turf.lineEach(multiLine, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  9874. * //=currentLine
  9875. * //=featureIndex
  9876. * //=multiFeatureIndex
  9877. * //=geometryIndex
  9878. * });
  9879. */
  9880. function meta_main_es_lineEach(geojson, callback) {
  9881. // validation
  9882. if (!geojson) throw new Error('geojson is required');
  9883. meta_main_es_flattenEach(geojson, function (feature$$1, featureIndex, multiFeatureIndex) {
  9884. if (feature$$1.geometry === null) return;
  9885. var type = feature$$1.geometry.type;
  9886. var coords = feature$$1.geometry.coordinates;
  9887. switch (type) {
  9888. case 'LineString':
  9889. if (callback(feature$$1, featureIndex, multiFeatureIndex, 0, 0) === false) return false;
  9890. break;
  9891. case 'Polygon':
  9892. for (var geometryIndex = 0; geometryIndex < coords.length; geometryIndex++) {
  9893. if (callback(lineString(coords[geometryIndex], feature$$1.properties), featureIndex, multiFeatureIndex, geometryIndex) === false) return false;
  9894. }
  9895. break;
  9896. }
  9897. });
  9898. }
  9899. /**
  9900. * Callback for lineReduce
  9901. *
  9902. * The first time the callback function is called, the values provided as arguments depend
  9903. * on whether the reduce method has an initialValue argument.
  9904. *
  9905. * If an initialValue is provided to the reduce method:
  9906. * - The previousValue argument is initialValue.
  9907. * - The currentValue argument is the value of the first element present in the array.
  9908. *
  9909. * If an initialValue is not provided:
  9910. * - The previousValue argument is the value of the first element present in the array.
  9911. * - The currentValue argument is the value of the second element present in the array.
  9912. *
  9913. * @callback lineReduceCallback
  9914. * @param {*} previousValue The accumulated value previously returned in the last invocation
  9915. * of the callback, or initialValue, if supplied.
  9916. * @param {Feature<LineString>} currentLine The current LineString|LinearRing being processed.
  9917. * @param {number} featureIndex The current index of the Feature being processed
  9918. * @param {number} multiFeatureIndex The current index of the Multi-Feature being processed
  9919. * @param {number} geometryIndex The current index of the Geometry being processed
  9920. */
  9921. /**
  9922. * Reduce features in any GeoJSON object, similar to Array.reduce().
  9923. *
  9924. * @name lineReduce
  9925. * @param {Geometry|Feature<LineString|Polygon|MultiLineString|MultiPolygon>} geojson object
  9926. * @param {Function} callback a method that takes (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex)
  9927. * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
  9928. * @returns {*} The value that results from the reduction.
  9929. * @example
  9930. * var multiPoly = turf.multiPolygon([
  9931. * turf.polygon([[[12,48],[2,41],[24,38],[12,48]], [[9,44],[13,41],[13,45],[9,44]]]),
  9932. * turf.polygon([[[5, 5], [0, 0], [2, 2], [4, 4], [5, 5]]])
  9933. * ]);
  9934. *
  9935. * turf.lineReduce(multiPoly, function (previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  9936. * //=previousValue
  9937. * //=currentLine
  9938. * //=featureIndex
  9939. * //=multiFeatureIndex
  9940. * //=geometryIndex
  9941. * return currentLine
  9942. * });
  9943. */
  9944. function meta_main_es_lineReduce(geojson, callback, initialValue) {
  9945. var previousValue = initialValue;
  9946. meta_main_es_lineEach(geojson, function (currentLine, featureIndex, multiFeatureIndex, geometryIndex) {
  9947. if (featureIndex === 0 && initialValue === undefined) previousValue = currentLine;
  9948. else previousValue = callback(previousValue, currentLine, featureIndex, multiFeatureIndex, geometryIndex);
  9949. });
  9950. return previousValue;
  9951. }
  9952. /**
  9953. * Finds a particular 2-vertex LineString Segment from a GeoJSON using `@turf/meta` indexes.
  9954. *
  9955. * Negative indexes are permitted.
  9956. * Point & MultiPoint will always return null.
  9957. *
  9958. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  9959. * @param {Object} [options={}] Optional parameters
  9960. * @param {number} [options.featureIndex=0] Feature Index
  9961. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  9962. * @param {number} [options.geometryIndex=0] Geometry Index
  9963. * @param {number} [options.segmentIndex=0] Segment Index
  9964. * @param {Object} [options.properties={}] Translate Properties to output LineString
  9965. * @param {BBox} [options.bbox={}] Translate BBox to output LineString
  9966. * @param {number|string} [options.id={}] Translate Id to output LineString
  9967. * @returns {Feature<LineString>} 2-vertex GeoJSON Feature LineString
  9968. * @example
  9969. * var multiLine = turf.multiLineString([
  9970. * [[10, 10], [50, 30], [30, 40]],
  9971. * [[-10, -10], [-50, -30], [-30, -40]]
  9972. * ]);
  9973. *
  9974. * // First Segment (defaults are 0)
  9975. * turf.findSegment(multiLine);
  9976. * // => Feature<LineString<[[10, 10], [50, 30]]>>
  9977. *
  9978. * // First Segment of 2nd Multi Feature
  9979. * turf.findSegment(multiLine, {multiFeatureIndex: 1});
  9980. * // => Feature<LineString<[[-10, -10], [-50, -30]]>>
  9981. *
  9982. * // Last Segment of Last Multi Feature
  9983. * turf.findSegment(multiLine, {multiFeatureIndex: -1, segmentIndex: -1});
  9984. * // => Feature<LineString<[[-50, -30], [-30, -40]]>>
  9985. */
  9986. function meta_main_es_findSegment(geojson, options) {
  9987. // Optional Parameters
  9988. options = options || {};
  9989. if (!isObject(options)) throw new Error('options is invalid');
  9990. var featureIndex = options.featureIndex || 0;
  9991. var multiFeatureIndex = options.multiFeatureIndex || 0;
  9992. var geometryIndex = options.geometryIndex || 0;
  9993. var segmentIndex = options.segmentIndex || 0;
  9994. // Find FeatureIndex
  9995. var properties = options.properties;
  9996. var geometry;
  9997. switch (geojson.type) {
  9998. case 'FeatureCollection':
  9999. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  10000. properties = properties || geojson.features[featureIndex].properties;
  10001. geometry = geojson.features[featureIndex].geometry;
  10002. break;
  10003. case 'Feature':
  10004. properties = properties || geojson.properties;
  10005. geometry = geojson.geometry;
  10006. break;
  10007. case 'Point':
  10008. case 'MultiPoint':
  10009. return null;
  10010. case 'LineString':
  10011. case 'Polygon':
  10012. case 'MultiLineString':
  10013. case 'MultiPolygon':
  10014. geometry = geojson;
  10015. break;
  10016. default:
  10017. throw new Error('geojson is invalid');
  10018. }
  10019. // Find SegmentIndex
  10020. if (geometry === null) return null;
  10021. var coords = geometry.coordinates;
  10022. switch (geometry.type) {
  10023. case 'Point':
  10024. case 'MultiPoint':
  10025. return null;
  10026. case 'LineString':
  10027. if (segmentIndex < 0) segmentIndex = coords.length + segmentIndex - 1;
  10028. return lineString([coords[segmentIndex], coords[segmentIndex + 1]], properties, options);
  10029. case 'Polygon':
  10030. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  10031. if (segmentIndex < 0) segmentIndex = coords[geometryIndex].length + segmentIndex - 1;
  10032. return lineString([coords[geometryIndex][segmentIndex], coords[geometryIndex][segmentIndex + 1]], properties, options);
  10033. case 'MultiLineString':
  10034. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  10035. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex].length + segmentIndex - 1;
  10036. return lineString([coords[multiFeatureIndex][segmentIndex], coords[multiFeatureIndex][segmentIndex + 1]], properties, options);
  10037. case 'MultiPolygon':
  10038. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  10039. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  10040. if (segmentIndex < 0) segmentIndex = coords[multiFeatureIndex][geometryIndex].length - segmentIndex - 1;
  10041. return lineString([coords[multiFeatureIndex][geometryIndex][segmentIndex], coords[multiFeatureIndex][geometryIndex][segmentIndex + 1]], properties, options);
  10042. }
  10043. throw new Error('geojson is invalid');
  10044. }
  10045. /**
  10046. * Finds a particular Point from a GeoJSON using `@turf/meta` indexes.
  10047. *
  10048. * Negative indexes are permitted.
  10049. *
  10050. * @param {FeatureCollection|Feature|Geometry} geojson Any GeoJSON Feature or Geometry
  10051. * @param {Object} [options={}] Optional parameters
  10052. * @param {number} [options.featureIndex=0] Feature Index
  10053. * @param {number} [options.multiFeatureIndex=0] Multi-Feature Index
  10054. * @param {number} [options.geometryIndex=0] Geometry Index
  10055. * @param {number} [options.coordIndex=0] Coord Index
  10056. * @param {Object} [options.properties={}] Translate Properties to output Point
  10057. * @param {BBox} [options.bbox={}] Translate BBox to output Point
  10058. * @param {number|string} [options.id={}] Translate Id to output Point
  10059. * @returns {Feature<Point>} 2-vertex GeoJSON Feature Point
  10060. * @example
  10061. * var multiLine = turf.multiLineString([
  10062. * [[10, 10], [50, 30], [30, 40]],
  10063. * [[-10, -10], [-50, -30], [-30, -40]]
  10064. * ]);
  10065. *
  10066. * // First Segment (defaults are 0)
  10067. * turf.findPoint(multiLine);
  10068. * // => Feature<Point<[10, 10]>>
  10069. *
  10070. * // First Segment of the 2nd Multi-Feature
  10071. * turf.findPoint(multiLine, {multiFeatureIndex: 1});
  10072. * // => Feature<Point<[-10, -10]>>
  10073. *
  10074. * // Last Segment of last Multi-Feature
  10075. * turf.findPoint(multiLine, {multiFeatureIndex: -1, coordIndex: -1});
  10076. * // => Feature<Point<[-30, -40]>>
  10077. */
  10078. function meta_main_es_findPoint(geojson, options) {
  10079. // Optional Parameters
  10080. options = options || {};
  10081. if (!isObject(options)) throw new Error('options is invalid');
  10082. var featureIndex = options.featureIndex || 0;
  10083. var multiFeatureIndex = options.multiFeatureIndex || 0;
  10084. var geometryIndex = options.geometryIndex || 0;
  10085. var coordIndex = options.coordIndex || 0;
  10086. // Find FeatureIndex
  10087. var properties = options.properties;
  10088. var geometry;
  10089. switch (geojson.type) {
  10090. case 'FeatureCollection':
  10091. if (featureIndex < 0) featureIndex = geojson.features.length + featureIndex;
  10092. properties = properties || geojson.features[featureIndex].properties;
  10093. geometry = geojson.features[featureIndex].geometry;
  10094. break;
  10095. case 'Feature':
  10096. properties = properties || geojson.properties;
  10097. geometry = geojson.geometry;
  10098. break;
  10099. case 'Point':
  10100. case 'MultiPoint':
  10101. return null;
  10102. case 'LineString':
  10103. case 'Polygon':
  10104. case 'MultiLineString':
  10105. case 'MultiPolygon':
  10106. geometry = geojson;
  10107. break;
  10108. default:
  10109. throw new Error('geojson is invalid');
  10110. }
  10111. // Find Coord Index
  10112. if (geometry === null) return null;
  10113. var coords = geometry.coordinates;
  10114. switch (geometry.type) {
  10115. case 'Point':
  10116. return point(coords, properties, options);
  10117. case 'MultiPoint':
  10118. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  10119. return point(coords[multiFeatureIndex], properties, options);
  10120. case 'LineString':
  10121. if (coordIndex < 0) coordIndex = coords.length + coordIndex;
  10122. return point(coords[coordIndex], properties, options);
  10123. case 'Polygon':
  10124. if (geometryIndex < 0) geometryIndex = coords.length + geometryIndex;
  10125. if (coordIndex < 0) coordIndex = coords[geometryIndex].length + coordIndex;
  10126. return point(coords[geometryIndex][coordIndex], properties, options);
  10127. case 'MultiLineString':
  10128. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  10129. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex].length + coordIndex;
  10130. return point(coords[multiFeatureIndex][coordIndex], properties, options);
  10131. case 'MultiPolygon':
  10132. if (multiFeatureIndex < 0) multiFeatureIndex = coords.length + multiFeatureIndex;
  10133. if (geometryIndex < 0) geometryIndex = coords[multiFeatureIndex].length + geometryIndex;
  10134. if (coordIndex < 0) coordIndex = coords[multiFeatureIndex][geometryIndex].length - coordIndex;
  10135. return point(coords[multiFeatureIndex][geometryIndex][coordIndex], properties, options);
  10136. }
  10137. throw new Error('geojson is invalid');
  10138. }
  10139. ;// CONCATENATED MODULE: ./node_modules/@turf/transform-scale/node_modules/@turf/bbox/main.es.js
  10140. /**
  10141. * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
  10142. *
  10143. * @name bbox
  10144. * @param {GeoJSON} geojson any GeoJSON object
  10145. * @returns {BBox} bbox extent in [minX, minY, maxX, maxY] order
  10146. * @example
  10147. * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]]);
  10148. * var bbox = turf.bbox(line);
  10149. * var bboxPolygon = turf.bboxPolygon(bbox);
  10150. *
  10151. * //addToMap
  10152. * var addToMap = [line, bboxPolygon]
  10153. */
  10154. function main_es_bbox(geojson) {
  10155. var BBox = [Infinity, Infinity, -Infinity, -Infinity];
  10156. meta_main_es_coordEach(geojson, function (coord) {
  10157. if (BBox[0] > coord[0]) BBox[0] = coord[0];
  10158. if (BBox[1] > coord[1]) BBox[1] = coord[1];
  10159. if (BBox[2] < coord[0]) BBox[2] = coord[0];
  10160. if (BBox[3] < coord[1]) BBox[3] = coord[1];
  10161. });
  10162. return BBox;
  10163. }
  10164. /* harmony default export */ var _turf_bbox_main_es = (main_es_bbox);
  10165. ;// CONCATENATED MODULE: ./node_modules/@turf/invariant/node_modules/@turf/helpers/main.es.js
  10166. /**
  10167. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  10168. */
  10169. var _turf_helpers_main_es_earthRadius = 6371008.8;
  10170. /**
  10171. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  10172. */
  10173. var _turf_helpers_main_es_factors = {
  10174. meters: _turf_helpers_main_es_earthRadius,
  10175. metres: _turf_helpers_main_es_earthRadius,
  10176. millimeters: _turf_helpers_main_es_earthRadius * 1000,
  10177. millimetres: _turf_helpers_main_es_earthRadius * 1000,
  10178. centimeters: _turf_helpers_main_es_earthRadius * 100,
  10179. centimetres: _turf_helpers_main_es_earthRadius * 100,
  10180. kilometers: _turf_helpers_main_es_earthRadius / 1000,
  10181. kilometres: _turf_helpers_main_es_earthRadius / 1000,
  10182. miles: _turf_helpers_main_es_earthRadius / 1609.344,
  10183. nauticalmiles: _turf_helpers_main_es_earthRadius / 1852,
  10184. inches: _turf_helpers_main_es_earthRadius * 39.370,
  10185. yards: _turf_helpers_main_es_earthRadius / 1.0936,
  10186. feet: _turf_helpers_main_es_earthRadius * 3.28084,
  10187. radians: 1,
  10188. degrees: _turf_helpers_main_es_earthRadius / 111325,
  10189. };
  10190. /**
  10191. * Units of measurement factors based on 1 meter.
  10192. */
  10193. var _turf_helpers_main_es_unitsFactors = {
  10194. meters: 1,
  10195. metres: 1,
  10196. millimeters: 1000,
  10197. millimetres: 1000,
  10198. centimeters: 100,
  10199. centimetres: 100,
  10200. kilometers: 1 / 1000,
  10201. kilometres: 1 / 1000,
  10202. miles: 1 / 1609.344,
  10203. nauticalmiles: 1 / 1852,
  10204. inches: 39.370,
  10205. yards: 1 / 1.0936,
  10206. feet: 3.28084,
  10207. radians: 1 / _turf_helpers_main_es_earthRadius,
  10208. degrees: 1 / 111325,
  10209. };
  10210. /**
  10211. * Area of measurement factors based on 1 square meter.
  10212. */
  10213. var _turf_helpers_main_es_areaFactors = {
  10214. meters: 1,
  10215. metres: 1,
  10216. millimeters: 1000000,
  10217. millimetres: 1000000,
  10218. centimeters: 10000,
  10219. centimetres: 10000,
  10220. kilometers: 0.000001,
  10221. kilometres: 0.000001,
  10222. acres: 0.000247105,
  10223. miles: 3.86e-7,
  10224. yards: 1.195990046,
  10225. feet: 10.763910417,
  10226. inches: 1550.003100006
  10227. };
  10228. /**
  10229. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  10230. *
  10231. * @name feature
  10232. * @param {Geometry} geometry input geometry
  10233. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10234. * @param {Object} [options={}] Optional Parameters
  10235. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10236. * @param {string|number} [options.id] Identifier associated with the Feature
  10237. * @returns {Feature} a GeoJSON Feature
  10238. * @example
  10239. * var geometry = {
  10240. * "type": "Point",
  10241. * "coordinates": [110, 50]
  10242. * };
  10243. *
  10244. * var feature = turf.feature(geometry);
  10245. *
  10246. * //=feature
  10247. */
  10248. function node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
  10249. // Optional Parameters
  10250. options = options || {};
  10251. if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  10252. var bbox = options.bbox;
  10253. var id = options.id;
  10254. // Validation
  10255. if (geometry === undefined) throw new Error('geometry is required');
  10256. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  10257. if (bbox) _turf_helpers_main_es_validateBBox(bbox);
  10258. if (id) _turf_helpers_main_es_validateId(id);
  10259. // Main
  10260. var feat = {type: 'Feature'};
  10261. if (id) feat.id = id;
  10262. if (bbox) feat.bbox = bbox;
  10263. feat.properties = properties || {};
  10264. feat.geometry = geometry;
  10265. return feat;
  10266. }
  10267. /**
  10268. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  10269. * For GeometryCollection type use `helpers.geometryCollection`
  10270. *
  10271. * @name geometry
  10272. * @param {string} type Geometry Type
  10273. * @param {Array<number>} coordinates Coordinates
  10274. * @param {Object} [options={}] Optional Parameters
  10275. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  10276. * @returns {Geometry} a GeoJSON Geometry
  10277. * @example
  10278. * var type = 'Point';
  10279. * var coordinates = [110, 50];
  10280. *
  10281. * var geometry = turf.geometry(type, coordinates);
  10282. *
  10283. * //=geometry
  10284. */
  10285. function _turf_helpers_main_es_geometry(type, coordinates, options) {
  10286. // Optional Parameters
  10287. options = options || {};
  10288. if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  10289. var bbox = options.bbox;
  10290. // Validation
  10291. if (!type) throw new Error('type is required');
  10292. if (!coordinates) throw new Error('coordinates is required');
  10293. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  10294. if (bbox) _turf_helpers_main_es_validateBBox(bbox);
  10295. // Main
  10296. var geom;
  10297. switch (type) {
  10298. case 'Point': geom = node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
  10299. case 'LineString': geom = node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
  10300. case 'Polygon': geom = _turf_helpers_main_es_polygon(coordinates).geometry; break;
  10301. case 'MultiPoint': geom = _turf_helpers_main_es_multiPoint(coordinates).geometry; break;
  10302. case 'MultiLineString': geom = _turf_helpers_main_es_multiLineString(coordinates).geometry; break;
  10303. case 'MultiPolygon': geom = _turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
  10304. default: throw new Error(type + ' is invalid');
  10305. }
  10306. if (bbox) geom.bbox = bbox;
  10307. return geom;
  10308. }
  10309. /**
  10310. * Creates a {@link Point} {@link Feature} from a Position.
  10311. *
  10312. * @name point
  10313. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  10314. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10315. * @param {Object} [options={}] Optional Parameters
  10316. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10317. * @param {string|number} [options.id] Identifier associated with the Feature
  10318. * @returns {Feature<Point>} a Point feature
  10319. * @example
  10320. * var point = turf.point([-75.343, 39.984]);
  10321. *
  10322. * //=point
  10323. */
  10324. function node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
  10325. if (!coordinates) throw new Error('coordinates is required');
  10326. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  10327. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  10328. if (!node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  10329. return node_modules_turf_helpers_main_es_feature({
  10330. type: 'Point',
  10331. coordinates: coordinates
  10332. }, properties, options);
  10333. }
  10334. /**
  10335. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  10336. *
  10337. * @name points
  10338. * @param {Array<Array<number>>} coordinates an array of Points
  10339. * @param {Object} [properties={}] Translate these properties to each Feature
  10340. * @param {Object} [options={}] Optional Parameters
  10341. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  10342. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  10343. * @returns {FeatureCollection<Point>} Point Feature
  10344. * @example
  10345. * var points = turf.points([
  10346. * [-75, 39],
  10347. * [-80, 45],
  10348. * [-78, 50]
  10349. * ]);
  10350. *
  10351. * //=points
  10352. */
  10353. function _turf_helpers_main_es_points(coordinates, properties, options) {
  10354. if (!coordinates) throw new Error('coordinates is required');
  10355. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  10356. return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  10357. return node_modules_turf_helpers_main_es_point(coords, properties);
  10358. }), options);
  10359. }
  10360. /**
  10361. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  10362. *
  10363. * @name polygon
  10364. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  10365. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10366. * @param {Object} [options={}] Optional Parameters
  10367. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10368. * @param {string|number} [options.id] Identifier associated with the Feature
  10369. * @returns {Feature<Polygon>} Polygon Feature
  10370. * @example
  10371. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  10372. *
  10373. * //=polygon
  10374. */
  10375. function _turf_helpers_main_es_polygon(coordinates, properties, options) {
  10376. if (!coordinates) throw new Error('coordinates is required');
  10377. for (var i = 0; i < coordinates.length; i++) {
  10378. var ring = coordinates[i];
  10379. if (ring.length < 4) {
  10380. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  10381. }
  10382. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  10383. // Check if first point of Polygon contains two numbers
  10384. if (i === 0 && j === 0 && !node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  10385. if (ring[ring.length - 1][j] !== ring[0][j]) {
  10386. throw new Error('First and last Position are not equivalent.');
  10387. }
  10388. }
  10389. }
  10390. return node_modules_turf_helpers_main_es_feature({
  10391. type: 'Polygon',
  10392. coordinates: coordinates
  10393. }, properties, options);
  10394. }
  10395. /**
  10396. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  10397. *
  10398. * @name polygons
  10399. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  10400. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10401. * @param {Object} [options={}] Optional Parameters
  10402. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10403. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  10404. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  10405. * @example
  10406. * var polygons = turf.polygons([
  10407. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  10408. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  10409. * ]);
  10410. *
  10411. * //=polygons
  10412. */
  10413. function _turf_helpers_main_es_polygons(coordinates, properties, options) {
  10414. if (!coordinates) throw new Error('coordinates is required');
  10415. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  10416. return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  10417. return _turf_helpers_main_es_polygon(coords, properties);
  10418. }), options);
  10419. }
  10420. /**
  10421. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  10422. *
  10423. * @name lineString
  10424. * @param {Array<Array<number>>} coordinates an array of Positions
  10425. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10426. * @param {Object} [options={}] Optional Parameters
  10427. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10428. * @param {string|number} [options.id] Identifier associated with the Feature
  10429. * @returns {Feature<LineString>} LineString Feature
  10430. * @example
  10431. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  10432. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  10433. *
  10434. * //=linestring1
  10435. * //=linestring2
  10436. */
  10437. function node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
  10438. if (!coordinates) throw new Error('coordinates is required');
  10439. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  10440. // Check if first point of LineString contains two numbers
  10441. if (!node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  10442. return node_modules_turf_helpers_main_es_feature({
  10443. type: 'LineString',
  10444. coordinates: coordinates
  10445. }, properties, options);
  10446. }
  10447. /**
  10448. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  10449. *
  10450. * @name lineStrings
  10451. * @param {Array<Array<number>>} coordinates an array of LinearRings
  10452. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10453. * @param {Object} [options={}] Optional Parameters
  10454. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  10455. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  10456. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  10457. * @example
  10458. * var linestrings = turf.lineStrings([
  10459. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  10460. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  10461. * ]);
  10462. *
  10463. * //=linestrings
  10464. */
  10465. function _turf_helpers_main_es_lineStrings(coordinates, properties, options) {
  10466. if (!coordinates) throw new Error('coordinates is required');
  10467. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  10468. return _turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  10469. return node_modules_turf_helpers_main_es_lineString(coords, properties);
  10470. }), options);
  10471. }
  10472. /**
  10473. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  10474. *
  10475. * @name featureCollection
  10476. * @param {Feature[]} features input features
  10477. * @param {Object} [options={}] Optional Parameters
  10478. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10479. * @param {string|number} [options.id] Identifier associated with the Feature
  10480. * @returns {FeatureCollection} FeatureCollection of Features
  10481. * @example
  10482. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  10483. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  10484. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  10485. *
  10486. * var collection = turf.featureCollection([
  10487. * locationA,
  10488. * locationB,
  10489. * locationC
  10490. * ]);
  10491. *
  10492. * //=collection
  10493. */
  10494. function _turf_helpers_main_es_featureCollection(features, options) {
  10495. // Optional Parameters
  10496. options = options || {};
  10497. if (!node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  10498. var bbox = options.bbox;
  10499. var id = options.id;
  10500. // Validation
  10501. if (!features) throw new Error('No features passed');
  10502. if (!Array.isArray(features)) throw new Error('features must be an Array');
  10503. if (bbox) _turf_helpers_main_es_validateBBox(bbox);
  10504. if (id) _turf_helpers_main_es_validateId(id);
  10505. // Main
  10506. var fc = {type: 'FeatureCollection'};
  10507. if (id) fc.id = id;
  10508. if (bbox) fc.bbox = bbox;
  10509. fc.features = features;
  10510. return fc;
  10511. }
  10512. /**
  10513. * Creates a {@link Feature<MultiLineString>} based on a
  10514. * coordinate array. Properties can be added optionally.
  10515. *
  10516. * @name multiLineString
  10517. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  10518. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10519. * @param {Object} [options={}] Optional Parameters
  10520. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10521. * @param {string|number} [options.id] Identifier associated with the Feature
  10522. * @returns {Feature<MultiLineString>} a MultiLineString feature
  10523. * @throws {Error} if no coordinates are passed
  10524. * @example
  10525. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  10526. *
  10527. * //=multiLine
  10528. */
  10529. function _turf_helpers_main_es_multiLineString(coordinates, properties, options) {
  10530. if (!coordinates) throw new Error('coordinates is required');
  10531. return node_modules_turf_helpers_main_es_feature({
  10532. type: 'MultiLineString',
  10533. coordinates: coordinates
  10534. }, properties, options);
  10535. }
  10536. /**
  10537. * Creates a {@link Feature<MultiPoint>} based on a
  10538. * coordinate array. Properties can be added optionally.
  10539. *
  10540. * @name multiPoint
  10541. * @param {Array<Array<number>>} coordinates an array of Positions
  10542. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10543. * @param {Object} [options={}] Optional Parameters
  10544. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10545. * @param {string|number} [options.id] Identifier associated with the Feature
  10546. * @returns {Feature<MultiPoint>} a MultiPoint feature
  10547. * @throws {Error} if no coordinates are passed
  10548. * @example
  10549. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  10550. *
  10551. * //=multiPt
  10552. */
  10553. function _turf_helpers_main_es_multiPoint(coordinates, properties, options) {
  10554. if (!coordinates) throw new Error('coordinates is required');
  10555. return node_modules_turf_helpers_main_es_feature({
  10556. type: 'MultiPoint',
  10557. coordinates: coordinates
  10558. }, properties, options);
  10559. }
  10560. /**
  10561. * Creates a {@link Feature<MultiPolygon>} based on a
  10562. * coordinate array. Properties can be added optionally.
  10563. *
  10564. * @name multiPolygon
  10565. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  10566. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10567. * @param {Object} [options={}] Optional Parameters
  10568. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10569. * @param {string|number} [options.id] Identifier associated with the Feature
  10570. * @returns {Feature<MultiPolygon>} a multipolygon feature
  10571. * @throws {Error} if no coordinates are passed
  10572. * @example
  10573. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  10574. *
  10575. * //=multiPoly
  10576. *
  10577. */
  10578. function _turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
  10579. if (!coordinates) throw new Error('coordinates is required');
  10580. return node_modules_turf_helpers_main_es_feature({
  10581. type: 'MultiPolygon',
  10582. coordinates: coordinates
  10583. }, properties, options);
  10584. }
  10585. /**
  10586. * Creates a {@link Feature<GeometryCollection>} based on a
  10587. * coordinate array. Properties can be added optionally.
  10588. *
  10589. * @name geometryCollection
  10590. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  10591. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  10592. * @param {Object} [options={}] Optional Parameters
  10593. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  10594. * @param {string|number} [options.id] Identifier associated with the Feature
  10595. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  10596. * @example
  10597. * var pt = {
  10598. * "type": "Point",
  10599. * "coordinates": [100, 0]
  10600. * };
  10601. * var line = {
  10602. * "type": "LineString",
  10603. * "coordinates": [ [101, 0], [102, 1] ]
  10604. * };
  10605. * var collection = turf.geometryCollection([pt, line]);
  10606. *
  10607. * //=collection
  10608. */
  10609. function _turf_helpers_main_es_geometryCollection(geometries, properties, options) {
  10610. if (!geometries) throw new Error('geometries is required');
  10611. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  10612. return node_modules_turf_helpers_main_es_feature({
  10613. type: 'GeometryCollection',
  10614. geometries: geometries
  10615. }, properties, options);
  10616. }
  10617. /**
  10618. * Round number to precision
  10619. *
  10620. * @param {number} num Number
  10621. * @param {number} [precision=0] Precision
  10622. * @returns {number} rounded number
  10623. * @example
  10624. * turf.round(120.4321)
  10625. * //=120
  10626. *
  10627. * turf.round(120.4321, 2)
  10628. * //=120.43
  10629. */
  10630. function _turf_helpers_main_es_round(num, precision) {
  10631. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  10632. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  10633. var multiplier = Math.pow(10, precision || 0);
  10634. return Math.round(num * multiplier) / multiplier;
  10635. }
  10636. /**
  10637. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  10638. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  10639. *
  10640. * @name radiansToLength
  10641. * @param {number} radians in radians across the sphere
  10642. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  10643. * @returns {number} distance
  10644. */
  10645. function _turf_helpers_main_es_radiansToLength(radians, units) {
  10646. if (radians === undefined || radians === null) throw new Error('radians is required');
  10647. if (units && typeof units !== 'string') throw new Error('units must be a string');
  10648. var factor = _turf_helpers_main_es_factors[units || 'kilometers'];
  10649. if (!factor) throw new Error(units + ' units is invalid');
  10650. return radians * factor;
  10651. }
  10652. /**
  10653. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  10654. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  10655. *
  10656. * @name lengthToRadians
  10657. * @param {number} distance in real units
  10658. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  10659. * @returns {number} radians
  10660. */
  10661. function _turf_helpers_main_es_lengthToRadians(distance, units) {
  10662. if (distance === undefined || distance === null) throw new Error('distance is required');
  10663. if (units && typeof units !== 'string') throw new Error('units must be a string');
  10664. var factor = _turf_helpers_main_es_factors[units || 'kilometers'];
  10665. if (!factor) throw new Error(units + ' units is invalid');
  10666. return distance / factor;
  10667. }
  10668. /**
  10669. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  10670. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  10671. *
  10672. * @name lengthToDegrees
  10673. * @param {number} distance in real units
  10674. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  10675. * @returns {number} degrees
  10676. */
  10677. function _turf_helpers_main_es_lengthToDegrees(distance, units) {
  10678. return _turf_helpers_main_es_radiansToDegrees(_turf_helpers_main_es_lengthToRadians(distance, units));
  10679. }
  10680. /**
  10681. * Converts any bearing angle from the north line direction (positive clockwise)
  10682. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  10683. *
  10684. * @name bearingToAzimuth
  10685. * @param {number} bearing angle, between -180 and +180 degrees
  10686. * @returns {number} angle between 0 and 360 degrees
  10687. */
  10688. function _turf_helpers_main_es_bearingToAzimuth(bearing) {
  10689. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  10690. var angle = bearing % 360;
  10691. if (angle < 0) angle += 360;
  10692. return angle;
  10693. }
  10694. /**
  10695. * Converts an angle in radians to degrees
  10696. *
  10697. * @name radiansToDegrees
  10698. * @param {number} radians angle in radians
  10699. * @returns {number} degrees between 0 and 360 degrees
  10700. */
  10701. function _turf_helpers_main_es_radiansToDegrees(radians) {
  10702. if (radians === null || radians === undefined) throw new Error('radians is required');
  10703. var degrees = radians % (2 * Math.PI);
  10704. return degrees * 180 / Math.PI;
  10705. }
  10706. /**
  10707. * Converts an angle in degrees to radians
  10708. *
  10709. * @name degreesToRadians
  10710. * @param {number} degrees angle between 0 and 360 degrees
  10711. * @returns {number} angle in radians
  10712. */
  10713. function _turf_helpers_main_es_degreesToRadians(degrees) {
  10714. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  10715. var radians = degrees % 360;
  10716. return radians * Math.PI / 180;
  10717. }
  10718. /**
  10719. * Converts a length to the requested unit.
  10720. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  10721. *
  10722. * @param {number} length to be converted
  10723. * @param {string} originalUnit of the length
  10724. * @param {string} [finalUnit='kilometers'] returned unit
  10725. * @returns {number} the converted length
  10726. */
  10727. function _turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
  10728. if (length === null || length === undefined) throw new Error('length is required');
  10729. if (!(length >= 0)) throw new Error('length must be a positive number');
  10730. return _turf_helpers_main_es_radiansToLength(_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  10731. }
  10732. /**
  10733. * Converts a area to the requested unit.
  10734. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  10735. * @param {number} area to be converted
  10736. * @param {string} [originalUnit='meters'] of the distance
  10737. * @param {string} [finalUnit='kilometers'] returned unit
  10738. * @returns {number} the converted distance
  10739. */
  10740. function _turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
  10741. if (area === null || area === undefined) throw new Error('area is required');
  10742. if (!(area >= 0)) throw new Error('area must be a positive number');
  10743. var startFactor = _turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
  10744. if (!startFactor) throw new Error('invalid original units');
  10745. var finalFactor = _turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
  10746. if (!finalFactor) throw new Error('invalid final units');
  10747. return (area / startFactor) * finalFactor;
  10748. }
  10749. /**
  10750. * isNumber
  10751. *
  10752. * @param {*} num Number to validate
  10753. * @returns {boolean} true/false
  10754. * @example
  10755. * turf.isNumber(123)
  10756. * //=true
  10757. * turf.isNumber('foo')
  10758. * //=false
  10759. */
  10760. function node_modules_turf_helpers_main_es_isNumber(num) {
  10761. return !isNaN(num) && num !== null && !Array.isArray(num);
  10762. }
  10763. /**
  10764. * isObject
  10765. *
  10766. * @param {*} input variable to validate
  10767. * @returns {boolean} true/false
  10768. * @example
  10769. * turf.isObject({elevation: 10})
  10770. * //=true
  10771. * turf.isObject('foo')
  10772. * //=false
  10773. */
  10774. function node_modules_turf_helpers_main_es_isObject(input) {
  10775. return (!!input) && (input.constructor === Object);
  10776. }
  10777. /**
  10778. * Validate BBox
  10779. *
  10780. * @private
  10781. * @param {Array<number>} bbox BBox to validate
  10782. * @returns {void}
  10783. * @throws Error if BBox is not valid
  10784. * @example
  10785. * validateBBox([-180, -40, 110, 50])
  10786. * //=OK
  10787. * validateBBox([-180, -40])
  10788. * //=Error
  10789. * validateBBox('Foo')
  10790. * //=Error
  10791. * validateBBox(5)
  10792. * //=Error
  10793. * validateBBox(null)
  10794. * //=Error
  10795. * validateBBox(undefined)
  10796. * //=Error
  10797. */
  10798. function _turf_helpers_main_es_validateBBox(bbox) {
  10799. if (!bbox) throw new Error('bbox is required');
  10800. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  10801. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  10802. bbox.forEach(function (num) {
  10803. if (!node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  10804. });
  10805. }
  10806. /**
  10807. * Validate Id
  10808. *
  10809. * @private
  10810. * @param {string|number} id Id to validate
  10811. * @returns {void}
  10812. * @throws Error if Id is not valid
  10813. * @example
  10814. * validateId([-180, -40, 110, 50])
  10815. * //=Error
  10816. * validateId([-180, -40])
  10817. * //=Error
  10818. * validateId('Foo')
  10819. * //=OK
  10820. * validateId(5)
  10821. * //=OK
  10822. * validateId(null)
  10823. * //=Error
  10824. * validateId(undefined)
  10825. * //=Error
  10826. */
  10827. function _turf_helpers_main_es_validateId(id) {
  10828. if (!id) throw new Error('id is required');
  10829. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  10830. }
  10831. // Deprecated methods
  10832. function _turf_helpers_main_es_radians2degrees() {
  10833. throw new Error('method has been renamed to `radiansToDegrees`');
  10834. }
  10835. function _turf_helpers_main_es_degrees2radians() {
  10836. throw new Error('method has been renamed to `degreesToRadians`');
  10837. }
  10838. function _turf_helpers_main_es_distanceToDegrees() {
  10839. throw new Error('method has been renamed to `lengthToDegrees`');
  10840. }
  10841. function _turf_helpers_main_es_distanceToRadians() {
  10842. throw new Error('method has been renamed to `lengthToRadians`');
  10843. }
  10844. function _turf_helpers_main_es_radiansToDistance() {
  10845. throw new Error('method has been renamed to `radiansToLength`');
  10846. }
  10847. function _turf_helpers_main_es_bearingToAngle() {
  10848. throw new Error('method has been renamed to `bearingToAzimuth`');
  10849. }
  10850. function _turf_helpers_main_es_convertDistance() {
  10851. throw new Error('method has been renamed to `convertLength`');
  10852. }
  10853. ;// CONCATENATED MODULE: ./node_modules/@turf/invariant/main.es.js
  10854. /**
  10855. * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
  10856. *
  10857. * @name getCoord
  10858. * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
  10859. * @returns {Array<number>} coordinates
  10860. * @example
  10861. * var pt = turf.point([10, 10]);
  10862. *
  10863. * var coord = turf.getCoord(pt);
  10864. * //= [10, 10]
  10865. */
  10866. function getCoord(coord) {
  10867. if (!coord) throw new Error('coord is required');
  10868. if (coord.type === 'Feature' && coord.geometry !== null && coord.geometry.type === 'Point') return coord.geometry.coordinates;
  10869. if (coord.type === 'Point') return coord.coordinates;
  10870. if (Array.isArray(coord) && coord.length >= 2 && coord[0].length === undefined && coord[1].length === undefined) return coord;
  10871. throw new Error('coord must be GeoJSON Point or an Array of numbers');
  10872. }
  10873. /**
  10874. * Unwrap coordinates from a Feature, Geometry Object or an Array
  10875. *
  10876. * @name getCoords
  10877. * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
  10878. * @returns {Array<any>} coordinates
  10879. * @example
  10880. * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
  10881. *
  10882. * var coords = turf.getCoords(poly);
  10883. * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
  10884. */
  10885. function getCoords(coords) {
  10886. if (!coords) throw new Error('coords is required');
  10887. // Feature
  10888. if (coords.type === 'Feature' && coords.geometry !== null) return coords.geometry.coordinates;
  10889. // Geometry
  10890. if (coords.coordinates) return coords.coordinates;
  10891. // Array of numbers
  10892. if (Array.isArray(coords)) return coords;
  10893. throw new Error('coords must be GeoJSON Feature, Geometry Object or an Array');
  10894. }
  10895. /**
  10896. * Checks if coordinates contains a number
  10897. *
  10898. * @name containsNumber
  10899. * @param {Array<any>} coordinates GeoJSON Coordinates
  10900. * @returns {boolean} true if Array contains a number
  10901. */
  10902. function containsNumber(coordinates) {
  10903. if (coordinates.length > 1 && isNumber(coordinates[0]) && isNumber(coordinates[1])) {
  10904. return true;
  10905. }
  10906. if (Array.isArray(coordinates[0]) && coordinates[0].length) {
  10907. return containsNumber(coordinates[0]);
  10908. }
  10909. throw new Error('coordinates must only contain numbers');
  10910. }
  10911. /**
  10912. * Enforce expectations about types of GeoJSON objects for Turf.
  10913. *
  10914. * @name geojsonType
  10915. * @param {GeoJSON} value any GeoJSON object
  10916. * @param {string} type expected GeoJSON type
  10917. * @param {string} name name of calling function
  10918. * @throws {Error} if value is not the expected type.
  10919. */
  10920. function geojsonType(value, type, name) {
  10921. if (!type || !name) throw new Error('type and name required');
  10922. if (!value || value.type !== type) {
  10923. throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + value.type);
  10924. }
  10925. }
  10926. /**
  10927. * Enforce expectations about types of {@link Feature} inputs for Turf.
  10928. * Internally this uses {@link geojsonType} to judge geometry types.
  10929. *
  10930. * @name featureOf
  10931. * @param {Feature} feature a feature with an expected geometry type
  10932. * @param {string} type expected GeoJSON type
  10933. * @param {string} name name of calling function
  10934. * @throws {Error} error if value is not the expected type.
  10935. */
  10936. function featureOf(feature, type, name) {
  10937. if (!feature) throw new Error('No feature passed');
  10938. if (!name) throw new Error('.featureOf() requires a name');
  10939. if (!feature || feature.type !== 'Feature' || !feature.geometry) {
  10940. throw new Error('Invalid input to ' + name + ', Feature with geometry required');
  10941. }
  10942. if (!feature.geometry || feature.geometry.type !== type) {
  10943. throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
  10944. }
  10945. }
  10946. /**
  10947. * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
  10948. * Internally this uses {@link geojsonType} to judge geometry types.
  10949. *
  10950. * @name collectionOf
  10951. * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
  10952. * @param {string} type expected GeoJSON type
  10953. * @param {string} name name of calling function
  10954. * @throws {Error} if value is not the expected type.
  10955. */
  10956. function collectionOf(featureCollection, type, name) {
  10957. if (!featureCollection) throw new Error('No featureCollection passed');
  10958. if (!name) throw new Error('.collectionOf() requires a name');
  10959. if (!featureCollection || featureCollection.type !== 'FeatureCollection') {
  10960. throw new Error('Invalid input to ' + name + ', FeatureCollection required');
  10961. }
  10962. for (var i = 0; i < featureCollection.features.length; i++) {
  10963. var feature = featureCollection.features[i];
  10964. if (!feature || feature.type !== 'Feature' || !feature.geometry) {
  10965. throw new Error('Invalid input to ' + name + ', Feature with geometry required');
  10966. }
  10967. if (!feature.geometry || feature.geometry.type !== type) {
  10968. throw new Error('Invalid input to ' + name + ': must be a ' + type + ', given ' + feature.geometry.type);
  10969. }
  10970. }
  10971. }
  10972. /**
  10973. * Get Geometry from Feature or Geometry Object
  10974. *
  10975. * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
  10976. * @returns {Geometry|null} GeoJSON Geometry Object
  10977. * @throws {Error} if geojson is not a Feature or Geometry Object
  10978. * @example
  10979. * var point = {
  10980. * "type": "Feature",
  10981. * "properties": {},
  10982. * "geometry": {
  10983. * "type": "Point",
  10984. * "coordinates": [110, 40]
  10985. * }
  10986. * }
  10987. * var geom = turf.getGeom(point)
  10988. * //={"type": "Point", "coordinates": [110, 40]}
  10989. */
  10990. function getGeom(geojson) {
  10991. if (!geojson) throw new Error('geojson is required');
  10992. if (geojson.geometry !== undefined) return geojson.geometry;
  10993. if (geojson.coordinates || geojson.geometries) return geojson;
  10994. throw new Error('geojson must be a valid Feature or Geometry Object');
  10995. }
  10996. /**
  10997. * Get Geometry Type from Feature or Geometry Object
  10998. *
  10999. * @throws {Error} **DEPRECATED** in v5.0.0 in favor of getType
  11000. */
  11001. function getGeomType() {
  11002. throw new Error('invariant.getGeomType has been deprecated in v5.0 in favor of invariant.getType');
  11003. }
  11004. /**
  11005. * Get GeoJSON object's type, Geometry type is prioritize.
  11006. *
  11007. * @param {GeoJSON} geojson GeoJSON object
  11008. * @param {string} [name="geojson"] name of the variable to display in error message
  11009. * @returns {string} GeoJSON type
  11010. * @example
  11011. * var point = {
  11012. * "type": "Feature",
  11013. * "properties": {},
  11014. * "geometry": {
  11015. * "type": "Point",
  11016. * "coordinates": [110, 40]
  11017. * }
  11018. * }
  11019. * var geom = turf.getType(point)
  11020. * //="Point"
  11021. */
  11022. function getType(geojson, name) {
  11023. if (!geojson) throw new Error((name || 'geojson') + ' is required');
  11024. // GeoJSON Feature & GeometryCollection
  11025. if (geojson.geometry && geojson.geometry.type) return geojson.geometry.type;
  11026. // GeoJSON Geometry & FeatureCollection
  11027. if (geojson.type) return geojson.type;
  11028. throw new Error((name || 'geojson') + ' is invalid');
  11029. }
  11030. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-bearing/node_modules/@turf/helpers/main.es.js
  11031. /**
  11032. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  11033. */
  11034. var node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
  11035. /**
  11036. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  11037. */
  11038. var node_modules_turf_helpers_main_es_factors = {
  11039. meters: node_modules_turf_helpers_main_es_earthRadius,
  11040. metres: node_modules_turf_helpers_main_es_earthRadius,
  11041. millimeters: node_modules_turf_helpers_main_es_earthRadius * 1000,
  11042. millimetres: node_modules_turf_helpers_main_es_earthRadius * 1000,
  11043. centimeters: node_modules_turf_helpers_main_es_earthRadius * 100,
  11044. centimetres: node_modules_turf_helpers_main_es_earthRadius * 100,
  11045. kilometers: node_modules_turf_helpers_main_es_earthRadius / 1000,
  11046. kilometres: node_modules_turf_helpers_main_es_earthRadius / 1000,
  11047. miles: node_modules_turf_helpers_main_es_earthRadius / 1609.344,
  11048. nauticalmiles: node_modules_turf_helpers_main_es_earthRadius / 1852,
  11049. inches: node_modules_turf_helpers_main_es_earthRadius * 39.370,
  11050. yards: node_modules_turf_helpers_main_es_earthRadius / 1.0936,
  11051. feet: node_modules_turf_helpers_main_es_earthRadius * 3.28084,
  11052. radians: 1,
  11053. degrees: node_modules_turf_helpers_main_es_earthRadius / 111325,
  11054. };
  11055. /**
  11056. * Units of measurement factors based on 1 meter.
  11057. */
  11058. var node_modules_turf_helpers_main_es_unitsFactors = {
  11059. meters: 1,
  11060. metres: 1,
  11061. millimeters: 1000,
  11062. millimetres: 1000,
  11063. centimeters: 100,
  11064. centimetres: 100,
  11065. kilometers: 1 / 1000,
  11066. kilometres: 1 / 1000,
  11067. miles: 1 / 1609.344,
  11068. nauticalmiles: 1 / 1852,
  11069. inches: 39.370,
  11070. yards: 1 / 1.0936,
  11071. feet: 3.28084,
  11072. radians: 1 / node_modules_turf_helpers_main_es_earthRadius,
  11073. degrees: 1 / 111325,
  11074. };
  11075. /**
  11076. * Area of measurement factors based on 1 square meter.
  11077. */
  11078. var node_modules_turf_helpers_main_es_areaFactors = {
  11079. meters: 1,
  11080. metres: 1,
  11081. millimeters: 1000000,
  11082. millimetres: 1000000,
  11083. centimeters: 10000,
  11084. centimetres: 10000,
  11085. kilometers: 0.000001,
  11086. kilometres: 0.000001,
  11087. acres: 0.000247105,
  11088. miles: 3.86e-7,
  11089. yards: 1.195990046,
  11090. feet: 10.763910417,
  11091. inches: 1550.003100006
  11092. };
  11093. /**
  11094. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  11095. *
  11096. * @name feature
  11097. * @param {Geometry} geometry input geometry
  11098. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11099. * @param {Object} [options={}] Optional Parameters
  11100. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11101. * @param {string|number} [options.id] Identifier associated with the Feature
  11102. * @returns {Feature} a GeoJSON Feature
  11103. * @example
  11104. * var geometry = {
  11105. * "type": "Point",
  11106. * "coordinates": [110, 50]
  11107. * };
  11108. *
  11109. * var feature = turf.feature(geometry);
  11110. *
  11111. * //=feature
  11112. */
  11113. function rhumb_bearing_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
  11114. // Optional Parameters
  11115. options = options || {};
  11116. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11117. var bbox = options.bbox;
  11118. var id = options.id;
  11119. // Validation
  11120. if (geometry === undefined) throw new Error('geometry is required');
  11121. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  11122. if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
  11123. if (id) node_modules_turf_helpers_main_es_validateId(id);
  11124. // Main
  11125. var feat = {type: 'Feature'};
  11126. if (id) feat.id = id;
  11127. if (bbox) feat.bbox = bbox;
  11128. feat.properties = properties || {};
  11129. feat.geometry = geometry;
  11130. return feat;
  11131. }
  11132. /**
  11133. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  11134. * For GeometryCollection type use `helpers.geometryCollection`
  11135. *
  11136. * @name geometry
  11137. * @param {string} type Geometry Type
  11138. * @param {Array<number>} coordinates Coordinates
  11139. * @param {Object} [options={}] Optional Parameters
  11140. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  11141. * @returns {Geometry} a GeoJSON Geometry
  11142. * @example
  11143. * var type = 'Point';
  11144. * var coordinates = [110, 50];
  11145. *
  11146. * var geometry = turf.geometry(type, coordinates);
  11147. *
  11148. * //=geometry
  11149. */
  11150. function node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
  11151. // Optional Parameters
  11152. options = options || {};
  11153. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11154. var bbox = options.bbox;
  11155. // Validation
  11156. if (!type) throw new Error('type is required');
  11157. if (!coordinates) throw new Error('coordinates is required');
  11158. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11159. if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
  11160. // Main
  11161. var geom;
  11162. switch (type) {
  11163. case 'Point': geom = rhumb_bearing_node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
  11164. case 'LineString': geom = rhumb_bearing_node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
  11165. case 'Polygon': geom = node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
  11166. case 'MultiPoint': geom = node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
  11167. case 'MultiLineString': geom = node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
  11168. case 'MultiPolygon': geom = node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
  11169. default: throw new Error(type + ' is invalid');
  11170. }
  11171. if (bbox) geom.bbox = bbox;
  11172. return geom;
  11173. }
  11174. /**
  11175. * Creates a {@link Point} {@link Feature} from a Position.
  11176. *
  11177. * @name point
  11178. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  11179. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11180. * @param {Object} [options={}] Optional Parameters
  11181. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11182. * @param {string|number} [options.id] Identifier associated with the Feature
  11183. * @returns {Feature<Point>} a Point feature
  11184. * @example
  11185. * var point = turf.point([-75.343, 39.984]);
  11186. *
  11187. * //=point
  11188. */
  11189. function rhumb_bearing_node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
  11190. if (!coordinates) throw new Error('coordinates is required');
  11191. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11192. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  11193. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  11194. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11195. type: 'Point',
  11196. coordinates: coordinates
  11197. }, properties, options);
  11198. }
  11199. /**
  11200. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  11201. *
  11202. * @name points
  11203. * @param {Array<Array<number>>} coordinates an array of Points
  11204. * @param {Object} [properties={}] Translate these properties to each Feature
  11205. * @param {Object} [options={}] Optional Parameters
  11206. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  11207. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  11208. * @returns {FeatureCollection<Point>} Point Feature
  11209. * @example
  11210. * var points = turf.points([
  11211. * [-75, 39],
  11212. * [-80, 45],
  11213. * [-78, 50]
  11214. * ]);
  11215. *
  11216. * //=points
  11217. */
  11218. function node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
  11219. if (!coordinates) throw new Error('coordinates is required');
  11220. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11221. return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  11222. return rhumb_bearing_node_modules_turf_helpers_main_es_point(coords, properties);
  11223. }), options);
  11224. }
  11225. /**
  11226. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  11227. *
  11228. * @name polygon
  11229. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  11230. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11231. * @param {Object} [options={}] Optional Parameters
  11232. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11233. * @param {string|number} [options.id] Identifier associated with the Feature
  11234. * @returns {Feature<Polygon>} Polygon Feature
  11235. * @example
  11236. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  11237. *
  11238. * //=polygon
  11239. */
  11240. function node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
  11241. if (!coordinates) throw new Error('coordinates is required');
  11242. for (var i = 0; i < coordinates.length; i++) {
  11243. var ring = coordinates[i];
  11244. if (ring.length < 4) {
  11245. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  11246. }
  11247. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  11248. // Check if first point of Polygon contains two numbers
  11249. if (i === 0 && j === 0 && !rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  11250. if (ring[ring.length - 1][j] !== ring[0][j]) {
  11251. throw new Error('First and last Position are not equivalent.');
  11252. }
  11253. }
  11254. }
  11255. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11256. type: 'Polygon',
  11257. coordinates: coordinates
  11258. }, properties, options);
  11259. }
  11260. /**
  11261. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  11262. *
  11263. * @name polygons
  11264. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  11265. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11266. * @param {Object} [options={}] Optional Parameters
  11267. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11268. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  11269. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  11270. * @example
  11271. * var polygons = turf.polygons([
  11272. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  11273. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  11274. * ]);
  11275. *
  11276. * //=polygons
  11277. */
  11278. function node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
  11279. if (!coordinates) throw new Error('coordinates is required');
  11280. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11281. return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  11282. return node_modules_turf_helpers_main_es_polygon(coords, properties);
  11283. }), options);
  11284. }
  11285. /**
  11286. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  11287. *
  11288. * @name lineString
  11289. * @param {Array<Array<number>>} coordinates an array of Positions
  11290. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11291. * @param {Object} [options={}] Optional Parameters
  11292. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11293. * @param {string|number} [options.id] Identifier associated with the Feature
  11294. * @returns {Feature<LineString>} LineString Feature
  11295. * @example
  11296. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  11297. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  11298. *
  11299. * //=linestring1
  11300. * //=linestring2
  11301. */
  11302. function rhumb_bearing_node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
  11303. if (!coordinates) throw new Error('coordinates is required');
  11304. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  11305. // Check if first point of LineString contains two numbers
  11306. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  11307. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11308. type: 'LineString',
  11309. coordinates: coordinates
  11310. }, properties, options);
  11311. }
  11312. /**
  11313. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  11314. *
  11315. * @name lineStrings
  11316. * @param {Array<Array<number>>} coordinates an array of LinearRings
  11317. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11318. * @param {Object} [options={}] Optional Parameters
  11319. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  11320. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  11321. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  11322. * @example
  11323. * var linestrings = turf.lineStrings([
  11324. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  11325. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  11326. * ]);
  11327. *
  11328. * //=linestrings
  11329. */
  11330. function node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
  11331. if (!coordinates) throw new Error('coordinates is required');
  11332. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11333. return node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  11334. return rhumb_bearing_node_modules_turf_helpers_main_es_lineString(coords, properties);
  11335. }), options);
  11336. }
  11337. /**
  11338. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  11339. *
  11340. * @name featureCollection
  11341. * @param {Feature[]} features input features
  11342. * @param {Object} [options={}] Optional Parameters
  11343. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11344. * @param {string|number} [options.id] Identifier associated with the Feature
  11345. * @returns {FeatureCollection} FeatureCollection of Features
  11346. * @example
  11347. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  11348. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  11349. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  11350. *
  11351. * var collection = turf.featureCollection([
  11352. * locationA,
  11353. * locationB,
  11354. * locationC
  11355. * ]);
  11356. *
  11357. * //=collection
  11358. */
  11359. function node_modules_turf_helpers_main_es_featureCollection(features, options) {
  11360. // Optional Parameters
  11361. options = options || {};
  11362. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11363. var bbox = options.bbox;
  11364. var id = options.id;
  11365. // Validation
  11366. if (!features) throw new Error('No features passed');
  11367. if (!Array.isArray(features)) throw new Error('features must be an Array');
  11368. if (bbox) node_modules_turf_helpers_main_es_validateBBox(bbox);
  11369. if (id) node_modules_turf_helpers_main_es_validateId(id);
  11370. // Main
  11371. var fc = {type: 'FeatureCollection'};
  11372. if (id) fc.id = id;
  11373. if (bbox) fc.bbox = bbox;
  11374. fc.features = features;
  11375. return fc;
  11376. }
  11377. /**
  11378. * Creates a {@link Feature<MultiLineString>} based on a
  11379. * coordinate array. Properties can be added optionally.
  11380. *
  11381. * @name multiLineString
  11382. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  11383. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11384. * @param {Object} [options={}] Optional Parameters
  11385. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11386. * @param {string|number} [options.id] Identifier associated with the Feature
  11387. * @returns {Feature<MultiLineString>} a MultiLineString feature
  11388. * @throws {Error} if no coordinates are passed
  11389. * @example
  11390. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  11391. *
  11392. * //=multiLine
  11393. */
  11394. function node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
  11395. if (!coordinates) throw new Error('coordinates is required');
  11396. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11397. type: 'MultiLineString',
  11398. coordinates: coordinates
  11399. }, properties, options);
  11400. }
  11401. /**
  11402. * Creates a {@link Feature<MultiPoint>} based on a
  11403. * coordinate array. Properties can be added optionally.
  11404. *
  11405. * @name multiPoint
  11406. * @param {Array<Array<number>>} coordinates an array of Positions
  11407. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11408. * @param {Object} [options={}] Optional Parameters
  11409. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11410. * @param {string|number} [options.id] Identifier associated with the Feature
  11411. * @returns {Feature<MultiPoint>} a MultiPoint feature
  11412. * @throws {Error} if no coordinates are passed
  11413. * @example
  11414. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  11415. *
  11416. * //=multiPt
  11417. */
  11418. function node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
  11419. if (!coordinates) throw new Error('coordinates is required');
  11420. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11421. type: 'MultiPoint',
  11422. coordinates: coordinates
  11423. }, properties, options);
  11424. }
  11425. /**
  11426. * Creates a {@link Feature<MultiPolygon>} based on a
  11427. * coordinate array. Properties can be added optionally.
  11428. *
  11429. * @name multiPolygon
  11430. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  11431. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11432. * @param {Object} [options={}] Optional Parameters
  11433. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11434. * @param {string|number} [options.id] Identifier associated with the Feature
  11435. * @returns {Feature<MultiPolygon>} a multipolygon feature
  11436. * @throws {Error} if no coordinates are passed
  11437. * @example
  11438. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  11439. *
  11440. * //=multiPoly
  11441. *
  11442. */
  11443. function node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
  11444. if (!coordinates) throw new Error('coordinates is required');
  11445. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11446. type: 'MultiPolygon',
  11447. coordinates: coordinates
  11448. }, properties, options);
  11449. }
  11450. /**
  11451. * Creates a {@link Feature<GeometryCollection>} based on a
  11452. * coordinate array. Properties can be added optionally.
  11453. *
  11454. * @name geometryCollection
  11455. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  11456. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11457. * @param {Object} [options={}] Optional Parameters
  11458. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11459. * @param {string|number} [options.id] Identifier associated with the Feature
  11460. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  11461. * @example
  11462. * var pt = {
  11463. * "type": "Point",
  11464. * "coordinates": [100, 0]
  11465. * };
  11466. * var line = {
  11467. * "type": "LineString",
  11468. * "coordinates": [ [101, 0], [102, 1] ]
  11469. * };
  11470. * var collection = turf.geometryCollection([pt, line]);
  11471. *
  11472. * //=collection
  11473. */
  11474. function node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
  11475. if (!geometries) throw new Error('geometries is required');
  11476. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  11477. return rhumb_bearing_node_modules_turf_helpers_main_es_feature({
  11478. type: 'GeometryCollection',
  11479. geometries: geometries
  11480. }, properties, options);
  11481. }
  11482. /**
  11483. * Round number to precision
  11484. *
  11485. * @param {number} num Number
  11486. * @param {number} [precision=0] Precision
  11487. * @returns {number} rounded number
  11488. * @example
  11489. * turf.round(120.4321)
  11490. * //=120
  11491. *
  11492. * turf.round(120.4321, 2)
  11493. * //=120.43
  11494. */
  11495. function node_modules_turf_helpers_main_es_round(num, precision) {
  11496. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  11497. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  11498. var multiplier = Math.pow(10, precision || 0);
  11499. return Math.round(num * multiplier) / multiplier;
  11500. }
  11501. /**
  11502. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  11503. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  11504. *
  11505. * @name radiansToLength
  11506. * @param {number} radians in radians across the sphere
  11507. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  11508. * @returns {number} distance
  11509. */
  11510. function node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
  11511. if (radians === undefined || radians === null) throw new Error('radians is required');
  11512. if (units && typeof units !== 'string') throw new Error('units must be a string');
  11513. var factor = node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  11514. if (!factor) throw new Error(units + ' units is invalid');
  11515. return radians * factor;
  11516. }
  11517. /**
  11518. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  11519. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  11520. *
  11521. * @name lengthToRadians
  11522. * @param {number} distance in real units
  11523. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  11524. * @returns {number} radians
  11525. */
  11526. function node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
  11527. if (distance === undefined || distance === null) throw new Error('distance is required');
  11528. if (units && typeof units !== 'string') throw new Error('units must be a string');
  11529. var factor = node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  11530. if (!factor) throw new Error(units + ' units is invalid');
  11531. return distance / factor;
  11532. }
  11533. /**
  11534. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  11535. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  11536. *
  11537. * @name lengthToDegrees
  11538. * @param {number} distance in real units
  11539. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  11540. * @returns {number} degrees
  11541. */
  11542. function node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
  11543. return node_modules_turf_helpers_main_es_radiansToDegrees(node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
  11544. }
  11545. /**
  11546. * Converts any bearing angle from the north line direction (positive clockwise)
  11547. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  11548. *
  11549. * @name bearingToAzimuth
  11550. * @param {number} bearing angle, between -180 and +180 degrees
  11551. * @returns {number} angle between 0 and 360 degrees
  11552. */
  11553. function node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
  11554. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  11555. var angle = bearing % 360;
  11556. if (angle < 0) angle += 360;
  11557. return angle;
  11558. }
  11559. /**
  11560. * Converts an angle in radians to degrees
  11561. *
  11562. * @name radiansToDegrees
  11563. * @param {number} radians angle in radians
  11564. * @returns {number} degrees between 0 and 360 degrees
  11565. */
  11566. function node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
  11567. if (radians === null || radians === undefined) throw new Error('radians is required');
  11568. var degrees = radians % (2 * Math.PI);
  11569. return degrees * 180 / Math.PI;
  11570. }
  11571. /**
  11572. * Converts an angle in degrees to radians
  11573. *
  11574. * @name degreesToRadians
  11575. * @param {number} degrees angle between 0 and 360 degrees
  11576. * @returns {number} angle in radians
  11577. */
  11578. function node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
  11579. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  11580. var radians = degrees % 360;
  11581. return radians * Math.PI / 180;
  11582. }
  11583. /**
  11584. * Converts a length to the requested unit.
  11585. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  11586. *
  11587. * @param {number} length to be converted
  11588. * @param {string} originalUnit of the length
  11589. * @param {string} [finalUnit='kilometers'] returned unit
  11590. * @returns {number} the converted length
  11591. */
  11592. function node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
  11593. if (length === null || length === undefined) throw new Error('length is required');
  11594. if (!(length >= 0)) throw new Error('length must be a positive number');
  11595. return node_modules_turf_helpers_main_es_radiansToLength(node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  11596. }
  11597. /**
  11598. * Converts a area to the requested unit.
  11599. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  11600. * @param {number} area to be converted
  11601. * @param {string} [originalUnit='meters'] of the distance
  11602. * @param {string} [finalUnit='kilometers'] returned unit
  11603. * @returns {number} the converted distance
  11604. */
  11605. function node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
  11606. if (area === null || area === undefined) throw new Error('area is required');
  11607. if (!(area >= 0)) throw new Error('area must be a positive number');
  11608. var startFactor = node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
  11609. if (!startFactor) throw new Error('invalid original units');
  11610. var finalFactor = node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
  11611. if (!finalFactor) throw new Error('invalid final units');
  11612. return (area / startFactor) * finalFactor;
  11613. }
  11614. /**
  11615. * isNumber
  11616. *
  11617. * @param {*} num Number to validate
  11618. * @returns {boolean} true/false
  11619. * @example
  11620. * turf.isNumber(123)
  11621. * //=true
  11622. * turf.isNumber('foo')
  11623. * //=false
  11624. */
  11625. function rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(num) {
  11626. return !isNaN(num) && num !== null && !Array.isArray(num);
  11627. }
  11628. /**
  11629. * isObject
  11630. *
  11631. * @param {*} input variable to validate
  11632. * @returns {boolean} true/false
  11633. * @example
  11634. * turf.isObject({elevation: 10})
  11635. * //=true
  11636. * turf.isObject('foo')
  11637. * //=false
  11638. */
  11639. function rhumb_bearing_node_modules_turf_helpers_main_es_isObject(input) {
  11640. return (!!input) && (input.constructor === Object);
  11641. }
  11642. /**
  11643. * Validate BBox
  11644. *
  11645. * @private
  11646. * @param {Array<number>} bbox BBox to validate
  11647. * @returns {void}
  11648. * @throws Error if BBox is not valid
  11649. * @example
  11650. * validateBBox([-180, -40, 110, 50])
  11651. * //=OK
  11652. * validateBBox([-180, -40])
  11653. * //=Error
  11654. * validateBBox('Foo')
  11655. * //=Error
  11656. * validateBBox(5)
  11657. * //=Error
  11658. * validateBBox(null)
  11659. * //=Error
  11660. * validateBBox(undefined)
  11661. * //=Error
  11662. */
  11663. function node_modules_turf_helpers_main_es_validateBBox(bbox) {
  11664. if (!bbox) throw new Error('bbox is required');
  11665. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  11666. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  11667. bbox.forEach(function (num) {
  11668. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  11669. });
  11670. }
  11671. /**
  11672. * Validate Id
  11673. *
  11674. * @private
  11675. * @param {string|number} id Id to validate
  11676. * @returns {void}
  11677. * @throws Error if Id is not valid
  11678. * @example
  11679. * validateId([-180, -40, 110, 50])
  11680. * //=Error
  11681. * validateId([-180, -40])
  11682. * //=Error
  11683. * validateId('Foo')
  11684. * //=OK
  11685. * validateId(5)
  11686. * //=OK
  11687. * validateId(null)
  11688. * //=Error
  11689. * validateId(undefined)
  11690. * //=Error
  11691. */
  11692. function node_modules_turf_helpers_main_es_validateId(id) {
  11693. if (!id) throw new Error('id is required');
  11694. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  11695. }
  11696. // Deprecated methods
  11697. function node_modules_turf_helpers_main_es_radians2degrees() {
  11698. throw new Error('method has been renamed to `radiansToDegrees`');
  11699. }
  11700. function node_modules_turf_helpers_main_es_degrees2radians() {
  11701. throw new Error('method has been renamed to `degreesToRadians`');
  11702. }
  11703. function node_modules_turf_helpers_main_es_distanceToDegrees() {
  11704. throw new Error('method has been renamed to `lengthToDegrees`');
  11705. }
  11706. function node_modules_turf_helpers_main_es_distanceToRadians() {
  11707. throw new Error('method has been renamed to `lengthToRadians`');
  11708. }
  11709. function node_modules_turf_helpers_main_es_radiansToDistance() {
  11710. throw new Error('method has been renamed to `radiansToLength`');
  11711. }
  11712. function node_modules_turf_helpers_main_es_bearingToAngle() {
  11713. throw new Error('method has been renamed to `bearingToAzimuth`');
  11714. }
  11715. function node_modules_turf_helpers_main_es_convertDistance() {
  11716. throw new Error('method has been renamed to `convertLength`');
  11717. }
  11718. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-bearing/main.es.js
  11719. // https://en.wikipedia.org/wiki/Rhumb_line
  11720. /**
  11721. * Takes two {@link Point|points} and finds the bearing angle between them along a Rhumb line
  11722. * i.e. the angle measured in degrees start the north line (0 degrees)
  11723. *
  11724. * @name rhumbBearing
  11725. * @param {Coord} start starting Point
  11726. * @param {Coord} end ending Point
  11727. * @param {Object} [options] Optional parameters
  11728. * @param {boolean} [options.final=false] calculates the final bearing if true
  11729. * @returns {number} bearing from north in decimal degrees, between -180 and 180 degrees (positive clockwise)
  11730. * @example
  11731. * var point1 = turf.point([-75.343, 39.984], {"marker-color": "#F00"});
  11732. * var point2 = turf.point([-75.534, 39.123], {"marker-color": "#00F"});
  11733. *
  11734. * var bearing = turf.rhumbBearing(point1, point2);
  11735. *
  11736. * //addToMap
  11737. * var addToMap = [point1, point2];
  11738. * point1.properties.bearing = bearing;
  11739. * point2.properties.bearing = bearing;
  11740. */
  11741. function rhumbBearing(start, end, options) {
  11742. // Optional parameters
  11743. options = options || {};
  11744. if (!rhumb_bearing_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11745. var final = options.final;
  11746. // validation
  11747. if (!start) throw new Error('start point is required');
  11748. if (!end) throw new Error('end point is required');
  11749. var bear360;
  11750. if (final) bear360 = calculateRhumbBearing(getCoord(end), getCoord(start));
  11751. else bear360 = calculateRhumbBearing(getCoord(start), getCoord(end));
  11752. var bear180 = (bear360 > 180) ? -(360 - bear360) : bear360;
  11753. return bear180;
  11754. }
  11755. /**
  11756. * Returns the bearing from ‘this’ point to destination point along a rhumb line.
  11757. * Adapted from Geodesy: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js
  11758. *
  11759. * @private
  11760. * @param {Array<number>} from - origin point.
  11761. * @param {Array<number>} to - destination point.
  11762. * @returns {number} Bearing in degrees from north.
  11763. * @example
  11764. * var p1 = new LatLon(51.127, 1.338);
  11765. * var p2 = new LatLon(50.964, 1.853);
  11766. * var d = p1.rhumbBearingTo(p2); // 116.7 m
  11767. */
  11768. function calculateRhumbBearing(from, to) {
  11769. // φ => phi
  11770. // Δλ => deltaLambda
  11771. // Δψ => deltaPsi
  11772. // θ => theta
  11773. var phi1 = node_modules_turf_helpers_main_es_degreesToRadians(from[1]);
  11774. var phi2 = node_modules_turf_helpers_main_es_degreesToRadians(to[1]);
  11775. var deltaLambda = node_modules_turf_helpers_main_es_degreesToRadians((to[0] - from[0]));
  11776. // if deltaLambdaon over 180° take shorter rhumb line across the anti-meridian:
  11777. if (deltaLambda > Math.PI) deltaLambda -= 2 * Math.PI;
  11778. if (deltaLambda < -Math.PI) deltaLambda += 2 * Math.PI;
  11779. var deltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
  11780. var theta = Math.atan2(deltaLambda, deltaPsi);
  11781. return (node_modules_turf_helpers_main_es_radiansToDegrees(theta) + 360) % 360;
  11782. }
  11783. /* harmony default export */ var rhumb_bearing_main_es = (rhumbBearing);
  11784. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-distance/node_modules/@turf/helpers/main.es.js
  11785. /**
  11786. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  11787. */
  11788. var rhumb_distance_node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
  11789. /**
  11790. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  11791. */
  11792. var rhumb_distance_node_modules_turf_helpers_main_es_factors = {
  11793. meters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
  11794. metres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
  11795. millimeters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 1000,
  11796. millimetres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 1000,
  11797. centimeters: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 100,
  11798. centimetres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 100,
  11799. kilometers: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1000,
  11800. kilometres: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1000,
  11801. miles: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1609.344,
  11802. nauticalmiles: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1852,
  11803. inches: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 39.370,
  11804. yards: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 1.0936,
  11805. feet: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius * 3.28084,
  11806. radians: 1,
  11807. degrees: rhumb_distance_node_modules_turf_helpers_main_es_earthRadius / 111325,
  11808. };
  11809. /**
  11810. * Units of measurement factors based on 1 meter.
  11811. */
  11812. var rhumb_distance_node_modules_turf_helpers_main_es_unitsFactors = {
  11813. meters: 1,
  11814. metres: 1,
  11815. millimeters: 1000,
  11816. millimetres: 1000,
  11817. centimeters: 100,
  11818. centimetres: 100,
  11819. kilometers: 1 / 1000,
  11820. kilometres: 1 / 1000,
  11821. miles: 1 / 1609.344,
  11822. nauticalmiles: 1 / 1852,
  11823. inches: 39.370,
  11824. yards: 1 / 1.0936,
  11825. feet: 3.28084,
  11826. radians: 1 / rhumb_distance_node_modules_turf_helpers_main_es_earthRadius,
  11827. degrees: 1 / 111325,
  11828. };
  11829. /**
  11830. * Area of measurement factors based on 1 square meter.
  11831. */
  11832. var rhumb_distance_node_modules_turf_helpers_main_es_areaFactors = {
  11833. meters: 1,
  11834. metres: 1,
  11835. millimeters: 1000000,
  11836. millimetres: 1000000,
  11837. centimeters: 10000,
  11838. centimetres: 10000,
  11839. kilometers: 0.000001,
  11840. kilometres: 0.000001,
  11841. acres: 0.000247105,
  11842. miles: 3.86e-7,
  11843. yards: 1.195990046,
  11844. feet: 10.763910417,
  11845. inches: 1550.003100006
  11846. };
  11847. /**
  11848. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  11849. *
  11850. * @name feature
  11851. * @param {Geometry} geometry input geometry
  11852. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11853. * @param {Object} [options={}] Optional Parameters
  11854. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11855. * @param {string|number} [options.id] Identifier associated with the Feature
  11856. * @returns {Feature} a GeoJSON Feature
  11857. * @example
  11858. * var geometry = {
  11859. * "type": "Point",
  11860. * "coordinates": [110, 50]
  11861. * };
  11862. *
  11863. * var feature = turf.feature(geometry);
  11864. *
  11865. * //=feature
  11866. */
  11867. function rhumb_distance_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
  11868. // Optional Parameters
  11869. options = options || {};
  11870. if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11871. var bbox = options.bbox;
  11872. var id = options.id;
  11873. // Validation
  11874. if (geometry === undefined) throw new Error('geometry is required');
  11875. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  11876. if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
  11877. if (id) rhumb_distance_node_modules_turf_helpers_main_es_validateId(id);
  11878. // Main
  11879. var feat = {type: 'Feature'};
  11880. if (id) feat.id = id;
  11881. if (bbox) feat.bbox = bbox;
  11882. feat.properties = properties || {};
  11883. feat.geometry = geometry;
  11884. return feat;
  11885. }
  11886. /**
  11887. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  11888. * For GeometryCollection type use `helpers.geometryCollection`
  11889. *
  11890. * @name geometry
  11891. * @param {string} type Geometry Type
  11892. * @param {Array<number>} coordinates Coordinates
  11893. * @param {Object} [options={}] Optional Parameters
  11894. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  11895. * @returns {Geometry} a GeoJSON Geometry
  11896. * @example
  11897. * var type = 'Point';
  11898. * var coordinates = [110, 50];
  11899. *
  11900. * var geometry = turf.geometry(type, coordinates);
  11901. *
  11902. * //=geometry
  11903. */
  11904. function rhumb_distance_node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
  11905. // Optional Parameters
  11906. options = options || {};
  11907. if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  11908. var bbox = options.bbox;
  11909. // Validation
  11910. if (!type) throw new Error('type is required');
  11911. if (!coordinates) throw new Error('coordinates is required');
  11912. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11913. if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
  11914. // Main
  11915. var geom;
  11916. switch (type) {
  11917. case 'Point': geom = rhumb_distance_node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
  11918. case 'LineString': geom = rhumb_distance_node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
  11919. case 'Polygon': geom = rhumb_distance_node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
  11920. case 'MultiPoint': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
  11921. case 'MultiLineString': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
  11922. case 'MultiPolygon': geom = rhumb_distance_node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
  11923. default: throw new Error(type + ' is invalid');
  11924. }
  11925. if (bbox) geom.bbox = bbox;
  11926. return geom;
  11927. }
  11928. /**
  11929. * Creates a {@link Point} {@link Feature} from a Position.
  11930. *
  11931. * @name point
  11932. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  11933. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11934. * @param {Object} [options={}] Optional Parameters
  11935. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11936. * @param {string|number} [options.id] Identifier associated with the Feature
  11937. * @returns {Feature<Point>} a Point feature
  11938. * @example
  11939. * var point = turf.point([-75.343, 39.984]);
  11940. *
  11941. * //=point
  11942. */
  11943. function rhumb_distance_node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
  11944. if (!coordinates) throw new Error('coordinates is required');
  11945. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11946. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  11947. if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  11948. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  11949. type: 'Point',
  11950. coordinates: coordinates
  11951. }, properties, options);
  11952. }
  11953. /**
  11954. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  11955. *
  11956. * @name points
  11957. * @param {Array<Array<number>>} coordinates an array of Points
  11958. * @param {Object} [properties={}] Translate these properties to each Feature
  11959. * @param {Object} [options={}] Optional Parameters
  11960. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  11961. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  11962. * @returns {FeatureCollection<Point>} Point Feature
  11963. * @example
  11964. * var points = turf.points([
  11965. * [-75, 39],
  11966. * [-80, 45],
  11967. * [-78, 50]
  11968. * ]);
  11969. *
  11970. * //=points
  11971. */
  11972. function rhumb_distance_node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
  11973. if (!coordinates) throw new Error('coordinates is required');
  11974. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  11975. return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  11976. return rhumb_distance_node_modules_turf_helpers_main_es_point(coords, properties);
  11977. }), options);
  11978. }
  11979. /**
  11980. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  11981. *
  11982. * @name polygon
  11983. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  11984. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  11985. * @param {Object} [options={}] Optional Parameters
  11986. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  11987. * @param {string|number} [options.id] Identifier associated with the Feature
  11988. * @returns {Feature<Polygon>} Polygon Feature
  11989. * @example
  11990. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  11991. *
  11992. * //=polygon
  11993. */
  11994. function rhumb_distance_node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
  11995. if (!coordinates) throw new Error('coordinates is required');
  11996. for (var i = 0; i < coordinates.length; i++) {
  11997. var ring = coordinates[i];
  11998. if (ring.length < 4) {
  11999. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  12000. }
  12001. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  12002. // Check if first point of Polygon contains two numbers
  12003. if (i === 0 && j === 0 && !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  12004. if (ring[ring.length - 1][j] !== ring[0][j]) {
  12005. throw new Error('First and last Position are not equivalent.');
  12006. }
  12007. }
  12008. }
  12009. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12010. type: 'Polygon',
  12011. coordinates: coordinates
  12012. }, properties, options);
  12013. }
  12014. /**
  12015. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  12016. *
  12017. * @name polygons
  12018. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  12019. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12020. * @param {Object} [options={}] Optional Parameters
  12021. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12022. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  12023. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  12024. * @example
  12025. * var polygons = turf.polygons([
  12026. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  12027. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  12028. * ]);
  12029. *
  12030. * //=polygons
  12031. */
  12032. function rhumb_distance_node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
  12033. if (!coordinates) throw new Error('coordinates is required');
  12034. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12035. return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  12036. return rhumb_distance_node_modules_turf_helpers_main_es_polygon(coords, properties);
  12037. }), options);
  12038. }
  12039. /**
  12040. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  12041. *
  12042. * @name lineString
  12043. * @param {Array<Array<number>>} coordinates an array of Positions
  12044. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12045. * @param {Object} [options={}] Optional Parameters
  12046. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12047. * @param {string|number} [options.id] Identifier associated with the Feature
  12048. * @returns {Feature<LineString>} LineString Feature
  12049. * @example
  12050. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  12051. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  12052. *
  12053. * //=linestring1
  12054. * //=linestring2
  12055. */
  12056. function rhumb_distance_node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
  12057. if (!coordinates) throw new Error('coordinates is required');
  12058. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  12059. // Check if first point of LineString contains two numbers
  12060. if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !rhumb_distance_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  12061. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12062. type: 'LineString',
  12063. coordinates: coordinates
  12064. }, properties, options);
  12065. }
  12066. /**
  12067. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  12068. *
  12069. * @name lineStrings
  12070. * @param {Array<Array<number>>} coordinates an array of LinearRings
  12071. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12072. * @param {Object} [options={}] Optional Parameters
  12073. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  12074. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  12075. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  12076. * @example
  12077. * var linestrings = turf.lineStrings([
  12078. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  12079. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  12080. * ]);
  12081. *
  12082. * //=linestrings
  12083. */
  12084. function rhumb_distance_node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
  12085. if (!coordinates) throw new Error('coordinates is required');
  12086. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12087. return rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  12088. return rhumb_distance_node_modules_turf_helpers_main_es_lineString(coords, properties);
  12089. }), options);
  12090. }
  12091. /**
  12092. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  12093. *
  12094. * @name featureCollection
  12095. * @param {Feature[]} features input features
  12096. * @param {Object} [options={}] Optional Parameters
  12097. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12098. * @param {string|number} [options.id] Identifier associated with the Feature
  12099. * @returns {FeatureCollection} FeatureCollection of Features
  12100. * @example
  12101. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  12102. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  12103. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  12104. *
  12105. * var collection = turf.featureCollection([
  12106. * locationA,
  12107. * locationB,
  12108. * locationC
  12109. * ]);
  12110. *
  12111. * //=collection
  12112. */
  12113. function rhumb_distance_node_modules_turf_helpers_main_es_featureCollection(features, options) {
  12114. // Optional Parameters
  12115. options = options || {};
  12116. if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  12117. var bbox = options.bbox;
  12118. var id = options.id;
  12119. // Validation
  12120. if (!features) throw new Error('No features passed');
  12121. if (!Array.isArray(features)) throw new Error('features must be an Array');
  12122. if (bbox) rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox);
  12123. if (id) rhumb_distance_node_modules_turf_helpers_main_es_validateId(id);
  12124. // Main
  12125. var fc = {type: 'FeatureCollection'};
  12126. if (id) fc.id = id;
  12127. if (bbox) fc.bbox = bbox;
  12128. fc.features = features;
  12129. return fc;
  12130. }
  12131. /**
  12132. * Creates a {@link Feature<MultiLineString>} based on a
  12133. * coordinate array. Properties can be added optionally.
  12134. *
  12135. * @name multiLineString
  12136. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  12137. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12138. * @param {Object} [options={}] Optional Parameters
  12139. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12140. * @param {string|number} [options.id] Identifier associated with the Feature
  12141. * @returns {Feature<MultiLineString>} a MultiLineString feature
  12142. * @throws {Error} if no coordinates are passed
  12143. * @example
  12144. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  12145. *
  12146. * //=multiLine
  12147. */
  12148. function rhumb_distance_node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
  12149. if (!coordinates) throw new Error('coordinates is required');
  12150. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12151. type: 'MultiLineString',
  12152. coordinates: coordinates
  12153. }, properties, options);
  12154. }
  12155. /**
  12156. * Creates a {@link Feature<MultiPoint>} based on a
  12157. * coordinate array. Properties can be added optionally.
  12158. *
  12159. * @name multiPoint
  12160. * @param {Array<Array<number>>} coordinates an array of Positions
  12161. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12162. * @param {Object} [options={}] Optional Parameters
  12163. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12164. * @param {string|number} [options.id] Identifier associated with the Feature
  12165. * @returns {Feature<MultiPoint>} a MultiPoint feature
  12166. * @throws {Error} if no coordinates are passed
  12167. * @example
  12168. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  12169. *
  12170. * //=multiPt
  12171. */
  12172. function rhumb_distance_node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
  12173. if (!coordinates) throw new Error('coordinates is required');
  12174. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12175. type: 'MultiPoint',
  12176. coordinates: coordinates
  12177. }, properties, options);
  12178. }
  12179. /**
  12180. * Creates a {@link Feature<MultiPolygon>} based on a
  12181. * coordinate array. Properties can be added optionally.
  12182. *
  12183. * @name multiPolygon
  12184. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  12185. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12186. * @param {Object} [options={}] Optional Parameters
  12187. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12188. * @param {string|number} [options.id] Identifier associated with the Feature
  12189. * @returns {Feature<MultiPolygon>} a multipolygon feature
  12190. * @throws {Error} if no coordinates are passed
  12191. * @example
  12192. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  12193. *
  12194. * //=multiPoly
  12195. *
  12196. */
  12197. function rhumb_distance_node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
  12198. if (!coordinates) throw new Error('coordinates is required');
  12199. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12200. type: 'MultiPolygon',
  12201. coordinates: coordinates
  12202. }, properties, options);
  12203. }
  12204. /**
  12205. * Creates a {@link Feature<GeometryCollection>} based on a
  12206. * coordinate array. Properties can be added optionally.
  12207. *
  12208. * @name geometryCollection
  12209. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  12210. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12211. * @param {Object} [options={}] Optional Parameters
  12212. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12213. * @param {string|number} [options.id] Identifier associated with the Feature
  12214. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  12215. * @example
  12216. * var pt = {
  12217. * "type": "Point",
  12218. * "coordinates": [100, 0]
  12219. * };
  12220. * var line = {
  12221. * "type": "LineString",
  12222. * "coordinates": [ [101, 0], [102, 1] ]
  12223. * };
  12224. * var collection = turf.geometryCollection([pt, line]);
  12225. *
  12226. * //=collection
  12227. */
  12228. function rhumb_distance_node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
  12229. if (!geometries) throw new Error('geometries is required');
  12230. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  12231. return rhumb_distance_node_modules_turf_helpers_main_es_feature({
  12232. type: 'GeometryCollection',
  12233. geometries: geometries
  12234. }, properties, options);
  12235. }
  12236. /**
  12237. * Round number to precision
  12238. *
  12239. * @param {number} num Number
  12240. * @param {number} [precision=0] Precision
  12241. * @returns {number} rounded number
  12242. * @example
  12243. * turf.round(120.4321)
  12244. * //=120
  12245. *
  12246. * turf.round(120.4321, 2)
  12247. * //=120.43
  12248. */
  12249. function rhumb_distance_node_modules_turf_helpers_main_es_round(num, precision) {
  12250. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  12251. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  12252. var multiplier = Math.pow(10, precision || 0);
  12253. return Math.round(num * multiplier) / multiplier;
  12254. }
  12255. /**
  12256. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  12257. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  12258. *
  12259. * @name radiansToLength
  12260. * @param {number} radians in radians across the sphere
  12261. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  12262. * @returns {number} distance
  12263. */
  12264. function rhumb_distance_node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
  12265. if (radians === undefined || radians === null) throw new Error('radians is required');
  12266. if (units && typeof units !== 'string') throw new Error('units must be a string');
  12267. var factor = rhumb_distance_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  12268. if (!factor) throw new Error(units + ' units is invalid');
  12269. return radians * factor;
  12270. }
  12271. /**
  12272. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  12273. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  12274. *
  12275. * @name lengthToRadians
  12276. * @param {number} distance in real units
  12277. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  12278. * @returns {number} radians
  12279. */
  12280. function rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
  12281. if (distance === undefined || distance === null) throw new Error('distance is required');
  12282. if (units && typeof units !== 'string') throw new Error('units must be a string');
  12283. var factor = rhumb_distance_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  12284. if (!factor) throw new Error(units + ' units is invalid');
  12285. return distance / factor;
  12286. }
  12287. /**
  12288. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  12289. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  12290. *
  12291. * @name lengthToDegrees
  12292. * @param {number} distance in real units
  12293. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  12294. * @returns {number} degrees
  12295. */
  12296. function rhumb_distance_node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
  12297. return rhumb_distance_node_modules_turf_helpers_main_es_radiansToDegrees(rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
  12298. }
  12299. /**
  12300. * Converts any bearing angle from the north line direction (positive clockwise)
  12301. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  12302. *
  12303. * @name bearingToAzimuth
  12304. * @param {number} bearing angle, between -180 and +180 degrees
  12305. * @returns {number} angle between 0 and 360 degrees
  12306. */
  12307. function rhumb_distance_node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
  12308. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  12309. var angle = bearing % 360;
  12310. if (angle < 0) angle += 360;
  12311. return angle;
  12312. }
  12313. /**
  12314. * Converts an angle in radians to degrees
  12315. *
  12316. * @name radiansToDegrees
  12317. * @param {number} radians angle in radians
  12318. * @returns {number} degrees between 0 and 360 degrees
  12319. */
  12320. function rhumb_distance_node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
  12321. if (radians === null || radians === undefined) throw new Error('radians is required');
  12322. var degrees = radians % (2 * Math.PI);
  12323. return degrees * 180 / Math.PI;
  12324. }
  12325. /**
  12326. * Converts an angle in degrees to radians
  12327. *
  12328. * @name degreesToRadians
  12329. * @param {number} degrees angle between 0 and 360 degrees
  12330. * @returns {number} angle in radians
  12331. */
  12332. function rhumb_distance_node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
  12333. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  12334. var radians = degrees % 360;
  12335. return radians * Math.PI / 180;
  12336. }
  12337. /**
  12338. * Converts a length to the requested unit.
  12339. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  12340. *
  12341. * @param {number} length to be converted
  12342. * @param {string} originalUnit of the length
  12343. * @param {string} [finalUnit='kilometers'] returned unit
  12344. * @returns {number} the converted length
  12345. */
  12346. function rhumb_distance_node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
  12347. if (length === null || length === undefined) throw new Error('length is required');
  12348. if (!(length >= 0)) throw new Error('length must be a positive number');
  12349. return rhumb_distance_node_modules_turf_helpers_main_es_radiansToLength(rhumb_distance_node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  12350. }
  12351. /**
  12352. * Converts a area to the requested unit.
  12353. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  12354. * @param {number} area to be converted
  12355. * @param {string} [originalUnit='meters'] of the distance
  12356. * @param {string} [finalUnit='kilometers'] returned unit
  12357. * @returns {number} the converted distance
  12358. */
  12359. function rhumb_distance_node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
  12360. if (area === null || area === undefined) throw new Error('area is required');
  12361. if (!(area >= 0)) throw new Error('area must be a positive number');
  12362. var startFactor = rhumb_distance_node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
  12363. if (!startFactor) throw new Error('invalid original units');
  12364. var finalFactor = rhumb_distance_node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
  12365. if (!finalFactor) throw new Error('invalid final units');
  12366. return (area / startFactor) * finalFactor;
  12367. }
  12368. /**
  12369. * isNumber
  12370. *
  12371. * @param {*} num Number to validate
  12372. * @returns {boolean} true/false
  12373. * @example
  12374. * turf.isNumber(123)
  12375. * //=true
  12376. * turf.isNumber('foo')
  12377. * //=false
  12378. */
  12379. function rhumb_distance_node_modules_turf_helpers_main_es_isNumber(num) {
  12380. return !isNaN(num) && num !== null && !Array.isArray(num);
  12381. }
  12382. /**
  12383. * isObject
  12384. *
  12385. * @param {*} input variable to validate
  12386. * @returns {boolean} true/false
  12387. * @example
  12388. * turf.isObject({elevation: 10})
  12389. * //=true
  12390. * turf.isObject('foo')
  12391. * //=false
  12392. */
  12393. function rhumb_distance_node_modules_turf_helpers_main_es_isObject(input) {
  12394. return (!!input) && (input.constructor === Object);
  12395. }
  12396. /**
  12397. * Validate BBox
  12398. *
  12399. * @private
  12400. * @param {Array<number>} bbox BBox to validate
  12401. * @returns {void}
  12402. * @throws Error if BBox is not valid
  12403. * @example
  12404. * validateBBox([-180, -40, 110, 50])
  12405. * //=OK
  12406. * validateBBox([-180, -40])
  12407. * //=Error
  12408. * validateBBox('Foo')
  12409. * //=Error
  12410. * validateBBox(5)
  12411. * //=Error
  12412. * validateBBox(null)
  12413. * //=Error
  12414. * validateBBox(undefined)
  12415. * //=Error
  12416. */
  12417. function rhumb_distance_node_modules_turf_helpers_main_es_validateBBox(bbox) {
  12418. if (!bbox) throw new Error('bbox is required');
  12419. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  12420. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  12421. bbox.forEach(function (num) {
  12422. if (!rhumb_distance_node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  12423. });
  12424. }
  12425. /**
  12426. * Validate Id
  12427. *
  12428. * @private
  12429. * @param {string|number} id Id to validate
  12430. * @returns {void}
  12431. * @throws Error if Id is not valid
  12432. * @example
  12433. * validateId([-180, -40, 110, 50])
  12434. * //=Error
  12435. * validateId([-180, -40])
  12436. * //=Error
  12437. * validateId('Foo')
  12438. * //=OK
  12439. * validateId(5)
  12440. * //=OK
  12441. * validateId(null)
  12442. * //=Error
  12443. * validateId(undefined)
  12444. * //=Error
  12445. */
  12446. function rhumb_distance_node_modules_turf_helpers_main_es_validateId(id) {
  12447. if (!id) throw new Error('id is required');
  12448. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  12449. }
  12450. // Deprecated methods
  12451. function rhumb_distance_node_modules_turf_helpers_main_es_radians2degrees() {
  12452. throw new Error('method has been renamed to `radiansToDegrees`');
  12453. }
  12454. function rhumb_distance_node_modules_turf_helpers_main_es_degrees2radians() {
  12455. throw new Error('method has been renamed to `degreesToRadians`');
  12456. }
  12457. function rhumb_distance_node_modules_turf_helpers_main_es_distanceToDegrees() {
  12458. throw new Error('method has been renamed to `lengthToDegrees`');
  12459. }
  12460. function rhumb_distance_node_modules_turf_helpers_main_es_distanceToRadians() {
  12461. throw new Error('method has been renamed to `lengthToRadians`');
  12462. }
  12463. function rhumb_distance_node_modules_turf_helpers_main_es_radiansToDistance() {
  12464. throw new Error('method has been renamed to `radiansToLength`');
  12465. }
  12466. function rhumb_distance_node_modules_turf_helpers_main_es_bearingToAngle() {
  12467. throw new Error('method has been renamed to `bearingToAzimuth`');
  12468. }
  12469. function rhumb_distance_node_modules_turf_helpers_main_es_convertDistance() {
  12470. throw new Error('method has been renamed to `convertLength`');
  12471. }
  12472. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-distance/main.es.js
  12473. // https://en.wikipedia.org/wiki/Rhumb_line
  12474. /**
  12475. * Calculates the distance along a rhumb line between two {@link Point|points} in degrees, radians,
  12476. * miles, or kilometers.
  12477. *
  12478. * @name rhumbDistance
  12479. * @param {Coord} from origin point
  12480. * @param {Coord} to destination point
  12481. * @param {Object} [options] Optional parameters
  12482. * @param {string} [options.units="kilometers"] can be degrees, radians, miles, or kilometers
  12483. * @returns {number} distance between the two points
  12484. * @example
  12485. * var from = turf.point([-75.343, 39.984]);
  12486. * var to = turf.point([-75.534, 39.123]);
  12487. * var options = {units: 'miles'};
  12488. *
  12489. * var distance = turf.rhumbDistance(from, to, options);
  12490. *
  12491. * //addToMap
  12492. * var addToMap = [from, to];
  12493. * from.properties.distance = distance;
  12494. * to.properties.distance = distance;
  12495. */
  12496. function rhumbDistance(from, to, options) {
  12497. // Optional parameters
  12498. options = options || {};
  12499. if (!rhumb_distance_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  12500. var units = options.units;
  12501. // validation
  12502. if (!from) throw new Error('from point is required');
  12503. if (!to) throw new Error('to point is required');
  12504. var origin = getCoord(from);
  12505. var destination = getCoord(to);
  12506. // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html)
  12507. // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678
  12508. destination[0] += (destination[0] - origin[0] > 180) ? -360 : (origin[0] - destination[0] > 180) ? 360 : 0;
  12509. var distanceInMeters = calculateRhumbDistance(origin, destination);
  12510. var distance = rhumb_distance_node_modules_turf_helpers_main_es_convertLength(distanceInMeters, 'meters', units);
  12511. return distance;
  12512. }
  12513. /**
  12514. * Returns the distance travelling from ‘this’ point to destination point along a rhumb line.
  12515. * Adapted from Geodesy: https://github.com/chrisveness/geodesy/blob/master/latlon-spherical.js
  12516. *
  12517. * @private
  12518. * @param {Array<number>} origin point.
  12519. * @param {Array<number>} destination point.
  12520. * @param {number} [radius=6371e3] - (Mean) radius of earth (defaults to radius in metres).
  12521. * @returns {number} Distance in km between this point and destination point (same units as radius).
  12522. *
  12523. * @example
  12524. * var p1 = new LatLon(51.127, 1.338);
  12525. * var p2 = new LatLon(50.964, 1.853);
  12526. * var d = p1.distanceTo(p2); // 40.31 km
  12527. */
  12528. function calculateRhumbDistance(origin, destination, radius) {
  12529. // φ => phi
  12530. // λ => lambda
  12531. // ψ => psi
  12532. // Δ => Delta
  12533. // δ => delta
  12534. // θ => theta
  12535. radius = (radius === undefined) ? rhumb_distance_node_modules_turf_helpers_main_es_earthRadius : Number(radius);
  12536. // see www.edwilliams.org/avform.htm#Rhumb
  12537. var R = radius;
  12538. var phi1 = origin[1] * Math.PI / 180;
  12539. var phi2 = destination[1] * Math.PI / 180;
  12540. var DeltaPhi = phi2 - phi1;
  12541. var DeltaLambda = Math.abs(destination[0] - origin[0]) * Math.PI / 180;
  12542. // if dLon over 180° take shorter rhumb line across the anti-meridian:
  12543. if (DeltaLambda > Math.PI) DeltaLambda -= 2 * Math.PI;
  12544. // on Mercator projection, longitude distances shrink by latitude; q is the 'stretch factor'
  12545. // q becomes ill-conditioned along E-W line (0/0); use empirical tolerance to avoid it
  12546. var DeltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
  12547. var q = Math.abs(DeltaPsi) > 10e-12 ? DeltaPhi / DeltaPsi : Math.cos(phi1);
  12548. // distance is pythagoras on 'stretched' Mercator projection
  12549. var delta = Math.sqrt(DeltaPhi * DeltaPhi + q * q * DeltaLambda * DeltaLambda); // angular distance in radians
  12550. var dist = delta * R;
  12551. return dist;
  12552. }
  12553. /* harmony default export */ var rhumb_distance_main_es = (rhumbDistance);
  12554. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-destination/node_modules/@turf/helpers/main.es.js
  12555. /**
  12556. * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
  12557. */
  12558. var rhumb_destination_node_modules_turf_helpers_main_es_earthRadius = 6371008.8;
  12559. /**
  12560. * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
  12561. */
  12562. var rhumb_destination_node_modules_turf_helpers_main_es_factors = {
  12563. meters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
  12564. metres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
  12565. millimeters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 1000,
  12566. millimetres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 1000,
  12567. centimeters: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 100,
  12568. centimetres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 100,
  12569. kilometers: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1000,
  12570. kilometres: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1000,
  12571. miles: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1609.344,
  12572. nauticalmiles: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1852,
  12573. inches: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 39.370,
  12574. yards: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 1.0936,
  12575. feet: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius * 3.28084,
  12576. radians: 1,
  12577. degrees: rhumb_destination_node_modules_turf_helpers_main_es_earthRadius / 111325,
  12578. };
  12579. /**
  12580. * Units of measurement factors based on 1 meter.
  12581. */
  12582. var rhumb_destination_node_modules_turf_helpers_main_es_unitsFactors = {
  12583. meters: 1,
  12584. metres: 1,
  12585. millimeters: 1000,
  12586. millimetres: 1000,
  12587. centimeters: 100,
  12588. centimetres: 100,
  12589. kilometers: 1 / 1000,
  12590. kilometres: 1 / 1000,
  12591. miles: 1 / 1609.344,
  12592. nauticalmiles: 1 / 1852,
  12593. inches: 39.370,
  12594. yards: 1 / 1.0936,
  12595. feet: 3.28084,
  12596. radians: 1 / rhumb_destination_node_modules_turf_helpers_main_es_earthRadius,
  12597. degrees: 1 / 111325,
  12598. };
  12599. /**
  12600. * Area of measurement factors based on 1 square meter.
  12601. */
  12602. var rhumb_destination_node_modules_turf_helpers_main_es_areaFactors = {
  12603. meters: 1,
  12604. metres: 1,
  12605. millimeters: 1000000,
  12606. millimetres: 1000000,
  12607. centimeters: 10000,
  12608. centimetres: 10000,
  12609. kilometers: 0.000001,
  12610. kilometres: 0.000001,
  12611. acres: 0.000247105,
  12612. miles: 3.86e-7,
  12613. yards: 1.195990046,
  12614. feet: 10.763910417,
  12615. inches: 1550.003100006
  12616. };
  12617. /**
  12618. * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
  12619. *
  12620. * @name feature
  12621. * @param {Geometry} geometry input geometry
  12622. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12623. * @param {Object} [options={}] Optional Parameters
  12624. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12625. * @param {string|number} [options.id] Identifier associated with the Feature
  12626. * @returns {Feature} a GeoJSON Feature
  12627. * @example
  12628. * var geometry = {
  12629. * "type": "Point",
  12630. * "coordinates": [110, 50]
  12631. * };
  12632. *
  12633. * var feature = turf.feature(geometry);
  12634. *
  12635. * //=feature
  12636. */
  12637. function rhumb_destination_node_modules_turf_helpers_main_es_feature(geometry, properties, options) {
  12638. // Optional Parameters
  12639. options = options || {};
  12640. if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  12641. var bbox = options.bbox;
  12642. var id = options.id;
  12643. // Validation
  12644. if (geometry === undefined) throw new Error('geometry is required');
  12645. if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
  12646. if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
  12647. if (id) rhumb_destination_node_modules_turf_helpers_main_es_validateId(id);
  12648. // Main
  12649. var feat = {type: 'Feature'};
  12650. if (id) feat.id = id;
  12651. if (bbox) feat.bbox = bbox;
  12652. feat.properties = properties || {};
  12653. feat.geometry = geometry;
  12654. return feat;
  12655. }
  12656. /**
  12657. * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
  12658. * For GeometryCollection type use `helpers.geometryCollection`
  12659. *
  12660. * @name geometry
  12661. * @param {string} type Geometry Type
  12662. * @param {Array<number>} coordinates Coordinates
  12663. * @param {Object} [options={}] Optional Parameters
  12664. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Geometry
  12665. * @returns {Geometry} a GeoJSON Geometry
  12666. * @example
  12667. * var type = 'Point';
  12668. * var coordinates = [110, 50];
  12669. *
  12670. * var geometry = turf.geometry(type, coordinates);
  12671. *
  12672. * //=geometry
  12673. */
  12674. function rhumb_destination_node_modules_turf_helpers_main_es_geometry(type, coordinates, options) {
  12675. // Optional Parameters
  12676. options = options || {};
  12677. if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  12678. var bbox = options.bbox;
  12679. // Validation
  12680. if (!type) throw new Error('type is required');
  12681. if (!coordinates) throw new Error('coordinates is required');
  12682. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12683. if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
  12684. // Main
  12685. var geom;
  12686. switch (type) {
  12687. case 'Point': geom = rhumb_destination_node_modules_turf_helpers_main_es_point(coordinates).geometry; break;
  12688. case 'LineString': geom = rhumb_destination_node_modules_turf_helpers_main_es_lineString(coordinates).geometry; break;
  12689. case 'Polygon': geom = rhumb_destination_node_modules_turf_helpers_main_es_polygon(coordinates).geometry; break;
  12690. case 'MultiPoint': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiPoint(coordinates).geometry; break;
  12691. case 'MultiLineString': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiLineString(coordinates).geometry; break;
  12692. case 'MultiPolygon': geom = rhumb_destination_node_modules_turf_helpers_main_es_multiPolygon(coordinates).geometry; break;
  12693. default: throw new Error(type + ' is invalid');
  12694. }
  12695. if (bbox) geom.bbox = bbox;
  12696. return geom;
  12697. }
  12698. /**
  12699. * Creates a {@link Point} {@link Feature} from a Position.
  12700. *
  12701. * @name point
  12702. * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
  12703. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12704. * @param {Object} [options={}] Optional Parameters
  12705. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12706. * @param {string|number} [options.id] Identifier associated with the Feature
  12707. * @returns {Feature<Point>} a Point feature
  12708. * @example
  12709. * var point = turf.point([-75.343, 39.984]);
  12710. *
  12711. * //=point
  12712. */
  12713. function rhumb_destination_node_modules_turf_helpers_main_es_point(coordinates, properties, options) {
  12714. if (!coordinates) throw new Error('coordinates is required');
  12715. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12716. if (coordinates.length < 2) throw new Error('coordinates must be at least 2 numbers long');
  12717. if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[1])) throw new Error('coordinates must contain numbers');
  12718. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12719. type: 'Point',
  12720. coordinates: coordinates
  12721. }, properties, options);
  12722. }
  12723. /**
  12724. * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
  12725. *
  12726. * @name points
  12727. * @param {Array<Array<number>>} coordinates an array of Points
  12728. * @param {Object} [properties={}] Translate these properties to each Feature
  12729. * @param {Object} [options={}] Optional Parameters
  12730. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  12731. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  12732. * @returns {FeatureCollection<Point>} Point Feature
  12733. * @example
  12734. * var points = turf.points([
  12735. * [-75, 39],
  12736. * [-80, 45],
  12737. * [-78, 50]
  12738. * ]);
  12739. *
  12740. * //=points
  12741. */
  12742. function rhumb_destination_node_modules_turf_helpers_main_es_points(coordinates, properties, options) {
  12743. if (!coordinates) throw new Error('coordinates is required');
  12744. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12745. return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  12746. return rhumb_destination_node_modules_turf_helpers_main_es_point(coords, properties);
  12747. }), options);
  12748. }
  12749. /**
  12750. * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
  12751. *
  12752. * @name polygon
  12753. * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
  12754. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12755. * @param {Object} [options={}] Optional Parameters
  12756. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12757. * @param {string|number} [options.id] Identifier associated with the Feature
  12758. * @returns {Feature<Polygon>} Polygon Feature
  12759. * @example
  12760. * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
  12761. *
  12762. * //=polygon
  12763. */
  12764. function rhumb_destination_node_modules_turf_helpers_main_es_polygon(coordinates, properties, options) {
  12765. if (!coordinates) throw new Error('coordinates is required');
  12766. for (var i = 0; i < coordinates.length; i++) {
  12767. var ring = coordinates[i];
  12768. if (ring.length < 4) {
  12769. throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
  12770. }
  12771. for (var j = 0; j < ring[ring.length - 1].length; j++) {
  12772. // Check if first point of Polygon contains two numbers
  12773. if (i === 0 && j === 0 && !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(ring[0][0]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(ring[0][1])) throw new Error('coordinates must contain numbers');
  12774. if (ring[ring.length - 1][j] !== ring[0][j]) {
  12775. throw new Error('First and last Position are not equivalent.');
  12776. }
  12777. }
  12778. }
  12779. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12780. type: 'Polygon',
  12781. coordinates: coordinates
  12782. }, properties, options);
  12783. }
  12784. /**
  12785. * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
  12786. *
  12787. * @name polygons
  12788. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
  12789. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12790. * @param {Object} [options={}] Optional Parameters
  12791. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12792. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  12793. * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
  12794. * @example
  12795. * var polygons = turf.polygons([
  12796. * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
  12797. * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
  12798. * ]);
  12799. *
  12800. * //=polygons
  12801. */
  12802. function rhumb_destination_node_modules_turf_helpers_main_es_polygons(coordinates, properties, options) {
  12803. if (!coordinates) throw new Error('coordinates is required');
  12804. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12805. return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  12806. return rhumb_destination_node_modules_turf_helpers_main_es_polygon(coords, properties);
  12807. }), options);
  12808. }
  12809. /**
  12810. * Creates a {@link LineString} {@link Feature} from an Array of Positions.
  12811. *
  12812. * @name lineString
  12813. * @param {Array<Array<number>>} coordinates an array of Positions
  12814. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12815. * @param {Object} [options={}] Optional Parameters
  12816. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12817. * @param {string|number} [options.id] Identifier associated with the Feature
  12818. * @returns {Feature<LineString>} LineString Feature
  12819. * @example
  12820. * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
  12821. * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
  12822. *
  12823. * //=linestring1
  12824. * //=linestring2
  12825. */
  12826. function rhumb_destination_node_modules_turf_helpers_main_es_lineString(coordinates, properties, options) {
  12827. if (!coordinates) throw new Error('coordinates is required');
  12828. if (coordinates.length < 2) throw new Error('coordinates must be an array of two or more positions');
  12829. // Check if first point of LineString contains two numbers
  12830. if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1]) || !rhumb_destination_node_modules_turf_helpers_main_es_isNumber(coordinates[0][1])) throw new Error('coordinates must contain numbers');
  12831. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12832. type: 'LineString',
  12833. coordinates: coordinates
  12834. }, properties, options);
  12835. }
  12836. /**
  12837. * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
  12838. *
  12839. * @name lineStrings
  12840. * @param {Array<Array<number>>} coordinates an array of LinearRings
  12841. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12842. * @param {Object} [options={}] Optional Parameters
  12843. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the FeatureCollection
  12844. * @param {string|number} [options.id] Identifier associated with the FeatureCollection
  12845. * @returns {FeatureCollection<LineString>} LineString FeatureCollection
  12846. * @example
  12847. * var linestrings = turf.lineStrings([
  12848. * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
  12849. * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
  12850. * ]);
  12851. *
  12852. * //=linestrings
  12853. */
  12854. function rhumb_destination_node_modules_turf_helpers_main_es_lineStrings(coordinates, properties, options) {
  12855. if (!coordinates) throw new Error('coordinates is required');
  12856. if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
  12857. return rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(coordinates.map(function (coords) {
  12858. return rhumb_destination_node_modules_turf_helpers_main_es_lineString(coords, properties);
  12859. }), options);
  12860. }
  12861. /**
  12862. * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
  12863. *
  12864. * @name featureCollection
  12865. * @param {Feature[]} features input features
  12866. * @param {Object} [options={}] Optional Parameters
  12867. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12868. * @param {string|number} [options.id] Identifier associated with the Feature
  12869. * @returns {FeatureCollection} FeatureCollection of Features
  12870. * @example
  12871. * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
  12872. * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
  12873. * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
  12874. *
  12875. * var collection = turf.featureCollection([
  12876. * locationA,
  12877. * locationB,
  12878. * locationC
  12879. * ]);
  12880. *
  12881. * //=collection
  12882. */
  12883. function rhumb_destination_node_modules_turf_helpers_main_es_featureCollection(features, options) {
  12884. // Optional Parameters
  12885. options = options || {};
  12886. if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  12887. var bbox = options.bbox;
  12888. var id = options.id;
  12889. // Validation
  12890. if (!features) throw new Error('No features passed');
  12891. if (!Array.isArray(features)) throw new Error('features must be an Array');
  12892. if (bbox) rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox);
  12893. if (id) rhumb_destination_node_modules_turf_helpers_main_es_validateId(id);
  12894. // Main
  12895. var fc = {type: 'FeatureCollection'};
  12896. if (id) fc.id = id;
  12897. if (bbox) fc.bbox = bbox;
  12898. fc.features = features;
  12899. return fc;
  12900. }
  12901. /**
  12902. * Creates a {@link Feature<MultiLineString>} based on a
  12903. * coordinate array. Properties can be added optionally.
  12904. *
  12905. * @name multiLineString
  12906. * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
  12907. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12908. * @param {Object} [options={}] Optional Parameters
  12909. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12910. * @param {string|number} [options.id] Identifier associated with the Feature
  12911. * @returns {Feature<MultiLineString>} a MultiLineString feature
  12912. * @throws {Error} if no coordinates are passed
  12913. * @example
  12914. * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
  12915. *
  12916. * //=multiLine
  12917. */
  12918. function rhumb_destination_node_modules_turf_helpers_main_es_multiLineString(coordinates, properties, options) {
  12919. if (!coordinates) throw new Error('coordinates is required');
  12920. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12921. type: 'MultiLineString',
  12922. coordinates: coordinates
  12923. }, properties, options);
  12924. }
  12925. /**
  12926. * Creates a {@link Feature<MultiPoint>} based on a
  12927. * coordinate array. Properties can be added optionally.
  12928. *
  12929. * @name multiPoint
  12930. * @param {Array<Array<number>>} coordinates an array of Positions
  12931. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12932. * @param {Object} [options={}] Optional Parameters
  12933. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12934. * @param {string|number} [options.id] Identifier associated with the Feature
  12935. * @returns {Feature<MultiPoint>} a MultiPoint feature
  12936. * @throws {Error} if no coordinates are passed
  12937. * @example
  12938. * var multiPt = turf.multiPoint([[0,0],[10,10]]);
  12939. *
  12940. * //=multiPt
  12941. */
  12942. function rhumb_destination_node_modules_turf_helpers_main_es_multiPoint(coordinates, properties, options) {
  12943. if (!coordinates) throw new Error('coordinates is required');
  12944. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12945. type: 'MultiPoint',
  12946. coordinates: coordinates
  12947. }, properties, options);
  12948. }
  12949. /**
  12950. * Creates a {@link Feature<MultiPolygon>} based on a
  12951. * coordinate array. Properties can be added optionally.
  12952. *
  12953. * @name multiPolygon
  12954. * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
  12955. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12956. * @param {Object} [options={}] Optional Parameters
  12957. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12958. * @param {string|number} [options.id] Identifier associated with the Feature
  12959. * @returns {Feature<MultiPolygon>} a multipolygon feature
  12960. * @throws {Error} if no coordinates are passed
  12961. * @example
  12962. * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
  12963. *
  12964. * //=multiPoly
  12965. *
  12966. */
  12967. function rhumb_destination_node_modules_turf_helpers_main_es_multiPolygon(coordinates, properties, options) {
  12968. if (!coordinates) throw new Error('coordinates is required');
  12969. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  12970. type: 'MultiPolygon',
  12971. coordinates: coordinates
  12972. }, properties, options);
  12973. }
  12974. /**
  12975. * Creates a {@link Feature<GeometryCollection>} based on a
  12976. * coordinate array. Properties can be added optionally.
  12977. *
  12978. * @name geometryCollection
  12979. * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
  12980. * @param {Object} [properties={}] an Object of key-value pairs to add as properties
  12981. * @param {Object} [options={}] Optional Parameters
  12982. * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
  12983. * @param {string|number} [options.id] Identifier associated with the Feature
  12984. * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
  12985. * @example
  12986. * var pt = {
  12987. * "type": "Point",
  12988. * "coordinates": [100, 0]
  12989. * };
  12990. * var line = {
  12991. * "type": "LineString",
  12992. * "coordinates": [ [101, 0], [102, 1] ]
  12993. * };
  12994. * var collection = turf.geometryCollection([pt, line]);
  12995. *
  12996. * //=collection
  12997. */
  12998. function rhumb_destination_node_modules_turf_helpers_main_es_geometryCollection(geometries, properties, options) {
  12999. if (!geometries) throw new Error('geometries is required');
  13000. if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
  13001. return rhumb_destination_node_modules_turf_helpers_main_es_feature({
  13002. type: 'GeometryCollection',
  13003. geometries: geometries
  13004. }, properties, options);
  13005. }
  13006. /**
  13007. * Round number to precision
  13008. *
  13009. * @param {number} num Number
  13010. * @param {number} [precision=0] Precision
  13011. * @returns {number} rounded number
  13012. * @example
  13013. * turf.round(120.4321)
  13014. * //=120
  13015. *
  13016. * turf.round(120.4321, 2)
  13017. * //=120.43
  13018. */
  13019. function rhumb_destination_node_modules_turf_helpers_main_es_round(num, precision) {
  13020. if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
  13021. if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
  13022. var multiplier = Math.pow(10, precision || 0);
  13023. return Math.round(num * multiplier) / multiplier;
  13024. }
  13025. /**
  13026. * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
  13027. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  13028. *
  13029. * @name radiansToLength
  13030. * @param {number} radians in radians across the sphere
  13031. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  13032. * @returns {number} distance
  13033. */
  13034. function rhumb_destination_node_modules_turf_helpers_main_es_radiansToLength(radians, units) {
  13035. if (radians === undefined || radians === null) throw new Error('radians is required');
  13036. if (units && typeof units !== 'string') throw new Error('units must be a string');
  13037. var factor = rhumb_destination_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  13038. if (!factor) throw new Error(units + ' units is invalid');
  13039. return radians * factor;
  13040. }
  13041. /**
  13042. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
  13043. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  13044. *
  13045. * @name lengthToRadians
  13046. * @param {number} distance in real units
  13047. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  13048. * @returns {number} radians
  13049. */
  13050. function rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(distance, units) {
  13051. if (distance === undefined || distance === null) throw new Error('distance is required');
  13052. if (units && typeof units !== 'string') throw new Error('units must be a string');
  13053. var factor = rhumb_destination_node_modules_turf_helpers_main_es_factors[units || 'kilometers'];
  13054. if (!factor) throw new Error(units + ' units is invalid');
  13055. return distance / factor;
  13056. }
  13057. /**
  13058. * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
  13059. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
  13060. *
  13061. * @name lengthToDegrees
  13062. * @param {number} distance in real units
  13063. * @param {string} [units='kilometers'] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
  13064. * @returns {number} degrees
  13065. */
  13066. function rhumb_destination_node_modules_turf_helpers_main_es_lengthToDegrees(distance, units) {
  13067. return rhumb_destination_node_modules_turf_helpers_main_es_radiansToDegrees(rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(distance, units));
  13068. }
  13069. /**
  13070. * Converts any bearing angle from the north line direction (positive clockwise)
  13071. * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
  13072. *
  13073. * @name bearingToAzimuth
  13074. * @param {number} bearing angle, between -180 and +180 degrees
  13075. * @returns {number} angle between 0 and 360 degrees
  13076. */
  13077. function rhumb_destination_node_modules_turf_helpers_main_es_bearingToAzimuth(bearing) {
  13078. if (bearing === null || bearing === undefined) throw new Error('bearing is required');
  13079. var angle = bearing % 360;
  13080. if (angle < 0) angle += 360;
  13081. return angle;
  13082. }
  13083. /**
  13084. * Converts an angle in radians to degrees
  13085. *
  13086. * @name radiansToDegrees
  13087. * @param {number} radians angle in radians
  13088. * @returns {number} degrees between 0 and 360 degrees
  13089. */
  13090. function rhumb_destination_node_modules_turf_helpers_main_es_radiansToDegrees(radians) {
  13091. if (radians === null || radians === undefined) throw new Error('radians is required');
  13092. var degrees = radians % (2 * Math.PI);
  13093. return degrees * 180 / Math.PI;
  13094. }
  13095. /**
  13096. * Converts an angle in degrees to radians
  13097. *
  13098. * @name degreesToRadians
  13099. * @param {number} degrees angle between 0 and 360 degrees
  13100. * @returns {number} angle in radians
  13101. */
  13102. function rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(degrees) {
  13103. if (degrees === null || degrees === undefined) throw new Error('degrees is required');
  13104. var radians = degrees % 360;
  13105. return radians * Math.PI / 180;
  13106. }
  13107. /**
  13108. * Converts a length to the requested unit.
  13109. * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
  13110. *
  13111. * @param {number} length to be converted
  13112. * @param {string} originalUnit of the length
  13113. * @param {string} [finalUnit='kilometers'] returned unit
  13114. * @returns {number} the converted length
  13115. */
  13116. function rhumb_destination_node_modules_turf_helpers_main_es_convertLength(length, originalUnit, finalUnit) {
  13117. if (length === null || length === undefined) throw new Error('length is required');
  13118. if (!(length >= 0)) throw new Error('length must be a positive number');
  13119. return rhumb_destination_node_modules_turf_helpers_main_es_radiansToLength(rhumb_destination_node_modules_turf_helpers_main_es_lengthToRadians(length, originalUnit), finalUnit || 'kilometers');
  13120. }
  13121. /**
  13122. * Converts a area to the requested unit.
  13123. * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
  13124. * @param {number} area to be converted
  13125. * @param {string} [originalUnit='meters'] of the distance
  13126. * @param {string} [finalUnit='kilometers'] returned unit
  13127. * @returns {number} the converted distance
  13128. */
  13129. function rhumb_destination_node_modules_turf_helpers_main_es_convertArea(area, originalUnit, finalUnit) {
  13130. if (area === null || area === undefined) throw new Error('area is required');
  13131. if (!(area >= 0)) throw new Error('area must be a positive number');
  13132. var startFactor = rhumb_destination_node_modules_turf_helpers_main_es_areaFactors[originalUnit || 'meters'];
  13133. if (!startFactor) throw new Error('invalid original units');
  13134. var finalFactor = rhumb_destination_node_modules_turf_helpers_main_es_areaFactors[finalUnit || 'kilometers'];
  13135. if (!finalFactor) throw new Error('invalid final units');
  13136. return (area / startFactor) * finalFactor;
  13137. }
  13138. /**
  13139. * isNumber
  13140. *
  13141. * @param {*} num Number to validate
  13142. * @returns {boolean} true/false
  13143. * @example
  13144. * turf.isNumber(123)
  13145. * //=true
  13146. * turf.isNumber('foo')
  13147. * //=false
  13148. */
  13149. function rhumb_destination_node_modules_turf_helpers_main_es_isNumber(num) {
  13150. return !isNaN(num) && num !== null && !Array.isArray(num);
  13151. }
  13152. /**
  13153. * isObject
  13154. *
  13155. * @param {*} input variable to validate
  13156. * @returns {boolean} true/false
  13157. * @example
  13158. * turf.isObject({elevation: 10})
  13159. * //=true
  13160. * turf.isObject('foo')
  13161. * //=false
  13162. */
  13163. function rhumb_destination_node_modules_turf_helpers_main_es_isObject(input) {
  13164. return (!!input) && (input.constructor === Object);
  13165. }
  13166. /**
  13167. * Validate BBox
  13168. *
  13169. * @private
  13170. * @param {Array<number>} bbox BBox to validate
  13171. * @returns {void}
  13172. * @throws Error if BBox is not valid
  13173. * @example
  13174. * validateBBox([-180, -40, 110, 50])
  13175. * //=OK
  13176. * validateBBox([-180, -40])
  13177. * //=Error
  13178. * validateBBox('Foo')
  13179. * //=Error
  13180. * validateBBox(5)
  13181. * //=Error
  13182. * validateBBox(null)
  13183. * //=Error
  13184. * validateBBox(undefined)
  13185. * //=Error
  13186. */
  13187. function rhumb_destination_node_modules_turf_helpers_main_es_validateBBox(bbox) {
  13188. if (!bbox) throw new Error('bbox is required');
  13189. if (!Array.isArray(bbox)) throw new Error('bbox must be an Array');
  13190. if (bbox.length !== 4 && bbox.length !== 6) throw new Error('bbox must be an Array of 4 or 6 numbers');
  13191. bbox.forEach(function (num) {
  13192. if (!rhumb_destination_node_modules_turf_helpers_main_es_isNumber(num)) throw new Error('bbox must only contain numbers');
  13193. });
  13194. }
  13195. /**
  13196. * Validate Id
  13197. *
  13198. * @private
  13199. * @param {string|number} id Id to validate
  13200. * @returns {void}
  13201. * @throws Error if Id is not valid
  13202. * @example
  13203. * validateId([-180, -40, 110, 50])
  13204. * //=Error
  13205. * validateId([-180, -40])
  13206. * //=Error
  13207. * validateId('Foo')
  13208. * //=OK
  13209. * validateId(5)
  13210. * //=OK
  13211. * validateId(null)
  13212. * //=Error
  13213. * validateId(undefined)
  13214. * //=Error
  13215. */
  13216. function rhumb_destination_node_modules_turf_helpers_main_es_validateId(id) {
  13217. if (!id) throw new Error('id is required');
  13218. if (['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
  13219. }
  13220. // Deprecated methods
  13221. function rhumb_destination_node_modules_turf_helpers_main_es_radians2degrees() {
  13222. throw new Error('method has been renamed to `radiansToDegrees`');
  13223. }
  13224. function rhumb_destination_node_modules_turf_helpers_main_es_degrees2radians() {
  13225. throw new Error('method has been renamed to `degreesToRadians`');
  13226. }
  13227. function rhumb_destination_node_modules_turf_helpers_main_es_distanceToDegrees() {
  13228. throw new Error('method has been renamed to `lengthToDegrees`');
  13229. }
  13230. function rhumb_destination_node_modules_turf_helpers_main_es_distanceToRadians() {
  13231. throw new Error('method has been renamed to `lengthToRadians`');
  13232. }
  13233. function rhumb_destination_node_modules_turf_helpers_main_es_radiansToDistance() {
  13234. throw new Error('method has been renamed to `radiansToLength`');
  13235. }
  13236. function rhumb_destination_node_modules_turf_helpers_main_es_bearingToAngle() {
  13237. throw new Error('method has been renamed to `bearingToAzimuth`');
  13238. }
  13239. function rhumb_destination_node_modules_turf_helpers_main_es_convertDistance() {
  13240. throw new Error('method has been renamed to `convertLength`');
  13241. }
  13242. ;// CONCATENATED MODULE: ./node_modules/@turf/rhumb-destination/main.es.js
  13243. // https://en.wikipedia.org/wiki/Rhumb_line
  13244. /**
  13245. * Returns the destination {@link Point} having travelled the given distance along a Rhumb line from the
  13246. * origin Point with the (varant) given bearing.
  13247. *
  13248. * @name rhumbDestination
  13249. * @param {Coord} origin starting point
  13250. * @param {number} distance distance from the starting point
  13251. * @param {number} bearing varant bearing angle ranging from -180 to 180 degrees from north
  13252. * @param {Object} [options={}] Optional parameters
  13253. * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers
  13254. * @param {Object} [options.properties={}] translate properties to destination point
  13255. * @returns {Feature<Point>} Destination point.
  13256. * @example
  13257. * var pt = turf.point([-75.343, 39.984], {"marker-color": "F00"});
  13258. * var distance = 50;
  13259. * var bearing = 90;
  13260. * var options = {units: 'miles'};
  13261. *
  13262. * var destination = turf.rhumbDestination(pt, distance, bearing, options);
  13263. *
  13264. * //addToMap
  13265. * var addToMap = [pt, destination]
  13266. * destination.properties['marker-color'] = '#00F';
  13267. */
  13268. function rhumbDestination(origin, distance, bearing, options) {
  13269. // Optional parameters
  13270. options = options || {};
  13271. if (!rhumb_destination_node_modules_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  13272. var units = options.units;
  13273. var properties = options.properties;
  13274. // validation
  13275. if (!origin) throw new Error('origin is required');
  13276. if (distance === undefined || distance === null) throw new Error('distance is required');
  13277. if (bearing === undefined || bearing === null) throw new Error('bearing is required');
  13278. if (!(distance >= 0)) throw new Error('distance must be greater than 0');
  13279. var distanceInMeters = rhumb_destination_node_modules_turf_helpers_main_es_convertLength(distance, units, 'meters');
  13280. var coords = getCoord(origin);
  13281. var destination = calculateRhumbDestination(coords, distanceInMeters, bearing);
  13282. // compensate the crossing of the 180th meridian (https://macwright.org/2016/09/26/the-180th-meridian.html)
  13283. // solution from https://github.com/mapbox/mapbox-gl-js/issues/3250#issuecomment-294887678
  13284. destination[0] += (destination[0] - coords[0] > 180) ? -360 : (coords[0] - destination[0] > 180) ? 360 : 0;
  13285. return rhumb_destination_node_modules_turf_helpers_main_es_point(destination, properties);
  13286. }
  13287. /**
  13288. * Returns the destination point having travelled along a rhumb line from origin point the given
  13289. * distance on the given bearing.
  13290. * Adapted from Geodesy: http://www.movable-type.co.uk/scripts/latlong.html#rhumblines
  13291. *
  13292. * @private
  13293. * @param {Array<number>} origin - point
  13294. * @param {number} distance - Distance travelled, in same units as earth radius (default: metres).
  13295. * @param {number} bearing - Bearing in degrees from north.
  13296. * @param {number} [radius=6371e3] - (Mean) radius of earth (defaults to radius in metres).
  13297. * @returns {Array<number>} Destination point.
  13298. */
  13299. function calculateRhumbDestination(origin, distance, bearing, radius) {
  13300. // φ => phi
  13301. // λ => lambda
  13302. // ψ => psi
  13303. // Δ => Delta
  13304. // δ => delta
  13305. // θ => theta
  13306. radius = (radius === undefined) ? rhumb_destination_node_modules_turf_helpers_main_es_earthRadius : Number(radius);
  13307. var delta = distance / radius; // angular distance in radians
  13308. var lambda1 = origin[0] * Math.PI / 180; // to radians, but without normalize to 𝜋
  13309. var phi1 = rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(origin[1]);
  13310. var theta = rhumb_destination_node_modules_turf_helpers_main_es_degreesToRadians(bearing);
  13311. var DeltaPhi = delta * Math.cos(theta);
  13312. var phi2 = phi1 + DeltaPhi;
  13313. // check for some daft bugger going past the pole, normalise latitude if so
  13314. if (Math.abs(phi2) > Math.PI / 2) phi2 = phi2 > 0 ? Math.PI - phi2 : -Math.PI - phi2;
  13315. var DeltaPsi = Math.log(Math.tan(phi2 / 2 + Math.PI / 4) / Math.tan(phi1 / 2 + Math.PI / 4));
  13316. var q = Math.abs(DeltaPsi) > 10e-12 ? DeltaPhi / DeltaPsi : Math.cos(phi1); // E-W course becomes ill-conditioned with 0/0
  13317. var DeltaLambda = delta * Math.sin(theta) / q;
  13318. var lambda2 = lambda1 + DeltaLambda;
  13319. return [((lambda2 * 180 / Math.PI) + 540) % 360 - 180, phi2 * 180 / Math.PI]; // normalise to −180..+180°
  13320. }
  13321. /* harmony default export */ var rhumb_destination_main_es = (rhumbDestination);
  13322. ;// CONCATENATED MODULE: ./node_modules/@turf/transform-scale/main.es.js
  13323. /**
  13324. * Scale a GeoJSON from a given point by a factor of scaling (ex: factor=2 would make the GeoJSON 200% larger).
  13325. * If a FeatureCollection is provided, the origin point will be calculated based on each individual Feature.
  13326. *
  13327. * @name transformScale
  13328. * @param {GeoJSON} geojson GeoJSON to be scaled
  13329. * @param {number} factor of scaling, positive or negative values greater than 0
  13330. * @param {Object} [options={}] Optional parameters
  13331. * @param {string|Coord} [options.origin='centroid'] Point from which the scaling will occur (string options: sw/se/nw/ne/center/centroid)
  13332. * @param {boolean} [options.mutate=false] allows GeoJSON input to be mutated (significant performance increase if true)
  13333. * @returns {GeoJSON} scaled GeoJSON
  13334. * @example
  13335. * var poly = turf.polygon([[[0,29],[3.5,29],[2.5,32],[0,29]]]);
  13336. * var scaledPoly = turf.transformScale(poly, 3);
  13337. *
  13338. * //addToMap
  13339. * var addToMap = [poly, scaledPoly];
  13340. * scaledPoly.properties = {stroke: '#F00', 'stroke-width': 4};
  13341. */
  13342. function transformScale(geojson, factor, options) {
  13343. // Optional parameters
  13344. options = options || {};
  13345. if (!_turf_helpers_main_es_isObject(options)) throw new Error('options is invalid');
  13346. var origin = options.origin;
  13347. var mutate = options.mutate;
  13348. // Input validation
  13349. if (!geojson) throw new Error('geojson required');
  13350. if (typeof factor !== 'number' || factor === 0) throw new Error('invalid factor');
  13351. var originIsPoint = Array.isArray(origin) || typeof origin === 'object';
  13352. // Clone geojson to avoid side effects
  13353. if (mutate !== true) geojson = main_es(geojson);
  13354. // Scale each Feature separately
  13355. if (geojson.type === 'FeatureCollection' && !originIsPoint) {
  13356. meta_main_es_featureEach(geojson, function (feature, index) {
  13357. geojson.features[index] = scale(feature, factor, origin);
  13358. });
  13359. return geojson;
  13360. }
  13361. // Scale Feature/Geometry
  13362. return scale(geojson, factor, origin);
  13363. }
  13364. /**
  13365. * Scale Feature/Geometry
  13366. *
  13367. * @private
  13368. * @param {Feature|Geometry} feature GeoJSON Feature/Geometry
  13369. * @param {number} factor of scaling, positive or negative values greater than 0
  13370. * @param {string|Coord} [origin="centroid"] Point from which the scaling will occur (string options: sw/se/nw/ne/center/centroid)
  13371. * @returns {Feature|Geometry} scaled GeoJSON Feature/Geometry
  13372. */
  13373. function scale(feature, factor, origin) {
  13374. // Default params
  13375. var isPoint = getType(feature) === 'Point';
  13376. origin = defineOrigin(feature, origin);
  13377. // Shortcut no-scaling
  13378. if (factor === 1 || isPoint) return feature;
  13379. // Scale each coordinate
  13380. meta_main_es_coordEach(feature, function (coord) {
  13381. var originalDistance = rhumb_distance_main_es(origin, coord);
  13382. var bearing = rhumb_bearing_main_es(origin, coord);
  13383. var newDistance = originalDistance * factor;
  13384. var newCoord = getCoords(rhumb_destination_main_es(origin, newDistance, bearing));
  13385. coord[0] = newCoord[0];
  13386. coord[1] = newCoord[1];
  13387. if (coord.length === 3) coord[2] *= factor;
  13388. });
  13389. return feature;
  13390. }
  13391. /**
  13392. * Define Origin
  13393. *
  13394. * @private
  13395. * @param {GeoJSON} geojson GeoJSON
  13396. * @param {string|Coord} origin sw/se/nw/ne/center/centroid
  13397. * @returns {Feature<Point>} Point origin
  13398. */
  13399. function defineOrigin(geojson, origin) {
  13400. // Default params
  13401. if (origin === undefined || origin === null) origin = 'centroid';
  13402. // Input Coord
  13403. if (Array.isArray(origin) || typeof origin === 'object') return getCoord(origin);
  13404. // Define BBox
  13405. var bbox = (geojson.bbox) ? geojson.bbox : _turf_bbox_main_es(geojson);
  13406. var west = bbox[0];
  13407. var south = bbox[1];
  13408. var east = bbox[2];
  13409. var north = bbox[3];
  13410. switch (origin) {
  13411. case 'sw':
  13412. case 'southwest':
  13413. case 'westsouth':
  13414. case 'bottomleft':
  13415. return _turf_helpers_main_es_point([west, south]);
  13416. case 'se':
  13417. case 'southeast':
  13418. case 'eastsouth':
  13419. case 'bottomright':
  13420. return _turf_helpers_main_es_point([east, south]);
  13421. case 'nw':
  13422. case 'northwest':
  13423. case 'westnorth':
  13424. case 'topleft':
  13425. return _turf_helpers_main_es_point([west, north]);
  13426. case 'ne':
  13427. case 'northeast':
  13428. case 'eastnorth':
  13429. case 'topright':
  13430. return _turf_helpers_main_es_point([east, north]);
  13431. case 'center':
  13432. return center_main_es(geojson);
  13433. case undefined:
  13434. case null:
  13435. case 'centroid':
  13436. return centroid_main_es(geojson);
  13437. default:
  13438. throw new Error('invalid origin');
  13439. }
  13440. }
  13441. /* harmony default export */ var transform_scale_main_es = (transformScale);
  13442. /***/ }),
  13443. /***/ 9458:
  13444. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  13445. "use strict";
  13446. var _interopRequireDefault=(__webpack_require__(4836)["default"]);var _slicedToArray2=_interopRequireDefault(__webpack_require__(885));/*jshint esversion: 6 */function colorcolor(color){var newColor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"rgba";var calculateOpacity=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;color=color.toLowerCase();newColor=newColor.toLowerCase();var returnedColor=color;var namedColor=__webpack_require__(8874);var r,g,b,a;var roundTo=4;var colorDefinitions={rgb:{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],10),parseInt(bits[2],10),parseInt(bits[3],10),1];}},rgba:{re:/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d+(?:\.\d+)?|\.\d+)\s*\)/,example:["rgba(123, 234, 45, 1)","rgba(255,234,245, 0.5)"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],10),parseInt(bits[2],10),parseInt(bits[3],10),parseFloat(bits[4])];}},hex:{re:/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:["00ff00","336699"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16),1];}},hex3:{re:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:["fb0","f0f"],toRGBA:function toRGBA(bits){return[parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16),1];}},hexa:{re:/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,example:["00ff00ff","336699a0"],toRGBA:function toRGBA(bits){return[parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16),parseInt(bits[4],16)/255];}},hex4a:{re:/^#([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,example:["fb0f","f0f8"],toRGBA:function toRGBA(bits){return[parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16),parseInt(bits[4]+bits[4],16)/255];}},hsl:{re:/^hsl\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsl(120, 100%, 25%)","hsl(0, 100%, 50%)"],toRGBA:function toRGBA(bits){bits[4]=1;var rgba=hslToRgb(bits);return[rgba.r,rgba.g,rgba.b,rgba.a];}},hsla:{re:/^hsla\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%,\s*(\d+(?:\.\d+)?|\.\d+)\s*\)/,example:["hsla(120, 100%, 25%, 1)","hsla(0, 100%, 50%, 0.5)"],toRGBA:function toRGBA(bits){var rgba=hslToRgb(bits);return[rgba.r,rgba.g,rgba.b,rgba.a];}},hsv:{re:/^hsv\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsv(120, 100%, 25%)","hsv(0, 100%, 50%)"],toRGBA:function toRGBA(bits){var rgb=hsvToRgb(bits);return[rgb.r,rgb.g,rgb.b,1];}},hsb:{re:/^hsb\((\d{1,3}),\s*(\d{1,3})%,\s*(\d{1,3})%\)$/,example:["hsb(120, 100%, 25%)","hsb(0, 100%, 50%)"],toRGBA:function toRGBA(bits){var rgb=hsvToRgb(bits);return[rgb.r,rgb.g,rgb.b,1];}}};// If this is a named color, convert it to hex
  13447. if(namedColor.hasOwnProperty(color)){color=namedColor[color];color.forEach(function(piece,index){"use strict";color[index]=("0"+piece.toString(16)).slice(-2);});color="#"+color.join('');}// Search the color definitions for a match
  13448. for(var colorDefinition in colorDefinitions){var re=colorDefinitions[colorDefinition].re;var processor=colorDefinitions[colorDefinition].toRGBA;var bits=re.exec(color);if(bits){var channels=processor(bits);r=channels[0];g=channels[1];b=channels[2];a=+(Math.round(channels[3]+("e+"+roundTo))+("e-"+roundTo));}}r=Math.round(r<0||isNaN(r)?0:r>255?255:r);g=Math.round(g<0||isNaN(g)?0:g>255?255:g);b=Math.round(b<0||isNaN(b)?0:b>255?255:b);a=a<0||isNaN(a)?0:a>1?1:a;switch(newColor){case"hex":returnedColor="#"+("0"+r.toString(16)).slice(-2)+("0"+g.toString(16)).slice(-2)+("0"+b.toString(16)).slice(-2);break;case"hexa":if(calculateOpacity){var _calculateOpacityFrom=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom2=(0,_slicedToArray2.default)(_calculateOpacityFrom,4);r=_calculateOpacityFrom2[0];g=_calculateOpacityFrom2[1];b=_calculateOpacityFrom2[2];a=_calculateOpacityFrom2[3];}returnedColor="#"+("0"+r.toString(16)).slice(-2)+("0"+g.toString(16)).slice(-2)+("0"+b.toString(16)).slice(-2)+("0"+Math.round(255*a).toString(16)).slice(-2);break;case"hsl":var hsl=rgbToHsl({"r":r,"g":g,"b":b});returnedColor="hsl(".concat(hsl.h,",").concat(hsl.s,"%,").concat(hsl.l,"%)");break;case"hsla":if(calculateOpacity){var _calculateOpacityFrom3=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom4=(0,_slicedToArray2.default)(_calculateOpacityFrom3,4);r=_calculateOpacityFrom4[0];g=_calculateOpacityFrom4[1];b=_calculateOpacityFrom4[2];a=_calculateOpacityFrom4[3];}var hsla=rgbToHsl({"r":r,"g":g,"b":b,"a":a});returnedColor="hsla(".concat(hsla.h,",").concat(hsla.s,"%,").concat(hsla.l,"%,").concat(hsla.a,")");break;case"hsb":/* Same as `hsv` */var hsb=rgbToHsv({"r":r,"g":g,"b":b});returnedColor="hsb(".concat(hsb.h,",").concat(hsb.s,"%,").concat(hsb.v,"%)");break;case"hsv":var hsv=rgbToHsv({"r":r,"g":g,"b":b});returnedColor="hsv(".concat(hsv.h,",").concat(hsv.s,"%,").concat(hsv.v,"%)");break;case"rgb":returnedColor="rgb(".concat(r,",").concat(g,",").concat(b,")");break;case"rgba":/* falls through */default:if(calculateOpacity){var _calculateOpacityFrom5=calculateOpacityFromWhite(r,g,b,a);var _calculateOpacityFrom6=(0,_slicedToArray2.default)(_calculateOpacityFrom5,4);r=_calculateOpacityFrom6[0];g=_calculateOpacityFrom6[1];b=_calculateOpacityFrom6[2];a=_calculateOpacityFrom6[3];}returnedColor="rgba(".concat(r,",").concat(g,",").concat(b,",").concat(a,")");break;}return returnedColor;}function calculateOpacityFromWhite(r,g,b,a){"use strict";var min=0;a=(255-(min=Math.min(r,g,b)))/255;r=( false||(r-min)/a).toFixed(0);g=( false||(g-min)/a).toFixed(0);b=( false||(b-min)/a).toFixed(0);a=parseFloat(a.toFixed(4));return[r,g,b,a];}function hslToRgb(bits){var rgba={},hsl={h:bits[1]/360,s:bits[2]/100,l:bits[3]/100,a:parseFloat(bits[4])};if(hsl.s===0){var v=255*hsl.l;rgba={r:v,g:v,b:v,a:hsl.a};}else{var q=hsl.l<0.5?hsl.l*(1+hsl.s):hsl.l+hsl.s-hsl.l*hsl.s;var p=2*hsl.l-q;rgba.r=hueToRgb(p,q,hsl.h+1/3)*255;rgba.g=hueToRgb(p,q,hsl.h)*255;rgba.b=hueToRgb(p,q,hsl.h-1/3)*255;rgba.a=hsl.a;}return rgba;}function rgbToHsl(rgba){rgba.r=rgba.r/255;rgba.g=rgba.g/255;rgba.b=rgba.b/255;var max=Math.max(rgba.r,rgba.g,rgba.b),min=Math.min(rgba.r,rgba.g,rgba.b),hsl=[],d;hsl.a=rgba.a;hsl.l=(max+min)/2;if(max===min){hsl.h=0;hsl.s=0;}else{d=max-min;hsl.s=hsl.l>=0.5?d/(2-max-min):d/(max+min);switch(max){case rgba.r:hsl.h=(rgba.g-rgba.b)/d+(rgba.g<rgba.b?6:0);break;case rgba.g:hsl.h=(rgba.b-rgba.r)/d+2;break;case rgba.b:hsl.h=(rgba.r-rgba.g)/d+4;break;}hsl.h/=6;}hsl.h=parseInt((hsl.h*360).toFixed(0),10);hsl.s=parseInt((hsl.s*100).toFixed(0),10);hsl.l=parseInt((hsl.l*100).toFixed(0),10);return hsl;}function hsvToRgb(bits){var rgb={},hsv={h:bits[1]/360,s:bits[2]/100,v:bits[3]/100},i=Math.floor(hsv.h*6),f=hsv.h*6-i,p=hsv.v*(1-hsv.s),q=hsv.v*(1-f*hsv.s),t=hsv.v*(1-(1-f)*hsv.s);switch(i%6){case 0:rgb.r=hsv.v;rgb.g=t;rgb.b=p;break;case 1:rgb.r=q;rgb.g=hsv.v;rgb.b=p;break;case 2:rgb.r=p;rgb.g=hsv.v;rgb.b=t;break;case 3:rgb.r=p;rgb.g=q;rgb.b=hsv.v;break;case 4:rgb.r=t;rgb.g=p;rgb.b=hsv.v;break;case 5:rgb.r=hsv.v;rgb.g=p;rgb.b=q;break;}rgb.r=rgb.r*255;rgb.g=rgb.g*255;rgb.b=rgb.b*255;return rgb;}function rgbToHsv(rgba){rgba.r=toPercent(parseInt(rgba.r,10)%256,256);rgba.g=toPercent(parseInt(rgba.g,10)%256,256);rgba.b=toPercent(parseInt(rgba.b,10)%256,256);var max=Math.max(rgba.r,rgba.g,rgba.b),min=Math.min(rgba.r,rgba.g,rgba.b),d=max-min,hsv={"h":0,"s":max===0?0:d/max,"v":max};if(max!==min){switch(max){case rgba.r:hsv.h=(rgba.g-rgba.b)/d+(rgba.g<rgba.b?6:0);break;case rgba.g:hsv.h=(rgba.b-rgba.r)/d+2;break;case rgba.b:hsv.h=(rgba.r-rgba.g)/d+4;break;}hsv.h/=6;}hsv.h=parseInt((hsv.h*360).toFixed(0),10);hsv.s=parseInt((hsv.s*100).toFixed(0),10);hsv.v=parseInt((hsv.v*100).toFixed(0),10);return hsv;}function hueToRgb(p,q,t){if(t<0){t+=1;}if(t>1){t-=1;}if(t<1/6){return p+(q-p)*6*t;}if(t<1/2){return q;}if(t<2/3){return p+(q-p)*((2/3-t)*6);}return p;}function toPercent(amount,limit){return amount/limit;}module.exports=colorcolor;__webpack_require__.g.colorcolor=module.exports;/* ew */
  13449. /***/ }),
  13450. /***/ 1892:
  13451. /***/ (function(__unused_webpack_module, exports) {
  13452. "use strict";
  13453. Object.defineProperty(exports, "__esModule", ({value:true}));exports.addListener=addListener;exports.removeListener=removeListener;var raf=null;function requestAnimationFrame(callback){if(!raf){raf=(window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(callback){return setTimeout(callback,16);}).bind(window);}return raf(callback);}var caf=null;function cancelAnimationFrame(id){if(!caf){caf=(window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(id){clearTimeout(id);}).bind(window);}caf(id);}function createStyles(styleText){var style=document.createElement('style');style.type='text/css';if(style.styleSheet){style.styleSheet.cssText=styleText;}else{style.appendChild(document.createTextNode(styleText));}(document.querySelector('head')||document.body).appendChild(style);return style;}function createElement(tagName){var props=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var elem=document.createElement(tagName);Object.keys(props).forEach(function(key){elem[key]=props[key];});return elem;}function getComputedStyle(elem,prop,pseudo){// for older versions of Firefox, `getComputedStyle` required
  13454. // the second argument and may return `null` for some elements
  13455. // when `display: none`
  13456. var computedStyle=window.getComputedStyle(elem,pseudo||null)||{display:'none'};return computedStyle[prop];}function getRenderInfo(elem){if(!document.documentElement.contains(elem)){return{detached:true,rendered:false};}var current=elem;while(current!==document){if(getComputedStyle(current,'display')==='none'){return{detached:false,rendered:false};}current=current.parentNode;}return{detached:false,rendered:true};}var css=".resize-triggers{visibility:hidden;opacity:0;pointer-events:none}.resize-contract-trigger,.resize-contract-trigger:before,.resize-expand-trigger,.resize-triggers{content:\"\";position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden}.resize-contract-trigger,.resize-expand-trigger{background:#eee;overflow:auto}.resize-contract-trigger:before{width:200%;height:200%}";var total=0;var style=null;function addListener(elem,callback){if(!elem.__resize_mutation_handler__){elem.__resize_mutation_handler__=handleMutation.bind(elem);}var listeners=elem.__resize_listeners__;if(!listeners){elem.__resize_listeners__=[];if(window.ResizeObserver){var offsetWidth=elem.offsetWidth,offsetHeight=elem.offsetHeight;var ro=new ResizeObserver(function(){if(!elem.__resize_observer_triggered__){elem.__resize_observer_triggered__=true;if(elem.offsetWidth===offsetWidth&&elem.offsetHeight===offsetHeight){return;}}runCallbacks(elem);});// initially display none won't trigger ResizeObserver callback
  13457. var _getRenderInfo=getRenderInfo(elem),detached=_getRenderInfo.detached,rendered=_getRenderInfo.rendered;elem.__resize_observer_triggered__=detached===false&&rendered===false;elem.__resize_observer__=ro;ro.observe(elem);}else if(elem.attachEvent&&elem.addEventListener){// targeting IE9/10
  13458. elem.__resize_legacy_resize_handler__=function handleLegacyResize(){runCallbacks(elem);};elem.attachEvent('onresize',elem.__resize_legacy_resize_handler__);document.addEventListener('DOMSubtreeModified',elem.__resize_mutation_handler__);}else{if(!total){style=createStyles(css);}initTriggers(elem);elem.__resize_rendered__=getRenderInfo(elem).rendered;if(window.MutationObserver){var mo=new MutationObserver(elem.__resize_mutation_handler__);mo.observe(document,{attributes:true,childList:true,characterData:true,subtree:true});elem.__resize_mutation_observer__=mo;}}}elem.__resize_listeners__.push(callback);total++;}function removeListener(elem,callback){var listeners=elem.__resize_listeners__;if(!listeners){return;}if(callback){listeners.splice(listeners.indexOf(callback),1);}// no listeners exist, or removing all listeners
  13459. if(!listeners.length||!callback){// targeting IE9/10
  13460. if(elem.detachEvent&&elem.removeEventListener){elem.detachEvent('onresize',elem.__resize_legacy_resize_handler__);document.removeEventListener('DOMSubtreeModified',elem.__resize_mutation_handler__);return;}if(elem.__resize_observer__){elem.__resize_observer__.unobserve(elem);elem.__resize_observer__.disconnect();elem.__resize_observer__=null;}else{if(elem.__resize_mutation_observer__){elem.__resize_mutation_observer__.disconnect();elem.__resize_mutation_observer__=null;}elem.removeEventListener('scroll',handleScroll);elem.removeChild(elem.__resize_triggers__.triggers);elem.__resize_triggers__=null;}elem.__resize_listeners__=null;}if(! --total&&style){style.parentNode.removeChild(style);}}function getUpdatedSize(elem){var _elem$__resize_last__=elem.__resize_last__,width=_elem$__resize_last__.width,height=_elem$__resize_last__.height;var offsetWidth=elem.offsetWidth,offsetHeight=elem.offsetHeight;if(offsetWidth!==width||offsetHeight!==height){return{width:offsetWidth,height:offsetHeight};}return null;}function handleMutation(){// `this` denotes the scrolling element
  13461. var _getRenderInfo2=getRenderInfo(this),rendered=_getRenderInfo2.rendered,detached=_getRenderInfo2.detached;if(rendered!==this.__resize_rendered__){if(!detached&&this.__resize_triggers__){resetTriggers(this);this.addEventListener('scroll',handleScroll,true);}this.__resize_rendered__=rendered;runCallbacks(this);}}function handleScroll(){var _this=this;// `this` denotes the scrolling element
  13462. resetTriggers(this);if(this.__resize_raf__){cancelAnimationFrame(this.__resize_raf__);}this.__resize_raf__=requestAnimationFrame(function(){var updated=getUpdatedSize(_this);if(updated){_this.__resize_last__=updated;runCallbacks(_this);}});}function runCallbacks(elem){if(!elem||!elem.__resize_listeners__){return;}elem.__resize_listeners__.forEach(function(callback){callback.call(elem,elem);});}function initTriggers(elem){var position=getComputedStyle(elem,'position');if(!position||position==='static'){elem.style.position='relative';}elem.__resize_old_position__=position;elem.__resize_last__={};var triggers=createElement('div',{className:'resize-triggers'});var expand=createElement('div',{className:'resize-expand-trigger'});var expandChild=createElement('div');var contract=createElement('div',{className:'resize-contract-trigger'});expand.appendChild(expandChild);triggers.appendChild(expand);triggers.appendChild(contract);elem.appendChild(triggers);elem.__resize_triggers__={triggers:triggers,expand:expand,expandChild:expandChild,contract:contract};resetTriggers(elem);elem.addEventListener('scroll',handleScroll,true);elem.__resize_last__={width:elem.offsetWidth,height:elem.offsetHeight};}function resetTriggers(elem){var _elem$__resize_trigge=elem.__resize_triggers__,expand=_elem$__resize_trigge.expand,expandChild=_elem$__resize_trigge.expandChild,contract=_elem$__resize_trigge.contract;// batch read
  13463. var csw=contract.scrollWidth,csh=contract.scrollHeight;var eow=expand.offsetWidth,eoh=expand.offsetHeight,esw=expand.scrollWidth,esh=expand.scrollHeight;// batch write
  13464. contract.scrollLeft=csw;contract.scrollTop=csh;expandChild.style.width=eow+1+'px';expandChild.style.height=eoh+1+'px';expand.scrollLeft=esw;expand.scrollTop=esh;}
  13465. /***/ }),
  13466. /***/ 4870:
  13467. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13468. "use strict";
  13469. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _events=__webpack_require__(7187);var _theme=_interopRequireDefault(__webpack_require__(5618));var GlobalEvent=/*#__PURE__*/function(_EventEmitter){(0,_inherits2.default)(GlobalEvent,_EventEmitter);var _super=(0,_createSuper2.default)(GlobalEvent);function GlobalEvent(){var _this;var themValue=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_theme.default[1];(0,_classCallCheck2.default)(this,GlobalEvent);_this=_super.call(this);_this._theme=themValue;return _this;}(0,_createClass2.default)(GlobalEvent,[{key:"theme",get:function get(){return this._theme;},set:function set(themValue){this._theme=themValue;}}]);return GlobalEvent;}(_events.EventEmitter);var _default=new GlobalEvent();exports["default"]=_default;
  13470. /***/ }),
  13471. /***/ 9752:
  13472. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13473. "use strict";
  13474. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports.callHook=callHook;exports.clearNumberComma=clearNumberComma;exports.getColorWithOpacity=getColorWithOpacity;exports.getComponentInstance=getComponentInstance;exports.getFirstMapTarget=getFirstMapTarget;exports.hexToRgba=hexToRgba;exports.isFunction=isFunction;exports.isXField=isXField;exports.isYField=isYField;exports.reservedDecimal=reservedDecimal;var _colorcolor=_interopRequireDefault(__webpack_require__(9458));// 获取当前时间返回置顶格式
  13475. // export function getDateTime(timeType) {
  13476. // return geti18n().d(new Date(), timeType.replace(/\+/g, '_'), getLanguage());
  13477. // }
  13478. // hex -> rgba
  13479. function hexToRgba(hex,opacity){return'rgba('+parseInt('0x'+hex.slice(1,3))+','+parseInt('0x'+hex.slice(3,5))+','+parseInt('0x'+hex.slice(5,7))+','+opacity+')';}// export function isTransparent(color) {
  13480. // const rgba = colorcolor(color, 'rgba');
  13481. // return +rgba.match(/(\d(\.\d+)?)+/g)[3] === 0;
  13482. // }
  13483. // 保留指定位数的小数
  13484. function reservedDecimal(val,precise){return Number(val).toFixed(precise);}// 清除数字(字符串型的)的逗号
  13485. function clearNumberComma(num){if(num.replace){num=num.replace(/,/g,'');}return num;}/**
  13486. * 判断是否地理X坐标
  13487. * @param data
  13488. */function isXField(data){var lowerdata=data.toLowerCase();return lowerdata==='x'||lowerdata==='smx'||lowerdata==='jd'||lowerdata==='经度'||lowerdata==='东经'||lowerdata==='longitude'||lowerdata==='lot'||lowerdata==='lon'||lowerdata==='lng'||lowerdata==='x坐标';}/**
  13489. * 判断是否地理Y坐标
  13490. * @param data
  13491. */function isYField(data){var lowerdata=data.toLowerCase();return lowerdata==='y'||lowerdata==='smy'||lowerdata==='wd'||lowerdata==='纬度'||lowerdata==='北纬'||lowerdata==='latitude'||lowerdata==='lat'||lowerdata==='y坐标';}function getColorWithOpacity(color,opacity){if(color.indexOf('rgba')>-1){return color.substring(0,color.lastIndexOf(',')+1)+opacity+')';}var newColor=(0,_colorcolor.default)(color,'rgb');return'rgba'+newColor.substring(3,newColor.length-1)+",".concat(opacity,")");}var HOOKS=['loaded','removed'];function callHook(instanceRef,hook,map){HOOKS.includes(hook)&&instanceRef[hook]&&typeof instanceRef[hook]==='function'&&instanceRef[hook](map);}function getComponentInstance(ref){this.instanceRef=ref;}function isFunction(event){return Object.prototype.toString.call(event)==='[object Function]';}function getFirstMapTarget(maps){var firstTarget;for(var key in maps){if(!!key){firstTarget=key;break;}}return firstTarget;}
  13492. /***/ }),
  13493. /***/ 7006:
  13494. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13495. "use strict";
  13496. var _interopRequireWildcard=(__webpack_require__(5263)["default"]);var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=withLayer;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(7326));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _wrapDisplayName2=_interopRequireDefault(__webpack_require__(6626));var _react=_interopRequireWildcard(__webpack_require__(3899));var _hoistNonReactStatics=_interopRequireDefault(__webpack_require__(8679));var _lodash=_interopRequireDefault(__webpack_require__(4461));var _lodash2=_interopRequireDefault(__webpack_require__(1633));var _util=__webpack_require__(9752);var _jsxRuntime=__webpack_require__(5893);function withLayer(WrappedComponent){var BaseLayer=/*#__PURE__*/function(_PureComponent){(0,_inherits2.default)(BaseLayer,_PureComponent);var _super=(0,_createSuper2.default)(BaseLayer);function BaseLayer(props){var _this;(0,_classCallCheck2.default)(this,BaseLayer);_this=_super.call(this,props);_this.registerEvents=[];_this.$_emitEvent=function(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(_this.props[originEventName])){_this.props[originEventName]((0,_objectSpread2.default)({map:_this.map,layerId:_this.props.layerId},data));}};_this.$_emitLayerMapEvent=function(event){_this.$_emitEvent(event.type,{mapboxEvent:event});};_this.$_bindLayerEvents=function(){Object.keys(_this.props).forEach(function(eventName){if(_this.eventList.includes(eventName)){var layerId=_this.props.layerId;// @ts-ignore
  13497. var layer=_this.map.overlayLayersManager[layerId];var name=eventName.replace('on','');var registerEventName=name.toLowerCase();_this.registerEvents.push(registerEventName);if(layer){_this.overLayer=layer;layer.on(registerEventName,_this.$_emitLayerMapEvent);}else{_this.map.on(registerEventName,layerId,_this.$_emitLayerMapEvent);}}});};_this.$_unbindLayerEvents=function(events){if(_this.map){events.forEach(function(eventName){!_this.overLayer&&_this.map.off(eventName,_this.props.layerId,_this.$_emitLayerMapEvent);});}};// move = beforeId => {
  13498. // this.map.moveLayer(this.props.layerId, beforeId);
  13499. // this.$_emitEvent('layer-moved', {
  13500. // beforeId: beforeId
  13501. // });
  13502. // };
  13503. _this.remove=function(){var layerId=arguments.length>0&&arguments[0]!==undefined?arguments[0]:_this.props.layerId;if(_this.registerEvents&&_this.registerEvents.length){_this.$_unbindLayerEvents(_this.registerEvents);}if(_this.map){_this.map&&_this.map.removeLayer(layerId);_this.$_emitEvent('layer-removed');}};_this.eventList=['onMousedown','onMouseup','onClick','onDblclick','onMousemove','onMouseenter','onMouseleave','onMouseover','onMouseout','onContextmenu','onTouchstart','onTouchend','onTouchcancel'];_this.getComponentInstance=_util.getComponentInstance.bind((0,_assertThisInitialized2.default)(_this));return _this;}(0,_createClass2.default)(BaseLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(prevProps.minzoom!==this.props.minzoom||prevProps.maxzoom!==this.props.maxzoom){this.map.setLayerZoomRange(this.props.layerId,this.props.minzoom,this.props.maxzoom);}if(prevProps.filter!==this.props.filter){this.map.setFilter(this.props.layerId,this.props.filter);}if(this.props.layout&&prevProps.layout!==this.props.layout){for(var _i=0,_Object$keys=Object.keys(this.props.layout);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];this.map.setLayoutProperty(this.props.layerId,prop,this.props.layout[prop]);}}if(this.props.paint&&prevProps.paint!==this.props.paint){for(var _i2=0,_Object$keys2=Object.keys(this.props.paint);_i2<_Object$keys2.length;_i2++){var _prop=_Object$keys2[_i2];this.map.setPaintProperty(this.props.layerId,_prop,this.props.paint[_prop]);}}if(this.props.metadata&&prevProps.metadata!==this.props.metadata){var layer=this.map.getLayer(this.props.layerId),metadata=layer.metadata;if(metadata){Object.assign(layer.metadata,this.props.metadata);}else{layer.metadata=this.props.metadata;}}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.remove();}},{key:"loaded",value:function loaded(map){this.map=map;(0,_util.callHook)(this.instanceRef,'loaded',this.map);this.$_bindLayerEvents();}},{key:"removed",value:function removed(map){if(this.props.layerId&&this.map){this.remove();}this.map=map;(0,_util.callHook)(this.instanceRef,'removed',this.map);}},{key:"render",value:function render(){// const { layerId } = this.props;
  13504. // const id = source || layerId;
  13505. // const sourceLoaded =
  13506. // this.map && layerId ? this.map.isSourceLoaded(layerId) : false;
  13507. // const mapLayer = this.map ? this.map.getLayer(layerId) : null;
  13508. // const mapSource =
  13509. // this.map && layerId ? this.map.getSource(layerId) : null;
  13510. var newProps=Object.assign({},this.props,{// sourceLoaded,
  13511. // mapLayer,
  13512. // mapSource
  13513. });return/*#__PURE__*/(0,_jsxRuntime.jsx)(WrappedComponent,(0,_objectSpread2.default)((0,_objectSpread2.default)({},newProps),{},{ref:this.getComponentInstance,remove:this.remove}));}}]);return BaseLayer;}(_react.PureComponent);BaseLayer.displayName=(0,_wrapDisplayName2.default)(WrappedComponent,'withLayer');BaseLayer.defaultProps={layerId:(0,_lodash.default)("".concat(WrappedComponent.name.toLowerCase(),"-")),minzoom:0,maxzoom:22};;return(0,_hoistNonReactStatics.default)(BaseLayer,WrappedComponent);};
  13514. /***/ }),
  13515. /***/ 9635:
  13516. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13517. "use strict";
  13518. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=mapGetter;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(7326));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _wrapDisplayName2=_interopRequireDefault(__webpack_require__(6626));var _react=_interopRequireDefault(__webpack_require__(3899));var _hoistNonReactStatics=_interopRequireDefault(__webpack_require__(8679));var _antd=__webpack_require__(2721);var _mapEvent=_interopRequireDefault(__webpack_require__(1104));var _globalEvent=_interopRequireDefault(__webpack_require__(4870));var _util=__webpack_require__(9752);var _jsxRuntime=__webpack_require__(5893);function mapGetter(WrappedComponent){var MapGetter=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(MapGetter,_React$Component);var _super=(0,_createSuper2.default)(MapGetter);function MapGetter(props){var _this;(0,_classCallCheck2.default)(this,MapGetter);_this=_super.call(this,props);_this.loadMapSucceed=_this.loadMapSucceed.bind((0,_assertThisInitialized2.default)(_this));_this.deleteMapSucceed=_this.deleteMapSucceed.bind((0,_assertThisInitialized2.default)(_this));_this.getComponentInstance=_util.getComponentInstance.bind((0,_assertThisInitialized2.default)(_this));return _this;}(0,_createClass2.default)(MapGetter,[{key:"componentDidMount",value:function componentDidMount(){var targetName=this.getTargetName();if(_mapEvent.default.getMap(targetName)){this.loadMap(targetName);}_mapEvent.default.on('load-map',this.loadMapSucceed);_globalEvent.default.on('delete-map',this.deleteMapSucceed);}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var mapTarget=this.props.mapTarget;var prevMapTarget=prevProps.mapTarget;if(mapTarget&&prevMapTarget&&mapTarget!==prevMapTarget){this.mapTargetChanged(mapTarget);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){_mapEvent.default.off('load-map',this.loadMapSucceed);_globalEvent.default.off('delete-map',this.deleteMapSucceed);}},{key:"getTargetName",value:function getTargetName(){/**
  13519. * 便于区分存在多个map时,子组件对应的map的渲染;
  13520. * map 和 webmap 的 props 属性是 target 其他组件都叫 mapTarget
  13521. * 如果子组件包裹在 map 组件里面,若没有传 mapTarget, 则 targetName 直接取父元素的target 的值
  13522. * 如果子组件和 map 同层级,且没有设置 mapTarget 时,则默认渲染到第一个 map 上
  13523. *
  13524. */ // const selfParent = this._reactInternalInstance._currentElement._owner._instance;
  13525. // console.log(selfParent);
  13526. // console.log('selfParent: ', selfParent);
  13527. // const parentTarget =
  13528. // selfParent && selfParent.name.toLowerCase() === 'smwebmap' &&
  13529. // selfParent.target;
  13530. // return this.props.mapTarget || parentTarget || Object.keys(mapEvent.getAllMaps())[0];
  13531. var maps=_mapEvent.default.getAllMaps();return this.props.mapTarget||(0,_util.getFirstMapTarget)(maps);}},{key:"loadMapSucceed",value:function loadMapSucceed(map,target){var targetName=this.getTargetName();if(target===targetName){this.loadMap(target);}}},{key:"mapTargetChanged",value:function mapTargetChanged(target){// 多个map切换的时候,需要删除该组件与前一个map的图层绑定, 如果新的target没有对应的map,那么默认绑定第一个地图
  13532. var maps=_mapEvent.default.getAllMaps();var targetName=(0,_util.getFirstMapTarget)(maps);var firstMap=_mapEvent.default.getMap(targetName);this.resetData();if(_mapEvent.default.getMap(target)||firstMap){this.loadMap(target);}}},{key:"loadMap",value:function loadMap(targetName){this.map=_mapEvent.default.getMap(targetName);this.webmap=_mapEvent.default.getWebMap(targetName);(0,_util.callHook)(this.instanceRef,'loaded',this.map);// 控制与map组件同级的组件的显示加载
  13533. // setTimeout(() => {
  13534. // /**
  13535. // * @event loaded
  13536. // * @desc 组件加载渲染完成之后触发。
  13537. // */
  13538. // this.$emit('loaded');
  13539. // }, 0);
  13540. }},{key:"deleteMapSucceed",value:function deleteMapSucceed(target){var targetName=this.getTargetName();if(target===targetName){this.resetData();}}},{key:"resetData",value:function resetData(){this.map=null;this.webmap=null;(0,_util.callHook)(this.instanceRef,'removed',this.map);}},{key:"mapNotLoadedTip",value:function mapNotLoadedTip(){if(!this.map){_antd.message.destroy();// TODO
  13541. // message.warning(this.$t('warning.unassociatedMap'));
  13542. _antd.message.warning('您需要配置关联地图!');return true;}return false;}},{key:"render",value:function render(){return/*#__PURE__*/(0,_jsxRuntime.jsx)(WrappedComponent,(0,_objectSpread2.default)((0,_objectSpread2.default)({},this.props),{},{ref:this.getComponentInstance,mapNotLoadedTip:this.mapNotLoadedTip}));}}]);return MapGetter;}(_react.default.Component);MapGetter.displayName=(0,_wrapDisplayName2.default)(WrappedComponent,'mapGetter');return(0,_hoistNonReactStatics.default)(MapGetter,WrappedComponent);}
  13543. /***/ }),
  13544. /***/ 1558:
  13545. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13546. "use strict";
  13547. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));/**
  13548. * @class CircleStyle
  13549. * @category BaseTypes Style
  13550. * @classdesc 点图层样式类。
  13551. * @param {mapboxgl.LayersCircle} paint - MapboxGL 点图层 Paint 配置。
  13552. * @param {mapboxgl.LayersCircle} layout - MapboxGL 点图层 Layout 配置。
  13553. */var CircleStyle=/*#__PURE__*/(0,_createClass2.default)(function CircleStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,CircleStyle);this.layout={visibility:'visible'};this.paint={'circle-radius':6,'circle-color':'#3fb1e3','circle-opacity':1,'circle-blur':0,'circle-translate':[0,0],'circle-translate-anchor':'map','circle-pitch-scale':'map','circle-pitch-alignment':'viewport','circle-stroke-width':0,'circle-stroke-color':'#000','circle-stroke-opacity':1};Object.assign(this.paint,paint);Object.assign(this.layout,layout);});exports["default"]=CircleStyle;
  13554. /***/ }),
  13555. /***/ 3768:
  13556. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13557. "use strict";
  13558. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));/**
  13559. * @class FillStyle
  13560. * @category BaseTypes Style
  13561. * @classdesc 面图层样式类。
  13562. * @param {mapboxgl.LayersFill} paint - MapboxGL 面图层 Paint 配置。
  13563. * @param {mapboxgl.LayersFill} layout - MapboxGL 面图层 Layout 配置。
  13564. */var FillStyle=/*#__PURE__*/(0,_createClass2.default)(function FillStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,FillStyle);this.layout={visibility:'visible'};this.paint={'fill-opacity':0.8,'fill-color':'#3fb1e3','fill-translate':[0,0],'fill-antialias':true,'fill-outline-color':'#3fb1e3','fill-translate-anchor':'map'};Object.assign(this.paint,paint);Object.assign(this.layout,layout);});exports["default"]=FillStyle;
  13565. /***/ }),
  13566. /***/ 9623:
  13567. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13568. "use strict";
  13569. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var HeatMapStyle=/*#__PURE__*/(0,_createClass2.default)(function HeatMapStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,HeatMapStyle);this.paint={'heatmap-radius':30,'heatmap-weight':1,'heatmap-intensity':1,'heatmap-color':['interpolate',['linear'],['heatmap-density'],0,'rgba(0, 0, 255, 0)',0.1,'royalblue',0.3,'cyan',0.5,'lime',0.7,'yellow',1,'red'],'heatmap-opacity':1};this.layout={visibility:'visible'};Object.assign(this.paint,paint);Object.assign(this.layout,layout);});exports["default"]=HeatMapStyle;
  13570. /***/ }),
  13571. /***/ 8214:
  13572. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13573. "use strict";
  13574. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));/**
  13575. * @class LineStyle
  13576. * @category BaseTypes Style
  13577. * @classdesc 线图层样式类。
  13578. * @param {mapboxgl.LayersLine} paint - MapboxGL 线图层 Paint 配置。
  13579. * @param {mapboxgl.LayersLine} layout - MapboxGL 线图层 Layout 配置。
  13580. */var LineStyle=/*#__PURE__*/(0,_createClass2.default)(function LineStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,LineStyle);this.layout={visibility:'visible','line-cap':'butt','line-join':'miter'};this.paint={'line-opacity':1,'line-color':'#3fb1e3','line-width':3,'line-blur':1};Object.assign(this.paint,paint);Object.assign(this.layout,layout);});exports["default"]=LineStyle;
  13581. /***/ }),
  13582. /***/ 1700:
  13583. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13584. "use strict";
  13585. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));/**
  13586. * @class SymbolStyle
  13587. * @classdesc symbol 图层样式类。
  13588. */var SymbolStyle=/*#__PURE__*/(0,_createClass2.default)(function SymbolStyle(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var layout=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,SymbolStyle);this.paint=Object.assign({},paint);this.layout=Object.assign({visibility:'visible'},layout);});exports["default"]=SymbolStyle;
  13589. /***/ }),
  13590. /***/ 2009:
  13591. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13592. "use strict";
  13593. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));Object.defineProperty(exports, "CircleStyle", ({enumerable:true,get:function get(){return _CircleStyle.default;}}));Object.defineProperty(exports, "FillStyle", ({enumerable:true,get:function get(){return _FillStyle.default;}}));Object.defineProperty(exports, "HeatMapStyle", ({enumerable:true,get:function get(){return _HeatMapStyle.default;}}));Object.defineProperty(exports, "LineStyle", ({enumerable:true,get:function get(){return _LineStyle.default;}}));Object.defineProperty(exports, "SymbolStyle", ({enumerable:true,get:function get(){return _SymbolStyle.default;}}));var _CircleStyle=_interopRequireDefault(__webpack_require__(1558));var _FillStyle=_interopRequireDefault(__webpack_require__(3768));var _LineStyle=_interopRequireDefault(__webpack_require__(8214));var _HeatMapStyle=_interopRequireDefault(__webpack_require__(9623));var _SymbolStyle=_interopRequireDefault(__webpack_require__(1700));
  13594. /***/ }),
  13595. /***/ 1104:
  13596. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13597. "use strict";
  13598. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _events=__webpack_require__(7187);var _SourceListModel=_interopRequireDefault(__webpack_require__(8383));var _globalEvent=_interopRequireDefault(__webpack_require__(4870));var MapEvent=/*#__PURE__*/function(_EventEmitter){(0,_inherits2.default)(MapEvent,_EventEmitter);var _super=(0,_createSuper2.default)(MapEvent);function MapEvent(){var _this;(0,_classCallCheck2.default)(this,MapEvent);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}_this=_super.call.apply(_super,[this].concat(args));_this.mapCache={};_this.webMapCache={};return _this;}(0,_createClass2.default)(MapEvent,[{key:"getMap",value:function getMap(mapTarget){return this.mapCache[mapTarget];}},{key:"getWebMap",value:function getWebMap(webmapTarget){return this.webMapCache[webmapTarget];}},{key:"getAllMaps",value:function getAllMaps(){return this.mapCache;}},{key:"getAllWebMap",value:function getAllWebMap(){return this.webMapCache;}},{key:"setMap",value:function setMap(mapTarget,map){this.mapCache[mapTarget]=map;}},{key:"setWebMap",value:function setWebMap(webmapTarget,webmap){this.webMapCache[webmapTarget]=webmap;}},{key:"deleteMap",value:function deleteMap(mapTarget){_globalEvent.default.emit('delete-map',mapTarget);// drawEvent.$options.deletDrawOfMap(mapTarget);
  13599. delete this.mapCache[mapTarget];}},{key:"deleteWebMap",value:function deleteWebMap(webmapTarget){delete this.webMapCache[webmapTarget];}},{key:"getMapSource",value:function getMapSource(mapTarget){var sources=[];var map=this.getMap(mapTarget);if(map){var sourceListModel=new _SourceListModel.default({map:map});var sourceList=sourceListModel.getSourceList();for(var key in sourceList){if(key){var layers=sourceList[key].layers||[];layers.forEach(function(item){if(item.source&&item.type!=='raster'){sources.push(item.source);}});}}}return sources;}}]);return MapEvent;}(_events.EventEmitter);var _default=new MapEvent();exports["default"]=_default;
  13600. /***/ }),
  13601. /***/ 3595:
  13602. /***/ (function(__unused_webpack_module, exports) {
  13603. "use strict";
  13604. Object.defineProperty(exports, "__esModule", ({value:true}));exports.handleMultyPolygon=void 0;var handleMultyPolygon=function handleMultyPolygon(features){features.forEach(function(feature){if(feature.geometry.type!=='Polygon'){return;}var coords=feature.geometry.coordinates;if(coords.length>1){var coordinates=[];coords.forEach(function(coord){coordinates.push([coord]);});feature.geometry.coordinates=coordinates;feature.geometry.type='MultiPolygon';}});return features;};exports.handleMultyPolygon=handleMultyPolygon;
  13605. /***/ }),
  13606. /***/ 1191:
  13607. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13608. "use strict";
  13609. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));Object.defineProperty(exports, "SmAnimateMarkerLayer", ({enumerable:true,get:function get(){return _AnimateMarkerLayer.default;}}));Object.defineProperty(exports, "SmClusterLayer", ({enumerable:true,get:function get(){return _ClusterLayer.default;}}));Object.defineProperty(exports, "SmDataFlowLayer", ({enumerable:true,get:function get(){return _DataFlowLayer.default;}}));Object.defineProperty(exports, "SmDeckglLayer", ({enumerable:true,get:function get(){return _DeckglLayer.default;}}));Object.defineProperty(exports, "SmEchartsLayer", ({enumerable:true,get:function get(){return _EchartsLayer.default;}}));Object.defineProperty(exports, "SmFireLayer", ({enumerable:true,get:function get(){return _FireLayer.default;}}));Object.defineProperty(exports, "SmGeojsonLayer", ({enumerable:true,get:function get(){return _GeojsonLayer.default;}}));Object.defineProperty(exports, "SmGraphThemeLayer", ({enumerable:true,get:function get(){return _GraphThemeLayer.default;}}));Object.defineProperty(exports, "SmHeatmapLayer", ({enumerable:true,get:function get(){return _HeatmapLayer.default;}}));Object.defineProperty(exports, "SmLabelThemeLayer", ({enumerable:true,get:function get(){return _LabelThemeLayer.default;}}));Object.defineProperty(exports, "SmLayer", ({enumerable:true,get:function get(){return _Layer.default;}}));Object.defineProperty(exports, "SmMap", ({enumerable:true,get:function get(){return _Map.default;}}));Object.defineProperty(exports, "SmMapvLayer", ({enumerable:true,get:function get(){return _MapvLayer.default;}}));Object.defineProperty(exports, "SmRangeThemeLayer", ({enumerable:true,get:function get(){return _RangeThemeLayer.default;}}));Object.defineProperty(exports, "SmRanksymbolThemeLayer", ({enumerable:true,get:function get(){return _RanksymbolThemeLayer.default;}}));Object.defineProperty(exports, "SmRasterTileLayer", ({enumerable:true,get:function get(){return _RasterTileLayer.default;}}));Object.defineProperty(exports, "SmSource", ({enumerable:true,get:function get(){return _Source.default;}}));Object.defineProperty(exports, "SmUniqueThemeLayer", ({enumerable:true,get:function get(){return _UniqueThemeLayer.default;}}));Object.defineProperty(exports, "SmVectorTileLayer", ({enumerable:true,get:function get(){return _VectorTileLayer.default;}}));Object.defineProperty(exports, "SmWebMap", ({enumerable:true,get:function get(){return _WebMap.default;}}));var _WebMap=_interopRequireDefault(__webpack_require__(4416));var _Map=_interopRequireDefault(__webpack_require__(8611));var _Source=_interopRequireDefault(__webpack_require__(1406));var _Layer=_interopRequireDefault(__webpack_require__(5558));var _GeojsonLayer=_interopRequireDefault(__webpack_require__(9704));var _RasterTileLayer=_interopRequireDefault(__webpack_require__(1771));var _VectorTileLayer=_interopRequireDefault(__webpack_require__(2125));var _UniqueThemeLayer=_interopRequireDefault(__webpack_require__(4204));var _RanksymbolThemeLayer=_interopRequireDefault(__webpack_require__(3930));var _RangeThemeLayer=_interopRequireDefault(__webpack_require__(5890));var _GraphThemeLayer=_interopRequireDefault(__webpack_require__(910));var _ClusterLayer=_interopRequireDefault(__webpack_require__(9407));var _DeckglLayer=_interopRequireDefault(__webpack_require__(9183));var _LabelThemeLayer=_interopRequireDefault(__webpack_require__(2174));var _HeatmapLayer=_interopRequireDefault(__webpack_require__(6073));var _MapvLayer=_interopRequireDefault(__webpack_require__(7));var _EchartsLayer=_interopRequireDefault(__webpack_require__(1762));var _DataFlowLayer=_interopRequireDefault(__webpack_require__(2313));var _FireLayer=_interopRequireDefault(__webpack_require__(4799));var _AnimateMarkerLayer=_interopRequireDefault(__webpack_require__(1193));
  13610. /***/ }),
  13611. /***/ 4483:
  13612. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13613. "use strict";
  13614. var _interopRequireWildcard=(__webpack_require__(5263)["default"]);var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));var _exportNames={};exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));__webpack_require__(9626);__webpack_require__(2547);var components=_interopRequireWildcard(__webpack_require__(1191));Object.keys(components).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;if(key in exports&&exports[key]===components[key])return;Object.defineProperty(exports,key,{enumerable:true,get:function get(){return components[key];}});});var commontypes=_interopRequireWildcard(__webpack_require__(2009));var exportData=(0,_objectSpread2.default)((0,_objectSpread2.default)({},components),{},{commontypes:commontypes});var _default=exportData;exports["default"]=_default;
  13615. /***/ }),
  13616. /***/ 1016:
  13617. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13618. "use strict";
  13619. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));/**
  13620. * @class LayerModel
  13621. * @description 图层数据模型。
  13622. * @param {Object} options - 图层参数。
  13623. * @param {String} [options.id] - 图层 ID。
  13624. * @param {Number} [options.maxzoom] - 最大缩放级别。
  13625. * @param {Number} [options.minzoom] - 最小缩放级别。
  13626. * @param {GeoJSONObject} [options.source] - 数据源。
  13627. * @param {String} [options.type] - 图层类型。
  13628. * @param {String} [options.visibility] - 图层是否可见。
  13629. * @category Model
  13630. */var LayerModel=/*#__PURE__*/(0,_createClass2.default)(function LayerModel(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};(0,_classCallCheck2.default)(this,LayerModel);this.id=options.id;this.maxzoom=options.maxzoom;this.minzoom=options.minzoom;this.source=options.source;this.type=options.type;this.visibility=options.visibility||'visible';});var _default=LayerModel;exports["default"]=_default;
  13631. /***/ }),
  13632. /***/ 8611:
  13633. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13634. "use strict";
  13635. var _interopRequireWildcard=(__webpack_require__(5263)["default"]);var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(7326));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _react=_interopRequireWildcard(__webpack_require__(3899));var _interface=__webpack_require__(4831);var _MapViewModal=_interopRequireDefault(__webpack_require__(8031));var _lodash=_interopRequireDefault(__webpack_require__(1296));var _lodash2=_interopRequireDefault(__webpack_require__(1633));var _lodash3=_interopRequireDefault(__webpack_require__(39));var _lodash4=_interopRequireDefault(__webpack_require__(9208));var _lodash5=_interopRequireDefault(__webpack_require__(2307));var _resizeDetector=__webpack_require__(1892);var _mapEvent=_interopRequireDefault(__webpack_require__(1104));var _util=__webpack_require__(9752);var _jsxRuntime=__webpack_require__(5893);var Map=/*#__PURE__*/function(_Component){(0,_inherits2.default)(Map,_Component);var _super=(0,_createSuper2.default)(Map);function Map(props){var _this;(0,_classCallCheck2.default)(this,Map);_this=_super.call(this,props);_this.viewModelProps=['mapOptions.center','mapOptions.zoom','mapOptions.crs','mapOptions.minZoom','mapOptions.maxZoom','mapOptions.maxBounds','mapOptions.renderWorldCopies','mapOptions.bearing','mapOptions.pitch'];_this.initializeWebMap=function(){var _this$props=_this.props,target=_this$props.target,tiandituKey=_this$props.tiandituKey,mapOptions=_this$props.mapOptions,autoresize=_this$props.autoresize;_this.viewModel=new _MapViewModal.default({target:target,tiandituKey:tiandituKey},mapOptions);if(autoresize){(0,_resizeDetector.addListener)(_this.selfRef.current,_this.__resizeHandler);}};_this.registerEvents=function(){var _this$props2=_this.props,target=_this$props2.target,onLoad=_this$props2.onLoad;_this.viewModel.on('addlayerssucceeded',function(e){_this.setState({spinning:false});_mapEvent.default.setMap(target,e.map);_this.viewModel&&_mapEvent.default.setWebMap(target,_this.viewModel);_mapEvent.default.emit('load-map',e.map,target);e.map.resize();_this.map=e.map;if(false){}// 绑定map event
  13636. _this.bindMapEvents();/**
  13637. * @event load
  13638. * @desc webmap 加载完成之后触发。
  13639. * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
  13640. */(0,_util.isFunction)(onLoad)&&onLoad((0,_objectSpread2.default)((0,_objectSpread2.default)({},e),{},{component:(0,_assertThisInitialized2.default)(_this)}));});};_this.mapEventCallback=function(event){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};_this.emitMapEvent(event.type,(0,_objectSpread2.default)({mapboxEvent:event},data));};_this.state={spinning:true};_this.selfRef=/*#__PURE__*/_react.default.createRef();_this.__resizeHandler=(0,_lodash.default)(_this.__resizeHandler.bind((0,_assertThisInitialized2.default)(_this)),100,{leading:true});return _this;}(0,_createClass2.default)(Map,[{key:"componentDidMount",value:function componentDidMount(){this.initializeWebMap();this.registerEvents();}},{key:"getLayerIds",value:function getLayerIds(children){return children===null||children===void 0?void 0:children.reduce(function(layerIds,child){var _child$type,_child$type$displayNa;if(child!==null&&child!==void 0&&(_child$type=child.type)!==null&&_child$type!==void 0&&(_child$type$displayNa=_child$type.displayName)!==null&&_child$type$displayNa!==void 0&&_child$type$displayNa.includes('Layer')){var id=child.props.layerId;id&&layerIds.push(id);}return layerIds;},[]);}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;this.viewModel&&this.viewModelProps.forEach(function(prop){var name=prop.includes('.')?prop.split('.')[1]:prop;var funcName="set".concat((0,_lodash3.default)(name));var propsValue=(0,_lodash4.default)(_this2.props,prop);var prevPropsValue=(0,_lodash4.default)(prevProps,prop);if(propsValue&&!(0,_lodash5.default)(propsValue,prevPropsValue)){_this2.viewModel[funcName](propsValue);}});var _this$props3=this.props,sprites=_this$props3.sprites,glyphs=_this$props3.glyphs;for(var id in sprites){if(prevProps.sprites[id]!==sprites[id]){this.viewModel.addSprites(id,sprites[id]);}}for(var _id2 in glyphs){if(prevProps.glyphs[_id2]!==glyphs[_id2]){this.viewModel.addGlyphs(_id2,glyphs[_id2]);}}if(!this.map){return;}var preLayerIds=this.getLayerIds(prevProps.children);var newLayerIds=this.getLayerIds(this.props.children);// 过滤图层顺序相等的情况
  13641. if(!(0,_lodash5.default)(preLayerIds,newLayerIds)){this.viewModel.changeLayersOrder(newLayerIds);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this$props4=this.props,target=_this$props4.target,autoresize=_this$props4.autoresize;_mapEvent.default.deleteMap(target);_mapEvent.default.deleteWebMap(target);if(autoresize&&this.selfRef.current){(0,_resizeDetector.removeListener)(this.selfRef.current,this.__resizeHandler);}}},{key:"bindMapEvents",value:function bindMapEvents(){var _this3=this;Object.keys(this.props).forEach(function(eventName){if(_interface.MAP_EVENT_NAMES.includes(eventName)){var name=eventName.replace('on','');_this3.bindMapEvent(name.toLowerCase(),_this3.mapEventCallback);}});}},{key:"bindMapEvent",value:function bindMapEvent(eventName,eventCallback){this.map.on(eventName,eventCallback);}},{key:"emitMapEvent",value:function emitMapEvent(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(this.props[originEventName])){this.props[originEventName]((0,_objectSpread2.default)({map:this.map,component:this},data));}}},{key:"__resizeHandler",value:function __resizeHandler(){this.resize();}},{key:"resize",value:function resize(){if(this.viewModel&&this.viewModel.resize){this.viewModel.resize();}}},{key:"render",value:function render(){var spinning=this.state.spinning;var _this$props5=this.props,target=_this$props5.target,children=_this$props5.children;return/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{id:target,className:"sm-component-map",ref:this.selfRef,children:!spinning&&children});}}]);return Map;}(_react.Component);Map.defaultProps={target:'map',autoresize:true};var _default=Map;exports["default"]=_default;
  13642. /***/ }),
  13643. /***/ 8031:
  13644. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13645. "use strict";
  13646. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var MapViewModal=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(MapViewModal,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(MapViewModal);function MapViewModal(options){var _this;var mapOptions=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{style:{version:8,sources:{},layers:[]}};(0,_classCallCheck2.default)(this,MapViewModal);_this=_super.call(this);_this.mapOptions=Object.assign({style:{version:8,sources:{},layers:[]}},mapOptions);_this.tiandituKey=options.tiandituKey||'';_this.target=options.target||'map';_this.center=mapOptions.center||[];_this.zoom=mapOptions.zoom;_this._createMap();return _this;}(0,_createClass2.default)(MapViewModal,[{key:"_createMap",value:function _createMap(){var _this2=this;if(this.map){this.map.remove();this.center=[];this.zoom=null;}this.mapOptions.container=this.target;setTimeout(function(){_this2.map=new _mapboxGlEnhance.default.Map(_this2.mapOptions);_this2.map.on('load',function(){_this2.fire('addlayerssucceeded',{map:_this2.map});});},0);return;}/**
  13647. * @function WebMapViewModel.prototype.resize
  13648. * @description Map 更新大小。
  13649. */},{key:"resize",value:function resize(){this.map&&this.map.resize();}/**
  13650. * @function WebMapViewModel.prototype.setCRS
  13651. * @description 设置地图的投影。
  13652. * @param {Number} crs - 地图投影。
  13653. */},{key:"setCrs",value:function setCrs(crs){if(this.map){this.mapOptions.crs=crs;//@ts-ignore
  13654. crs&&this.map.setCRS(_mapboxGlEnhance.default.CRS.get(crs));}}/**
  13655. * @function WebMapViewModel.prototype.setZoom
  13656. * @description 设置地图的缩放级别。
  13657. * @param {Number} zoom - 地图缩放级别。
  13658. */},{key:"setZoom",value:function setZoom(zoom){if(this.map){this.mapOptions.zoom=zoom;(zoom||zoom===0)&&this.map.setZoom(zoom);}}/**
  13659. * @function WebMapViewModel.prototype.setCenter
  13660. * @description 设置地图的中心点。
  13661. * @param {Array} center - 地图中心点。
  13662. */},{key:"setCenter",value:function setCenter(center){if(this.map){this.mapOptions.center=center;center&&center.length>0&&this.map.setCenter(center);}}/**
  13663. * @function WebMapViewModel.prototype.setMaxBounds
  13664. * @description 设置地图的最大范围。
  13665. * @param {Array} maxBounds - 地图最大范围。
  13666. */},{key:"setMaxBounds",value:function setMaxBounds(maxBounds){if(this.map){this.mapOptions.maxBounds=maxBounds;maxBounds&&maxBounds.length>0&&this.map.setMaxBounds(maxBounds);}}/**
  13667. * @function WebMapViewModel.prototype.setMinZoom
  13668. * @description 设置地图的最小级别。
  13669. * @param {Number} minZoom - 地图最小级别。
  13670. */},{key:"setMinZoom",value:function setMinZoom(minZoom){if(this.map){this.mapOptions.minZoom=minZoom;(minZoom||minZoom===0)&&this.map.setMinZoom(minZoom);}}/**
  13671. * @function WebMapViewModel.prototype.setMaxZoom
  13672. * @description 设置地图的最大级别。
  13673. * @param {Number} maxZoom - 地图最大级别。
  13674. */},{key:"setMaxZoom",value:function setMaxZoom(maxZoom){if(this.map){this.mapOptions.maxZoom=maxZoom;(maxZoom||maxZoom===0)&&this.map.setMinZoom(maxZoom);}}/**
  13675. * @function WebMapViewModel.prototype.setRenderWorldCopies
  13676. * @description 设置地图的平铺。
  13677. * @param {Boolean} renderWorldCopies - 地图是否平铺。
  13678. */},{key:"setRenderWorldCopies",value:function setRenderWorldCopies(renderWorldCopies){if(this.map){this.mapOptions.renderWorldCopies=renderWorldCopies;renderWorldCopies&&this.map.setRenderWorldCopies(renderWorldCopies);}}/**
  13679. * @function WebMapViewModel.prototype.setBearing
  13680. * @description 设置地图的方位。
  13681. * @param {Number} bearing - 地图的初始方位。
  13682. */},{key:"setBearing",value:function setBearing(bearing){if(this.map){this.mapOptions.bearing=bearing;(bearing||bearing===0)&&this.map.setBearing(bearing);}}/**
  13683. * @function WebMapViewModel.prototype.setPitch
  13684. * @description 设置地图的俯仰。
  13685. * @param {Number} pitch - 地图的初始俯仰。
  13686. */},{key:"setPitch",value:function setPitch(pitch){if(this.map){this.mapOptions.pitch=pitch;(pitch||pitch===0)&&this.map.setPitch(pitch);}}},{key:"addSprites",value:function addSprites(sourceId,sprite){var _this$map;if((_this$map=this.map)!==null&&_this$map!==void 0&&_this$map.style){this.map.style.addSprite(sourceId,sprite);}}},{key:"addGlyphs",value:function addGlyphs(sourceId,glyph){var _this$map2;if((_this$map2=this.map)!==null&&_this$map2!==void 0&&_this$map2.style){this.map.style.addGlyphs(sourceId,glyph);}}/**
  13687. * @function MapViewModel.prototype.changeLayersOrder
  13688. * @description 设置图层顺序
  13689. * @param {string[]} newLayerIds - 正确顺序的图层id数据
  13690. */},{key:"changeLayersOrder",value:function changeLayersOrder(newLayerIds){// 最后一个图层的位置不变,从倒数第二个图层开始移动图层顺序
  13691. for(var index=newLayerIds.length-2;index>-1;index--){var moveId=newLayerIds[index];var beforeId=newLayerIds[index+1];this.map.moveLayer(moveId,beforeId);}}}]);return MapViewModal;}(_mapboxGlEnhance.default.Evented);var _default=MapViewModal;exports["default"]=_default;
  13692. /***/ }),
  13693. /***/ 1406:
  13694. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13695. "use strict";
  13696. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectWithoutProperties2=_interopRequireDefault(__webpack_require__(4925));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _excluded=["id","mapNotLoadedTip"];var _dec,_class;var Source=(_dec=(0,_compose2.default)(_mapGetter.default),_dec(_class=/*#__PURE__*/function(_React$PureComponent){(0,_inherits2.default)(Source,_React$PureComponent);var _super=(0,_createSuper2.default)(Source);function Source(props){var _this;(0,_classCallCheck2.default)(this,Source);_this=_super.call(this,props);_this._map=null;return _this;}(0,_createClass2.default)(Source,[{key:"componentWillUnmount",value:function componentWillUnmount(){var _this2=this;setTimeout(function(){_this2._map.removeSource(_this2.props.id);},100);}},{key:"loaded",value:function loaded(map){this._map=map;var _this$props=this.props,id=_this$props.id,mapNotLoadedTip=_this$props.mapNotLoadedTip,sourceOption=(0,_objectWithoutProperties2.default)(_this$props,_excluded);if(this._map.getSource(id)){return;}this._map.addSource(id,sourceOption);}},{key:"render",value:function render(){return null;}}]);return Source;}(_react.default.PureComponent))||_class);exports["default"]=Source;
  13697. /***/ }),
  13698. /***/ 8383:
  13699. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13700. "use strict";
  13701. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _SourceModel=_interopRequireDefault(__webpack_require__(7591));var _LayerModel=_interopRequireDefault(__webpack_require__(1016));var SourceListModel=/*#__PURE__*/function(){function SourceListModel(options){(0,_classCallCheck2.default)(this,SourceListModel);this.map=options.map;this.style=this.map.getStyle();this.layers=this.map.getStyle().layers;this.overlayLayers=this.map.overlayLayersManager;this.detailLayers=null;this.sourceList={};this.sourceNames=[];this._initLayers();this._initSource();this.excludeSourceNames=['tdt-search-','tdt-route-','smmeasure','mapbox-gl-draw'];}(0,_createClass2.default)(SourceListModel,[{key:"getSourceList",value:function getSourceList(){var sourceList={};for(var key in this.sourceList){if(key&&this.excludeSource(key)){sourceList[key]=this.sourceList[key];}}return sourceList;}},{key:"getSourceNames",value:function getSourceNames(){var _this=this;var names=[];this.sourceNames.forEach(function(element){if(element&&_this.excludeSource(element)){names.push(element);}});return names;}},{key:"excludeSource",value:function excludeSource(key){for(var i=0;i<this.excludeSourceNames.length;i++){if(key.indexOf(this.excludeSourceNames[i])>=0){return false;}}return true;}},{key:"getLegendStyle",value:function getLegendStyle(sourceName){if(sourceName){return this.sourceList[sourceName]?this.sourceList[sourceName].style:'';}var sourceList=Object.values(this.sourceList)||[];var styles=sourceList.filter(function(item){return!!item.style;});return styles;}},{key:"getLayers",value:function getLayers(){return this.detailLayers;}},{key:"getLayersBySourceLayer",value:function getLayersBySourceLayer(sourceName,sourceLayer){return this.sourceList[sourceName]['sourceLayerList'][sourceLayer];}},{key:"getSourceLayersBySource",value:function getSourceLayersBySource(sourceName){return this.sourceList[sourceName]['sourceLayerList'];}},{key:"addSourceStyle",value:function addSourceStyle(sourceName,sourceStyle){if(this.sourceList[sourceName]){this.sourceList[sourceName]['style']=sourceStyle;}}},{key:"_initLayers",value:function _initLayers(){var _this2=this;this.layers&&(this.detailLayers=this.layers.map(function(layer){return _this2.map.getLayer(layer.id);}));var overLayerList=Object.values(this.overlayLayers);overLayerList.forEach(function(overlayer){if(overlayer.id){_this2.detailLayers.push({id:overlayer.id,visibility:overlayer.visibility?'visible':'none',source:overlayer.id});}});}},{key:"_initSource",value:function _initSource(){var _this3=this;this.detailLayers&&this.detailLayers.forEach(function(layer){if(!_this3.sourceList[layer['source']]){_this3.sourceList[layer['source']]=new _SourceModel.default({source:layer['source']});_this3.sourceNames.push(layer['source']);}_this3.sourceList[layer['source']].addLayer(new _LayerModel.default(layer),layer['sourceLayer']);});}}]);return SourceListModel;}();var _default=SourceListModel;exports["default"]=_default;
  13702. /***/ }),
  13703. /***/ 7591:
  13704. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13705. "use strict";
  13706. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var SourceModel=/*#__PURE__*/function(){function SourceModel(options){(0,_classCallCheck2.default)(this,SourceModel);this.id=options.source;this.sourceLayerList={};this.layers=[];this.type=null;}(0,_createClass2.default)(SourceModel,[{key:"addLayer",value:function addLayer(layer,sourceLayer){if(sourceLayer){if(!this.sourceLayerList[sourceLayer]){this.sourceLayerList[sourceLayer]=[];}this.sourceLayerList[sourceLayer].push(layer);}else{this.sourceLayerList=undefined;}this.layers.push(layer);this.type=layer.type;if([layer.visibility,this.visibility].includes('visible')){this.visibility='visible';}else{this.visibility='none';}}}]);return SourceModel;}();var _default=SourceModel;exports["default"]=_default;
  13707. /***/ }),
  13708. /***/ 4416:
  13709. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13710. "use strict";
  13711. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _assertThisInitialized2=_interopRequireDefault(__webpack_require__(7326));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _react=_interopRequireDefault(__webpack_require__(3899));var _resizeDetector=__webpack_require__(1892);var _lodash=_interopRequireDefault(__webpack_require__(1296));var _lodash2=_interopRequireDefault(__webpack_require__(1633));var _lodash3=_interopRequireDefault(__webpack_require__(39));var _antd=__webpack_require__(2721);var _lodash4=_interopRequireDefault(__webpack_require__(9208));var _lodash5=_interopRequireDefault(__webpack_require__(2307));var _mapEvent=_interopRequireDefault(__webpack_require__(1104));var _WebMapViewModel=_interopRequireDefault(__webpack_require__(2872));var _util=__webpack_require__(9752);var _interface=__webpack_require__(4831);var _jsxRuntime=__webpack_require__(5893);var WebMap=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(WebMap,_React$Component);var _super=(0,_createSuper2.default)(WebMap);function WebMap(props){var _this;(0,_classCallCheck2.default)(this,WebMap);_this=_super.call(this,props);_this._isMounted=false;_this.initializeWebMap=function(){var _this$props=_this.props,target=_this$props.target,serverUrl=_this$props.serverUrl,accessToken=_this$props.accessToken,accessKey=_this$props.accessKey,tiandituKey=_this$props.tiandituKey,withCredentials=_this$props.withCredentials,excludePortalProxyUrl=_this$props.excludePortalProxyUrl,mapOptions=_this$props.mapOptions,autoresize=_this$props.autoresize;_this.viewModel=new _WebMapViewModel.default(_this.props.mapId,{target:target,serverUrl:serverUrl,accessToken:accessToken,accessKey:accessKey,tiandituKey:tiandituKey,withCredentials:withCredentials,excludePortalProxyUrl:excludePortalProxyUrl},mapOptions);if(autoresize){(0,_resizeDetector.addListener)(_this.selfRef.current,_this.__resizeHandler);}};_this.registerEvents=function(){var _this$props2=_this.props,target=_this$props2.target,onLoad=_this$props2.onLoad;_this.viewModel.on('addlayerssucceeded',function(e){if(_this._isMounted){_this.setState({spinning:false});}_mapEvent.default.setMap(target,e.map);_this.viewModel&&_mapEvent.default.setWebMap(target,_this.viewModel);_mapEvent.default.emit('load-map',e.map,target);e.map.resize();_this.map=e.map;// 绑定map event
  13712. _this.bindMapEvents();/**
  13713. * @event load
  13714. * @desc webmap 加载完成之后触发。
  13715. * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
  13716. */(0,_util.isFunction)(onLoad)&&onLoad((0,_objectSpread2.default)((0,_objectSpread2.default)({},e),{},{component:(0,_assertThisInitialized2.default)(_this)}));});_this.viewModel.on('getmapinfofailed',function(e){var onGetMapFailed=_this.props.onGetMapFailed;/**
  13717. * @event getMapFailed
  13718. * @desc 获取 WebMap 地图信息失败。
  13719. * @property {Object} error - 失败原因。
  13720. */(0,_util.isFunction)(onGetMapFailed)&&onGetMapFailed({error:e.error});_antd.message.error(e.error.message);if(_this._isMounted){_this.setState({spinning:false});}});_this.viewModel.on('getlayerdatasourcefailed',function(e){var onGetLayerDatasourceFailed=_this.props.onGetLayerDatasourceFailed;/**
  13721. * @event getLayerDatasourceFailed
  13722. * @desc 获取图层数据失败。
  13723. * @property {Object} error - 失败原因。
  13724. * @property {Object} layer - 图层信息。
  13725. * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
  13726. */(0,_util.isFunction)(onGetLayerDatasourceFailed)&&onGetLayerDatasourceFailed({error:e.error,layer:e.layer,map:e.map});// TODO
  13727. // message.error(this.$t('webmap.getLayerInfoFailed'));
  13728. _antd.message.error('获取图层信息失败!');});};_this.state={spinning:true,viewModelProps:['mapId','serverUrl','mapOptions.center','mapOptions.zoom','mapOptions.style','mapOptions.crs','mapOptions.minZoom','mapOptions.maxZoom','mapOptions.maxBounds','mapOptions.renderWorldCopies','mapOptions.bearing','mapOptions.pitch','withCredentials']};_this.selfRef=/*#__PURE__*/_react.default.createRef();_this.__resizeHandler=(0,_lodash.default)(_this.__resizeHandler.bind((0,_assertThisInitialized2.default)(_this)),100,{leading:true});return _this;}(0,_createClass2.default)(WebMap,[{key:"componentDidMount",value:function componentDidMount(){this._isMounted=true;this.initializeWebMap();this.registerEvents();}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;this.viewModel&&this.state.viewModelProps.forEach(function(prop){var name=prop.includes('.')?prop.split('.')[1]:prop;var funcName="set".concat((0,_lodash3.default)(name));var propsValue=(0,_lodash4.default)(_this2.props,prop);var prevPropsValue=(0,_lodash4.default)(prevProps,prop);if(propsValue!==undefined&&propsValue!==null&&!(0,_lodash5.default)(propsValue,prevPropsValue)){_this2.viewModel[funcName](propsValue);}});}},{key:"componentWillUnmount",value:function componentWillUnmount(){var _this$props3=this.props,target=_this$props3.target,autoresize=_this$props3.autoresize;_mapEvent.default.deleteMap(target);_mapEvent.default.deleteWebMap(target);if(autoresize&&this.selfRef.current){(0,_resizeDetector.removeListener)(this.selfRef.current,this.__resizeHandler);}this._isMounted=false;}},{key:"__resizeHandler",value:function __resizeHandler(){this.resize();}},{key:"resize",value:function resize(){if(this.viewModel&&this.viewModel.resize){this.viewModel.resize();}}},{key:"bindMapEvents",value:function bindMapEvents(){var _this3=this;Object.keys(this.props).forEach(function(eventName){if(_interface.MAP_EVENT_NAMES.includes(eventName)){var name=eventName.replace('on','');_this3.bindMapEvent(name.toLowerCase(),_this3.mapEventCallback.bind(_this3));}});}},{key:"bindMapEvent",value:function bindMapEvent(eventName,eventCallback){this.map.on(eventName,eventCallback);}},{key:"mapEventCallback",value:function mapEventCallback(event){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};this.emitMapEvent(event.type,(0,_objectSpread2.default)({mapboxEvent:event},data));}},{key:"emitMapEvent",value:function emitMapEvent(name){var data=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var originEventName="on".concat((0,_lodash2.default)(name));if((0,_util.isFunction)(this.props[originEventName])){this.props[originEventName]((0,_objectSpread2.default)({map:this.map,component:this},data));}}},{key:"render",value:function render(){var spinning=this.state.spinning;var _this$props4=this.props,target=_this$props4.target,children=_this$props4.children;return/*#__PURE__*/(0,_jsxRuntime.jsxs)("div",{id:target,className:"sm-component-web-map",ref:this.selfRef,children:[children,spinning&&/*#__PURE__*/(0,_jsxRuntime.jsx)(_antd.Spin,{size:"large",tip:"\u5730\u56FE\u52A0\u8F7D\u4E2D...",spinning:spinning})]});}}]);return WebMap;}(_react.default.Component);WebMap.defaultProps={target:'map',autoresize:true};var _default=WebMap;exports["default"]=_default;
  13729. /***/ }),
  13730. /***/ 2872:
  13731. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  13732. "use strict";
  13733. var _interopRequireWildcard=(__webpack_require__(5263)["default"]);var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var _SourceListModel=_interopRequireDefault(__webpack_require__(8383));var _geometryUtil=__webpack_require__(3595);var _util=__webpack_require__(9752);__webpack_require__(2395);__webpack_require__(8399);__webpack_require__(8553);var convert=_interopRequireWildcard(__webpack_require__(7888));var _canvg=_interopRequireDefault(__webpack_require__(5973));var _echarts=_interopRequireDefault(__webpack_require__(550));var _EchartsLayer=_interopRequireDefault(__webpack_require__(3094));var _ProvinceCenter=_interopRequireDefault(__webpack_require__(5385));var _MunicipalCenter=_interopRequireDefault(__webpack_require__(2158));var _lodash=_interopRequireDefault(__webpack_require__(4461));var _lodash2=_interopRequireDefault(__webpack_require__(3465));/* eslint-disable */ /* Copyright© 2000 - 2023 SuperMap Software Co.Ltd. All rights reserved.
  13734. * This program are made available under the terms of the Apache License, Version 2.0
  13735. * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html. */ // eslint-disable-line import/extensions
  13736. // eslint-disable-line import/extensions
  13737. var MB_SCALEDENOMINATOR_3857=['559082264.0287178','279541132.0143589','139770566.0071794','69885283.00358972','34942641.50179486','17471320.75089743','8735660.375448715','4367830.1877224357','2183915.093862179','1091957.546931089','545978.7734655447','272989.7734655447','272989.3867327723','136494.6933663862','68247.34668319309','34123.67334159654','17061.83667079827','8530.918335399136','4265.459167699568','2132.729583849784'];var MB_SCALEDENOMINATOR_4326=['5.590822640287176E8','2.795411320143588E8','1.397705660071794E8','6.98852830035897E7','3.494264150179485E7','1.7471320750897426E7','8735660.375448713','4367830.187724357','2183915.0938621783','1091957.5469310891','545978.7734655446','272989.3867327723','136494.69336638614','68247.34668319307','34123.673341596535','17061.836670798268','8530.918335399134'];var DEFAULT_WELLKNOWNSCALESET=['GoogleCRS84Quad','GoogleMapsCompatible','GlobalCRS84Scale'];// 迁徙图最大支持要素数量
  13738. var MAX_MIGRATION_ANIMATION_COUNT=1000;/**
  13739. * @class WebMapViewModel
  13740. * @category ViewModel
  13741. * @classdesc 对接 iPortal/Online 地图类。目前支持地图坐标系包括:'EPSG:3857','EPSG:4326','EPSG:4490','EPSG:4214','EPSG:4610'。
  13742. * @param {number} id - iPortal|Online 地图 ID。
  13743. * @param {Object} options - 参数。
  13744. * @param {string} [options.target='map'] - 地图容器 ID。
  13745. * @param {string} [options.serverUrl="http://www.supermapol.com"] - SuperMap iPortal/Online 服务器地址。当设置 `id` 时有效。
  13746. * @param {string} [options.accessToken] - 用于访问 SuperMap iPortal 、SuperMap Online 中受保护的服务。当设置 `id` 时有效。
  13747. * @param {string} [options.accessKey] - SuperMap iServer 提供的一种基于 Token(令牌)的用户身份验证机制。当设置 `id` 时有效。
  13748. * @param {String} [options.tiandituKey] - 用于访问天地图的服务。当设置 `id` 时有效。
  13749. * @param {boolean} [options.withCredentials=false] - 请求是否携带 cookie。当设置 `id` 时有效。
  13750. * @param {boolean} [options.excludePortalProxyUrl] - server 传递过来的 URL 是否带有代理。当设置 `id` 时有效。
  13751. * @fires WebMapViewModel#mapinitialized
  13752. * @fires WebMapViewModel#getmapinfofailed
  13753. * @fires WebMapViewModel#getwmtsinfofailed
  13754. * @fires WebMapViewModel#getlayerdatasourcefailed
  13755. * @fires WebMapViewModel#addlayerssucceeded
  13756. */var WebMapViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(WebMapViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(WebMapViewModel);function WebMapViewModel(id){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var mapOptions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{style:{version:8,sources:{},layers:[]}};(0,_classCallCheck2.default)(this,WebMapViewModel);_this=_super.call(this);_this.mapParams={};// on: any;
  13757. // fire: any;
  13758. _this.echartslayer=[];_this.canvgsV=[];_this._layers=[];_this.mapId=id;_this.mapOptions=Object.assign({style:{version:8,sources:{},layers:[]}},mapOptions);_this.serverUrl=options.serverUrl||'http://www.supermapol.com';_this.accessToken=options.accessToken;_this.accessKey=options.accessKey;_this.tiandituKey=options.tiandituKey||'';_this.withCredentials=options.withCredentials||false;_this.target=options.target||'map';_this.excludePortalProxyUrl=options.excludePortalProxyUrl;_this.center=mapOptions.center||[];_this.zoom=mapOptions.zoom;_this.echartslayer=[];_this._createWebMap();_this.on('mapinitialized',function(){_this.map.on('remove',function(){_this._stopCanvg();});});return _this;}/**
  13759. * @function WebMapViewModel.prototype.resize
  13760. * @description Map 更新大小。
  13761. */(0,_createClass2.default)(WebMapViewModel,[{key:"resize",value:function resize(){this.map&&this.map.resize();this.echartsLayerResize();}/**
  13762. * @function WebMapViewModel.prototype.EchartsLayerResize
  13763. * @description echartslayer 更新大小。
  13764. */},{key:"echartsLayerResize",value:function echartsLayerResize(){this.echartslayer.forEach(function(echartslayer){echartslayer.chart.resize();});}/**
  13765. * @function WebMapViewModel.prototype.setMapId
  13766. * @description 设置地图 ID。
  13767. * @param {String} mapId - iPortal|Online 地图 ID。
  13768. */},{key:"setMapId",value:function setMapId(mapId){var _this2=this;this.mapId=mapId;setTimeout(function(){_this2._createWebMap();//@ts-ignore
  13769. window.map=_this2.map;},0);}/**
  13770. * @function WebMapViewModel.prototype.setServerUrl
  13771. * @description 设置地图的地址。
  13772. * @param {string} options.serverUrl - 地图的地址。
  13773. */},{key:"setServerUrl",value:function setServerUrl(serverUrl){this.serverUrl=serverUrl;}},{key:"setWithCredentials",value:function setWithCredentials(withCredentials){this.withCredentials=withCredentials;}/**
  13774. * @function WebMapViewModel.prototype.setCRS
  13775. * @description 设置地图的投影。
  13776. * @param {Number} crs - 地图投影。
  13777. */},{key:"setCrs",value:function setCrs(crs){if(this.map){this.mapOptions.crs=crs;//@ts-ignore
  13778. crs&&this.map.setCRS(_mapboxGlEnhance.default.CRS.get(crs));}}/**
  13779. * @function WebMapViewModel.prototype.setZoom
  13780. * @description 设置地图的缩放级别。
  13781. * @param {Number} zoom - 地图缩放级别。
  13782. */},{key:"setZoom",value:function setZoom(zoom){if(this.map){this.mapOptions.zoom=zoom;(zoom||zoom===0)&&this.map.setZoom(zoom);}}/**
  13783. * @function WebMapViewModel.prototype.setCenter
  13784. * @description 设置地图的中心点。
  13785. * @param {Array} center - 地图中心点。
  13786. */},{key:"setCenter",value:function setCenter(center){if(this.map){this.mapOptions.center=center;center&&center.length>0&&this.map.setCenter(center);}}/**
  13787. * @function WebMapViewModel.prototype.setMaxBounds
  13788. * @description 设置地图的最大范围。
  13789. * @param {Array} maxBounds - 地图最大范围。
  13790. */},{key:"setMaxBounds",value:function setMaxBounds(maxBounds){if(this.map){this.mapOptions.maxBounds=maxBounds;maxBounds&&maxBounds.length>0&&this.map.setMaxBounds(maxBounds);}}/**
  13791. * @function WebMapViewModel.prototype.setMinZoom
  13792. * @description 设置地图的最小级别。
  13793. * @param {Number} minZoom - 地图最小级别。
  13794. */},{key:"setMinZoom",value:function setMinZoom(minZoom){if(this.map){this.mapOptions.minZoom=minZoom;(minZoom||minZoom===0)&&this.map.setMinZoom(minZoom);}}/**
  13795. * @function WebMapViewModel.prototype.setMaxZoom
  13796. * @description 设置地图的最大级别。
  13797. * @param {Number} maxZoom - 地图最大级别。
  13798. */},{key:"setMaxZoom",value:function setMaxZoom(maxZoom){if(this.map){this.mapOptions.maxZoom=maxZoom;(maxZoom||maxZoom===0)&&this.map.setMaxZoom(maxZoom);}}/**
  13799. * @function WebMapViewModel.prototype.setRenderWorldCopies
  13800. * @description 设置地图的平铺。
  13801. * @param {Boolean} renderWorldCopies - 地图是否平铺。
  13802. */},{key:"setRenderWorldCopies",value:function setRenderWorldCopies(renderWorldCopies){if(this.map){this.mapOptions.renderWorldCopies=renderWorldCopies;renderWorldCopies&&this.map.setRenderWorldCopies(renderWorldCopies);}}/**
  13803. * @function WebMapViewModel.prototype.setBearing
  13804. * @description 设置地图的方位。
  13805. * @param {Number} bearing - 地图的初始方位。
  13806. */},{key:"setBearing",value:function setBearing(bearing){if(this.map){this.mapOptions.bearing=bearing;(bearing||bearing===0)&&this.map.setBearing(bearing);}}/**
  13807. * @function WebMapViewModel.prototype.setPitch
  13808. * @description 设置地图的俯仰。
  13809. * @param {Number} pitch - 地图的初始俯仰。
  13810. */},{key:"setPitch",value:function setPitch(pitch){if(this.map){this.mapOptions.pitch=pitch;(pitch||pitch===0)&&this.map.setPitch(pitch);}}/**
  13811. * @function WebMapViewModel.prototype.setStyle
  13812. * @description 设置地图的样式。
  13813. * @param {Object} style - 地图的样式。
  13814. */},{key:"setStyle",value:function setStyle(style){if(this.map){this.mapOptions.style=style;style&&this.map.setStyle(style);}}},{key:"getSourceListModel",get:function get(){return this._sourceListModel;}/**
  13815. * @private
  13816. * @function WebMapViewModel.prototype._createWebMap
  13817. * @description 登陆窗口后添加地图图层。
  13818. */},{key:"_createWebMap",value:function _createWebMap(){var _this3=this;if(this.map){this.map.remove();this.center=[];this.zoom=null;this._dataflowService&&this._dataflowService.off('messageSucceeded',this._handleDataflowFeaturesCallback);}if(!this.mapId||!this.serverUrl){this.mapOptions.container=this.target;setTimeout(function(){_this3.map=new _mapboxGlEnhance.default.Map(_this3.mapOptions);_this3.map.on('load',function(){_this3.fire('addlayerssucceeded',{map:_this3.map,mapparams:{},layers:[]});});},0);return;}this._legendList={};this._taskID=new Date();var urlArr=this.serverUrl.split('');if(urlArr[urlArr.length-1]!=='/'){this.serverUrl+='/';}var mapUrl=this.serverUrl+'web/maps/'+this.mapId+'/map';if(this.accessToken||this.accessKey){mapUrl+='?'+(this.accessToken&&!this.accessKey)?'token='+this.accessToken:0;}var filter='getUrlResource.json?url=';if(this.excludePortalProxyUrl&&this.serverUrl.indexOf(filter)>-1){// 大屏需求,或者有加上代理的
  13819. var urlArray=this.serverUrl.split(filter);if(urlArray.length>1){mapUrl=urlArray[0]+filter+this.serverUrl+'web/maps/'+this.mapId+'/map.json';}}this._getMapInfo(mapUrl,this._taskID);}/**
  13820. * @private
  13821. * @function WebMapViewModel.prototype._createMap
  13822. * @description 创建地图。
  13823. */},{key:"_createMap",value:function _createMap(mapInfo){// 获取字体样式
  13824. var fonts=[];var layers=mapInfo.layers;// 获取 label 图层字体类型
  13825. if(layers&&layers.length>0){layers.forEach(function(layer){layer.labelStyle&&fonts.push(layer.labelStyle.fontFamily);},this);}fonts.push("'supermapol-icons'");var fontFamilys=fonts.join(',');// zoom
  13826. var center;center=mapInfo.center&&[mapInfo.center.x,mapInfo.center.y];// center
  13827. var zoom=mapInfo.level||0;zoom=zoom===0?0:zoom-1;if(!center){center=[0,0];}if(this.baseProjection==='EPSG:3857'){center=this._unproject(center);}center=new _mapboxGlEnhance.default.LngLat(center[0],center[1]);// 初始化 map
  13828. this.map=new _mapboxGlEnhance.default.Map({container:this.target,center:this.center.length?this.center:center,zoom:this.zoom||zoom,style:{version:8,sources:{},// "glyphs": 'http://iclsvr.supermap.io/iserver/services/map-beijing/rest/maps/beijingMap/tileFeature/sdffonts/{fontstack}/{range}.pbf',
  13829. layers:[]},// @ts-ignore -------- crs 为 enhance 新加属性
  13830. crs:this.baseProjection,localIdeographFontFamily:fontFamilys||'',renderWorldCopies:false,preserveDrawingBuffer:this.mapOptions.preserveDrawingBuffer||false});/**
  13831. * @event WebMapViewModel#mapinitialized
  13832. * @description Map 初始化成功。
  13833. * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
  13834. */this.fire('mapinitialized',{map:this.map});}/**
  13835. * @private
  13836. * @function WebMapViewModel.prototype._getMapInfo
  13837. * @description 获取地图的 JSON 信息。
  13838. * @param {string} url - 请求地图的 url。
  13839. */},{key:"_getMapInfo",value:function _getMapInfo(url,_taskID){var _this4=this;var mapUrl=url.indexOf('.json')===-1?"".concat(url,".json"):url;SuperMap.FetchRequest.get(mapUrl,null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(mapInfo){_this4.baseProjection=mapInfo.projection;// 存储地图的名称以及描述等信息,返回给用户
  13840. _this4.mapParams={title:mapInfo.title,description:mapInfo.description};// 坐标系异常处理
  13841. if(_mapboxGlEnhance.default.CRS.get(_this4.baseProjection)){_this4._createMap(mapInfo);var layers=mapInfo.layers;_this4.map.on('load',function(){if(mapInfo.baseLayer&&mapInfo.baseLayer.layerType==='MAPBOXSTYLE'){// 添加矢量瓦片服务作为底图
  13842. _this4._addMVTBaseMap(mapInfo);}else{_this4._addBaseMap(mapInfo);}if(!layers||layers.length===0){_this4._sendMapToUser(0,0);}else{_this4._addLayers(layers,_taskID);}});}else{throw Error('不支持当前地图的坐标系');}}).catch(function(error){/**
  13843. * @event WebMapViewModel#getmapinfofailed
  13844. * @description 获取地图信息失败。
  13845. * @property {Object} error - 失败原因。
  13846. */_this4.fire('getmapinfofailed',{error:error});});}},{key:"_addMVTBaseMap",value:function _addMVTBaseMap(mapInfo){var baseLayer=mapInfo.baseLayer,url=baseLayer.dataSource.url;// @ts-ignore
  13847. this.map.addStyle(url);}/**
  13848. * @private
  13849. * @function WebMapViewModel.prototype._addBaseMap
  13850. * @description 添加底图。
  13851. * @param {Object} mapInfo - map 信息。
  13852. */},{key:"_addBaseMap",value:function _addBaseMap(mapInfo){this._createBaseLayer(mapInfo);}/**
  13853. * @private
  13854. * @function WebMapViewModel.prototype._createBaseLayer
  13855. * @description 创建底图。
  13856. * @param {Object} mapInfo - map 信息。
  13857. */},{key:"_createBaseLayer",value:function _createBaseLayer(mapInfo){var layerInfo=mapInfo.baseLayer||mapInfo;var layerType=layerInfo.layerType;// 底图和rest地图兼容
  13858. if(layerType.indexOf('TIANDITU_VEC')>-1||layerType.indexOf('TIANDITU_IMG')>-1||layerType.indexOf('TIANDITU_TER')>-1){layerType=layerType.substr(0,12);}var mapUrls={CLOUD:'http://t2.dituhui.com/FileService/image?map=quanguo&type=web&x={x}&y={y}&z={z}',CLOUD_BLACK:'http://t3.dituhui.com/MapService/getGdp?x={x}&y={y}&z={z}',OSM:'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',GOOGLE:'http://www.google.cn/maps/vt/pb=!1m4!1m3!1i{z}!2i{x}!3i{y}!2m3!1e0!2sm!3i380072576!3m8!2szh-CN!3scn!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m1!1e0',GOOGLE_CN:'https://mt{0-3}.google.cn/vt/lyrs=m&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}',JAPAN_STD:'http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',JAPAN_PALE:'http://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png',JAPAN_RELIEF:'http://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png',JAPAN_ORT:'http://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg'};var url;switch(layerType){case'TIANDITU_VEC':case'TIANDITU_IMG':case'TIANDITU_TER':this._createTiandituLayer(mapInfo);break;case'BING':this._createBingLayer(layerInfo.name);break;case'WMS':this._createWMSLayer(layerInfo);break;case'WMTS':this._createWMTSLayer(layerInfo);break;case'TILE':case'SUPERMAP_REST':this._createDynamicTiledLayer(layerInfo);break;case'CLOUD':case'CLOUD_BLACK':case'OSM':case'JAPAN_ORT':case'JAPAN_RELIEF':case'JAPAN_PALE':case'JAPAN_STD':case'GOOGLE_CN':case'GOOGLE':url=mapUrls[layerType];this._createXYZLayer(layerInfo,url);break;default:break;}}/**
  13859. * @private
  13860. * @function WebMapViewModel.prototype._createTiandituLayer
  13861. * @description 创建天地图底图。
  13862. * @param {Object} mapInfo - map 信息。
  13863. */},{key:"_createTiandituLayer",value:function _createTiandituLayer(mapInfo){var tiandituUrls=this._getTiandituUrl(mapInfo);var layerType=mapInfo.baseLayer.layerType;var isLabel=Boolean(mapInfo.baseLayer.labelLayerVisible);var labelUrl=tiandituUrls['labelUrl'];var tiandituUrl=tiandituUrls['tiandituUrl'];this._addBaselayer(tiandituUrl,'tianditu-layers-'+layerType);isLabel&&this._addBaselayer(labelUrl,'tianditu-label-layers-'+layerType);}/**
  13864. * @private
  13865. * @function WebMapViewModel.prototype._createWMTSLayer
  13866. * @description 创建 WMTS 底图。
  13867. * @param {Object} layerInfo - 地图信息。
  13868. */},{key:"_createWMTSLayer",value:function _createWMTSLayer(layerInfo){var _this5=this;var wmtsUrl=this._getWMTSUrl(layerInfo);this._filterWMTSIsMatched(layerInfo,function(isMatched,matchMaxZoom){isMatched&&_this5._addBaselayer([wmtsUrl],'wmts-layers'+layerInfo.name,0,matchMaxZoom);});}/**
  13869. * @private
  13870. * @function WebMapViewModel.prototype._filterWMTSIsMatched
  13871. * @description 过滤能够跟mapboxgl匹配的wmts服务。
  13872. * @param {Object} mapInfo - map 信息。
  13873. * @callback matchedCallback
  13874. */},{key:"_filterWMTSIsMatched",value:function _filterWMTSIsMatched(mapInfo,matchedCallback){var _this6=this;var isMatched=false;var matchMaxZoom=22;var url=mapInfo.url;var options={withCredentials:false,withoutFormatSuffix:true};SuperMap.FetchRequest.get(url,null,options).then(function(response){return response.text();}).then(function(capabilitiesText){var converts=convert||window.convert;var tileMatrixSet=JSON.parse(converts.xml2json(capabilitiesText,{compact:true,spaces:4})).Capabilities.Contents.TileMatrixSet;for(var i=0;i<tileMatrixSet.length;i++){if(tileMatrixSet[i]['ows:Identifier']&&tileMatrixSet[i]['ows:Identifier']['_text']===mapInfo.tileMatrixSet){if(DEFAULT_WELLKNOWNSCALESET.includes(tileMatrixSet[i]['WellKnownScaleSet']['_text'])){isMatched=true;}else if(tileMatrixSet[i]['WellKnownScaleSet']&&tileMatrixSet[i]['WellKnownScaleSet']['_text']==='Custom'){var matchedScaleDenominator=[];// 坐标系判断
  13875. var defaultCRSScaleDenominators=// @ts-ignore -------- crs 为 enhance 新加属性
  13876. _this6.map.crs==='EPSG:3857'?MB_SCALEDENOMINATOR_3857:MB_SCALEDENOMINATOR_4326;for(var j=0,len=defaultCRSScaleDenominators.length;j<len;j++){if(!tileMatrixSet[i].TileMatrix[j]){break;}if(defaultCRSScaleDenominators[j]!==tileMatrixSet[i].TileMatrix[j]['ScaleDenominator']['_text']){break;}matchedScaleDenominator.push(defaultCRSScaleDenominators[j]);}matchMaxZoom=matchedScaleDenominator.length-1;if(matchedScaleDenominator.length!==0){isMatched=true;}else{throw Error('不支持传入的 TileMatrixSet');}}else{throw Error('不支持传入的 TileMatrixSet');}}}matchedCallback(isMatched,matchMaxZoom);}).catch(function(error){/**
  13877. * @event WebMapViewModel#getwmtsinfofailed
  13878. * @description 获取 WMTS 图层信息失败。
  13879. * @property {Object} error - 失败原因。
  13880. * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
  13881. */_this6.fire('getwmtsinfofailed',{error:error,map:_this6.map});});}/**
  13882. * @private
  13883. * @function WebMapViewModel.prototype._createBingLayer
  13884. * @description 创建 Bing 图层。
  13885. */},{key:"_createBingLayer",value:function _createBingLayer(layerName){var bingUrl='http://dynamic.t0.tiles.ditu.live.com/comp/ch/{quadkey}?it=G,TW,L,LA&mkt=zh-cn&og=109&cstl=w4c&ur=CN&n=z';// @ts-ignore
  13886. this._addBaselayer([bingUrl],'bing-layers-'+layerName);}/**
  13887. * @private
  13888. * @function WebMapViewModel.prototype._createXYZLayer
  13889. * @description 创建 XYZ 底图。
  13890. * @param {String} url - url 地址。
  13891. */},{key:"_createXYZLayer",value:function _createXYZLayer(layerInfo,url){var urlArr=[];if(layerInfo.layerType==='OSM'){var res=url.match(/\w\-\w/g)[0];var start=res[0];var end=res[2];var alphabet='';for(var i=97;i<123;i++){alphabet+=String.fromCharCode(i);}var alphabetArr=alphabet.split('');var startIndex=alphabetArr.indexOf(start);var endIndex=alphabetArr.indexOf(end);var res3=alphabetArr.slice(startIndex,endIndex+1);for(var _i2=0;_i2<res3.length;_i2++){var replaceRes=url.replace(/{\w\-\w}/g,res3[_i2]);urlArr.push(replaceRes);}}else if(layerInfo.layerType==='GOOGLE_CN'){var _res=url.match(/\d\-\d/g)[0];var _start=parseInt(_res[0]);var _end=parseInt(_res[2]);for(var _i4=_start;_i4<=_end;_i4++){var _replaceRes=url.replace(/{\d\-\d}/g,_i4.toString());urlArr.push(_replaceRes);}}else{urlArr=[url];}this._addBaselayer(urlArr,'XYZ-layers-'+layerInfo.name);}/**
  13892. * @private
  13893. * @function WebMapViewModel.prototype._createDynamicTiledLayer
  13894. * @description 创建 iserver 底图。
  13895. * @param {Object} layerInfo - 图层信息。
  13896. */},{key:"_createDynamicTiledLayer",value:function _createDynamicTiledLayer(layerInfo){var url=layerInfo.url+'/zxyTileImage.png?z={z}&x={x}&y={y}';// @ts-ignore -------- setCRS 为 enhance 新加属性
  13897. if(this.map.setCRS&&this.baseProjection!=='EPSG:3857'){url=layerInfo.url+'/image.png?viewBounds={viewBounds}&width={width}&height={height}';}this._addBaselayer([url],'tile-layers-'+layerInfo.name);}/**
  13898. * @private
  13899. * @function WebMapViewModel.prototype._createWMSLayer
  13900. * @description 创建 WMS 图层。
  13901. * @param {Object} layerInfo - 图层信息。
  13902. */},{key:"_createWMSLayer",value:function _createWMSLayer(layerInfo){var WMSUrl=this._getWMSUrl(layerInfo);this._addBaselayer([WMSUrl],'WMS-layers-'+layerInfo.name);}/**
  13903. * @private
  13904. * @function WebMapViewModel.prototype._createVectorLayer
  13905. * @description 创建 Vector 图层。
  13906. * @param {Object} layerInfo - map 信息。
  13907. * @param {Array} features - 属性 信息。
  13908. */},{key:"_createVectorLayer",value:function _createVectorLayer(layerInfo,features){var style=layerInfo.style;var type=layerInfo.featureType;var layerID=layerInfo.layerID;var visible=layerInfo.visible;var layerStyle={style:this._transformStyleToMapBoxGl(style,type),layout:{visibility:visible}};var source={type:'geojson',data:{type:'FeatureCollection',features:features}};this._addOverlayToMap(type,source,layerID,layerStyle);// 如果面有边框
  13909. type==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeLine',visible);}/**
  13910. * @function WebMapViewModel.prototype._getTiandituUrl
  13911. * @private
  13912. * @description 创建天地图url;
  13913. * @param {Object} mapInfo - map 信息。
  13914. */},{key:"_getTiandituUrl",value:function _getTiandituUrl(mapInfo){var re=/t0/gi;var tiandituUrls={tiandituUrl:[],labelUrl:[]};var layerType=mapInfo.baseLayer.layerType.split('_')[1].toLowerCase();var isLabel=Boolean(mapInfo.baseLayer.labelLayerVisible);var url="http://t0.tianditu.com/{layer}_{proj}/wmts?tk=".concat(this.tiandituKey);var labelUrl=url;var layerLabelMap={vec:'cva',ter:'cta',img:'cia'};var tilematrixSet=this.baseProjection==='EPSG:4326'?'c':'w';var options={service:'WMTS',request:'GetTile',style:'default',version:'1.0.0',layer:layerType,tilematrixSet:tilematrixSet,format:'tiles',width:256,height:256};url+=this._getParamString(options,url)+'&tilematrix={z}&tilerow={y}&tilecol={x}';var tiandituUrl=url.replace('{layer}',layerType).replace('{proj}',tilematrixSet);var tiandituUrlArr=[];for(var i=0;i<8;i++){tiandituUrlArr.push(tiandituUrl.replace(re,"t".concat(i)));}tiandituUrls['tiandituUrl']=tiandituUrlArr;// 如果有 label 图层
  13915. if(isLabel){var labelLayer=layerLabelMap[layerType];options.layer=labelLayer;labelUrl+=this._getParamString(options,labelUrl)+'&tilematrix={z}&tilerow={y}&tilecol={x}';labelUrl=labelUrl.replace('{layer}',labelLayer).replace('{proj}',tilematrixSet);var labelUrlArr=[];for(var _i6=0;_i6<8;_i6++){labelUrlArr.push(labelUrl.replace(re,"t".concat(_i6)));}tiandituUrls['labelUrl']=labelUrlArr;}return tiandituUrls;}/**
  13916. * @function WebMapViewModel.prototype._getWMSUrl
  13917. * @private
  13918. * @description 创建 WMS url;
  13919. * @param {Object} mapInfo - map 信息。
  13920. */},{key:"_getWMSUrl",value:function _getWMSUrl(mapInfo){var url=mapInfo.url;url=url.split('?')[0];var strArr=url.split('/');var options={service:'WMS',request:'GetMap',layers:strArr[strArr.length-1],styles:'',format:'image/png',transparent:'true',version:'1.1.1',width:256,height:256,srs:this.baseProjection};var bbox=this.baseProjection==='EPSG:4326'?'{bbox-epsg-4326}':'{bbox-epsg-3857}';url+=this._getParamString(options,url)+"&bbox=".concat(bbox);return url;}/**
  13921. * @private
  13922. * @function WebMapViewModel.prototype._checkUploadToRelationship
  13923. * @description 检查是否上传到关系型
  13924. * @param {String} fileId - 文件的id
  13925. * @returns {Promise<T | never>} 关系型文件一些参数
  13926. */},{key:"_checkUploadToRelationship",value:function _checkUploadToRelationship(fileId){return SuperMap.FetchRequest.get("".concat(this.serverUrl,"web/datas/").concat(fileId,"/datasets.json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(result){return result;});}/**
  13927. * @private
  13928. * @function ol.supermap.WebMap.prototype._getDataService
  13929. * @description 获取上传的数据信息
  13930. * @param {String} fileId - 文件id
  13931. * @param {String} datasetName 数据服务的数据集名称
  13932. * @returns {Promise<T | never>} 数据的信息
  13933. */},{key:"_getDataService",value:function _getDataService(fileId,datasetName){return SuperMap.FetchRequest.get("".concat(this.serverUrl,"web/datas/").concat(fileId,".json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(result){result.fileId=fileId;result.datasetName=datasetName;return result;});}/**
  13934. * @private
  13935. * @function WebMapViewModel.prototype._getService
  13936. * @description 获取当前数据发布的服务中的某种类型服务
  13937. * @param {Array} services 服务集合
  13938. * @param {String} type 服务类型,RESTDATA, RESTMAP
  13939. * @returns {Object} 服务
  13940. */},{key:"_getService",value:function _getService(services,type){var service=services.filter(function(info){return info&&info.serviceType===type;});return service[0];}},{key:"_getServiceInfoFromLayer",value:function _getServiceInfoFromLayer(layerIndex,len,layer,dataItemServices,datasetName,featureType,info){var _this7=this;var isMapService=info?!info.isMvt:layer.layerType==='HOSTED_TILE',isAdded=false;dataItemServices.forEach(function(service,index){if(isAdded){return;}//有服务了,就不需要循环
  13941. if(service&&isMapService&&service.serviceType==='RESTMAP'){isAdded=true;//地图服务,判断使用mvt还是tile
  13942. _this7._getTileLayerInfo(service.address).then(function(restMaps){restMaps.forEach(function(restMapInfo){var bounds=restMapInfo.bounds;layer.layerType='TILE';layer.orginEpsgCode=_this7.baseProjection;layer.units=restMapInfo.coordUnit&&restMapInfo.coordUnit.toLowerCase();layer.extent=[bounds.left,bounds.bottom,bounds.right,bounds.top];layer.visibleScales=restMapInfo.visibleScales;layer.url=restMapInfo.url;layer.sourceType='TILE';_this7._createBaseLayer(layer);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);});});}// TODO 对接 MVT
  13943. else if(service&&!isMapService&&service.serviceType==='RESTDATA'){if(info&&info.isMvt){_this7._addVectorLayer(info,layer,featureType);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);}else{//数据服务
  13944. isAdded=true;//关系型文件发布的数据服务
  13945. _this7._getDatasources(service.address).then(function(datasourceName){layer.dataSource.dataSourceName=datasourceName+':'+datasetName;layer.dataSource.url="".concat(service.address,"/data");_this7._getFeatureBySQL(layer.dataSource.url,[layer.dataSource.dataSourceName||layer.name],function(result){var features=_this7._parseGeoJsonData2Feature({allDatas:{features:result.result.features.features},fileCode:layer.projection,featureProjection:_this7.baseProjection});_this7._addLayer(layer,features,layerIndex);_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);},function(err){_this7.layerAdded++;_this7._sendMapToUser(_this7.layerAdded,len);_this7.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this7.map});});});}}},this);if(!isAdded){//循环完成了,也没有找到合适的服务。有可能服务被删除
  13946. this.layerAdded++;this._sendMapToUser(this.layerAdded,len);this.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:this.map});}}/**
  13947. * @private
  13948. * @function WebMapViewModel.prototype._getDatasources
  13949. * @description 获取关系型文件发布的数据服务中数据源的名称
  13950. * @param {String} url - 获取数据源信息的url
  13951. * @returns {Promise<T | never>} 数据源名称
  13952. */},{key:"_getDatasources",value:function _getDatasources(url){return SuperMap.FetchRequest.get("".concat(url,"/data/datasources.json")).then(function(response){return response.json();}).then(function(datasource){var datasourceNames=datasource.datasourceNames;return datasourceNames[0];});}/**
  13953. * @private
  13954. * @function WebMapViewModel.prototype._getTileLayerInfo
  13955. * @description 获取地图服务的信息
  13956. * @param {String} url 地图服务的url(没有地图名字)
  13957. * @returns {Promise<T | never>} 地图服务信息
  13958. */},{key:"_getTileLayerInfo",value:function _getTileLayerInfo(url){var _this8=this;var proxyUrl=this.serverUrl+'apps/viewer/getUrlResource.json?url=';var requestUrl=proxyUrl+encodeURIComponent(url);var epsgCode=this.baseProjection.split('EPSG:')[1];return SuperMap.FetchRequest.get("".concat(requestUrl,"/maps.json"),null,{withCredentials:this.withCredentials}).then(function(response){return response.json();}).then(function(mapInfo){var promises=[];if(mapInfo){mapInfo.forEach(function(info){var promise=SuperMap.FetchRequest.get("".concat(proxyUrl).concat(info.path,".json?prjCoordSys=").concat(JSON.stringify({epsgCode:epsgCode})),null,{withCredentials:_this8.withCredentials}).then(function(response){return response.json();}).then(function(restMapInfo){restMapInfo.url=info.path;return restMapInfo;});promises.push(promise);});}return Promise.all(promises).then(function(allRestMaps){return allRestMaps;});});}/**
  13959. * @private
  13960. * @function WebMapViewModel.prototype._addLayers
  13961. * @description 添加叠加图层。
  13962. * @param {Object} mapInfo - 图层信息。
  13963. */},{key:"_addLayers",value:function _addLayers(layers,_taskID){var _this9=this;// 存储地图上所有的图层对象
  13964. this._layers=layers;var features;this.layerAdded=0;var len=layers.length;if(len>0){layers.forEach(function(layer,index){if(layer.dataSource&&layer.dataSource.serverId||layer.layerType==='MARKER'||layer.layerType==='HOSTED_TILE'){//数据存储到iportal上了
  13965. var dataSource=layer.dataSource,serverId=dataSource?dataSource.serverId:layer.serverId;if(!serverId){_this9._addLayer(layer,null,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);return;}if(layer.layerType==='MARKER'||dataSource&&(!dataSource.accessType||dataSource.accessType==='DIRECT')){//原来二进制文件
  13966. var url="".concat(_this9.serverUrl,"web/datas/").concat(serverId,"/content.json?pageSize=9999999&currentPage=1");if(_this9.accessToken){url="".concat(url,"&").concat(_this9.accessKey,"=").concat(_this9.accessToken);}SuperMap.FetchRequest.get(url,null,{withCredentials:_this9.withCredentials}).then(function(response){return response.json();}).then(function(data){if(_taskID!==_this9._taskID){return;}if(data.succeed===false){//请求失败
  13967. _this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);// -----------------------todo-----------------
  13968. _this9.fire('getlayerdatasourcefailed',{error:data.error,layer:layer,map:_this9.map});return;}if(data&&data.type){if(data.type==='JSON'||data.type==='GEOJSON'){data.content=JSON.parse(data.content.trim());features=_this9._formatGeoJSON(data.content);}else if(data.type==='EXCEL'||data.type==='CSV'){features=_this9._excelData2Feature(data.content);}_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);}}).catch(function(error){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:error,layer:layer,map:_this9.map});});}else{//关系型文件
  13969. var isMapService=layer.layerType==='HOSTED_TILE',_serverId=dataSource?dataSource.serverId:layer.serverId;_this9._checkUploadToRelationship(_serverId).then(function(result){if(result&&result.length>0){var datasetName=result[0].name,featureType=result[0].type.toUpperCase();_this9._getDataService(_serverId,datasetName).then(function(data){var dataItemServices=data.dataItemServices;if(dataItemServices.length===0){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:_this9.map});return;}if(isMapService){var dataService=dataItemServices.filter(function(info){return info&&info.serviceType==='RESTDATA';})[0];_this9._isMvt(dataService.address,datasetName).then(function(info){_this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType,info);}).catch(function(){//判断失败就走之前逻辑,>数据量用tile
  13970. _this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType);});}else{_this9._getServiceInfoFromLayer(index,len,layer,dataItemServices,datasetName,featureType);}});}else{_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:null,layer:layer,map:_this9.map});}}).catch(function(error){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:error,layer:layer,map:_this9.map});});}}else if(layer.layerType==='SUPERMAP_REST'||layer.layerType==='TILE'||layer.layerType==='WMS'||layer.layerType==='WMTS'){_this9._createBaseLayer(layer);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);}else if(layer.dataSource&&layer.dataSource.type==='REST_DATA'){//从restData获取数据
  13971. var _dataSource=layer.dataSource;_this9._getFeatureBySQL(_dataSource.url,[_dataSource.dataSourseName||layer.name],function(result){features=_this9._parseGeoJsonData2Feature({allDatas:{features:result.result.features.features},fileCode:layer.projection,featureProjection:_this9.baseProjection});_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(err){_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});});}else if(layer.dataSource&&layer.dataSource.type==='REST_MAP'&&layer.dataSource.url){_this9._queryFeatureBySQL(layer.dataSource.url,layer.dataSource.layerName,function(result){var recordsets=result&&result.result.recordsets;var recordset=recordsets&&recordsets[0];var attributes=recordset.fields;if(recordset&&attributes){var fileterAttrs=[];for(var i in attributes){var value=attributes[i];if(value.indexOf('Sm')!==0||value==='SmID'){fileterAttrs.push(value);}}_this9._getFeatures(fileterAttrs,layer,function(features){_this9._addLayer(layer,features,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(err){_this9.layerAdded++;_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});});}},function(err){_this9.fire('getlayerdatasourcefailed',{error:err,layer:layer,map:_this9.map});},'smid=1');}else if(layer.layerType==='DATAFLOW_POINT_TRACK'||layer.layerType==='DATAFLOW_HEAT'){_this9._getDataflowInfo(layer,function(){_this9._addLayer(layer,null,index);_this9.layerAdded++;_this9._sendMapToUser(_this9.layerAdded,len);},function(e){_this9.layerAdded++;// TODO fire faild
  13972. });}},this);}}/**
  13973. * @private
  13974. * @function WebMapViewModel.prototype._getFeatures
  13975. */},{key:"_getFeatures",value:function _getFeatures(fields,layerInfo,resolve,reject){var _this10=this;var source=layerInfo.dataSource;// 示例数据
  13976. var fileCode=layerInfo.projection;this._queryFeatureBySQL(source.url,source.layerName,function(result){var recordsets=result.result.recordsets[0];var features=recordsets.features.features;var featuresObj=_this10._parseGeoJsonData2Feature({allDatas:{features:features},fileCode:fileCode,featureProjection:_this10.baseProjection});resolve(featuresObj);},function(err){reject(err);},null,fields);}/**
  13977. * @private
  13978. * @function WebMapViewModel.prototype._addLayer
  13979. * @description 将单个图层添加到地图上。
  13980. * @param layerInfo 某个图层的图层信息
  13981. * @param {Array.<GeoJSON>} features - feature。
  13982. */},{key:"_addLayer",value:function _addLayer(layerInfo,features,index){var layerType=layerInfo.layerType;layerInfo.layerID=layerType+'-'+layerInfo.name+'-'+index;layerInfo.visible=layerInfo.visible?'visible':'none';// mbgl 目前不能处理 geojson 复杂面情况
  13983. // mbgl isssue https://github.com/mapbox/mapbox-gl-js/issues/7023
  13984. if(features&&features[0]&&features[0].geometry.type==='Polygon'){features=(0,_geometryUtil.handleMultyPolygon)(features);}if(layerInfo.style&&layerInfo.filterCondition){// 将 feature 根据过滤条件进行过滤, 分段专题图和单值专题图因为要计算 styleGroup 所以暂时不过滤
  13985. if(layerType!=='RANGE'&&layerType!=='UNIQUE'&&layerType!=='RANK_SYMBOL'){features=this._getFiterFeatures(layerInfo.filterCondition,features);}}if(features&&layerInfo.projection&&layerInfo.projection!=='EPSG:4326'){this._transformFeatures(features);}if(layerType==='VECTOR'){if(layerInfo.featureType==='POINT'){if(layerInfo.style.type==='SYMBOL_POINT'){this._createSymbolLayer(layerInfo,features);}else{this._createGraphicLayer(layerInfo,features);}}else{// 线和面
  13986. this._createVectorLayer(layerInfo,features);}}else if(layerType==='UNIQUE'){this._createUniqueLayer(layerInfo,features);}else if(layerType==='RANGE'){this._createRangeLayer(layerInfo,features);}else if(layerType==='HEAT'){this._createHeatLayer(layerInfo,features);}else if(layerType==='MARKER'){this._createMarkerLayer(layerInfo,features);}else if(layerInfo.layerType==='MIGRATION'){this._createMigrationLayer(layerInfo,features);}else if(layerInfo.layerType==='RANK_SYMBOL'){this._createRankSymbolLayer(layerInfo,features);}else if(layerInfo.layerType==='DATAFLOW_POINT_TRACK'||layerInfo.layerType==='DATAFLOW_HEAT'){this._createDataflowLayer(layerInfo);}if(layerInfo.labelStyle&&layerInfo.labelStyle.labelField&&layerInfo.layerType!=='DATAFLOW_POINT_TRACK'){// 存在标签专题图
  13987. this._addLabelLayer(layerInfo,features);}}},{key:"_createDataflowLayer",value:function _createDataflowLayer(layerInfo){var dataflowService=new _mapboxGlEnhance.default.supermap.DataFlowService(layerInfo.wsUrl).initSubscribe();this._handleDataflowFeaturesCallback=this._handleDataflowFeatures.bind(this,layerInfo);dataflowService.on('messageSucceeded',this._handleDataflowFeaturesCallback);this._dataflowService=dataflowService;}},{key:"_handleDataflowFeatures",value:function _handleDataflowFeatures(layerInfo,e){var features=e.data&&JSON.parse(e.data);// this._transformFeatures([features]); // TODO 坐标系
  13988. this.fire('dataflowfeatureupdated',{features:features,identifyField:layerInfo.identifyField,layerID:layerInfo.layerID});if(layerInfo.filterCondition){//过滤条件
  13989. var condition=this._replaceFilterCharacter(layerInfo.filterCondition);var sql='select * from json where ('+condition+')';var filterResult=window['jsonsql'].query(sql,{attributes:features&&features.properties});if(filterResult&&filterResult.length>0){this._addDataflowLayer(layerInfo,features);}}else{this._addDataflowLayer(layerInfo,features);}}},{key:"_getDataFlowRotateStyle",value:function _getDataFlowRotateStyle(features,directionField,identifyField){var iconRotateExpression=['match',['get',identifyField]];features.forEach(function(feature){var value;if(directionField!==undefined&&directionField!=='未设置'&&directionField!=='None'){value=feature.properties[directionField];}else{value=0;}if(value>360||value<0){return null;}// @ts-ignore
  13990. iconRotateExpression.push(feature.properties[identifyField],parseInt(value));});// @ts-ignore
  13991. iconRotateExpression.push(0);return iconRotateExpression;}},{key:"_addDataflowLayer",value:function _addDataflowLayer(layerInfo,feature){var layerID=layerInfo.layerID;if(layerInfo.layerType==='DATAFLOW_HEAT'){if(!this.map.getSource(layerID)){this._createHeatLayer(layerInfo,[feature]);}else{this._updateDataFlowFeature(layerID,feature,layerInfo);}}else{var layerStyle=layerInfo.pointStyle;layerInfo.style=layerStyle;if(!this.map.getSource(layerID)){var iconRotateExpression=this._getDataFlowRotateStyle(feature?[feature]:[],layerInfo.directionField,layerInfo.identifyField);if(['BASIC_POINT','SVG_POINT','IMAGE_POINT'].includes(layerStyle.type)){this._createGraphicLayer(layerInfo,[feature],null,iconRotateExpression);}else{this._createSymbolLayer(layerInfo,[feature],null,iconRotateExpression);}}else{this._updateDataFlowFeature(layerID,feature,layerInfo,'point');}if(layerInfo.labelStyle&&layerInfo.visible){if(!this.map.getSource(layerID+'label')){this._addLabelLayer(layerInfo,[feature]);}else{this._updateDataFlowFeature(layerID+'label',feature,layerInfo);}}if(layerInfo.lineStyle&&layerInfo.visible){if(!this.map.getSource(layerID+'-line')){var geometry=feature&&feature.geometry.coordinates||[];var lineFeature={type:'Feature',properties:feature&&feature.properties,geometry:{type:'LineString',coordinates:[geometry]}};this._createVectorLayer({style:layerInfo.lineStyle,featureType:'LINE',visible:'visible',layerID:layerID+'-line'},[lineFeature]);}else{this._updateDataFlowFeature(layerID+'-line',feature,layerInfo,'line');}}}}},{key:"_updateDataFlowFeature",value:function _updateDataFlowFeature(sourceID,newFeature,layerInfo,type){var identifyField=layerInfo.identifyField,maxPointCount=layerInfo.maxPointCount,directionField=layerInfo.directionField;// @ts-ignore
  13992. var features=(0,_lodash2.default)(this.map.getSource(sourceID)._data.features);var has=false;features.map(function(item,index){if(newFeature&&item.properties[identifyField]===newFeature.properties[identifyField]){has=true;if(type==='line'){var coordinates=item.geometry.coordinates;coordinates.push(newFeature.geometry.coordinates);if(maxPointCount&&coordinates.length>maxPointCount){coordinates.splice(0,coordinates.length-maxPointCount);}features[index].geometry.coordinates=coordinates;}else{features[index]=newFeature;}}});if(!has){if(type==='line'){features.push({type:'Feature',properties:newFeature.properties,geometry:{type:'LineString',coordinates:[newFeature.geometry.coordinates]}});}else{features.push(newFeature);}}// @ts-ignore
  13993. this.map.getSource(sourceID).setData({type:'FeatureCollection',features:features});if(type==='point'){var _type=layerInfo.pointStyle.type;var iconRotateExpression=this._getDataFlowRotateStyle(features,directionField,identifyField);if(['SVG_POINT','IMAGE_POINT'].includes(_type)){this.map.setLayoutProperty(sourceID,'icon-rotate',iconRotateExpression);}else if(_type==='SYMBOL_POINT'){this.map.setLayoutProperty(sourceID,'text-rotate',iconRotateExpression);}}}},{key:"_getDataflowInfo",value:function _getDataflowInfo(layerInfo,success,faild){var url=layerInfo.url,token;var requestUrl="".concat(url,".json");if(layerInfo.credential&&layerInfo.credential.token){token=layerInfo.credential.token;requestUrl+="?token=".concat(token);}SuperMap.FetchRequest.get(requestUrl).then(function(response){return response.json();}).then(function(result){if(result&&result.featureMetaData){layerInfo.featureType=result.featureMetaData.featureType.toUpperCase();layerInfo.dataSource={dataTypes:{}};if(result.featureMetaData.fieldInfos&&result.featureMetaData.fieldInfos.length>0){result.featureMetaData.fieldInfos.forEach(function(data){var name=data.name.trim();if(data.type==='TEXT'){layerInfo.dataSource.dataTypes[name]='STRING';}else if(['DOUBLE','INT','FLOAT','LONG','SHORT'].includes(data.type)){layerInfo.dataSource.dataTypes[name]='NUMBER';}else{layerInfo.dataSource.dataTypes[name]='UNKNOWN';}});}layerInfo.wsUrl=result.urls[0].url;layerInfo.name=result.urls[0].url.split('iserver/services/')[1].split('/dataflow')[0];success();}else{//失败也要到成功会调函数中,否则不会继续执行
  13994. faild();}}).catch(function(){faild();});}},{key:"_createMigrationLayer",value:function _createMigrationLayer(layerInfo,features){window['echarts']=_echarts.default;var properties=this._getFeatureProperties(features);var lineData=this._createLinesData(layerInfo,properties);var pointData=this._createPointsData(lineData,layerInfo,properties);var options=this._createOptions(layerInfo,lineData,pointData);var echartslayer=new _EchartsLayer.default(this.map);echartslayer.chart.setOption(options);this.echartslayer.push(echartslayer);}},{key:"_createOptions",value:function _createOptions(layerInfo,lineData,pointData){var series;var lineSeries=this._createLineSeries(layerInfo,lineData);if(pointData&&pointData.length){var pointSeries=this._createPointSeries(layerInfo,pointData);series=lineSeries.concat(pointSeries);}else{series=lineSeries.slice();}var options={GLMap:{roam:true},// geo: {
  13995. // map: 'GLMap',
  13996. // label: {
  13997. // emphasis: {
  13998. // show: false
  13999. // }
  14000. // },
  14001. // roam: true,
  14002. // itemStyle: {
  14003. // normal: {
  14004. // areaColor: '#323c48',
  14005. // borderColor: '#404a59'
  14006. // },
  14007. // emphasis: {
  14008. // areaColor: '#2a333d'
  14009. // }
  14010. // }
  14011. // },
  14012. series:series};return options;}},{key:"_createPointSeries",value:function _createPointSeries(layerInfo,pointData){var lineSetting=layerInfo.lineSetting;var animationSetting=layerInfo.animationSetting;var labelSetting=layerInfo.labelSetting;var pointSeries=[{name:'point-series',coordinateSystem:'GLMap',zlevel:2,label:{normal:{show:labelSetting.show,position:'right',formatter:'{b}',color:labelSetting.color,fontFamily:labelSetting.fontFamily}},itemStyle:{normal:{color:lineSetting.color||labelSetting.color}},data:pointData}];if(animationSetting.show){// 开启动画
  14013. // @ts-ignore
  14014. pointSeries[0].type='effectScatter';// @ts-ignore
  14015. pointSeries[0].rippleEffect={brushType:'stroke'};}else{// 关闭动画
  14016. // @ts-ignore
  14017. pointSeries[0].type='scatter';}return pointSeries;}},{key:"_createLineSeries",value:function _createLineSeries(layerInfo,lineData){var lineSetting=layerInfo.lineSetting;var animationSetting=layerInfo.animationSetting;var linesSeries=[// 轨迹线样式
  14018. {name:'line-series',coordinateSystem:'GLMap',type:'lines',zlevel:1,effect:{show:animationSetting.show,constantSpeed:animationSetting.constantSpeed,trailLength:0,symbol:animationSetting.symbol,symbolSize:animationSetting.symbolSize},lineStyle:{normal:{color:lineSetting.color,type:lineSetting.type,width:lineSetting.width,opacity:lineSetting.opacity,curveness:lineSetting.curveness}},data:lineData}];if(lineData.length>=MAX_MIGRATION_ANIMATION_COUNT){// @ts-ignore
  14019. linesSeries[0].large=true;// @ts-ignore
  14020. linesSeries[0].largeThreshold=100;// @ts-ignore
  14021. linesSeries[0].blendMode='lighter';}return linesSeries;}},{key:"_createLinesData",value:function _createLinesData(layerInfo,properties){var data=[];if(properties&&properties.length){// 重新获取数据
  14022. var from=layerInfo.from,to=layerInfo.to,fromCoord,toCoord;if(from.type==='XY_FIELD'&&from['xField']&&from['yField']&&to['xField']&&to['yField']){properties.forEach(function(property){var fromX=property[from['xField']],fromY=property[from['yField']],toX=property[to['xField']],toY=property[to['yField']];if(!fromX||!fromY||!toX||!toY){return;}fromCoord=[property[from['xField']],property[from['yField']]];toCoord=[property[to['xField']],property[to['yField']]];data.push({coords:[fromCoord,toCoord]});});}else if(from.type==='PLACE_FIELD'&&from['field']&&to['field']){var centerDatas=_ProvinceCenter.default.concat(_MunicipalCenter.default);properties.forEach(function(property){var fromField=property[from['field']],toField=property[to['field']];fromCoord=centerDatas.find(function(item){return _mapboxGlEnhance.default.supermap.Util.isMatchAdministrativeName(item.name,fromField);});toCoord=centerDatas.find(function(item){return _mapboxGlEnhance.default.supermap.Util.isMatchAdministrativeName(item.name,toField);});if(!fromCoord||!toCoord){return;}data.push({coords:[fromCoord.coord,toCoord.coord]});});}}return data;}},{key:"_createPointsData",value:function _createPointsData(lineData,layerInfo,properties){var data=[],labelSetting=layerInfo.labelSetting;// 标签隐藏则直接返回
  14023. if(!labelSetting.show||!lineData.length){return data;}var fromData=[],toData=[];lineData.forEach(function(item,idx){var coords=item.coords,fromCoord=coords[0],toCoord=coords[1],fromProperty=properties[idx][labelSetting.from],toProperty=properties[idx][labelSetting.to];// 起始字段去重
  14024. var f=fromData.find(function(d){return d.value[0]===fromCoord[0]&&d.value[1]===fromCoord[1];});!f&&fromData.push({name:fromProperty,value:fromCoord});// 终点字段去重
  14025. var t=toData.find(function(d){return d.value[0]===toCoord[0]&&d.value[1]===toCoord[1];});!t&&toData.push({name:toProperty,value:toCoord});});data=fromData.concat(toData);return data;}},{key:"_createRankSymbolLayer",value:function _createRankSymbolLayer(layerInfo,features){var fieldName=layerInfo.themeSetting.themeField;var style=layerInfo.style;var featureType=layerInfo.featureType;var styleSource=this._createRankStyleSource(layerInfo,features,layerInfo.featureType);var styleGroups=styleSource.styleGroups;features=this._getFiterFeatures(layerInfo.filterCondition,features);// 获取 expression
  14026. var expression=['match',['get','index']];features.forEach(function(row){var tartget=parseFloat(row.properties[fieldName]);if(styleGroups){for(var i=0;i<styleGroups.length;i++){if(styleGroups[i].start<=tartget&&tartget<styleGroups[i].end){var radius=style.type==='SYMBOL_POINT'||style.type==='IMAGE_POINT'?style.type==='SYMBOL_POINT'?styleGroups[i].radius*2:Number.parseFloat((styleGroups[i].radius/style.imageInfo.size.h).toFixed(2))*2:styleGroups[i].radius;expression.push(row.properties['index'],radius);}}}// @ts-ignore
  14027. !tartget&&expression.push(row.properties['index'],1);},this);// @ts-ignore
  14028. expression.push(1);if(style.type==='SYMBOL_POINT'){this._createSymbolLayer(layerInfo,features,expression);}else if(style.type==='IMAGE_POINT'){this._createGraphicLayer(layerInfo,features,expression);}else{var source={type:'geojson',data:{type:'FeatureCollection',features:features}};// 获取样式
  14029. var layerStyle={layout:{visibility:layerInfo.visible}};layerStyle.style=this._transformStyleToMapBoxGl(style,featureType,expression,'circle-radius');var layerID=layerInfo.layerID;this._addOverlayToMap(featureType,source,layerID,layerStyle);}}},{key:"_createRankStyleSource",value:function _createRankStyleSource(parameters,features,featureType){var themeSetting=parameters.themeSetting,themeField=themeSetting.themeField;var styleGroups=this._getRankStyleGroup(themeField,features,parameters,featureType);// @ts-ignore
  14030. return styleGroups?{parameters:parameters,styleGroups:styleGroups}:false;}},{key:"_getRankStyleGroup",value:function _getRankStyleGroup(themeField,features,parameters,featureType){// 找出所有的单值
  14031. var values=[],segements=[],style=parameters.style,themeSetting=parameters.themeSetting,segmentMethod=themeSetting.segmentMethod,segmentCount=themeSetting.segmentCount,customSettings=themeSetting.customSettings,minR=parameters.themeSetting.minRadius,maxR=parameters.themeSetting.maxRadius;features.forEach(function(feature){var properties=feature.properties,value=properties[themeField];// 过滤掉空值和非数值
  14032. if(value==null||!_mapboxGlEnhance.default.supermap.Util.isNumber(value)){return;}values.push(Number(value));});try{segements=SuperMap.ArrayStatistic.getArraySegments(values,segmentMethod,segmentCount);}catch(error){console.error(error);}// 处理自定义 分段
  14033. for(var i=0;i<segmentCount;i++){if(i in customSettings){var startValue=customSettings[i]['segment']['start'],endValue=customSettings[i]['segment']['end'];startValue!=null&&(segements[i]=startValue);endValue!=null&&(segements[i+1]=endValue);}}//生成styleGroup
  14034. var styleGroup=[];if(segements&&segements.length){var len=segements.length,incrementR=(maxR-minR)/(len-1),// 半径增量
  14035. start,end,radius=Number(((maxR+minR)/2).toFixed(2));for(var _i8=0;_i8<len-1;_i8++){start=Number(segements[_i8].toFixed(2));end=Number(segements[_i8+1].toFixed(2));// 这里特殊处理以下分段值相同的情况(即所有字段值相同)
  14036. radius=start===end?radius:minR+Math.round(incrementR*_i8);// 最后一个分段时将end+0.01,避免取不到最大值
  14037. end=_i8===len-2?end+0.01:end;// 处理自定义 半径
  14038. radius=customSettings[_i8]&&customSettings[_i8].radius?customSettings[_i8].radius:radius;style.radius=radius;styleGroup.push({radius:radius,start:start,end:end});}return styleGroup;}else{return false;}}/**
  14039. * @private
  14040. * @function WebMapViewModel.prototype._addLabelLayer
  14041. * @description 添加标签图层。
  14042. * @param layerInfo 某个图层的图层信息。
  14043. * @param {Array.<GeoJSON>} features - feature。
  14044. */},{key:"_addLabelLayer",value:function _addLabelLayer(layerInfo,features){var labelStyle=layerInfo.labelStyle;this.map.addLayer({id:layerInfo.layerID+'label',type:'symbol',source:{type:'geojson',data:{type:'FeatureCollection',features:features}},paint:{'text-color':labelStyle.fill,'text-halo-color':'rgba(255,255,255,0.8)','text-halo-width':parseFloat(labelStyle.fontSize)||12},layout:{'text-field':"{".concat(labelStyle.labelField,"}"),'text-size':parseFloat(labelStyle.fontSize)||12,'text-offset':labelStyle.offsetX?[labelStyle.offsetX/10||0,labelStyle.offsetY/10||0]:[0,-2.5],'text-font':['DIN Offc Pro Italic','Arial Unicode MS Regular'],visibility:layerInfo.visible}});}/**
  14045. * @private
  14046. * @function WebMapViewModel.prototype._createSymbolLayer
  14047. * @description 添加 symbol 图层。
  14048. * @param layerInfo 某个图层的图层信息。
  14049. * @param {Array.<GeoJSON>} features - feature。
  14050. */},{key:"_createSymbolLayer",value:function _createSymbolLayer(layerInfo,features,textSize,textRotateExpresion){// 用来请求symbol_point字体文件
  14051. var target=document.getElementById("".concat(this.target));target.classList.add('supermapol-icons-map');var style=layerInfo.style;var unicode=layerInfo.style.unicode;var text=String.fromCharCode(parseInt(unicode.replace(/^&#x/,''),16));var layerID=layerInfo.layerID;this.map.addSource(layerID,{type:'geojson',data:{type:'FeatureCollection',features:[]}});this.map.addLayer({id:layerID,type:'symbol',source:layerID,paint:{'text-color':style.fillColor},layout:{'text-field':text,'text-size':textSize||style.fontSize&&parseFloat(style.fontSize)||12,'text-font':['DIN Offc Pro Italic','Arial Unicode MS Regular'],'text-rotate':textRotateExpresion||0,visibility:layerInfo.visible}});// @ts-ignore
  14052. this.map.getSource(layerID).setData({type:'FeatureCollection',features:features});}/**
  14053. * @private
  14054. * @function WebMapViewModel.prototype._createGraphicLayer
  14055. * @description 创建 Graphic 图层。
  14056. * @param {Object} layerInfo - map 信息。
  14057. * @param {Array} features - 属性 信息。
  14058. */},{key:"_createGraphicLayer",value:function _createGraphicLayer(layerInfo,features,iconSizeExpression,iconRotateExpression){var _this11=this;var style=layerInfo.style;var layerID=layerInfo.layerID;var source={type:'geojson',data:{type:'FeatureCollection',features:features}};if(style.type==='IMAGE_POINT'){var imageInfo=style.imageInfo;this.map.loadImage(imageInfo.url,function(error,image){if(error){console.log(error);}var iconSize=Number.parseFloat((style.radius/image.height).toFixed(2))*2;_this11.map.addImage('imageIcon',image);_this11.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':'imageIcon','icon-size':iconSizeExpression||iconSize,visibility:layerInfo.visible,'icon-rotate':iconRotateExpression||0}});});}else if(style.type==='SVG_POINT'){var svgUrl=style.url;if(!this._svgDiv){this._svgDiv=document.createElement('div');document.body.appendChild(this._svgDiv);}this._getCanvasFromSVG(svgUrl,this._svgDiv,function(canvas){var imgUrl=canvas.toDataURL('img/png');imgUrl&&_this11.map.loadImage(imgUrl,function(error,image){if(error){console.log(error);}var iconSize=Number.parseFloat((style.radius/canvas.width).toFixed(2));_this11.map.addImage('imageIcon',image);_this11.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':'imageIcon','icon-size':iconSizeExpression||iconSize,visibility:layerInfo.visible,'icon-rotate':iconRotateExpression||0}});});});}else{var layerStyle={style:this._transformStyleToMapBoxGl(style,layerInfo.featureType),layout:{visibility:layerInfo.visible}};this._addOverlayToMap('POINT',source,layerID,layerStyle);}}/**
  14059. * @private
  14060. * @function WebMapViewModel.prototype._createUniqueLayer
  14061. * @description 创建单值图层。
  14062. * @param layerInfo 某个图层的图层信息
  14063. * @param features 图层上的 feature
  14064. */},{key:"_createUniqueLayer",value:function _createUniqueLayer(layerInfo,features){var styleGroup=this._getUniqueStyleGroup(layerInfo,features);features=this._getFiterFeatures(layerInfo.filterCondition,features);var style=layerInfo.style;var themeField=layerInfo.themeSetting.themeField;Object.keys(features[0].properties).forEach(function(key){key.toLocaleUpperCase()===themeField.toLocaleUpperCase()&&(themeField=key);});var type=layerInfo.featureType;var expression=['match',['get','index']];var layerID=layerInfo.layerID;features.forEach(function(row){styleGroup.forEach(function(item){if(item.value===row.properties[themeField]){expression.push(row.properties['index'],item.color);}});});expression.push('#ffffff');// 图例相关
  14065. this._initLegendConfigInfo(layerInfo,styleGroup);var visible=layerInfo.visible;var layerStyle={style:this._transformStyleToMapBoxGl(style,type,expression),layout:{visibility:visible}};var source={type:'geojson',data:{type:'FeatureCollection',features:features}};this._addOverlayToMap(type,source,layerID,layerStyle);type==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeLine',visible);}/**
  14066. * @private
  14067. * @function WebMapViewModel.prototype._getUniqueStyleGroup
  14068. * @description 获取单值的目标字段与颜色的对应数组。
  14069. * @param layerInfo 某个图层的图层信息
  14070. * @param features 图层上的 feature
  14071. */},{key:"_getUniqueStyleGroup",value:function _getUniqueStyleGroup(parameters,features){// 找出所有的单值
  14072. var featureType=parameters.featureType;var style=parameters.style;var themeSetting=parameters.themeSetting;var fieldName=themeSetting.themeField;var colors=themeSetting.colors;Object.keys(features[0].properties).forEach(function(key){key.toLocaleUpperCase()===fieldName.toLocaleUpperCase()&&(fieldName=key);});var names=[];var customSettings=themeSetting.customSettings;for(var i in features){var properties=features[i].properties;var name=properties[fieldName];var isSaved=false;for(var j in names){if(names[j]===name){isSaved=true;break;}}if(!isSaved){names.push(name);}}// 获取一定量的颜色
  14073. var curentColors=colors;curentColors=SuperMap.ColorsPickerUtil.getGradientColors(curentColors,names.length);// 生成styleGroup
  14074. var styleGroup=[];names.forEach(function(name,index){var color=curentColors[index];if(name in customSettings){color=customSettings[name];}if(featureType==='LINE'){style.strokeColor=color;}else{style.fillColor=color;}styleGroup.push({color:color,value:name});},this);return styleGroup;}/**
  14075. * @private
  14076. * @function WebMapViewModel.prototype._getWMTSUrl
  14077. * @description 根据传入的配置信息拼接wmts url。
  14078. * @param options 配置对象
  14079. */},{key:"_getWMTSUrl",value:function _getWMTSUrl(options){var obj={service:'WMTS',request:'GetTile',version:'1.0.0',style:'default',layer:options.layer,tilematrixSet:options.tileMatrixSet,format:'image/png'};var url=options.url;url+=this._getParamString(obj,url)+'&tilematrix={z}&tilerow={y}&tilecol={x}';return url;}/**
  14080. * @private
  14081. * @function WebMapViewModel.prototype._createMarkerLayer
  14082. * @description 添加标记图层。
  14083. * @param {Array.<GeoJSON>} features - feature。
  14084. */},{key:"_createMarkerLayer",value:function _createMarkerLayer(layerInfo,features){var _this12=this;features&&features.forEach(function(feature){var geomType=feature.geometry.type.toUpperCase();var defaultStyle=feature.dv_v5_markerStyle;if(geomType==='POINT'&&defaultStyle.text){// 说明是文字的feature类型
  14085. geomType='TEXT';}var featureInfo=_this12._setFeatureInfo(feature);feature.properties['useStyle']=defaultStyle;feature.properties['featureInfo']=featureInfo;if(geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('http://')===-1&&defaultStyle.src.indexOf('https://')===-1){// 说明地址不完整
  14086. defaultStyle.src=_this12.serverUrl+defaultStyle.src;}var source={type:'geojson',data:feature};var index=feature.properties.index;var layerID=geomType+'-'+index;// image-marker
  14087. geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('svg')<=-1&&_this12.map.loadImage(defaultStyle.src,function(error,image){if(error){console.log(error);}_this12.map.addImage(index+'',image);_this12.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':defaultStyle.src,'icon-size':defaultStyle.scale,visibility:layerInfo.visible}});});// svg-marker
  14088. if(geomType==='POINT'&&defaultStyle.src&&defaultStyle.src.indexOf('svg')>-1){if(!_this12._svgDiv){_this12._svgDiv=document.createElement('div');document.body.appendChild(_this12._svgDiv);}_this12._getCanvasFromSVG(defaultStyle.src,_this12._svgDiv,function(canvas){var imgUrl=canvas.toDataURL('img/png');imgUrl&&_this12.map.loadImage(imgUrl,function(error,image){if(error){console.log(error);}_this12.map.addImage(index+'',image);_this12.map.addLayer({id:layerID,type:'symbol',source:source,layout:{'icon-image':index+'','icon-size':defaultStyle.scale,visibility:layerInfo.visible}});console.log(_this12.map.getStyle());});});}// point-line-polygon-marker
  14089. if(!defaultStyle.src){var layeStyle={layout:{}};if(geomType==='LINESTRING'&&defaultStyle.lineCap){geomType='LINE';layeStyle.layout={'line-cap':defaultStyle.lineCap};}var visible=layerInfo.visible;layeStyle.layout.visibility=visible;// get style
  14090. layeStyle.style=_this12._transformStyleToMapBoxGl(defaultStyle,geomType);_this12._addOverlayToMap(geomType,source,layerID,layeStyle);// 若面有边框
  14091. geomType==='POLYGON'&&defaultStyle.strokeColor&&_this12._addStrokeLineForPoly(defaultStyle,source,layerID+'-strokeLine',visible);}},this);}/**
  14092. * @private
  14093. * @function WebMapViewModel.prototype._setFeatureInfo
  14094. * @description 设置 feature 信息。
  14095. * @param {Array.<GeoJSON>} features - feature。
  14096. */},{key:"_setFeatureInfo",value:function _setFeatureInfo(feature){var featureInfo;var info=feature.dv_v5_markerInfo;if(info&&info.dataViz_title){// 有featureInfo信息就不需要再添加
  14097. featureInfo=info;}else{// featureInfo = this.getDefaultAttribute();
  14098. return info;}var properties=feature.properties;for(var key in featureInfo){if(properties[key]){featureInfo[key]=properties[key];delete properties[key];}}return featureInfo;}/**
  14099. * @private
  14100. * @function WebMapViewModel.prototype._createHeatLayer
  14101. * @description 添加热力图。
  14102. * @param {Array.<GeoJSON>} features - feature。
  14103. */},{key:"_createHeatLayer",value:function _createHeatLayer(layerInfo,features){var style=layerInfo.themeSetting;var layerOption={gradient:style.colors.slice(),radius:parseInt(style.radius)};// 自定义颜色
  14104. var customSettings=style.customSettings;for(var i in customSettings){layerOption.gradient[i]=customSettings[i];}// 权重字段恢复
  14105. if(style.weight){this._changeWeight(features,style.weight);}var color=['interpolate',['linear'],['heatmap-density']];var length=layerOption.gradient.length;var step=parseFloat((1/length).toFixed(2));layerOption.gradient.forEach(function(item,index){color.push(index*step);if(index===0){item=_mapboxGlEnhance.default.supermap.Util.hexToRgba(item,0);}color.push(item);});// 图例相关
  14106. this._initLegendConfigInfo(layerInfo,layerOption.gradient);var paint={'heatmap-color':color,'heatmap-radius':style.radius+15,'heatmap-intensity':{base:1,stops:[[0,0.8],[22,1]]}};if(features[0].weight&&features.length>=4){var weight=[];features.forEach(function(item){weight.push(item.weight);});var max=SuperMap.ArrayStatistic.getMax(weight);var min=SuperMap.ArrayStatistic.getMin(weight);paint['heatmap-weight']=['interpolate',['linear'],['get','weight'],min,0,max,1];}this.map.addLayer({id:layerInfo.layerID,type:'heatmap',source:{type:'geojson',data:{type:'FeatureCollection',features:features}},paint:paint});}/**
  14107. * @private
  14108. * @function WebMapViewModel.prototype._changeWeight
  14109. * @description 改变当前权重字段
  14110. * @param {Array.<GeoJSON>} features - feature。
  14111. * @param {String} weightFeild - 权重字段
  14112. */},{key:"_changeWeight",value:function _changeWeight(features,weightFeild){this._fieldMaxValue={};this._getMaxValue(features,weightFeild);var maxValue=this._fieldMaxValue[weightFeild];features.forEach(function(feature){var attributes=feature.properties;var value=attributes[weightFeild];feature['weight']=value/maxValue;});}/**
  14113. * @private
  14114. * @function WebMapViewModel.prototype._getMaxValue
  14115. * @description 获取当前字段对应的最大值,用于计算权重。
  14116. * @param {Array.<GeoJSON>} features - feature。
  14117. * @param {String} weightFeild - 权重字段
  14118. */},{key:"_getMaxValue",value:function _getMaxValue(features,weightField){var values=[];var attributes;var field=weightField;if(this._fieldMaxValue[field]){return;}features.forEach(function(feature){// 收集当前权重字段对应的所有值
  14119. attributes=feature.properties;attributes&&parseFloat(attributes[field])&&values.push(parseFloat(attributes[field]));});this._fieldMaxValue[field]=SuperMap.ArrayStatistic.getArrayStatistic(values,'Maximum');}/**
  14120. * @private
  14121. * @function WebMapViewModel.prototype._createRangeLayer
  14122. * @description 添加分段专题图。
  14123. * @param {Array.<GeoJSON>} features - feature。
  14124. */},{key:"_createRangeLayer",value:function _createRangeLayer(layerInfo,features){var fieldName=layerInfo.themeSetting.themeField;var style=layerInfo.style;var featureType=layerInfo.featureType;var styleGroups=this._getRangeStyleGroup(layerInfo,features);features=this._getFiterFeatures(layerInfo.filterCondition,features);var source={type:'geojson',data:{type:'FeatureCollection',features:features}};// 获取 expression
  14125. var expression=['match',['get','index']];features.forEach(function(row){var tartget=parseFloat(row.properties[fieldName]);if(styleGroups){for(var i=0;i<styleGroups.length;i++){if(styleGroups[i].start<=tartget&&tartget<styleGroups[i].end){expression.push(row.properties['index'],styleGroups[i].color);}}}!tartget&&expression.push(row.properties['index'],'rgba(0, 0, 0, 0)');},this);expression.push('rgba(0, 0, 0, 0)');// 图例处理
  14126. this._initLegendConfigInfo(layerInfo,styleGroups);// 获取样式
  14127. var layerStyle={layout:{}};if(featureType==='LINE'&&style.lineCap){layerStyle.layout={'line-cap':style.lineCap};}var visible=layerInfo.visible;layerStyle.layout.visibility=visible;layerStyle.style=this._transformStyleToMapBoxGl(style,featureType,expression);// 添加图层
  14128. var layerID=layerInfo.layerID;this._addOverlayToMap(featureType,source,layerID,layerStyle);// 如果面有边框
  14129. featureType==='POLYGON'&&style.strokeColor&&this._addStrokeLineForPoly(style,source,layerID+'-strokeline',visible);}/**
  14130. * @private
  14131. * @function WebMapViewModel.prototype._getFiterFeatures
  14132. * @description 通过过滤条件查询满足的 feature。
  14133. * @param {String} filterCondition - 过滤条件。
  14134. * @param {array} allFeatures - 图层上的 feature 集合
  14135. */},{key:"_getFiterFeatures",value:function _getFiterFeatures(filterCondition,allFeatures){if(!filterCondition||!allFeatures){return allFeatures;}var condition=this._replaceFilterCharacter(filterCondition);var sql='select * from json where ('+condition+')';var filterFeatures=[];for(var i=0;i<allFeatures.length;i++){var feature=allFeatures[i];var filterResult=void 0;try{filterResult=window['jsonsql'].query(sql,{properties:feature.properties});}catch(err){// 必须把要过滤得内容封装成一个对象,主要是处理jsonsql(line : 62)中由于with语句遍历对象造成的问题
  14136. continue;}if(filterResult&&filterResult.length>0){// afterFilterFeatureIdx.push(i);
  14137. filterFeatures.push(feature);}}return filterFeatures;}/**
  14138. * @private
  14139. * @function WebMapViewModel.prototype._replaceFilterCharacter
  14140. * @description 获取过滤字符串。
  14141. * @param {String} filterString - 过滤条件。
  14142. */},{key:"_replaceFilterCharacter",value:function _replaceFilterCharacter(filterString){filterString=filterString.replace(/=/g,'==').replace(/AND|and/g,'&&').replace(/or|OR/g,'||').replace(/<==/g,'<=').replace(/>==/g,'>=');return filterString;}/**
  14143. * @private
  14144. * @function WebMapViewModel.prototype._getRangeStyleGroup
  14145. * @description 获取分段样式。
  14146. * @param {Array.<GeoJSON>} features - feature。
  14147. */},{key:"_getRangeStyleGroup",value:function _getRangeStyleGroup(layerInfo,features){// 找出分段值
  14148. var featureType=layerInfo.featureType;var style=layerInfo.style;var values=[];var attributes;var themeSetting=layerInfo.themeSetting;var customSettings=themeSetting.customSettings;var fieldName=themeSetting.themeField;var segmentCount=themeSetting.segmentCount;features.forEach(function(feature){attributes=feature.properties||feature.get('Properties');if(attributes){// 过滤掉非数值的数据
  14149. attributes[fieldName]&&_mapboxGlEnhance.default.supermap.Util.isNumber(attributes[fieldName])&&values.push(parseFloat(attributes[fieldName]));}else if(feature.get(fieldName)&&_mapboxGlEnhance.default.supermap.Util.isNumber(feature.get(fieldName))){feature.get(fieldName)&&values.push(parseFloat(feature.get(fieldName)));}},this);var segements=SuperMap.ArrayStatistic.getArraySegments(values,themeSetting.segmentMethod,segmentCount);if(segements){var itemNum=segmentCount;if(attributes&&segements[0]===segements[attributes.length-1]){itemNum=1;segements.length=2;}// 保留两位有效数
  14150. for(var i=0;i<segements.length;i++){var value=segements[i];value=i===0?Math.floor(value*100)/100:Math.ceil(value*100)/100+0.1;// 加0.1 解决最大值没有样式问题
  14151. segements[i]=Number(value.toFixed(2));}// 获取一定量的颜色
  14152. var curentColors=themeSetting.colors;// curentColors = SuperMap.ColorsPickerUtil.getGradientColors(curentColors, itemNum, 'RANGE');
  14153. for(var index=0;index<itemNum;index++){if(index in customSettings){if(customSettings[index]['segment']['start']){segements[index]=customSettings[index]['segment']['start'];}if(customSettings[index]['segment']['end']){segements[index+1]=customSettings[index]['segment']['end'];}}}// 生成styleGroup
  14154. var styleGroups=[];for(var _i10=0;_i10<itemNum;_i10++){var color=curentColors[_i10];if(_i10 in customSettings){if(customSettings[_i10].color){color=customSettings[_i10].color;}}if(featureType==='LINE'){style.strokeColor=color;}else{style.fillColor=color;}var start=segements[_i10];var end=segements[_i10+1];var styleObj=JSON.parse(JSON.stringify(style));styleGroups.push({style:styleObj,color:color,start:start,end:end});}return styleGroups;}}/**
  14155. * @private
  14156. * @function WebMapViewModel.prototype._formatGeoJSON
  14157. * @description 格式 GeoJSON。
  14158. * @param {GeoJSON} data - GeoJSON 数据。
  14159. */},{key:"_formatGeoJSON",value:function _formatGeoJSON(data){var features=data.features;features.forEach(function(row,index){row.properties['index']=index;});return features;}/**
  14160. * @private
  14161. * @function WebMapViewModel.prototype._excelData2Feature将
  14162. * @description csv 和 xls 文件内容转换成 geojson
  14163. * @param content 文件内容
  14164. * @param layerInfo 图层信息
  14165. * @returns {Array} feature的数组集合
  14166. */},{key:"_excelData2Feature",value:function _excelData2Feature(dataContent){var fieldCaptions=dataContent.colTitles;// 位置属性处理
  14167. var xfieldIndex=-1;var yfieldIndex=-1;for(var i=0,len=fieldCaptions.length;i<len;i++){if((0,_util.isXField)(fieldCaptions[i])){xfieldIndex=i;}if((0,_util.isYField)(fieldCaptions[i])){yfieldIndex=i;}}// feature 构建后期支持坐标系 4326/3857
  14168. var features=[];for(var _i12=0,_len2=dataContent.rows.length;_i12<_len2;_i12++){var row=dataContent.rows[_i12];var x=Number(row[xfieldIndex]);var y=Number(row[yfieldIndex]);// 属性信息
  14169. var attributes={};for(var index in dataContent.colTitles){var key=dataContent.colTitles[index];attributes[key]=dataContent.rows[_i12][index];}attributes['index']=_i12+'';// 目前csv 只支持处理点,所以先生成点类型的 geojson
  14170. var feature={type:'Feature',geometry:{type:'Point',coordinates:[x,y]},properties:attributes};features.push(feature);}return features;}/**
  14171. * @private
  14172. * @function WebMapViewModel.prototype._sendMapToUser
  14173. * @description 返回最终的 map 对象给用户,供他们操作使用。
  14174. * @param count
  14175. * @param layersLen
  14176. */},{key:"_sendMapToUser",value:function _sendMapToUser(count,layersLen){if(count===layersLen){/**
  14177. * @event WebMapViewModel#addlayerssucceeded
  14178. * @description 添加图层成功。
  14179. * @property {mapboxglTypes.Map} map - MapBoxGL Map 对象。
  14180. * @property {Object} mapparams - 地图信息。
  14181. * @property {string} mapParams.title - 地图标题。
  14182. * @property {string} mapParams.description - 地图描述。
  14183. * @property {Array.<Object>} layers - 地图上所有的图层对象。
  14184. */this._sourceListModel=new _SourceListModel.default({map:this.map});for(var layerID in this._legendList){this._sourceListModel.addSourceStyle(layerID,this._legendList[layerID]);}for(var index=this._layers.length-2;index>-1;index--){var targetlayerId=this._layers[index].layerID;var beforLayerId=this._layers[index+1].layerID;this.map.moveLayer(targetlayerId,beforLayerId);}this.fire('addlayerssucceeded',{map:this.map,mapparams:this.mapParams,layers:this._layers});}}/**
  14185. * @function WebMapViewModel.prototype._unproject
  14186. * @private
  14187. * @description 墨卡托转经纬度。
  14188. * @param {} point - 待转换的点。
  14189. */},{key:"_unproject",value:function _unproject(point){var d=180/Math.PI;var r=6378137;var ts=Math.exp(-point[1]/r);var phi=Math.PI/2-2*Math.atan(ts);for(var i=0,dphi=0.1,con;i<15&&Math.abs(dphi)>1e-7;i++){con=1;dphi=Math.PI/2-2*Math.atan(ts*con)-phi;phi+=dphi;}return[point[0]*d/r,phi*d];}/**
  14190. * @function WebMapViewModel.prototype._getParamString
  14191. * @private
  14192. * @param {Object} obj - 待添加的参数。
  14193. * @param {string} existingUrl - 待添加参数的 url。
  14194. * @param {Boolean} [uppercase] - 参数是否转换为大写。
  14195. */},{key:"_getParamString",value:function _getParamString(obj,existingUrl){var uppercase=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var params=[];for(var i in obj){params.push((uppercase?i.toUpperCase():i)+'='+obj[i]);}return(!existingUrl||existingUrl.indexOf('?')===-1?'?':'&')+params.join('&');}/**
  14196. * @private
  14197. * @function WebMapViewModel.prototype._transformStyleToMapBoxGl
  14198. * @description 根据图层类型将 layerInfo 中的 style 属性格式转换为 mapboxglTypes 中的 style 格式。
  14199. * @param {Object} style - layerInfo中的style属性
  14200. * @param {String} type - 图层类型
  14201. * @param {Array} [expression] - 存储颜色值得表达式
  14202. */},{key:"_transformStyleToMapBoxGl",value:function _transformStyleToMapBoxGl(style,type,expression,expressionType){var transTable={};if((style.type==='POINT'||style.type==='BASIC_POINT'||type==='POINT')&&type!=='LINE'){transTable={fillColor:'circle-color',strokeWidth:'circle-stroke-width',fillOpacity:'circle-opacity',radius:'circle-radius',strokeColor:'circle-stroke-color',strokeOpacity:'circle-stroke-opacity'};}else if(['LINE','LINESTRING','MULTILINESTRING'].includes(type)){transTable={strokeWidth:'line-width',strokeColor:'line-color',strokeOpacity:'line-opacity'};}else if(['REGION','POLYGON','MULTIPOLYGON'].includes(type)){transTable={fillColor:'fill-color',fillOpacity:'fill-opacity',strokeColor:'fill-outline-color'};}var newObj={};for(var item in style){if(transTable[item]){newObj[transTable[item]]=style[item];}}if(expression){if(expressionType){newObj[expressionType]=expression;}else if(newObj['circle-color']){newObj['circle-color']=expression;}else if(newObj['line-color']){newObj['line-color']=expression;}else{newObj['fill-color']=expression;}}if(style.lineDash&&style.lineDash!=='solid'&&type==='LINE'){newObj['line-dasharray']=this._dashStyle(style);}return newObj;}/**
  14203. * @private
  14204. * @function WebMapViewModel.prototype.._dashStyle
  14205. * @description 符号样式。
  14206. * @param {Object} style - 样式参数。
  14207. * @param {number} widthFactor - 宽度系数。
  14208. */},{key:"_dashStyle",value:function _dashStyle(style){if(!style){return[];}// var w = style.strokeWidth * widthFactor;
  14209. var w=1;var str=style.strokeDashstyle||style.lineDash;switch(str){case'solid':return[];case'dot':return[1,4*w];case'dash':return[4*w,4*w];case'dashdot':return[4*w,4*w,1*w,4*w];case'longdash':return[8*w,4*w];case'longdashdot':return[8*w,4*w,1,4*w];default:if(!str){return[];}if(SuperMap.Util.isArray(str)){return str;}str=SuperMap.String.trim(str).replace(/\s+/g,',');return str.replace(/\[|\]/gi,'').split(',');}}/**
  14210. * @private
  14211. * @description 将SVG转换成Canvas
  14212. * @param svgUrl
  14213. * @param divDom
  14214. * @param callBack
  14215. */},{key:"_getCanvasFromSVG",value:function _getCanvasFromSVG(svgUrl,divDom,callBack){var _this13=this;// 一个图层对应一个canvas
  14216. var canvas=document.createElement('canvas');canvas.id='dataviz-canvas-'+_mapboxGlEnhance.default.supermap.Util.newGuid(8);canvas.style.display='none';divDom.appendChild(canvas);var canvgs=window.canvg&&window.canvg.default?window.canvg.default:_canvg.default;try{var ctx=canvas.getContext('2d');canvgs.from(ctx,svgUrl,{ignoreMouse:true,ignoreAnimation:true,forceRedraw:function forceRedraw(){return false;}}).then(function(v){v.start();_this13.canvgsV.push(v);if(canvas.width>300||canvas.height>300){return;}callBack(canvas);});}catch(error){console.log(error);}}},{key:"_stopCanvg",value:function _stopCanvg(){this.canvgsV.forEach(function(v){return v.stop();});this.canvgsV=[];}/**
  14217. * @private
  14218. * @function WebMapViewModel.prototype._addOverlayToMap
  14219. * @description 添加基础矢量图层到 MAP
  14220. * @param {Object} style - mabgl style
  14221. * @param {String} type - 图层类型
  14222. */},{key:"_addOverlayToMap",value:function _addOverlayToMap(type,source,layerID,layerStyle){var mbglTypeMap={POINT:'circle',LINE:'line',POLYGON:'fill'};var mbglType=mbglTypeMap[type];if(mbglType==='circle'||mbglType==='line'||mbglType==='fill'){this.map.addLayer({id:layerID,type:mbglType,source:source,paint:layerStyle.style,layout:layerStyle.layout||{}});}}},{key:"_addBaselayer",value:function _addBaselayer(url,layerID){var minzoom=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var maxzoom=arguments.length>3&&arguments[3]!==undefined?arguments[3]:22;var source={type:'raster',tiles:url,tileSize:256};this.map.addLayer({id:layerID,type:'raster',source:source,minzoom:minzoom,maxzoom:maxzoom});}/**
  14223. * @private
  14224. * @function WebMapViewModel.prototype._addStrokeLineForPoly
  14225. * @description 添加面的边框。
  14226. * @param {Object} style - mabgl style
  14227. */},{key:"_addStrokeLineForPoly",value:function _addStrokeLineForPoly(style,source,layerID,visible){var lineStyle={style:this._transformStyleToMapBoxGl(style,'LINE'),layout:{visibility:visible}};this._addOverlayToMap('LINE',source,layerID,lineStyle);}/**
  14228. * @private
  14229. * @function WebMapViewModel.prototype._parseGeoJsonData2Feature
  14230. * @description 将从restData地址上获取的json转换成feature(从iserver中获取的json转换成feature)
  14231. * @param {object} metaData - json内容
  14232. */},{key:"_parseGeoJsonData2Feature",value:function _parseGeoJsonData2Feature(metaData){var allFeatures=metaData.allDatas.features;var features=[];for(var i=0,len=allFeatures.length;i<len;i++){var feature=allFeatures[i];var coordinate=feature.geometry.coordinates;if(allFeatures[i].geometry.type==='Point'){// 标注图层 还没有属性值时候不加
  14233. if(allFeatures[i].properties){allFeatures[i].properties.lon=coordinate[0];allFeatures[i].properties.lat=coordinate[1];}}feature.properties['index']=i+'';features.push(feature);}return features;}/**
  14234. * @private
  14235. * @function WebMapViewModel.prototype._getFeatureBySQL
  14236. * @description 通过 sql 方式查询数据。
  14237. */},{key:"_getFeatureBySQL",value:function _getFeatureBySQL(url,datasetNames,_processCompleted,processFaild){var getFeatureParam,getFeatureBySQLService,getFeatureBySQLParams;getFeatureParam=new SuperMap.FilterParameter({name:datasetNames.join().replace(':','@'),attributeFilter:'SMID > 0'});getFeatureBySQLParams=new SuperMap.GetFeaturesBySQLParameters({queryParameter:getFeatureParam,datasetNames:datasetNames,fromIndex:0,toIndex:-1,maxFeatures:-1,returnContent:true});var options={eventListeners:{processCompleted:function processCompleted(getFeaturesEventArgs){_processCompleted&&_processCompleted(getFeaturesEventArgs);},processFailed:function processFailed(e){processFaild&&processFaild(e);}}};getFeatureBySQLService=new SuperMap.GetFeaturesBySQLService(url,options);getFeatureBySQLService.processAsync(getFeatureBySQLParams);}/**
  14238. * @private
  14239. * @function WebMapViewModel.prototype._queryFeatureBySQL
  14240. * @description 通过 sql 方式查询数据。
  14241. */},{key:"_queryFeatureBySQL",value:function _queryFeatureBySQL(url,layerName,processCompleted,processFaild,attributeFilter,fields,epsgCode,startRecord,recordLength,onlyAttribute){var queryParam=new SuperMap.FilterParameter({name:layerName,attributeFilter:attributeFilter});if(fields){queryParam.fields=fields;}var params={queryParams:[queryParam]};if(onlyAttribute){params.queryOption=SuperMap.QueryOption.ATTRIBUTE;}startRecord&&(params.startRecord=startRecord);recordLength&&(params.expectCount=recordLength);if(epsgCode){params.prjCoordSys={epsgCode:epsgCode};}var queryBySQLParams=new SuperMap.QueryBySQLParameters(params);var queryBySQLService=new _mapboxGlEnhance.default.supermap.QueryService(url);queryBySQLService.queryBySQL(queryBySQLParams,function(data){data.type==='processCompleted'?processCompleted(data):processFaild(data);});}},{key:"_initLegendConfigInfo",value:function _initLegendConfigInfo(layerInfo,style){if(!this._legendList[layerInfo.layerID]){this._legendList[layerInfo.layerID]={layerType:layerInfo.layerType,featureType:layerInfo.featureType,layerId:layerInfo.layerID,themeField:layerInfo.layerType==='HEAT'?layerInfo.themeSetting.weight:layerInfo.themeSetting.themeField,styleGroup:style};}}},{key:"_getFeatureProperties",value:function _getFeatureProperties(features){var properties=[];if(features&&features.length){features.forEach(function(feature){var property=feature.properties;property&&properties.push(property);});}return properties;}},{key:"_addVectorLayer",value:function _addVectorLayer(info,layerInfo,featureType){var style=this._getDataVectorTileStyle(featureType);var paint=this._transformStyleToMapBoxGl(style,featureType);var url=info.url+'/tileFeature.mvt';var origin=_mapboxGlEnhance.default.CRS.get(this.baseProjection).getOrigin();url+="?&returnAttributes=true&width=512&height=512&x={x}&y={y}&scale={scale}&origin={x:".concat(origin[0],",y:").concat(origin[1],"}");this.map.addLayer({id:(0,_lodash.default)(layerInfo.name+'-'),// @ts-ignore
  14242. type:style.mbglType,source:{type:'vector',tiles:[url]},'source-layer':"".concat(info.datasetName,"@").concat(info.datasourceName),paint:paint,layout:{visibility:layerInfo.visible?'visible':'none'}});}},{key:"_isMvt",value:function _isMvt(serviceUrl,datasetName){var _this14=this;return this._getDatasetsInfo(serviceUrl,datasetName).then(function(info){//判断是否和底图坐标系一直
  14243. if(info.epsgCode==_this14.baseProjection.split('EPSG:')[1]){return SuperMap.FetchRequest.get("".concat(info.url,"/tilefeature.mvt")).then(function(response){return response.json();}).then(function(result){info.isMvt=result.error&&result.error.code===400;return info;}).catch(function(){return info;});}return info;});}},{key:"_getDatasetsInfo",value:function _getDatasetsInfo(serviceUrl,datasetName){return this._getDatasources(serviceUrl).then(function(datasourceName){//判断mvt服务是否可用
  14244. var url="".concat(serviceUrl,"/data/datasources/").concat(datasourceName,"/datasets/").concat(datasetName);return SuperMap.FetchRequest.get(url).then(function(response){return response.json();}).then(function(datasetsInfo){return{epsgCode:datasetsInfo.datasetInfo.prjCoordSys.epsgCode,bounds:datasetsInfo.datasetInfo.bounds,datasourceName:datasourceName,datasetName:datasetName,url:url//返回的是原始url,没有代理。因为用于请求mvt
  14245. };});});}},{key:"_getDataVectorTileStyle",value:function _getDataVectorTileStyle(featureType){var styleParameters={radius:8,//圆点半径
  14246. fillColor:'#EE4D5A',//填充色
  14247. fillOpacity:0.9,strokeColor:'#ffffff',//边框颜色
  14248. strokeWidth:1,strokeOpacity:1,lineDash:'solid',type:'BASIC_POINT',mbglType:'circle'};if(['LINE','LINESTRING','MULTILINESTRING'].includes(featureType)){styleParameters.strokeColor='#4CC8A3';styleParameters.strokeWidth=2;styleParameters.mbglType='line';}else if(['REGION','POLYGON','MULTIPOLYGON'].includes(featureType)){styleParameters.fillColor='#826DBA';styleParameters.mbglType='fill';}return styleParameters;}},{key:"_transformFeatures",value:function _transformFeatures(features){var _this15=this;features&&features.forEach(function(feature,index){var geometryType=feature.geometry.type;var coordinates=feature.geometry.coordinates;if(geometryType==='LineString'){coordinates.forEach(function(coordinate,index){coordinate=_this15._unproject(coordinate);coordinates[index]=coordinate;},_this15);}else if(geometryType==='Point'){coordinates=_this15._unproject(coordinates);feature.geometry.coordinates=coordinates;}else if(geometryType==='MultiPolygon'||geometryType==='Polygon'){coordinates.forEach(function(coordinate,index){var coords=geometryType==='MultiPolygon'?coordinate[0]:coordinate;coords.forEach(function(latlng,index){latlng=_this15._unproject(latlng);coords[index]=latlng;});coordinates[index]=coordinate;});}features[index]=feature;},this);}}]);return WebMapViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=WebMapViewModel;
  14249. /***/ }),
  14250. /***/ 4831:
  14251. /***/ (function(__unused_webpack_module, exports) {
  14252. "use strict";
  14253. Object.defineProperty(exports, "__esModule", ({value:true}));exports.MAP_EVENT_NAMES=void 0;var MAP_EVENT_NAMES=['onResize','onWebglcontextlost','onWebglcontextrestored','onRemove','onMovestart','onContextmenu','onDblclick','onClick','onTouchcancel','onTouchmove','onTouchend','onTouchstart','onDataloading','onMousemove','onMouseup','onMousedown','onSourcedataloading','onError','onData','onStyledata','onSourcedata','onMouseout','onStyledataloading','onMoveend','onMove','onRender','onZoom','onZoomstart','onZoomend','onBoxzoomstart','onBoxzoomcancel','onBoxzoomend','onRotate','onRotatestart','onRotateend','onDragend','onDrag','onDragstart','onPitch','onIdle'];exports.MAP_EVENT_NAMES=MAP_EVENT_NAMES;;
  14254. /***/ }),
  14255. /***/ 5558:
  14256. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14257. "use strict";
  14258. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _dec,_class;var Layer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(Layer,_React$Component);var _super=(0,_createSuper2.default)(Layer);function Layer(){(0,_classCallCheck2.default)(this,Layer);return _super.apply(this,arguments);}(0,_createClass2.default)(Layer,[{key:"loaded",value:function loaded(map){var _this$props=this.props,type=_this$props.type,source=_this$props.source,layerId=_this$props.layerId,minzoom=_this$props.minzoom,maxzoom=_this$props.maxzoom,filter=_this$props.filter,layout=_this$props.layout,paint=_this$props.paint,metadata=_this$props.metadata;if(map.getLayer(layerId)){console.error("There is already a layer with the id \"".concat(layerId,"\""));return;}if(typeof source==='string'&&!map.getSource(source)){console.error("Source \"".concat(source,"\" is not loaded"));return;}if(type!=='background'&&!source){console.error("Source is required unless type is background");return;}var layerOption={id:layerId,type:type};source&&(layerOption.source=source);minzoom!==undefined&&(layerOption.minzoom=minzoom);maxzoom!==undefined&&(layerOption.maxzoom=maxzoom);filter&&(layerOption.filter=filter);layout&&(layerOption.layout=layout);paint&&(layerOption.paint=paint);metadata&&(layerOption.metadata=metadata);this.props['source-layer']&&(layerOption['source-layer']=this.props['source-layer']);map.addLayer(layerOption);}},{key:"removed",value:function removed(){}},{key:"render",value:function render(){return null;}}]);return Layer;}(_react.default.Component))||_class);exports["default"]=Layer;
  14259. /***/ }),
  14260. /***/ 1193:
  14261. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14262. "use strict";
  14263. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _react=__webpack_require__(3899);var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _AnimateMarkerLayerViewModel=_interopRequireDefault(__webpack_require__(3843));var _BreathingApertureMarker=_interopRequireDefault(__webpack_require__(7278));var _DiffusedApertureMarker=_interopRequireDefault(__webpack_require__(2017));var _HaloRingMarker=_interopRequireDefault(__webpack_require__(6130));var _RotatingApertureMarker=_interopRequireDefault(__webpack_require__(970));var _RotatingTextBorderMarker=_interopRequireDefault(__webpack_require__(9041));var _FluorescenceMarker=_interopRequireDefault(__webpack_require__(6889));var _class,_class2;var AnimateMarkerLayer=(0,_mapGetter.default)(_class=(_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(AnimateMarkerLayer,_Component);var _super=(0,_createSuper2.default)(AnimateMarkerLayer);function AnimateMarkerLayer(){(0,_classCallCheck2.default)(this,AnimateMarkerLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(AnimateMarkerLayer,[{key:"componentDidMount",value:function componentDidMount(){this._markersElement=[];}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.viewModel&&!(0,_lodash.default)(prevProps.features,this.props.features)){this._markersElement=[];this._getMarkerElement();this.props.features&&this.viewModel.setFeatures(this.props.features,this._markersElement);}if(this.viewModel&&!(0,_lodash.default)(prevProps.type,this.props.type)){this._markersElement=[];this._getMarkerElement();this.viewModel.setType(this._markersElement);}if(this.viewModel&&this.props.width&&prevProps.width!==this.props.width){this.marker&&this.marker.setMarkersWidth(this.props.width);}if(this.viewModel&&this.props.height&&prevProps.height!==this.props.height){this.marker&&this.marker.setMarkersHeight&&this.marker.setMarkersHeight(this.props.height);}if(this.viewModel&&this.props.textColor&&prevProps.textColor!==this.props.textColor){this.marker&&this.marker.setMarkersTextColor(this.props.textColor);}if(this.viewModel&&this.props.textFontSize&&prevProps.textFontSize!==this.props.textFontSize){this.marker&&this.marker.setMarkersTextFontSize(this.props.textFontSize);}if(this.viewModel&&this.props.colors&&this.props.colors.length&&this.props.colors.length>0&&!(0,_lodash.default)(prevProps.colors,this.props.colors)){this.marker&&this.marker.setMarkersColors(this.props.colors);}if(this.viewModel&&this.props.textField&&prevProps.textField!==this.props.textField){this.marker&&this.marker.setMarkersTextField(this.props.textField);}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.viewModel&&this.viewModel.clearMarkerLayer();}},{key:"loaded",value:function loaded(map){this.props.features&&this._getMarkerElement();this.viewModel=new _AnimateMarkerLayerViewModel.default(map,this.props.features,this._markersElement,this.props.fitBounds);}},{key:"_getMarkerElement",value:function _getMarkerElement(){this.setState({marker:null});var _this$props=this.props,features=_this$props.features,width=_this$props.width,height=_this$props.height,colors=_this$props.colors,textFontSize=_this$props.textFontSize,textColor=_this$props.textColor,textField=_this$props.textField,type=_this$props.type;if(!features||JSON.stringify(features)==='{}'||!features.features){this.viewModel&&this.viewModel.clearMarkerLayer();return;}switch(type){case'rotatingAperture':this.marker=new _RotatingApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'haloRing':this.marker=new _HaloRingMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'breathingAperture':this.marker=new _BreathingApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'diffusedAperture':this.marker=new _DiffusedApertureMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'rotatingTextBorder':this.marker=new _RotatingTextBorderMarker.default(features,{width:width,height:height,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;case'fluorescence':this.marker=new _FluorescenceMarker.default(features,{width:width,colors:colors,textField:textField,textColor:textColor,textFontSize:textFontSize});break;}this.marker&&(this._markersElement=this.marker.getMarkersElement());}},{key:"render",value:function render(){return null;}}]);return AnimateMarkerLayer;}(_react.Component),_class2.defaultProps={type:'breathingAperture',textFontSize:14},_class2))||_class;exports["default"]=AnimateMarkerLayer;
  14264. /***/ }),
  14265. /***/ 3843:
  14266. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14267. "use strict";
  14268. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var _envelope=_interopRequireDefault(__webpack_require__(3880));var _bbox=_interopRequireDefault(__webpack_require__(9705));var _transformScale=_interopRequireDefault(__webpack_require__(5748));var AnimateMarkerLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(AnimateMarkerLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(AnimateMarkerLayerViewModel);function AnimateMarkerLayerViewModel(map,features,markersElement){var _this;var fitBounds=arguments.length>3&&arguments[3]!==undefined?arguments[3]:true;(0,_classCallCheck2.default)(this,AnimateMarkerLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}_this.map=map;_this.features=features;_this.markers=[];_this.markersElement=markersElement;_this.fitBounds=fitBounds;_this.features&&_this._initalizeMarkerLayer();return _this;}(0,_createClass2.default)(AnimateMarkerLayerViewModel,[{key:"setType",value:function setType(markersElement){this.markersElement=markersElement;this._initalizeMarkerLayer();}},{key:"setFeatures",value:function setFeatures(features,markersElement){this.markersElement=markersElement;this.features=features;this._initalizeMarkerLayer();}},{key:"_initalizeMarkerLayer",value:function _initalizeMarkerLayer(){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.clearMarkerLayer();this._createMarker();}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point,index){var marker=new _mapboxGlEnhance.default.Marker(_this2.markersElement[index]||_this2.markersElement[0])// @ts-ignore
  14269. .setLngLat(point.geometry.coordinates).addTo(_this2.map);_this2.markers.push(marker);},this);if(this.fitBounds){// @ts-ignore
  14270. var bounds=(0,_bbox.default)((0,_transformScale.default)((0,_envelope.default)(this.features),1.7));this.fitBounds&&this.map.fitBounds([[bounds[0],bounds[1]],[bounds[2],bounds[3]]],{maxZoom:17});}}},{key:"clearMarkerLayer",value:function clearMarkerLayer(){this.markers.length>0&&this.markers.forEach(function(marker){marker&&marker.remove();});this.markers=[];}}]);return AnimateMarkerLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=AnimateMarkerLayerViewModel;
  14271. /***/ }),
  14272. /***/ 7278:
  14273. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14274. "use strict";
  14275. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var BreathingApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(BreathingApertureMarker,_Marker);var _super=(0,_createSuper2.default)(BreathingApertureMarker);function BreathingApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,BreathingApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(BreathingApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var pulse=document.getElementsByClassName('sm-component-animate-marker__pulse');for(var i=0;i<pulse.length;i++){// @ts-ignore
  14276. this._setBreathingApertureWidth(pulse[i].style);}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var dot=document.getElementsByClassName('sm-component-animate-marker__dot-point');for(var i=0;i<dot.length;i++){// @ts-ignore
  14277. dot[i].style.background=this.options.colors[0];}var pulse=document.getElementsByClassName('sm-component-animate-marker__pulse');for(var _i2=0;_i2<pulse.length;_i2++){// @ts-ignore
  14278. var style=pulse[_i2].style;style.borderColor=this.options.colors[0];style.boxShadow="0 0 12px ".concat(this.options.colors[1],", 0 0 20px ").concat(this.options.colors[1]," inset");}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--breathing-aperture';var dot=document.createElement('span');dot.className='sm-component-animate-marker__dot-point';var colors;if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){colors=_this2.options.colors;}colors&&(dot.style.background=colors[0]);markerContainer.appendChild(dot);var childElements=_this2._createMakerElement(3,'span',['sm-component-animate-marker__delay','sm-component-animate-marker__pulse']);childElements.forEach(function(element){if(colors){element.style.borderColor=colors[0];element.style.boxShadow="0 0 12px ".concat(colors[1],", 0 0 20px ").concat(colors[1]," inset");}_this2._setBreathingApertureWidth(element.style);markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'breathing-aperture-name');markerContainer.appendChild(nameContainer);_this2.markersElement.push(markerContainer);},this);}},{key:"_setBreathingApertureWidth",value:function _setBreathingApertureWidth(style){var width=this.options.width;if(width){style.width=width+'px';style.height=width+'px';style.top=-width/2+'px';style.left=-width/2+'px';style.borderRadius=width/2+'px';}}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}}]);return BreathingApertureMarker;}(_Marker2.default);exports["default"]=BreathingApertureMarker;
  14279. /***/ }),
  14280. /***/ 2017:
  14281. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14282. "use strict";
  14283. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var DiffusedApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(DiffusedApertureMarker,_Marker);var _super=(0,_createSuper2.default)(DiffusedApertureMarker);function DiffusedApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,DiffusedApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(DiffusedApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--diffused-aperture');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14284. var style=markerContainer[i].style;style.setProperty('--container-width',width+'px');}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--diffused-aperture');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14285. var style=markerContainer[i].style;style.setProperty('--background-color',this.options.colors[0]);style.setProperty('--box-shadow-color',this.options.colors[1]||this.options.colors[0]);}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--diffused-aperture';var wrapper=document.createElement('div');wrapper.className='sm-component-animate-marker__diffused-aperture-wrapper';var bg=document.createElement('div');bg.className='sm-component-animate-marker__bg';wrapper.appendChild(bg);var circle=document.createElement('div');circle.className='sm-component-animate-marker__circle';wrapper.appendChild(circle);markerContainer.appendChild(wrapper);var nameContainer=_this2._getTextContainer(point,'diffused-aperture-name');markerContainer.appendChild(nameContainer);_this2.options.width&&markerContainer.style.setProperty('--container-width',_this2.options.width+'px');if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--background-color',_this2.options.colors[0]);markerContainer.style.setProperty('--box-shadow-color',_this2.options.colors[1]||_this2.options.colors[0]);}_this2.markersElement.push(markerContainer);},this);}}]);return DiffusedApertureMarker;}(_Marker2.default);exports["default"]=DiffusedApertureMarker;
  14286. /***/ }),
  14287. /***/ 6889:
  14288. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14289. "use strict";
  14290. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var FluorescenceMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(FluorescenceMarker,_Marker);var _super=(0,_createSuper2.default)(FluorescenceMarker);function FluorescenceMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,FluorescenceMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(FluorescenceMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--fluorescence');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14291. this._setFluorescenceWidth(markerContainer[i].style);}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--fluorescence');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14292. this._setFluorescenceColor(markerContainer[i].style);}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--fluorescence';var marker=document.createElement('div');marker.className='sm-component-animate-marker__fluorescence';markerContainer.appendChild(marker);var nameContainer=_this2._getTextContainer(point,'fluorescence-name');markerContainer.appendChild(nameContainer);_this2._setFluorescenceWidth(markerContainer.style);_this2._setFluorescenceColor(markerContainer.style);_this2.markersElement.push(markerContainer);});}},{key:"_setFluorescenceWidth",value:function _setFluorescenceWidth(style){if(this.options.width){style.setProperty('--container-width',this.options.width/3+'px');style.setProperty('--box-shadow-width',this.options.width+'px');}}},{key:"_setFluorescenceColor",value:function _setFluorescenceColor(style){if(this.options.colors&&this.options.colors.length>0){style.setProperty('--box-shadow-color',this.options.colors[0]);style.setProperty('--light-color',this.options.colors[1]);}}}]);return FluorescenceMarker;}(_Marker2.default);exports["default"]=FluorescenceMarker;
  14293. /***/ }),
  14294. /***/ 6130:
  14295. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14296. "use strict";
  14297. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _colorcolor=_interopRequireDefault(__webpack_require__(9458));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var HaloRingMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(HaloRingMarker,_Marker);var _super=(0,_createSuper2.default)(HaloRingMarker);function HaloRingMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,HaloRingMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(HaloRingMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--halo-ring');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14298. var style=markerContainer[i].style;style.setProperty('--halo-width',this.options.width+'px');style.setProperty('--halo-left',-this.options.width/2+'px');style.setProperty('--box-shadow-width-1',this.options.width/10+'px');style.setProperty('--box-shadow-width-2',this.options.width/4+'px');}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var markerContainer=document.getElementsByClassName('sm-component-animate-marker--halo-ring');for(var i=0;i<markerContainer.length;i++){// @ts-ignore
  14299. var style=markerContainer[i].style;style.setProperty('--color-1',this._getColorWithOpacity(this.options.colors[0],0.3));style.setProperty('--color-1-transparent',this._getColorWithOpacity(this.options.colors[0],0.1));style.setProperty('--color-2',this._getColorWithOpacity(this.options.colors[1],0.3));style.setProperty('--color-2-transparent',this._getColorWithOpacity(this.options.colors[1],0.1));}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--halo-ring';var childElements=_this2._createMakerElement(8,'div',['sm-component-animate-marker__ring','sm-component-animate-marker__halo']);childElements.forEach(function(element){markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'halo-ring-name');markerContainer.appendChild(nameContainer);if(_this2.options.width){markerContainer.style.setProperty('--halo-width',_this2.options.width+'px');markerContainer.style.setProperty('--halo-left',-_this2.options.width/2+'px');markerContainer.style.setProperty('--box-shadow-width-1',_this2.options.width/10+'px');markerContainer.style.setProperty('--box-shadow-width-2',_this2.options.width/4+'px');}if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--color-1',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[0],'rgba',true),0.3));markerContainer.style.setProperty('--color-1-transparent',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[0],'rgba',true),0.1));markerContainer.style.setProperty('--color-2',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[1],'rgba',true),0.3));markerContainer.style.setProperty('--color-2-transparent',_this2._getColorWithOpacity((0,_colorcolor.default)(_this2.options.colors[1],'rgba',true),0.1));}_this2.markersElement.push(markerContainer);},this);}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}}]);return HaloRingMarker;}(_Marker2.default);exports["default"]=HaloRingMarker;
  14300. /***/ }),
  14301. /***/ 9853:
  14302. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14303. "use strict";
  14304. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _util=__webpack_require__(9752);var Marker=/*#__PURE__*/function(){function Marker(features){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,Marker);this.markersElement=[];this.features=features;this.options=options;}(0,_createClass2.default)(Marker,[{key:"setFeatures",value:function setFeatures(features){this.markersElement=[];this.features=features;this.features&&this._createMarker();}},{key:"getMarkersElement",value:function getMarkersElement(){return this.markersElement;}},{key:"setMarkersTextField",value:function setMarkersTextField(textField){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.options.textField=textField;var name=document.getElementsByClassName('sm-component-animate-marker__name');for(var i=0;i<name.length;i++){var properties=this.features.features[i]&&this.features.features[i].properties;if(properties&&properties[textField]){name[i].innerHTML=properties[textField];}else{name[i].innerHTML='';}}}},{key:"setMarkersTextFontSize",value:function setMarkersTextFontSize(textFontSize){this.options.textFontSize=textFontSize;var pulse=document.getElementsByClassName('sm-component-animate-marker__name-container');for(var i=0;i<pulse.length;i++){// @ts-ignore
  14305. pulse[i].style.fontSize=textFontSize+'px';}}},{key:"setMarkersTextColor",value:function setMarkersTextColor(textColor){this.options.textColor=textColor;var pulse=document.getElementsByClassName('sm-component-animate-marker__name-container');for(var i=0;i<pulse.length;i++){// @ts-ignore
  14306. pulse[i].style.color=textColor;}}},{key:"_getColorWithOpacity",value:function _getColorWithOpacity(color,opacity){return(0,_util.getColorWithOpacity)(color,opacity);}},{key:"_getTextContainer",value:function _getTextContainer(point,className){var name;if(point.properties&&Object.keys(point.properties).length!==0&&this.options.textField){name=point.properties[this.options.textField];}var nameContainer=document.createElement('div');nameContainer.className="sm-component-animate-marker__name-container sm-component-animate-marker__name-container--".concat(className);this.options.textColor&&(nameContainer.style.color=this.options.textColor);this.options.textFontSize&&(nameContainer.style.fontSize=this.options.textFontSize+'px');var nameSpan=document.createElement('span');nameSpan.className="sm-component-animate-marker__".concat(className," sm-component-animate-marker__name");nameSpan.innerHTML=name||'';nameContainer.appendChild(nameSpan);return nameContainer;}}]);return Marker;}();exports["default"]=Marker;
  14307. /***/ }),
  14308. /***/ 970:
  14309. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14310. "use strict";
  14311. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var RotatingApertureMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(RotatingApertureMarker,_Marker);var _super=(0,_createSuper2.default)(RotatingApertureMarker);function RotatingApertureMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,RotatingApertureMarker);_this=_super.call(this,features,options);_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(RotatingApertureMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;// TODO 待抛出 width 不能小于 40
  14312. if(!this.options.width||this.options.width<40){return;}var dotsMarker=document.getElementsByClassName('sm-component-animate-marker--rotating-aperture');for(var i=0;i<dotsMarker.length;i++){// @ts-ignore
  14313. dotsMarker[i].style.setProperty('--container-width',"".concat(this.options.width,"px"));var dots1=dotsMarker[i].children[0];var dots2=dotsMarker[i].children[1];var dots3=dotsMarker[i].children[2];dots1.setAttribute('style',this._getDotsStyleObj(this.options.width-32));dots2.setAttribute('style',this._getDotsStyleObj(this.options.width-16));dots3.setAttribute('style',this._getDotsStyleObj(this.options.width));}}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){var dotsMarker=document.getElementsByClassName('sm-component-animate-marker--rotating-aperture');for(var i=0;i<dotsMarker.length;i++){// @ts-ignore
  14314. var style=dotsMarker[i].style;style.setProperty('--light-color',this.options.colors[1]);style.setProperty('--color',this.options.colors[0]);style.setProperty('--line-color',this._getColorWithOpacity(this.options.colors[0],0.2));}}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var width=_this2.options.width&&_this2.options.width>=40?_this2.options.width:50;var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--rotating-aperture';var childElements=_this2._createMakerElement(3,'div',['sm-component-animate-marker__dots','sm-component-animate-marker__dots']);childElements.forEach(function(element,index){var elementWidth;index===0&&(elementWidth=width-32);index===1&&(elementWidth=width-16);index===2&&(elementWidth=width);element.setAttribute('style',_this2._getDotsStyleObj(elementWidth));markerContainer.appendChild(element);});var nameContainer=_this2._getTextContainer(point,'rotating-aperture-name');markerContainer.appendChild(nameContainer);if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0&&_this2.options.colors[0].indexOf('rgb')>-1){markerContainer.style.setProperty('--color',_this2.options.colors[0]);markerContainer.style.setProperty('--line-color',_this2._getColorWithOpacity(_this2.options.colors[0],0.2));markerContainer.style.setProperty('--light-color',_this2.options.colors[1]);}markerContainer.style.setProperty('--container-width',width+'px');_this2.markersElement.push(markerContainer);},this);}},{key:"_createMakerElement",value:function _createMakerElement(length,type,classNames){var markerElements=[];for(var i=1;i<length+1;i++){var element=document.createElement(type);element.className="".concat(classNames[0],"-0").concat(i," ").concat(classNames[1]);markerElements.push(element);}return markerElements;}},{key:"_getDotsStyleObj",value:function _getDotsStyleObj(width){return"--dots-width: ".concat(width,"px;\n --dots-height: ").concat(width,"px;\n --dots-box-shadow-x: ").concat(width/2+6,"px;\n --dots-box-shadow-x-negative: -").concat(width/2+6,"px;\n --dots-box-shadow-radius1: ").concat(width/2-2,"px;\n --dots-box-shadow-radius1-negative: -").concat(width/2-2,"px;\n --dots-box-shadow-radius2: ").concat(width/2-3,"px;\n --dots-box-shadow-radius2-negative: -").concat(width/2-3,"px;");}}]);return RotatingApertureMarker;}(_Marker2.default);exports["default"]=RotatingApertureMarker;
  14315. /***/ }),
  14316. /***/ 9041:
  14317. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14318. "use strict";
  14319. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _Marker2=_interopRequireDefault(__webpack_require__(9853));var RotatingTextBorderMarker=/*#__PURE__*/function(_Marker){(0,_inherits2.default)(RotatingTextBorderMarker,_Marker);var _super=(0,_createSuper2.default)(RotatingTextBorderMarker);function RotatingTextBorderMarker(features){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};(0,_classCallCheck2.default)(this,RotatingTextBorderMarker);_this=_super.call(this,features);_this.options=options;_this.features&&_this._createMarker();return _this;}(0,_createClass2.default)(RotatingTextBorderMarker,[{key:"setMarkersWidth",value:function setMarkersWidth(width){this.options.width=width;this._setMarkerContainerProperty({'--clip-width-1':width+width/10+'px','--clip-width-2':width+width/10-2+'px','--boder-width':width+'px','--text-left-position':-width/2+'px'});}},{key:"setMarkersHeight",value:function setMarkersHeight(height){this.options.height=height;this._setMarkerContainerProperty({'--clip-height-1':height+height/10+'px','--clip-height-2':height+height/10-2+'px','--boder-height':height+'px'});}},{key:"setMarkersTextField",value:function setMarkersTextField(textField){if(!this.features||JSON.stringify(this.features)==='{}'){return;}this.options.textField=textField;var name=document.getElementsByClassName('sm-component-animate-marker__text');for(var i=0;i<name.length;i++){var properties=this.features.features[i]&&this.features.features[i].properties;if(properties&&properties[textField]){name[i].innerHTML=properties[textField];}else{name[i].innerHTML='';}}}},{key:"setMarkersTextColor",value:function setMarkersTextColor(textColor){this.options.textColor=textColor;this._setMarkerContainerProperty({'--text-color':textColor});}},{key:"setMarkersTextFontSize",value:function setMarkersTextFontSize(textFontSize){this.options.textFontSize=textFontSize;this._setMarkerContainerProperty({'--text-font-size':textFontSize+'px'});}},{key:"setMarkersColors",value:function setMarkersColors(colors){this.options.colors=colors;if(colors&&colors.length&&colors.length>0){this._setMarkerContainerProperty({'--border-color':colors[0],'--box-shadow-color':colors[1]});}}},{key:"_createMarker",value:function _createMarker(){var _this2=this;this.features.features.forEach(function(point){var markerContainer=document.createElement('div');markerContainer.className='sm-component-animate-marker--text-boder';var border=document.createElement('div');border.className='sm-component-animate-marker__boder';var keys=Object.keys(point.properties);var name;if(point.properties||Object.keys(point.properties).length!==0){name=point.properties[_this2.options.textField]||point.properties[keys[0]];}var span=document.createElement('span');span.className='sm-component-animate-marker__text';span.innerHTML=name||'';border.appendChild(span);if(_this2.options.colors&&_this2.options.colors.length&&_this2.options.colors.length>0){markerContainer.style.setProperty('--border-color',_this2.options.colors[0]);markerContainer.style.setProperty('--box-shadow-color',_this2.options.colors[1]);}_this2.options.textColor&&markerContainer.style.setProperty('--text-color',_this2.options.textColor);_this2.options.textFontSize&&markerContainer.style.setProperty('--text-font-size',_this2.options.textFontSize+'px');if(_this2.options.width){markerContainer.style.setProperty('--clip-width-1',_this2.options.width+_this2.options.width/10+'px');markerContainer.style.setProperty('--clip-width-2',_this2.options.width+_this2.options.width/10-2+'px');markerContainer.style.setProperty('--boder-width',_this2.options.width+'px');markerContainer.style.setProperty('--text-left-position',-_this2.options.width/2+'px');}if(_this2.options.height){markerContainer.style.setProperty('--clip-height-1',_this2.options.height+_this2.options.width/10+'px');markerContainer.style.setProperty('--clip-height-2',_this2.options.height+_this2.options.width/10-2+'px');markerContainer.style.setProperty('--boder-height',_this2.options.height+'px');}if((_this2.options.width||100)>(_this2.options.width||200)){markerContainer.style.setProperty('--animation-name','clipMe2');}else{markerContainer.style.setProperty('--animation-name','clipMe1');}markerContainer.appendChild(border);_this2.markersElement.push(markerContainer);},this);}},{key:"_setMarkerContainerProperty",value:function _setMarkerContainerProperty(properties){var _this3=this;var markerContainer=document.getElementsByClassName('sm-component-animate-marker--text-boder');var _loop=function _loop(){// @ts-ignore
  14320. var style=markerContainer[i].style;Object.keys(properties).forEach(function(key){style.setProperty(key,properties[key]);});if((_this3.options.height||100)>(_this3.options.width||200)){style.setProperty('--animation-name','clipMe2');}else{style.setProperty('--animation-name','clipMe1');}};for(var i=0;i<markerContainer.length;i++){_loop();}}}]);return RotatingTextBorderMarker;}(_Marker2.default);exports["default"]=RotatingTextBorderMarker;
  14321. /***/ }),
  14322. /***/ 9407:
  14323. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14324. "use strict";
  14325. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=__webpack_require__(3899);var _ClusterLayerViewModel=_interopRequireDefault(__webpack_require__(7727));var _CircleStyle=_interopRequireDefault(__webpack_require__(1558));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _dec,_class,_class2;var ClusterLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(ClusterLayer,_Component);var _super=(0,_createSuper2.default)(ClusterLayer);function ClusterLayer(){(0,_classCallCheck2.default)(this,ClusterLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(ClusterLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this$props=this.props,data=_this$props.data,clusteredPointStyle=_this$props.clusteredPointStyle,unclusteredPointStyle=_this$props.unclusteredPointStyle,clusteredPointTextLayout=_this$props.clusteredPointTextLayout;if(!(0,_lodash.default)(data,prevProps.data)){this.viewModel&&this.viewModel.setData(data);}if(prevProps.clusteredPointStyle!==clusteredPointStyle){this.viewModel&&this.viewModel.setClusteredPointStyle(clusteredPointStyle);}if(prevProps.unclusteredPointStyle!==unclusteredPointStyle){this.viewModel&&this.viewModel.setUnclusteredPointStyle(unclusteredPointStyle);}if(prevProps.clusteredPointTextLayout!==clusteredPointTextLayout){this.viewModel&&this.viewModel.setClusteredPointTextLayout(clusteredPointTextLayout);}}},{key:"loaded",value:function loaded(map){var options=JSON.parse(JSON.stringify(this.props));delete options.data;this.viewModel=new _ClusterLayerViewModel.default(map,this.props.data,(0,_objectSpread2.default)({},options));}},{key:"render",value:function render(){return null;}}]);return ClusterLayer;}(_react.Component),_class2.defaultProps={radius:50,maxZoom:14,clusteredPointStyle:new _CircleStyle.default({'circle-color':['step',['get','point_count'],'#51bbd6',100,'#f1f075',750,'#f28cb1'],'circle-radius':['step',['get','point_count'],20,100,30,750,40]}),unclusteredPointStyle:new _CircleStyle.default({'circle-color':'#11b4da','circle-radius':4,'circle-stroke-width':1,'circle-stroke-color':'#fff'})},_class2))||_class);var _default=ClusterLayer;exports["default"]=_default;
  14326. /***/ }),
  14327. /***/ 7727:
  14328. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14329. "use strict";
  14330. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));/**
  14331. * @class ClusterLayerViewModel
  14332. * @param {mapboxgl.map} map - mapboxgl map 对象。
  14333. * @param {Object} data - Cluster layer data。
  14334. * @param {Object} options - 可选参数。
  14335. * @param {String} [options.layerId] - 图层 ID。
  14336. * @param {Object} [options.clusteredPointStyle] - 聚合点的 Paint 对象。
  14337. * @param {Object} [options.unclusteredPointStyle] - 未聚合的点的 Paint 对象。
  14338. * @param {Object} [options.clusteredPointTextLayout] - 聚合点的文本 layout 对象
  14339. * @param {number} [options.radius=50] - 图层聚合点半径。
  14340. * @param {number} [options.maxZoom=14] - 图层最大显示级别。
  14341. */var ClusterLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(ClusterLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(ClusterLayerViewModel);function ClusterLayerViewModel(map,data){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};(0,_classCallCheck2.default)(this,ClusterLayerViewModel);_this=_super.call(this);_this.options=options;if(!map){throw new Error('map is requierd');}_this.map=map;_this.data=data;_this.layerId=options.layerId||'clusterLayer'+new Date().getTime();_this.data&&_this._initializeClusterLayer();return _this;}(0,_createClass2.default)(ClusterLayerViewModel,[{key:"setData",value:function setData(data){if(!data){return;}this.data=data;if(this.layerId&&!this.map.getSource(this.layerId)){this._initializeClusterLayer();}else{this.map.getSource(this.layerId).setData(data);}}},{key:"setClusteredPointStyle",value:function setClusteredPointStyle(clusteredPointStyle){if(!clusteredPointStyle||this.layerId&&!this.map.getSource(this.layerId)){return;}this.options.clusteredPointStyle=clusteredPointStyle;this._setPaintProperty(clusteredPointStyle.paint,this.layerId);this._setLayoutProperty(clusteredPointStyle.layout,this.layerId);}},{key:"setUnclusteredPointStyle",value:function setUnclusteredPointStyle(unclusteredPointStyle){var layerId='unclustered_point'+this.layerId;if(!unclusteredPointStyle||!this.map.getSource(layerId)){return;}this.options.unclusteredPointStyle=unclusteredPointStyle;this._setPaintProperty(unclusteredPointStyle.paint,layerId);this._setLayoutProperty(unclusteredPointStyle.layout,layerId);}},{key:"setClusteredPointTextLayout",value:function setClusteredPointTextLayout(clusteredPointTextLayout){var layerId='count_'+this.layerId;if(!clusteredPointTextLayout||!this.map.getSource(layerId)){return;}this.options.clusteredPointTextLayout=clusteredPointTextLayout;this._setLayoutProperty(clusteredPointTextLayout,layerId);}},{key:"_setPaintProperty",value:function _setPaintProperty(paint,layerId){var _this2=this;Object.keys(paint).forEach(function(key){_this2.map.setPaintProperty(layerId,key,paint[key]);});}},{key:"_setLayoutProperty",value:function _setLayoutProperty(layout,layerId){var _this3=this;Object.keys(layout).forEach(function(key){_this3.map.setLayoutProperty(layerId,key,layout[key]);});}},{key:"_initializeClusterLayer",value:function _initializeClusterLayer(){var _this4=this;this.map.addSource(this.layerId,{type:'geojson',data:this.data,cluster:true,clusterMaxZoom:this.options.maxZoom||14,clusterRadius:this.options.radius||50});this.map.addLayer({id:this.layerId,type:'circle',source:this.layerId,filter:['has','point_count'],paint:this.options.clusteredPointStyle&&this.options.clusteredPointStyle.paint||{'circle-color':['step',['get','point_count'],'#51bbd6',100,'#f1f075',750,'#f28cb1'],'circle-radius':['step',['get','point_count'],20,100,30,750,40]}});// 聚合点文本 layer
  14342. this.map.addLayer({id:'count_'+this.layerId,type:'symbol',source:this.layerId,filter:['has','point_count'],layout:this.options.clusteredPointTextLayout||{'text-field':'{point_count_abbreviated}','text-font':['DIN Offc Pro Medium','Arial Unicode MS Bold'],'text-size':12}});// 未聚合点 layer
  14343. this.map.addLayer({id:'unclustered_point'+this.layerId,type:'circle',source:this.layerId,filter:['!',['has','point_count']],paint:this.options.unclusteredPointStyle&&this.options.unclusteredPointStyle.paint||{'circle-color':'#11b4da','circle-radius':4,'circle-stroke-width':1,'circle-stroke-color':'#fff'}});/**
  14344. * @event addcusterlayersucceeded
  14345. * @description 添加点聚合图层成功后触发。
  14346. * @property {Object} map - mapboxgl map 对象。
  14347. */this.fire('addcusterlayersucceeded',{map:this.map});this.map.on('click',this.layerId,function(e){var features=_this4.map.queryRenderedFeatures(e.point,{layers:[_this4.layerId]});var clusterId=features[0].properties.cluster_id;_this4.map.getSource(_this4.layerId).getClusterExpansionZoom(clusterId,function(err,zoom){if(err)return;_this4.map.easeTo({center:features[0].geometry.coordinates,zoom:zoom});});});this.map.on('mouseenter',this.layerId,function(){_this4.map.getCanvas().style.cursor='pointer';});this.map.on('mouseleave',this.layerId,function(){_this4.map.getCanvas().style.cursor='';});}}]);return ClusterLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=ClusterLayerViewModel;
  14348. /***/ }),
  14349. /***/ 2313:
  14350. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14351. "use strict";
  14352. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _DataFlowLayerViewModel=_interopRequireDefault(__webpack_require__(9162));var _types=__webpack_require__(2009);var _util=__webpack_require__(9752);var _dec,_class,_class2;var DataFlowLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(DataFlowLayer,_React$Component);var _super=(0,_createSuper2.default)(DataFlowLayer);function DataFlowLayer(){(0,_classCallCheck2.default)(this,DataFlowLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(DataFlowLayer,[{key:"loaded",value:function loaded(map){var options=JSON.parse(JSON.stringify(this.props));delete options.serviceUrl;this.viewModel=new _DataFlowLayerViewModel.default(map,this.props.serviceUrl,(0,_objectSpread2.default)({},options));this.registerEvents();}},{key:"registerEvents",value:function registerEvents(){var _this=this;// @ts-ignore
  14353. this.viewModel.on('subscribefailed',function(e){// this.$message.error(this.$t('dataFlow.dataSubscriptionFailed'));
  14354. /**
  14355. * @event subscribeFailed
  14356. * @desc 数据订阅失败后触发。
  14357. * @property {Object} e - 事件对象。
  14358. */(0,_util.isFunction)(_this.props.onSubscribeFailed)&&_this.props.onSubscribeFailed(e);});// @ts-ignore
  14359. this.viewModel.on('subscribesucceeded',function(e){/**
  14360. * @event subscribeSucceeded
  14361. * @desc 数据订阅失败后触发。
  14362. * @property {Object} e - 事件对象。
  14363. */(0,_util.isFunction)(_this.props.onSubscribeSucceeded)&&_this.props.onSubscribeSucceeded(e);});// @ts-ignore
  14364. this.viewModel.on('dataupdated',function(e){/**
  14365. * @event dataUpdated
  14366. * @desc 数据更新成功后触发。
  14367. * @property {GeoJSONObject} data - 更新的数据。
  14368. * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
  14369. */(0,_util.isFunction)(_this.props.onDataUpdated)&&_this.props.onDataUpdated(e);});}},{key:"render",value:function render(){return null;}}]);return DataFlowLayer;}(_react.default.Component),_class2.defaultProps={layerStyle:{line:new _types.LineStyle(),circle:new _types.CircleStyle(),fill:new _types.FillStyle()}},_class2))||_class);exports["default"]=DataFlowLayer;
  14370. /***/ }),
  14371. /***/ 9162:
  14372. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14373. "use strict";
  14374. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _lodash=_interopRequireDefault(__webpack_require__(3465));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);/**
  14375. * @class DataFlowLayerViewModel
  14376. * @category ViewModel
  14377. * @classdesc 数据流图层组件功能类。
  14378. * @param {mapboxgl.Map} map - mapboxgl map 对象。
  14379. * @param {String} serviceUrl - 数据流服务地址。
  14380. * @param {Object} [options] - 可选参数。
  14381. * @param {String} [options.layerId] - 图层 ID。
  14382. * @param {Object} [options.layerStyle] - 指定图层样式。
  14383. * @param {GeoJSONObject} [options.geometry] - 指定几何范围,该范围内的要素才能被订阅。
  14384. * @param {String} [options.excludeField] - 排除字段。
  14385. * @param {Object} [options.styleOptions] - style OPtion
  14386. * @fires DataFlowLayerViewModel#subscribesucceeded
  14387. * @fires DataFlowLayerViewModel#subscribefailed
  14388. * @fires DataFlowLayerViewModel#dataUpdated
  14389. */var DataFlowLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(DataFlowLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(DataFlowLayerViewModel);function DataFlowLayerViewModel(map,serviceUrl,options){var _this;(0,_classCallCheck2.default)(this,DataFlowLayerViewModel);_this=_super.call(this);if(!serviceUrl){throw new Error('serviceUrl is requierd');}if(!map){throw new Error('map is requierd');}_this.options=options||{};_this.map=map;_this.serviceUrl=serviceUrl;_this.sourceID=options.layerId||'dataFlow'+new Date().getTime();_this.layerStyle=options.layerStyle||{};if(_this.options.registerToken){SuperMap.SecurityManager.registerToken(_this.serviceUrl,_this.options.registerToken);}_this._initializeDataFlow();return _this;}(0,_createClass2.default)(DataFlowLayerViewModel,[{key:"setLayerStyle",value:function setLayerStyle(layerStyle){this.layerStyle=layerStyle;}/**
  14390. * @function DataFlowLayerViewModel.prototype.setExcludeField
  14391. * @description 设置唯一字段。
  14392. * @param {string} excludeField - 唯一字段。
  14393. */},{key:"setExcludeField",value:function setExcludeField(excludeField){this.dataService.setExcludeField(excludeField);this.options.excludeField=excludeField;return this;}/**
  14394. * @function DataFlowLayerViewModel.prototype.setGeometry
  14395. * @description 设置集合要素。
  14396. * @param {GeoJSONObject} geometry - 待设置的 GeoJSON 几何要素对象。
  14397. */},{key:"setGeometry",value:function setGeometry(geometry){this.dataService.setGeometry(geometry);this.options.geometry=geometry;return this;}},{key:"_initializeDataFlow",value:function _initializeDataFlow(){var _this2=this;var dataService=new _mapboxGlEnhance.default.supermap.DataFlowService(this.serviceUrl,{geometry:this.options.geometry,excludeField:this.options.excludeField}).initSubscribe();dataService.on('subscribeSocketConnected',function(e){/**
  14398. * @event DataFlowLayerViewModel#subscribesucceeded
  14399. * @description 数据订阅成功后触发。
  14400. * @property {Object} e - 事件对象。
  14401. */_this2.fire('subscribesucceeded',e);});dataService.on('subscribeSocketError',function(e){/**
  14402. * @event DataFlowLayerViewModel#subscribefailed
  14403. * @description 数据订阅失败后触发。
  14404. * @property {Object} e - 事件对象。
  14405. */_this2.fire('subscribefailed',e);});dataService.on('messageSucceeded',function(msg){_this2._addLayer(msg);});this.dataService=dataService;}},{key:"_addLayer",value:function _addLayer(msg){if(!msg.featureResult){return;}var feature=msg.featureResult;var type=feature.geometry.type;var layerStyle=this.layerStyle;if(!this.map.getSource(this.sourceID)){this.map.addSource(this.sourceID,{type:'geojson',data:{type:'FeatureCollection',features:[feature]}});if(type==='Point'){var pointType='circle';var pointPaint={'circle-radius':6,'circle-color':'red'};if(layerStyle.symbol){pointType='symbol';pointPaint={};}this.map.addLayer({id:this.sourceID,type:pointType,source:this.sourceID,paint:layerStyle[pointType]&&layerStyle[pointType].paint||pointPaint,layout:layerStyle[pointType]&&layerStyle[pointType].layout||{}});}else if(type==='MultiPolygon'||type==='Polygon'){this.map.addLayer({id:this.sourceID,type:'fill',paint:layerStyle.fill&&layerStyle.fill.paint||{'fill-color':'red','fill-opacity':1},layout:layerStyle.fill&&layerStyle.fill.layout||{},source:this.sourceID});}else if(type==='LineString'||type==='Line'||type==='MultiLineString'){this.map.addLayer({id:this.sourceID,type:'line',paint:layerStyle.line&&layerStyle.line.paint||{'line-width':5,'line-color':'red','line-opacity':1},layout:layerStyle.line&&layerStyle.line.layout||{},source:this.sourceID});}}else{// update layer
  14406. var features=(0,_lodash.default)(this.map.getSource(this.sourceID)._data.features);var has=false;features.forEach(function(item,index){if(item.properties.id===feature.properties.id){has=true;features[index]=feature;}});if(!has){features.push(feature);}this.map.getSource(this.sourceID).setData({type:'FeatureCollection',features:features});/**
  14407. * @event DataFlowLayerViewModel#dataUpdated
  14408. * @description 数据更新成功后触发。
  14409. * @property {GeoJSONObject} data - 更新的数据。
  14410. * @property {mapboxgl.Map} map - MapBoxGL Map 对象。
  14411. */this.fire('dataupdated',{data:feature,map:this.map});}}}]);return DataFlowLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=DataFlowLayerViewModel;
  14412. /***/ }),
  14413. /***/ 9183:
  14414. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14415. "use strict";
  14416. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=__webpack_require__(3899);var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _DeckglLayerViewModel=_interopRequireDefault(__webpack_require__(5703));var _dec,_class;var LAYER_TYPE_ID_LIST=['scatter-plot','path-layer','polygon-layer','arc-layer','hexagon-layer','screen-grid-layer'];var DeckglLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_Component){(0,_inherits2.default)(DeckglLayer,_Component);var _super=(0,_createSuper2.default)(DeckglLayer);function DeckglLayer(){(0,_classCallCheck2.default)(this,DeckglLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(DeckglLayer,[{key:"loaded",value:function loaded(map){var _this=this;var matchIndex=LAYER_TYPE_ID_LIST.findIndex(function(item){return item===_this.props.layerType;});if(matchIndex>-1){this.viewModel=new _DeckglLayerViewModel.default(map,this.props);}}},{key:"render",value:function render(){return null;}}]);return DeckglLayer;}(_react.Component))||_class);exports["default"]=DeckglLayer;
  14417. /***/ }),
  14418. /***/ 5703:
  14419. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14420. "use strict";
  14421. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);__webpack_require__(2371);var DeckglLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(DeckglLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(DeckglLayerViewModel);function DeckglLayerViewModel(map,deckglProps){var _this;(0,_classCallCheck2.default)(this,DeckglLayerViewModel);_this=_super.call(this);_this.map=map;var layerType=deckglProps.layerType,options=deckglProps.options,layerId=deckglProps.layerId;_this.layerType=layerType;options.data=options.data||[];options.layerId=options.layerId||layerId;_this.options=options;_this._init();return _this;}(0,_createClass2.default)(DeckglLayerViewModel,[{key:"_init",value:function _init(){if(this.layerType&&this.options){this._addDeckglLayer();}}},{key:"_addDeckglLayer",value:function _addDeckglLayer(){var deckglLayer=new _mapboxGlEnhance.default.supermap.DeckglLayer(this.layerType,this.options);this.map.addLayer(deckglLayer);}}]);return DeckglLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=DeckglLayerViewModel;
  14422. /***/ }),
  14423. /***/ 1762:
  14424. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14425. "use strict";
  14426. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _EchatsLayerViewModel=_interopRequireDefault(__webpack_require__(3395));var _dec,_class;var EchartsLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(EchartsLayer,_React$Component);var _super=(0,_createSuper2.default)(EchartsLayer);function EchartsLayer(){(0,_classCallCheck2.default)(this,EchartsLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(EchartsLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _EchatsLayerViewModel.default(map,this.props.options);}},{key:"render",value:function render(){return null;}}]);return EchartsLayer;}(_react.default.Component))||_class);exports["default"]=EchartsLayer;
  14427. /***/ }),
  14428. /***/ 3395:
  14429. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14430. "use strict";
  14431. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _echarts=_interopRequireDefault(__webpack_require__(550));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var _EchartsLayer=_interopRequireDefault(__webpack_require__(3094));/**
  14432. * @class EchatsLayerViewModel
  14433. * @param {mapboxgl.map} map - mapboxgl map 对象。
  14434. * @param {String} options - EchartsLayer options。
  14435. */var EchatsLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(EchatsLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(EchatsLayerViewModel);function EchatsLayerViewModel(map,options){var _this;(0,_classCallCheck2.default)(this,EchatsLayerViewModel);_this=_super.call(this);if(!options){throw new Error('echarts options is requierd');}if(!map){throw new Error('map is requierd');}_this.map=map;_this.options=options;_this._initializeEchartsLayer();return _this;}(0,_createClass2.default)(EchatsLayerViewModel,[{key:"_initializeEchartsLayer",value:function _initializeEchartsLayer(){window.echarts=_echarts.default;var echartslayer=new _EchartsLayer.default(this.map);echartslayer.chart.setOption(this.options);/**
  14436. * @event echartslayeraddsucceeded
  14437. * @property {Object} layer - Echarts Layer.
  14438. */this.fire('echartslayeraddsucceeded',{layer:echartslayer});this.echartslayer=echartslayer;}}]);return EchatsLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=EchatsLayerViewModel;
  14439. /***/ }),
  14440. /***/ 4799:
  14441. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14442. "use strict";
  14443. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _FireLayerViewModel=_interopRequireDefault(__webpack_require__(5382));var _dec,_class,_class2;var FireLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(FireLayer,_React$Component);var _super=(0,_createSuper2.default)(FireLayer);function FireLayer(){(0,_classCallCheck2.default)(this,FireLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(FireLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this$props=this.props,features=_this$props.features,modelScale=_this$props.modelScale;if(this.viewModel){if(!(0,_lodash.default)(prevProps.features,features)){this.viewModel.setFeatures(features);}if(prevProps.modelScale!==modelScale){this.viewModel.setModelScale(modelScale);}}}},{key:"loaded",value:function loaded(map){this.viewModel=new _FireLayerViewModel.default(map,this.props.features,this.props.modelScale,this.props.layerId);}},{key:"render",value:function render(){return null;}}]);return FireLayer;}(_react.default.Component),_class2.defaultProps={modelScale:5.41843220338983e-6},_class2))||_class);exports["default"]=FireLayer;
  14444. /***/ }),
  14445. /***/ 5382:
  14446. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14447. "use strict";
  14448. var _interopRequireWildcard=(__webpack_require__(5263)["default"]);var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _toConsumableArray2=_interopRequireDefault(__webpack_require__(2982));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var THREE=_interopRequireWildcard(__webpack_require__(2069));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var _tendrils=_interopRequireDefault(__webpack_require__(2769));/**
  14449. * @class FireLayerViewModel
  14450. * @param {mapboxgl.map} map - mapboxgl map 对象。
  14451. */var FireLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(FireLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(FireLayerViewModel);function FireLayerViewModel(map,features){var _this;var modelScale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:5.41843220338983e-6;var layerId=arguments.length>3?arguments[3]:undefined;(0,_classCallCheck2.default)(this,FireLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}_this.map=map;_this.layerId=layerId;_this.features=features;_this.modelScale=modelScale;_this.features&&_this._addFireLayer();return _this;}(0,_createClass2.default)(FireLayerViewModel,[{key:"setFeatures",value:function setFeatures(features){this.features=features;this._addFireLayer();}},{key:"setModelScale",value:function setModelScale(modelScale){this.modelScale=modelScale;this._addFireLayer();}},{key:"_addFireLayer",value:function _addFireLayer(){var _this2=this;var feature=this.features.features[0];if(feature.geometry.type!=='Point'){throw new Error("Feature's type must be point");}if(this.features.features.length>50){throw new Error('The maximum number of features is 50');}this.features.features.forEach(function(feature,index){var geometry=feature.geometry;if(geometry.type==='Point'){_this2._initializeFireLayer(geometry.coordinates,index);}});}},{key:"_initializeFireLayer",value:function _initializeFireLayer(originCoordinate,index){var _this3=this;var modelTransform=this._getModelTransform(originCoordinate);var layerId=this.layerId&&this.layerId+'-'+index||"threeLayerFire-".concat(new Date());this.map.getLayer(layerId)&&this.map.removeLayer(layerId);var customLayer={id:layerId,type:'custom',renderingMode:'3d',onAdd:function onAdd(map,gl){_this3.camera=new THREE.PerspectiveCamera(45,map.getCanvas().width/map.getCanvas().height,0.1,2000);_this3.scene=new THREE.Scene();_this3.renderer=new THREE.WebGLRenderer({canvas:map.getCanvas(),context:gl,antialias:true});_this3.renderer.autoClear=false;var rig=new THREE.Group();rig.add(_this3.camera);_this3.scene.add(rig);_this3._fire();_this3.scene.add(_this3._object);var light=new THREE.PointLight(0xffffff,1,100);light.position.set(10,10,20);_this3.scene.add(light);_this3.map=map;},render:function render(gl,matrix){var rotationX=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1,0,0),modelTransform.rotateX);var rotationY=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,1,0),modelTransform.rotateY);var rotationZ=new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(0,0,1),modelTransform.rotateZ);var m=new THREE.Matrix4().fromArray(matrix);var l=new THREE.Matrix4().makeTranslation(modelTransform.translateX,modelTransform.translateY,modelTransform.translateZ).scale(new THREE.Vector3(modelTransform.scale,-modelTransform.scale,modelTransform.scale)).multiply(rotationX).multiply(rotationY).multiply(rotationZ);_this3.camera.projectionMatrix.elements=matrix;_this3.camera.projectionMatrix=m.multiply(l);_this3.renderer.state.reset();_this3._update();_this3.renderer.render(_this3.scene,_this3.camera);// @ts-ignore
  14452. _this3.map.triggerRepaint();}};// @ts-ignore TODO mapbox-gl types 未更新
  14453. this.map.addLayer(customLayer);}},{key:"_getModelTransform",value:function _getModelTransform(originCoordinate){var modelOrigin=originCoordinate;var modelAltitude=0;var modelRotate=[Math.PI/2,0,0];var modelTransform={translateX:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).x,translateY:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).y,translateZ:_mapboxGlEnhance.default.MercatorCoordinate.fromLngLat(modelOrigin,modelAltitude).z,rotateX:modelRotate[0],rotateY:modelRotate[1],rotateZ:modelRotate[2],scale:this.modelScale};return modelTransform;}},{key:"_fire",value:function _fire(){var _this$_object;var density=arguments.length>0&&arguments[0]!==undefined?arguments[0]:150;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:8;var r=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0.2;this._object=new THREE.Group();this._fireballs=[];this._height=height;this._radius=r;var texture=new THREE.TextureLoader().load(_tendrils.default,function(){console.log('loaded');},undefined,function(e){console.log('error',e);});// @ts-ignore
  14454. texture.crossOrigin='';// "anonymous";
  14455. this._fireMaterial=new THREE.ShaderMaterial({uniforms:{time:{value:1.0},blend:{value:1.0},blendPattern:{type:'t',value:texture}},vertexShader:"precision mediump float;\n precision mediump int;\n attribute vec4 color;\n varying vec2 vUv;\n varying float vFade;\n void main()\t{\n vUv = uv;\n vec4 localPosition = vec4( position, 1);\n vFade = clamp((localPosition.y + 3.0) / 6.0, 0.0, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * localPosition;\n }",fragmentShader:"precision mediump float;\n precision mediump int;\n uniform float time;\n uniform float blend;\n uniform sampler2D blendPattern;\n varying float vFade;\n varying vec2 vUv;\n\n\n void main()\t{\n\n vec4 startColor = vec4(1., 0.5, 0.1, 1.0);\n vec4 endColor = vec4(0.2, 0.2, 0.2, 1.0);\n\n float dissolve = texture2D(blendPattern, vUv).r * 0.5;\n\n float spread = 0.4;\n\n float fadeAmount = smoothstep(\n max(0.0, vFade - spread),\n min(1.0, vFade + spread),\n blend + dissolve\n );\n\n vec4 color = mix(\n startColor, endColor,\n smoothstep(0.1,1., fadeAmount)\n );\n\n gl_FragColor = vec4(color.rgb, 1.-fadeAmount);\n }",transparent:true,side:THREE.DoubleSide,blending:THREE.AdditiveBlending});this._light=new THREE.PointLight(0xff5500,1,100);this._light.position.set(0,0.4,0);this._lightIntensity=Math.random()*5;this._object.add(this._light);// this._fireMaterial = new THREE.MeshStandardMaterial(0x661100);
  14456. for(var i=0;i<density;i++){var geometry=new THREE.SphereGeometry(1,32,32);var mat=this._fireMaterial.clone();mat.uniforms.blendPattern.value=texture;mat.needsUpdate=true;var sphere=new THREE.Mesh(geometry,mat);sphere.position.y=Math.random()*height;sphere.position.x=(0.5-Math.random())*this._radius;sphere.position.z=(0.5-Math.random())*this._radius;sphere.rotateX(Math.random()*5);sphere.rotateZ(Math.random()*5);sphere.rotateY(Math.random()*5);// @ts-ignore
  14457. sphere.dirX=(0.5-Math.random())*0.006;// @ts-ignore
  14458. sphere.dirY=0.006;// @ts-ignore
  14459. sphere.dirZ=(0.5-Math.random())*0.006;this._fireballs.push(sphere);}(_this$_object=this._object).add.apply(_this$_object,(0,_toConsumableArray2.default)(this._fireballs));}},{key:"_update",value:function _update(){var _this4=this;this._fireballs.forEach(function(ball){ball.position.y+=ball.dirY;ball.position.x+=Math.sin(ball.position.y)*ball.dirX;ball.position.z+=Math.cos(ball.position.y)*ball.dirZ;if(ball.position.y>_this4._height){ball.position.y=Math.random()*0.1;ball.position.x=(0.5-Math.random())*_this4._radius;ball.position.z=(0.5-Math.random())*_this4._radius;}var p=0.1+ball.position.y/_this4._height;ball.rotateX((1.2-p)*0.01);ball.rotateZ((1.2-p)*0.01);ball.rotateY((1.2-p)*0.01);ball.scale.set(p,p,p);/// ball.opacity = p;
  14460. ball.material.uniforms.blend.value=p;// ball.material.needsUpdate = true;
  14461. });this._light.intensity+=(this._lightIntensity-this._light.intensity)*0.006;if(Math.random()>0.8){this._lightIntensity=Math.random()*5;}}}]);return FireLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=FireLayerViewModel;
  14462. /***/ }),
  14463. /***/ 9704:
  14464. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14465. "use strict";
  14466. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=__webpack_require__(3899);var _GeojsonLayerViewModel=_interopRequireDefault(__webpack_require__(8428));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _dec,_class;var GeojsonLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_Component){(0,_inherits2.default)(GeojsonLayer,_Component);var _super=(0,_createSuper2.default)(GeojsonLayer);function GeojsonLayer(){(0,_classCallCheck2.default)(this,GeojsonLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(GeojsonLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!(0,_lodash.default)(this.props.layerStyle,prevProps.layerStyle)&&this.viewModel){this.viewModel.setLayerStyle(this.props.layerStyle);}if(!(0,_lodash.default)(this.props.data,prevProps.data)&&this.viewModel){this.viewModel.setData(this.props.data);}}},{key:"loaded",value:function loaded(map){this.viewModel=new _GeojsonLayerViewModel.default(map,this.props);}},{key:"render",value:function render(){return null;}}]);return GeojsonLayer;}(_react.Component))||_class);exports["default"]=GeojsonLayer;
  14467. /***/ }),
  14468. /***/ 8428:
  14469. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14470. "use strict";
  14471. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));var GeojsonLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(GeojsonLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(GeojsonLayerViewModel);function GeojsonLayerViewModel(map,GeojsonLayerOptions){var _this;(0,_classCallCheck2.default)(this,GeojsonLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}_this.map=map;var layerStyle=GeojsonLayerOptions.layerStyle,data=GeojsonLayerOptions.data,layerId=GeojsonLayerOptions.layerId;_this.data=data;_this.layerStyle=layerStyle;_this.layerId=layerId;_this.data&&_this._addLayer();return _this;}(0,_createClass2.default)(GeojsonLayerViewModel,[{key:"setData",value:function setData(data){if(!data||!this.map.getSource(this.layerId)){return;}this.data=data;if(this.layerId&&!this.map.getSource(this.layerId)){this._addLayer();}else{this.map.getSource(this.layerId).setData(data);}}},{key:"setLayerStyle",value:function setLayerStyle(layerStyle){if(!layerStyle||!this.map.getSource(this.layerId)){return;}var paint=layerStyle.paint,layout=layerStyle.layout;for(var _i=0,_Object$keys=Object.keys(paint);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];this.map.setPaintProperty(this.layerId,prop,paint[prop]);}for(var _i2=0,_Object$keys2=Object.keys(layout);_i2<_Object$keys2.length;_i2++){var _prop=_Object$keys2[_i2];this.map.setLayoutProperty(this.layerId,_prop,layout[_prop]);}this.layerStyle=layerStyle;}},{key:"_addLayer",value:function _addLayer(){if(!(this.layerStyle instanceof Object))throw new Error('layerStyle must be object');var _this$layerStyle=this.layerStyle,paint=_this$layerStyle.paint,layout=_this$layerStyle.layout;this.map.addLayer({id:this.layerId,type:this._getLayerType(paint),source:{type:'geojson',data:this.data},layout:layout||{},paint:paint||{}});}},{key:"_getLayerType",value:function _getLayerType(){var paint=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var keys=Object.keys(paint).join(' ');var reg=/circle-|line-|fill-extrusion-|fill-+/i;var matchType=keys.match(reg);var type=matchType?matchType[0]:'';return type.substr(0,type.length-1);}}]);return GeojsonLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=GeojsonLayerViewModel;
  14472. /***/ }),
  14473. /***/ 910:
  14474. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14475. "use strict";
  14476. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _util=__webpack_require__(9752);var _GraphThemeLayerViewModel=_interopRequireDefault(__webpack_require__(1043));var _dec,_class,_class2;var GraphThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(GraphThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(GraphThemeLayer);function GraphThemeLayer(){(0,_classCallCheck2.default)(this,GraphThemeLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(GraphThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _GraphThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return GraphThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{},chartsType:'Bar'},_class2))||_class);exports["default"]=GraphThemeLayer;
  14477. /***/ }),
  14478. /***/ 1043:
  14479. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14480. "use strict";
  14481. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var GraphThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(GraphThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(GraphThemeLayerViewModel);function GraphThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,GraphThemeLayerViewModel);_this=_super.call(this);_this.map=map;var layerName=themeProps.layerName,options=themeProps.options,chartsType=themeProps.chartsType,layerId=themeProps.layerId,data=themeProps.data;_this.layerName=layerName||layerId;_this.chartsType=chartsType||'Bar';options.id=options.id||layerId;_this.options=options;_this.data=data||{};_this._init();return _this;}(0,_createClass2.default)(GraphThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.GraphThemeLayer(this.layerName,this.chartsType,this.options);this.map.addLayer(this.themeLayer);if(JSON.stringify(this.data)!=='{}'){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return GraphThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=GraphThemeLayerViewModel;
  14482. /***/ }),
  14483. /***/ 6073:
  14484. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14485. "use strict";
  14486. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _HeatmapLayerViewModel=_interopRequireDefault(__webpack_require__(9354));var _HeatMapStyle=_interopRequireDefault(__webpack_require__(9623));var _dec,_class,_class2;var HeatmapLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(HeatmapLayer,_React$Component);var _super=(0,_createSuper2.default)(HeatmapLayer);function HeatmapLayer(){(0,_classCallCheck2.default)(this,HeatmapLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(HeatmapLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(prevProps.layerStyle!==this.props.layerStyle){this.viewModel&&this.viewModel.setLayerStyle(this.props.layerStyle);}if(!(0,_lodash.default)(this.props.data,prevProps.data)&&this.viewModel){this.viewModel.setData(this.props.data);}}},{key:"loaded",value:function loaded(map){var _this$props=this.props,data=_this$props.data,layerId=_this$props.layerId,layerStyle=_this$props.layerStyle;this.viewModel=new _HeatmapLayerViewModel.default(map,data,{layerId:layerId,layerStyle:layerStyle});}},{key:"render",value:function render(){return null;}}]);return HeatmapLayer;}(_react.default.Component),_class2.defaultProps={layerStyle:new _HeatMapStyle.default()},_class2))||_class);exports["default"]=HeatmapLayer;
  14487. /***/ }),
  14488. /***/ 9354:
  14489. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14490. "use strict";
  14491. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));/**
  14492. * @class HeatMapLayerViewModel
  14493. * @param {mapboxgl.map} map - mapboxgl map 对象。
  14494. * @param {String} data - 热力图数据。
  14495. * @param {Object} options - 可选参数。
  14496. * @param {Object} [options.layerId] - 图层名。
  14497. * @param {Object} [options.layerStyle] - 图层样式配置。
  14498. */var HeatMapLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(HeatMapLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(HeatMapLayerViewModel);function HeatMapLayerViewModel(map,data,options){var _this;(0,_classCallCheck2.default)(this,HeatMapLayerViewModel);_this=_super.call(this);if(!map){throw new Error('map is requierd');}options=options||{};_this.map=map;_this.data=data;_this.layerId=options.layerId||'heatmap'+new Date().getTime();var layerStyle=options.layerStyle;_this.paint=layerStyle&&layerStyle.paint;_this.layout=layerStyle&&layerStyle.layout;_this._initializeHeatMapLayer();return _this;}(0,_createClass2.default)(HeatMapLayerViewModel,[{key:"setData",value:function setData(data){if(!data||!this.map.getSource(this.layerId)){return;}this.data=data;if(this.layerId&&!this.map.getSource(this.layerId)){this._initializeHeatMapLayer();}else{this.map.getSource(this.layerId).setData(data);}}},{key:"setLayerStyle",value:function setLayerStyle(layerStyle){if(!layerStyle||!this.map.getSource(this.layerId)){return;}var paint=layerStyle.paint,layout=layerStyle.layout;for(var _i=0,_Object$keys=Object.keys(paint);_i<_Object$keys.length;_i++){var prop=_Object$keys[_i];this.map.setPaintProperty(this.layerId,prop,paint[prop]);}for(var _i2=0,_Object$keys2=Object.keys(layout);_i2<_Object$keys2.length;_i2++){var _prop=_Object$keys2[_i2];this.map.setLayoutProperty(this.layerId,_prop,layout[_prop]);}this.layerStyle=layerStyle;}},{key:"_initializeHeatMapLayer",value:function _initializeHeatMapLayer(){this.map.addSource(this.layerId,{type:'geojson',data:this.data});this.map.addLayer({id:this.layerId,type:'heatmap',source:this.layerId,paint:this.paint||{'heatmap-intensity':['interpolate',['linear'],['zoom'],0,1,9,3],'heatmap-color':['interpolate',['linear'],['heatmap-density'],0,'rgba(33,102,172,0)',0.2,'rgb(103,169,207)',0.4,'rgb(209,229,240)',0.6,'rgb(253,219,199)',0.8,'rgb(239,138,98)',1,'rgb(178,24,43)'],'heatmap-radius':['interpolate',['linear'],['zoom'],0,2,9,20]},layout:this.layout||{}});this.fire('heatmaplayeraddsucceeded',{map:this.map});}}]);return HeatMapLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=HeatMapLayerViewModel;
  14499. /***/ }),
  14500. /***/ 2174:
  14501. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14502. "use strict";
  14503. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=__webpack_require__(3899);var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _util=__webpack_require__(9752);var _LabelThemeLayerViewModel=_interopRequireDefault(__webpack_require__(8499));var _dec,_class,_class2;var LabelThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_Component){(0,_inherits2.default)(LabelThemeLayer,_Component);var _super=(0,_createSuper2.default)(LabelThemeLayer);function LabelThemeLayer(){(0,_classCallCheck2.default)(this,LabelThemeLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(LabelThemeLayer,[{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _LabelThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return LabelThemeLayer;}(_react.Component),_class2.defaultProps={options:{}},_class2))||_class);exports["default"]=LabelThemeLayer;
  14504. /***/ }),
  14505. /***/ 8499:
  14506. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14507. "use strict";
  14508. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var LabelThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(LabelThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(LabelThemeLayerViewModel);function LabelThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,LabelThemeLayerViewModel);_this=_super.call(this);var layerName=themeProps.layerName,options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data;_this.map=map;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(LabelThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.LabelThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);this.themeLayer.addFeatures(this.data);}}]);return LabelThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=LabelThemeLayerViewModel;
  14509. /***/ }),
  14510. /***/ 7:
  14511. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14512. "use strict";
  14513. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _MapvLayerViewModel=_interopRequireDefault(__webpack_require__(8862));var _dec,_class,_class2;var MapvLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(MapvLayer,_React$Component);var _super=(0,_createSuper2.default)(MapvLayer);function MapvLayer(){(0,_classCallCheck2.default)(this,MapvLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(MapvLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _MapvLayerViewModel.default(map,this.props);}},{key:"render",value:function render(){return null;}}]);return MapvLayer;}(_react.default.Component),_class2.defaultProps={options:{},data:{}},_class2))||_class);exports["default"]=MapvLayer;
  14514. /***/ }),
  14515. /***/ 8862:
  14516. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14517. "use strict";
  14518. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _objectSpread2=_interopRequireDefault(__webpack_require__(8683));var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var MapvLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(MapvLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(MapvLayerViewModel);function MapvLayerViewModel(map,mapvLayerProps){var _this;(0,_classCallCheck2.default)(this,MapvLayerViewModel);_this=_super.call(this);_this.map=map;var data=mapvLayerProps.data,options=mapvLayerProps.options,layerId=mapvLayerProps.layerId;_this.data=data;_this.options=options.layerId?options:(0,_objectSpread2.default)((0,_objectSpread2.default)({},options),{},{layerId:layerId});_this._init();return _this;}(0,_createClass2.default)(MapvLayerViewModel,[{key:"_init",value:function _init(){if(this.data&&this.options){this._addMapvLayer();}}},{key:"_addMapvLayer",value:function _addMapvLayer(){var mapVLayer=new _mapboxGlEnhance.default.supermap.MapvLayer('',this.data,this.options);this.map.addLayer(mapVLayer);}}]);return MapvLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=MapvLayerViewModel;
  14519. /***/ }),
  14520. /***/ 5890:
  14521. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14522. "use strict";
  14523. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _util=__webpack_require__(9752);var _RangeThemeLayerViewModel=_interopRequireDefault(__webpack_require__(5040));var _dec,_class,_class2;var RangeThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(RangeThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(RangeThemeLayer);function RangeThemeLayer(){(0,_classCallCheck2.default)(this,RangeThemeLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(RangeThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _RangeThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return RangeThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{}},_class2))||_class);exports["default"]=RangeThemeLayer;
  14524. /***/ }),
  14525. /***/ 5040:
  14526. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14527. "use strict";
  14528. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var RangeThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RangeThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RangeThemeLayerViewModel);function RangeThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,RangeThemeLayerViewModel);_this=_super.call(this);var layerName=themeProps.layerName,options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data;_this.map=map;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(RangeThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.RangeThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);if(this.data&&this.data.length){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return RangeThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=RangeThemeLayerViewModel;
  14529. /***/ }),
  14530. /***/ 3930:
  14531. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14532. "use strict";
  14533. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=__webpack_require__(3899);var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _util=__webpack_require__(9752);var _RanksymbolThemeLayerViewModel=_interopRequireDefault(__webpack_require__(8510));var _dec,_class;var RanksymbolThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_Component){(0,_inherits2.default)(RanksymbolThemeLayer,_Component);var _super=(0,_createSuper2.default)(RanksymbolThemeLayer);function RanksymbolThemeLayer(){(0,_classCallCheck2.default)(this,RanksymbolThemeLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(RanksymbolThemeLayer,[{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _RanksymbolThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return RanksymbolThemeLayer;}(_react.Component))||_class);exports["default"]=RanksymbolThemeLayer;
  14534. /***/ }),
  14535. /***/ 8510:
  14536. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14537. "use strict";
  14538. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var RanksymbolThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RanksymbolThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RanksymbolThemeLayerViewModel);function RanksymbolThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,RanksymbolThemeLayerViewModel);_this=_super.call(this);_this.map=map;var layerName=themeProps.layerName,options=themeProps.options,symbolType=themeProps.symbolType,layerId=themeProps.layerId,data=themeProps.data;_this.layerName=layerName||layerId;_this.symbolType=symbolType||'Circle';options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(RanksymbolThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.RankSymbolThemeLayer(this.layerName,this.symbolType,this.options);this.map.addLayer(this.themeLayer);this.themeLayer.addFeatures(this.data);}}]);return RanksymbolThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=RanksymbolThemeLayerViewModel;
  14539. /***/ }),
  14540. /***/ 1771:
  14541. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14542. "use strict";
  14543. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _RasterTileLayerViewModel=_interopRequireDefault(__webpack_require__(339));var _dec,_class,_class2;var RasterTileLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(RasterTileLayer,_React$Component);var _super=(0,_createSuper2.default)(RasterTileLayer);function RasterTileLayer(){(0,_classCallCheck2.default)(this,RasterTileLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(RasterTileLayer,[{key:"loaded",value:function loaded(map){this.viewModel=new _RasterTileLayerViewModel.default(map,this.props);}},{key:"removed",value:function removed(){this.viewModel=null;}},{key:"render",value:function render(){return null;}}]);return RasterTileLayer;}(_react.default.Component),_class2.defaultProps={scheme:'xyz',visible:true,opacity:1},_class2))||_class);exports["default"]=RasterTileLayer;
  14544. /***/ }),
  14545. /***/ 339:
  14546. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14547. "use strict";
  14548. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var RasterTileLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(RasterTileLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(RasterTileLayerViewModel);function RasterTileLayerViewModel(map,rasterLayerOptions){var _this;(0,_classCallCheck2.default)(this,RasterTileLayerViewModel);_this=_super.call(this);_this.map=map;var layerId=rasterLayerOptions.layerId,tileSize=rasterLayerOptions.tileSize,mapUrl=rasterLayerOptions.mapUrl,tiles=rasterLayerOptions.tiles,bounds=rasterLayerOptions.bounds,_rasterLayerOptions$m=rasterLayerOptions.minZoom,minZoom=_rasterLayerOptions$m===void 0?0:_rasterLayerOptions$m,_rasterLayerOptions$m2=rasterLayerOptions.maxZoom,maxZoom=_rasterLayerOptions$m2===void 0?22:_rasterLayerOptions$m2,attribution=rasterLayerOptions.attribution,_rasterLayerOptions$s=rasterLayerOptions.scheme,scheme=_rasterLayerOptions$s===void 0?'xyz':_rasterLayerOptions$s,_rasterLayerOptions$v=rasterLayerOptions.visible,visible=_rasterLayerOptions$v===void 0?true:_rasterLayerOptions$v,_rasterLayerOptions$o=rasterLayerOptions.opacity,opacity=_rasterLayerOptions$o===void 0?1:_rasterLayerOptions$o,before=rasterLayerOptions.before;_this.layerId=layerId;_this.tileSize=tileSize;_this.mapUrl=mapUrl;_this.tiles=tiles;_this.bounds=bounds;_this.minZoom=minZoom;_this.maxZoom=maxZoom;_this.attribution=attribution;_this.scheme=scheme;_this.opacity=opacity;_this.visibility=visible?'visible':'none';_this.before=before;// enhance扩展,传iserver标识是iserver rest map
  14549. _this.rasterSource='';_this._init();return _this;}(0,_createClass2.default)(RasterTileLayerViewModel,[{key:"_init",value:function _init(){if(this.mapUrl){this._addRestMapLayer();}else{this._addLayer();}}},{key:"_addRestMapLayer",value:function _addRestMapLayer(){var _this2=this;var service=new _mapboxGlEnhance.default.supermap.MapService(this.mapUrl);service.getMapInfo(function(mapObj){if(!_this2.layerId){_this2.layerId=mapObj.name;}if(!_this2.tileSize&&mapObj.viewer){_this2.tileSize=mapObj.viewer.width;}var bounds=mapObj.bounds;if(!_this2.bounds&&bounds){_this2.bounds=[bounds.left,bounds.bottom,bounds.right,bounds.top];}_this2.rasterSource='iserver';_this2.tiles=[_this2.mapUrl];_this2._addLayer(mapObj);});}},{key:"_addLayer",value:function _addLayer(){this.map.addLayer({id:this.layerId||"raster-layer-".concat(new Date().getTime()),type:'raster',layout:{visibility:this.visibility},paint:{'raster-opacity':this.opacity},source:{bounds:this.bounds||[-180,-85.051129,180,85.051129],type:'raster',tileSize:this.tileSize||256,tiles:this.tiles,rasterSource:this.rasterSource,minzoom:this.minZoom,maxzoom:this.maxZoom,scheme:this.scheme}},this.before);}}]);return RasterTileLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=RasterTileLayerViewModel;
  14550. /***/ }),
  14551. /***/ 4204:
  14552. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14553. "use strict";
  14554. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _lodash=_interopRequireDefault(__webpack_require__(2307));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _util=__webpack_require__(9752);var _UniqueThemeLayerViewModel=_interopRequireDefault(__webpack_require__(2658));var _dec,_class,_class2;var UniqueThemeLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=(_class2=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(UniqueThemeLayer,_React$Component);var _super=(0,_createSuper2.default)(UniqueThemeLayer);function UniqueThemeLayer(){(0,_classCallCheck2.default)(this,UniqueThemeLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(UniqueThemeLayer,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var data=this.props.data;if(!(0,_lodash.default)(prevProps.data,data)&&this.viewModel){this.viewModel.setData(data);}}},{key:"loaded",value:function loaded(map){var onLoad=this.props.onLoad;this.viewModel=new _UniqueThemeLayerViewModel.default(map,this.props);(0,_util.isFunction)(onLoad)&&onLoad(this.viewModel.themeLayer,map);}},{key:"render",value:function render(){return null;}}]);return UniqueThemeLayer;}(_react.default.Component),_class2.defaultProps={options:{}},_class2))||_class);exports["default"]=UniqueThemeLayer;
  14555. /***/ }),
  14556. /***/ 2658:
  14557. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14558. "use strict";
  14559. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _mapboxGlEnhance=_interopRequireDefault(__webpack_require__(375));__webpack_require__(2395);var UniqueThemeLayerViewModel=/*#__PURE__*/function(_mapboxgl$Evented){(0,_inherits2.default)(UniqueThemeLayerViewModel,_mapboxgl$Evented);var _super=(0,_createSuper2.default)(UniqueThemeLayerViewModel);function UniqueThemeLayerViewModel(map,themeProps){var _this;(0,_classCallCheck2.default)(this,UniqueThemeLayerViewModel);_this=_super.call(this);_this.map=map;var options=themeProps.options,layerId=themeProps.layerId,data=themeProps.data,layerName=themeProps.layerName;_this.layerName=layerName||layerId;options.id=options.id||layerId;_this.options=options;_this.data=data||[];_this._init();return _this;}(0,_createClass2.default)(UniqueThemeLayerViewModel,[{key:"_init",value:function _init(){this.themeLayer=new _mapboxGlEnhance.default.supermap.UniqueThemeLayer(this.layerName,this.options);this.map.addLayer(this.themeLayer);if(this.data&&this.data.length){this.setData(this.data);}}},{key:"setData",value:function setData(data){this.themeLayer.addFeatures(data);}}]);return UniqueThemeLayerViewModel;}(_mapboxGlEnhance.default.Evented);exports["default"]=UniqueThemeLayerViewModel;
  14560. /***/ }),
  14561. /***/ 2125:
  14562. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  14563. "use strict";
  14564. var _interopRequireDefault=(__webpack_require__(4836)["default"]);Object.defineProperty(exports, "__esModule", ({value:true}));exports["default"]=void 0;var _classCallCheck2=_interopRequireDefault(__webpack_require__(5671));var _createClass2=_interopRequireDefault(__webpack_require__(3144));var _inherits2=_interopRequireDefault(__webpack_require__(9340));var _createSuper2=_interopRequireDefault(__webpack_require__(8557));var _compose2=_interopRequireDefault(__webpack_require__(8808));var _react=_interopRequireDefault(__webpack_require__(3899));var _mapGetter=_interopRequireDefault(__webpack_require__(9635));var _baseLayer=_interopRequireDefault(__webpack_require__(7006));var _dec,_class;var VectorTileLayer=(_dec=(0,_compose2.default)(_mapGetter.default,_baseLayer.default),_dec(_class=/*#__PURE__*/function(_React$Component){(0,_inherits2.default)(VectorTileLayer,_React$Component);var _super=(0,_createSuper2.default)(VectorTileLayer);function VectorTileLayer(){(0,_classCallCheck2.default)(this,VectorTileLayer);return _super.apply(this,arguments);}(0,_createClass2.default)(VectorTileLayer,[{key:"loaded",value:function loaded(map){if(map&&map['addStyle']){map['addStyle'](this.props.styleOptions,this.props.before);}}},{key:"render",value:function render(){return null;}}]);return VectorTileLayer;}(_react.default.Component))||_class);exports["default"]=VectorTileLayer;
  14565. /***/ }),
  14566. /***/ 8874:
  14567. /***/ (function(module) {
  14568. "use strict";
  14569. module.exports = {
  14570. "aliceblue": [240, 248, 255],
  14571. "antiquewhite": [250, 235, 215],
  14572. "aqua": [0, 255, 255],
  14573. "aquamarine": [127, 255, 212],
  14574. "azure": [240, 255, 255],
  14575. "beige": [245, 245, 220],
  14576. "bisque": [255, 228, 196],
  14577. "black": [0, 0, 0],
  14578. "blanchedalmond": [255, 235, 205],
  14579. "blue": [0, 0, 255],
  14580. "blueviolet": [138, 43, 226],
  14581. "brown": [165, 42, 42],
  14582. "burlywood": [222, 184, 135],
  14583. "cadetblue": [95, 158, 160],
  14584. "chartreuse": [127, 255, 0],
  14585. "chocolate": [210, 105, 30],
  14586. "coral": [255, 127, 80],
  14587. "cornflowerblue": [100, 149, 237],
  14588. "cornsilk": [255, 248, 220],
  14589. "crimson": [220, 20, 60],
  14590. "cyan": [0, 255, 255],
  14591. "darkblue": [0, 0, 139],
  14592. "darkcyan": [0, 139, 139],
  14593. "darkgoldenrod": [184, 134, 11],
  14594. "darkgray": [169, 169, 169],
  14595. "darkgreen": [0, 100, 0],
  14596. "darkgrey": [169, 169, 169],
  14597. "darkkhaki": [189, 183, 107],
  14598. "darkmagenta": [139, 0, 139],
  14599. "darkolivegreen": [85, 107, 47],
  14600. "darkorange": [255, 140, 0],
  14601. "darkorchid": [153, 50, 204],
  14602. "darkred": [139, 0, 0],
  14603. "darksalmon": [233, 150, 122],
  14604. "darkseagreen": [143, 188, 143],
  14605. "darkslateblue": [72, 61, 139],
  14606. "darkslategray": [47, 79, 79],
  14607. "darkslategrey": [47, 79, 79],
  14608. "darkturquoise": [0, 206, 209],
  14609. "darkviolet": [148, 0, 211],
  14610. "deeppink": [255, 20, 147],
  14611. "deepskyblue": [0, 191, 255],
  14612. "dimgray": [105, 105, 105],
  14613. "dimgrey": [105, 105, 105],
  14614. "dodgerblue": [30, 144, 255],
  14615. "firebrick": [178, 34, 34],
  14616. "floralwhite": [255, 250, 240],
  14617. "forestgreen": [34, 139, 34],
  14618. "fuchsia": [255, 0, 255],
  14619. "gainsboro": [220, 220, 220],
  14620. "ghostwhite": [248, 248, 255],
  14621. "gold": [255, 215, 0],
  14622. "goldenrod": [218, 165, 32],
  14623. "gray": [128, 128, 128],
  14624. "green": [0, 128, 0],
  14625. "greenyellow": [173, 255, 47],
  14626. "grey": [128, 128, 128],
  14627. "honeydew": [240, 255, 240],
  14628. "hotpink": [255, 105, 180],
  14629. "indianred": [205, 92, 92],
  14630. "indigo": [75, 0, 130],
  14631. "ivory": [255, 255, 240],
  14632. "khaki": [240, 230, 140],
  14633. "lavender": [230, 230, 250],
  14634. "lavenderblush": [255, 240, 245],
  14635. "lawngreen": [124, 252, 0],
  14636. "lemonchiffon": [255, 250, 205],
  14637. "lightblue": [173, 216, 230],
  14638. "lightcoral": [240, 128, 128],
  14639. "lightcyan": [224, 255, 255],
  14640. "lightgoldenrodyellow": [250, 250, 210],
  14641. "lightgray": [211, 211, 211],
  14642. "lightgreen": [144, 238, 144],
  14643. "lightgrey": [211, 211, 211],
  14644. "lightpink": [255, 182, 193],
  14645. "lightsalmon": [255, 160, 122],
  14646. "lightseagreen": [32, 178, 170],
  14647. "lightskyblue": [135, 206, 250],
  14648. "lightslategray": [119, 136, 153],
  14649. "lightslategrey": [119, 136, 153],
  14650. "lightsteelblue": [176, 196, 222],
  14651. "lightyellow": [255, 255, 224],
  14652. "lime": [0, 255, 0],
  14653. "limegreen": [50, 205, 50],
  14654. "linen": [250, 240, 230],
  14655. "magenta": [255, 0, 255],
  14656. "maroon": [128, 0, 0],
  14657. "mediumaquamarine": [102, 205, 170],
  14658. "mediumblue": [0, 0, 205],
  14659. "mediumorchid": [186, 85, 211],
  14660. "mediumpurple": [147, 112, 219],
  14661. "mediumseagreen": [60, 179, 113],
  14662. "mediumslateblue": [123, 104, 238],
  14663. "mediumspringgreen": [0, 250, 154],
  14664. "mediumturquoise": [72, 209, 204],
  14665. "mediumvioletred": [199, 21, 133],
  14666. "midnightblue": [25, 25, 112],
  14667. "mintcream": [245, 255, 250],
  14668. "mistyrose": [255, 228, 225],
  14669. "moccasin": [255, 228, 181],
  14670. "navajowhite": [255, 222, 173],
  14671. "navy": [0, 0, 128],
  14672. "oldlace": [253, 245, 230],
  14673. "olive": [128, 128, 0],
  14674. "olivedrab": [107, 142, 35],
  14675. "orange": [255, 165, 0],
  14676. "orangered": [255, 69, 0],
  14677. "orchid": [218, 112, 214],
  14678. "palegoldenrod": [238, 232, 170],
  14679. "palegreen": [152, 251, 152],
  14680. "paleturquoise": [175, 238, 238],
  14681. "palevioletred": [219, 112, 147],
  14682. "papayawhip": [255, 239, 213],
  14683. "peachpuff": [255, 218, 185],
  14684. "peru": [205, 133, 63],
  14685. "pink": [255, 192, 203],
  14686. "plum": [221, 160, 221],
  14687. "powderblue": [176, 224, 230],
  14688. "purple": [128, 0, 128],
  14689. "rebeccapurple": [102, 51, 153],
  14690. "red": [255, 0, 0],
  14691. "rosybrown": [188, 143, 143],
  14692. "royalblue": [65, 105, 225],
  14693. "saddlebrown": [139, 69, 19],
  14694. "salmon": [250, 128, 114],
  14695. "sandybrown": [244, 164, 96],
  14696. "seagreen": [46, 139, 87],
  14697. "seashell": [255, 245, 238],
  14698. "sienna": [160, 82, 45],
  14699. "silver": [192, 192, 192],
  14700. "skyblue": [135, 206, 235],
  14701. "slateblue": [106, 90, 205],
  14702. "slategray": [112, 128, 144],
  14703. "slategrey": [112, 128, 144],
  14704. "snow": [255, 250, 250],
  14705. "springgreen": [0, 255, 127],
  14706. "steelblue": [70, 130, 180],
  14707. "tan": [210, 180, 140],
  14708. "teal": [0, 128, 128],
  14709. "thistle": [216, 191, 216],
  14710. "tomato": [255, 99, 71],
  14711. "turquoise": [64, 224, 208],
  14712. "violet": [238, 130, 238],
  14713. "wheat": [245, 222, 179],
  14714. "white": [255, 255, 255],
  14715. "whitesmoke": [245, 245, 245],
  14716. "yellow": [255, 255, 0],
  14717. "yellowgreen": [154, 205, 50]
  14718. };
  14719. /***/ }),
  14720. /***/ 7187:
  14721. /***/ (function(module) {
  14722. "use strict";
  14723. // Copyright Joyent, Inc. and other Node contributors.
  14724. //
  14725. // Permission is hereby granted, free of charge, to any person obtaining a
  14726. // copy of this software and associated documentation files (the
  14727. // "Software"), to deal in the Software without restriction, including
  14728. // without limitation the rights to use, copy, modify, merge, publish,
  14729. // distribute, sublicense, and/or sell copies of the Software, and to permit
  14730. // persons to whom the Software is furnished to do so, subject to the
  14731. // following conditions:
  14732. //
  14733. // The above copyright notice and this permission notice shall be included
  14734. // in all copies or substantial portions of the Software.
  14735. //
  14736. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  14737. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14738. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  14739. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  14740. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  14741. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  14742. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  14743. var R = typeof Reflect === 'object' ? Reflect : null
  14744. var ReflectApply = R && typeof R.apply === 'function'
  14745. ? R.apply
  14746. : function ReflectApply(target, receiver, args) {
  14747. return Function.prototype.apply.call(target, receiver, args);
  14748. }
  14749. var ReflectOwnKeys
  14750. if (R && typeof R.ownKeys === 'function') {
  14751. ReflectOwnKeys = R.ownKeys
  14752. } else if (Object.getOwnPropertySymbols) {
  14753. ReflectOwnKeys = function ReflectOwnKeys(target) {
  14754. return Object.getOwnPropertyNames(target)
  14755. .concat(Object.getOwnPropertySymbols(target));
  14756. };
  14757. } else {
  14758. ReflectOwnKeys = function ReflectOwnKeys(target) {
  14759. return Object.getOwnPropertyNames(target);
  14760. };
  14761. }
  14762. function ProcessEmitWarning(warning) {
  14763. if (console && console.warn) console.warn(warning);
  14764. }
  14765. var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
  14766. return value !== value;
  14767. }
  14768. function EventEmitter() {
  14769. EventEmitter.init.call(this);
  14770. }
  14771. module.exports = EventEmitter;
  14772. module.exports.once = once;
  14773. // Backwards-compat with node 0.10.x
  14774. EventEmitter.EventEmitter = EventEmitter;
  14775. EventEmitter.prototype._events = undefined;
  14776. EventEmitter.prototype._eventsCount = 0;
  14777. EventEmitter.prototype._maxListeners = undefined;
  14778. // By default EventEmitters will print a warning if more than 10 listeners are
  14779. // added to it. This is a useful default which helps finding memory leaks.
  14780. var defaultMaxListeners = 10;
  14781. function checkListener(listener) {
  14782. if (typeof listener !== 'function') {
  14783. throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
  14784. }
  14785. }
  14786. Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
  14787. enumerable: true,
  14788. get: function() {
  14789. return defaultMaxListeners;
  14790. },
  14791. set: function(arg) {
  14792. if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
  14793. throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
  14794. }
  14795. defaultMaxListeners = arg;
  14796. }
  14797. });
  14798. EventEmitter.init = function() {
  14799. if (this._events === undefined ||
  14800. this._events === Object.getPrototypeOf(this)._events) {
  14801. this._events = Object.create(null);
  14802. this._eventsCount = 0;
  14803. }
  14804. this._maxListeners = this._maxListeners || undefined;
  14805. };
  14806. // Obviously not all Emitters should be limited to 10. This function allows
  14807. // that to be increased. Set to zero for unlimited.
  14808. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
  14809. if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
  14810. throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
  14811. }
  14812. this._maxListeners = n;
  14813. return this;
  14814. };
  14815. function _getMaxListeners(that) {
  14816. if (that._maxListeners === undefined)
  14817. return EventEmitter.defaultMaxListeners;
  14818. return that._maxListeners;
  14819. }
  14820. EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
  14821. return _getMaxListeners(this);
  14822. };
  14823. EventEmitter.prototype.emit = function emit(type) {
  14824. var args = [];
  14825. for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
  14826. var doError = (type === 'error');
  14827. var events = this._events;
  14828. if (events !== undefined)
  14829. doError = (doError && events.error === undefined);
  14830. else if (!doError)
  14831. return false;
  14832. // If there is no 'error' event listener then throw.
  14833. if (doError) {
  14834. var er;
  14835. if (args.length > 0)
  14836. er = args[0];
  14837. if (er instanceof Error) {
  14838. // Note: The comments on the `throw` lines are intentional, they show
  14839. // up in Node's output if this results in an unhandled exception.
  14840. throw er; // Unhandled 'error' event
  14841. }
  14842. // At least give some kind of context to the user
  14843. var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
  14844. err.context = er;
  14845. throw err; // Unhandled 'error' event
  14846. }
  14847. var handler = events[type];
  14848. if (handler === undefined)
  14849. return false;
  14850. if (typeof handler === 'function') {
  14851. ReflectApply(handler, this, args);
  14852. } else {
  14853. var len = handler.length;
  14854. var listeners = arrayClone(handler, len);
  14855. for (var i = 0; i < len; ++i)
  14856. ReflectApply(listeners[i], this, args);
  14857. }
  14858. return true;
  14859. };
  14860. function _addListener(target, type, listener, prepend) {
  14861. var m;
  14862. var events;
  14863. var existing;
  14864. checkListener(listener);
  14865. events = target._events;
  14866. if (events === undefined) {
  14867. events = target._events = Object.create(null);
  14868. target._eventsCount = 0;
  14869. } else {
  14870. // To avoid recursion in the case that type === "newListener"! Before
  14871. // adding it to the listeners, first emit "newListener".
  14872. if (events.newListener !== undefined) {
  14873. target.emit('newListener', type,
  14874. listener.listener ? listener.listener : listener);
  14875. // Re-assign `events` because a newListener handler could have caused the
  14876. // this._events to be assigned to a new object
  14877. events = target._events;
  14878. }
  14879. existing = events[type];
  14880. }
  14881. if (existing === undefined) {
  14882. // Optimize the case of one listener. Don't need the extra array object.
  14883. existing = events[type] = listener;
  14884. ++target._eventsCount;
  14885. } else {
  14886. if (typeof existing === 'function') {
  14887. // Adding the second element, need to change to array.
  14888. existing = events[type] =
  14889. prepend ? [listener, existing] : [existing, listener];
  14890. // If we've already got an array, just append.
  14891. } else if (prepend) {
  14892. existing.unshift(listener);
  14893. } else {
  14894. existing.push(listener);
  14895. }
  14896. // Check for listener leak
  14897. m = _getMaxListeners(target);
  14898. if (m > 0 && existing.length > m && !existing.warned) {
  14899. existing.warned = true;
  14900. // No error code for this since it is a Warning
  14901. // eslint-disable-next-line no-restricted-syntax
  14902. var w = new Error('Possible EventEmitter memory leak detected. ' +
  14903. existing.length + ' ' + String(type) + ' listeners ' +
  14904. 'added. Use emitter.setMaxListeners() to ' +
  14905. 'increase limit');
  14906. w.name = 'MaxListenersExceededWarning';
  14907. w.emitter = target;
  14908. w.type = type;
  14909. w.count = existing.length;
  14910. ProcessEmitWarning(w);
  14911. }
  14912. }
  14913. return target;
  14914. }
  14915. EventEmitter.prototype.addListener = function addListener(type, listener) {
  14916. return _addListener(this, type, listener, false);
  14917. };
  14918. EventEmitter.prototype.on = EventEmitter.prototype.addListener;
  14919. EventEmitter.prototype.prependListener =
  14920. function prependListener(type, listener) {
  14921. return _addListener(this, type, listener, true);
  14922. };
  14923. function onceWrapper() {
  14924. if (!this.fired) {
  14925. this.target.removeListener(this.type, this.wrapFn);
  14926. this.fired = true;
  14927. if (arguments.length === 0)
  14928. return this.listener.call(this.target);
  14929. return this.listener.apply(this.target, arguments);
  14930. }
  14931. }
  14932. function _onceWrap(target, type, listener) {
  14933. var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
  14934. var wrapped = onceWrapper.bind(state);
  14935. wrapped.listener = listener;
  14936. state.wrapFn = wrapped;
  14937. return wrapped;
  14938. }
  14939. EventEmitter.prototype.once = function once(type, listener) {
  14940. checkListener(listener);
  14941. this.on(type, _onceWrap(this, type, listener));
  14942. return this;
  14943. };
  14944. EventEmitter.prototype.prependOnceListener =
  14945. function prependOnceListener(type, listener) {
  14946. checkListener(listener);
  14947. this.prependListener(type, _onceWrap(this, type, listener));
  14948. return this;
  14949. };
  14950. // Emits a 'removeListener' event if and only if the listener was removed.
  14951. EventEmitter.prototype.removeListener =
  14952. function removeListener(type, listener) {
  14953. var list, events, position, i, originalListener;
  14954. checkListener(listener);
  14955. events = this._events;
  14956. if (events === undefined)
  14957. return this;
  14958. list = events[type];
  14959. if (list === undefined)
  14960. return this;
  14961. if (list === listener || list.listener === listener) {
  14962. if (--this._eventsCount === 0)
  14963. this._events = Object.create(null);
  14964. else {
  14965. delete events[type];
  14966. if (events.removeListener)
  14967. this.emit('removeListener', type, list.listener || listener);
  14968. }
  14969. } else if (typeof list !== 'function') {
  14970. position = -1;
  14971. for (i = list.length - 1; i >= 0; i--) {
  14972. if (list[i] === listener || list[i].listener === listener) {
  14973. originalListener = list[i].listener;
  14974. position = i;
  14975. break;
  14976. }
  14977. }
  14978. if (position < 0)
  14979. return this;
  14980. if (position === 0)
  14981. list.shift();
  14982. else {
  14983. spliceOne(list, position);
  14984. }
  14985. if (list.length === 1)
  14986. events[type] = list[0];
  14987. if (events.removeListener !== undefined)
  14988. this.emit('removeListener', type, originalListener || listener);
  14989. }
  14990. return this;
  14991. };
  14992. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  14993. EventEmitter.prototype.removeAllListeners =
  14994. function removeAllListeners(type) {
  14995. var listeners, events, i;
  14996. events = this._events;
  14997. if (events === undefined)
  14998. return this;
  14999. // not listening for removeListener, no need to emit
  15000. if (events.removeListener === undefined) {
  15001. if (arguments.length === 0) {
  15002. this._events = Object.create(null);
  15003. this._eventsCount = 0;
  15004. } else if (events[type] !== undefined) {
  15005. if (--this._eventsCount === 0)
  15006. this._events = Object.create(null);
  15007. else
  15008. delete events[type];
  15009. }
  15010. return this;
  15011. }
  15012. // emit removeListener for all listeners on all events
  15013. if (arguments.length === 0) {
  15014. var keys = Object.keys(events);
  15015. var key;
  15016. for (i = 0; i < keys.length; ++i) {
  15017. key = keys[i];
  15018. if (key === 'removeListener') continue;
  15019. this.removeAllListeners(key);
  15020. }
  15021. this.removeAllListeners('removeListener');
  15022. this._events = Object.create(null);
  15023. this._eventsCount = 0;
  15024. return this;
  15025. }
  15026. listeners = events[type];
  15027. if (typeof listeners === 'function') {
  15028. this.removeListener(type, listeners);
  15029. } else if (listeners !== undefined) {
  15030. // LIFO order
  15031. for (i = listeners.length - 1; i >= 0; i--) {
  15032. this.removeListener(type, listeners[i]);
  15033. }
  15034. }
  15035. return this;
  15036. };
  15037. function _listeners(target, type, unwrap) {
  15038. var events = target._events;
  15039. if (events === undefined)
  15040. return [];
  15041. var evlistener = events[type];
  15042. if (evlistener === undefined)
  15043. return [];
  15044. if (typeof evlistener === 'function')
  15045. return unwrap ? [evlistener.listener || evlistener] : [evlistener];
  15046. return unwrap ?
  15047. unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
  15048. }
  15049. EventEmitter.prototype.listeners = function listeners(type) {
  15050. return _listeners(this, type, true);
  15051. };
  15052. EventEmitter.prototype.rawListeners = function rawListeners(type) {
  15053. return _listeners(this, type, false);
  15054. };
  15055. EventEmitter.listenerCount = function(emitter, type) {
  15056. if (typeof emitter.listenerCount === 'function') {
  15057. return emitter.listenerCount(type);
  15058. } else {
  15059. return listenerCount.call(emitter, type);
  15060. }
  15061. };
  15062. EventEmitter.prototype.listenerCount = listenerCount;
  15063. function listenerCount(type) {
  15064. var events = this._events;
  15065. if (events !== undefined) {
  15066. var evlistener = events[type];
  15067. if (typeof evlistener === 'function') {
  15068. return 1;
  15069. } else if (evlistener !== undefined) {
  15070. return evlistener.length;
  15071. }
  15072. }
  15073. return 0;
  15074. }
  15075. EventEmitter.prototype.eventNames = function eventNames() {
  15076. return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
  15077. };
  15078. function arrayClone(arr, n) {
  15079. var copy = new Array(n);
  15080. for (var i = 0; i < n; ++i)
  15081. copy[i] = arr[i];
  15082. return copy;
  15083. }
  15084. function spliceOne(list, index) {
  15085. for (; index + 1 < list.length; index++)
  15086. list[index] = list[index + 1];
  15087. list.pop();
  15088. }
  15089. function unwrapListeners(arr) {
  15090. var ret = new Array(arr.length);
  15091. for (var i = 0; i < ret.length; ++i) {
  15092. ret[i] = arr[i].listener || arr[i];
  15093. }
  15094. return ret;
  15095. }
  15096. function once(emitter, name) {
  15097. return new Promise(function (resolve, reject) {
  15098. function errorListener(err) {
  15099. emitter.removeListener(name, resolver);
  15100. reject(err);
  15101. }
  15102. function resolver() {
  15103. if (typeof emitter.removeListener === 'function') {
  15104. emitter.removeListener('error', errorListener);
  15105. }
  15106. resolve([].slice.call(arguments));
  15107. };
  15108. eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
  15109. if (name !== 'error') {
  15110. addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
  15111. }
  15112. });
  15113. }
  15114. function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
  15115. if (typeof emitter.on === 'function') {
  15116. eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
  15117. }
  15118. }
  15119. function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
  15120. if (typeof emitter.on === 'function') {
  15121. if (flags.once) {
  15122. emitter.once(name, listener);
  15123. } else {
  15124. emitter.on(name, listener);
  15125. }
  15126. } else if (typeof emitter.addEventListener === 'function') {
  15127. // EventTarget does not have `error` event semantics like Node
  15128. // EventEmitters, we do not listen for `error` events here.
  15129. emitter.addEventListener(name, function wrapListener(arg) {
  15130. // IE does not have builtin `{ once: true }` support so we
  15131. // have to do it manually.
  15132. if (flags.once) {
  15133. emitter.removeEventListener(name, wrapListener);
  15134. }
  15135. listener(arg);
  15136. });
  15137. } else {
  15138. throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
  15139. }
  15140. }
  15141. /***/ }),
  15142. /***/ 8679:
  15143. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  15144. "use strict";
  15145. var reactIs = __webpack_require__(7109);
  15146. /**
  15147. * Copyright 2015, Yahoo! Inc.
  15148. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
  15149. */
  15150. var REACT_STATICS = {
  15151. childContextTypes: true,
  15152. contextType: true,
  15153. contextTypes: true,
  15154. defaultProps: true,
  15155. displayName: true,
  15156. getDefaultProps: true,
  15157. getDerivedStateFromError: true,
  15158. getDerivedStateFromProps: true,
  15159. mixins: true,
  15160. propTypes: true,
  15161. type: true
  15162. };
  15163. var KNOWN_STATICS = {
  15164. name: true,
  15165. length: true,
  15166. prototype: true,
  15167. caller: true,
  15168. callee: true,
  15169. arguments: true,
  15170. arity: true
  15171. };
  15172. var FORWARD_REF_STATICS = {
  15173. '$$typeof': true,
  15174. render: true,
  15175. defaultProps: true,
  15176. displayName: true,
  15177. propTypes: true
  15178. };
  15179. var MEMO_STATICS = {
  15180. '$$typeof': true,
  15181. compare: true,
  15182. defaultProps: true,
  15183. displayName: true,
  15184. propTypes: true,
  15185. type: true
  15186. };
  15187. var TYPE_STATICS = {};
  15188. TYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;
  15189. TYPE_STATICS[reactIs.Memo] = MEMO_STATICS;
  15190. function getStatics(component) {
  15191. // React v16.11 and below
  15192. if (reactIs.isMemo(component)) {
  15193. return MEMO_STATICS;
  15194. } // React v16.12 and above
  15195. return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;
  15196. }
  15197. var defineProperty = Object.defineProperty;
  15198. var getOwnPropertyNames = Object.getOwnPropertyNames;
  15199. var getOwnPropertySymbols = Object.getOwnPropertySymbols;
  15200. var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
  15201. var getPrototypeOf = Object.getPrototypeOf;
  15202. var objectPrototype = Object.prototype;
  15203. function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {
  15204. if (typeof sourceComponent !== 'string') {
  15205. // don't hoist over string (html) components
  15206. if (objectPrototype) {
  15207. var inheritedComponent = getPrototypeOf(sourceComponent);
  15208. if (inheritedComponent && inheritedComponent !== objectPrototype) {
  15209. hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);
  15210. }
  15211. }
  15212. var keys = getOwnPropertyNames(sourceComponent);
  15213. if (getOwnPropertySymbols) {
  15214. keys = keys.concat(getOwnPropertySymbols(sourceComponent));
  15215. }
  15216. var targetStatics = getStatics(targetComponent);
  15217. var sourceStatics = getStatics(sourceComponent);
  15218. for (var i = 0; i < keys.length; ++i) {
  15219. var key = keys[i];
  15220. if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {
  15221. var descriptor = getOwnPropertyDescriptor(sourceComponent, key);
  15222. try {
  15223. // Avoid failures from read-only properties
  15224. defineProperty(targetComponent, key, descriptor);
  15225. } catch (e) {}
  15226. }
  15227. }
  15228. }
  15229. return targetComponent;
  15230. }
  15231. module.exports = hoistNonReactStatics;
  15232. /***/ }),
  15233. /***/ 6103:
  15234. /***/ (function(__unused_webpack_module, exports) {
  15235. "use strict";
  15236. /** @license React v16.13.1
  15237. * react-is.production.min.js
  15238. *
  15239. * Copyright (c) Facebook, Inc. and its affiliates.
  15240. *
  15241. * This source code is licensed under the MIT license found in the
  15242. * LICENSE file in the root directory of this source tree.
  15243. */
  15244. var b="function"===typeof Symbol&&Symbol.for,c=b?Symbol.for("react.element"):60103,d=b?Symbol.for("react.portal"):60106,e=b?Symbol.for("react.fragment"):60107,f=b?Symbol.for("react.strict_mode"):60108,g=b?Symbol.for("react.profiler"):60114,h=b?Symbol.for("react.provider"):60109,k=b?Symbol.for("react.context"):60110,l=b?Symbol.for("react.async_mode"):60111,m=b?Symbol.for("react.concurrent_mode"):60111,n=b?Symbol.for("react.forward_ref"):60112,p=b?Symbol.for("react.suspense"):60113,q=b?
  15245. Symbol.for("react.suspense_list"):60120,r=b?Symbol.for("react.memo"):60115,t=b?Symbol.for("react.lazy"):60116,v=b?Symbol.for("react.block"):60121,w=b?Symbol.for("react.fundamental"):60117,x=b?Symbol.for("react.responder"):60118,y=b?Symbol.for("react.scope"):60119;
  15246. function z(a){if("object"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;
  15247. exports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return"object"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};
  15248. exports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};
  15249. exports.isValidElementType=function(a){return"string"===typeof a||"function"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||"object"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;
  15250. /***/ }),
  15251. /***/ 7109:
  15252. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  15253. "use strict";
  15254. if (true) {
  15255. module.exports = __webpack_require__(6103);
  15256. } else {}
  15257. /***/ }),
  15258. /***/ 5717:
  15259. /***/ (function(module) {
  15260. if (typeof Object.create === 'function') {
  15261. // implementation from standard node.js 'util' module
  15262. module.exports = function inherits(ctor, superCtor) {
  15263. if (superCtor) {
  15264. ctor.super_ = superCtor
  15265. ctor.prototype = Object.create(superCtor.prototype, {
  15266. constructor: {
  15267. value: ctor,
  15268. enumerable: false,
  15269. writable: true,
  15270. configurable: true
  15271. }
  15272. })
  15273. }
  15274. };
  15275. } else {
  15276. // old school shim for old browsers
  15277. module.exports = function inherits(ctor, superCtor) {
  15278. if (superCtor) {
  15279. ctor.super_ = superCtor
  15280. var TempCtor = function () {}
  15281. TempCtor.prototype = superCtor.prototype
  15282. ctor.prototype = new TempCtor()
  15283. ctor.prototype.constructor = ctor
  15284. }
  15285. }
  15286. }
  15287. /***/ }),
  15288. /***/ 1633:
  15289. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  15290. /**
  15291. * lodash (Custom Build) <https://lodash.com/>
  15292. * Build: `lodash modularize exports="npm" -o ./`
  15293. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  15294. * Released under MIT license <https://lodash.com/license>
  15295. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  15296. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  15297. */
  15298. /** Used as references for various `Number` constants. */
  15299. var INFINITY = 1 / 0;
  15300. /** `Object#toString` result references. */
  15301. var symbolTag = '[object Symbol]';
  15302. /** Used to compose unicode character classes. */
  15303. var rsAstralRange = '\\ud800-\\udfff',
  15304. rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
  15305. rsComboSymbolsRange = '\\u20d0-\\u20f0',
  15306. rsVarRange = '\\ufe0e\\ufe0f';
  15307. /** Used to compose unicode capture groups. */
  15308. var rsAstral = '[' + rsAstralRange + ']',
  15309. rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
  15310. rsFitz = '\\ud83c[\\udffb-\\udfff]',
  15311. rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
  15312. rsNonAstral = '[^' + rsAstralRange + ']',
  15313. rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
  15314. rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
  15315. rsZWJ = '\\u200d';
  15316. /** Used to compose unicode regexes. */
  15317. var reOptMod = rsModifier + '?',
  15318. rsOptVar = '[' + rsVarRange + ']?',
  15319. rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
  15320. rsSeq = rsOptVar + reOptMod + rsOptJoin,
  15321. rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
  15322. /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
  15323. var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
  15324. /** 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/). */
  15325. var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
  15326. /** Detect free variable `global` from Node.js. */
  15327. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  15328. /** Detect free variable `self`. */
  15329. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  15330. /** Used as a reference to the global object. */
  15331. var root = freeGlobal || freeSelf || Function('return this')();
  15332. /**
  15333. * Converts an ASCII `string` to an array.
  15334. *
  15335. * @private
  15336. * @param {string} string The string to convert.
  15337. * @returns {Array} Returns the converted array.
  15338. */
  15339. function asciiToArray(string) {
  15340. return string.split('');
  15341. }
  15342. /**
  15343. * Checks if `string` contains Unicode symbols.
  15344. *
  15345. * @private
  15346. * @param {string} string The string to inspect.
  15347. * @returns {boolean} Returns `true` if a symbol is found, else `false`.
  15348. */
  15349. function hasUnicode(string) {
  15350. return reHasUnicode.test(string);
  15351. }
  15352. /**
  15353. * Converts `string` to an array.
  15354. *
  15355. * @private
  15356. * @param {string} string The string to convert.
  15357. * @returns {Array} Returns the converted array.
  15358. */
  15359. function stringToArray(string) {
  15360. return hasUnicode(string)
  15361. ? unicodeToArray(string)
  15362. : asciiToArray(string);
  15363. }
  15364. /**
  15365. * Converts a Unicode `string` to an array.
  15366. *
  15367. * @private
  15368. * @param {string} string The string to convert.
  15369. * @returns {Array} Returns the converted array.
  15370. */
  15371. function unicodeToArray(string) {
  15372. return string.match(reUnicode) || [];
  15373. }
  15374. /** Used for built-in method references. */
  15375. var objectProto = Object.prototype;
  15376. /**
  15377. * Used to resolve the
  15378. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  15379. * of values.
  15380. */
  15381. var objectToString = objectProto.toString;
  15382. /** Built-in value references. */
  15383. var Symbol = root.Symbol;
  15384. /** Used to convert symbols to primitives and strings. */
  15385. var symbolProto = Symbol ? Symbol.prototype : undefined,
  15386. symbolToString = symbolProto ? symbolProto.toString : undefined;
  15387. /**
  15388. * The base implementation of `_.slice` without an iteratee call guard.
  15389. *
  15390. * @private
  15391. * @param {Array} array The array to slice.
  15392. * @param {number} [start=0] The start position.
  15393. * @param {number} [end=array.length] The end position.
  15394. * @returns {Array} Returns the slice of `array`.
  15395. */
  15396. function baseSlice(array, start, end) {
  15397. var index = -1,
  15398. length = array.length;
  15399. if (start < 0) {
  15400. start = -start > length ? 0 : (length + start);
  15401. }
  15402. end = end > length ? length : end;
  15403. if (end < 0) {
  15404. end += length;
  15405. }
  15406. length = start > end ? 0 : ((end - start) >>> 0);
  15407. start >>>= 0;
  15408. var result = Array(length);
  15409. while (++index < length) {
  15410. result[index] = array[index + start];
  15411. }
  15412. return result;
  15413. }
  15414. /**
  15415. * The base implementation of `_.toString` which doesn't convert nullish
  15416. * values to empty strings.
  15417. *
  15418. * @private
  15419. * @param {*} value The value to process.
  15420. * @returns {string} Returns the string.
  15421. */
  15422. function baseToString(value) {
  15423. // Exit early for strings to avoid a performance hit in some environments.
  15424. if (typeof value == 'string') {
  15425. return value;
  15426. }
  15427. if (isSymbol(value)) {
  15428. return symbolToString ? symbolToString.call(value) : '';
  15429. }
  15430. var result = (value + '');
  15431. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  15432. }
  15433. /**
  15434. * Casts `array` to a slice if it's needed.
  15435. *
  15436. * @private
  15437. * @param {Array} array The array to inspect.
  15438. * @param {number} start The start position.
  15439. * @param {number} [end=array.length] The end position.
  15440. * @returns {Array} Returns the cast slice.
  15441. */
  15442. function castSlice(array, start, end) {
  15443. var length = array.length;
  15444. end = end === undefined ? length : end;
  15445. return (!start && end >= length) ? array : baseSlice(array, start, end);
  15446. }
  15447. /**
  15448. * Creates a function like `_.lowerFirst`.
  15449. *
  15450. * @private
  15451. * @param {string} methodName The name of the `String` case method to use.
  15452. * @returns {Function} Returns the new case function.
  15453. */
  15454. function createCaseFirst(methodName) {
  15455. return function(string) {
  15456. string = toString(string);
  15457. var strSymbols = hasUnicode(string)
  15458. ? stringToArray(string)
  15459. : undefined;
  15460. var chr = strSymbols
  15461. ? strSymbols[0]
  15462. : string.charAt(0);
  15463. var trailing = strSymbols
  15464. ? castSlice(strSymbols, 1).join('')
  15465. : string.slice(1);
  15466. return chr[methodName]() + trailing;
  15467. };
  15468. }
  15469. /**
  15470. * Checks if `value` is object-like. A value is object-like if it's not `null`
  15471. * and has a `typeof` result of "object".
  15472. *
  15473. * @static
  15474. * @memberOf _
  15475. * @since 4.0.0
  15476. * @category Lang
  15477. * @param {*} value The value to check.
  15478. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  15479. * @example
  15480. *
  15481. * _.isObjectLike({});
  15482. * // => true
  15483. *
  15484. * _.isObjectLike([1, 2, 3]);
  15485. * // => true
  15486. *
  15487. * _.isObjectLike(_.noop);
  15488. * // => false
  15489. *
  15490. * _.isObjectLike(null);
  15491. * // => false
  15492. */
  15493. function isObjectLike(value) {
  15494. return !!value && typeof value == 'object';
  15495. }
  15496. /**
  15497. * Checks if `value` is classified as a `Symbol` primitive or object.
  15498. *
  15499. * @static
  15500. * @memberOf _
  15501. * @since 4.0.0
  15502. * @category Lang
  15503. * @param {*} value The value to check.
  15504. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  15505. * @example
  15506. *
  15507. * _.isSymbol(Symbol.iterator);
  15508. * // => true
  15509. *
  15510. * _.isSymbol('abc');
  15511. * // => false
  15512. */
  15513. function isSymbol(value) {
  15514. return typeof value == 'symbol' ||
  15515. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  15516. }
  15517. /**
  15518. * Converts `value` to a string. An empty string is returned for `null`
  15519. * and `undefined` values. The sign of `-0` is preserved.
  15520. *
  15521. * @static
  15522. * @memberOf _
  15523. * @since 4.0.0
  15524. * @category Lang
  15525. * @param {*} value The value to process.
  15526. * @returns {string} Returns the string.
  15527. * @example
  15528. *
  15529. * _.toString(null);
  15530. * // => ''
  15531. *
  15532. * _.toString(-0);
  15533. * // => '-0'
  15534. *
  15535. * _.toString([1, 2, 3]);
  15536. * // => '1,2,3'
  15537. */
  15538. function toString(value) {
  15539. return value == null ? '' : baseToString(value);
  15540. }
  15541. /**
  15542. * Converts the first character of `string` to upper case and the remaining
  15543. * to lower case.
  15544. *
  15545. * @static
  15546. * @memberOf _
  15547. * @since 3.0.0
  15548. * @category String
  15549. * @param {string} [string=''] The string to capitalize.
  15550. * @returns {string} Returns the capitalized string.
  15551. * @example
  15552. *
  15553. * _.capitalize('FRED');
  15554. * // => 'Fred'
  15555. */
  15556. function capitalize(string) {
  15557. return upperFirst(toString(string).toLowerCase());
  15558. }
  15559. /**
  15560. * Converts the first character of `string` to upper case.
  15561. *
  15562. * @static
  15563. * @memberOf _
  15564. * @since 4.0.0
  15565. * @category String
  15566. * @param {string} [string=''] The string to convert.
  15567. * @returns {string} Returns the converted string.
  15568. * @example
  15569. *
  15570. * _.upperFirst('fred');
  15571. * // => 'Fred'
  15572. *
  15573. * _.upperFirst('FRED');
  15574. * // => 'FRED'
  15575. */
  15576. var upperFirst = createCaseFirst('toUpperCase');
  15577. module.exports = capitalize;
  15578. /***/ }),
  15579. /***/ 3465:
  15580. /***/ (function(module, exports, __webpack_require__) {
  15581. /* module decorator */ module = __webpack_require__.nmd(module);
  15582. /**
  15583. * lodash (Custom Build) <https://lodash.com/>
  15584. * Build: `lodash modularize exports="npm" -o ./`
  15585. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  15586. * Released under MIT license <https://lodash.com/license>
  15587. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  15588. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  15589. */
  15590. /** Used as the size to enable large array optimizations. */
  15591. var LARGE_ARRAY_SIZE = 200;
  15592. /** Used to stand-in for `undefined` hash values. */
  15593. var HASH_UNDEFINED = '__lodash_hash_undefined__';
  15594. /** Used as references for various `Number` constants. */
  15595. var MAX_SAFE_INTEGER = 9007199254740991;
  15596. /** `Object#toString` result references. */
  15597. var argsTag = '[object Arguments]',
  15598. arrayTag = '[object Array]',
  15599. boolTag = '[object Boolean]',
  15600. dateTag = '[object Date]',
  15601. errorTag = '[object Error]',
  15602. funcTag = '[object Function]',
  15603. genTag = '[object GeneratorFunction]',
  15604. mapTag = '[object Map]',
  15605. numberTag = '[object Number]',
  15606. objectTag = '[object Object]',
  15607. promiseTag = '[object Promise]',
  15608. regexpTag = '[object RegExp]',
  15609. setTag = '[object Set]',
  15610. stringTag = '[object String]',
  15611. symbolTag = '[object Symbol]',
  15612. weakMapTag = '[object WeakMap]';
  15613. var arrayBufferTag = '[object ArrayBuffer]',
  15614. dataViewTag = '[object DataView]',
  15615. float32Tag = '[object Float32Array]',
  15616. float64Tag = '[object Float64Array]',
  15617. int8Tag = '[object Int8Array]',
  15618. int16Tag = '[object Int16Array]',
  15619. int32Tag = '[object Int32Array]',
  15620. uint8Tag = '[object Uint8Array]',
  15621. uint8ClampedTag = '[object Uint8ClampedArray]',
  15622. uint16Tag = '[object Uint16Array]',
  15623. uint32Tag = '[object Uint32Array]';
  15624. /**
  15625. * Used to match `RegExp`
  15626. * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
  15627. */
  15628. var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
  15629. /** Used to match `RegExp` flags from their coerced string values. */
  15630. var reFlags = /\w*$/;
  15631. /** Used to detect host constructors (Safari). */
  15632. var reIsHostCtor = /^\[object .+?Constructor\]$/;
  15633. /** Used to detect unsigned integer values. */
  15634. var reIsUint = /^(?:0|[1-9]\d*)$/;
  15635. /** Used to identify `toStringTag` values supported by `_.clone`. */
  15636. var cloneableTags = {};
  15637. cloneableTags[argsTag] = cloneableTags[arrayTag] =
  15638. cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
  15639. cloneableTags[boolTag] = cloneableTags[dateTag] =
  15640. cloneableTags[float32Tag] = cloneableTags[float64Tag] =
  15641. cloneableTags[int8Tag] = cloneableTags[int16Tag] =
  15642. cloneableTags[int32Tag] = cloneableTags[mapTag] =
  15643. cloneableTags[numberTag] = cloneableTags[objectTag] =
  15644. cloneableTags[regexpTag] = cloneableTags[setTag] =
  15645. cloneableTags[stringTag] = cloneableTags[symbolTag] =
  15646. cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
  15647. cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
  15648. cloneableTags[errorTag] = cloneableTags[funcTag] =
  15649. cloneableTags[weakMapTag] = false;
  15650. /** Detect free variable `global` from Node.js. */
  15651. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  15652. /** Detect free variable `self`. */
  15653. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  15654. /** Used as a reference to the global object. */
  15655. var root = freeGlobal || freeSelf || Function('return this')();
  15656. /** Detect free variable `exports`. */
  15657. var freeExports = true && exports && !exports.nodeType && exports;
  15658. /** Detect free variable `module`. */
  15659. var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module;
  15660. /** Detect the popular CommonJS extension `module.exports`. */
  15661. var moduleExports = freeModule && freeModule.exports === freeExports;
  15662. /**
  15663. * Adds the key-value `pair` to `map`.
  15664. *
  15665. * @private
  15666. * @param {Object} map The map to modify.
  15667. * @param {Array} pair The key-value pair to add.
  15668. * @returns {Object} Returns `map`.
  15669. */
  15670. function addMapEntry(map, pair) {
  15671. // Don't return `map.set` because it's not chainable in IE 11.
  15672. map.set(pair[0], pair[1]);
  15673. return map;
  15674. }
  15675. /**
  15676. * Adds `value` to `set`.
  15677. *
  15678. * @private
  15679. * @param {Object} set The set to modify.
  15680. * @param {*} value The value to add.
  15681. * @returns {Object} Returns `set`.
  15682. */
  15683. function addSetEntry(set, value) {
  15684. // Don't return `set.add` because it's not chainable in IE 11.
  15685. set.add(value);
  15686. return set;
  15687. }
  15688. /**
  15689. * A specialized version of `_.forEach` for arrays without support for
  15690. * iteratee shorthands.
  15691. *
  15692. * @private
  15693. * @param {Array} [array] The array to iterate over.
  15694. * @param {Function} iteratee The function invoked per iteration.
  15695. * @returns {Array} Returns `array`.
  15696. */
  15697. function arrayEach(array, iteratee) {
  15698. var index = -1,
  15699. length = array ? array.length : 0;
  15700. while (++index < length) {
  15701. if (iteratee(array[index], index, array) === false) {
  15702. break;
  15703. }
  15704. }
  15705. return array;
  15706. }
  15707. /**
  15708. * Appends the elements of `values` to `array`.
  15709. *
  15710. * @private
  15711. * @param {Array} array The array to modify.
  15712. * @param {Array} values The values to append.
  15713. * @returns {Array} Returns `array`.
  15714. */
  15715. function arrayPush(array, values) {
  15716. var index = -1,
  15717. length = values.length,
  15718. offset = array.length;
  15719. while (++index < length) {
  15720. array[offset + index] = values[index];
  15721. }
  15722. return array;
  15723. }
  15724. /**
  15725. * A specialized version of `_.reduce` for arrays without support for
  15726. * iteratee shorthands.
  15727. *
  15728. * @private
  15729. * @param {Array} [array] The array to iterate over.
  15730. * @param {Function} iteratee The function invoked per iteration.
  15731. * @param {*} [accumulator] The initial value.
  15732. * @param {boolean} [initAccum] Specify using the first element of `array` as
  15733. * the initial value.
  15734. * @returns {*} Returns the accumulated value.
  15735. */
  15736. function arrayReduce(array, iteratee, accumulator, initAccum) {
  15737. var index = -1,
  15738. length = array ? array.length : 0;
  15739. if (initAccum && length) {
  15740. accumulator = array[++index];
  15741. }
  15742. while (++index < length) {
  15743. accumulator = iteratee(accumulator, array[index], index, array);
  15744. }
  15745. return accumulator;
  15746. }
  15747. /**
  15748. * The base implementation of `_.times` without support for iteratee shorthands
  15749. * or max array length checks.
  15750. *
  15751. * @private
  15752. * @param {number} n The number of times to invoke `iteratee`.
  15753. * @param {Function} iteratee The function invoked per iteration.
  15754. * @returns {Array} Returns the array of results.
  15755. */
  15756. function baseTimes(n, iteratee) {
  15757. var index = -1,
  15758. result = Array(n);
  15759. while (++index < n) {
  15760. result[index] = iteratee(index);
  15761. }
  15762. return result;
  15763. }
  15764. /**
  15765. * Gets the value at `key` of `object`.
  15766. *
  15767. * @private
  15768. * @param {Object} [object] The object to query.
  15769. * @param {string} key The key of the property to get.
  15770. * @returns {*} Returns the property value.
  15771. */
  15772. function getValue(object, key) {
  15773. return object == null ? undefined : object[key];
  15774. }
  15775. /**
  15776. * Checks if `value` is a host object in IE < 9.
  15777. *
  15778. * @private
  15779. * @param {*} value The value to check.
  15780. * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
  15781. */
  15782. function isHostObject(value) {
  15783. // Many host objects are `Object` objects that can coerce to strings
  15784. // despite having improperly defined `toString` methods.
  15785. var result = false;
  15786. if (value != null && typeof value.toString != 'function') {
  15787. try {
  15788. result = !!(value + '');
  15789. } catch (e) {}
  15790. }
  15791. return result;
  15792. }
  15793. /**
  15794. * Converts `map` to its key-value pairs.
  15795. *
  15796. * @private
  15797. * @param {Object} map The map to convert.
  15798. * @returns {Array} Returns the key-value pairs.
  15799. */
  15800. function mapToArray(map) {
  15801. var index = -1,
  15802. result = Array(map.size);
  15803. map.forEach(function(value, key) {
  15804. result[++index] = [key, value];
  15805. });
  15806. return result;
  15807. }
  15808. /**
  15809. * Creates a unary function that invokes `func` with its argument transformed.
  15810. *
  15811. * @private
  15812. * @param {Function} func The function to wrap.
  15813. * @param {Function} transform The argument transform.
  15814. * @returns {Function} Returns the new function.
  15815. */
  15816. function overArg(func, transform) {
  15817. return function(arg) {
  15818. return func(transform(arg));
  15819. };
  15820. }
  15821. /**
  15822. * Converts `set` to an array of its values.
  15823. *
  15824. * @private
  15825. * @param {Object} set The set to convert.
  15826. * @returns {Array} Returns the values.
  15827. */
  15828. function setToArray(set) {
  15829. var index = -1,
  15830. result = Array(set.size);
  15831. set.forEach(function(value) {
  15832. result[++index] = value;
  15833. });
  15834. return result;
  15835. }
  15836. /** Used for built-in method references. */
  15837. var arrayProto = Array.prototype,
  15838. funcProto = Function.prototype,
  15839. objectProto = Object.prototype;
  15840. /** Used to detect overreaching core-js shims. */
  15841. var coreJsData = root['__core-js_shared__'];
  15842. /** Used to detect methods masquerading as native. */
  15843. var maskSrcKey = (function() {
  15844. var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  15845. return uid ? ('Symbol(src)_1.' + uid) : '';
  15846. }());
  15847. /** Used to resolve the decompiled source of functions. */
  15848. var funcToString = funcProto.toString;
  15849. /** Used to check objects for own properties. */
  15850. var hasOwnProperty = objectProto.hasOwnProperty;
  15851. /**
  15852. * Used to resolve the
  15853. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  15854. * of values.
  15855. */
  15856. var objectToString = objectProto.toString;
  15857. /** Used to detect if a method is native. */
  15858. var reIsNative = RegExp('^' +
  15859. funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  15860. .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  15861. );
  15862. /** Built-in value references. */
  15863. var Buffer = moduleExports ? root.Buffer : undefined,
  15864. Symbol = root.Symbol,
  15865. Uint8Array = root.Uint8Array,
  15866. getPrototype = overArg(Object.getPrototypeOf, Object),
  15867. objectCreate = Object.create,
  15868. propertyIsEnumerable = objectProto.propertyIsEnumerable,
  15869. splice = arrayProto.splice;
  15870. /* Built-in method references for those with the same name as other `lodash` methods. */
  15871. var nativeGetSymbols = Object.getOwnPropertySymbols,
  15872. nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
  15873. nativeKeys = overArg(Object.keys, Object);
  15874. /* Built-in method references that are verified to be native. */
  15875. var DataView = getNative(root, 'DataView'),
  15876. Map = getNative(root, 'Map'),
  15877. Promise = getNative(root, 'Promise'),
  15878. Set = getNative(root, 'Set'),
  15879. WeakMap = getNative(root, 'WeakMap'),
  15880. nativeCreate = getNative(Object, 'create');
  15881. /** Used to detect maps, sets, and weakmaps. */
  15882. var dataViewCtorString = toSource(DataView),
  15883. mapCtorString = toSource(Map),
  15884. promiseCtorString = toSource(Promise),
  15885. setCtorString = toSource(Set),
  15886. weakMapCtorString = toSource(WeakMap);
  15887. /** Used to convert symbols to primitives and strings. */
  15888. var symbolProto = Symbol ? Symbol.prototype : undefined,
  15889. symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
  15890. /**
  15891. * Creates a hash object.
  15892. *
  15893. * @private
  15894. * @constructor
  15895. * @param {Array} [entries] The key-value pairs to cache.
  15896. */
  15897. function Hash(entries) {
  15898. var index = -1,
  15899. length = entries ? entries.length : 0;
  15900. this.clear();
  15901. while (++index < length) {
  15902. var entry = entries[index];
  15903. this.set(entry[0], entry[1]);
  15904. }
  15905. }
  15906. /**
  15907. * Removes all key-value entries from the hash.
  15908. *
  15909. * @private
  15910. * @name clear
  15911. * @memberOf Hash
  15912. */
  15913. function hashClear() {
  15914. this.__data__ = nativeCreate ? nativeCreate(null) : {};
  15915. }
  15916. /**
  15917. * Removes `key` and its value from the hash.
  15918. *
  15919. * @private
  15920. * @name delete
  15921. * @memberOf Hash
  15922. * @param {Object} hash The hash to modify.
  15923. * @param {string} key The key of the value to remove.
  15924. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  15925. */
  15926. function hashDelete(key) {
  15927. return this.has(key) && delete this.__data__[key];
  15928. }
  15929. /**
  15930. * Gets the hash value for `key`.
  15931. *
  15932. * @private
  15933. * @name get
  15934. * @memberOf Hash
  15935. * @param {string} key The key of the value to get.
  15936. * @returns {*} Returns the entry value.
  15937. */
  15938. function hashGet(key) {
  15939. var data = this.__data__;
  15940. if (nativeCreate) {
  15941. var result = data[key];
  15942. return result === HASH_UNDEFINED ? undefined : result;
  15943. }
  15944. return hasOwnProperty.call(data, key) ? data[key] : undefined;
  15945. }
  15946. /**
  15947. * Checks if a hash value for `key` exists.
  15948. *
  15949. * @private
  15950. * @name has
  15951. * @memberOf Hash
  15952. * @param {string} key The key of the entry to check.
  15953. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  15954. */
  15955. function hashHas(key) {
  15956. var data = this.__data__;
  15957. return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
  15958. }
  15959. /**
  15960. * Sets the hash `key` to `value`.
  15961. *
  15962. * @private
  15963. * @name set
  15964. * @memberOf Hash
  15965. * @param {string} key The key of the value to set.
  15966. * @param {*} value The value to set.
  15967. * @returns {Object} Returns the hash instance.
  15968. */
  15969. function hashSet(key, value) {
  15970. var data = this.__data__;
  15971. data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  15972. return this;
  15973. }
  15974. // Add methods to `Hash`.
  15975. Hash.prototype.clear = hashClear;
  15976. Hash.prototype['delete'] = hashDelete;
  15977. Hash.prototype.get = hashGet;
  15978. Hash.prototype.has = hashHas;
  15979. Hash.prototype.set = hashSet;
  15980. /**
  15981. * Creates an list cache object.
  15982. *
  15983. * @private
  15984. * @constructor
  15985. * @param {Array} [entries] The key-value pairs to cache.
  15986. */
  15987. function ListCache(entries) {
  15988. var index = -1,
  15989. length = entries ? entries.length : 0;
  15990. this.clear();
  15991. while (++index < length) {
  15992. var entry = entries[index];
  15993. this.set(entry[0], entry[1]);
  15994. }
  15995. }
  15996. /**
  15997. * Removes all key-value entries from the list cache.
  15998. *
  15999. * @private
  16000. * @name clear
  16001. * @memberOf ListCache
  16002. */
  16003. function listCacheClear() {
  16004. this.__data__ = [];
  16005. }
  16006. /**
  16007. * Removes `key` and its value from the list cache.
  16008. *
  16009. * @private
  16010. * @name delete
  16011. * @memberOf ListCache
  16012. * @param {string} key The key of the value to remove.
  16013. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  16014. */
  16015. function listCacheDelete(key) {
  16016. var data = this.__data__,
  16017. index = assocIndexOf(data, key);
  16018. if (index < 0) {
  16019. return false;
  16020. }
  16021. var lastIndex = data.length - 1;
  16022. if (index == lastIndex) {
  16023. data.pop();
  16024. } else {
  16025. splice.call(data, index, 1);
  16026. }
  16027. return true;
  16028. }
  16029. /**
  16030. * Gets the list cache value for `key`.
  16031. *
  16032. * @private
  16033. * @name get
  16034. * @memberOf ListCache
  16035. * @param {string} key The key of the value to get.
  16036. * @returns {*} Returns the entry value.
  16037. */
  16038. function listCacheGet(key) {
  16039. var data = this.__data__,
  16040. index = assocIndexOf(data, key);
  16041. return index < 0 ? undefined : data[index][1];
  16042. }
  16043. /**
  16044. * Checks if a list cache value for `key` exists.
  16045. *
  16046. * @private
  16047. * @name has
  16048. * @memberOf ListCache
  16049. * @param {string} key The key of the entry to check.
  16050. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  16051. */
  16052. function listCacheHas(key) {
  16053. return assocIndexOf(this.__data__, key) > -1;
  16054. }
  16055. /**
  16056. * Sets the list cache `key` to `value`.
  16057. *
  16058. * @private
  16059. * @name set
  16060. * @memberOf ListCache
  16061. * @param {string} key The key of the value to set.
  16062. * @param {*} value The value to set.
  16063. * @returns {Object} Returns the list cache instance.
  16064. */
  16065. function listCacheSet(key, value) {
  16066. var data = this.__data__,
  16067. index = assocIndexOf(data, key);
  16068. if (index < 0) {
  16069. data.push([key, value]);
  16070. } else {
  16071. data[index][1] = value;
  16072. }
  16073. return this;
  16074. }
  16075. // Add methods to `ListCache`.
  16076. ListCache.prototype.clear = listCacheClear;
  16077. ListCache.prototype['delete'] = listCacheDelete;
  16078. ListCache.prototype.get = listCacheGet;
  16079. ListCache.prototype.has = listCacheHas;
  16080. ListCache.prototype.set = listCacheSet;
  16081. /**
  16082. * Creates a map cache object to store key-value pairs.
  16083. *
  16084. * @private
  16085. * @constructor
  16086. * @param {Array} [entries] The key-value pairs to cache.
  16087. */
  16088. function MapCache(entries) {
  16089. var index = -1,
  16090. length = entries ? entries.length : 0;
  16091. this.clear();
  16092. while (++index < length) {
  16093. var entry = entries[index];
  16094. this.set(entry[0], entry[1]);
  16095. }
  16096. }
  16097. /**
  16098. * Removes all key-value entries from the map.
  16099. *
  16100. * @private
  16101. * @name clear
  16102. * @memberOf MapCache
  16103. */
  16104. function mapCacheClear() {
  16105. this.__data__ = {
  16106. 'hash': new Hash,
  16107. 'map': new (Map || ListCache),
  16108. 'string': new Hash
  16109. };
  16110. }
  16111. /**
  16112. * Removes `key` and its value from the map.
  16113. *
  16114. * @private
  16115. * @name delete
  16116. * @memberOf MapCache
  16117. * @param {string} key The key of the value to remove.
  16118. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  16119. */
  16120. function mapCacheDelete(key) {
  16121. return getMapData(this, key)['delete'](key);
  16122. }
  16123. /**
  16124. * Gets the map value for `key`.
  16125. *
  16126. * @private
  16127. * @name get
  16128. * @memberOf MapCache
  16129. * @param {string} key The key of the value to get.
  16130. * @returns {*} Returns the entry value.
  16131. */
  16132. function mapCacheGet(key) {
  16133. return getMapData(this, key).get(key);
  16134. }
  16135. /**
  16136. * Checks if a map value for `key` exists.
  16137. *
  16138. * @private
  16139. * @name has
  16140. * @memberOf MapCache
  16141. * @param {string} key The key of the entry to check.
  16142. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  16143. */
  16144. function mapCacheHas(key) {
  16145. return getMapData(this, key).has(key);
  16146. }
  16147. /**
  16148. * Sets the map `key` to `value`.
  16149. *
  16150. * @private
  16151. * @name set
  16152. * @memberOf MapCache
  16153. * @param {string} key The key of the value to set.
  16154. * @param {*} value The value to set.
  16155. * @returns {Object} Returns the map cache instance.
  16156. */
  16157. function mapCacheSet(key, value) {
  16158. getMapData(this, key).set(key, value);
  16159. return this;
  16160. }
  16161. // Add methods to `MapCache`.
  16162. MapCache.prototype.clear = mapCacheClear;
  16163. MapCache.prototype['delete'] = mapCacheDelete;
  16164. MapCache.prototype.get = mapCacheGet;
  16165. MapCache.prototype.has = mapCacheHas;
  16166. MapCache.prototype.set = mapCacheSet;
  16167. /**
  16168. * Creates a stack cache object to store key-value pairs.
  16169. *
  16170. * @private
  16171. * @constructor
  16172. * @param {Array} [entries] The key-value pairs to cache.
  16173. */
  16174. function Stack(entries) {
  16175. this.__data__ = new ListCache(entries);
  16176. }
  16177. /**
  16178. * Removes all key-value entries from the stack.
  16179. *
  16180. * @private
  16181. * @name clear
  16182. * @memberOf Stack
  16183. */
  16184. function stackClear() {
  16185. this.__data__ = new ListCache;
  16186. }
  16187. /**
  16188. * Removes `key` and its value from the stack.
  16189. *
  16190. * @private
  16191. * @name delete
  16192. * @memberOf Stack
  16193. * @param {string} key The key of the value to remove.
  16194. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  16195. */
  16196. function stackDelete(key) {
  16197. return this.__data__['delete'](key);
  16198. }
  16199. /**
  16200. * Gets the stack value for `key`.
  16201. *
  16202. * @private
  16203. * @name get
  16204. * @memberOf Stack
  16205. * @param {string} key The key of the value to get.
  16206. * @returns {*} Returns the entry value.
  16207. */
  16208. function stackGet(key) {
  16209. return this.__data__.get(key);
  16210. }
  16211. /**
  16212. * Checks if a stack value for `key` exists.
  16213. *
  16214. * @private
  16215. * @name has
  16216. * @memberOf Stack
  16217. * @param {string} key The key of the entry to check.
  16218. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  16219. */
  16220. function stackHas(key) {
  16221. return this.__data__.has(key);
  16222. }
  16223. /**
  16224. * Sets the stack `key` to `value`.
  16225. *
  16226. * @private
  16227. * @name set
  16228. * @memberOf Stack
  16229. * @param {string} key The key of the value to set.
  16230. * @param {*} value The value to set.
  16231. * @returns {Object} Returns the stack cache instance.
  16232. */
  16233. function stackSet(key, value) {
  16234. var cache = this.__data__;
  16235. if (cache instanceof ListCache) {
  16236. var pairs = cache.__data__;
  16237. if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
  16238. pairs.push([key, value]);
  16239. return this;
  16240. }
  16241. cache = this.__data__ = new MapCache(pairs);
  16242. }
  16243. cache.set(key, value);
  16244. return this;
  16245. }
  16246. // Add methods to `Stack`.
  16247. Stack.prototype.clear = stackClear;
  16248. Stack.prototype['delete'] = stackDelete;
  16249. Stack.prototype.get = stackGet;
  16250. Stack.prototype.has = stackHas;
  16251. Stack.prototype.set = stackSet;
  16252. /**
  16253. * Creates an array of the enumerable property names of the array-like `value`.
  16254. *
  16255. * @private
  16256. * @param {*} value The value to query.
  16257. * @param {boolean} inherited Specify returning inherited property names.
  16258. * @returns {Array} Returns the array of property names.
  16259. */
  16260. function arrayLikeKeys(value, inherited) {
  16261. // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  16262. // Safari 9 makes `arguments.length` enumerable in strict mode.
  16263. var result = (isArray(value) || isArguments(value))
  16264. ? baseTimes(value.length, String)
  16265. : [];
  16266. var length = result.length,
  16267. skipIndexes = !!length;
  16268. for (var key in value) {
  16269. if ((inherited || hasOwnProperty.call(value, key)) &&
  16270. !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
  16271. result.push(key);
  16272. }
  16273. }
  16274. return result;
  16275. }
  16276. /**
  16277. * Assigns `value` to `key` of `object` if the existing value is not equivalent
  16278. * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  16279. * for equality comparisons.
  16280. *
  16281. * @private
  16282. * @param {Object} object The object to modify.
  16283. * @param {string} key The key of the property to assign.
  16284. * @param {*} value The value to assign.
  16285. */
  16286. function assignValue(object, key, value) {
  16287. var objValue = object[key];
  16288. if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
  16289. (value === undefined && !(key in object))) {
  16290. object[key] = value;
  16291. }
  16292. }
  16293. /**
  16294. * Gets the index at which the `key` is found in `array` of key-value pairs.
  16295. *
  16296. * @private
  16297. * @param {Array} array The array to inspect.
  16298. * @param {*} key The key to search for.
  16299. * @returns {number} Returns the index of the matched value, else `-1`.
  16300. */
  16301. function assocIndexOf(array, key) {
  16302. var length = array.length;
  16303. while (length--) {
  16304. if (eq(array[length][0], key)) {
  16305. return length;
  16306. }
  16307. }
  16308. return -1;
  16309. }
  16310. /**
  16311. * The base implementation of `_.assign` without support for multiple sources
  16312. * or `customizer` functions.
  16313. *
  16314. * @private
  16315. * @param {Object} object The destination object.
  16316. * @param {Object} source The source object.
  16317. * @returns {Object} Returns `object`.
  16318. */
  16319. function baseAssign(object, source) {
  16320. return object && copyObject(source, keys(source), object);
  16321. }
  16322. /**
  16323. * The base implementation of `_.clone` and `_.cloneDeep` which tracks
  16324. * traversed objects.
  16325. *
  16326. * @private
  16327. * @param {*} value The value to clone.
  16328. * @param {boolean} [isDeep] Specify a deep clone.
  16329. * @param {boolean} [isFull] Specify a clone including symbols.
  16330. * @param {Function} [customizer] The function to customize cloning.
  16331. * @param {string} [key] The key of `value`.
  16332. * @param {Object} [object] The parent object of `value`.
  16333. * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
  16334. * @returns {*} Returns the cloned value.
  16335. */
  16336. function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
  16337. var result;
  16338. if (customizer) {
  16339. result = object ? customizer(value, key, object, stack) : customizer(value);
  16340. }
  16341. if (result !== undefined) {
  16342. return result;
  16343. }
  16344. if (!isObject(value)) {
  16345. return value;
  16346. }
  16347. var isArr = isArray(value);
  16348. if (isArr) {
  16349. result = initCloneArray(value);
  16350. if (!isDeep) {
  16351. return copyArray(value, result);
  16352. }
  16353. } else {
  16354. var tag = getTag(value),
  16355. isFunc = tag == funcTag || tag == genTag;
  16356. if (isBuffer(value)) {
  16357. return cloneBuffer(value, isDeep);
  16358. }
  16359. if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
  16360. if (isHostObject(value)) {
  16361. return object ? value : {};
  16362. }
  16363. result = initCloneObject(isFunc ? {} : value);
  16364. if (!isDeep) {
  16365. return copySymbols(value, baseAssign(result, value));
  16366. }
  16367. } else {
  16368. if (!cloneableTags[tag]) {
  16369. return object ? value : {};
  16370. }
  16371. result = initCloneByTag(value, tag, baseClone, isDeep);
  16372. }
  16373. }
  16374. // Check for circular references and return its corresponding clone.
  16375. stack || (stack = new Stack);
  16376. var stacked = stack.get(value);
  16377. if (stacked) {
  16378. return stacked;
  16379. }
  16380. stack.set(value, result);
  16381. if (!isArr) {
  16382. var props = isFull ? getAllKeys(value) : keys(value);
  16383. }
  16384. arrayEach(props || value, function(subValue, key) {
  16385. if (props) {
  16386. key = subValue;
  16387. subValue = value[key];
  16388. }
  16389. // Recursively populate clone (susceptible to call stack limits).
  16390. assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
  16391. });
  16392. return result;
  16393. }
  16394. /**
  16395. * The base implementation of `_.create` without support for assigning
  16396. * properties to the created object.
  16397. *
  16398. * @private
  16399. * @param {Object} prototype The object to inherit from.
  16400. * @returns {Object} Returns the new object.
  16401. */
  16402. function baseCreate(proto) {
  16403. return isObject(proto) ? objectCreate(proto) : {};
  16404. }
  16405. /**
  16406. * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
  16407. * `keysFunc` and `symbolsFunc` to get the enumerable property names and
  16408. * symbols of `object`.
  16409. *
  16410. * @private
  16411. * @param {Object} object The object to query.
  16412. * @param {Function} keysFunc The function to get the keys of `object`.
  16413. * @param {Function} symbolsFunc The function to get the symbols of `object`.
  16414. * @returns {Array} Returns the array of property names and symbols.
  16415. */
  16416. function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  16417. var result = keysFunc(object);
  16418. return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
  16419. }
  16420. /**
  16421. * The base implementation of `getTag`.
  16422. *
  16423. * @private
  16424. * @param {*} value The value to query.
  16425. * @returns {string} Returns the `toStringTag`.
  16426. */
  16427. function baseGetTag(value) {
  16428. return objectToString.call(value);
  16429. }
  16430. /**
  16431. * The base implementation of `_.isNative` without bad shim checks.
  16432. *
  16433. * @private
  16434. * @param {*} value The value to check.
  16435. * @returns {boolean} Returns `true` if `value` is a native function,
  16436. * else `false`.
  16437. */
  16438. function baseIsNative(value) {
  16439. if (!isObject(value) || isMasked(value)) {
  16440. return false;
  16441. }
  16442. var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
  16443. return pattern.test(toSource(value));
  16444. }
  16445. /**
  16446. * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
  16447. *
  16448. * @private
  16449. * @param {Object} object The object to query.
  16450. * @returns {Array} Returns the array of property names.
  16451. */
  16452. function baseKeys(object) {
  16453. if (!isPrototype(object)) {
  16454. return nativeKeys(object);
  16455. }
  16456. var result = [];
  16457. for (var key in Object(object)) {
  16458. if (hasOwnProperty.call(object, key) && key != 'constructor') {
  16459. result.push(key);
  16460. }
  16461. }
  16462. return result;
  16463. }
  16464. /**
  16465. * Creates a clone of `buffer`.
  16466. *
  16467. * @private
  16468. * @param {Buffer} buffer The buffer to clone.
  16469. * @param {boolean} [isDeep] Specify a deep clone.
  16470. * @returns {Buffer} Returns the cloned buffer.
  16471. */
  16472. function cloneBuffer(buffer, isDeep) {
  16473. if (isDeep) {
  16474. return buffer.slice();
  16475. }
  16476. var result = new buffer.constructor(buffer.length);
  16477. buffer.copy(result);
  16478. return result;
  16479. }
  16480. /**
  16481. * Creates a clone of `arrayBuffer`.
  16482. *
  16483. * @private
  16484. * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
  16485. * @returns {ArrayBuffer} Returns the cloned array buffer.
  16486. */
  16487. function cloneArrayBuffer(arrayBuffer) {
  16488. var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
  16489. new Uint8Array(result).set(new Uint8Array(arrayBuffer));
  16490. return result;
  16491. }
  16492. /**
  16493. * Creates a clone of `dataView`.
  16494. *
  16495. * @private
  16496. * @param {Object} dataView The data view to clone.
  16497. * @param {boolean} [isDeep] Specify a deep clone.
  16498. * @returns {Object} Returns the cloned data view.
  16499. */
  16500. function cloneDataView(dataView, isDeep) {
  16501. var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
  16502. return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
  16503. }
  16504. /**
  16505. * Creates a clone of `map`.
  16506. *
  16507. * @private
  16508. * @param {Object} map The map to clone.
  16509. * @param {Function} cloneFunc The function to clone values.
  16510. * @param {boolean} [isDeep] Specify a deep clone.
  16511. * @returns {Object} Returns the cloned map.
  16512. */
  16513. function cloneMap(map, isDeep, cloneFunc) {
  16514. var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);
  16515. return arrayReduce(array, addMapEntry, new map.constructor);
  16516. }
  16517. /**
  16518. * Creates a clone of `regexp`.
  16519. *
  16520. * @private
  16521. * @param {Object} regexp The regexp to clone.
  16522. * @returns {Object} Returns the cloned regexp.
  16523. */
  16524. function cloneRegExp(regexp) {
  16525. var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
  16526. result.lastIndex = regexp.lastIndex;
  16527. return result;
  16528. }
  16529. /**
  16530. * Creates a clone of `set`.
  16531. *
  16532. * @private
  16533. * @param {Object} set The set to clone.
  16534. * @param {Function} cloneFunc The function to clone values.
  16535. * @param {boolean} [isDeep] Specify a deep clone.
  16536. * @returns {Object} Returns the cloned set.
  16537. */
  16538. function cloneSet(set, isDeep, cloneFunc) {
  16539. var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);
  16540. return arrayReduce(array, addSetEntry, new set.constructor);
  16541. }
  16542. /**
  16543. * Creates a clone of the `symbol` object.
  16544. *
  16545. * @private
  16546. * @param {Object} symbol The symbol object to clone.
  16547. * @returns {Object} Returns the cloned symbol object.
  16548. */
  16549. function cloneSymbol(symbol) {
  16550. return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
  16551. }
  16552. /**
  16553. * Creates a clone of `typedArray`.
  16554. *
  16555. * @private
  16556. * @param {Object} typedArray The typed array to clone.
  16557. * @param {boolean} [isDeep] Specify a deep clone.
  16558. * @returns {Object} Returns the cloned typed array.
  16559. */
  16560. function cloneTypedArray(typedArray, isDeep) {
  16561. var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
  16562. return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
  16563. }
  16564. /**
  16565. * Copies the values of `source` to `array`.
  16566. *
  16567. * @private
  16568. * @param {Array} source The array to copy values from.
  16569. * @param {Array} [array=[]] The array to copy values to.
  16570. * @returns {Array} Returns `array`.
  16571. */
  16572. function copyArray(source, array) {
  16573. var index = -1,
  16574. length = source.length;
  16575. array || (array = Array(length));
  16576. while (++index < length) {
  16577. array[index] = source[index];
  16578. }
  16579. return array;
  16580. }
  16581. /**
  16582. * Copies properties of `source` to `object`.
  16583. *
  16584. * @private
  16585. * @param {Object} source The object to copy properties from.
  16586. * @param {Array} props The property identifiers to copy.
  16587. * @param {Object} [object={}] The object to copy properties to.
  16588. * @param {Function} [customizer] The function to customize copied values.
  16589. * @returns {Object} Returns `object`.
  16590. */
  16591. function copyObject(source, props, object, customizer) {
  16592. object || (object = {});
  16593. var index = -1,
  16594. length = props.length;
  16595. while (++index < length) {
  16596. var key = props[index];
  16597. var newValue = customizer
  16598. ? customizer(object[key], source[key], key, object, source)
  16599. : undefined;
  16600. assignValue(object, key, newValue === undefined ? source[key] : newValue);
  16601. }
  16602. return object;
  16603. }
  16604. /**
  16605. * Copies own symbol properties of `source` to `object`.
  16606. *
  16607. * @private
  16608. * @param {Object} source The object to copy symbols from.
  16609. * @param {Object} [object={}] The object to copy symbols to.
  16610. * @returns {Object} Returns `object`.
  16611. */
  16612. function copySymbols(source, object) {
  16613. return copyObject(source, getSymbols(source), object);
  16614. }
  16615. /**
  16616. * Creates an array of own enumerable property names and symbols of `object`.
  16617. *
  16618. * @private
  16619. * @param {Object} object The object to query.
  16620. * @returns {Array} Returns the array of property names and symbols.
  16621. */
  16622. function getAllKeys(object) {
  16623. return baseGetAllKeys(object, keys, getSymbols);
  16624. }
  16625. /**
  16626. * Gets the data for `map`.
  16627. *
  16628. * @private
  16629. * @param {Object} map The map to query.
  16630. * @param {string} key The reference key.
  16631. * @returns {*} Returns the map data.
  16632. */
  16633. function getMapData(map, key) {
  16634. var data = map.__data__;
  16635. return isKeyable(key)
  16636. ? data[typeof key == 'string' ? 'string' : 'hash']
  16637. : data.map;
  16638. }
  16639. /**
  16640. * Gets the native function at `key` of `object`.
  16641. *
  16642. * @private
  16643. * @param {Object} object The object to query.
  16644. * @param {string} key The key of the method to get.
  16645. * @returns {*} Returns the function if it's native, else `undefined`.
  16646. */
  16647. function getNative(object, key) {
  16648. var value = getValue(object, key);
  16649. return baseIsNative(value) ? value : undefined;
  16650. }
  16651. /**
  16652. * Creates an array of the own enumerable symbol properties of `object`.
  16653. *
  16654. * @private
  16655. * @param {Object} object The object to query.
  16656. * @returns {Array} Returns the array of symbols.
  16657. */
  16658. var getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;
  16659. /**
  16660. * Gets the `toStringTag` of `value`.
  16661. *
  16662. * @private
  16663. * @param {*} value The value to query.
  16664. * @returns {string} Returns the `toStringTag`.
  16665. */
  16666. var getTag = baseGetTag;
  16667. // Fallback for data views, maps, sets, and weak maps in IE 11,
  16668. // for data views in Edge < 14, and promises in Node.js.
  16669. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
  16670. (Map && getTag(new Map) != mapTag) ||
  16671. (Promise && getTag(Promise.resolve()) != promiseTag) ||
  16672. (Set && getTag(new Set) != setTag) ||
  16673. (WeakMap && getTag(new WeakMap) != weakMapTag)) {
  16674. getTag = function(value) {
  16675. var result = objectToString.call(value),
  16676. Ctor = result == objectTag ? value.constructor : undefined,
  16677. ctorString = Ctor ? toSource(Ctor) : undefined;
  16678. if (ctorString) {
  16679. switch (ctorString) {
  16680. case dataViewCtorString: return dataViewTag;
  16681. case mapCtorString: return mapTag;
  16682. case promiseCtorString: return promiseTag;
  16683. case setCtorString: return setTag;
  16684. case weakMapCtorString: return weakMapTag;
  16685. }
  16686. }
  16687. return result;
  16688. };
  16689. }
  16690. /**
  16691. * Initializes an array clone.
  16692. *
  16693. * @private
  16694. * @param {Array} array The array to clone.
  16695. * @returns {Array} Returns the initialized clone.
  16696. */
  16697. function initCloneArray(array) {
  16698. var length = array.length,
  16699. result = array.constructor(length);
  16700. // Add properties assigned by `RegExp#exec`.
  16701. if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
  16702. result.index = array.index;
  16703. result.input = array.input;
  16704. }
  16705. return result;
  16706. }
  16707. /**
  16708. * Initializes an object clone.
  16709. *
  16710. * @private
  16711. * @param {Object} object The object to clone.
  16712. * @returns {Object} Returns the initialized clone.
  16713. */
  16714. function initCloneObject(object) {
  16715. return (typeof object.constructor == 'function' && !isPrototype(object))
  16716. ? baseCreate(getPrototype(object))
  16717. : {};
  16718. }
  16719. /**
  16720. * Initializes an object clone based on its `toStringTag`.
  16721. *
  16722. * **Note:** This function only supports cloning values with tags of
  16723. * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  16724. *
  16725. * @private
  16726. * @param {Object} object The object to clone.
  16727. * @param {string} tag The `toStringTag` of the object to clone.
  16728. * @param {Function} cloneFunc The function to clone values.
  16729. * @param {boolean} [isDeep] Specify a deep clone.
  16730. * @returns {Object} Returns the initialized clone.
  16731. */
  16732. function initCloneByTag(object, tag, cloneFunc, isDeep) {
  16733. var Ctor = object.constructor;
  16734. switch (tag) {
  16735. case arrayBufferTag:
  16736. return cloneArrayBuffer(object);
  16737. case boolTag:
  16738. case dateTag:
  16739. return new Ctor(+object);
  16740. case dataViewTag:
  16741. return cloneDataView(object, isDeep);
  16742. case float32Tag: case float64Tag:
  16743. case int8Tag: case int16Tag: case int32Tag:
  16744. case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
  16745. return cloneTypedArray(object, isDeep);
  16746. case mapTag:
  16747. return cloneMap(object, isDeep, cloneFunc);
  16748. case numberTag:
  16749. case stringTag:
  16750. return new Ctor(object);
  16751. case regexpTag:
  16752. return cloneRegExp(object);
  16753. case setTag:
  16754. return cloneSet(object, isDeep, cloneFunc);
  16755. case symbolTag:
  16756. return cloneSymbol(object);
  16757. }
  16758. }
  16759. /**
  16760. * Checks if `value` is a valid array-like index.
  16761. *
  16762. * @private
  16763. * @param {*} value The value to check.
  16764. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
  16765. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
  16766. */
  16767. function isIndex(value, length) {
  16768. length = length == null ? MAX_SAFE_INTEGER : length;
  16769. return !!length &&
  16770. (typeof value == 'number' || reIsUint.test(value)) &&
  16771. (value > -1 && value % 1 == 0 && value < length);
  16772. }
  16773. /**
  16774. * Checks if `value` is suitable for use as unique object key.
  16775. *
  16776. * @private
  16777. * @param {*} value The value to check.
  16778. * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
  16779. */
  16780. function isKeyable(value) {
  16781. var type = typeof value;
  16782. return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
  16783. ? (value !== '__proto__')
  16784. : (value === null);
  16785. }
  16786. /**
  16787. * Checks if `func` has its source masked.
  16788. *
  16789. * @private
  16790. * @param {Function} func The function to check.
  16791. * @returns {boolean} Returns `true` if `func` is masked, else `false`.
  16792. */
  16793. function isMasked(func) {
  16794. return !!maskSrcKey && (maskSrcKey in func);
  16795. }
  16796. /**
  16797. * Checks if `value` is likely a prototype object.
  16798. *
  16799. * @private
  16800. * @param {*} value The value to check.
  16801. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
  16802. */
  16803. function isPrototype(value) {
  16804. var Ctor = value && value.constructor,
  16805. proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
  16806. return value === proto;
  16807. }
  16808. /**
  16809. * Converts `func` to its source code.
  16810. *
  16811. * @private
  16812. * @param {Function} func The function to process.
  16813. * @returns {string} Returns the source code.
  16814. */
  16815. function toSource(func) {
  16816. if (func != null) {
  16817. try {
  16818. return funcToString.call(func);
  16819. } catch (e) {}
  16820. try {
  16821. return (func + '');
  16822. } catch (e) {}
  16823. }
  16824. return '';
  16825. }
  16826. /**
  16827. * This method is like `_.clone` except that it recursively clones `value`.
  16828. *
  16829. * @static
  16830. * @memberOf _
  16831. * @since 1.0.0
  16832. * @category Lang
  16833. * @param {*} value The value to recursively clone.
  16834. * @returns {*} Returns the deep cloned value.
  16835. * @see _.clone
  16836. * @example
  16837. *
  16838. * var objects = [{ 'a': 1 }, { 'b': 2 }];
  16839. *
  16840. * var deep = _.cloneDeep(objects);
  16841. * console.log(deep[0] === objects[0]);
  16842. * // => false
  16843. */
  16844. function cloneDeep(value) {
  16845. return baseClone(value, true, true);
  16846. }
  16847. /**
  16848. * Performs a
  16849. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  16850. * comparison between two values to determine if they are equivalent.
  16851. *
  16852. * @static
  16853. * @memberOf _
  16854. * @since 4.0.0
  16855. * @category Lang
  16856. * @param {*} value The value to compare.
  16857. * @param {*} other The other value to compare.
  16858. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  16859. * @example
  16860. *
  16861. * var object = { 'a': 1 };
  16862. * var other = { 'a': 1 };
  16863. *
  16864. * _.eq(object, object);
  16865. * // => true
  16866. *
  16867. * _.eq(object, other);
  16868. * // => false
  16869. *
  16870. * _.eq('a', 'a');
  16871. * // => true
  16872. *
  16873. * _.eq('a', Object('a'));
  16874. * // => false
  16875. *
  16876. * _.eq(NaN, NaN);
  16877. * // => true
  16878. */
  16879. function eq(value, other) {
  16880. return value === other || (value !== value && other !== other);
  16881. }
  16882. /**
  16883. * Checks if `value` is likely an `arguments` object.
  16884. *
  16885. * @static
  16886. * @memberOf _
  16887. * @since 0.1.0
  16888. * @category Lang
  16889. * @param {*} value The value to check.
  16890. * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  16891. * else `false`.
  16892. * @example
  16893. *
  16894. * _.isArguments(function() { return arguments; }());
  16895. * // => true
  16896. *
  16897. * _.isArguments([1, 2, 3]);
  16898. * // => false
  16899. */
  16900. function isArguments(value) {
  16901. // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
  16902. return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
  16903. (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
  16904. }
  16905. /**
  16906. * Checks if `value` is classified as an `Array` object.
  16907. *
  16908. * @static
  16909. * @memberOf _
  16910. * @since 0.1.0
  16911. * @category Lang
  16912. * @param {*} value The value to check.
  16913. * @returns {boolean} Returns `true` if `value` is an array, else `false`.
  16914. * @example
  16915. *
  16916. * _.isArray([1, 2, 3]);
  16917. * // => true
  16918. *
  16919. * _.isArray(document.body.children);
  16920. * // => false
  16921. *
  16922. * _.isArray('abc');
  16923. * // => false
  16924. *
  16925. * _.isArray(_.noop);
  16926. * // => false
  16927. */
  16928. var isArray = Array.isArray;
  16929. /**
  16930. * Checks if `value` is array-like. A value is considered array-like if it's
  16931. * not a function and has a `value.length` that's an integer greater than or
  16932. * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
  16933. *
  16934. * @static
  16935. * @memberOf _
  16936. * @since 4.0.0
  16937. * @category Lang
  16938. * @param {*} value The value to check.
  16939. * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
  16940. * @example
  16941. *
  16942. * _.isArrayLike([1, 2, 3]);
  16943. * // => true
  16944. *
  16945. * _.isArrayLike(document.body.children);
  16946. * // => true
  16947. *
  16948. * _.isArrayLike('abc');
  16949. * // => true
  16950. *
  16951. * _.isArrayLike(_.noop);
  16952. * // => false
  16953. */
  16954. function isArrayLike(value) {
  16955. return value != null && isLength(value.length) && !isFunction(value);
  16956. }
  16957. /**
  16958. * This method is like `_.isArrayLike` except that it also checks if `value`
  16959. * is an object.
  16960. *
  16961. * @static
  16962. * @memberOf _
  16963. * @since 4.0.0
  16964. * @category Lang
  16965. * @param {*} value The value to check.
  16966. * @returns {boolean} Returns `true` if `value` is an array-like object,
  16967. * else `false`.
  16968. * @example
  16969. *
  16970. * _.isArrayLikeObject([1, 2, 3]);
  16971. * // => true
  16972. *
  16973. * _.isArrayLikeObject(document.body.children);
  16974. * // => true
  16975. *
  16976. * _.isArrayLikeObject('abc');
  16977. * // => false
  16978. *
  16979. * _.isArrayLikeObject(_.noop);
  16980. * // => false
  16981. */
  16982. function isArrayLikeObject(value) {
  16983. return isObjectLike(value) && isArrayLike(value);
  16984. }
  16985. /**
  16986. * Checks if `value` is a buffer.
  16987. *
  16988. * @static
  16989. * @memberOf _
  16990. * @since 4.3.0
  16991. * @category Lang
  16992. * @param {*} value The value to check.
  16993. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
  16994. * @example
  16995. *
  16996. * _.isBuffer(new Buffer(2));
  16997. * // => true
  16998. *
  16999. * _.isBuffer(new Uint8Array(2));
  17000. * // => false
  17001. */
  17002. var isBuffer = nativeIsBuffer || stubFalse;
  17003. /**
  17004. * Checks if `value` is classified as a `Function` object.
  17005. *
  17006. * @static
  17007. * @memberOf _
  17008. * @since 0.1.0
  17009. * @category Lang
  17010. * @param {*} value The value to check.
  17011. * @returns {boolean} Returns `true` if `value` is a function, else `false`.
  17012. * @example
  17013. *
  17014. * _.isFunction(_);
  17015. * // => true
  17016. *
  17017. * _.isFunction(/abc/);
  17018. * // => false
  17019. */
  17020. function isFunction(value) {
  17021. // The use of `Object#toString` avoids issues with the `typeof` operator
  17022. // in Safari 8-9 which returns 'object' for typed array and other constructors.
  17023. var tag = isObject(value) ? objectToString.call(value) : '';
  17024. return tag == funcTag || tag == genTag;
  17025. }
  17026. /**
  17027. * Checks if `value` is a valid array-like length.
  17028. *
  17029. * **Note:** This method is loosely based on
  17030. * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
  17031. *
  17032. * @static
  17033. * @memberOf _
  17034. * @since 4.0.0
  17035. * @category Lang
  17036. * @param {*} value The value to check.
  17037. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
  17038. * @example
  17039. *
  17040. * _.isLength(3);
  17041. * // => true
  17042. *
  17043. * _.isLength(Number.MIN_VALUE);
  17044. * // => false
  17045. *
  17046. * _.isLength(Infinity);
  17047. * // => false
  17048. *
  17049. * _.isLength('3');
  17050. * // => false
  17051. */
  17052. function isLength(value) {
  17053. return typeof value == 'number' &&
  17054. value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
  17055. }
  17056. /**
  17057. * Checks if `value` is the
  17058. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  17059. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  17060. *
  17061. * @static
  17062. * @memberOf _
  17063. * @since 0.1.0
  17064. * @category Lang
  17065. * @param {*} value The value to check.
  17066. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  17067. * @example
  17068. *
  17069. * _.isObject({});
  17070. * // => true
  17071. *
  17072. * _.isObject([1, 2, 3]);
  17073. * // => true
  17074. *
  17075. * _.isObject(_.noop);
  17076. * // => true
  17077. *
  17078. * _.isObject(null);
  17079. * // => false
  17080. */
  17081. function isObject(value) {
  17082. var type = typeof value;
  17083. return !!value && (type == 'object' || type == 'function');
  17084. }
  17085. /**
  17086. * Checks if `value` is object-like. A value is object-like if it's not `null`
  17087. * and has a `typeof` result of "object".
  17088. *
  17089. * @static
  17090. * @memberOf _
  17091. * @since 4.0.0
  17092. * @category Lang
  17093. * @param {*} value The value to check.
  17094. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  17095. * @example
  17096. *
  17097. * _.isObjectLike({});
  17098. * // => true
  17099. *
  17100. * _.isObjectLike([1, 2, 3]);
  17101. * // => true
  17102. *
  17103. * _.isObjectLike(_.noop);
  17104. * // => false
  17105. *
  17106. * _.isObjectLike(null);
  17107. * // => false
  17108. */
  17109. function isObjectLike(value) {
  17110. return !!value && typeof value == 'object';
  17111. }
  17112. /**
  17113. * Creates an array of the own enumerable property names of `object`.
  17114. *
  17115. * **Note:** Non-object values are coerced to objects. See the
  17116. * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
  17117. * for more details.
  17118. *
  17119. * @static
  17120. * @since 0.1.0
  17121. * @memberOf _
  17122. * @category Object
  17123. * @param {Object} object The object to query.
  17124. * @returns {Array} Returns the array of property names.
  17125. * @example
  17126. *
  17127. * function Foo() {
  17128. * this.a = 1;
  17129. * this.b = 2;
  17130. * }
  17131. *
  17132. * Foo.prototype.c = 3;
  17133. *
  17134. * _.keys(new Foo);
  17135. * // => ['a', 'b'] (iteration order is not guaranteed)
  17136. *
  17137. * _.keys('hi');
  17138. * // => ['0', '1']
  17139. */
  17140. function keys(object) {
  17141. return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
  17142. }
  17143. /**
  17144. * This method returns a new empty array.
  17145. *
  17146. * @static
  17147. * @memberOf _
  17148. * @since 4.13.0
  17149. * @category Util
  17150. * @returns {Array} Returns the new empty array.
  17151. * @example
  17152. *
  17153. * var arrays = _.times(2, _.stubArray);
  17154. *
  17155. * console.log(arrays);
  17156. * // => [[], []]
  17157. *
  17158. * console.log(arrays[0] === arrays[1]);
  17159. * // => false
  17160. */
  17161. function stubArray() {
  17162. return [];
  17163. }
  17164. /**
  17165. * This method returns `false`.
  17166. *
  17167. * @static
  17168. * @memberOf _
  17169. * @since 4.13.0
  17170. * @category Util
  17171. * @returns {boolean} Returns `false`.
  17172. * @example
  17173. *
  17174. * _.times(2, _.stubFalse);
  17175. * // => [false, false]
  17176. */
  17177. function stubFalse() {
  17178. return false;
  17179. }
  17180. module.exports = cloneDeep;
  17181. /***/ }),
  17182. /***/ 1296:
  17183. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  17184. /**
  17185. * lodash (Custom Build) <https://lodash.com/>
  17186. * Build: `lodash modularize exports="npm" -o ./`
  17187. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  17188. * Released under MIT license <https://lodash.com/license>
  17189. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  17190. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  17191. */
  17192. /** Used as the `TypeError` message for "Functions" methods. */
  17193. var FUNC_ERROR_TEXT = 'Expected a function';
  17194. /** Used as references for various `Number` constants. */
  17195. var NAN = 0 / 0;
  17196. /** `Object#toString` result references. */
  17197. var symbolTag = '[object Symbol]';
  17198. /** Used to match leading and trailing whitespace. */
  17199. var reTrim = /^\s+|\s+$/g;
  17200. /** Used to detect bad signed hexadecimal string values. */
  17201. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  17202. /** Used to detect binary string values. */
  17203. var reIsBinary = /^0b[01]+$/i;
  17204. /** Used to detect octal string values. */
  17205. var reIsOctal = /^0o[0-7]+$/i;
  17206. /** Built-in method references without a dependency on `root`. */
  17207. var freeParseInt = parseInt;
  17208. /** Detect free variable `global` from Node.js. */
  17209. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  17210. /** Detect free variable `self`. */
  17211. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  17212. /** Used as a reference to the global object. */
  17213. var root = freeGlobal || freeSelf || Function('return this')();
  17214. /** Used for built-in method references. */
  17215. var objectProto = Object.prototype;
  17216. /**
  17217. * Used to resolve the
  17218. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  17219. * of values.
  17220. */
  17221. var objectToString = objectProto.toString;
  17222. /* Built-in method references for those with the same name as other `lodash` methods. */
  17223. var nativeMax = Math.max,
  17224. nativeMin = Math.min;
  17225. /**
  17226. * Gets the timestamp of the number of milliseconds that have elapsed since
  17227. * the Unix epoch (1 January 1970 00:00:00 UTC).
  17228. *
  17229. * @static
  17230. * @memberOf _
  17231. * @since 2.4.0
  17232. * @category Date
  17233. * @returns {number} Returns the timestamp.
  17234. * @example
  17235. *
  17236. * _.defer(function(stamp) {
  17237. * console.log(_.now() - stamp);
  17238. * }, _.now());
  17239. * // => Logs the number of milliseconds it took for the deferred invocation.
  17240. */
  17241. var now = function() {
  17242. return root.Date.now();
  17243. };
  17244. /**
  17245. * Creates a debounced function that delays invoking `func` until after `wait`
  17246. * milliseconds have elapsed since the last time the debounced function was
  17247. * invoked. The debounced function comes with a `cancel` method to cancel
  17248. * delayed `func` invocations and a `flush` method to immediately invoke them.
  17249. * Provide `options` to indicate whether `func` should be invoked on the
  17250. * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
  17251. * with the last arguments provided to the debounced function. Subsequent
  17252. * calls to the debounced function return the result of the last `func`
  17253. * invocation.
  17254. *
  17255. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  17256. * invoked on the trailing edge of the timeout only if the debounced function
  17257. * is invoked more than once during the `wait` timeout.
  17258. *
  17259. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  17260. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  17261. *
  17262. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  17263. * for details over the differences between `_.debounce` and `_.throttle`.
  17264. *
  17265. * @static
  17266. * @memberOf _
  17267. * @since 0.1.0
  17268. * @category Function
  17269. * @param {Function} func The function to debounce.
  17270. * @param {number} [wait=0] The number of milliseconds to delay.
  17271. * @param {Object} [options={}] The options object.
  17272. * @param {boolean} [options.leading=false]
  17273. * Specify invoking on the leading edge of the timeout.
  17274. * @param {number} [options.maxWait]
  17275. * The maximum time `func` is allowed to be delayed before it's invoked.
  17276. * @param {boolean} [options.trailing=true]
  17277. * Specify invoking on the trailing edge of the timeout.
  17278. * @returns {Function} Returns the new debounced function.
  17279. * @example
  17280. *
  17281. * // Avoid costly calculations while the window size is in flux.
  17282. * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
  17283. *
  17284. * // Invoke `sendMail` when clicked, debouncing subsequent calls.
  17285. * jQuery(element).on('click', _.debounce(sendMail, 300, {
  17286. * 'leading': true,
  17287. * 'trailing': false
  17288. * }));
  17289. *
  17290. * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
  17291. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
  17292. * var source = new EventSource('/stream');
  17293. * jQuery(source).on('message', debounced);
  17294. *
  17295. * // Cancel the trailing debounced invocation.
  17296. * jQuery(window).on('popstate', debounced.cancel);
  17297. */
  17298. function debounce(func, wait, options) {
  17299. var lastArgs,
  17300. lastThis,
  17301. maxWait,
  17302. result,
  17303. timerId,
  17304. lastCallTime,
  17305. lastInvokeTime = 0,
  17306. leading = false,
  17307. maxing = false,
  17308. trailing = true;
  17309. if (typeof func != 'function') {
  17310. throw new TypeError(FUNC_ERROR_TEXT);
  17311. }
  17312. wait = toNumber(wait) || 0;
  17313. if (isObject(options)) {
  17314. leading = !!options.leading;
  17315. maxing = 'maxWait' in options;
  17316. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  17317. trailing = 'trailing' in options ? !!options.trailing : trailing;
  17318. }
  17319. function invokeFunc(time) {
  17320. var args = lastArgs,
  17321. thisArg = lastThis;
  17322. lastArgs = lastThis = undefined;
  17323. lastInvokeTime = time;
  17324. result = func.apply(thisArg, args);
  17325. return result;
  17326. }
  17327. function leadingEdge(time) {
  17328. // Reset any `maxWait` timer.
  17329. lastInvokeTime = time;
  17330. // Start the timer for the trailing edge.
  17331. timerId = setTimeout(timerExpired, wait);
  17332. // Invoke the leading edge.
  17333. return leading ? invokeFunc(time) : result;
  17334. }
  17335. function remainingWait(time) {
  17336. var timeSinceLastCall = time - lastCallTime,
  17337. timeSinceLastInvoke = time - lastInvokeTime,
  17338. result = wait - timeSinceLastCall;
  17339. return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
  17340. }
  17341. function shouldInvoke(time) {
  17342. var timeSinceLastCall = time - lastCallTime,
  17343. timeSinceLastInvoke = time - lastInvokeTime;
  17344. // Either this is the first call, activity has stopped and we're at the
  17345. // trailing edge, the system time has gone backwards and we're treating
  17346. // it as the trailing edge, or we've hit the `maxWait` limit.
  17347. return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
  17348. (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
  17349. }
  17350. function timerExpired() {
  17351. var time = now();
  17352. if (shouldInvoke(time)) {
  17353. return trailingEdge(time);
  17354. }
  17355. // Restart the timer.
  17356. timerId = setTimeout(timerExpired, remainingWait(time));
  17357. }
  17358. function trailingEdge(time) {
  17359. timerId = undefined;
  17360. // Only invoke if we have `lastArgs` which means `func` has been
  17361. // debounced at least once.
  17362. if (trailing && lastArgs) {
  17363. return invokeFunc(time);
  17364. }
  17365. lastArgs = lastThis = undefined;
  17366. return result;
  17367. }
  17368. function cancel() {
  17369. if (timerId !== undefined) {
  17370. clearTimeout(timerId);
  17371. }
  17372. lastInvokeTime = 0;
  17373. lastArgs = lastCallTime = lastThis = timerId = undefined;
  17374. }
  17375. function flush() {
  17376. return timerId === undefined ? result : trailingEdge(now());
  17377. }
  17378. function debounced() {
  17379. var time = now(),
  17380. isInvoking = shouldInvoke(time);
  17381. lastArgs = arguments;
  17382. lastThis = this;
  17383. lastCallTime = time;
  17384. if (isInvoking) {
  17385. if (timerId === undefined) {
  17386. return leadingEdge(lastCallTime);
  17387. }
  17388. if (maxing) {
  17389. // Handle invocations in a tight loop.
  17390. timerId = setTimeout(timerExpired, wait);
  17391. return invokeFunc(lastCallTime);
  17392. }
  17393. }
  17394. if (timerId === undefined) {
  17395. timerId = setTimeout(timerExpired, wait);
  17396. }
  17397. return result;
  17398. }
  17399. debounced.cancel = cancel;
  17400. debounced.flush = flush;
  17401. return debounced;
  17402. }
  17403. /**
  17404. * Checks if `value` is the
  17405. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  17406. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  17407. *
  17408. * @static
  17409. * @memberOf _
  17410. * @since 0.1.0
  17411. * @category Lang
  17412. * @param {*} value The value to check.
  17413. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  17414. * @example
  17415. *
  17416. * _.isObject({});
  17417. * // => true
  17418. *
  17419. * _.isObject([1, 2, 3]);
  17420. * // => true
  17421. *
  17422. * _.isObject(_.noop);
  17423. * // => true
  17424. *
  17425. * _.isObject(null);
  17426. * // => false
  17427. */
  17428. function isObject(value) {
  17429. var type = typeof value;
  17430. return !!value && (type == 'object' || type == 'function');
  17431. }
  17432. /**
  17433. * Checks if `value` is object-like. A value is object-like if it's not `null`
  17434. * and has a `typeof` result of "object".
  17435. *
  17436. * @static
  17437. * @memberOf _
  17438. * @since 4.0.0
  17439. * @category Lang
  17440. * @param {*} value The value to check.
  17441. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  17442. * @example
  17443. *
  17444. * _.isObjectLike({});
  17445. * // => true
  17446. *
  17447. * _.isObjectLike([1, 2, 3]);
  17448. * // => true
  17449. *
  17450. * _.isObjectLike(_.noop);
  17451. * // => false
  17452. *
  17453. * _.isObjectLike(null);
  17454. * // => false
  17455. */
  17456. function isObjectLike(value) {
  17457. return !!value && typeof value == 'object';
  17458. }
  17459. /**
  17460. * Checks if `value` is classified as a `Symbol` primitive or object.
  17461. *
  17462. * @static
  17463. * @memberOf _
  17464. * @since 4.0.0
  17465. * @category Lang
  17466. * @param {*} value The value to check.
  17467. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  17468. * @example
  17469. *
  17470. * _.isSymbol(Symbol.iterator);
  17471. * // => true
  17472. *
  17473. * _.isSymbol('abc');
  17474. * // => false
  17475. */
  17476. function isSymbol(value) {
  17477. return typeof value == 'symbol' ||
  17478. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  17479. }
  17480. /**
  17481. * Converts `value` to a number.
  17482. *
  17483. * @static
  17484. * @memberOf _
  17485. * @since 4.0.0
  17486. * @category Lang
  17487. * @param {*} value The value to process.
  17488. * @returns {number} Returns the number.
  17489. * @example
  17490. *
  17491. * _.toNumber(3.2);
  17492. * // => 3.2
  17493. *
  17494. * _.toNumber(Number.MIN_VALUE);
  17495. * // => 5e-324
  17496. *
  17497. * _.toNumber(Infinity);
  17498. * // => Infinity
  17499. *
  17500. * _.toNumber('3.2');
  17501. * // => 3.2
  17502. */
  17503. function toNumber(value) {
  17504. if (typeof value == 'number') {
  17505. return value;
  17506. }
  17507. if (isSymbol(value)) {
  17508. return NAN;
  17509. }
  17510. if (isObject(value)) {
  17511. var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
  17512. value = isObject(other) ? (other + '') : other;
  17513. }
  17514. if (typeof value != 'string') {
  17515. return value === 0 ? value : +value;
  17516. }
  17517. value = value.replace(reTrim, '');
  17518. var isBinary = reIsBinary.test(value);
  17519. return (isBinary || reIsOctal.test(value))
  17520. ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  17521. : (reIsBadHex.test(value) ? NAN : +value);
  17522. }
  17523. module.exports = debounce;
  17524. /***/ }),
  17525. /***/ 9208:
  17526. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  17527. /**
  17528. * lodash (Custom Build) <https://lodash.com/>
  17529. * Build: `lodash modularize exports="npm" -o ./`
  17530. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  17531. * Released under MIT license <https://lodash.com/license>
  17532. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  17533. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  17534. */
  17535. /** Used as the `TypeError` message for "Functions" methods. */
  17536. var FUNC_ERROR_TEXT = 'Expected a function';
  17537. /** Used to stand-in for `undefined` hash values. */
  17538. var HASH_UNDEFINED = '__lodash_hash_undefined__';
  17539. /** Used as references for various `Number` constants. */
  17540. var INFINITY = 1 / 0;
  17541. /** `Object#toString` result references. */
  17542. var funcTag = '[object Function]',
  17543. genTag = '[object GeneratorFunction]',
  17544. symbolTag = '[object Symbol]';
  17545. /** Used to match property names within property paths. */
  17546. var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
  17547. reIsPlainProp = /^\w*$/,
  17548. reLeadingDot = /^\./,
  17549. rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
  17550. /**
  17551. * Used to match `RegExp`
  17552. * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
  17553. */
  17554. var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
  17555. /** Used to match backslashes in property paths. */
  17556. var reEscapeChar = /\\(\\)?/g;
  17557. /** Used to detect host constructors (Safari). */
  17558. var reIsHostCtor = /^\[object .+?Constructor\]$/;
  17559. /** Detect free variable `global` from Node.js. */
  17560. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  17561. /** Detect free variable `self`. */
  17562. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  17563. /** Used as a reference to the global object. */
  17564. var root = freeGlobal || freeSelf || Function('return this')();
  17565. /**
  17566. * Gets the value at `key` of `object`.
  17567. *
  17568. * @private
  17569. * @param {Object} [object] The object to query.
  17570. * @param {string} key The key of the property to get.
  17571. * @returns {*} Returns the property value.
  17572. */
  17573. function getValue(object, key) {
  17574. return object == null ? undefined : object[key];
  17575. }
  17576. /**
  17577. * Checks if `value` is a host object in IE < 9.
  17578. *
  17579. * @private
  17580. * @param {*} value The value to check.
  17581. * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
  17582. */
  17583. function isHostObject(value) {
  17584. // Many host objects are `Object` objects that can coerce to strings
  17585. // despite having improperly defined `toString` methods.
  17586. var result = false;
  17587. if (value != null && typeof value.toString != 'function') {
  17588. try {
  17589. result = !!(value + '');
  17590. } catch (e) {}
  17591. }
  17592. return result;
  17593. }
  17594. /** Used for built-in method references. */
  17595. var arrayProto = Array.prototype,
  17596. funcProto = Function.prototype,
  17597. objectProto = Object.prototype;
  17598. /** Used to detect overreaching core-js shims. */
  17599. var coreJsData = root['__core-js_shared__'];
  17600. /** Used to detect methods masquerading as native. */
  17601. var maskSrcKey = (function() {
  17602. var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  17603. return uid ? ('Symbol(src)_1.' + uid) : '';
  17604. }());
  17605. /** Used to resolve the decompiled source of functions. */
  17606. var funcToString = funcProto.toString;
  17607. /** Used to check objects for own properties. */
  17608. var hasOwnProperty = objectProto.hasOwnProperty;
  17609. /**
  17610. * Used to resolve the
  17611. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  17612. * of values.
  17613. */
  17614. var objectToString = objectProto.toString;
  17615. /** Used to detect if a method is native. */
  17616. var reIsNative = RegExp('^' +
  17617. funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  17618. .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  17619. );
  17620. /** Built-in value references. */
  17621. var Symbol = root.Symbol,
  17622. splice = arrayProto.splice;
  17623. /* Built-in method references that are verified to be native. */
  17624. var Map = getNative(root, 'Map'),
  17625. nativeCreate = getNative(Object, 'create');
  17626. /** Used to convert symbols to primitives and strings. */
  17627. var symbolProto = Symbol ? Symbol.prototype : undefined,
  17628. symbolToString = symbolProto ? symbolProto.toString : undefined;
  17629. /**
  17630. * Creates a hash object.
  17631. *
  17632. * @private
  17633. * @constructor
  17634. * @param {Array} [entries] The key-value pairs to cache.
  17635. */
  17636. function Hash(entries) {
  17637. var index = -1,
  17638. length = entries ? entries.length : 0;
  17639. this.clear();
  17640. while (++index < length) {
  17641. var entry = entries[index];
  17642. this.set(entry[0], entry[1]);
  17643. }
  17644. }
  17645. /**
  17646. * Removes all key-value entries from the hash.
  17647. *
  17648. * @private
  17649. * @name clear
  17650. * @memberOf Hash
  17651. */
  17652. function hashClear() {
  17653. this.__data__ = nativeCreate ? nativeCreate(null) : {};
  17654. }
  17655. /**
  17656. * Removes `key` and its value from the hash.
  17657. *
  17658. * @private
  17659. * @name delete
  17660. * @memberOf Hash
  17661. * @param {Object} hash The hash to modify.
  17662. * @param {string} key The key of the value to remove.
  17663. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  17664. */
  17665. function hashDelete(key) {
  17666. return this.has(key) && delete this.__data__[key];
  17667. }
  17668. /**
  17669. * Gets the hash value for `key`.
  17670. *
  17671. * @private
  17672. * @name get
  17673. * @memberOf Hash
  17674. * @param {string} key The key of the value to get.
  17675. * @returns {*} Returns the entry value.
  17676. */
  17677. function hashGet(key) {
  17678. var data = this.__data__;
  17679. if (nativeCreate) {
  17680. var result = data[key];
  17681. return result === HASH_UNDEFINED ? undefined : result;
  17682. }
  17683. return hasOwnProperty.call(data, key) ? data[key] : undefined;
  17684. }
  17685. /**
  17686. * Checks if a hash value for `key` exists.
  17687. *
  17688. * @private
  17689. * @name has
  17690. * @memberOf Hash
  17691. * @param {string} key The key of the entry to check.
  17692. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  17693. */
  17694. function hashHas(key) {
  17695. var data = this.__data__;
  17696. return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
  17697. }
  17698. /**
  17699. * Sets the hash `key` to `value`.
  17700. *
  17701. * @private
  17702. * @name set
  17703. * @memberOf Hash
  17704. * @param {string} key The key of the value to set.
  17705. * @param {*} value The value to set.
  17706. * @returns {Object} Returns the hash instance.
  17707. */
  17708. function hashSet(key, value) {
  17709. var data = this.__data__;
  17710. data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  17711. return this;
  17712. }
  17713. // Add methods to `Hash`.
  17714. Hash.prototype.clear = hashClear;
  17715. Hash.prototype['delete'] = hashDelete;
  17716. Hash.prototype.get = hashGet;
  17717. Hash.prototype.has = hashHas;
  17718. Hash.prototype.set = hashSet;
  17719. /**
  17720. * Creates an list cache object.
  17721. *
  17722. * @private
  17723. * @constructor
  17724. * @param {Array} [entries] The key-value pairs to cache.
  17725. */
  17726. function ListCache(entries) {
  17727. var index = -1,
  17728. length = entries ? entries.length : 0;
  17729. this.clear();
  17730. while (++index < length) {
  17731. var entry = entries[index];
  17732. this.set(entry[0], entry[1]);
  17733. }
  17734. }
  17735. /**
  17736. * Removes all key-value entries from the list cache.
  17737. *
  17738. * @private
  17739. * @name clear
  17740. * @memberOf ListCache
  17741. */
  17742. function listCacheClear() {
  17743. this.__data__ = [];
  17744. }
  17745. /**
  17746. * Removes `key` and its value from the list cache.
  17747. *
  17748. * @private
  17749. * @name delete
  17750. * @memberOf ListCache
  17751. * @param {string} key The key of the value to remove.
  17752. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  17753. */
  17754. function listCacheDelete(key) {
  17755. var data = this.__data__,
  17756. index = assocIndexOf(data, key);
  17757. if (index < 0) {
  17758. return false;
  17759. }
  17760. var lastIndex = data.length - 1;
  17761. if (index == lastIndex) {
  17762. data.pop();
  17763. } else {
  17764. splice.call(data, index, 1);
  17765. }
  17766. return true;
  17767. }
  17768. /**
  17769. * Gets the list cache value for `key`.
  17770. *
  17771. * @private
  17772. * @name get
  17773. * @memberOf ListCache
  17774. * @param {string} key The key of the value to get.
  17775. * @returns {*} Returns the entry value.
  17776. */
  17777. function listCacheGet(key) {
  17778. var data = this.__data__,
  17779. index = assocIndexOf(data, key);
  17780. return index < 0 ? undefined : data[index][1];
  17781. }
  17782. /**
  17783. * Checks if a list cache value for `key` exists.
  17784. *
  17785. * @private
  17786. * @name has
  17787. * @memberOf ListCache
  17788. * @param {string} key The key of the entry to check.
  17789. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  17790. */
  17791. function listCacheHas(key) {
  17792. return assocIndexOf(this.__data__, key) > -1;
  17793. }
  17794. /**
  17795. * Sets the list cache `key` to `value`.
  17796. *
  17797. * @private
  17798. * @name set
  17799. * @memberOf ListCache
  17800. * @param {string} key The key of the value to set.
  17801. * @param {*} value The value to set.
  17802. * @returns {Object} Returns the list cache instance.
  17803. */
  17804. function listCacheSet(key, value) {
  17805. var data = this.__data__,
  17806. index = assocIndexOf(data, key);
  17807. if (index < 0) {
  17808. data.push([key, value]);
  17809. } else {
  17810. data[index][1] = value;
  17811. }
  17812. return this;
  17813. }
  17814. // Add methods to `ListCache`.
  17815. ListCache.prototype.clear = listCacheClear;
  17816. ListCache.prototype['delete'] = listCacheDelete;
  17817. ListCache.prototype.get = listCacheGet;
  17818. ListCache.prototype.has = listCacheHas;
  17819. ListCache.prototype.set = listCacheSet;
  17820. /**
  17821. * Creates a map cache object to store key-value pairs.
  17822. *
  17823. * @private
  17824. * @constructor
  17825. * @param {Array} [entries] The key-value pairs to cache.
  17826. */
  17827. function MapCache(entries) {
  17828. var index = -1,
  17829. length = entries ? entries.length : 0;
  17830. this.clear();
  17831. while (++index < length) {
  17832. var entry = entries[index];
  17833. this.set(entry[0], entry[1]);
  17834. }
  17835. }
  17836. /**
  17837. * Removes all key-value entries from the map.
  17838. *
  17839. * @private
  17840. * @name clear
  17841. * @memberOf MapCache
  17842. */
  17843. function mapCacheClear() {
  17844. this.__data__ = {
  17845. 'hash': new Hash,
  17846. 'map': new (Map || ListCache),
  17847. 'string': new Hash
  17848. };
  17849. }
  17850. /**
  17851. * Removes `key` and its value from the map.
  17852. *
  17853. * @private
  17854. * @name delete
  17855. * @memberOf MapCache
  17856. * @param {string} key The key of the value to remove.
  17857. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  17858. */
  17859. function mapCacheDelete(key) {
  17860. return getMapData(this, key)['delete'](key);
  17861. }
  17862. /**
  17863. * Gets the map value for `key`.
  17864. *
  17865. * @private
  17866. * @name get
  17867. * @memberOf MapCache
  17868. * @param {string} key The key of the value to get.
  17869. * @returns {*} Returns the entry value.
  17870. */
  17871. function mapCacheGet(key) {
  17872. return getMapData(this, key).get(key);
  17873. }
  17874. /**
  17875. * Checks if a map value for `key` exists.
  17876. *
  17877. * @private
  17878. * @name has
  17879. * @memberOf MapCache
  17880. * @param {string} key The key of the entry to check.
  17881. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  17882. */
  17883. function mapCacheHas(key) {
  17884. return getMapData(this, key).has(key);
  17885. }
  17886. /**
  17887. * Sets the map `key` to `value`.
  17888. *
  17889. * @private
  17890. * @name set
  17891. * @memberOf MapCache
  17892. * @param {string} key The key of the value to set.
  17893. * @param {*} value The value to set.
  17894. * @returns {Object} Returns the map cache instance.
  17895. */
  17896. function mapCacheSet(key, value) {
  17897. getMapData(this, key).set(key, value);
  17898. return this;
  17899. }
  17900. // Add methods to `MapCache`.
  17901. MapCache.prototype.clear = mapCacheClear;
  17902. MapCache.prototype['delete'] = mapCacheDelete;
  17903. MapCache.prototype.get = mapCacheGet;
  17904. MapCache.prototype.has = mapCacheHas;
  17905. MapCache.prototype.set = mapCacheSet;
  17906. /**
  17907. * Gets the index at which the `key` is found in `array` of key-value pairs.
  17908. *
  17909. * @private
  17910. * @param {Array} array The array to inspect.
  17911. * @param {*} key The key to search for.
  17912. * @returns {number} Returns the index of the matched value, else `-1`.
  17913. */
  17914. function assocIndexOf(array, key) {
  17915. var length = array.length;
  17916. while (length--) {
  17917. if (eq(array[length][0], key)) {
  17918. return length;
  17919. }
  17920. }
  17921. return -1;
  17922. }
  17923. /**
  17924. * The base implementation of `_.get` without support for default values.
  17925. *
  17926. * @private
  17927. * @param {Object} object The object to query.
  17928. * @param {Array|string} path The path of the property to get.
  17929. * @returns {*} Returns the resolved value.
  17930. */
  17931. function baseGet(object, path) {
  17932. path = isKey(path, object) ? [path] : castPath(path);
  17933. var index = 0,
  17934. length = path.length;
  17935. while (object != null && index < length) {
  17936. object = object[toKey(path[index++])];
  17937. }
  17938. return (index && index == length) ? object : undefined;
  17939. }
  17940. /**
  17941. * The base implementation of `_.isNative` without bad shim checks.
  17942. *
  17943. * @private
  17944. * @param {*} value The value to check.
  17945. * @returns {boolean} Returns `true` if `value` is a native function,
  17946. * else `false`.
  17947. */
  17948. function baseIsNative(value) {
  17949. if (!isObject(value) || isMasked(value)) {
  17950. return false;
  17951. }
  17952. var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
  17953. return pattern.test(toSource(value));
  17954. }
  17955. /**
  17956. * The base implementation of `_.toString` which doesn't convert nullish
  17957. * values to empty strings.
  17958. *
  17959. * @private
  17960. * @param {*} value The value to process.
  17961. * @returns {string} Returns the string.
  17962. */
  17963. function baseToString(value) {
  17964. // Exit early for strings to avoid a performance hit in some environments.
  17965. if (typeof value == 'string') {
  17966. return value;
  17967. }
  17968. if (isSymbol(value)) {
  17969. return symbolToString ? symbolToString.call(value) : '';
  17970. }
  17971. var result = (value + '');
  17972. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  17973. }
  17974. /**
  17975. * Casts `value` to a path array if it's not one.
  17976. *
  17977. * @private
  17978. * @param {*} value The value to inspect.
  17979. * @returns {Array} Returns the cast property path array.
  17980. */
  17981. function castPath(value) {
  17982. return isArray(value) ? value : stringToPath(value);
  17983. }
  17984. /**
  17985. * Gets the data for `map`.
  17986. *
  17987. * @private
  17988. * @param {Object} map The map to query.
  17989. * @param {string} key The reference key.
  17990. * @returns {*} Returns the map data.
  17991. */
  17992. function getMapData(map, key) {
  17993. var data = map.__data__;
  17994. return isKeyable(key)
  17995. ? data[typeof key == 'string' ? 'string' : 'hash']
  17996. : data.map;
  17997. }
  17998. /**
  17999. * Gets the native function at `key` of `object`.
  18000. *
  18001. * @private
  18002. * @param {Object} object The object to query.
  18003. * @param {string} key The key of the method to get.
  18004. * @returns {*} Returns the function if it's native, else `undefined`.
  18005. */
  18006. function getNative(object, key) {
  18007. var value = getValue(object, key);
  18008. return baseIsNative(value) ? value : undefined;
  18009. }
  18010. /**
  18011. * Checks if `value` is a property name and not a property path.
  18012. *
  18013. * @private
  18014. * @param {*} value The value to check.
  18015. * @param {Object} [object] The object to query keys on.
  18016. * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
  18017. */
  18018. function isKey(value, object) {
  18019. if (isArray(value)) {
  18020. return false;
  18021. }
  18022. var type = typeof value;
  18023. if (type == 'number' || type == 'symbol' || type == 'boolean' ||
  18024. value == null || isSymbol(value)) {
  18025. return true;
  18026. }
  18027. return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
  18028. (object != null && value in Object(object));
  18029. }
  18030. /**
  18031. * Checks if `value` is suitable for use as unique object key.
  18032. *
  18033. * @private
  18034. * @param {*} value The value to check.
  18035. * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
  18036. */
  18037. function isKeyable(value) {
  18038. var type = typeof value;
  18039. return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
  18040. ? (value !== '__proto__')
  18041. : (value === null);
  18042. }
  18043. /**
  18044. * Checks if `func` has its source masked.
  18045. *
  18046. * @private
  18047. * @param {Function} func The function to check.
  18048. * @returns {boolean} Returns `true` if `func` is masked, else `false`.
  18049. */
  18050. function isMasked(func) {
  18051. return !!maskSrcKey && (maskSrcKey in func);
  18052. }
  18053. /**
  18054. * Converts `string` to a property path array.
  18055. *
  18056. * @private
  18057. * @param {string} string The string to convert.
  18058. * @returns {Array} Returns the property path array.
  18059. */
  18060. var stringToPath = memoize(function(string) {
  18061. string = toString(string);
  18062. var result = [];
  18063. if (reLeadingDot.test(string)) {
  18064. result.push('');
  18065. }
  18066. string.replace(rePropName, function(match, number, quote, string) {
  18067. result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
  18068. });
  18069. return result;
  18070. });
  18071. /**
  18072. * Converts `value` to a string key if it's not a string or symbol.
  18073. *
  18074. * @private
  18075. * @param {*} value The value to inspect.
  18076. * @returns {string|symbol} Returns the key.
  18077. */
  18078. function toKey(value) {
  18079. if (typeof value == 'string' || isSymbol(value)) {
  18080. return value;
  18081. }
  18082. var result = (value + '');
  18083. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  18084. }
  18085. /**
  18086. * Converts `func` to its source code.
  18087. *
  18088. * @private
  18089. * @param {Function} func The function to process.
  18090. * @returns {string} Returns the source code.
  18091. */
  18092. function toSource(func) {
  18093. if (func != null) {
  18094. try {
  18095. return funcToString.call(func);
  18096. } catch (e) {}
  18097. try {
  18098. return (func + '');
  18099. } catch (e) {}
  18100. }
  18101. return '';
  18102. }
  18103. /**
  18104. * Creates a function that memoizes the result of `func`. If `resolver` is
  18105. * provided, it determines the cache key for storing the result based on the
  18106. * arguments provided to the memoized function. By default, the first argument
  18107. * provided to the memoized function is used as the map cache key. The `func`
  18108. * is invoked with the `this` binding of the memoized function.
  18109. *
  18110. * **Note:** The cache is exposed as the `cache` property on the memoized
  18111. * function. Its creation may be customized by replacing the `_.memoize.Cache`
  18112. * constructor with one whose instances implement the
  18113. * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
  18114. * method interface of `delete`, `get`, `has`, and `set`.
  18115. *
  18116. * @static
  18117. * @memberOf _
  18118. * @since 0.1.0
  18119. * @category Function
  18120. * @param {Function} func The function to have its output memoized.
  18121. * @param {Function} [resolver] The function to resolve the cache key.
  18122. * @returns {Function} Returns the new memoized function.
  18123. * @example
  18124. *
  18125. * var object = { 'a': 1, 'b': 2 };
  18126. * var other = { 'c': 3, 'd': 4 };
  18127. *
  18128. * var values = _.memoize(_.values);
  18129. * values(object);
  18130. * // => [1, 2]
  18131. *
  18132. * values(other);
  18133. * // => [3, 4]
  18134. *
  18135. * object.a = 2;
  18136. * values(object);
  18137. * // => [1, 2]
  18138. *
  18139. * // Modify the result cache.
  18140. * values.cache.set(object, ['a', 'b']);
  18141. * values(object);
  18142. * // => ['a', 'b']
  18143. *
  18144. * // Replace `_.memoize.Cache`.
  18145. * _.memoize.Cache = WeakMap;
  18146. */
  18147. function memoize(func, resolver) {
  18148. if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
  18149. throw new TypeError(FUNC_ERROR_TEXT);
  18150. }
  18151. var memoized = function() {
  18152. var args = arguments,
  18153. key = resolver ? resolver.apply(this, args) : args[0],
  18154. cache = memoized.cache;
  18155. if (cache.has(key)) {
  18156. return cache.get(key);
  18157. }
  18158. var result = func.apply(this, args);
  18159. memoized.cache = cache.set(key, result);
  18160. return result;
  18161. };
  18162. memoized.cache = new (memoize.Cache || MapCache);
  18163. return memoized;
  18164. }
  18165. // Assign cache to `_.memoize`.
  18166. memoize.Cache = MapCache;
  18167. /**
  18168. * Performs a
  18169. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  18170. * comparison between two values to determine if they are equivalent.
  18171. *
  18172. * @static
  18173. * @memberOf _
  18174. * @since 4.0.0
  18175. * @category Lang
  18176. * @param {*} value The value to compare.
  18177. * @param {*} other The other value to compare.
  18178. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  18179. * @example
  18180. *
  18181. * var object = { 'a': 1 };
  18182. * var other = { 'a': 1 };
  18183. *
  18184. * _.eq(object, object);
  18185. * // => true
  18186. *
  18187. * _.eq(object, other);
  18188. * // => false
  18189. *
  18190. * _.eq('a', 'a');
  18191. * // => true
  18192. *
  18193. * _.eq('a', Object('a'));
  18194. * // => false
  18195. *
  18196. * _.eq(NaN, NaN);
  18197. * // => true
  18198. */
  18199. function eq(value, other) {
  18200. return value === other || (value !== value && other !== other);
  18201. }
  18202. /**
  18203. * Checks if `value` is classified as an `Array` object.
  18204. *
  18205. * @static
  18206. * @memberOf _
  18207. * @since 0.1.0
  18208. * @category Lang
  18209. * @param {*} value The value to check.
  18210. * @returns {boolean} Returns `true` if `value` is an array, else `false`.
  18211. * @example
  18212. *
  18213. * _.isArray([1, 2, 3]);
  18214. * // => true
  18215. *
  18216. * _.isArray(document.body.children);
  18217. * // => false
  18218. *
  18219. * _.isArray('abc');
  18220. * // => false
  18221. *
  18222. * _.isArray(_.noop);
  18223. * // => false
  18224. */
  18225. var isArray = Array.isArray;
  18226. /**
  18227. * Checks if `value` is classified as a `Function` object.
  18228. *
  18229. * @static
  18230. * @memberOf _
  18231. * @since 0.1.0
  18232. * @category Lang
  18233. * @param {*} value The value to check.
  18234. * @returns {boolean} Returns `true` if `value` is a function, else `false`.
  18235. * @example
  18236. *
  18237. * _.isFunction(_);
  18238. * // => true
  18239. *
  18240. * _.isFunction(/abc/);
  18241. * // => false
  18242. */
  18243. function isFunction(value) {
  18244. // The use of `Object#toString` avoids issues with the `typeof` operator
  18245. // in Safari 8-9 which returns 'object' for typed array and other constructors.
  18246. var tag = isObject(value) ? objectToString.call(value) : '';
  18247. return tag == funcTag || tag == genTag;
  18248. }
  18249. /**
  18250. * Checks if `value` is the
  18251. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  18252. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  18253. *
  18254. * @static
  18255. * @memberOf _
  18256. * @since 0.1.0
  18257. * @category Lang
  18258. * @param {*} value The value to check.
  18259. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  18260. * @example
  18261. *
  18262. * _.isObject({});
  18263. * // => true
  18264. *
  18265. * _.isObject([1, 2, 3]);
  18266. * // => true
  18267. *
  18268. * _.isObject(_.noop);
  18269. * // => true
  18270. *
  18271. * _.isObject(null);
  18272. * // => false
  18273. */
  18274. function isObject(value) {
  18275. var type = typeof value;
  18276. return !!value && (type == 'object' || type == 'function');
  18277. }
  18278. /**
  18279. * Checks if `value` is object-like. A value is object-like if it's not `null`
  18280. * and has a `typeof` result of "object".
  18281. *
  18282. * @static
  18283. * @memberOf _
  18284. * @since 4.0.0
  18285. * @category Lang
  18286. * @param {*} value The value to check.
  18287. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  18288. * @example
  18289. *
  18290. * _.isObjectLike({});
  18291. * // => true
  18292. *
  18293. * _.isObjectLike([1, 2, 3]);
  18294. * // => true
  18295. *
  18296. * _.isObjectLike(_.noop);
  18297. * // => false
  18298. *
  18299. * _.isObjectLike(null);
  18300. * // => false
  18301. */
  18302. function isObjectLike(value) {
  18303. return !!value && typeof value == 'object';
  18304. }
  18305. /**
  18306. * Checks if `value` is classified as a `Symbol` primitive or object.
  18307. *
  18308. * @static
  18309. * @memberOf _
  18310. * @since 4.0.0
  18311. * @category Lang
  18312. * @param {*} value The value to check.
  18313. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  18314. * @example
  18315. *
  18316. * _.isSymbol(Symbol.iterator);
  18317. * // => true
  18318. *
  18319. * _.isSymbol('abc');
  18320. * // => false
  18321. */
  18322. function isSymbol(value) {
  18323. return typeof value == 'symbol' ||
  18324. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  18325. }
  18326. /**
  18327. * Converts `value` to a string. An empty string is returned for `null`
  18328. * and `undefined` values. The sign of `-0` is preserved.
  18329. *
  18330. * @static
  18331. * @memberOf _
  18332. * @since 4.0.0
  18333. * @category Lang
  18334. * @param {*} value The value to process.
  18335. * @returns {string} Returns the string.
  18336. * @example
  18337. *
  18338. * _.toString(null);
  18339. * // => ''
  18340. *
  18341. * _.toString(-0);
  18342. * // => '-0'
  18343. *
  18344. * _.toString([1, 2, 3]);
  18345. * // => '1,2,3'
  18346. */
  18347. function toString(value) {
  18348. return value == null ? '' : baseToString(value);
  18349. }
  18350. /**
  18351. * Gets the value at `path` of `object`. If the resolved value is
  18352. * `undefined`, the `defaultValue` is returned in its place.
  18353. *
  18354. * @static
  18355. * @memberOf _
  18356. * @since 3.7.0
  18357. * @category Object
  18358. * @param {Object} object The object to query.
  18359. * @param {Array|string} path The path of the property to get.
  18360. * @param {*} [defaultValue] The value returned for `undefined` resolved values.
  18361. * @returns {*} Returns the resolved value.
  18362. * @example
  18363. *
  18364. * var object = { 'a': [{ 'b': { 'c': 3 } }] };
  18365. *
  18366. * _.get(object, 'a[0].b.c');
  18367. * // => 3
  18368. *
  18369. * _.get(object, ['a', '0', 'b', 'c']);
  18370. * // => 3
  18371. *
  18372. * _.get(object, 'a.b.c', 'default');
  18373. * // => 'default'
  18374. */
  18375. function get(object, path, defaultValue) {
  18376. var result = object == null ? undefined : baseGet(object, path);
  18377. return result === undefined ? defaultValue : result;
  18378. }
  18379. module.exports = get;
  18380. /***/ }),
  18381. /***/ 2307:
  18382. /***/ (function(module, exports, __webpack_require__) {
  18383. /* module decorator */ module = __webpack_require__.nmd(module);
  18384. /**
  18385. * Lodash (Custom Build) <https://lodash.com/>
  18386. * Build: `lodash modularize exports="npm" -o ./`
  18387. * Copyright JS Foundation and other contributors <https://js.foundation/>
  18388. * Released under MIT license <https://lodash.com/license>
  18389. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  18390. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  18391. */
  18392. /** Used as the size to enable large array optimizations. */
  18393. var LARGE_ARRAY_SIZE = 200;
  18394. /** Used to stand-in for `undefined` hash values. */
  18395. var HASH_UNDEFINED = '__lodash_hash_undefined__';
  18396. /** Used to compose bitmasks for value comparisons. */
  18397. var COMPARE_PARTIAL_FLAG = 1,
  18398. COMPARE_UNORDERED_FLAG = 2;
  18399. /** Used as references for various `Number` constants. */
  18400. var MAX_SAFE_INTEGER = 9007199254740991;
  18401. /** `Object#toString` result references. */
  18402. var argsTag = '[object Arguments]',
  18403. arrayTag = '[object Array]',
  18404. asyncTag = '[object AsyncFunction]',
  18405. boolTag = '[object Boolean]',
  18406. dateTag = '[object Date]',
  18407. errorTag = '[object Error]',
  18408. funcTag = '[object Function]',
  18409. genTag = '[object GeneratorFunction]',
  18410. mapTag = '[object Map]',
  18411. numberTag = '[object Number]',
  18412. nullTag = '[object Null]',
  18413. objectTag = '[object Object]',
  18414. promiseTag = '[object Promise]',
  18415. proxyTag = '[object Proxy]',
  18416. regexpTag = '[object RegExp]',
  18417. setTag = '[object Set]',
  18418. stringTag = '[object String]',
  18419. symbolTag = '[object Symbol]',
  18420. undefinedTag = '[object Undefined]',
  18421. weakMapTag = '[object WeakMap]';
  18422. var arrayBufferTag = '[object ArrayBuffer]',
  18423. dataViewTag = '[object DataView]',
  18424. float32Tag = '[object Float32Array]',
  18425. float64Tag = '[object Float64Array]',
  18426. int8Tag = '[object Int8Array]',
  18427. int16Tag = '[object Int16Array]',
  18428. int32Tag = '[object Int32Array]',
  18429. uint8Tag = '[object Uint8Array]',
  18430. uint8ClampedTag = '[object Uint8ClampedArray]',
  18431. uint16Tag = '[object Uint16Array]',
  18432. uint32Tag = '[object Uint32Array]';
  18433. /**
  18434. * Used to match `RegExp`
  18435. * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
  18436. */
  18437. var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
  18438. /** Used to detect host constructors (Safari). */
  18439. var reIsHostCtor = /^\[object .+?Constructor\]$/;
  18440. /** Used to detect unsigned integer values. */
  18441. var reIsUint = /^(?:0|[1-9]\d*)$/;
  18442. /** Used to identify `toStringTag` values of typed arrays. */
  18443. var typedArrayTags = {};
  18444. typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
  18445. typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
  18446. typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
  18447. typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
  18448. typedArrayTags[uint32Tag] = true;
  18449. typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
  18450. typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
  18451. typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
  18452. typedArrayTags[errorTag] = typedArrayTags[funcTag] =
  18453. typedArrayTags[mapTag] = typedArrayTags[numberTag] =
  18454. typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
  18455. typedArrayTags[setTag] = typedArrayTags[stringTag] =
  18456. typedArrayTags[weakMapTag] = false;
  18457. /** Detect free variable `global` from Node.js. */
  18458. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  18459. /** Detect free variable `self`. */
  18460. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  18461. /** Used as a reference to the global object. */
  18462. var root = freeGlobal || freeSelf || Function('return this')();
  18463. /** Detect free variable `exports`. */
  18464. var freeExports = true && exports && !exports.nodeType && exports;
  18465. /** Detect free variable `module`. */
  18466. var freeModule = freeExports && "object" == 'object' && module && !module.nodeType && module;
  18467. /** Detect the popular CommonJS extension `module.exports`. */
  18468. var moduleExports = freeModule && freeModule.exports === freeExports;
  18469. /** Detect free variable `process` from Node.js. */
  18470. var freeProcess = moduleExports && freeGlobal.process;
  18471. /** Used to access faster Node.js helpers. */
  18472. var nodeUtil = (function() {
  18473. try {
  18474. return freeProcess && freeProcess.binding && freeProcess.binding('util');
  18475. } catch (e) {}
  18476. }());
  18477. /* Node.js helper references. */
  18478. var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
  18479. /**
  18480. * A specialized version of `_.filter` for arrays without support for
  18481. * iteratee shorthands.
  18482. *
  18483. * @private
  18484. * @param {Array} [array] The array to iterate over.
  18485. * @param {Function} predicate The function invoked per iteration.
  18486. * @returns {Array} Returns the new filtered array.
  18487. */
  18488. function arrayFilter(array, predicate) {
  18489. var index = -1,
  18490. length = array == null ? 0 : array.length,
  18491. resIndex = 0,
  18492. result = [];
  18493. while (++index < length) {
  18494. var value = array[index];
  18495. if (predicate(value, index, array)) {
  18496. result[resIndex++] = value;
  18497. }
  18498. }
  18499. return result;
  18500. }
  18501. /**
  18502. * Appends the elements of `values` to `array`.
  18503. *
  18504. * @private
  18505. * @param {Array} array The array to modify.
  18506. * @param {Array} values The values to append.
  18507. * @returns {Array} Returns `array`.
  18508. */
  18509. function arrayPush(array, values) {
  18510. var index = -1,
  18511. length = values.length,
  18512. offset = array.length;
  18513. while (++index < length) {
  18514. array[offset + index] = values[index];
  18515. }
  18516. return array;
  18517. }
  18518. /**
  18519. * A specialized version of `_.some` for arrays without support for iteratee
  18520. * shorthands.
  18521. *
  18522. * @private
  18523. * @param {Array} [array] The array to iterate over.
  18524. * @param {Function} predicate The function invoked per iteration.
  18525. * @returns {boolean} Returns `true` if any element passes the predicate check,
  18526. * else `false`.
  18527. */
  18528. function arraySome(array, predicate) {
  18529. var index = -1,
  18530. length = array == null ? 0 : array.length;
  18531. while (++index < length) {
  18532. if (predicate(array[index], index, array)) {
  18533. return true;
  18534. }
  18535. }
  18536. return false;
  18537. }
  18538. /**
  18539. * The base implementation of `_.times` without support for iteratee shorthands
  18540. * or max array length checks.
  18541. *
  18542. * @private
  18543. * @param {number} n The number of times to invoke `iteratee`.
  18544. * @param {Function} iteratee The function invoked per iteration.
  18545. * @returns {Array} Returns the array of results.
  18546. */
  18547. function baseTimes(n, iteratee) {
  18548. var index = -1,
  18549. result = Array(n);
  18550. while (++index < n) {
  18551. result[index] = iteratee(index);
  18552. }
  18553. return result;
  18554. }
  18555. /**
  18556. * The base implementation of `_.unary` without support for storing metadata.
  18557. *
  18558. * @private
  18559. * @param {Function} func The function to cap arguments for.
  18560. * @returns {Function} Returns the new capped function.
  18561. */
  18562. function baseUnary(func) {
  18563. return function(value) {
  18564. return func(value);
  18565. };
  18566. }
  18567. /**
  18568. * Checks if a `cache` value for `key` exists.
  18569. *
  18570. * @private
  18571. * @param {Object} cache The cache to query.
  18572. * @param {string} key The key of the entry to check.
  18573. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  18574. */
  18575. function cacheHas(cache, key) {
  18576. return cache.has(key);
  18577. }
  18578. /**
  18579. * Gets the value at `key` of `object`.
  18580. *
  18581. * @private
  18582. * @param {Object} [object] The object to query.
  18583. * @param {string} key The key of the property to get.
  18584. * @returns {*} Returns the property value.
  18585. */
  18586. function getValue(object, key) {
  18587. return object == null ? undefined : object[key];
  18588. }
  18589. /**
  18590. * Converts `map` to its key-value pairs.
  18591. *
  18592. * @private
  18593. * @param {Object} map The map to convert.
  18594. * @returns {Array} Returns the key-value pairs.
  18595. */
  18596. function mapToArray(map) {
  18597. var index = -1,
  18598. result = Array(map.size);
  18599. map.forEach(function(value, key) {
  18600. result[++index] = [key, value];
  18601. });
  18602. return result;
  18603. }
  18604. /**
  18605. * Creates a unary function that invokes `func` with its argument transformed.
  18606. *
  18607. * @private
  18608. * @param {Function} func The function to wrap.
  18609. * @param {Function} transform The argument transform.
  18610. * @returns {Function} Returns the new function.
  18611. */
  18612. function overArg(func, transform) {
  18613. return function(arg) {
  18614. return func(transform(arg));
  18615. };
  18616. }
  18617. /**
  18618. * Converts `set` to an array of its values.
  18619. *
  18620. * @private
  18621. * @param {Object} set The set to convert.
  18622. * @returns {Array} Returns the values.
  18623. */
  18624. function setToArray(set) {
  18625. var index = -1,
  18626. result = Array(set.size);
  18627. set.forEach(function(value) {
  18628. result[++index] = value;
  18629. });
  18630. return result;
  18631. }
  18632. /** Used for built-in method references. */
  18633. var arrayProto = Array.prototype,
  18634. funcProto = Function.prototype,
  18635. objectProto = Object.prototype;
  18636. /** Used to detect overreaching core-js shims. */
  18637. var coreJsData = root['__core-js_shared__'];
  18638. /** Used to resolve the decompiled source of functions. */
  18639. var funcToString = funcProto.toString;
  18640. /** Used to check objects for own properties. */
  18641. var hasOwnProperty = objectProto.hasOwnProperty;
  18642. /** Used to detect methods masquerading as native. */
  18643. var maskSrcKey = (function() {
  18644. var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
  18645. return uid ? ('Symbol(src)_1.' + uid) : '';
  18646. }());
  18647. /**
  18648. * Used to resolve the
  18649. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  18650. * of values.
  18651. */
  18652. var nativeObjectToString = objectProto.toString;
  18653. /** Used to detect if a method is native. */
  18654. var reIsNative = RegExp('^' +
  18655. funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
  18656. .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  18657. );
  18658. /** Built-in value references. */
  18659. var Buffer = moduleExports ? root.Buffer : undefined,
  18660. Symbol = root.Symbol,
  18661. Uint8Array = root.Uint8Array,
  18662. propertyIsEnumerable = objectProto.propertyIsEnumerable,
  18663. splice = arrayProto.splice,
  18664. symToStringTag = Symbol ? Symbol.toStringTag : undefined;
  18665. /* Built-in method references for those with the same name as other `lodash` methods. */
  18666. var nativeGetSymbols = Object.getOwnPropertySymbols,
  18667. nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
  18668. nativeKeys = overArg(Object.keys, Object);
  18669. /* Built-in method references that are verified to be native. */
  18670. var DataView = getNative(root, 'DataView'),
  18671. Map = getNative(root, 'Map'),
  18672. Promise = getNative(root, 'Promise'),
  18673. Set = getNative(root, 'Set'),
  18674. WeakMap = getNative(root, 'WeakMap'),
  18675. nativeCreate = getNative(Object, 'create');
  18676. /** Used to detect maps, sets, and weakmaps. */
  18677. var dataViewCtorString = toSource(DataView),
  18678. mapCtorString = toSource(Map),
  18679. promiseCtorString = toSource(Promise),
  18680. setCtorString = toSource(Set),
  18681. weakMapCtorString = toSource(WeakMap);
  18682. /** Used to convert symbols to primitives and strings. */
  18683. var symbolProto = Symbol ? Symbol.prototype : undefined,
  18684. symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
  18685. /**
  18686. * Creates a hash object.
  18687. *
  18688. * @private
  18689. * @constructor
  18690. * @param {Array} [entries] The key-value pairs to cache.
  18691. */
  18692. function Hash(entries) {
  18693. var index = -1,
  18694. length = entries == null ? 0 : entries.length;
  18695. this.clear();
  18696. while (++index < length) {
  18697. var entry = entries[index];
  18698. this.set(entry[0], entry[1]);
  18699. }
  18700. }
  18701. /**
  18702. * Removes all key-value entries from the hash.
  18703. *
  18704. * @private
  18705. * @name clear
  18706. * @memberOf Hash
  18707. */
  18708. function hashClear() {
  18709. this.__data__ = nativeCreate ? nativeCreate(null) : {};
  18710. this.size = 0;
  18711. }
  18712. /**
  18713. * Removes `key` and its value from the hash.
  18714. *
  18715. * @private
  18716. * @name delete
  18717. * @memberOf Hash
  18718. * @param {Object} hash The hash to modify.
  18719. * @param {string} key The key of the value to remove.
  18720. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  18721. */
  18722. function hashDelete(key) {
  18723. var result = this.has(key) && delete this.__data__[key];
  18724. this.size -= result ? 1 : 0;
  18725. return result;
  18726. }
  18727. /**
  18728. * Gets the hash value for `key`.
  18729. *
  18730. * @private
  18731. * @name get
  18732. * @memberOf Hash
  18733. * @param {string} key The key of the value to get.
  18734. * @returns {*} Returns the entry value.
  18735. */
  18736. function hashGet(key) {
  18737. var data = this.__data__;
  18738. if (nativeCreate) {
  18739. var result = data[key];
  18740. return result === HASH_UNDEFINED ? undefined : result;
  18741. }
  18742. return hasOwnProperty.call(data, key) ? data[key] : undefined;
  18743. }
  18744. /**
  18745. * Checks if a hash value for `key` exists.
  18746. *
  18747. * @private
  18748. * @name has
  18749. * @memberOf Hash
  18750. * @param {string} key The key of the entry to check.
  18751. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  18752. */
  18753. function hashHas(key) {
  18754. var data = this.__data__;
  18755. return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
  18756. }
  18757. /**
  18758. * Sets the hash `key` to `value`.
  18759. *
  18760. * @private
  18761. * @name set
  18762. * @memberOf Hash
  18763. * @param {string} key The key of the value to set.
  18764. * @param {*} value The value to set.
  18765. * @returns {Object} Returns the hash instance.
  18766. */
  18767. function hashSet(key, value) {
  18768. var data = this.__data__;
  18769. this.size += this.has(key) ? 0 : 1;
  18770. data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
  18771. return this;
  18772. }
  18773. // Add methods to `Hash`.
  18774. Hash.prototype.clear = hashClear;
  18775. Hash.prototype['delete'] = hashDelete;
  18776. Hash.prototype.get = hashGet;
  18777. Hash.prototype.has = hashHas;
  18778. Hash.prototype.set = hashSet;
  18779. /**
  18780. * Creates an list cache object.
  18781. *
  18782. * @private
  18783. * @constructor
  18784. * @param {Array} [entries] The key-value pairs to cache.
  18785. */
  18786. function ListCache(entries) {
  18787. var index = -1,
  18788. length = entries == null ? 0 : entries.length;
  18789. this.clear();
  18790. while (++index < length) {
  18791. var entry = entries[index];
  18792. this.set(entry[0], entry[1]);
  18793. }
  18794. }
  18795. /**
  18796. * Removes all key-value entries from the list cache.
  18797. *
  18798. * @private
  18799. * @name clear
  18800. * @memberOf ListCache
  18801. */
  18802. function listCacheClear() {
  18803. this.__data__ = [];
  18804. this.size = 0;
  18805. }
  18806. /**
  18807. * Removes `key` and its value from the list cache.
  18808. *
  18809. * @private
  18810. * @name delete
  18811. * @memberOf ListCache
  18812. * @param {string} key The key of the value to remove.
  18813. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  18814. */
  18815. function listCacheDelete(key) {
  18816. var data = this.__data__,
  18817. index = assocIndexOf(data, key);
  18818. if (index < 0) {
  18819. return false;
  18820. }
  18821. var lastIndex = data.length - 1;
  18822. if (index == lastIndex) {
  18823. data.pop();
  18824. } else {
  18825. splice.call(data, index, 1);
  18826. }
  18827. --this.size;
  18828. return true;
  18829. }
  18830. /**
  18831. * Gets the list cache value for `key`.
  18832. *
  18833. * @private
  18834. * @name get
  18835. * @memberOf ListCache
  18836. * @param {string} key The key of the value to get.
  18837. * @returns {*} Returns the entry value.
  18838. */
  18839. function listCacheGet(key) {
  18840. var data = this.__data__,
  18841. index = assocIndexOf(data, key);
  18842. return index < 0 ? undefined : data[index][1];
  18843. }
  18844. /**
  18845. * Checks if a list cache value for `key` exists.
  18846. *
  18847. * @private
  18848. * @name has
  18849. * @memberOf ListCache
  18850. * @param {string} key The key of the entry to check.
  18851. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  18852. */
  18853. function listCacheHas(key) {
  18854. return assocIndexOf(this.__data__, key) > -1;
  18855. }
  18856. /**
  18857. * Sets the list cache `key` to `value`.
  18858. *
  18859. * @private
  18860. * @name set
  18861. * @memberOf ListCache
  18862. * @param {string} key The key of the value to set.
  18863. * @param {*} value The value to set.
  18864. * @returns {Object} Returns the list cache instance.
  18865. */
  18866. function listCacheSet(key, value) {
  18867. var data = this.__data__,
  18868. index = assocIndexOf(data, key);
  18869. if (index < 0) {
  18870. ++this.size;
  18871. data.push([key, value]);
  18872. } else {
  18873. data[index][1] = value;
  18874. }
  18875. return this;
  18876. }
  18877. // Add methods to `ListCache`.
  18878. ListCache.prototype.clear = listCacheClear;
  18879. ListCache.prototype['delete'] = listCacheDelete;
  18880. ListCache.prototype.get = listCacheGet;
  18881. ListCache.prototype.has = listCacheHas;
  18882. ListCache.prototype.set = listCacheSet;
  18883. /**
  18884. * Creates a map cache object to store key-value pairs.
  18885. *
  18886. * @private
  18887. * @constructor
  18888. * @param {Array} [entries] The key-value pairs to cache.
  18889. */
  18890. function MapCache(entries) {
  18891. var index = -1,
  18892. length = entries == null ? 0 : entries.length;
  18893. this.clear();
  18894. while (++index < length) {
  18895. var entry = entries[index];
  18896. this.set(entry[0], entry[1]);
  18897. }
  18898. }
  18899. /**
  18900. * Removes all key-value entries from the map.
  18901. *
  18902. * @private
  18903. * @name clear
  18904. * @memberOf MapCache
  18905. */
  18906. function mapCacheClear() {
  18907. this.size = 0;
  18908. this.__data__ = {
  18909. 'hash': new Hash,
  18910. 'map': new (Map || ListCache),
  18911. 'string': new Hash
  18912. };
  18913. }
  18914. /**
  18915. * Removes `key` and its value from the map.
  18916. *
  18917. * @private
  18918. * @name delete
  18919. * @memberOf MapCache
  18920. * @param {string} key The key of the value to remove.
  18921. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  18922. */
  18923. function mapCacheDelete(key) {
  18924. var result = getMapData(this, key)['delete'](key);
  18925. this.size -= result ? 1 : 0;
  18926. return result;
  18927. }
  18928. /**
  18929. * Gets the map value for `key`.
  18930. *
  18931. * @private
  18932. * @name get
  18933. * @memberOf MapCache
  18934. * @param {string} key The key of the value to get.
  18935. * @returns {*} Returns the entry value.
  18936. */
  18937. function mapCacheGet(key) {
  18938. return getMapData(this, key).get(key);
  18939. }
  18940. /**
  18941. * Checks if a map value for `key` exists.
  18942. *
  18943. * @private
  18944. * @name has
  18945. * @memberOf MapCache
  18946. * @param {string} key The key of the entry to check.
  18947. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  18948. */
  18949. function mapCacheHas(key) {
  18950. return getMapData(this, key).has(key);
  18951. }
  18952. /**
  18953. * Sets the map `key` to `value`.
  18954. *
  18955. * @private
  18956. * @name set
  18957. * @memberOf MapCache
  18958. * @param {string} key The key of the value to set.
  18959. * @param {*} value The value to set.
  18960. * @returns {Object} Returns the map cache instance.
  18961. */
  18962. function mapCacheSet(key, value) {
  18963. var data = getMapData(this, key),
  18964. size = data.size;
  18965. data.set(key, value);
  18966. this.size += data.size == size ? 0 : 1;
  18967. return this;
  18968. }
  18969. // Add methods to `MapCache`.
  18970. MapCache.prototype.clear = mapCacheClear;
  18971. MapCache.prototype['delete'] = mapCacheDelete;
  18972. MapCache.prototype.get = mapCacheGet;
  18973. MapCache.prototype.has = mapCacheHas;
  18974. MapCache.prototype.set = mapCacheSet;
  18975. /**
  18976. *
  18977. * Creates an array cache object to store unique values.
  18978. *
  18979. * @private
  18980. * @constructor
  18981. * @param {Array} [values] The values to cache.
  18982. */
  18983. function SetCache(values) {
  18984. var index = -1,
  18985. length = values == null ? 0 : values.length;
  18986. this.__data__ = new MapCache;
  18987. while (++index < length) {
  18988. this.add(values[index]);
  18989. }
  18990. }
  18991. /**
  18992. * Adds `value` to the array cache.
  18993. *
  18994. * @private
  18995. * @name add
  18996. * @memberOf SetCache
  18997. * @alias push
  18998. * @param {*} value The value to cache.
  18999. * @returns {Object} Returns the cache instance.
  19000. */
  19001. function setCacheAdd(value) {
  19002. this.__data__.set(value, HASH_UNDEFINED);
  19003. return this;
  19004. }
  19005. /**
  19006. * Checks if `value` is in the array cache.
  19007. *
  19008. * @private
  19009. * @name has
  19010. * @memberOf SetCache
  19011. * @param {*} value The value to search for.
  19012. * @returns {number} Returns `true` if `value` is found, else `false`.
  19013. */
  19014. function setCacheHas(value) {
  19015. return this.__data__.has(value);
  19016. }
  19017. // Add methods to `SetCache`.
  19018. SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
  19019. SetCache.prototype.has = setCacheHas;
  19020. /**
  19021. * Creates a stack cache object to store key-value pairs.
  19022. *
  19023. * @private
  19024. * @constructor
  19025. * @param {Array} [entries] The key-value pairs to cache.
  19026. */
  19027. function Stack(entries) {
  19028. var data = this.__data__ = new ListCache(entries);
  19029. this.size = data.size;
  19030. }
  19031. /**
  19032. * Removes all key-value entries from the stack.
  19033. *
  19034. * @private
  19035. * @name clear
  19036. * @memberOf Stack
  19037. */
  19038. function stackClear() {
  19039. this.__data__ = new ListCache;
  19040. this.size = 0;
  19041. }
  19042. /**
  19043. * Removes `key` and its value from the stack.
  19044. *
  19045. * @private
  19046. * @name delete
  19047. * @memberOf Stack
  19048. * @param {string} key The key of the value to remove.
  19049. * @returns {boolean} Returns `true` if the entry was removed, else `false`.
  19050. */
  19051. function stackDelete(key) {
  19052. var data = this.__data__,
  19053. result = data['delete'](key);
  19054. this.size = data.size;
  19055. return result;
  19056. }
  19057. /**
  19058. * Gets the stack value for `key`.
  19059. *
  19060. * @private
  19061. * @name get
  19062. * @memberOf Stack
  19063. * @param {string} key The key of the value to get.
  19064. * @returns {*} Returns the entry value.
  19065. */
  19066. function stackGet(key) {
  19067. return this.__data__.get(key);
  19068. }
  19069. /**
  19070. * Checks if a stack value for `key` exists.
  19071. *
  19072. * @private
  19073. * @name has
  19074. * @memberOf Stack
  19075. * @param {string} key The key of the entry to check.
  19076. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
  19077. */
  19078. function stackHas(key) {
  19079. return this.__data__.has(key);
  19080. }
  19081. /**
  19082. * Sets the stack `key` to `value`.
  19083. *
  19084. * @private
  19085. * @name set
  19086. * @memberOf Stack
  19087. * @param {string} key The key of the value to set.
  19088. * @param {*} value The value to set.
  19089. * @returns {Object} Returns the stack cache instance.
  19090. */
  19091. function stackSet(key, value) {
  19092. var data = this.__data__;
  19093. if (data instanceof ListCache) {
  19094. var pairs = data.__data__;
  19095. if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
  19096. pairs.push([key, value]);
  19097. this.size = ++data.size;
  19098. return this;
  19099. }
  19100. data = this.__data__ = new MapCache(pairs);
  19101. }
  19102. data.set(key, value);
  19103. this.size = data.size;
  19104. return this;
  19105. }
  19106. // Add methods to `Stack`.
  19107. Stack.prototype.clear = stackClear;
  19108. Stack.prototype['delete'] = stackDelete;
  19109. Stack.prototype.get = stackGet;
  19110. Stack.prototype.has = stackHas;
  19111. Stack.prototype.set = stackSet;
  19112. /**
  19113. * Creates an array of the enumerable property names of the array-like `value`.
  19114. *
  19115. * @private
  19116. * @param {*} value The value to query.
  19117. * @param {boolean} inherited Specify returning inherited property names.
  19118. * @returns {Array} Returns the array of property names.
  19119. */
  19120. function arrayLikeKeys(value, inherited) {
  19121. var isArr = isArray(value),
  19122. isArg = !isArr && isArguments(value),
  19123. isBuff = !isArr && !isArg && isBuffer(value),
  19124. isType = !isArr && !isArg && !isBuff && isTypedArray(value),
  19125. skipIndexes = isArr || isArg || isBuff || isType,
  19126. result = skipIndexes ? baseTimes(value.length, String) : [],
  19127. length = result.length;
  19128. for (var key in value) {
  19129. if ((inherited || hasOwnProperty.call(value, key)) &&
  19130. !(skipIndexes && (
  19131. // Safari 9 has enumerable `arguments.length` in strict mode.
  19132. key == 'length' ||
  19133. // Node.js 0.10 has enumerable non-index properties on buffers.
  19134. (isBuff && (key == 'offset' || key == 'parent')) ||
  19135. // PhantomJS 2 has enumerable non-index properties on typed arrays.
  19136. (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
  19137. // Skip index properties.
  19138. isIndex(key, length)
  19139. ))) {
  19140. result.push(key);
  19141. }
  19142. }
  19143. return result;
  19144. }
  19145. /**
  19146. * Gets the index at which the `key` is found in `array` of key-value pairs.
  19147. *
  19148. * @private
  19149. * @param {Array} array The array to inspect.
  19150. * @param {*} key The key to search for.
  19151. * @returns {number} Returns the index of the matched value, else `-1`.
  19152. */
  19153. function assocIndexOf(array, key) {
  19154. var length = array.length;
  19155. while (length--) {
  19156. if (eq(array[length][0], key)) {
  19157. return length;
  19158. }
  19159. }
  19160. return -1;
  19161. }
  19162. /**
  19163. * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
  19164. * `keysFunc` and `symbolsFunc` to get the enumerable property names and
  19165. * symbols of `object`.
  19166. *
  19167. * @private
  19168. * @param {Object} object The object to query.
  19169. * @param {Function} keysFunc The function to get the keys of `object`.
  19170. * @param {Function} symbolsFunc The function to get the symbols of `object`.
  19171. * @returns {Array} Returns the array of property names and symbols.
  19172. */
  19173. function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  19174. var result = keysFunc(object);
  19175. return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
  19176. }
  19177. /**
  19178. * The base implementation of `getTag` without fallbacks for buggy environments.
  19179. *
  19180. * @private
  19181. * @param {*} value The value to query.
  19182. * @returns {string} Returns the `toStringTag`.
  19183. */
  19184. function baseGetTag(value) {
  19185. if (value == null) {
  19186. return value === undefined ? undefinedTag : nullTag;
  19187. }
  19188. return (symToStringTag && symToStringTag in Object(value))
  19189. ? getRawTag(value)
  19190. : objectToString(value);
  19191. }
  19192. /**
  19193. * The base implementation of `_.isArguments`.
  19194. *
  19195. * @private
  19196. * @param {*} value The value to check.
  19197. * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  19198. */
  19199. function baseIsArguments(value) {
  19200. return isObjectLike(value) && baseGetTag(value) == argsTag;
  19201. }
  19202. /**
  19203. * The base implementation of `_.isEqual` which supports partial comparisons
  19204. * and tracks traversed objects.
  19205. *
  19206. * @private
  19207. * @param {*} value The value to compare.
  19208. * @param {*} other The other value to compare.
  19209. * @param {boolean} bitmask The bitmask flags.
  19210. * 1 - Unordered comparison
  19211. * 2 - Partial comparison
  19212. * @param {Function} [customizer] The function to customize comparisons.
  19213. * @param {Object} [stack] Tracks traversed `value` and `other` objects.
  19214. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  19215. */
  19216. function baseIsEqual(value, other, bitmask, customizer, stack) {
  19217. if (value === other) {
  19218. return true;
  19219. }
  19220. if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
  19221. return value !== value && other !== other;
  19222. }
  19223. return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
  19224. }
  19225. /**
  19226. * A specialized version of `baseIsEqual` for arrays and objects which performs
  19227. * deep comparisons and tracks traversed objects enabling objects with circular
  19228. * references to be compared.
  19229. *
  19230. * @private
  19231. * @param {Object} object The object to compare.
  19232. * @param {Object} other The other object to compare.
  19233. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  19234. * @param {Function} customizer The function to customize comparisons.
  19235. * @param {Function} equalFunc The function to determine equivalents of values.
  19236. * @param {Object} [stack] Tracks traversed `object` and `other` objects.
  19237. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  19238. */
  19239. function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
  19240. var objIsArr = isArray(object),
  19241. othIsArr = isArray(other),
  19242. objTag = objIsArr ? arrayTag : getTag(object),
  19243. othTag = othIsArr ? arrayTag : getTag(other);
  19244. objTag = objTag == argsTag ? objectTag : objTag;
  19245. othTag = othTag == argsTag ? objectTag : othTag;
  19246. var objIsObj = objTag == objectTag,
  19247. othIsObj = othTag == objectTag,
  19248. isSameTag = objTag == othTag;
  19249. if (isSameTag && isBuffer(object)) {
  19250. if (!isBuffer(other)) {
  19251. return false;
  19252. }
  19253. objIsArr = true;
  19254. objIsObj = false;
  19255. }
  19256. if (isSameTag && !objIsObj) {
  19257. stack || (stack = new Stack);
  19258. return (objIsArr || isTypedArray(object))
  19259. ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
  19260. : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
  19261. }
  19262. if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
  19263. var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
  19264. othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
  19265. if (objIsWrapped || othIsWrapped) {
  19266. var objUnwrapped = objIsWrapped ? object.value() : object,
  19267. othUnwrapped = othIsWrapped ? other.value() : other;
  19268. stack || (stack = new Stack);
  19269. return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
  19270. }
  19271. }
  19272. if (!isSameTag) {
  19273. return false;
  19274. }
  19275. stack || (stack = new Stack);
  19276. return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
  19277. }
  19278. /**
  19279. * The base implementation of `_.isNative` without bad shim checks.
  19280. *
  19281. * @private
  19282. * @param {*} value The value to check.
  19283. * @returns {boolean} Returns `true` if `value` is a native function,
  19284. * else `false`.
  19285. */
  19286. function baseIsNative(value) {
  19287. if (!isObject(value) || isMasked(value)) {
  19288. return false;
  19289. }
  19290. var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
  19291. return pattern.test(toSource(value));
  19292. }
  19293. /**
  19294. * The base implementation of `_.isTypedArray` without Node.js optimizations.
  19295. *
  19296. * @private
  19297. * @param {*} value The value to check.
  19298. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
  19299. */
  19300. function baseIsTypedArray(value) {
  19301. return isObjectLike(value) &&
  19302. isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
  19303. }
  19304. /**
  19305. * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
  19306. *
  19307. * @private
  19308. * @param {Object} object The object to query.
  19309. * @returns {Array} Returns the array of property names.
  19310. */
  19311. function baseKeys(object) {
  19312. if (!isPrototype(object)) {
  19313. return nativeKeys(object);
  19314. }
  19315. var result = [];
  19316. for (var key in Object(object)) {
  19317. if (hasOwnProperty.call(object, key) && key != 'constructor') {
  19318. result.push(key);
  19319. }
  19320. }
  19321. return result;
  19322. }
  19323. /**
  19324. * A specialized version of `baseIsEqualDeep` for arrays with support for
  19325. * partial deep comparisons.
  19326. *
  19327. * @private
  19328. * @param {Array} array The array to compare.
  19329. * @param {Array} other The other array to compare.
  19330. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  19331. * @param {Function} customizer The function to customize comparisons.
  19332. * @param {Function} equalFunc The function to determine equivalents of values.
  19333. * @param {Object} stack Tracks traversed `array` and `other` objects.
  19334. * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
  19335. */
  19336. function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  19337. var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
  19338. arrLength = array.length,
  19339. othLength = other.length;
  19340. if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
  19341. return false;
  19342. }
  19343. // Assume cyclic values are equal.
  19344. var stacked = stack.get(array);
  19345. if (stacked && stack.get(other)) {
  19346. return stacked == other;
  19347. }
  19348. var index = -1,
  19349. result = true,
  19350. seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
  19351. stack.set(array, other);
  19352. stack.set(other, array);
  19353. // Ignore non-index properties.
  19354. while (++index < arrLength) {
  19355. var arrValue = array[index],
  19356. othValue = other[index];
  19357. if (customizer) {
  19358. var compared = isPartial
  19359. ? customizer(othValue, arrValue, index, other, array, stack)
  19360. : customizer(arrValue, othValue, index, array, other, stack);
  19361. }
  19362. if (compared !== undefined) {
  19363. if (compared) {
  19364. continue;
  19365. }
  19366. result = false;
  19367. break;
  19368. }
  19369. // Recursively compare arrays (susceptible to call stack limits).
  19370. if (seen) {
  19371. if (!arraySome(other, function(othValue, othIndex) {
  19372. if (!cacheHas(seen, othIndex) &&
  19373. (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
  19374. return seen.push(othIndex);
  19375. }
  19376. })) {
  19377. result = false;
  19378. break;
  19379. }
  19380. } else if (!(
  19381. arrValue === othValue ||
  19382. equalFunc(arrValue, othValue, bitmask, customizer, stack)
  19383. )) {
  19384. result = false;
  19385. break;
  19386. }
  19387. }
  19388. stack['delete'](array);
  19389. stack['delete'](other);
  19390. return result;
  19391. }
  19392. /**
  19393. * A specialized version of `baseIsEqualDeep` for comparing objects of
  19394. * the same `toStringTag`.
  19395. *
  19396. * **Note:** This function only supports comparing values with tags of
  19397. * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
  19398. *
  19399. * @private
  19400. * @param {Object} object The object to compare.
  19401. * @param {Object} other The other object to compare.
  19402. * @param {string} tag The `toStringTag` of the objects to compare.
  19403. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  19404. * @param {Function} customizer The function to customize comparisons.
  19405. * @param {Function} equalFunc The function to determine equivalents of values.
  19406. * @param {Object} stack Tracks traversed `object` and `other` objects.
  19407. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  19408. */
  19409. function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
  19410. switch (tag) {
  19411. case dataViewTag:
  19412. if ((object.byteLength != other.byteLength) ||
  19413. (object.byteOffset != other.byteOffset)) {
  19414. return false;
  19415. }
  19416. object = object.buffer;
  19417. other = other.buffer;
  19418. case arrayBufferTag:
  19419. if ((object.byteLength != other.byteLength) ||
  19420. !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
  19421. return false;
  19422. }
  19423. return true;
  19424. case boolTag:
  19425. case dateTag:
  19426. case numberTag:
  19427. // Coerce booleans to `1` or `0` and dates to milliseconds.
  19428. // Invalid dates are coerced to `NaN`.
  19429. return eq(+object, +other);
  19430. case errorTag:
  19431. return object.name == other.name && object.message == other.message;
  19432. case regexpTag:
  19433. case stringTag:
  19434. // Coerce regexes to strings and treat strings, primitives and objects,
  19435. // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
  19436. // for more details.
  19437. return object == (other + '');
  19438. case mapTag:
  19439. var convert = mapToArray;
  19440. case setTag:
  19441. var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
  19442. convert || (convert = setToArray);
  19443. if (object.size != other.size && !isPartial) {
  19444. return false;
  19445. }
  19446. // Assume cyclic values are equal.
  19447. var stacked = stack.get(object);
  19448. if (stacked) {
  19449. return stacked == other;
  19450. }
  19451. bitmask |= COMPARE_UNORDERED_FLAG;
  19452. // Recursively compare objects (susceptible to call stack limits).
  19453. stack.set(object, other);
  19454. var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
  19455. stack['delete'](object);
  19456. return result;
  19457. case symbolTag:
  19458. if (symbolValueOf) {
  19459. return symbolValueOf.call(object) == symbolValueOf.call(other);
  19460. }
  19461. }
  19462. return false;
  19463. }
  19464. /**
  19465. * A specialized version of `baseIsEqualDeep` for objects with support for
  19466. * partial deep comparisons.
  19467. *
  19468. * @private
  19469. * @param {Object} object The object to compare.
  19470. * @param {Object} other The other object to compare.
  19471. * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
  19472. * @param {Function} customizer The function to customize comparisons.
  19473. * @param {Function} equalFunc The function to determine equivalents of values.
  19474. * @param {Object} stack Tracks traversed `object` and `other` objects.
  19475. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
  19476. */
  19477. function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
  19478. var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
  19479. objProps = getAllKeys(object),
  19480. objLength = objProps.length,
  19481. othProps = getAllKeys(other),
  19482. othLength = othProps.length;
  19483. if (objLength != othLength && !isPartial) {
  19484. return false;
  19485. }
  19486. var index = objLength;
  19487. while (index--) {
  19488. var key = objProps[index];
  19489. if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
  19490. return false;
  19491. }
  19492. }
  19493. // Assume cyclic values are equal.
  19494. var stacked = stack.get(object);
  19495. if (stacked && stack.get(other)) {
  19496. return stacked == other;
  19497. }
  19498. var result = true;
  19499. stack.set(object, other);
  19500. stack.set(other, object);
  19501. var skipCtor = isPartial;
  19502. while (++index < objLength) {
  19503. key = objProps[index];
  19504. var objValue = object[key],
  19505. othValue = other[key];
  19506. if (customizer) {
  19507. var compared = isPartial
  19508. ? customizer(othValue, objValue, key, other, object, stack)
  19509. : customizer(objValue, othValue, key, object, other, stack);
  19510. }
  19511. // Recursively compare objects (susceptible to call stack limits).
  19512. if (!(compared === undefined
  19513. ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
  19514. : compared
  19515. )) {
  19516. result = false;
  19517. break;
  19518. }
  19519. skipCtor || (skipCtor = key == 'constructor');
  19520. }
  19521. if (result && !skipCtor) {
  19522. var objCtor = object.constructor,
  19523. othCtor = other.constructor;
  19524. // Non `Object` object instances with different constructors are not equal.
  19525. if (objCtor != othCtor &&
  19526. ('constructor' in object && 'constructor' in other) &&
  19527. !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
  19528. typeof othCtor == 'function' && othCtor instanceof othCtor)) {
  19529. result = false;
  19530. }
  19531. }
  19532. stack['delete'](object);
  19533. stack['delete'](other);
  19534. return result;
  19535. }
  19536. /**
  19537. * Creates an array of own enumerable property names and symbols of `object`.
  19538. *
  19539. * @private
  19540. * @param {Object} object The object to query.
  19541. * @returns {Array} Returns the array of property names and symbols.
  19542. */
  19543. function getAllKeys(object) {
  19544. return baseGetAllKeys(object, keys, getSymbols);
  19545. }
  19546. /**
  19547. * Gets the data for `map`.
  19548. *
  19549. * @private
  19550. * @param {Object} map The map to query.
  19551. * @param {string} key The reference key.
  19552. * @returns {*} Returns the map data.
  19553. */
  19554. function getMapData(map, key) {
  19555. var data = map.__data__;
  19556. return isKeyable(key)
  19557. ? data[typeof key == 'string' ? 'string' : 'hash']
  19558. : data.map;
  19559. }
  19560. /**
  19561. * Gets the native function at `key` of `object`.
  19562. *
  19563. * @private
  19564. * @param {Object} object The object to query.
  19565. * @param {string} key The key of the method to get.
  19566. * @returns {*} Returns the function if it's native, else `undefined`.
  19567. */
  19568. function getNative(object, key) {
  19569. var value = getValue(object, key);
  19570. return baseIsNative(value) ? value : undefined;
  19571. }
  19572. /**
  19573. * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
  19574. *
  19575. * @private
  19576. * @param {*} value The value to query.
  19577. * @returns {string} Returns the raw `toStringTag`.
  19578. */
  19579. function getRawTag(value) {
  19580. var isOwn = hasOwnProperty.call(value, symToStringTag),
  19581. tag = value[symToStringTag];
  19582. try {
  19583. value[symToStringTag] = undefined;
  19584. var unmasked = true;
  19585. } catch (e) {}
  19586. var result = nativeObjectToString.call(value);
  19587. if (unmasked) {
  19588. if (isOwn) {
  19589. value[symToStringTag] = tag;
  19590. } else {
  19591. delete value[symToStringTag];
  19592. }
  19593. }
  19594. return result;
  19595. }
  19596. /**
  19597. * Creates an array of the own enumerable symbols of `object`.
  19598. *
  19599. * @private
  19600. * @param {Object} object The object to query.
  19601. * @returns {Array} Returns the array of symbols.
  19602. */
  19603. var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
  19604. if (object == null) {
  19605. return [];
  19606. }
  19607. object = Object(object);
  19608. return arrayFilter(nativeGetSymbols(object), function(symbol) {
  19609. return propertyIsEnumerable.call(object, symbol);
  19610. });
  19611. };
  19612. /**
  19613. * Gets the `toStringTag` of `value`.
  19614. *
  19615. * @private
  19616. * @param {*} value The value to query.
  19617. * @returns {string} Returns the `toStringTag`.
  19618. */
  19619. var getTag = baseGetTag;
  19620. // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
  19621. if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
  19622. (Map && getTag(new Map) != mapTag) ||
  19623. (Promise && getTag(Promise.resolve()) != promiseTag) ||
  19624. (Set && getTag(new Set) != setTag) ||
  19625. (WeakMap && getTag(new WeakMap) != weakMapTag)) {
  19626. getTag = function(value) {
  19627. var result = baseGetTag(value),
  19628. Ctor = result == objectTag ? value.constructor : undefined,
  19629. ctorString = Ctor ? toSource(Ctor) : '';
  19630. if (ctorString) {
  19631. switch (ctorString) {
  19632. case dataViewCtorString: return dataViewTag;
  19633. case mapCtorString: return mapTag;
  19634. case promiseCtorString: return promiseTag;
  19635. case setCtorString: return setTag;
  19636. case weakMapCtorString: return weakMapTag;
  19637. }
  19638. }
  19639. return result;
  19640. };
  19641. }
  19642. /**
  19643. * Checks if `value` is a valid array-like index.
  19644. *
  19645. * @private
  19646. * @param {*} value The value to check.
  19647. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
  19648. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
  19649. */
  19650. function isIndex(value, length) {
  19651. length = length == null ? MAX_SAFE_INTEGER : length;
  19652. return !!length &&
  19653. (typeof value == 'number' || reIsUint.test(value)) &&
  19654. (value > -1 && value % 1 == 0 && value < length);
  19655. }
  19656. /**
  19657. * Checks if `value` is suitable for use as unique object key.
  19658. *
  19659. * @private
  19660. * @param {*} value The value to check.
  19661. * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
  19662. */
  19663. function isKeyable(value) {
  19664. var type = typeof value;
  19665. return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
  19666. ? (value !== '__proto__')
  19667. : (value === null);
  19668. }
  19669. /**
  19670. * Checks if `func` has its source masked.
  19671. *
  19672. * @private
  19673. * @param {Function} func The function to check.
  19674. * @returns {boolean} Returns `true` if `func` is masked, else `false`.
  19675. */
  19676. function isMasked(func) {
  19677. return !!maskSrcKey && (maskSrcKey in func);
  19678. }
  19679. /**
  19680. * Checks if `value` is likely a prototype object.
  19681. *
  19682. * @private
  19683. * @param {*} value The value to check.
  19684. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
  19685. */
  19686. function isPrototype(value) {
  19687. var Ctor = value && value.constructor,
  19688. proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
  19689. return value === proto;
  19690. }
  19691. /**
  19692. * Converts `value` to a string using `Object.prototype.toString`.
  19693. *
  19694. * @private
  19695. * @param {*} value The value to convert.
  19696. * @returns {string} Returns the converted string.
  19697. */
  19698. function objectToString(value) {
  19699. return nativeObjectToString.call(value);
  19700. }
  19701. /**
  19702. * Converts `func` to its source code.
  19703. *
  19704. * @private
  19705. * @param {Function} func The function to convert.
  19706. * @returns {string} Returns the source code.
  19707. */
  19708. function toSource(func) {
  19709. if (func != null) {
  19710. try {
  19711. return funcToString.call(func);
  19712. } catch (e) {}
  19713. try {
  19714. return (func + '');
  19715. } catch (e) {}
  19716. }
  19717. return '';
  19718. }
  19719. /**
  19720. * Performs a
  19721. * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
  19722. * comparison between two values to determine if they are equivalent.
  19723. *
  19724. * @static
  19725. * @memberOf _
  19726. * @since 4.0.0
  19727. * @category Lang
  19728. * @param {*} value The value to compare.
  19729. * @param {*} other The other value to compare.
  19730. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  19731. * @example
  19732. *
  19733. * var object = { 'a': 1 };
  19734. * var other = { 'a': 1 };
  19735. *
  19736. * _.eq(object, object);
  19737. * // => true
  19738. *
  19739. * _.eq(object, other);
  19740. * // => false
  19741. *
  19742. * _.eq('a', 'a');
  19743. * // => true
  19744. *
  19745. * _.eq('a', Object('a'));
  19746. * // => false
  19747. *
  19748. * _.eq(NaN, NaN);
  19749. * // => true
  19750. */
  19751. function eq(value, other) {
  19752. return value === other || (value !== value && other !== other);
  19753. }
  19754. /**
  19755. * Checks if `value` is likely an `arguments` object.
  19756. *
  19757. * @static
  19758. * @memberOf _
  19759. * @since 0.1.0
  19760. * @category Lang
  19761. * @param {*} value The value to check.
  19762. * @returns {boolean} Returns `true` if `value` is an `arguments` object,
  19763. * else `false`.
  19764. * @example
  19765. *
  19766. * _.isArguments(function() { return arguments; }());
  19767. * // => true
  19768. *
  19769. * _.isArguments([1, 2, 3]);
  19770. * // => false
  19771. */
  19772. var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
  19773. return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
  19774. !propertyIsEnumerable.call(value, 'callee');
  19775. };
  19776. /**
  19777. * Checks if `value` is classified as an `Array` object.
  19778. *
  19779. * @static
  19780. * @memberOf _
  19781. * @since 0.1.0
  19782. * @category Lang
  19783. * @param {*} value The value to check.
  19784. * @returns {boolean} Returns `true` if `value` is an array, else `false`.
  19785. * @example
  19786. *
  19787. * _.isArray([1, 2, 3]);
  19788. * // => true
  19789. *
  19790. * _.isArray(document.body.children);
  19791. * // => false
  19792. *
  19793. * _.isArray('abc');
  19794. * // => false
  19795. *
  19796. * _.isArray(_.noop);
  19797. * // => false
  19798. */
  19799. var isArray = Array.isArray;
  19800. /**
  19801. * Checks if `value` is array-like. A value is considered array-like if it's
  19802. * not a function and has a `value.length` that's an integer greater than or
  19803. * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
  19804. *
  19805. * @static
  19806. * @memberOf _
  19807. * @since 4.0.0
  19808. * @category Lang
  19809. * @param {*} value The value to check.
  19810. * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
  19811. * @example
  19812. *
  19813. * _.isArrayLike([1, 2, 3]);
  19814. * // => true
  19815. *
  19816. * _.isArrayLike(document.body.children);
  19817. * // => true
  19818. *
  19819. * _.isArrayLike('abc');
  19820. * // => true
  19821. *
  19822. * _.isArrayLike(_.noop);
  19823. * // => false
  19824. */
  19825. function isArrayLike(value) {
  19826. return value != null && isLength(value.length) && !isFunction(value);
  19827. }
  19828. /**
  19829. * Checks if `value` is a buffer.
  19830. *
  19831. * @static
  19832. * @memberOf _
  19833. * @since 4.3.0
  19834. * @category Lang
  19835. * @param {*} value The value to check.
  19836. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
  19837. * @example
  19838. *
  19839. * _.isBuffer(new Buffer(2));
  19840. * // => true
  19841. *
  19842. * _.isBuffer(new Uint8Array(2));
  19843. * // => false
  19844. */
  19845. var isBuffer = nativeIsBuffer || stubFalse;
  19846. /**
  19847. * Performs a deep comparison between two values to determine if they are
  19848. * equivalent.
  19849. *
  19850. * **Note:** This method supports comparing arrays, array buffers, booleans,
  19851. * date objects, error objects, maps, numbers, `Object` objects, regexes,
  19852. * sets, strings, symbols, and typed arrays. `Object` objects are compared
  19853. * by their own, not inherited, enumerable properties. Functions and DOM
  19854. * nodes are compared by strict equality, i.e. `===`.
  19855. *
  19856. * @static
  19857. * @memberOf _
  19858. * @since 0.1.0
  19859. * @category Lang
  19860. * @param {*} value The value to compare.
  19861. * @param {*} other The other value to compare.
  19862. * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
  19863. * @example
  19864. *
  19865. * var object = { 'a': 1 };
  19866. * var other = { 'a': 1 };
  19867. *
  19868. * _.isEqual(object, other);
  19869. * // => true
  19870. *
  19871. * object === other;
  19872. * // => false
  19873. */
  19874. function isEqual(value, other) {
  19875. return baseIsEqual(value, other);
  19876. }
  19877. /**
  19878. * Checks if `value` is classified as a `Function` object.
  19879. *
  19880. * @static
  19881. * @memberOf _
  19882. * @since 0.1.0
  19883. * @category Lang
  19884. * @param {*} value The value to check.
  19885. * @returns {boolean} Returns `true` if `value` is a function, else `false`.
  19886. * @example
  19887. *
  19888. * _.isFunction(_);
  19889. * // => true
  19890. *
  19891. * _.isFunction(/abc/);
  19892. * // => false
  19893. */
  19894. function isFunction(value) {
  19895. if (!isObject(value)) {
  19896. return false;
  19897. }
  19898. // The use of `Object#toString` avoids issues with the `typeof` operator
  19899. // in Safari 9 which returns 'object' for typed arrays and other constructors.
  19900. var tag = baseGetTag(value);
  19901. return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
  19902. }
  19903. /**
  19904. * Checks if `value` is a valid array-like length.
  19905. *
  19906. * **Note:** This method is loosely based on
  19907. * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
  19908. *
  19909. * @static
  19910. * @memberOf _
  19911. * @since 4.0.0
  19912. * @category Lang
  19913. * @param {*} value The value to check.
  19914. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
  19915. * @example
  19916. *
  19917. * _.isLength(3);
  19918. * // => true
  19919. *
  19920. * _.isLength(Number.MIN_VALUE);
  19921. * // => false
  19922. *
  19923. * _.isLength(Infinity);
  19924. * // => false
  19925. *
  19926. * _.isLength('3');
  19927. * // => false
  19928. */
  19929. function isLength(value) {
  19930. return typeof value == 'number' &&
  19931. value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
  19932. }
  19933. /**
  19934. * Checks if `value` is the
  19935. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  19936. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  19937. *
  19938. * @static
  19939. * @memberOf _
  19940. * @since 0.1.0
  19941. * @category Lang
  19942. * @param {*} value The value to check.
  19943. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  19944. * @example
  19945. *
  19946. * _.isObject({});
  19947. * // => true
  19948. *
  19949. * _.isObject([1, 2, 3]);
  19950. * // => true
  19951. *
  19952. * _.isObject(_.noop);
  19953. * // => true
  19954. *
  19955. * _.isObject(null);
  19956. * // => false
  19957. */
  19958. function isObject(value) {
  19959. var type = typeof value;
  19960. return value != null && (type == 'object' || type == 'function');
  19961. }
  19962. /**
  19963. * Checks if `value` is object-like. A value is object-like if it's not `null`
  19964. * and has a `typeof` result of "object".
  19965. *
  19966. * @static
  19967. * @memberOf _
  19968. * @since 4.0.0
  19969. * @category Lang
  19970. * @param {*} value The value to check.
  19971. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  19972. * @example
  19973. *
  19974. * _.isObjectLike({});
  19975. * // => true
  19976. *
  19977. * _.isObjectLike([1, 2, 3]);
  19978. * // => true
  19979. *
  19980. * _.isObjectLike(_.noop);
  19981. * // => false
  19982. *
  19983. * _.isObjectLike(null);
  19984. * // => false
  19985. */
  19986. function isObjectLike(value) {
  19987. return value != null && typeof value == 'object';
  19988. }
  19989. /**
  19990. * Checks if `value` is classified as a typed array.
  19991. *
  19992. * @static
  19993. * @memberOf _
  19994. * @since 3.0.0
  19995. * @category Lang
  19996. * @param {*} value The value to check.
  19997. * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
  19998. * @example
  19999. *
  20000. * _.isTypedArray(new Uint8Array);
  20001. * // => true
  20002. *
  20003. * _.isTypedArray([]);
  20004. * // => false
  20005. */
  20006. var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
  20007. /**
  20008. * Creates an array of the own enumerable property names of `object`.
  20009. *
  20010. * **Note:** Non-object values are coerced to objects. See the
  20011. * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
  20012. * for more details.
  20013. *
  20014. * @static
  20015. * @since 0.1.0
  20016. * @memberOf _
  20017. * @category Object
  20018. * @param {Object} object The object to query.
  20019. * @returns {Array} Returns the array of property names.
  20020. * @example
  20021. *
  20022. * function Foo() {
  20023. * this.a = 1;
  20024. * this.b = 2;
  20025. * }
  20026. *
  20027. * Foo.prototype.c = 3;
  20028. *
  20029. * _.keys(new Foo);
  20030. * // => ['a', 'b'] (iteration order is not guaranteed)
  20031. *
  20032. * _.keys('hi');
  20033. * // => ['0', '1']
  20034. */
  20035. function keys(object) {
  20036. return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
  20037. }
  20038. /**
  20039. * This method returns a new empty array.
  20040. *
  20041. * @static
  20042. * @memberOf _
  20043. * @since 4.13.0
  20044. * @category Util
  20045. * @returns {Array} Returns the new empty array.
  20046. * @example
  20047. *
  20048. * var arrays = _.times(2, _.stubArray);
  20049. *
  20050. * console.log(arrays);
  20051. * // => [[], []]
  20052. *
  20053. * console.log(arrays[0] === arrays[1]);
  20054. * // => false
  20055. */
  20056. function stubArray() {
  20057. return [];
  20058. }
  20059. /**
  20060. * This method returns `false`.
  20061. *
  20062. * @static
  20063. * @memberOf _
  20064. * @since 4.13.0
  20065. * @category Util
  20066. * @returns {boolean} Returns `false`.
  20067. * @example
  20068. *
  20069. * _.times(2, _.stubFalse);
  20070. * // => [false, false]
  20071. */
  20072. function stubFalse() {
  20073. return false;
  20074. }
  20075. module.exports = isEqual;
  20076. /***/ }),
  20077. /***/ 4461:
  20078. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  20079. /**
  20080. * lodash (Custom Build) <https://lodash.com/>
  20081. * Build: `lodash modularize exports="npm" -o ./`
  20082. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  20083. * Released under MIT license <https://lodash.com/license>
  20084. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  20085. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  20086. */
  20087. /** Used as references for various `Number` constants. */
  20088. var INFINITY = 1 / 0;
  20089. /** `Object#toString` result references. */
  20090. var symbolTag = '[object Symbol]';
  20091. /** Detect free variable `global` from Node.js. */
  20092. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  20093. /** Detect free variable `self`. */
  20094. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  20095. /** Used as a reference to the global object. */
  20096. var root = freeGlobal || freeSelf || Function('return this')();
  20097. /** Used for built-in method references. */
  20098. var objectProto = Object.prototype;
  20099. /** Used to generate unique IDs. */
  20100. var idCounter = 0;
  20101. /**
  20102. * Used to resolve the
  20103. * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
  20104. * of values.
  20105. */
  20106. var objectToString = objectProto.toString;
  20107. /** Built-in value references. */
  20108. var Symbol = root.Symbol;
  20109. /** Used to convert symbols to primitives and strings. */
  20110. var symbolProto = Symbol ? Symbol.prototype : undefined,
  20111. symbolToString = symbolProto ? symbolProto.toString : undefined;
  20112. /**
  20113. * The base implementation of `_.toString` which doesn't convert nullish
  20114. * values to empty strings.
  20115. *
  20116. * @private
  20117. * @param {*} value The value to process.
  20118. * @returns {string} Returns the string.
  20119. */
  20120. function baseToString(value) {
  20121. // Exit early for strings to avoid a performance hit in some environments.
  20122. if (typeof value == 'string') {
  20123. return value;
  20124. }
  20125. if (isSymbol(value)) {
  20126. return symbolToString ? symbolToString.call(value) : '';
  20127. }
  20128. var result = (value + '');
  20129. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  20130. }
  20131. /**
  20132. * Checks if `value` is object-like. A value is object-like if it's not `null`
  20133. * and has a `typeof` result of "object".
  20134. *
  20135. * @static
  20136. * @memberOf _
  20137. * @since 4.0.0
  20138. * @category Lang
  20139. * @param {*} value The value to check.
  20140. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  20141. * @example
  20142. *
  20143. * _.isObjectLike({});
  20144. * // => true
  20145. *
  20146. * _.isObjectLike([1, 2, 3]);
  20147. * // => true
  20148. *
  20149. * _.isObjectLike(_.noop);
  20150. * // => false
  20151. *
  20152. * _.isObjectLike(null);
  20153. * // => false
  20154. */
  20155. function isObjectLike(value) {
  20156. return !!value && typeof value == 'object';
  20157. }
  20158. /**
  20159. * Checks if `value` is classified as a `Symbol` primitive or object.
  20160. *
  20161. * @static
  20162. * @memberOf _
  20163. * @since 4.0.0
  20164. * @category Lang
  20165. * @param {*} value The value to check.
  20166. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  20167. * @example
  20168. *
  20169. * _.isSymbol(Symbol.iterator);
  20170. * // => true
  20171. *
  20172. * _.isSymbol('abc');
  20173. * // => false
  20174. */
  20175. function isSymbol(value) {
  20176. return typeof value == 'symbol' ||
  20177. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  20178. }
  20179. /**
  20180. * Converts `value` to a string. An empty string is returned for `null`
  20181. * and `undefined` values. The sign of `-0` is preserved.
  20182. *
  20183. * @static
  20184. * @memberOf _
  20185. * @since 4.0.0
  20186. * @category Lang
  20187. * @param {*} value The value to process.
  20188. * @returns {string} Returns the string.
  20189. * @example
  20190. *
  20191. * _.toString(null);
  20192. * // => ''
  20193. *
  20194. * _.toString(-0);
  20195. * // => '-0'
  20196. *
  20197. * _.toString([1, 2, 3]);
  20198. * // => '1,2,3'
  20199. */
  20200. function toString(value) {
  20201. return value == null ? '' : baseToString(value);
  20202. }
  20203. /**
  20204. * Generates a unique ID. If `prefix` is given, the ID is appended to it.
  20205. *
  20206. * @static
  20207. * @since 0.1.0
  20208. * @memberOf _
  20209. * @category Util
  20210. * @param {string} [prefix=''] The value to prefix the ID with.
  20211. * @returns {string} Returns the unique ID.
  20212. * @example
  20213. *
  20214. * _.uniqueId('contact_');
  20215. * // => 'contact_104'
  20216. *
  20217. * _.uniqueId();
  20218. * // => '105'
  20219. */
  20220. function uniqueId(prefix) {
  20221. var id = ++idCounter;
  20222. return toString(prefix) + id;
  20223. }
  20224. module.exports = uniqueId;
  20225. /***/ }),
  20226. /***/ 39:
  20227. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  20228. /**
  20229. * lodash (Custom Build) <https://lodash.com/>
  20230. * Build: `lodash modularize exports="npm" -o ./`
  20231. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  20232. * Released under MIT license <https://lodash.com/license>
  20233. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  20234. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  20235. */
  20236. /** Used as references for various `Number` constants. */
  20237. var INFINITY = 1 / 0;
  20238. /** `Object#toString` result references. */
  20239. var symbolTag = '[object Symbol]';
  20240. /** Used to compose unicode character classes. */
  20241. var rsAstralRange = '\\ud800-\\udfff',
  20242. rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
  20243. rsComboSymbolsRange = '\\u20d0-\\u20f0',
  20244. rsVarRange = '\\ufe0e\\ufe0f';
  20245. /** Used to compose unicode capture groups. */
  20246. var rsAstral = '[' + rsAstralRange + ']',
  20247. rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
  20248. rsFitz = '\\ud83c[\\udffb-\\udfff]',
  20249. rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
  20250. rsNonAstral = '[^' + rsAstralRange + ']',
  20251. rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
  20252. rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
  20253. rsZWJ = '\\u200d';
  20254. /** Used to compose unicode regexes. */
  20255. var reOptMod = rsModifier + '?',
  20256. rsOptVar = '[' + rsVarRange + ']?',
  20257. rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
  20258. rsSeq = rsOptVar + reOptMod + rsOptJoin,
  20259. rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
  20260. /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
  20261. var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
  20262. /** 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/). */
  20263. var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
  20264. /** Detect free variable `global` from Node.js. */
  20265. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  20266. /** Detect free variable `self`. */
  20267. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  20268. /** Used as a reference to the global object. */
  20269. var root = freeGlobal || freeSelf || Function('return this')();
  20270. /**
  20271. * Converts an ASCII `string` to an array.
  20272. *
  20273. * @private
  20274. * @param {string} string The string to convert.
  20275. * @returns {Array} Returns the converted array.
  20276. */
  20277. function asciiToArray(string) {
  20278. return string.split('');
  20279. }
  20280. /**
  20281. * Checks if `string` contains Unicode symbols.
  20282. *
  20283. * @private
  20284. * @param {string} string The string to inspect.
  20285. * @returns {boolean} Returns `true` if a symbol is found, else `false`.
  20286. */
  20287. function hasUnicode(string) {
  20288. return reHasUnicode.test(string);
  20289. }
  20290. /**
  20291. * Converts `string` to an array.
  20292. *
  20293. * @private
  20294. * @param {string} string The string to convert.
  20295. * @returns {Array} Returns the converted array.
  20296. */
  20297. function stringToArray(string) {
  20298. return hasUnicode(string)
  20299. ? unicodeToArray(string)
  20300. : asciiToArray(string);
  20301. }
  20302. /**
  20303. * Converts a Unicode `string` to an array.
  20304. *
  20305. * @private
  20306. * @param {string} string The string to convert.
  20307. * @returns {Array} Returns the converted array.
  20308. */
  20309. function unicodeToArray(string) {
  20310. return string.match(reUnicode) || [];
  20311. }
  20312. /** Used for built-in method references. */
  20313. var objectProto = Object.prototype;
  20314. /**
  20315. * Used to resolve the
  20316. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  20317. * of values.
  20318. */
  20319. var objectToString = objectProto.toString;
  20320. /** Built-in value references. */
  20321. var Symbol = root.Symbol;
  20322. /** Used to convert symbols to primitives and strings. */
  20323. var symbolProto = Symbol ? Symbol.prototype : undefined,
  20324. symbolToString = symbolProto ? symbolProto.toString : undefined;
  20325. /**
  20326. * The base implementation of `_.slice` without an iteratee call guard.
  20327. *
  20328. * @private
  20329. * @param {Array} array The array to slice.
  20330. * @param {number} [start=0] The start position.
  20331. * @param {number} [end=array.length] The end position.
  20332. * @returns {Array} Returns the slice of `array`.
  20333. */
  20334. function baseSlice(array, start, end) {
  20335. var index = -1,
  20336. length = array.length;
  20337. if (start < 0) {
  20338. start = -start > length ? 0 : (length + start);
  20339. }
  20340. end = end > length ? length : end;
  20341. if (end < 0) {
  20342. end += length;
  20343. }
  20344. length = start > end ? 0 : ((end - start) >>> 0);
  20345. start >>>= 0;
  20346. var result = Array(length);
  20347. while (++index < length) {
  20348. result[index] = array[index + start];
  20349. }
  20350. return result;
  20351. }
  20352. /**
  20353. * The base implementation of `_.toString` which doesn't convert nullish
  20354. * values to empty strings.
  20355. *
  20356. * @private
  20357. * @param {*} value The value to process.
  20358. * @returns {string} Returns the string.
  20359. */
  20360. function baseToString(value) {
  20361. // Exit early for strings to avoid a performance hit in some environments.
  20362. if (typeof value == 'string') {
  20363. return value;
  20364. }
  20365. if (isSymbol(value)) {
  20366. return symbolToString ? symbolToString.call(value) : '';
  20367. }
  20368. var result = (value + '');
  20369. return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
  20370. }
  20371. /**
  20372. * Casts `array` to a slice if it's needed.
  20373. *
  20374. * @private
  20375. * @param {Array} array The array to inspect.
  20376. * @param {number} start The start position.
  20377. * @param {number} [end=array.length] The end position.
  20378. * @returns {Array} Returns the cast slice.
  20379. */
  20380. function castSlice(array, start, end) {
  20381. var length = array.length;
  20382. end = end === undefined ? length : end;
  20383. return (!start && end >= length) ? array : baseSlice(array, start, end);
  20384. }
  20385. /**
  20386. * Creates a function like `_.lowerFirst`.
  20387. *
  20388. * @private
  20389. * @param {string} methodName The name of the `String` case method to use.
  20390. * @returns {Function} Returns the new case function.
  20391. */
  20392. function createCaseFirst(methodName) {
  20393. return function(string) {
  20394. string = toString(string);
  20395. var strSymbols = hasUnicode(string)
  20396. ? stringToArray(string)
  20397. : undefined;
  20398. var chr = strSymbols
  20399. ? strSymbols[0]
  20400. : string.charAt(0);
  20401. var trailing = strSymbols
  20402. ? castSlice(strSymbols, 1).join('')
  20403. : string.slice(1);
  20404. return chr[methodName]() + trailing;
  20405. };
  20406. }
  20407. /**
  20408. * Checks if `value` is object-like. A value is object-like if it's not `null`
  20409. * and has a `typeof` result of "object".
  20410. *
  20411. * @static
  20412. * @memberOf _
  20413. * @since 4.0.0
  20414. * @category Lang
  20415. * @param {*} value The value to check.
  20416. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  20417. * @example
  20418. *
  20419. * _.isObjectLike({});
  20420. * // => true
  20421. *
  20422. * _.isObjectLike([1, 2, 3]);
  20423. * // => true
  20424. *
  20425. * _.isObjectLike(_.noop);
  20426. * // => false
  20427. *
  20428. * _.isObjectLike(null);
  20429. * // => false
  20430. */
  20431. function isObjectLike(value) {
  20432. return !!value && typeof value == 'object';
  20433. }
  20434. /**
  20435. * Checks if `value` is classified as a `Symbol` primitive or object.
  20436. *
  20437. * @static
  20438. * @memberOf _
  20439. * @since 4.0.0
  20440. * @category Lang
  20441. * @param {*} value The value to check.
  20442. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  20443. * @example
  20444. *
  20445. * _.isSymbol(Symbol.iterator);
  20446. * // => true
  20447. *
  20448. * _.isSymbol('abc');
  20449. * // => false
  20450. */
  20451. function isSymbol(value) {
  20452. return typeof value == 'symbol' ||
  20453. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  20454. }
  20455. /**
  20456. * Converts `value` to a string. An empty string is returned for `null`
  20457. * and `undefined` values. The sign of `-0` is preserved.
  20458. *
  20459. * @static
  20460. * @memberOf _
  20461. * @since 4.0.0
  20462. * @category Lang
  20463. * @param {*} value The value to process.
  20464. * @returns {string} Returns the string.
  20465. * @example
  20466. *
  20467. * _.toString(null);
  20468. * // => ''
  20469. *
  20470. * _.toString(-0);
  20471. * // => '-0'
  20472. *
  20473. * _.toString([1, 2, 3]);
  20474. * // => '1,2,3'
  20475. */
  20476. function toString(value) {
  20477. return value == null ? '' : baseToString(value);
  20478. }
  20479. /**
  20480. * Converts the first character of `string` to upper case.
  20481. *
  20482. * @static
  20483. * @memberOf _
  20484. * @since 4.0.0
  20485. * @category String
  20486. * @param {string} [string=''] The string to convert.
  20487. * @returns {string} Returns the converted string.
  20488. * @example
  20489. *
  20490. * _.upperFirst('fred');
  20491. * // => 'Fred'
  20492. *
  20493. * _.upperFirst('FRED');
  20494. * // => 'FRED'
  20495. */
  20496. var upperFirst = createCaseFirst('toUpperCase');
  20497. module.exports = upperFirst;
  20498. /***/ }),
  20499. /***/ 9626:
  20500. /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
  20501. "use strict";
  20502. __webpack_require__.r(__webpack_exports__);
  20503. // extracted by mini-css-extract-plugin
  20504. /* harmony default export */ __webpack_exports__["default"] = ({});
  20505. /***/ }),
  20506. /***/ 2547:
  20507. /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
  20508. "use strict";
  20509. __webpack_require__.r(__webpack_exports__);
  20510. // extracted by mini-css-extract-plugin
  20511. /* harmony default export */ __webpack_exports__["default"] = ({});
  20512. /***/ }),
  20513. /***/ 5251:
  20514. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  20515. "use strict";
  20516. /** @license React v16.14.0
  20517. * react-jsx-runtime.production.min.js
  20518. *
  20519. * Copyright (c) Facebook, Inc. and its affiliates.
  20520. *
  20521. * This source code is licensed under the MIT license found in the
  20522. * LICENSE file in the root directory of this source tree.
  20523. */
  20524. var f=__webpack_require__(3899),g=60103;exports.Fragment=60107;if("function"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h("react.element");exports.Fragment=h("react.fragment")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};
  20525. function q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=""+k);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;
  20526. /***/ }),
  20527. /***/ 5893:
  20528. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  20529. "use strict";
  20530. if (true) {
  20531. module.exports = __webpack_require__(5251);
  20532. } else {}
  20533. /***/ }),
  20534. /***/ 8808:
  20535. /***/ (function(__unused_webpack_module, exports) {
  20536. "use strict";
  20537. exports.__esModule = true;
  20538. exports["default"] = void 0;
  20539. var compose = function compose() {
  20540. for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {
  20541. funcs[_key] = arguments[_key];
  20542. }
  20543. return funcs.reduce(function (a, b) {
  20544. return function () {
  20545. return a(b.apply(void 0, arguments));
  20546. };
  20547. }, function (arg) {
  20548. return arg;
  20549. });
  20550. };
  20551. var _default = compose;
  20552. exports["default"] = _default;
  20553. /***/ }),
  20554. /***/ 1566:
  20555. /***/ (function(__unused_webpack_module, exports) {
  20556. "use strict";
  20557. exports.__esModule = true;
  20558. exports["default"] = void 0;
  20559. var getDisplayName = function getDisplayName(Component) {
  20560. if (typeof Component === 'string') {
  20561. return Component;
  20562. }
  20563. if (!Component) {
  20564. return undefined;
  20565. }
  20566. return Component.displayName || Component.name || 'Component';
  20567. };
  20568. var _default = getDisplayName;
  20569. exports["default"] = _default;
  20570. /***/ }),
  20571. /***/ 6626:
  20572. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  20573. "use strict";
  20574. var _interopRequireDefault = __webpack_require__(4836);
  20575. exports.__esModule = true;
  20576. exports["default"] = void 0;
  20577. var _getDisplayName = _interopRequireDefault(__webpack_require__(1566));
  20578. var wrapDisplayName = function wrapDisplayName(BaseComponent, hocName) {
  20579. return hocName + "(" + (0, _getDisplayName.default)(BaseComponent) + ")";
  20580. };
  20581. var _default = wrapDisplayName;
  20582. exports["default"] = _default;
  20583. /***/ }),
  20584. /***/ 6099:
  20585. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  20586. ;(function (sax) { // wrapper for non-node envs
  20587. sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
  20588. sax.SAXParser = SAXParser
  20589. sax.SAXStream = SAXStream
  20590. sax.createStream = createStream
  20591. // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
  20592. // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
  20593. // since that's the earliest that a buffer overrun could occur. This way, checks are
  20594. // as rare as required, but as often as necessary to ensure never crossing this bound.
  20595. // Furthermore, buffers are only tested at most once per write(), so passing a very
  20596. // large string into write() might have undesirable effects, but this is manageable by
  20597. // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
  20598. // edge case, result in creating at most one complete copy of the string passed in.
  20599. // Set to Infinity to have unlimited buffers.
  20600. sax.MAX_BUFFER_LENGTH = 64 * 1024
  20601. var buffers = [
  20602. 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
  20603. 'procInstName', 'procInstBody', 'entity', 'attribName',
  20604. 'attribValue', 'cdata', 'script'
  20605. ]
  20606. sax.EVENTS = [
  20607. 'text',
  20608. 'processinginstruction',
  20609. 'sgmldeclaration',
  20610. 'doctype',
  20611. 'comment',
  20612. 'opentagstart',
  20613. 'attribute',
  20614. 'opentag',
  20615. 'closetag',
  20616. 'opencdata',
  20617. 'cdata',
  20618. 'closecdata',
  20619. 'error',
  20620. 'end',
  20621. 'ready',
  20622. 'script',
  20623. 'opennamespace',
  20624. 'closenamespace'
  20625. ]
  20626. function SAXParser (strict, opt) {
  20627. if (!(this instanceof SAXParser)) {
  20628. return new SAXParser(strict, opt)
  20629. }
  20630. var parser = this
  20631. clearBuffers(parser)
  20632. parser.q = parser.c = ''
  20633. parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
  20634. parser.opt = opt || {}
  20635. parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
  20636. parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
  20637. parser.tags = []
  20638. parser.closed = parser.closedRoot = parser.sawRoot = false
  20639. parser.tag = parser.error = null
  20640. parser.strict = !!strict
  20641. parser.noscript = !!(strict || parser.opt.noscript)
  20642. parser.state = S.BEGIN
  20643. parser.strictEntities = parser.opt.strictEntities
  20644. parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
  20645. parser.attribList = []
  20646. // namespaces form a prototype chain.
  20647. // it always points at the current tag,
  20648. // which protos to its parent tag.
  20649. if (parser.opt.xmlns) {
  20650. parser.ns = Object.create(rootNS)
  20651. }
  20652. // mostly just for error reporting
  20653. parser.trackPosition = parser.opt.position !== false
  20654. if (parser.trackPosition) {
  20655. parser.position = parser.line = parser.column = 0
  20656. }
  20657. emit(parser, 'onready')
  20658. }
  20659. if (!Object.create) {
  20660. Object.create = function (o) {
  20661. function F () {}
  20662. F.prototype = o
  20663. var newf = new F()
  20664. return newf
  20665. }
  20666. }
  20667. if (!Object.keys) {
  20668. Object.keys = function (o) {
  20669. var a = []
  20670. for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
  20671. return a
  20672. }
  20673. }
  20674. function checkBufferLength (parser) {
  20675. var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
  20676. var maxActual = 0
  20677. for (var i = 0, l = buffers.length; i < l; i++) {
  20678. var len = parser[buffers[i]].length
  20679. if (len > maxAllowed) {
  20680. // Text/cdata nodes can get big, and since they're buffered,
  20681. // we can get here under normal conditions.
  20682. // Avoid issues by emitting the text node now,
  20683. // so at least it won't get any bigger.
  20684. switch (buffers[i]) {
  20685. case 'textNode':
  20686. closeText(parser)
  20687. break
  20688. case 'cdata':
  20689. emitNode(parser, 'oncdata', parser.cdata)
  20690. parser.cdata = ''
  20691. break
  20692. case 'script':
  20693. emitNode(parser, 'onscript', parser.script)
  20694. parser.script = ''
  20695. break
  20696. default:
  20697. error(parser, 'Max buffer length exceeded: ' + buffers[i])
  20698. }
  20699. }
  20700. maxActual = Math.max(maxActual, len)
  20701. }
  20702. // schedule the next check for the earliest possible buffer overrun.
  20703. var m = sax.MAX_BUFFER_LENGTH - maxActual
  20704. parser.bufferCheckPosition = m + parser.position
  20705. }
  20706. function clearBuffers (parser) {
  20707. for (var i = 0, l = buffers.length; i < l; i++) {
  20708. parser[buffers[i]] = ''
  20709. }
  20710. }
  20711. function flushBuffers (parser) {
  20712. closeText(parser)
  20713. if (parser.cdata !== '') {
  20714. emitNode(parser, 'oncdata', parser.cdata)
  20715. parser.cdata = ''
  20716. }
  20717. if (parser.script !== '') {
  20718. emitNode(parser, 'onscript', parser.script)
  20719. parser.script = ''
  20720. }
  20721. }
  20722. SAXParser.prototype = {
  20723. end: function () { end(this) },
  20724. write: write,
  20725. resume: function () { this.error = null; return this },
  20726. close: function () { return this.write(null) },
  20727. flush: function () { flushBuffers(this) }
  20728. }
  20729. var Stream
  20730. try {
  20731. Stream = (__webpack_require__(2830).Stream)
  20732. } catch (ex) {
  20733. Stream = function () {}
  20734. }
  20735. var streamWraps = sax.EVENTS.filter(function (ev) {
  20736. return ev !== 'error' && ev !== 'end'
  20737. })
  20738. function createStream (strict, opt) {
  20739. return new SAXStream(strict, opt)
  20740. }
  20741. function SAXStream (strict, opt) {
  20742. if (!(this instanceof SAXStream)) {
  20743. return new SAXStream(strict, opt)
  20744. }
  20745. Stream.apply(this)
  20746. this._parser = new SAXParser(strict, opt)
  20747. this.writable = true
  20748. this.readable = true
  20749. var me = this
  20750. this._parser.onend = function () {
  20751. me.emit('end')
  20752. }
  20753. this._parser.onerror = function (er) {
  20754. me.emit('error', er)
  20755. // if didn't throw, then means error was handled.
  20756. // go ahead and clear error, so we can write again.
  20757. me._parser.error = null
  20758. }
  20759. this._decoder = null
  20760. streamWraps.forEach(function (ev) {
  20761. Object.defineProperty(me, 'on' + ev, {
  20762. get: function () {
  20763. return me._parser['on' + ev]
  20764. },
  20765. set: function (h) {
  20766. if (!h) {
  20767. me.removeAllListeners(ev)
  20768. me._parser['on' + ev] = h
  20769. return h
  20770. }
  20771. me.on(ev, h)
  20772. },
  20773. enumerable: true,
  20774. configurable: false
  20775. })
  20776. })
  20777. }
  20778. SAXStream.prototype = Object.create(Stream.prototype, {
  20779. constructor: {
  20780. value: SAXStream
  20781. }
  20782. })
  20783. SAXStream.prototype.write = function (data) {
  20784. if (typeof Buffer === 'function' &&
  20785. typeof Buffer.isBuffer === 'function' &&
  20786. Buffer.isBuffer(data)) {
  20787. if (!this._decoder) {
  20788. var SD = (__webpack_require__(2553)/* .StringDecoder */ .s)
  20789. this._decoder = new SD('utf8')
  20790. }
  20791. data = this._decoder.write(data)
  20792. }
  20793. this._parser.write(data.toString())
  20794. this.emit('data', data)
  20795. return true
  20796. }
  20797. SAXStream.prototype.end = function (chunk) {
  20798. if (chunk && chunk.length) {
  20799. this.write(chunk)
  20800. }
  20801. this._parser.end()
  20802. return true
  20803. }
  20804. SAXStream.prototype.on = function (ev, handler) {
  20805. var me = this
  20806. if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
  20807. me._parser['on' + ev] = function () {
  20808. var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
  20809. args.splice(0, 0, ev)
  20810. me.emit.apply(me, args)
  20811. }
  20812. }
  20813. return Stream.prototype.on.call(me, ev, handler)
  20814. }
  20815. // this really needs to be replaced with character classes.
  20816. // XML allows all manner of ridiculous numbers and digits.
  20817. var CDATA = '[CDATA['
  20818. var DOCTYPE = 'DOCTYPE'
  20819. var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
  20820. var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
  20821. var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
  20822. // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
  20823. // This implementation works on strings, a single character at a time
  20824. // as such, it cannot ever support astral-plane characters (10000-EFFFF)
  20825. // without a significant breaking change to either this parser, or the
  20826. // JavaScript language. Implementation of an emoji-capable xml parser
  20827. // is left as an exercise for the reader.
  20828. var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  20829. var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
  20830. var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
  20831. var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/
  20832. function isWhitespace (c) {
  20833. return c === ' ' || c === '\n' || c === '\r' || c === '\t'
  20834. }
  20835. function isQuote (c) {
  20836. return c === '"' || c === '\''
  20837. }
  20838. function isAttribEnd (c) {
  20839. return c === '>' || isWhitespace(c)
  20840. }
  20841. function isMatch (regex, c) {
  20842. return regex.test(c)
  20843. }
  20844. function notMatch (regex, c) {
  20845. return !isMatch(regex, c)
  20846. }
  20847. var S = 0
  20848. sax.STATE = {
  20849. BEGIN: S++, // leading byte order mark or whitespace
  20850. BEGIN_WHITESPACE: S++, // leading whitespace
  20851. TEXT: S++, // general stuff
  20852. TEXT_ENTITY: S++, // &amp and such.
  20853. OPEN_WAKA: S++, // <
  20854. SGML_DECL: S++, // <!BLARG
  20855. SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
  20856. DOCTYPE: S++, // <!DOCTYPE
  20857. DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
  20858. DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
  20859. DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
  20860. COMMENT_STARTING: S++, // <!-
  20861. COMMENT: S++, // <!--
  20862. COMMENT_ENDING: S++, // <!-- blah -
  20863. COMMENT_ENDED: S++, // <!-- blah --
  20864. CDATA: S++, // <![CDATA[ something
  20865. CDATA_ENDING: S++, // ]
  20866. CDATA_ENDING_2: S++, // ]]
  20867. PROC_INST: S++, // <?hi
  20868. PROC_INST_BODY: S++, // <?hi there
  20869. PROC_INST_ENDING: S++, // <?hi "there" ?
  20870. OPEN_TAG: S++, // <strong
  20871. OPEN_TAG_SLASH: S++, // <strong /
  20872. ATTRIB: S++, // <a
  20873. ATTRIB_NAME: S++, // <a foo
  20874. ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
  20875. ATTRIB_VALUE: S++, // <a foo=
  20876. ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
  20877. ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
  20878. ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
  20879. ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
  20880. ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
  20881. CLOSE_TAG: S++, // </a
  20882. CLOSE_TAG_SAW_WHITE: S++, // </a >
  20883. SCRIPT: S++, // <script> ...
  20884. SCRIPT_ENDING: S++ // <script> ... <
  20885. }
  20886. sax.XML_ENTITIES = {
  20887. 'amp': '&',
  20888. 'gt': '>',
  20889. 'lt': '<',
  20890. 'quot': '"',
  20891. 'apos': "'"
  20892. }
  20893. sax.ENTITIES = {
  20894. 'amp': '&',
  20895. 'gt': '>',
  20896. 'lt': '<',
  20897. 'quot': '"',
  20898. 'apos': "'",
  20899. 'AElig': 198,
  20900. 'Aacute': 193,
  20901. 'Acirc': 194,
  20902. 'Agrave': 192,
  20903. 'Aring': 197,
  20904. 'Atilde': 195,
  20905. 'Auml': 196,
  20906. 'Ccedil': 199,
  20907. 'ETH': 208,
  20908. 'Eacute': 201,
  20909. 'Ecirc': 202,
  20910. 'Egrave': 200,
  20911. 'Euml': 203,
  20912. 'Iacute': 205,
  20913. 'Icirc': 206,
  20914. 'Igrave': 204,
  20915. 'Iuml': 207,
  20916. 'Ntilde': 209,
  20917. 'Oacute': 211,
  20918. 'Ocirc': 212,
  20919. 'Ograve': 210,
  20920. 'Oslash': 216,
  20921. 'Otilde': 213,
  20922. 'Ouml': 214,
  20923. 'THORN': 222,
  20924. 'Uacute': 218,
  20925. 'Ucirc': 219,
  20926. 'Ugrave': 217,
  20927. 'Uuml': 220,
  20928. 'Yacute': 221,
  20929. 'aacute': 225,
  20930. 'acirc': 226,
  20931. 'aelig': 230,
  20932. 'agrave': 224,
  20933. 'aring': 229,
  20934. 'atilde': 227,
  20935. 'auml': 228,
  20936. 'ccedil': 231,
  20937. 'eacute': 233,
  20938. 'ecirc': 234,
  20939. 'egrave': 232,
  20940. 'eth': 240,
  20941. 'euml': 235,
  20942. 'iacute': 237,
  20943. 'icirc': 238,
  20944. 'igrave': 236,
  20945. 'iuml': 239,
  20946. 'ntilde': 241,
  20947. 'oacute': 243,
  20948. 'ocirc': 244,
  20949. 'ograve': 242,
  20950. 'oslash': 248,
  20951. 'otilde': 245,
  20952. 'ouml': 246,
  20953. 'szlig': 223,
  20954. 'thorn': 254,
  20955. 'uacute': 250,
  20956. 'ucirc': 251,
  20957. 'ugrave': 249,
  20958. 'uuml': 252,
  20959. 'yacute': 253,
  20960. 'yuml': 255,
  20961. 'copy': 169,
  20962. 'reg': 174,
  20963. 'nbsp': 160,
  20964. 'iexcl': 161,
  20965. 'cent': 162,
  20966. 'pound': 163,
  20967. 'curren': 164,
  20968. 'yen': 165,
  20969. 'brvbar': 166,
  20970. 'sect': 167,
  20971. 'uml': 168,
  20972. 'ordf': 170,
  20973. 'laquo': 171,
  20974. 'not': 172,
  20975. 'shy': 173,
  20976. 'macr': 175,
  20977. 'deg': 176,
  20978. 'plusmn': 177,
  20979. 'sup1': 185,
  20980. 'sup2': 178,
  20981. 'sup3': 179,
  20982. 'acute': 180,
  20983. 'micro': 181,
  20984. 'para': 182,
  20985. 'middot': 183,
  20986. 'cedil': 184,
  20987. 'ordm': 186,
  20988. 'raquo': 187,
  20989. 'frac14': 188,
  20990. 'frac12': 189,
  20991. 'frac34': 190,
  20992. 'iquest': 191,
  20993. 'times': 215,
  20994. 'divide': 247,
  20995. 'OElig': 338,
  20996. 'oelig': 339,
  20997. 'Scaron': 352,
  20998. 'scaron': 353,
  20999. 'Yuml': 376,
  21000. 'fnof': 402,
  21001. 'circ': 710,
  21002. 'tilde': 732,
  21003. 'Alpha': 913,
  21004. 'Beta': 914,
  21005. 'Gamma': 915,
  21006. 'Delta': 916,
  21007. 'Epsilon': 917,
  21008. 'Zeta': 918,
  21009. 'Eta': 919,
  21010. 'Theta': 920,
  21011. 'Iota': 921,
  21012. 'Kappa': 922,
  21013. 'Lambda': 923,
  21014. 'Mu': 924,
  21015. 'Nu': 925,
  21016. 'Xi': 926,
  21017. 'Omicron': 927,
  21018. 'Pi': 928,
  21019. 'Rho': 929,
  21020. 'Sigma': 931,
  21021. 'Tau': 932,
  21022. 'Upsilon': 933,
  21023. 'Phi': 934,
  21024. 'Chi': 935,
  21025. 'Psi': 936,
  21026. 'Omega': 937,
  21027. 'alpha': 945,
  21028. 'beta': 946,
  21029. 'gamma': 947,
  21030. 'delta': 948,
  21031. 'epsilon': 949,
  21032. 'zeta': 950,
  21033. 'eta': 951,
  21034. 'theta': 952,
  21035. 'iota': 953,
  21036. 'kappa': 954,
  21037. 'lambda': 955,
  21038. 'mu': 956,
  21039. 'nu': 957,
  21040. 'xi': 958,
  21041. 'omicron': 959,
  21042. 'pi': 960,
  21043. 'rho': 961,
  21044. 'sigmaf': 962,
  21045. 'sigma': 963,
  21046. 'tau': 964,
  21047. 'upsilon': 965,
  21048. 'phi': 966,
  21049. 'chi': 967,
  21050. 'psi': 968,
  21051. 'omega': 969,
  21052. 'thetasym': 977,
  21053. 'upsih': 978,
  21054. 'piv': 982,
  21055. 'ensp': 8194,
  21056. 'emsp': 8195,
  21057. 'thinsp': 8201,
  21058. 'zwnj': 8204,
  21059. 'zwj': 8205,
  21060. 'lrm': 8206,
  21061. 'rlm': 8207,
  21062. 'ndash': 8211,
  21063. 'mdash': 8212,
  21064. 'lsquo': 8216,
  21065. 'rsquo': 8217,
  21066. 'sbquo': 8218,
  21067. 'ldquo': 8220,
  21068. 'rdquo': 8221,
  21069. 'bdquo': 8222,
  21070. 'dagger': 8224,
  21071. 'Dagger': 8225,
  21072. 'bull': 8226,
  21073. 'hellip': 8230,
  21074. 'permil': 8240,
  21075. 'prime': 8242,
  21076. 'Prime': 8243,
  21077. 'lsaquo': 8249,
  21078. 'rsaquo': 8250,
  21079. 'oline': 8254,
  21080. 'frasl': 8260,
  21081. 'euro': 8364,
  21082. 'image': 8465,
  21083. 'weierp': 8472,
  21084. 'real': 8476,
  21085. 'trade': 8482,
  21086. 'alefsym': 8501,
  21087. 'larr': 8592,
  21088. 'uarr': 8593,
  21089. 'rarr': 8594,
  21090. 'darr': 8595,
  21091. 'harr': 8596,
  21092. 'crarr': 8629,
  21093. 'lArr': 8656,
  21094. 'uArr': 8657,
  21095. 'rArr': 8658,
  21096. 'dArr': 8659,
  21097. 'hArr': 8660,
  21098. 'forall': 8704,
  21099. 'part': 8706,
  21100. 'exist': 8707,
  21101. 'empty': 8709,
  21102. 'nabla': 8711,
  21103. 'isin': 8712,
  21104. 'notin': 8713,
  21105. 'ni': 8715,
  21106. 'prod': 8719,
  21107. 'sum': 8721,
  21108. 'minus': 8722,
  21109. 'lowast': 8727,
  21110. 'radic': 8730,
  21111. 'prop': 8733,
  21112. 'infin': 8734,
  21113. 'ang': 8736,
  21114. 'and': 8743,
  21115. 'or': 8744,
  21116. 'cap': 8745,
  21117. 'cup': 8746,
  21118. 'int': 8747,
  21119. 'there4': 8756,
  21120. 'sim': 8764,
  21121. 'cong': 8773,
  21122. 'asymp': 8776,
  21123. 'ne': 8800,
  21124. 'equiv': 8801,
  21125. 'le': 8804,
  21126. 'ge': 8805,
  21127. 'sub': 8834,
  21128. 'sup': 8835,
  21129. 'nsub': 8836,
  21130. 'sube': 8838,
  21131. 'supe': 8839,
  21132. 'oplus': 8853,
  21133. 'otimes': 8855,
  21134. 'perp': 8869,
  21135. 'sdot': 8901,
  21136. 'lceil': 8968,
  21137. 'rceil': 8969,
  21138. 'lfloor': 8970,
  21139. 'rfloor': 8971,
  21140. 'lang': 9001,
  21141. 'rang': 9002,
  21142. 'loz': 9674,
  21143. 'spades': 9824,
  21144. 'clubs': 9827,
  21145. 'hearts': 9829,
  21146. 'diams': 9830
  21147. }
  21148. Object.keys(sax.ENTITIES).forEach(function (key) {
  21149. var e = sax.ENTITIES[key]
  21150. var s = typeof e === 'number' ? String.fromCharCode(e) : e
  21151. sax.ENTITIES[key] = s
  21152. })
  21153. for (var s in sax.STATE) {
  21154. sax.STATE[sax.STATE[s]] = s
  21155. }
  21156. // shorthand
  21157. S = sax.STATE
  21158. function emit (parser, event, data) {
  21159. parser[event] && parser[event](data)
  21160. }
  21161. function emitNode (parser, nodeType, data) {
  21162. if (parser.textNode) closeText(parser)
  21163. emit(parser, nodeType, data)
  21164. }
  21165. function closeText (parser) {
  21166. parser.textNode = textopts(parser.opt, parser.textNode)
  21167. if (parser.textNode) emit(parser, 'ontext', parser.textNode)
  21168. parser.textNode = ''
  21169. }
  21170. function textopts (opt, text) {
  21171. if (opt.trim) text = text.trim()
  21172. if (opt.normalize) text = text.replace(/\s+/g, ' ')
  21173. return text
  21174. }
  21175. function error (parser, er) {
  21176. closeText(parser)
  21177. if (parser.trackPosition) {
  21178. er += '\nLine: ' + parser.line +
  21179. '\nColumn: ' + parser.column +
  21180. '\nChar: ' + parser.c
  21181. }
  21182. er = new Error(er)
  21183. parser.error = er
  21184. emit(parser, 'onerror', er)
  21185. return parser
  21186. }
  21187. function end (parser) {
  21188. if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
  21189. if ((parser.state !== S.BEGIN) &&
  21190. (parser.state !== S.BEGIN_WHITESPACE) &&
  21191. (parser.state !== S.TEXT)) {
  21192. error(parser, 'Unexpected end')
  21193. }
  21194. closeText(parser)
  21195. parser.c = ''
  21196. parser.closed = true
  21197. emit(parser, 'onend')
  21198. SAXParser.call(parser, parser.strict, parser.opt)
  21199. return parser
  21200. }
  21201. function strictFail (parser, message) {
  21202. if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
  21203. throw new Error('bad call to strictFail')
  21204. }
  21205. if (parser.strict) {
  21206. error(parser, message)
  21207. }
  21208. }
  21209. function newTag (parser) {
  21210. if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
  21211. var parent = parser.tags[parser.tags.length - 1] || parser
  21212. var tag = parser.tag = { name: parser.tagName, attributes: {} }
  21213. // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
  21214. if (parser.opt.xmlns) {
  21215. tag.ns = parent.ns
  21216. }
  21217. parser.attribList.length = 0
  21218. emitNode(parser, 'onopentagstart', tag)
  21219. }
  21220. function qname (name, attribute) {
  21221. var i = name.indexOf(':')
  21222. var qualName = i < 0 ? [ '', name ] : name.split(':')
  21223. var prefix = qualName[0]
  21224. var local = qualName[1]
  21225. // <x "xmlns"="http://foo">
  21226. if (attribute && name === 'xmlns') {
  21227. prefix = 'xmlns'
  21228. local = ''
  21229. }
  21230. return { prefix: prefix, local: local }
  21231. }
  21232. function attrib (parser) {
  21233. if (!parser.strict) {
  21234. parser.attribName = parser.attribName[parser.looseCase]()
  21235. }
  21236. if (parser.attribList.indexOf(parser.attribName) !== -1 ||
  21237. parser.tag.attributes.hasOwnProperty(parser.attribName)) {
  21238. parser.attribName = parser.attribValue = ''
  21239. return
  21240. }
  21241. if (parser.opt.xmlns) {
  21242. var qn = qname(parser.attribName, true)
  21243. var prefix = qn.prefix
  21244. var local = qn.local
  21245. if (prefix === 'xmlns') {
  21246. // namespace binding attribute. push the binding into scope
  21247. if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
  21248. strictFail(parser,
  21249. 'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
  21250. 'Actual: ' + parser.attribValue)
  21251. } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
  21252. strictFail(parser,
  21253. 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
  21254. 'Actual: ' + parser.attribValue)
  21255. } else {
  21256. var tag = parser.tag
  21257. var parent = parser.tags[parser.tags.length - 1] || parser
  21258. if (tag.ns === parent.ns) {
  21259. tag.ns = Object.create(parent.ns)
  21260. }
  21261. tag.ns[local] = parser.attribValue
  21262. }
  21263. }
  21264. // defer onattribute events until all attributes have been seen
  21265. // so any new bindings can take effect. preserve attribute order
  21266. // so deferred events can be emitted in document order
  21267. parser.attribList.push([parser.attribName, parser.attribValue])
  21268. } else {
  21269. // in non-xmlns mode, we can emit the event right away
  21270. parser.tag.attributes[parser.attribName] = parser.attribValue
  21271. emitNode(parser, 'onattribute', {
  21272. name: parser.attribName,
  21273. value: parser.attribValue
  21274. })
  21275. }
  21276. parser.attribName = parser.attribValue = ''
  21277. }
  21278. function openTag (parser, selfClosing) {
  21279. if (parser.opt.xmlns) {
  21280. // emit namespace binding events
  21281. var tag = parser.tag
  21282. // add namespace info to tag
  21283. var qn = qname(parser.tagName)
  21284. tag.prefix = qn.prefix
  21285. tag.local = qn.local
  21286. tag.uri = tag.ns[qn.prefix] || ''
  21287. if (tag.prefix && !tag.uri) {
  21288. strictFail(parser, 'Unbound namespace prefix: ' +
  21289. JSON.stringify(parser.tagName))
  21290. tag.uri = qn.prefix
  21291. }
  21292. var parent = parser.tags[parser.tags.length - 1] || parser
  21293. if (tag.ns && parent.ns !== tag.ns) {
  21294. Object.keys(tag.ns).forEach(function (p) {
  21295. emitNode(parser, 'onopennamespace', {
  21296. prefix: p,
  21297. uri: tag.ns[p]
  21298. })
  21299. })
  21300. }
  21301. // handle deferred onattribute events
  21302. // Note: do not apply default ns to attributes:
  21303. // http://www.w3.org/TR/REC-xml-names/#defaulting
  21304. for (var i = 0, l = parser.attribList.length; i < l; i++) {
  21305. var nv = parser.attribList[i]
  21306. var name = nv[0]
  21307. var value = nv[1]
  21308. var qualName = qname(name, true)
  21309. var prefix = qualName.prefix
  21310. var local = qualName.local
  21311. var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
  21312. var a = {
  21313. name: name,
  21314. value: value,
  21315. prefix: prefix,
  21316. local: local,
  21317. uri: uri
  21318. }
  21319. // if there's any attributes with an undefined namespace,
  21320. // then fail on them now.
  21321. if (prefix && prefix !== 'xmlns' && !uri) {
  21322. strictFail(parser, 'Unbound namespace prefix: ' +
  21323. JSON.stringify(prefix))
  21324. a.uri = prefix
  21325. }
  21326. parser.tag.attributes[name] = a
  21327. emitNode(parser, 'onattribute', a)
  21328. }
  21329. parser.attribList.length = 0
  21330. }
  21331. parser.tag.isSelfClosing = !!selfClosing
  21332. // process the tag
  21333. parser.sawRoot = true
  21334. parser.tags.push(parser.tag)
  21335. emitNode(parser, 'onopentag', parser.tag)
  21336. if (!selfClosing) {
  21337. // special case for <script> in non-strict mode.
  21338. if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
  21339. parser.state = S.SCRIPT
  21340. } else {
  21341. parser.state = S.TEXT
  21342. }
  21343. parser.tag = null
  21344. parser.tagName = ''
  21345. }
  21346. parser.attribName = parser.attribValue = ''
  21347. parser.attribList.length = 0
  21348. }
  21349. function closeTag (parser) {
  21350. if (!parser.tagName) {
  21351. strictFail(parser, 'Weird empty close tag.')
  21352. parser.textNode += '</>'
  21353. parser.state = S.TEXT
  21354. return
  21355. }
  21356. if (parser.script) {
  21357. if (parser.tagName !== 'script') {
  21358. parser.script += '</' + parser.tagName + '>'
  21359. parser.tagName = ''
  21360. parser.state = S.SCRIPT
  21361. return
  21362. }
  21363. emitNode(parser, 'onscript', parser.script)
  21364. parser.script = ''
  21365. }
  21366. // first make sure that the closing tag actually exists.
  21367. // <a><b></c></b></a> will close everything, otherwise.
  21368. var t = parser.tags.length
  21369. var tagName = parser.tagName
  21370. if (!parser.strict) {
  21371. tagName = tagName[parser.looseCase]()
  21372. }
  21373. var closeTo = tagName
  21374. while (t--) {
  21375. var close = parser.tags[t]
  21376. if (close.name !== closeTo) {
  21377. // fail the first time in strict mode
  21378. strictFail(parser, 'Unexpected close tag')
  21379. } else {
  21380. break
  21381. }
  21382. }
  21383. // didn't find it. we already failed for strict, so just abort.
  21384. if (t < 0) {
  21385. strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
  21386. parser.textNode += '</' + parser.tagName + '>'
  21387. parser.state = S.TEXT
  21388. return
  21389. }
  21390. parser.tagName = tagName
  21391. var s = parser.tags.length
  21392. while (s-- > t) {
  21393. var tag = parser.tag = parser.tags.pop()
  21394. parser.tagName = parser.tag.name
  21395. emitNode(parser, 'onclosetag', parser.tagName)
  21396. var x = {}
  21397. for (var i in tag.ns) {
  21398. x[i] = tag.ns[i]
  21399. }
  21400. var parent = parser.tags[parser.tags.length - 1] || parser
  21401. if (parser.opt.xmlns && tag.ns !== parent.ns) {
  21402. // remove namespace bindings introduced by tag
  21403. Object.keys(tag.ns).forEach(function (p) {
  21404. var n = tag.ns[p]
  21405. emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
  21406. })
  21407. }
  21408. }
  21409. if (t === 0) parser.closedRoot = true
  21410. parser.tagName = parser.attribValue = parser.attribName = ''
  21411. parser.attribList.length = 0
  21412. parser.state = S.TEXT
  21413. }
  21414. function parseEntity (parser) {
  21415. var entity = parser.entity
  21416. var entityLC = entity.toLowerCase()
  21417. var num
  21418. var numStr = ''
  21419. if (parser.ENTITIES[entity]) {
  21420. return parser.ENTITIES[entity]
  21421. }
  21422. if (parser.ENTITIES[entityLC]) {
  21423. return parser.ENTITIES[entityLC]
  21424. }
  21425. entity = entityLC
  21426. if (entity.charAt(0) === '#') {
  21427. if (entity.charAt(1) === 'x') {
  21428. entity = entity.slice(2)
  21429. num = parseInt(entity, 16)
  21430. numStr = num.toString(16)
  21431. } else {
  21432. entity = entity.slice(1)
  21433. num = parseInt(entity, 10)
  21434. numStr = num.toString(10)
  21435. }
  21436. }
  21437. entity = entity.replace(/^0+/, '')
  21438. if (isNaN(num) || numStr.toLowerCase() !== entity) {
  21439. strictFail(parser, 'Invalid character entity')
  21440. return '&' + parser.entity + ';'
  21441. }
  21442. return String.fromCodePoint(num)
  21443. }
  21444. function beginWhiteSpace (parser, c) {
  21445. if (c === '<') {
  21446. parser.state = S.OPEN_WAKA
  21447. parser.startTagPosition = parser.position
  21448. } else if (!isWhitespace(c)) {
  21449. // have to process this as a text node.
  21450. // weird, but happens.
  21451. strictFail(parser, 'Non-whitespace before first tag.')
  21452. parser.textNode = c
  21453. parser.state = S.TEXT
  21454. }
  21455. }
  21456. function charAt (chunk, i) {
  21457. var result = ''
  21458. if (i < chunk.length) {
  21459. result = chunk.charAt(i)
  21460. }
  21461. return result
  21462. }
  21463. function write (chunk) {
  21464. var parser = this
  21465. if (this.error) {
  21466. throw this.error
  21467. }
  21468. if (parser.closed) {
  21469. return error(parser,
  21470. 'Cannot write after close. Assign an onready handler.')
  21471. }
  21472. if (chunk === null) {
  21473. return end(parser)
  21474. }
  21475. if (typeof chunk === 'object') {
  21476. chunk = chunk.toString()
  21477. }
  21478. var i = 0
  21479. var c = ''
  21480. while (true) {
  21481. c = charAt(chunk, i++)
  21482. parser.c = c
  21483. if (!c) {
  21484. break
  21485. }
  21486. if (parser.trackPosition) {
  21487. parser.position++
  21488. if (c === '\n') {
  21489. parser.line++
  21490. parser.column = 0
  21491. } else {
  21492. parser.column++
  21493. }
  21494. }
  21495. switch (parser.state) {
  21496. case S.BEGIN:
  21497. parser.state = S.BEGIN_WHITESPACE
  21498. if (c === '\uFEFF') {
  21499. continue
  21500. }
  21501. beginWhiteSpace(parser, c)
  21502. continue
  21503. case S.BEGIN_WHITESPACE:
  21504. beginWhiteSpace(parser, c)
  21505. continue
  21506. case S.TEXT:
  21507. if (parser.sawRoot && !parser.closedRoot) {
  21508. var starti = i - 1
  21509. while (c && c !== '<' && c !== '&') {
  21510. c = charAt(chunk, i++)
  21511. if (c && parser.trackPosition) {
  21512. parser.position++
  21513. if (c === '\n') {
  21514. parser.line++
  21515. parser.column = 0
  21516. } else {
  21517. parser.column++
  21518. }
  21519. }
  21520. }
  21521. parser.textNode += chunk.substring(starti, i - 1)
  21522. }
  21523. if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
  21524. parser.state = S.OPEN_WAKA
  21525. parser.startTagPosition = parser.position
  21526. } else {
  21527. if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
  21528. strictFail(parser, 'Text data outside of root node.')
  21529. }
  21530. if (c === '&') {
  21531. parser.state = S.TEXT_ENTITY
  21532. } else {
  21533. parser.textNode += c
  21534. }
  21535. }
  21536. continue
  21537. case S.SCRIPT:
  21538. // only non-strict
  21539. if (c === '<') {
  21540. parser.state = S.SCRIPT_ENDING
  21541. } else {
  21542. parser.script += c
  21543. }
  21544. continue
  21545. case S.SCRIPT_ENDING:
  21546. if (c === '/') {
  21547. parser.state = S.CLOSE_TAG
  21548. } else {
  21549. parser.script += '<' + c
  21550. parser.state = S.SCRIPT
  21551. }
  21552. continue
  21553. case S.OPEN_WAKA:
  21554. // either a /, ?, !, or text is coming next.
  21555. if (c === '!') {
  21556. parser.state = S.SGML_DECL
  21557. parser.sgmlDecl = ''
  21558. } else if (isWhitespace(c)) {
  21559. // wait for it...
  21560. } else if (isMatch(nameStart, c)) {
  21561. parser.state = S.OPEN_TAG
  21562. parser.tagName = c
  21563. } else if (c === '/') {
  21564. parser.state = S.CLOSE_TAG
  21565. parser.tagName = ''
  21566. } else if (c === '?') {
  21567. parser.state = S.PROC_INST
  21568. parser.procInstName = parser.procInstBody = ''
  21569. } else {
  21570. strictFail(parser, 'Unencoded <')
  21571. // if there was some whitespace, then add that in.
  21572. if (parser.startTagPosition + 1 < parser.position) {
  21573. var pad = parser.position - parser.startTagPosition
  21574. c = new Array(pad).join(' ') + c
  21575. }
  21576. parser.textNode += '<' + c
  21577. parser.state = S.TEXT
  21578. }
  21579. continue
  21580. case S.SGML_DECL:
  21581. if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
  21582. emitNode(parser, 'onopencdata')
  21583. parser.state = S.CDATA
  21584. parser.sgmlDecl = ''
  21585. parser.cdata = ''
  21586. } else if (parser.sgmlDecl + c === '--') {
  21587. parser.state = S.COMMENT
  21588. parser.comment = ''
  21589. parser.sgmlDecl = ''
  21590. } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
  21591. parser.state = S.DOCTYPE
  21592. if (parser.doctype || parser.sawRoot) {
  21593. strictFail(parser,
  21594. 'Inappropriately located doctype declaration')
  21595. }
  21596. parser.doctype = ''
  21597. parser.sgmlDecl = ''
  21598. } else if (c === '>') {
  21599. emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
  21600. parser.sgmlDecl = ''
  21601. parser.state = S.TEXT
  21602. } else if (isQuote(c)) {
  21603. parser.state = S.SGML_DECL_QUOTED
  21604. parser.sgmlDecl += c
  21605. } else {
  21606. parser.sgmlDecl += c
  21607. }
  21608. continue
  21609. case S.SGML_DECL_QUOTED:
  21610. if (c === parser.q) {
  21611. parser.state = S.SGML_DECL
  21612. parser.q = ''
  21613. }
  21614. parser.sgmlDecl += c
  21615. continue
  21616. case S.DOCTYPE:
  21617. if (c === '>') {
  21618. parser.state = S.TEXT
  21619. emitNode(parser, 'ondoctype', parser.doctype)
  21620. parser.doctype = true // just remember that we saw it.
  21621. } else {
  21622. parser.doctype += c
  21623. if (c === '[') {
  21624. parser.state = S.DOCTYPE_DTD
  21625. } else if (isQuote(c)) {
  21626. parser.state = S.DOCTYPE_QUOTED
  21627. parser.q = c
  21628. }
  21629. }
  21630. continue
  21631. case S.DOCTYPE_QUOTED:
  21632. parser.doctype += c
  21633. if (c === parser.q) {
  21634. parser.q = ''
  21635. parser.state = S.DOCTYPE
  21636. }
  21637. continue
  21638. case S.DOCTYPE_DTD:
  21639. parser.doctype += c
  21640. if (c === ']') {
  21641. parser.state = S.DOCTYPE
  21642. } else if (isQuote(c)) {
  21643. parser.state = S.DOCTYPE_DTD_QUOTED
  21644. parser.q = c
  21645. }
  21646. continue
  21647. case S.DOCTYPE_DTD_QUOTED:
  21648. parser.doctype += c
  21649. if (c === parser.q) {
  21650. parser.state = S.DOCTYPE_DTD
  21651. parser.q = ''
  21652. }
  21653. continue
  21654. case S.COMMENT:
  21655. if (c === '-') {
  21656. parser.state = S.COMMENT_ENDING
  21657. } else {
  21658. parser.comment += c
  21659. }
  21660. continue
  21661. case S.COMMENT_ENDING:
  21662. if (c === '-') {
  21663. parser.state = S.COMMENT_ENDED
  21664. parser.comment = textopts(parser.opt, parser.comment)
  21665. if (parser.comment) {
  21666. emitNode(parser, 'oncomment', parser.comment)
  21667. }
  21668. parser.comment = ''
  21669. } else {
  21670. parser.comment += '-' + c
  21671. parser.state = S.COMMENT
  21672. }
  21673. continue
  21674. case S.COMMENT_ENDED:
  21675. if (c !== '>') {
  21676. strictFail(parser, 'Malformed comment')
  21677. // allow <!-- blah -- bloo --> in non-strict mode,
  21678. // which is a comment of " blah -- bloo "
  21679. parser.comment += '--' + c
  21680. parser.state = S.COMMENT
  21681. } else {
  21682. parser.state = S.TEXT
  21683. }
  21684. continue
  21685. case S.CDATA:
  21686. if (c === ']') {
  21687. parser.state = S.CDATA_ENDING
  21688. } else {
  21689. parser.cdata += c
  21690. }
  21691. continue
  21692. case S.CDATA_ENDING:
  21693. if (c === ']') {
  21694. parser.state = S.CDATA_ENDING_2
  21695. } else {
  21696. parser.cdata += ']' + c
  21697. parser.state = S.CDATA
  21698. }
  21699. continue
  21700. case S.CDATA_ENDING_2:
  21701. if (c === '>') {
  21702. if (parser.cdata) {
  21703. emitNode(parser, 'oncdata', parser.cdata)
  21704. }
  21705. emitNode(parser, 'onclosecdata')
  21706. parser.cdata = ''
  21707. parser.state = S.TEXT
  21708. } else if (c === ']') {
  21709. parser.cdata += ']'
  21710. } else {
  21711. parser.cdata += ']]' + c
  21712. parser.state = S.CDATA
  21713. }
  21714. continue
  21715. case S.PROC_INST:
  21716. if (c === '?') {
  21717. parser.state = S.PROC_INST_ENDING
  21718. } else if (isWhitespace(c)) {
  21719. parser.state = S.PROC_INST_BODY
  21720. } else {
  21721. parser.procInstName += c
  21722. }
  21723. continue
  21724. case S.PROC_INST_BODY:
  21725. if (!parser.procInstBody && isWhitespace(c)) {
  21726. continue
  21727. } else if (c === '?') {
  21728. parser.state = S.PROC_INST_ENDING
  21729. } else {
  21730. parser.procInstBody += c
  21731. }
  21732. continue
  21733. case S.PROC_INST_ENDING:
  21734. if (c === '>') {
  21735. emitNode(parser, 'onprocessinginstruction', {
  21736. name: parser.procInstName,
  21737. body: parser.procInstBody
  21738. })
  21739. parser.procInstName = parser.procInstBody = ''
  21740. parser.state = S.TEXT
  21741. } else {
  21742. parser.procInstBody += '?' + c
  21743. parser.state = S.PROC_INST_BODY
  21744. }
  21745. continue
  21746. case S.OPEN_TAG:
  21747. if (isMatch(nameBody, c)) {
  21748. parser.tagName += c
  21749. } else {
  21750. newTag(parser)
  21751. if (c === '>') {
  21752. openTag(parser)
  21753. } else if (c === '/') {
  21754. parser.state = S.OPEN_TAG_SLASH
  21755. } else {
  21756. if (!isWhitespace(c)) {
  21757. strictFail(parser, 'Invalid character in tag name')
  21758. }
  21759. parser.state = S.ATTRIB
  21760. }
  21761. }
  21762. continue
  21763. case S.OPEN_TAG_SLASH:
  21764. if (c === '>') {
  21765. openTag(parser, true)
  21766. closeTag(parser)
  21767. } else {
  21768. strictFail(parser, 'Forward-slash in opening tag not followed by >')
  21769. parser.state = S.ATTRIB
  21770. }
  21771. continue
  21772. case S.ATTRIB:
  21773. // haven't read the attribute name yet.
  21774. if (isWhitespace(c)) {
  21775. continue
  21776. } else if (c === '>') {
  21777. openTag(parser)
  21778. } else if (c === '/') {
  21779. parser.state = S.OPEN_TAG_SLASH
  21780. } else if (isMatch(nameStart, c)) {
  21781. parser.attribName = c
  21782. parser.attribValue = ''
  21783. parser.state = S.ATTRIB_NAME
  21784. } else {
  21785. strictFail(parser, 'Invalid attribute name')
  21786. }
  21787. continue
  21788. case S.ATTRIB_NAME:
  21789. if (c === '=') {
  21790. parser.state = S.ATTRIB_VALUE
  21791. } else if (c === '>') {
  21792. strictFail(parser, 'Attribute without value')
  21793. parser.attribValue = parser.attribName
  21794. attrib(parser)
  21795. openTag(parser)
  21796. } else if (isWhitespace(c)) {
  21797. parser.state = S.ATTRIB_NAME_SAW_WHITE
  21798. } else if (isMatch(nameBody, c)) {
  21799. parser.attribName += c
  21800. } else {
  21801. strictFail(parser, 'Invalid attribute name')
  21802. }
  21803. continue
  21804. case S.ATTRIB_NAME_SAW_WHITE:
  21805. if (c === '=') {
  21806. parser.state = S.ATTRIB_VALUE
  21807. } else if (isWhitespace(c)) {
  21808. continue
  21809. } else {
  21810. strictFail(parser, 'Attribute without value')
  21811. parser.tag.attributes[parser.attribName] = ''
  21812. parser.attribValue = ''
  21813. emitNode(parser, 'onattribute', {
  21814. name: parser.attribName,
  21815. value: ''
  21816. })
  21817. parser.attribName = ''
  21818. if (c === '>') {
  21819. openTag(parser)
  21820. } else if (isMatch(nameStart, c)) {
  21821. parser.attribName = c
  21822. parser.state = S.ATTRIB_NAME
  21823. } else {
  21824. strictFail(parser, 'Invalid attribute name')
  21825. parser.state = S.ATTRIB
  21826. }
  21827. }
  21828. continue
  21829. case S.ATTRIB_VALUE:
  21830. if (isWhitespace(c)) {
  21831. continue
  21832. } else if (isQuote(c)) {
  21833. parser.q = c
  21834. parser.state = S.ATTRIB_VALUE_QUOTED
  21835. } else {
  21836. strictFail(parser, 'Unquoted attribute value')
  21837. parser.state = S.ATTRIB_VALUE_UNQUOTED
  21838. parser.attribValue = c
  21839. }
  21840. continue
  21841. case S.ATTRIB_VALUE_QUOTED:
  21842. if (c !== parser.q) {
  21843. if (c === '&') {
  21844. parser.state = S.ATTRIB_VALUE_ENTITY_Q
  21845. } else {
  21846. parser.attribValue += c
  21847. }
  21848. continue
  21849. }
  21850. attrib(parser)
  21851. parser.q = ''
  21852. parser.state = S.ATTRIB_VALUE_CLOSED
  21853. continue
  21854. case S.ATTRIB_VALUE_CLOSED:
  21855. if (isWhitespace(c)) {
  21856. parser.state = S.ATTRIB
  21857. } else if (c === '>') {
  21858. openTag(parser)
  21859. } else if (c === '/') {
  21860. parser.state = S.OPEN_TAG_SLASH
  21861. } else if (isMatch(nameStart, c)) {
  21862. strictFail(parser, 'No whitespace between attributes')
  21863. parser.attribName = c
  21864. parser.attribValue = ''
  21865. parser.state = S.ATTRIB_NAME
  21866. } else {
  21867. strictFail(parser, 'Invalid attribute name')
  21868. }
  21869. continue
  21870. case S.ATTRIB_VALUE_UNQUOTED:
  21871. if (!isAttribEnd(c)) {
  21872. if (c === '&') {
  21873. parser.state = S.ATTRIB_VALUE_ENTITY_U
  21874. } else {
  21875. parser.attribValue += c
  21876. }
  21877. continue
  21878. }
  21879. attrib(parser)
  21880. if (c === '>') {
  21881. openTag(parser)
  21882. } else {
  21883. parser.state = S.ATTRIB
  21884. }
  21885. continue
  21886. case S.CLOSE_TAG:
  21887. if (!parser.tagName) {
  21888. if (isWhitespace(c)) {
  21889. continue
  21890. } else if (notMatch(nameStart, c)) {
  21891. if (parser.script) {
  21892. parser.script += '</' + c
  21893. parser.state = S.SCRIPT
  21894. } else {
  21895. strictFail(parser, 'Invalid tagname in closing tag.')
  21896. }
  21897. } else {
  21898. parser.tagName = c
  21899. }
  21900. } else if (c === '>') {
  21901. closeTag(parser)
  21902. } else if (isMatch(nameBody, c)) {
  21903. parser.tagName += c
  21904. } else if (parser.script) {
  21905. parser.script += '</' + parser.tagName
  21906. parser.tagName = ''
  21907. parser.state = S.SCRIPT
  21908. } else {
  21909. if (!isWhitespace(c)) {
  21910. strictFail(parser, 'Invalid tagname in closing tag')
  21911. }
  21912. parser.state = S.CLOSE_TAG_SAW_WHITE
  21913. }
  21914. continue
  21915. case S.CLOSE_TAG_SAW_WHITE:
  21916. if (isWhitespace(c)) {
  21917. continue
  21918. }
  21919. if (c === '>') {
  21920. closeTag(parser)
  21921. } else {
  21922. strictFail(parser, 'Invalid characters in closing tag')
  21923. }
  21924. continue
  21925. case S.TEXT_ENTITY:
  21926. case S.ATTRIB_VALUE_ENTITY_Q:
  21927. case S.ATTRIB_VALUE_ENTITY_U:
  21928. var returnState
  21929. var buffer
  21930. switch (parser.state) {
  21931. case S.TEXT_ENTITY:
  21932. returnState = S.TEXT
  21933. buffer = 'textNode'
  21934. break
  21935. case S.ATTRIB_VALUE_ENTITY_Q:
  21936. returnState = S.ATTRIB_VALUE_QUOTED
  21937. buffer = 'attribValue'
  21938. break
  21939. case S.ATTRIB_VALUE_ENTITY_U:
  21940. returnState = S.ATTRIB_VALUE_UNQUOTED
  21941. buffer = 'attribValue'
  21942. break
  21943. }
  21944. if (c === ';') {
  21945. parser[buffer] += parseEntity(parser)
  21946. parser.entity = ''
  21947. parser.state = returnState
  21948. } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
  21949. parser.entity += c
  21950. } else {
  21951. strictFail(parser, 'Invalid character in entity name')
  21952. parser[buffer] += '&' + parser.entity + c
  21953. parser.entity = ''
  21954. parser.state = returnState
  21955. }
  21956. continue
  21957. default:
  21958. throw new Error(parser, 'Unknown state: ' + parser.state)
  21959. }
  21960. } // while
  21961. if (parser.position >= parser.bufferCheckPosition) {
  21962. checkBufferLength(parser)
  21963. }
  21964. return parser
  21965. }
  21966. /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
  21967. /* istanbul ignore next */
  21968. if (!String.fromCodePoint) {
  21969. (function () {
  21970. var stringFromCharCode = String.fromCharCode
  21971. var floor = Math.floor
  21972. var fromCodePoint = function () {
  21973. var MAX_SIZE = 0x4000
  21974. var codeUnits = []
  21975. var highSurrogate
  21976. var lowSurrogate
  21977. var index = -1
  21978. var length = arguments.length
  21979. if (!length) {
  21980. return ''
  21981. }
  21982. var result = ''
  21983. while (++index < length) {
  21984. var codePoint = Number(arguments[index])
  21985. if (
  21986. !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
  21987. codePoint < 0 || // not a valid Unicode code point
  21988. codePoint > 0x10FFFF || // not a valid Unicode code point
  21989. floor(codePoint) !== codePoint // not an integer
  21990. ) {
  21991. throw RangeError('Invalid code point: ' + codePoint)
  21992. }
  21993. if (codePoint <= 0xFFFF) { // BMP code point
  21994. codeUnits.push(codePoint)
  21995. } else { // Astral code point; split in surrogate halves
  21996. // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
  21997. codePoint -= 0x10000
  21998. highSurrogate = (codePoint >> 10) + 0xD800
  21999. lowSurrogate = (codePoint % 0x400) + 0xDC00
  22000. codeUnits.push(highSurrogate, lowSurrogate)
  22001. }
  22002. if (index + 1 === length || codeUnits.length > MAX_SIZE) {
  22003. result += stringFromCharCode.apply(null, codeUnits)
  22004. codeUnits.length = 0
  22005. }
  22006. }
  22007. return result
  22008. }
  22009. /* istanbul ignore next */
  22010. if (Object.defineProperty) {
  22011. Object.defineProperty(String, 'fromCodePoint', {
  22012. value: fromCodePoint,
  22013. configurable: true,
  22014. writable: true
  22015. })
  22016. } else {
  22017. String.fromCodePoint = fromCodePoint
  22018. }
  22019. }())
  22020. }
  22021. })( false ? 0 : exports)
  22022. /***/ }),
  22023. /***/ 2830:
  22024. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  22025. // Copyright Joyent, Inc. and other Node contributors.
  22026. //
  22027. // Permission is hereby granted, free of charge, to any person obtaining a
  22028. // copy of this software and associated documentation files (the
  22029. // "Software"), to deal in the Software without restriction, including
  22030. // without limitation the rights to use, copy, modify, merge, publish,
  22031. // distribute, sublicense, and/or sell copies of the Software, and to permit
  22032. // persons to whom the Software is furnished to do so, subject to the
  22033. // following conditions:
  22034. //
  22035. // The above copyright notice and this permission notice shall be included
  22036. // in all copies or substantial portions of the Software.
  22037. //
  22038. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22039. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22040. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  22041. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  22042. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  22043. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  22044. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  22045. module.exports = Stream;
  22046. var EE = (__webpack_require__(7187).EventEmitter);
  22047. var inherits = __webpack_require__(5717);
  22048. inherits(Stream, EE);
  22049. Stream.Readable = __webpack_require__(6577);
  22050. Stream.Writable = __webpack_require__(323);
  22051. Stream.Duplex = __webpack_require__(8656);
  22052. Stream.Transform = __webpack_require__(4473);
  22053. Stream.PassThrough = __webpack_require__(2366);
  22054. Stream.finished = __webpack_require__(1086)
  22055. Stream.pipeline = __webpack_require__(6472)
  22056. // Backwards-compat with node 0.4.x
  22057. Stream.Stream = Stream;
  22058. // old-style streams. Note that the pipe method (the only relevant
  22059. // part of this class) is overridden in the Readable class.
  22060. function Stream() {
  22061. EE.call(this);
  22062. }
  22063. Stream.prototype.pipe = function(dest, options) {
  22064. var source = this;
  22065. function ondata(chunk) {
  22066. if (dest.writable) {
  22067. if (false === dest.write(chunk) && source.pause) {
  22068. source.pause();
  22069. }
  22070. }
  22071. }
  22072. source.on('data', ondata);
  22073. function ondrain() {
  22074. if (source.readable && source.resume) {
  22075. source.resume();
  22076. }
  22077. }
  22078. dest.on('drain', ondrain);
  22079. // If the 'end' option is not supplied, dest.end() will be called when
  22080. // source gets the 'end' or 'close' events. Only dest.end() once.
  22081. if (!dest._isStdio && (!options || options.end !== false)) {
  22082. source.on('end', onend);
  22083. source.on('close', onclose);
  22084. }
  22085. var didOnEnd = false;
  22086. function onend() {
  22087. if (didOnEnd) return;
  22088. didOnEnd = true;
  22089. dest.end();
  22090. }
  22091. function onclose() {
  22092. if (didOnEnd) return;
  22093. didOnEnd = true;
  22094. if (typeof dest.destroy === 'function') dest.destroy();
  22095. }
  22096. // don't leave dangling pipes when there are errors.
  22097. function onerror(er) {
  22098. cleanup();
  22099. if (EE.listenerCount(this, 'error') === 0) {
  22100. throw er; // Unhandled stream error in pipe.
  22101. }
  22102. }
  22103. source.on('error', onerror);
  22104. dest.on('error', onerror);
  22105. // remove all the event listeners that were added.
  22106. function cleanup() {
  22107. source.removeListener('data', ondata);
  22108. dest.removeListener('drain', ondrain);
  22109. source.removeListener('end', onend);
  22110. source.removeListener('close', onclose);
  22111. source.removeListener('error', onerror);
  22112. dest.removeListener('error', onerror);
  22113. source.removeListener('end', cleanup);
  22114. source.removeListener('close', cleanup);
  22115. dest.removeListener('close', cleanup);
  22116. }
  22117. source.on('end', cleanup);
  22118. source.on('close', cleanup);
  22119. dest.on('close', cleanup);
  22120. dest.emit('pipe', source);
  22121. // Allow for unix-like usage: A.pipe(B).pipe(C)
  22122. return dest;
  22123. };
  22124. /***/ }),
  22125. /***/ 8106:
  22126. /***/ (function(module) {
  22127. "use strict";
  22128. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  22129. var codes = {};
  22130. function createErrorType(code, message, Base) {
  22131. if (!Base) {
  22132. Base = Error;
  22133. }
  22134. function getMessage(arg1, arg2, arg3) {
  22135. if (typeof message === 'string') {
  22136. return message;
  22137. } else {
  22138. return message(arg1, arg2, arg3);
  22139. }
  22140. }
  22141. var NodeError =
  22142. /*#__PURE__*/
  22143. function (_Base) {
  22144. _inheritsLoose(NodeError, _Base);
  22145. function NodeError(arg1, arg2, arg3) {
  22146. return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
  22147. }
  22148. return NodeError;
  22149. }(Base);
  22150. NodeError.prototype.name = Base.name;
  22151. NodeError.prototype.code = code;
  22152. codes[code] = NodeError;
  22153. } // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
  22154. function oneOf(expected, thing) {
  22155. if (Array.isArray(expected)) {
  22156. var len = expected.length;
  22157. expected = expected.map(function (i) {
  22158. return String(i);
  22159. });
  22160. if (len > 2) {
  22161. return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
  22162. } else if (len === 2) {
  22163. return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
  22164. } else {
  22165. return "of ".concat(thing, " ").concat(expected[0]);
  22166. }
  22167. } else {
  22168. return "of ".concat(thing, " ").concat(String(expected));
  22169. }
  22170. } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
  22171. function startsWith(str, search, pos) {
  22172. return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
  22173. } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
  22174. function endsWith(str, search, this_len) {
  22175. if (this_len === undefined || this_len > str.length) {
  22176. this_len = str.length;
  22177. }
  22178. return str.substring(this_len - search.length, this_len) === search;
  22179. } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
  22180. function includes(str, search, start) {
  22181. if (typeof start !== 'number') {
  22182. start = 0;
  22183. }
  22184. if (start + search.length > str.length) {
  22185. return false;
  22186. } else {
  22187. return str.indexOf(search, start) !== -1;
  22188. }
  22189. }
  22190. createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
  22191. return 'The value "' + value + '" is invalid for option "' + name + '"';
  22192. }, TypeError);
  22193. createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
  22194. // determiner: 'must be' or 'must not be'
  22195. var determiner;
  22196. if (typeof expected === 'string' && startsWith(expected, 'not ')) {
  22197. determiner = 'must not be';
  22198. expected = expected.replace(/^not /, '');
  22199. } else {
  22200. determiner = 'must be';
  22201. }
  22202. var msg;
  22203. if (endsWith(name, ' argument')) {
  22204. // For cases like 'first argument'
  22205. msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  22206. } else {
  22207. var type = includes(name, '.') ? 'property' : 'argument';
  22208. msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
  22209. }
  22210. msg += ". Received type ".concat(typeof actual);
  22211. return msg;
  22212. }, TypeError);
  22213. createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
  22214. createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
  22215. return 'The ' + name + ' method is not implemented';
  22216. });
  22217. createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
  22218. createErrorType('ERR_STREAM_DESTROYED', function (name) {
  22219. return 'Cannot call ' + name + ' after a stream was destroyed';
  22220. });
  22221. createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
  22222. createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
  22223. createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
  22224. createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
  22225. createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
  22226. return 'Unknown encoding: ' + arg;
  22227. }, TypeError);
  22228. createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
  22229. module.exports.q = codes;
  22230. /***/ }),
  22231. /***/ 8656:
  22232. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  22233. "use strict";
  22234. // Copyright Joyent, Inc. and other Node contributors.
  22235. //
  22236. // Permission is hereby granted, free of charge, to any person obtaining a
  22237. // copy of this software and associated documentation files (the
  22238. // "Software"), to deal in the Software without restriction, including
  22239. // without limitation the rights to use, copy, modify, merge, publish,
  22240. // distribute, sublicense, and/or sell copies of the Software, and to permit
  22241. // persons to whom the Software is furnished to do so, subject to the
  22242. // following conditions:
  22243. //
  22244. // The above copyright notice and this permission notice shall be included
  22245. // in all copies or substantial portions of the Software.
  22246. //
  22247. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22248. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22249. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  22250. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  22251. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  22252. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  22253. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  22254. // a duplex stream is just a stream that is both readable and writable.
  22255. // Since JS doesn't have multiple prototypal inheritance, this class
  22256. // prototypally inherits from Readable, and then parasitically from
  22257. // Writable.
  22258. /*<replacement>*/
  22259. var objectKeys = Object.keys || function (obj) {
  22260. var keys = [];
  22261. for (var key in obj) keys.push(key);
  22262. return keys;
  22263. };
  22264. /*</replacement>*/
  22265. module.exports = Duplex;
  22266. var Readable = __webpack_require__(6577);
  22267. var Writable = __webpack_require__(323);
  22268. __webpack_require__(5717)(Duplex, Readable);
  22269. {
  22270. // Allow the keys array to be GC'ed.
  22271. var keys = objectKeys(Writable.prototype);
  22272. for (var v = 0; v < keys.length; v++) {
  22273. var method = keys[v];
  22274. if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
  22275. }
  22276. }
  22277. function Duplex(options) {
  22278. if (!(this instanceof Duplex)) return new Duplex(options);
  22279. Readable.call(this, options);
  22280. Writable.call(this, options);
  22281. this.allowHalfOpen = true;
  22282. if (options) {
  22283. if (options.readable === false) this.readable = false;
  22284. if (options.writable === false) this.writable = false;
  22285. if (options.allowHalfOpen === false) {
  22286. this.allowHalfOpen = false;
  22287. this.once('end', onend);
  22288. }
  22289. }
  22290. }
  22291. Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
  22292. // making it explicit this property is not enumerable
  22293. // because otherwise some prototype manipulation in
  22294. // userland will fail
  22295. enumerable: false,
  22296. get: function get() {
  22297. return this._writableState.highWaterMark;
  22298. }
  22299. });
  22300. Object.defineProperty(Duplex.prototype, 'writableBuffer', {
  22301. // making it explicit this property is not enumerable
  22302. // because otherwise some prototype manipulation in
  22303. // userland will fail
  22304. enumerable: false,
  22305. get: function get() {
  22306. return this._writableState && this._writableState.getBuffer();
  22307. }
  22308. });
  22309. Object.defineProperty(Duplex.prototype, 'writableLength', {
  22310. // making it explicit this property is not enumerable
  22311. // because otherwise some prototype manipulation in
  22312. // userland will fail
  22313. enumerable: false,
  22314. get: function get() {
  22315. return this._writableState.length;
  22316. }
  22317. });
  22318. // the no-half-open enforcer
  22319. function onend() {
  22320. // If the writable side ended, then we're ok.
  22321. if (this._writableState.ended) return;
  22322. // no more data can be written.
  22323. // But allow more writes to happen in this tick.
  22324. process.nextTick(onEndNT, this);
  22325. }
  22326. function onEndNT(self) {
  22327. self.end();
  22328. }
  22329. Object.defineProperty(Duplex.prototype, 'destroyed', {
  22330. // making it explicit this property is not enumerable
  22331. // because otherwise some prototype manipulation in
  22332. // userland will fail
  22333. enumerable: false,
  22334. get: function get() {
  22335. if (this._readableState === undefined || this._writableState === undefined) {
  22336. return false;
  22337. }
  22338. return this._readableState.destroyed && this._writableState.destroyed;
  22339. },
  22340. set: function set(value) {
  22341. // we ignore the value if the stream
  22342. // has not been initialized yet
  22343. if (this._readableState === undefined || this._writableState === undefined) {
  22344. return;
  22345. }
  22346. // backward compatibility, the user is explicitly
  22347. // managing destroyed
  22348. this._readableState.destroyed = value;
  22349. this._writableState.destroyed = value;
  22350. }
  22351. });
  22352. /***/ }),
  22353. /***/ 2366:
  22354. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  22355. "use strict";
  22356. // Copyright Joyent, Inc. and other Node contributors.
  22357. //
  22358. // Permission is hereby granted, free of charge, to any person obtaining a
  22359. // copy of this software and associated documentation files (the
  22360. // "Software"), to deal in the Software without restriction, including
  22361. // without limitation the rights to use, copy, modify, merge, publish,
  22362. // distribute, sublicense, and/or sell copies of the Software, and to permit
  22363. // persons to whom the Software is furnished to do so, subject to the
  22364. // following conditions:
  22365. //
  22366. // The above copyright notice and this permission notice shall be included
  22367. // in all copies or substantial portions of the Software.
  22368. //
  22369. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22370. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22371. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  22372. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  22373. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  22374. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  22375. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  22376. // a passthrough stream.
  22377. // basically just the most minimal sort of Transform stream.
  22378. // Every written chunk gets output as-is.
  22379. module.exports = PassThrough;
  22380. var Transform = __webpack_require__(4473);
  22381. __webpack_require__(5717)(PassThrough, Transform);
  22382. function PassThrough(options) {
  22383. if (!(this instanceof PassThrough)) return new PassThrough(options);
  22384. Transform.call(this, options);
  22385. }
  22386. PassThrough.prototype._transform = function (chunk, encoding, cb) {
  22387. cb(null, chunk);
  22388. };
  22389. /***/ }),
  22390. /***/ 6577:
  22391. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  22392. "use strict";
  22393. // Copyright Joyent, Inc. and other Node contributors.
  22394. //
  22395. // Permission is hereby granted, free of charge, to any person obtaining a
  22396. // copy of this software and associated documentation files (the
  22397. // "Software"), to deal in the Software without restriction, including
  22398. // without limitation the rights to use, copy, modify, merge, publish,
  22399. // distribute, sublicense, and/or sell copies of the Software, and to permit
  22400. // persons to whom the Software is furnished to do so, subject to the
  22401. // following conditions:
  22402. //
  22403. // The above copyright notice and this permission notice shall be included
  22404. // in all copies or substantial portions of the Software.
  22405. //
  22406. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22407. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22408. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  22409. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  22410. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  22411. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  22412. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  22413. module.exports = Readable;
  22414. /*<replacement>*/
  22415. var Duplex;
  22416. /*</replacement>*/
  22417. Readable.ReadableState = ReadableState;
  22418. /*<replacement>*/
  22419. var EE = (__webpack_require__(7187).EventEmitter);
  22420. var EElistenerCount = function EElistenerCount(emitter, type) {
  22421. return emitter.listeners(type).length;
  22422. };
  22423. /*</replacement>*/
  22424. /*<replacement>*/
  22425. var Stream = __webpack_require__(3194);
  22426. /*</replacement>*/
  22427. var Buffer = (__webpack_require__(2860).Buffer);
  22428. var OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
  22429. function _uint8ArrayToBuffer(chunk) {
  22430. return Buffer.from(chunk);
  22431. }
  22432. function _isUint8Array(obj) {
  22433. return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
  22434. }
  22435. /*<replacement>*/
  22436. var debugUtil = __webpack_require__(964);
  22437. var debug;
  22438. if (debugUtil && debugUtil.debuglog) {
  22439. debug = debugUtil.debuglog('stream');
  22440. } else {
  22441. debug = function debug() {};
  22442. }
  22443. /*</replacement>*/
  22444. var BufferList = __webpack_require__(9686);
  22445. var destroyImpl = __webpack_require__(1029);
  22446. var _require = __webpack_require__(94),
  22447. getHighWaterMark = _require.getHighWaterMark;
  22448. var _require$codes = (__webpack_require__(8106)/* .codes */ .q),
  22449. ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
  22450. ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
  22451. ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  22452. ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
  22453. // Lazy loaded to improve the startup performance.
  22454. var StringDecoder;
  22455. var createReadableStreamAsyncIterator;
  22456. var from;
  22457. __webpack_require__(5717)(Readable, Stream);
  22458. var errorOrDestroy = destroyImpl.errorOrDestroy;
  22459. var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
  22460. function prependListener(emitter, event, fn) {
  22461. // Sadly this is not cacheable as some libraries bundle their own
  22462. // event emitter implementation with them.
  22463. if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
  22464. // This is a hack to make sure that our error handler is attached before any
  22465. // userland ones. NEVER DO THIS. This is here only because this code needs
  22466. // to continue to work with older versions of Node.js that do not include
  22467. // the prependListener() method. The goal is to eventually remove this hack.
  22468. if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
  22469. }
  22470. function ReadableState(options, stream, isDuplex) {
  22471. Duplex = Duplex || __webpack_require__(8656);
  22472. options = options || {};
  22473. // Duplex streams are both readable and writable, but share
  22474. // the same options object.
  22475. // However, some cases require setting options to different
  22476. // values for the readable and the writable sides of the duplex stream.
  22477. // These options can be provided separately as readableXXX and writableXXX.
  22478. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
  22479. // object stream flag. Used to make read(n) ignore n and to
  22480. // make all the buffer merging and length checks go away
  22481. this.objectMode = !!options.objectMode;
  22482. if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
  22483. // the point at which it stops calling _read() to fill the buffer
  22484. // Note: 0 is a valid value, means "don't call _read preemptively ever"
  22485. this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);
  22486. // A linked list is used to store data chunks instead of an array because the
  22487. // linked list can remove elements from the beginning faster than
  22488. // array.shift()
  22489. this.buffer = new BufferList();
  22490. this.length = 0;
  22491. this.pipes = null;
  22492. this.pipesCount = 0;
  22493. this.flowing = null;
  22494. this.ended = false;
  22495. this.endEmitted = false;
  22496. this.reading = false;
  22497. // a flag to be able to tell if the event 'readable'/'data' is emitted
  22498. // immediately, or on a later tick. We set this to true at first, because
  22499. // any actions that shouldn't happen until "later" should generally also
  22500. // not happen before the first read call.
  22501. this.sync = true;
  22502. // whenever we return null, then we set a flag to say
  22503. // that we're awaiting a 'readable' event emission.
  22504. this.needReadable = false;
  22505. this.emittedReadable = false;
  22506. this.readableListening = false;
  22507. this.resumeScheduled = false;
  22508. this.paused = true;
  22509. // Should close be emitted on destroy. Defaults to true.
  22510. this.emitClose = options.emitClose !== false;
  22511. // Should .destroy() be called after 'end' (and potentially 'finish')
  22512. this.autoDestroy = !!options.autoDestroy;
  22513. // has it been destroyed
  22514. this.destroyed = false;
  22515. // Crypto is kind of old and crusty. Historically, its default string
  22516. // encoding is 'binary' so we have to make this configurable.
  22517. // Everything else in the universe uses 'utf8', though.
  22518. this.defaultEncoding = options.defaultEncoding || 'utf8';
  22519. // the number of writers that are awaiting a drain event in .pipe()s
  22520. this.awaitDrain = 0;
  22521. // if true, a maybeReadMore has been scheduled
  22522. this.readingMore = false;
  22523. this.decoder = null;
  22524. this.encoding = null;
  22525. if (options.encoding) {
  22526. if (!StringDecoder) StringDecoder = (__webpack_require__(2553)/* .StringDecoder */ .s);
  22527. this.decoder = new StringDecoder(options.encoding);
  22528. this.encoding = options.encoding;
  22529. }
  22530. }
  22531. function Readable(options) {
  22532. Duplex = Duplex || __webpack_require__(8656);
  22533. if (!(this instanceof Readable)) return new Readable(options);
  22534. // Checking for a Stream.Duplex instance is faster here instead of inside
  22535. // the ReadableState constructor, at least with V8 6.5
  22536. var isDuplex = this instanceof Duplex;
  22537. this._readableState = new ReadableState(options, this, isDuplex);
  22538. // legacy
  22539. this.readable = true;
  22540. if (options) {
  22541. if (typeof options.read === 'function') this._read = options.read;
  22542. if (typeof options.destroy === 'function') this._destroy = options.destroy;
  22543. }
  22544. Stream.call(this);
  22545. }
  22546. Object.defineProperty(Readable.prototype, 'destroyed', {
  22547. // making it explicit this property is not enumerable
  22548. // because otherwise some prototype manipulation in
  22549. // userland will fail
  22550. enumerable: false,
  22551. get: function get() {
  22552. if (this._readableState === undefined) {
  22553. return false;
  22554. }
  22555. return this._readableState.destroyed;
  22556. },
  22557. set: function set(value) {
  22558. // we ignore the value if the stream
  22559. // has not been initialized yet
  22560. if (!this._readableState) {
  22561. return;
  22562. }
  22563. // backward compatibility, the user is explicitly
  22564. // managing destroyed
  22565. this._readableState.destroyed = value;
  22566. }
  22567. });
  22568. Readable.prototype.destroy = destroyImpl.destroy;
  22569. Readable.prototype._undestroy = destroyImpl.undestroy;
  22570. Readable.prototype._destroy = function (err, cb) {
  22571. cb(err);
  22572. };
  22573. // Manually shove something into the read() buffer.
  22574. // This returns true if the highWaterMark has not been hit yet,
  22575. // similar to how Writable.write() returns true if you should
  22576. // write() some more.
  22577. Readable.prototype.push = function (chunk, encoding) {
  22578. var state = this._readableState;
  22579. var skipChunkCheck;
  22580. if (!state.objectMode) {
  22581. if (typeof chunk === 'string') {
  22582. encoding = encoding || state.defaultEncoding;
  22583. if (encoding !== state.encoding) {
  22584. chunk = Buffer.from(chunk, encoding);
  22585. encoding = '';
  22586. }
  22587. skipChunkCheck = true;
  22588. }
  22589. } else {
  22590. skipChunkCheck = true;
  22591. }
  22592. return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
  22593. };
  22594. // Unshift should *always* be something directly out of read()
  22595. Readable.prototype.unshift = function (chunk) {
  22596. return readableAddChunk(this, chunk, null, true, false);
  22597. };
  22598. function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
  22599. debug('readableAddChunk', chunk);
  22600. var state = stream._readableState;
  22601. if (chunk === null) {
  22602. state.reading = false;
  22603. onEofChunk(stream, state);
  22604. } else {
  22605. var er;
  22606. if (!skipChunkCheck) er = chunkInvalid(state, chunk);
  22607. if (er) {
  22608. errorOrDestroy(stream, er);
  22609. } else if (state.objectMode || chunk && chunk.length > 0) {
  22610. if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
  22611. chunk = _uint8ArrayToBuffer(chunk);
  22612. }
  22613. if (addToFront) {
  22614. if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
  22615. } else if (state.ended) {
  22616. errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
  22617. } else if (state.destroyed) {
  22618. return false;
  22619. } else {
  22620. state.reading = false;
  22621. if (state.decoder && !encoding) {
  22622. chunk = state.decoder.write(chunk);
  22623. if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
  22624. } else {
  22625. addChunk(stream, state, chunk, false);
  22626. }
  22627. }
  22628. } else if (!addToFront) {
  22629. state.reading = false;
  22630. maybeReadMore(stream, state);
  22631. }
  22632. }
  22633. // We can push more data if we are below the highWaterMark.
  22634. // Also, if we have no data yet, we can stand some more bytes.
  22635. // This is to work around cases where hwm=0, such as the repl.
  22636. return !state.ended && (state.length < state.highWaterMark || state.length === 0);
  22637. }
  22638. function addChunk(stream, state, chunk, addToFront) {
  22639. if (state.flowing && state.length === 0 && !state.sync) {
  22640. state.awaitDrain = 0;
  22641. stream.emit('data', chunk);
  22642. } else {
  22643. // update the buffer info.
  22644. state.length += state.objectMode ? 1 : chunk.length;
  22645. if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
  22646. if (state.needReadable) emitReadable(stream);
  22647. }
  22648. maybeReadMore(stream, state);
  22649. }
  22650. function chunkInvalid(state, chunk) {
  22651. var er;
  22652. if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
  22653. er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
  22654. }
  22655. return er;
  22656. }
  22657. Readable.prototype.isPaused = function () {
  22658. return this._readableState.flowing === false;
  22659. };
  22660. // backwards compatibility.
  22661. Readable.prototype.setEncoding = function (enc) {
  22662. if (!StringDecoder) StringDecoder = (__webpack_require__(2553)/* .StringDecoder */ .s);
  22663. var decoder = new StringDecoder(enc);
  22664. this._readableState.decoder = decoder;
  22665. // If setEncoding(null), decoder.encoding equals utf8
  22666. this._readableState.encoding = this._readableState.decoder.encoding;
  22667. // Iterate over current buffer to convert already stored Buffers:
  22668. var p = this._readableState.buffer.head;
  22669. var content = '';
  22670. while (p !== null) {
  22671. content += decoder.write(p.data);
  22672. p = p.next;
  22673. }
  22674. this._readableState.buffer.clear();
  22675. if (content !== '') this._readableState.buffer.push(content);
  22676. this._readableState.length = content.length;
  22677. return this;
  22678. };
  22679. // Don't raise the hwm > 1GB
  22680. var MAX_HWM = 0x40000000;
  22681. function computeNewHighWaterMark(n) {
  22682. if (n >= MAX_HWM) {
  22683. // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
  22684. n = MAX_HWM;
  22685. } else {
  22686. // Get the next highest power of 2 to prevent increasing hwm excessively in
  22687. // tiny amounts
  22688. n--;
  22689. n |= n >>> 1;
  22690. n |= n >>> 2;
  22691. n |= n >>> 4;
  22692. n |= n >>> 8;
  22693. n |= n >>> 16;
  22694. n++;
  22695. }
  22696. return n;
  22697. }
  22698. // This function is designed to be inlinable, so please take care when making
  22699. // changes to the function body.
  22700. function howMuchToRead(n, state) {
  22701. if (n <= 0 || state.length === 0 && state.ended) return 0;
  22702. if (state.objectMode) return 1;
  22703. if (n !== n) {
  22704. // Only flow one buffer at a time
  22705. if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
  22706. }
  22707. // If we're asking for more than the current hwm, then raise the hwm.
  22708. if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
  22709. if (n <= state.length) return n;
  22710. // Don't have enough
  22711. if (!state.ended) {
  22712. state.needReadable = true;
  22713. return 0;
  22714. }
  22715. return state.length;
  22716. }
  22717. // you can override either this method, or the async _read(n) below.
  22718. Readable.prototype.read = function (n) {
  22719. debug('read', n);
  22720. n = parseInt(n, 10);
  22721. var state = this._readableState;
  22722. var nOrig = n;
  22723. if (n !== 0) state.emittedReadable = false;
  22724. // if we're doing read(0) to trigger a readable event, but we
  22725. // already have a bunch of data in the buffer, then just trigger
  22726. // the 'readable' event and move on.
  22727. if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
  22728. debug('read: emitReadable', state.length, state.ended);
  22729. if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
  22730. return null;
  22731. }
  22732. n = howMuchToRead(n, state);
  22733. // if we've ended, and we're now clear, then finish it up.
  22734. if (n === 0 && state.ended) {
  22735. if (state.length === 0) endReadable(this);
  22736. return null;
  22737. }
  22738. // All the actual chunk generation logic needs to be
  22739. // *below* the call to _read. The reason is that in certain
  22740. // synthetic stream cases, such as passthrough streams, _read
  22741. // may be a completely synchronous operation which may change
  22742. // the state of the read buffer, providing enough data when
  22743. // before there was *not* enough.
  22744. //
  22745. // So, the steps are:
  22746. // 1. Figure out what the state of things will be after we do
  22747. // a read from the buffer.
  22748. //
  22749. // 2. If that resulting state will trigger a _read, then call _read.
  22750. // Note that this may be asynchronous, or synchronous. Yes, it is
  22751. // deeply ugly to write APIs this way, but that still doesn't mean
  22752. // that the Readable class should behave improperly, as streams are
  22753. // designed to be sync/async agnostic.
  22754. // Take note if the _read call is sync or async (ie, if the read call
  22755. // has returned yet), so that we know whether or not it's safe to emit
  22756. // 'readable' etc.
  22757. //
  22758. // 3. Actually pull the requested chunks out of the buffer and return.
  22759. // if we need a readable event, then we need to do some reading.
  22760. var doRead = state.needReadable;
  22761. debug('need readable', doRead);
  22762. // if we currently have less than the highWaterMark, then also read some
  22763. if (state.length === 0 || state.length - n < state.highWaterMark) {
  22764. doRead = true;
  22765. debug('length less than watermark', doRead);
  22766. }
  22767. // however, if we've ended, then there's no point, and if we're already
  22768. // reading, then it's unnecessary.
  22769. if (state.ended || state.reading) {
  22770. doRead = false;
  22771. debug('reading or ended', doRead);
  22772. } else if (doRead) {
  22773. debug('do read');
  22774. state.reading = true;
  22775. state.sync = true;
  22776. // if the length is currently zero, then we *need* a readable event.
  22777. if (state.length === 0) state.needReadable = true;
  22778. // call internal read method
  22779. this._read(state.highWaterMark);
  22780. state.sync = false;
  22781. // If _read pushed data synchronously, then `reading` will be false,
  22782. // and we need to re-evaluate how much data we can return to the user.
  22783. if (!state.reading) n = howMuchToRead(nOrig, state);
  22784. }
  22785. var ret;
  22786. if (n > 0) ret = fromList(n, state);else ret = null;
  22787. if (ret === null) {
  22788. state.needReadable = state.length <= state.highWaterMark;
  22789. n = 0;
  22790. } else {
  22791. state.length -= n;
  22792. state.awaitDrain = 0;
  22793. }
  22794. if (state.length === 0) {
  22795. // If we have nothing in the buffer, then we want to know
  22796. // as soon as we *do* get something into the buffer.
  22797. if (!state.ended) state.needReadable = true;
  22798. // If we tried to read() past the EOF, then emit end on the next tick.
  22799. if (nOrig !== n && state.ended) endReadable(this);
  22800. }
  22801. if (ret !== null) this.emit('data', ret);
  22802. return ret;
  22803. };
  22804. function onEofChunk(stream, state) {
  22805. debug('onEofChunk');
  22806. if (state.ended) return;
  22807. if (state.decoder) {
  22808. var chunk = state.decoder.end();
  22809. if (chunk && chunk.length) {
  22810. state.buffer.push(chunk);
  22811. state.length += state.objectMode ? 1 : chunk.length;
  22812. }
  22813. }
  22814. state.ended = true;
  22815. if (state.sync) {
  22816. // if we are sync, wait until next tick to emit the data.
  22817. // Otherwise we risk emitting data in the flow()
  22818. // the readable code triggers during a read() call
  22819. emitReadable(stream);
  22820. } else {
  22821. // emit 'readable' now to make sure it gets picked up.
  22822. state.needReadable = false;
  22823. if (!state.emittedReadable) {
  22824. state.emittedReadable = true;
  22825. emitReadable_(stream);
  22826. }
  22827. }
  22828. }
  22829. // Don't emit readable right away in sync mode, because this can trigger
  22830. // another read() call => stack overflow. This way, it might trigger
  22831. // a nextTick recursion warning, but that's not so bad.
  22832. function emitReadable(stream) {
  22833. var state = stream._readableState;
  22834. debug('emitReadable', state.needReadable, state.emittedReadable);
  22835. state.needReadable = false;
  22836. if (!state.emittedReadable) {
  22837. debug('emitReadable', state.flowing);
  22838. state.emittedReadable = true;
  22839. process.nextTick(emitReadable_, stream);
  22840. }
  22841. }
  22842. function emitReadable_(stream) {
  22843. var state = stream._readableState;
  22844. debug('emitReadable_', state.destroyed, state.length, state.ended);
  22845. if (!state.destroyed && (state.length || state.ended)) {
  22846. stream.emit('readable');
  22847. state.emittedReadable = false;
  22848. }
  22849. // The stream needs another readable event if
  22850. // 1. It is not flowing, as the flow mechanism will take
  22851. // care of it.
  22852. // 2. It is not ended.
  22853. // 3. It is below the highWaterMark, so we can schedule
  22854. // another readable later.
  22855. state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
  22856. flow(stream);
  22857. }
  22858. // at this point, the user has presumably seen the 'readable' event,
  22859. // and called read() to consume some data. that may have triggered
  22860. // in turn another _read(n) call, in which case reading = true if
  22861. // it's in progress.
  22862. // However, if we're not ended, or reading, and the length < hwm,
  22863. // then go ahead and try to read some more preemptively.
  22864. function maybeReadMore(stream, state) {
  22865. if (!state.readingMore) {
  22866. state.readingMore = true;
  22867. process.nextTick(maybeReadMore_, stream, state);
  22868. }
  22869. }
  22870. function maybeReadMore_(stream, state) {
  22871. // Attempt to read more data if we should.
  22872. //
  22873. // The conditions for reading more data are (one of):
  22874. // - Not enough data buffered (state.length < state.highWaterMark). The loop
  22875. // is responsible for filling the buffer with enough data if such data
  22876. // is available. If highWaterMark is 0 and we are not in the flowing mode
  22877. // we should _not_ attempt to buffer any extra data. We'll get more data
  22878. // when the stream consumer calls read() instead.
  22879. // - No data in the buffer, and the stream is in flowing mode. In this mode
  22880. // the loop below is responsible for ensuring read() is called. Failing to
  22881. // call read here would abort the flow and there's no other mechanism for
  22882. // continuing the flow if the stream consumer has just subscribed to the
  22883. // 'data' event.
  22884. //
  22885. // In addition to the above conditions to keep reading data, the following
  22886. // conditions prevent the data from being read:
  22887. // - The stream has ended (state.ended).
  22888. // - There is already a pending 'read' operation (state.reading). This is a
  22889. // case where the the stream has called the implementation defined _read()
  22890. // method, but they are processing the call asynchronously and have _not_
  22891. // called push() with new data. In this case we skip performing more
  22892. // read()s. The execution ends in this method again after the _read() ends
  22893. // up calling push() with more data.
  22894. while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
  22895. var len = state.length;
  22896. debug('maybeReadMore read 0');
  22897. stream.read(0);
  22898. if (len === state.length)
  22899. // didn't get any data, stop spinning.
  22900. break;
  22901. }
  22902. state.readingMore = false;
  22903. }
  22904. // abstract method. to be overridden in specific implementation classes.
  22905. // call cb(er, data) where data is <= n in length.
  22906. // for virtual (non-string, non-buffer) streams, "length" is somewhat
  22907. // arbitrary, and perhaps not very meaningful.
  22908. Readable.prototype._read = function (n) {
  22909. errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
  22910. };
  22911. Readable.prototype.pipe = function (dest, pipeOpts) {
  22912. var src = this;
  22913. var state = this._readableState;
  22914. switch (state.pipesCount) {
  22915. case 0:
  22916. state.pipes = dest;
  22917. break;
  22918. case 1:
  22919. state.pipes = [state.pipes, dest];
  22920. break;
  22921. default:
  22922. state.pipes.push(dest);
  22923. break;
  22924. }
  22925. state.pipesCount += 1;
  22926. debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
  22927. var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
  22928. var endFn = doEnd ? onend : unpipe;
  22929. if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
  22930. dest.on('unpipe', onunpipe);
  22931. function onunpipe(readable, unpipeInfo) {
  22932. debug('onunpipe');
  22933. if (readable === src) {
  22934. if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
  22935. unpipeInfo.hasUnpiped = true;
  22936. cleanup();
  22937. }
  22938. }
  22939. }
  22940. function onend() {
  22941. debug('onend');
  22942. dest.end();
  22943. }
  22944. // when the dest drains, it reduces the awaitDrain counter
  22945. // on the source. This would be more elegant with a .once()
  22946. // handler in flow(), but adding and removing repeatedly is
  22947. // too slow.
  22948. var ondrain = pipeOnDrain(src);
  22949. dest.on('drain', ondrain);
  22950. var cleanedUp = false;
  22951. function cleanup() {
  22952. debug('cleanup');
  22953. // cleanup event handlers once the pipe is broken
  22954. dest.removeListener('close', onclose);
  22955. dest.removeListener('finish', onfinish);
  22956. dest.removeListener('drain', ondrain);
  22957. dest.removeListener('error', onerror);
  22958. dest.removeListener('unpipe', onunpipe);
  22959. src.removeListener('end', onend);
  22960. src.removeListener('end', unpipe);
  22961. src.removeListener('data', ondata);
  22962. cleanedUp = true;
  22963. // if the reader is waiting for a drain event from this
  22964. // specific writer, then it would cause it to never start
  22965. // flowing again.
  22966. // So, if this is awaiting a drain, then we just call it now.
  22967. // If we don't know, then assume that we are waiting for one.
  22968. if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
  22969. }
  22970. src.on('data', ondata);
  22971. function ondata(chunk) {
  22972. debug('ondata');
  22973. var ret = dest.write(chunk);
  22974. debug('dest.write', ret);
  22975. if (ret === false) {
  22976. // If the user unpiped during `dest.write()`, it is possible
  22977. // to get stuck in a permanently paused state if that write
  22978. // also returned false.
  22979. // => Check whether `dest` is still a piping destination.
  22980. if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
  22981. debug('false write response, pause', state.awaitDrain);
  22982. state.awaitDrain++;
  22983. }
  22984. src.pause();
  22985. }
  22986. }
  22987. // if the dest has an error, then stop piping into it.
  22988. // however, don't suppress the throwing behavior for this.
  22989. function onerror(er) {
  22990. debug('onerror', er);
  22991. unpipe();
  22992. dest.removeListener('error', onerror);
  22993. if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
  22994. }
  22995. // Make sure our error handler is attached before userland ones.
  22996. prependListener(dest, 'error', onerror);
  22997. // Both close and finish should trigger unpipe, but only once.
  22998. function onclose() {
  22999. dest.removeListener('finish', onfinish);
  23000. unpipe();
  23001. }
  23002. dest.once('close', onclose);
  23003. function onfinish() {
  23004. debug('onfinish');
  23005. dest.removeListener('close', onclose);
  23006. unpipe();
  23007. }
  23008. dest.once('finish', onfinish);
  23009. function unpipe() {
  23010. debug('unpipe');
  23011. src.unpipe(dest);
  23012. }
  23013. // tell the dest that it's being piped to
  23014. dest.emit('pipe', src);
  23015. // start the flow if it hasn't been started already.
  23016. if (!state.flowing) {
  23017. debug('pipe resume');
  23018. src.resume();
  23019. }
  23020. return dest;
  23021. };
  23022. function pipeOnDrain(src) {
  23023. return function pipeOnDrainFunctionResult() {
  23024. var state = src._readableState;
  23025. debug('pipeOnDrain', state.awaitDrain);
  23026. if (state.awaitDrain) state.awaitDrain--;
  23027. if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
  23028. state.flowing = true;
  23029. flow(src);
  23030. }
  23031. };
  23032. }
  23033. Readable.prototype.unpipe = function (dest) {
  23034. var state = this._readableState;
  23035. var unpipeInfo = {
  23036. hasUnpiped: false
  23037. };
  23038. // if we're not piping anywhere, then do nothing.
  23039. if (state.pipesCount === 0) return this;
  23040. // just one destination. most common case.
  23041. if (state.pipesCount === 1) {
  23042. // passed in one, but it's not the right one.
  23043. if (dest && dest !== state.pipes) return this;
  23044. if (!dest) dest = state.pipes;
  23045. // got a match.
  23046. state.pipes = null;
  23047. state.pipesCount = 0;
  23048. state.flowing = false;
  23049. if (dest) dest.emit('unpipe', this, unpipeInfo);
  23050. return this;
  23051. }
  23052. // slow case. multiple pipe destinations.
  23053. if (!dest) {
  23054. // remove all.
  23055. var dests = state.pipes;
  23056. var len = state.pipesCount;
  23057. state.pipes = null;
  23058. state.pipesCount = 0;
  23059. state.flowing = false;
  23060. for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {
  23061. hasUnpiped: false
  23062. });
  23063. return this;
  23064. }
  23065. // try to find the right one.
  23066. var index = indexOf(state.pipes, dest);
  23067. if (index === -1) return this;
  23068. state.pipes.splice(index, 1);
  23069. state.pipesCount -= 1;
  23070. if (state.pipesCount === 1) state.pipes = state.pipes[0];
  23071. dest.emit('unpipe', this, unpipeInfo);
  23072. return this;
  23073. };
  23074. // set up data events if they are asked for
  23075. // Ensure readable listeners eventually get something
  23076. Readable.prototype.on = function (ev, fn) {
  23077. var res = Stream.prototype.on.call(this, ev, fn);
  23078. var state = this._readableState;
  23079. if (ev === 'data') {
  23080. // update readableListening so that resume() may be a no-op
  23081. // a few lines down. This is needed to support once('readable').
  23082. state.readableListening = this.listenerCount('readable') > 0;
  23083. // Try start flowing on next tick if stream isn't explicitly paused
  23084. if (state.flowing !== false) this.resume();
  23085. } else if (ev === 'readable') {
  23086. if (!state.endEmitted && !state.readableListening) {
  23087. state.readableListening = state.needReadable = true;
  23088. state.flowing = false;
  23089. state.emittedReadable = false;
  23090. debug('on readable', state.length, state.reading);
  23091. if (state.length) {
  23092. emitReadable(this);
  23093. } else if (!state.reading) {
  23094. process.nextTick(nReadingNextTick, this);
  23095. }
  23096. }
  23097. }
  23098. return res;
  23099. };
  23100. Readable.prototype.addListener = Readable.prototype.on;
  23101. Readable.prototype.removeListener = function (ev, fn) {
  23102. var res = Stream.prototype.removeListener.call(this, ev, fn);
  23103. if (ev === 'readable') {
  23104. // We need to check if there is someone still listening to
  23105. // readable and reset the state. However this needs to happen
  23106. // after readable has been emitted but before I/O (nextTick) to
  23107. // support once('readable', fn) cycles. This means that calling
  23108. // resume within the same tick will have no
  23109. // effect.
  23110. process.nextTick(updateReadableListening, this);
  23111. }
  23112. return res;
  23113. };
  23114. Readable.prototype.removeAllListeners = function (ev) {
  23115. var res = Stream.prototype.removeAllListeners.apply(this, arguments);
  23116. if (ev === 'readable' || ev === undefined) {
  23117. // We need to check if there is someone still listening to
  23118. // readable and reset the state. However this needs to happen
  23119. // after readable has been emitted but before I/O (nextTick) to
  23120. // support once('readable', fn) cycles. This means that calling
  23121. // resume within the same tick will have no
  23122. // effect.
  23123. process.nextTick(updateReadableListening, this);
  23124. }
  23125. return res;
  23126. };
  23127. function updateReadableListening(self) {
  23128. var state = self._readableState;
  23129. state.readableListening = self.listenerCount('readable') > 0;
  23130. if (state.resumeScheduled && !state.paused) {
  23131. // flowing needs to be set to true now, otherwise
  23132. // the upcoming resume will not flow.
  23133. state.flowing = true;
  23134. // crude way to check if we should resume
  23135. } else if (self.listenerCount('data') > 0) {
  23136. self.resume();
  23137. }
  23138. }
  23139. function nReadingNextTick(self) {
  23140. debug('readable nexttick read 0');
  23141. self.read(0);
  23142. }
  23143. // pause() and resume() are remnants of the legacy readable stream API
  23144. // If the user uses them, then switch into old mode.
  23145. Readable.prototype.resume = function () {
  23146. var state = this._readableState;
  23147. if (!state.flowing) {
  23148. debug('resume');
  23149. // we flow only if there is no one listening
  23150. // for readable, but we still have to call
  23151. // resume()
  23152. state.flowing = !state.readableListening;
  23153. resume(this, state);
  23154. }
  23155. state.paused = false;
  23156. return this;
  23157. };
  23158. function resume(stream, state) {
  23159. if (!state.resumeScheduled) {
  23160. state.resumeScheduled = true;
  23161. process.nextTick(resume_, stream, state);
  23162. }
  23163. }
  23164. function resume_(stream, state) {
  23165. debug('resume', state.reading);
  23166. if (!state.reading) {
  23167. stream.read(0);
  23168. }
  23169. state.resumeScheduled = false;
  23170. stream.emit('resume');
  23171. flow(stream);
  23172. if (state.flowing && !state.reading) stream.read(0);
  23173. }
  23174. Readable.prototype.pause = function () {
  23175. debug('call pause flowing=%j', this._readableState.flowing);
  23176. if (this._readableState.flowing !== false) {
  23177. debug('pause');
  23178. this._readableState.flowing = false;
  23179. this.emit('pause');
  23180. }
  23181. this._readableState.paused = true;
  23182. return this;
  23183. };
  23184. function flow(stream) {
  23185. var state = stream._readableState;
  23186. debug('flow', state.flowing);
  23187. while (state.flowing && stream.read() !== null);
  23188. }
  23189. // wrap an old-style stream as the async data source.
  23190. // This is *not* part of the readable stream interface.
  23191. // It is an ugly unfortunate mess of history.
  23192. Readable.prototype.wrap = function (stream) {
  23193. var _this = this;
  23194. var state = this._readableState;
  23195. var paused = false;
  23196. stream.on('end', function () {
  23197. debug('wrapped end');
  23198. if (state.decoder && !state.ended) {
  23199. var chunk = state.decoder.end();
  23200. if (chunk && chunk.length) _this.push(chunk);
  23201. }
  23202. _this.push(null);
  23203. });
  23204. stream.on('data', function (chunk) {
  23205. debug('wrapped data');
  23206. if (state.decoder) chunk = state.decoder.write(chunk);
  23207. // don't skip over falsy values in objectMode
  23208. if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
  23209. var ret = _this.push(chunk);
  23210. if (!ret) {
  23211. paused = true;
  23212. stream.pause();
  23213. }
  23214. });
  23215. // proxy all the other methods.
  23216. // important when wrapping filters and duplexes.
  23217. for (var i in stream) {
  23218. if (this[i] === undefined && typeof stream[i] === 'function') {
  23219. this[i] = function methodWrap(method) {
  23220. return function methodWrapReturnFunction() {
  23221. return stream[method].apply(stream, arguments);
  23222. };
  23223. }(i);
  23224. }
  23225. }
  23226. // proxy certain important events.
  23227. for (var n = 0; n < kProxyEvents.length; n++) {
  23228. stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
  23229. }
  23230. // when we try to consume some more bytes, simply unpause the
  23231. // underlying stream.
  23232. this._read = function (n) {
  23233. debug('wrapped _read', n);
  23234. if (paused) {
  23235. paused = false;
  23236. stream.resume();
  23237. }
  23238. };
  23239. return this;
  23240. };
  23241. if (typeof Symbol === 'function') {
  23242. Readable.prototype[Symbol.asyncIterator] = function () {
  23243. if (createReadableStreamAsyncIterator === undefined) {
  23244. createReadableStreamAsyncIterator = __webpack_require__(828);
  23245. }
  23246. return createReadableStreamAsyncIterator(this);
  23247. };
  23248. }
  23249. Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
  23250. // making it explicit this property is not enumerable
  23251. // because otherwise some prototype manipulation in
  23252. // userland will fail
  23253. enumerable: false,
  23254. get: function get() {
  23255. return this._readableState.highWaterMark;
  23256. }
  23257. });
  23258. Object.defineProperty(Readable.prototype, 'readableBuffer', {
  23259. // making it explicit this property is not enumerable
  23260. // because otherwise some prototype manipulation in
  23261. // userland will fail
  23262. enumerable: false,
  23263. get: function get() {
  23264. return this._readableState && this._readableState.buffer;
  23265. }
  23266. });
  23267. Object.defineProperty(Readable.prototype, 'readableFlowing', {
  23268. // making it explicit this property is not enumerable
  23269. // because otherwise some prototype manipulation in
  23270. // userland will fail
  23271. enumerable: false,
  23272. get: function get() {
  23273. return this._readableState.flowing;
  23274. },
  23275. set: function set(state) {
  23276. if (this._readableState) {
  23277. this._readableState.flowing = state;
  23278. }
  23279. }
  23280. });
  23281. // exposed for testing purposes only.
  23282. Readable._fromList = fromList;
  23283. Object.defineProperty(Readable.prototype, 'readableLength', {
  23284. // making it explicit this property is not enumerable
  23285. // because otherwise some prototype manipulation in
  23286. // userland will fail
  23287. enumerable: false,
  23288. get: function get() {
  23289. return this._readableState.length;
  23290. }
  23291. });
  23292. // Pluck off n bytes from an array of buffers.
  23293. // Length is the combined lengths of all the buffers in the list.
  23294. // This function is designed to be inlinable, so please take care when making
  23295. // changes to the function body.
  23296. function fromList(n, state) {
  23297. // nothing buffered
  23298. if (state.length === 0) return null;
  23299. var ret;
  23300. if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
  23301. // read it all, truncate the list
  23302. if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
  23303. state.buffer.clear();
  23304. } else {
  23305. // read part of list
  23306. ret = state.buffer.consume(n, state.decoder);
  23307. }
  23308. return ret;
  23309. }
  23310. function endReadable(stream) {
  23311. var state = stream._readableState;
  23312. debug('endReadable', state.endEmitted);
  23313. if (!state.endEmitted) {
  23314. state.ended = true;
  23315. process.nextTick(endReadableNT, state, stream);
  23316. }
  23317. }
  23318. function endReadableNT(state, stream) {
  23319. debug('endReadableNT', state.endEmitted, state.length);
  23320. // Check that we didn't get one last unshift.
  23321. if (!state.endEmitted && state.length === 0) {
  23322. state.endEmitted = true;
  23323. stream.readable = false;
  23324. stream.emit('end');
  23325. if (state.autoDestroy) {
  23326. // In case of duplex streams we need a way to detect
  23327. // if the writable side is ready for autoDestroy as well
  23328. var wState = stream._writableState;
  23329. if (!wState || wState.autoDestroy && wState.finished) {
  23330. stream.destroy();
  23331. }
  23332. }
  23333. }
  23334. }
  23335. if (typeof Symbol === 'function') {
  23336. Readable.from = function (iterable, opts) {
  23337. if (from === undefined) {
  23338. from = __webpack_require__(1265);
  23339. }
  23340. return from(Readable, iterable, opts);
  23341. };
  23342. }
  23343. function indexOf(xs, x) {
  23344. for (var i = 0, l = xs.length; i < l; i++) {
  23345. if (xs[i] === x) return i;
  23346. }
  23347. return -1;
  23348. }
  23349. /***/ }),
  23350. /***/ 4473:
  23351. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  23352. "use strict";
  23353. // Copyright Joyent, Inc. and other Node contributors.
  23354. //
  23355. // Permission is hereby granted, free of charge, to any person obtaining a
  23356. // copy of this software and associated documentation files (the
  23357. // "Software"), to deal in the Software without restriction, including
  23358. // without limitation the rights to use, copy, modify, merge, publish,
  23359. // distribute, sublicense, and/or sell copies of the Software, and to permit
  23360. // persons to whom the Software is furnished to do so, subject to the
  23361. // following conditions:
  23362. //
  23363. // The above copyright notice and this permission notice shall be included
  23364. // in all copies or substantial portions of the Software.
  23365. //
  23366. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  23367. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23368. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  23369. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  23370. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  23371. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  23372. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  23373. // a transform stream is a readable/writable stream where you do
  23374. // something with the data. Sometimes it's called a "filter",
  23375. // but that's not a great name for it, since that implies a thing where
  23376. // some bits pass through, and others are simply ignored. (That would
  23377. // be a valid example of a transform, of course.)
  23378. //
  23379. // While the output is causally related to the input, it's not a
  23380. // necessarily symmetric or synchronous transformation. For example,
  23381. // a zlib stream might take multiple plain-text writes(), and then
  23382. // emit a single compressed chunk some time in the future.
  23383. //
  23384. // Here's how this works:
  23385. //
  23386. // The Transform stream has all the aspects of the readable and writable
  23387. // stream classes. When you write(chunk), that calls _write(chunk,cb)
  23388. // internally, and returns false if there's a lot of pending writes
  23389. // buffered up. When you call read(), that calls _read(n) until
  23390. // there's enough pending readable data buffered up.
  23391. //
  23392. // In a transform stream, the written data is placed in a buffer. When
  23393. // _read(n) is called, it transforms the queued up data, calling the
  23394. // buffered _write cb's as it consumes chunks. If consuming a single
  23395. // written chunk would result in multiple output chunks, then the first
  23396. // outputted bit calls the readcb, and subsequent chunks just go into
  23397. // the read buffer, and will cause it to emit 'readable' if necessary.
  23398. //
  23399. // This way, back-pressure is actually determined by the reading side,
  23400. // since _read has to be called to start processing a new chunk. However,
  23401. // a pathological inflate type of transform can cause excessive buffering
  23402. // here. For example, imagine a stream where every byte of input is
  23403. // interpreted as an integer from 0-255, and then results in that many
  23404. // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
  23405. // 1kb of data being output. In this case, you could write a very small
  23406. // amount of input, and end up with a very large amount of output. In
  23407. // such a pathological inflating mechanism, there'd be no way to tell
  23408. // the system to stop doing the transform. A single 4MB write could
  23409. // cause the system to run out of memory.
  23410. //
  23411. // However, even in such a pathological case, only a single written chunk
  23412. // would be consumed, and then the rest would wait (un-transformed) until
  23413. // the results of the previous transformed chunk were consumed.
  23414. module.exports = Transform;
  23415. var _require$codes = (__webpack_require__(8106)/* .codes */ .q),
  23416. ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  23417. ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
  23418. ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
  23419. ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
  23420. var Duplex = __webpack_require__(8656);
  23421. __webpack_require__(5717)(Transform, Duplex);
  23422. function afterTransform(er, data) {
  23423. var ts = this._transformState;
  23424. ts.transforming = false;
  23425. var cb = ts.writecb;
  23426. if (cb === null) {
  23427. return this.emit('error', new ERR_MULTIPLE_CALLBACK());
  23428. }
  23429. ts.writechunk = null;
  23430. ts.writecb = null;
  23431. if (data != null)
  23432. // single equals check for both `null` and `undefined`
  23433. this.push(data);
  23434. cb(er);
  23435. var rs = this._readableState;
  23436. rs.reading = false;
  23437. if (rs.needReadable || rs.length < rs.highWaterMark) {
  23438. this._read(rs.highWaterMark);
  23439. }
  23440. }
  23441. function Transform(options) {
  23442. if (!(this instanceof Transform)) return new Transform(options);
  23443. Duplex.call(this, options);
  23444. this._transformState = {
  23445. afterTransform: afterTransform.bind(this),
  23446. needTransform: false,
  23447. transforming: false,
  23448. writecb: null,
  23449. writechunk: null,
  23450. writeencoding: null
  23451. };
  23452. // start out asking for a readable event once data is transformed.
  23453. this._readableState.needReadable = true;
  23454. // we have implemented the _read method, and done the other things
  23455. // that Readable wants before the first _read call, so unset the
  23456. // sync guard flag.
  23457. this._readableState.sync = false;
  23458. if (options) {
  23459. if (typeof options.transform === 'function') this._transform = options.transform;
  23460. if (typeof options.flush === 'function') this._flush = options.flush;
  23461. }
  23462. // When the writable side finishes, then flush out anything remaining.
  23463. this.on('prefinish', prefinish);
  23464. }
  23465. function prefinish() {
  23466. var _this = this;
  23467. if (typeof this._flush === 'function' && !this._readableState.destroyed) {
  23468. this._flush(function (er, data) {
  23469. done(_this, er, data);
  23470. });
  23471. } else {
  23472. done(this, null, null);
  23473. }
  23474. }
  23475. Transform.prototype.push = function (chunk, encoding) {
  23476. this._transformState.needTransform = false;
  23477. return Duplex.prototype.push.call(this, chunk, encoding);
  23478. };
  23479. // This is the part where you do stuff!
  23480. // override this function in implementation classes.
  23481. // 'chunk' is an input chunk.
  23482. //
  23483. // Call `push(newChunk)` to pass along transformed output
  23484. // to the readable side. You may call 'push' zero or more times.
  23485. //
  23486. // Call `cb(err)` when you are done with this chunk. If you pass
  23487. // an error, then that'll put the hurt on the whole operation. If you
  23488. // never call cb(), then you'll never get another chunk.
  23489. Transform.prototype._transform = function (chunk, encoding, cb) {
  23490. cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
  23491. };
  23492. Transform.prototype._write = function (chunk, encoding, cb) {
  23493. var ts = this._transformState;
  23494. ts.writecb = cb;
  23495. ts.writechunk = chunk;
  23496. ts.writeencoding = encoding;
  23497. if (!ts.transforming) {
  23498. var rs = this._readableState;
  23499. if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
  23500. }
  23501. };
  23502. // Doesn't matter what the args are here.
  23503. // _transform does all the work.
  23504. // That we got here means that the readable side wants more data.
  23505. Transform.prototype._read = function (n) {
  23506. var ts = this._transformState;
  23507. if (ts.writechunk !== null && !ts.transforming) {
  23508. ts.transforming = true;
  23509. this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
  23510. } else {
  23511. // mark that we need a transform, so that any data that comes in
  23512. // will get processed, now that we've asked for it.
  23513. ts.needTransform = true;
  23514. }
  23515. };
  23516. Transform.prototype._destroy = function (err, cb) {
  23517. Duplex.prototype._destroy.call(this, err, function (err2) {
  23518. cb(err2);
  23519. });
  23520. };
  23521. function done(stream, er, data) {
  23522. if (er) return stream.emit('error', er);
  23523. if (data != null)
  23524. // single equals check for both `null` and `undefined`
  23525. stream.push(data);
  23526. // TODO(BridgeAR): Write a test for these two error cases
  23527. // if there's nothing in the write buffer, then that means
  23528. // that nothing more will ever be provided
  23529. if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
  23530. if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
  23531. return stream.push(null);
  23532. }
  23533. /***/ }),
  23534. /***/ 323:
  23535. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  23536. "use strict";
  23537. // Copyright Joyent, Inc. and other Node contributors.
  23538. //
  23539. // Permission is hereby granted, free of charge, to any person obtaining a
  23540. // copy of this software and associated documentation files (the
  23541. // "Software"), to deal in the Software without restriction, including
  23542. // without limitation the rights to use, copy, modify, merge, publish,
  23543. // distribute, sublicense, and/or sell copies of the Software, and to permit
  23544. // persons to whom the Software is furnished to do so, subject to the
  23545. // following conditions:
  23546. //
  23547. // The above copyright notice and this permission notice shall be included
  23548. // in all copies or substantial portions of the Software.
  23549. //
  23550. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  23551. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23552. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  23553. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  23554. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  23555. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  23556. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  23557. // A bit simpler than readable streams.
  23558. // Implement an async ._write(chunk, encoding, cb), and it'll handle all
  23559. // the drain event emission and buffering.
  23560. module.exports = Writable;
  23561. /* <replacement> */
  23562. function WriteReq(chunk, encoding, cb) {
  23563. this.chunk = chunk;
  23564. this.encoding = encoding;
  23565. this.callback = cb;
  23566. this.next = null;
  23567. }
  23568. // It seems a linked list but it is not
  23569. // there will be only 2 of these for each stream
  23570. function CorkedRequest(state) {
  23571. var _this = this;
  23572. this.next = null;
  23573. this.entry = null;
  23574. this.finish = function () {
  23575. onCorkedFinish(_this, state);
  23576. };
  23577. }
  23578. /* </replacement> */
  23579. /*<replacement>*/
  23580. var Duplex;
  23581. /*</replacement>*/
  23582. Writable.WritableState = WritableState;
  23583. /*<replacement>*/
  23584. var internalUtil = {
  23585. deprecate: __webpack_require__(4927)
  23586. };
  23587. /*</replacement>*/
  23588. /*<replacement>*/
  23589. var Stream = __webpack_require__(3194);
  23590. /*</replacement>*/
  23591. var Buffer = (__webpack_require__(2860).Buffer);
  23592. var OurUint8Array = (typeof __webpack_require__.g !== 'undefined' ? __webpack_require__.g : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
  23593. function _uint8ArrayToBuffer(chunk) {
  23594. return Buffer.from(chunk);
  23595. }
  23596. function _isUint8Array(obj) {
  23597. return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
  23598. }
  23599. var destroyImpl = __webpack_require__(1029);
  23600. var _require = __webpack_require__(94),
  23601. getHighWaterMark = _require.getHighWaterMark;
  23602. var _require$codes = (__webpack_require__(8106)/* .codes */ .q),
  23603. ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
  23604. ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
  23605. ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
  23606. ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
  23607. ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
  23608. ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
  23609. ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
  23610. ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
  23611. var errorOrDestroy = destroyImpl.errorOrDestroy;
  23612. __webpack_require__(5717)(Writable, Stream);
  23613. function nop() {}
  23614. function WritableState(options, stream, isDuplex) {
  23615. Duplex = Duplex || __webpack_require__(8656);
  23616. options = options || {};
  23617. // Duplex streams are both readable and writable, but share
  23618. // the same options object.
  23619. // However, some cases require setting options to different
  23620. // values for the readable and the writable sides of the duplex stream,
  23621. // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
  23622. if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
  23623. // object stream flag to indicate whether or not this stream
  23624. // contains buffers or objects.
  23625. this.objectMode = !!options.objectMode;
  23626. if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
  23627. // the point at which write() starts returning false
  23628. // Note: 0 is a valid value, means that we always return false if
  23629. // the entire buffer is not flushed immediately on write()
  23630. this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);
  23631. // if _final has been called
  23632. this.finalCalled = false;
  23633. // drain event flag.
  23634. this.needDrain = false;
  23635. // at the start of calling end()
  23636. this.ending = false;
  23637. // when end() has been called, and returned
  23638. this.ended = false;
  23639. // when 'finish' is emitted
  23640. this.finished = false;
  23641. // has it been destroyed
  23642. this.destroyed = false;
  23643. // should we decode strings into buffers before passing to _write?
  23644. // this is here so that some node-core streams can optimize string
  23645. // handling at a lower level.
  23646. var noDecode = options.decodeStrings === false;
  23647. this.decodeStrings = !noDecode;
  23648. // Crypto is kind of old and crusty. Historically, its default string
  23649. // encoding is 'binary' so we have to make this configurable.
  23650. // Everything else in the universe uses 'utf8', though.
  23651. this.defaultEncoding = options.defaultEncoding || 'utf8';
  23652. // not an actual buffer we keep track of, but a measurement
  23653. // of how much we're waiting to get pushed to some underlying
  23654. // socket or file.
  23655. this.length = 0;
  23656. // a flag to see when we're in the middle of a write.
  23657. this.writing = false;
  23658. // when true all writes will be buffered until .uncork() call
  23659. this.corked = 0;
  23660. // a flag to be able to tell if the onwrite cb is called immediately,
  23661. // or on a later tick. We set this to true at first, because any
  23662. // actions that shouldn't happen until "later" should generally also
  23663. // not happen before the first write call.
  23664. this.sync = true;
  23665. // a flag to know if we're processing previously buffered items, which
  23666. // may call the _write() callback in the same tick, so that we don't
  23667. // end up in an overlapped onwrite situation.
  23668. this.bufferProcessing = false;
  23669. // the callback that's passed to _write(chunk,cb)
  23670. this.onwrite = function (er) {
  23671. onwrite(stream, er);
  23672. };
  23673. // the callback that the user supplies to write(chunk,encoding,cb)
  23674. this.writecb = null;
  23675. // the amount that is being written when _write is called.
  23676. this.writelen = 0;
  23677. this.bufferedRequest = null;
  23678. this.lastBufferedRequest = null;
  23679. // number of pending user-supplied write callbacks
  23680. // this must be 0 before 'finish' can be emitted
  23681. this.pendingcb = 0;
  23682. // emit prefinish if the only thing we're waiting for is _write cbs
  23683. // This is relevant for synchronous Transform streams
  23684. this.prefinished = false;
  23685. // True if the error was already emitted and should not be thrown again
  23686. this.errorEmitted = false;
  23687. // Should close be emitted on destroy. Defaults to true.
  23688. this.emitClose = options.emitClose !== false;
  23689. // Should .destroy() be called after 'finish' (and potentially 'end')
  23690. this.autoDestroy = !!options.autoDestroy;
  23691. // count buffered requests
  23692. this.bufferedRequestCount = 0;
  23693. // allocate the first CorkedRequest, there is always
  23694. // one allocated and free to use, and we maintain at most two
  23695. this.corkedRequestsFree = new CorkedRequest(this);
  23696. }
  23697. WritableState.prototype.getBuffer = function getBuffer() {
  23698. var current = this.bufferedRequest;
  23699. var out = [];
  23700. while (current) {
  23701. out.push(current);
  23702. current = current.next;
  23703. }
  23704. return out;
  23705. };
  23706. (function () {
  23707. try {
  23708. Object.defineProperty(WritableState.prototype, 'buffer', {
  23709. get: internalUtil.deprecate(function writableStateBufferGetter() {
  23710. return this.getBuffer();
  23711. }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
  23712. });
  23713. } catch (_) {}
  23714. })();
  23715. // Test _writableState for inheritance to account for Duplex streams,
  23716. // whose prototype chain only points to Readable.
  23717. var realHasInstance;
  23718. if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
  23719. realHasInstance = Function.prototype[Symbol.hasInstance];
  23720. Object.defineProperty(Writable, Symbol.hasInstance, {
  23721. value: function value(object) {
  23722. if (realHasInstance.call(this, object)) return true;
  23723. if (this !== Writable) return false;
  23724. return object && object._writableState instanceof WritableState;
  23725. }
  23726. });
  23727. } else {
  23728. realHasInstance = function realHasInstance(object) {
  23729. return object instanceof this;
  23730. };
  23731. }
  23732. function Writable(options) {
  23733. Duplex = Duplex || __webpack_require__(8656);
  23734. // Writable ctor is applied to Duplexes, too.
  23735. // `realHasInstance` is necessary because using plain `instanceof`
  23736. // would return false, as no `_writableState` property is attached.
  23737. // Trying to use the custom `instanceof` for Writable here will also break the
  23738. // Node.js LazyTransform implementation, which has a non-trivial getter for
  23739. // `_writableState` that would lead to infinite recursion.
  23740. // Checking for a Stream.Duplex instance is faster here instead of inside
  23741. // the WritableState constructor, at least with V8 6.5
  23742. var isDuplex = this instanceof Duplex;
  23743. if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
  23744. this._writableState = new WritableState(options, this, isDuplex);
  23745. // legacy.
  23746. this.writable = true;
  23747. if (options) {
  23748. if (typeof options.write === 'function') this._write = options.write;
  23749. if (typeof options.writev === 'function') this._writev = options.writev;
  23750. if (typeof options.destroy === 'function') this._destroy = options.destroy;
  23751. if (typeof options.final === 'function') this._final = options.final;
  23752. }
  23753. Stream.call(this);
  23754. }
  23755. // Otherwise people can pipe Writable streams, which is just wrong.
  23756. Writable.prototype.pipe = function () {
  23757. errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
  23758. };
  23759. function writeAfterEnd(stream, cb) {
  23760. var er = new ERR_STREAM_WRITE_AFTER_END();
  23761. // TODO: defer error events consistently everywhere, not just the cb
  23762. errorOrDestroy(stream, er);
  23763. process.nextTick(cb, er);
  23764. }
  23765. // Checks that a user-supplied chunk is valid, especially for the particular
  23766. // mode the stream is in. Currently this means that `null` is never accepted
  23767. // and undefined/non-string values are only allowed in object mode.
  23768. function validChunk(stream, state, chunk, cb) {
  23769. var er;
  23770. if (chunk === null) {
  23771. er = new ERR_STREAM_NULL_VALUES();
  23772. } else if (typeof chunk !== 'string' && !state.objectMode) {
  23773. er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
  23774. }
  23775. if (er) {
  23776. errorOrDestroy(stream, er);
  23777. process.nextTick(cb, er);
  23778. return false;
  23779. }
  23780. return true;
  23781. }
  23782. Writable.prototype.write = function (chunk, encoding, cb) {
  23783. var state = this._writableState;
  23784. var ret = false;
  23785. var isBuf = !state.objectMode && _isUint8Array(chunk);
  23786. if (isBuf && !Buffer.isBuffer(chunk)) {
  23787. chunk = _uint8ArrayToBuffer(chunk);
  23788. }
  23789. if (typeof encoding === 'function') {
  23790. cb = encoding;
  23791. encoding = null;
  23792. }
  23793. if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
  23794. if (typeof cb !== 'function') cb = nop;
  23795. if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
  23796. state.pendingcb++;
  23797. ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
  23798. }
  23799. return ret;
  23800. };
  23801. Writable.prototype.cork = function () {
  23802. this._writableState.corked++;
  23803. };
  23804. Writable.prototype.uncork = function () {
  23805. var state = this._writableState;
  23806. if (state.corked) {
  23807. state.corked--;
  23808. if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
  23809. }
  23810. };
  23811. Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
  23812. // node::ParseEncoding() requires lower case.
  23813. if (typeof encoding === 'string') encoding = encoding.toLowerCase();
  23814. if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
  23815. this._writableState.defaultEncoding = encoding;
  23816. return this;
  23817. };
  23818. Object.defineProperty(Writable.prototype, 'writableBuffer', {
  23819. // making it explicit this property is not enumerable
  23820. // because otherwise some prototype manipulation in
  23821. // userland will fail
  23822. enumerable: false,
  23823. get: function get() {
  23824. return this._writableState && this._writableState.getBuffer();
  23825. }
  23826. });
  23827. function decodeChunk(state, chunk, encoding) {
  23828. if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
  23829. chunk = Buffer.from(chunk, encoding);
  23830. }
  23831. return chunk;
  23832. }
  23833. Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
  23834. // making it explicit this property is not enumerable
  23835. // because otherwise some prototype manipulation in
  23836. // userland will fail
  23837. enumerable: false,
  23838. get: function get() {
  23839. return this._writableState.highWaterMark;
  23840. }
  23841. });
  23842. // if we're already writing something, then just put this
  23843. // in the queue, and wait our turn. Otherwise, call _write
  23844. // If we return false, then we need a drain event, so set that flag.
  23845. function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  23846. if (!isBuf) {
  23847. var newChunk = decodeChunk(state, chunk, encoding);
  23848. if (chunk !== newChunk) {
  23849. isBuf = true;
  23850. encoding = 'buffer';
  23851. chunk = newChunk;
  23852. }
  23853. }
  23854. var len = state.objectMode ? 1 : chunk.length;
  23855. state.length += len;
  23856. var ret = state.length < state.highWaterMark;
  23857. // we must ensure that previous needDrain will not be reset to false.
  23858. if (!ret) state.needDrain = true;
  23859. if (state.writing || state.corked) {
  23860. var last = state.lastBufferedRequest;
  23861. state.lastBufferedRequest = {
  23862. chunk: chunk,
  23863. encoding: encoding,
  23864. isBuf: isBuf,
  23865. callback: cb,
  23866. next: null
  23867. };
  23868. if (last) {
  23869. last.next = state.lastBufferedRequest;
  23870. } else {
  23871. state.bufferedRequest = state.lastBufferedRequest;
  23872. }
  23873. state.bufferedRequestCount += 1;
  23874. } else {
  23875. doWrite(stream, state, false, len, chunk, encoding, cb);
  23876. }
  23877. return ret;
  23878. }
  23879. function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  23880. state.writelen = len;
  23881. state.writecb = cb;
  23882. state.writing = true;
  23883. state.sync = true;
  23884. if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
  23885. state.sync = false;
  23886. }
  23887. function onwriteError(stream, state, sync, er, cb) {
  23888. --state.pendingcb;
  23889. if (sync) {
  23890. // defer the callback if we are being called synchronously
  23891. // to avoid piling up things on the stack
  23892. process.nextTick(cb, er);
  23893. // this can emit finish, and it will always happen
  23894. // after error
  23895. process.nextTick(finishMaybe, stream, state);
  23896. stream._writableState.errorEmitted = true;
  23897. errorOrDestroy(stream, er);
  23898. } else {
  23899. // the caller expect this to happen before if
  23900. // it is async
  23901. cb(er);
  23902. stream._writableState.errorEmitted = true;
  23903. errorOrDestroy(stream, er);
  23904. // this can emit finish, but finish must
  23905. // always follow error
  23906. finishMaybe(stream, state);
  23907. }
  23908. }
  23909. function onwriteStateUpdate(state) {
  23910. state.writing = false;
  23911. state.writecb = null;
  23912. state.length -= state.writelen;
  23913. state.writelen = 0;
  23914. }
  23915. function onwrite(stream, er) {
  23916. var state = stream._writableState;
  23917. var sync = state.sync;
  23918. var cb = state.writecb;
  23919. if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
  23920. onwriteStateUpdate(state);
  23921. if (er) onwriteError(stream, state, sync, er, cb);else {
  23922. // Check if we're actually ready to finish, but don't emit yet
  23923. var finished = needFinish(state) || stream.destroyed;
  23924. if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
  23925. clearBuffer(stream, state);
  23926. }
  23927. if (sync) {
  23928. process.nextTick(afterWrite, stream, state, finished, cb);
  23929. } else {
  23930. afterWrite(stream, state, finished, cb);
  23931. }
  23932. }
  23933. }
  23934. function afterWrite(stream, state, finished, cb) {
  23935. if (!finished) onwriteDrain(stream, state);
  23936. state.pendingcb--;
  23937. cb();
  23938. finishMaybe(stream, state);
  23939. }
  23940. // Must force callback to be called on nextTick, so that we don't
  23941. // emit 'drain' before the write() consumer gets the 'false' return
  23942. // value, and has a chance to attach a 'drain' listener.
  23943. function onwriteDrain(stream, state) {
  23944. if (state.length === 0 && state.needDrain) {
  23945. state.needDrain = false;
  23946. stream.emit('drain');
  23947. }
  23948. }
  23949. // if there's something in the buffer waiting, then process it
  23950. function clearBuffer(stream, state) {
  23951. state.bufferProcessing = true;
  23952. var entry = state.bufferedRequest;
  23953. if (stream._writev && entry && entry.next) {
  23954. // Fast case, write everything using _writev()
  23955. var l = state.bufferedRequestCount;
  23956. var buffer = new Array(l);
  23957. var holder = state.corkedRequestsFree;
  23958. holder.entry = entry;
  23959. var count = 0;
  23960. var allBuffers = true;
  23961. while (entry) {
  23962. buffer[count] = entry;
  23963. if (!entry.isBuf) allBuffers = false;
  23964. entry = entry.next;
  23965. count += 1;
  23966. }
  23967. buffer.allBuffers = allBuffers;
  23968. doWrite(stream, state, true, state.length, buffer, '', holder.finish);
  23969. // doWrite is almost always async, defer these to save a bit of time
  23970. // as the hot path ends with doWrite
  23971. state.pendingcb++;
  23972. state.lastBufferedRequest = null;
  23973. if (holder.next) {
  23974. state.corkedRequestsFree = holder.next;
  23975. holder.next = null;
  23976. } else {
  23977. state.corkedRequestsFree = new CorkedRequest(state);
  23978. }
  23979. state.bufferedRequestCount = 0;
  23980. } else {
  23981. // Slow case, write chunks one-by-one
  23982. while (entry) {
  23983. var chunk = entry.chunk;
  23984. var encoding = entry.encoding;
  23985. var cb = entry.callback;
  23986. var len = state.objectMode ? 1 : chunk.length;
  23987. doWrite(stream, state, false, len, chunk, encoding, cb);
  23988. entry = entry.next;
  23989. state.bufferedRequestCount--;
  23990. // if we didn't call the onwrite immediately, then
  23991. // it means that we need to wait until it does.
  23992. // also, that means that the chunk and cb are currently
  23993. // being processed, so move the buffer counter past them.
  23994. if (state.writing) {
  23995. break;
  23996. }
  23997. }
  23998. if (entry === null) state.lastBufferedRequest = null;
  23999. }
  24000. state.bufferedRequest = entry;
  24001. state.bufferProcessing = false;
  24002. }
  24003. Writable.prototype._write = function (chunk, encoding, cb) {
  24004. cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
  24005. };
  24006. Writable.prototype._writev = null;
  24007. Writable.prototype.end = function (chunk, encoding, cb) {
  24008. var state = this._writableState;
  24009. if (typeof chunk === 'function') {
  24010. cb = chunk;
  24011. chunk = null;
  24012. encoding = null;
  24013. } else if (typeof encoding === 'function') {
  24014. cb = encoding;
  24015. encoding = null;
  24016. }
  24017. if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
  24018. // .end() fully uncorks
  24019. if (state.corked) {
  24020. state.corked = 1;
  24021. this.uncork();
  24022. }
  24023. // ignore unnecessary end() calls.
  24024. if (!state.ending) endWritable(this, state, cb);
  24025. return this;
  24026. };
  24027. Object.defineProperty(Writable.prototype, 'writableLength', {
  24028. // making it explicit this property is not enumerable
  24029. // because otherwise some prototype manipulation in
  24030. // userland will fail
  24031. enumerable: false,
  24032. get: function get() {
  24033. return this._writableState.length;
  24034. }
  24035. });
  24036. function needFinish(state) {
  24037. return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
  24038. }
  24039. function callFinal(stream, state) {
  24040. stream._final(function (err) {
  24041. state.pendingcb--;
  24042. if (err) {
  24043. errorOrDestroy(stream, err);
  24044. }
  24045. state.prefinished = true;
  24046. stream.emit('prefinish');
  24047. finishMaybe(stream, state);
  24048. });
  24049. }
  24050. function prefinish(stream, state) {
  24051. if (!state.prefinished && !state.finalCalled) {
  24052. if (typeof stream._final === 'function' && !state.destroyed) {
  24053. state.pendingcb++;
  24054. state.finalCalled = true;
  24055. process.nextTick(callFinal, stream, state);
  24056. } else {
  24057. state.prefinished = true;
  24058. stream.emit('prefinish');
  24059. }
  24060. }
  24061. }
  24062. function finishMaybe(stream, state) {
  24063. var need = needFinish(state);
  24064. if (need) {
  24065. prefinish(stream, state);
  24066. if (state.pendingcb === 0) {
  24067. state.finished = true;
  24068. stream.emit('finish');
  24069. if (state.autoDestroy) {
  24070. // In case of duplex streams we need a way to detect
  24071. // if the readable side is ready for autoDestroy as well
  24072. var rState = stream._readableState;
  24073. if (!rState || rState.autoDestroy && rState.endEmitted) {
  24074. stream.destroy();
  24075. }
  24076. }
  24077. }
  24078. }
  24079. return need;
  24080. }
  24081. function endWritable(stream, state, cb) {
  24082. state.ending = true;
  24083. finishMaybe(stream, state);
  24084. if (cb) {
  24085. if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
  24086. }
  24087. state.ended = true;
  24088. stream.writable = false;
  24089. }
  24090. function onCorkedFinish(corkReq, state, err) {
  24091. var entry = corkReq.entry;
  24092. corkReq.entry = null;
  24093. while (entry) {
  24094. var cb = entry.callback;
  24095. state.pendingcb--;
  24096. cb(err);
  24097. entry = entry.next;
  24098. }
  24099. // reuse the free corkReq.
  24100. state.corkedRequestsFree.next = corkReq;
  24101. }
  24102. Object.defineProperty(Writable.prototype, 'destroyed', {
  24103. // making it explicit this property is not enumerable
  24104. // because otherwise some prototype manipulation in
  24105. // userland will fail
  24106. enumerable: false,
  24107. get: function get() {
  24108. if (this._writableState === undefined) {
  24109. return false;
  24110. }
  24111. return this._writableState.destroyed;
  24112. },
  24113. set: function set(value) {
  24114. // we ignore the value if the stream
  24115. // has not been initialized yet
  24116. if (!this._writableState) {
  24117. return;
  24118. }
  24119. // backward compatibility, the user is explicitly
  24120. // managing destroyed
  24121. this._writableState.destroyed = value;
  24122. }
  24123. });
  24124. Writable.prototype.destroy = destroyImpl.destroy;
  24125. Writable.prototype._undestroy = destroyImpl.undestroy;
  24126. Writable.prototype._destroy = function (err, cb) {
  24127. cb(err);
  24128. };
  24129. /***/ }),
  24130. /***/ 828:
  24131. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24132. "use strict";
  24133. var _Object$setPrototypeO;
  24134. function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  24135. function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
  24136. function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
  24137. var finished = __webpack_require__(1086);
  24138. var kLastResolve = Symbol('lastResolve');
  24139. var kLastReject = Symbol('lastReject');
  24140. var kError = Symbol('error');
  24141. var kEnded = Symbol('ended');
  24142. var kLastPromise = Symbol('lastPromise');
  24143. var kHandlePromise = Symbol('handlePromise');
  24144. var kStream = Symbol('stream');
  24145. function createIterResult(value, done) {
  24146. return {
  24147. value: value,
  24148. done: done
  24149. };
  24150. }
  24151. function readAndResolve(iter) {
  24152. var resolve = iter[kLastResolve];
  24153. if (resolve !== null) {
  24154. var data = iter[kStream].read();
  24155. // we defer if data is null
  24156. // we can be expecting either 'end' or
  24157. // 'error'
  24158. if (data !== null) {
  24159. iter[kLastPromise] = null;
  24160. iter[kLastResolve] = null;
  24161. iter[kLastReject] = null;
  24162. resolve(createIterResult(data, false));
  24163. }
  24164. }
  24165. }
  24166. function onReadable(iter) {
  24167. // we wait for the next tick, because it might
  24168. // emit an error with process.nextTick
  24169. process.nextTick(readAndResolve, iter);
  24170. }
  24171. function wrapForNext(lastPromise, iter) {
  24172. return function (resolve, reject) {
  24173. lastPromise.then(function () {
  24174. if (iter[kEnded]) {
  24175. resolve(createIterResult(undefined, true));
  24176. return;
  24177. }
  24178. iter[kHandlePromise](resolve, reject);
  24179. }, reject);
  24180. };
  24181. }
  24182. var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
  24183. var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
  24184. get stream() {
  24185. return this[kStream];
  24186. },
  24187. next: function next() {
  24188. var _this = this;
  24189. // if we have detected an error in the meanwhile
  24190. // reject straight away
  24191. var error = this[kError];
  24192. if (error !== null) {
  24193. return Promise.reject(error);
  24194. }
  24195. if (this[kEnded]) {
  24196. return Promise.resolve(createIterResult(undefined, true));
  24197. }
  24198. if (this[kStream].destroyed) {
  24199. // We need to defer via nextTick because if .destroy(err) is
  24200. // called, the error will be emitted via nextTick, and
  24201. // we cannot guarantee that there is no error lingering around
  24202. // waiting to be emitted.
  24203. return new Promise(function (resolve, reject) {
  24204. process.nextTick(function () {
  24205. if (_this[kError]) {
  24206. reject(_this[kError]);
  24207. } else {
  24208. resolve(createIterResult(undefined, true));
  24209. }
  24210. });
  24211. });
  24212. }
  24213. // if we have multiple next() calls
  24214. // we will wait for the previous Promise to finish
  24215. // this logic is optimized to support for await loops,
  24216. // where next() is only called once at a time
  24217. var lastPromise = this[kLastPromise];
  24218. var promise;
  24219. if (lastPromise) {
  24220. promise = new Promise(wrapForNext(lastPromise, this));
  24221. } else {
  24222. // fast path needed to support multiple this.push()
  24223. // without triggering the next() queue
  24224. var data = this[kStream].read();
  24225. if (data !== null) {
  24226. return Promise.resolve(createIterResult(data, false));
  24227. }
  24228. promise = new Promise(this[kHandlePromise]);
  24229. }
  24230. this[kLastPromise] = promise;
  24231. return promise;
  24232. }
  24233. }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
  24234. return this;
  24235. }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
  24236. var _this2 = this;
  24237. // destroy(err, cb) is a private API
  24238. // we can guarantee we have that here, because we control the
  24239. // Readable class this is attached to
  24240. return new Promise(function (resolve, reject) {
  24241. _this2[kStream].destroy(null, function (err) {
  24242. if (err) {
  24243. reject(err);
  24244. return;
  24245. }
  24246. resolve(createIterResult(undefined, true));
  24247. });
  24248. });
  24249. }), _Object$setPrototypeO), AsyncIteratorPrototype);
  24250. var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
  24251. var _Object$create;
  24252. var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
  24253. value: stream,
  24254. writable: true
  24255. }), _defineProperty(_Object$create, kLastResolve, {
  24256. value: null,
  24257. writable: true
  24258. }), _defineProperty(_Object$create, kLastReject, {
  24259. value: null,
  24260. writable: true
  24261. }), _defineProperty(_Object$create, kError, {
  24262. value: null,
  24263. writable: true
  24264. }), _defineProperty(_Object$create, kEnded, {
  24265. value: stream._readableState.endEmitted,
  24266. writable: true
  24267. }), _defineProperty(_Object$create, kHandlePromise, {
  24268. value: function value(resolve, reject) {
  24269. var data = iterator[kStream].read();
  24270. if (data) {
  24271. iterator[kLastPromise] = null;
  24272. iterator[kLastResolve] = null;
  24273. iterator[kLastReject] = null;
  24274. resolve(createIterResult(data, false));
  24275. } else {
  24276. iterator[kLastResolve] = resolve;
  24277. iterator[kLastReject] = reject;
  24278. }
  24279. },
  24280. writable: true
  24281. }), _Object$create));
  24282. iterator[kLastPromise] = null;
  24283. finished(stream, function (err) {
  24284. if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
  24285. var reject = iterator[kLastReject];
  24286. // reject if we are waiting for data in the Promise
  24287. // returned by next() and store the error
  24288. if (reject !== null) {
  24289. iterator[kLastPromise] = null;
  24290. iterator[kLastResolve] = null;
  24291. iterator[kLastReject] = null;
  24292. reject(err);
  24293. }
  24294. iterator[kError] = err;
  24295. return;
  24296. }
  24297. var resolve = iterator[kLastResolve];
  24298. if (resolve !== null) {
  24299. iterator[kLastPromise] = null;
  24300. iterator[kLastResolve] = null;
  24301. iterator[kLastReject] = null;
  24302. resolve(createIterResult(undefined, true));
  24303. }
  24304. iterator[kEnded] = true;
  24305. });
  24306. stream.on('readable', onReadable.bind(null, iterator));
  24307. return iterator;
  24308. };
  24309. module.exports = createReadableStreamAsyncIterator;
  24310. /***/ }),
  24311. /***/ 9686:
  24312. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24313. "use strict";
  24314. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
  24315. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
  24316. function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  24317. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  24318. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
  24319. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
  24320. function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
  24321. function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
  24322. var _require = __webpack_require__(2961),
  24323. Buffer = _require.Buffer;
  24324. var _require2 = __webpack_require__(9862),
  24325. inspect = _require2.inspect;
  24326. var custom = inspect && inspect.custom || 'inspect';
  24327. function copyBuffer(src, target, offset) {
  24328. Buffer.prototype.copy.call(src, target, offset);
  24329. }
  24330. module.exports = /*#__PURE__*/function () {
  24331. function BufferList() {
  24332. _classCallCheck(this, BufferList);
  24333. this.head = null;
  24334. this.tail = null;
  24335. this.length = 0;
  24336. }
  24337. _createClass(BufferList, [{
  24338. key: "push",
  24339. value: function push(v) {
  24340. var entry = {
  24341. data: v,
  24342. next: null
  24343. };
  24344. if (this.length > 0) this.tail.next = entry;else this.head = entry;
  24345. this.tail = entry;
  24346. ++this.length;
  24347. }
  24348. }, {
  24349. key: "unshift",
  24350. value: function unshift(v) {
  24351. var entry = {
  24352. data: v,
  24353. next: this.head
  24354. };
  24355. if (this.length === 0) this.tail = entry;
  24356. this.head = entry;
  24357. ++this.length;
  24358. }
  24359. }, {
  24360. key: "shift",
  24361. value: function shift() {
  24362. if (this.length === 0) return;
  24363. var ret = this.head.data;
  24364. if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
  24365. --this.length;
  24366. return ret;
  24367. }
  24368. }, {
  24369. key: "clear",
  24370. value: function clear() {
  24371. this.head = this.tail = null;
  24372. this.length = 0;
  24373. }
  24374. }, {
  24375. key: "join",
  24376. value: function join(s) {
  24377. if (this.length === 0) return '';
  24378. var p = this.head;
  24379. var ret = '' + p.data;
  24380. while (p = p.next) ret += s + p.data;
  24381. return ret;
  24382. }
  24383. }, {
  24384. key: "concat",
  24385. value: function concat(n) {
  24386. if (this.length === 0) return Buffer.alloc(0);
  24387. var ret = Buffer.allocUnsafe(n >>> 0);
  24388. var p = this.head;
  24389. var i = 0;
  24390. while (p) {
  24391. copyBuffer(p.data, ret, i);
  24392. i += p.data.length;
  24393. p = p.next;
  24394. }
  24395. return ret;
  24396. }
  24397. // Consumes a specified amount of bytes or characters from the buffered data.
  24398. }, {
  24399. key: "consume",
  24400. value: function consume(n, hasStrings) {
  24401. var ret;
  24402. if (n < this.head.data.length) {
  24403. // `slice` is the same for buffers and strings.
  24404. ret = this.head.data.slice(0, n);
  24405. this.head.data = this.head.data.slice(n);
  24406. } else if (n === this.head.data.length) {
  24407. // First chunk is a perfect match.
  24408. ret = this.shift();
  24409. } else {
  24410. // Result spans more than one buffer.
  24411. ret = hasStrings ? this._getString(n) : this._getBuffer(n);
  24412. }
  24413. return ret;
  24414. }
  24415. }, {
  24416. key: "first",
  24417. value: function first() {
  24418. return this.head.data;
  24419. }
  24420. // Consumes a specified amount of characters from the buffered data.
  24421. }, {
  24422. key: "_getString",
  24423. value: function _getString(n) {
  24424. var p = this.head;
  24425. var c = 1;
  24426. var ret = p.data;
  24427. n -= ret.length;
  24428. while (p = p.next) {
  24429. var str = p.data;
  24430. var nb = n > str.length ? str.length : n;
  24431. if (nb === str.length) ret += str;else ret += str.slice(0, n);
  24432. n -= nb;
  24433. if (n === 0) {
  24434. if (nb === str.length) {
  24435. ++c;
  24436. if (p.next) this.head = p.next;else this.head = this.tail = null;
  24437. } else {
  24438. this.head = p;
  24439. p.data = str.slice(nb);
  24440. }
  24441. break;
  24442. }
  24443. ++c;
  24444. }
  24445. this.length -= c;
  24446. return ret;
  24447. }
  24448. // Consumes a specified amount of bytes from the buffered data.
  24449. }, {
  24450. key: "_getBuffer",
  24451. value: function _getBuffer(n) {
  24452. var ret = Buffer.allocUnsafe(n);
  24453. var p = this.head;
  24454. var c = 1;
  24455. p.data.copy(ret);
  24456. n -= p.data.length;
  24457. while (p = p.next) {
  24458. var buf = p.data;
  24459. var nb = n > buf.length ? buf.length : n;
  24460. buf.copy(ret, ret.length - n, 0, nb);
  24461. n -= nb;
  24462. if (n === 0) {
  24463. if (nb === buf.length) {
  24464. ++c;
  24465. if (p.next) this.head = p.next;else this.head = this.tail = null;
  24466. } else {
  24467. this.head = p;
  24468. p.data = buf.slice(nb);
  24469. }
  24470. break;
  24471. }
  24472. ++c;
  24473. }
  24474. this.length -= c;
  24475. return ret;
  24476. }
  24477. // Make sure the linked list only shows the minimal necessary information.
  24478. }, {
  24479. key: custom,
  24480. value: function value(_, options) {
  24481. return inspect(this, _objectSpread(_objectSpread({}, options), {}, {
  24482. // Only inspect one level.
  24483. depth: 0,
  24484. // It should not recurse.
  24485. customInspect: false
  24486. }));
  24487. }
  24488. }]);
  24489. return BufferList;
  24490. }();
  24491. /***/ }),
  24492. /***/ 1029:
  24493. /***/ (function(module) {
  24494. "use strict";
  24495. // undocumented cb() API, needed for core, not for public API
  24496. function destroy(err, cb) {
  24497. var _this = this;
  24498. var readableDestroyed = this._readableState && this._readableState.destroyed;
  24499. var writableDestroyed = this._writableState && this._writableState.destroyed;
  24500. if (readableDestroyed || writableDestroyed) {
  24501. if (cb) {
  24502. cb(err);
  24503. } else if (err) {
  24504. if (!this._writableState) {
  24505. process.nextTick(emitErrorNT, this, err);
  24506. } else if (!this._writableState.errorEmitted) {
  24507. this._writableState.errorEmitted = true;
  24508. process.nextTick(emitErrorNT, this, err);
  24509. }
  24510. }
  24511. return this;
  24512. }
  24513. // we set destroyed to true before firing error callbacks in order
  24514. // to make it re-entrance safe in case destroy() is called within callbacks
  24515. if (this._readableState) {
  24516. this._readableState.destroyed = true;
  24517. }
  24518. // if this is a duplex stream mark the writable part as destroyed as well
  24519. if (this._writableState) {
  24520. this._writableState.destroyed = true;
  24521. }
  24522. this._destroy(err || null, function (err) {
  24523. if (!cb && err) {
  24524. if (!_this._writableState) {
  24525. process.nextTick(emitErrorAndCloseNT, _this, err);
  24526. } else if (!_this._writableState.errorEmitted) {
  24527. _this._writableState.errorEmitted = true;
  24528. process.nextTick(emitErrorAndCloseNT, _this, err);
  24529. } else {
  24530. process.nextTick(emitCloseNT, _this);
  24531. }
  24532. } else if (cb) {
  24533. process.nextTick(emitCloseNT, _this);
  24534. cb(err);
  24535. } else {
  24536. process.nextTick(emitCloseNT, _this);
  24537. }
  24538. });
  24539. return this;
  24540. }
  24541. function emitErrorAndCloseNT(self, err) {
  24542. emitErrorNT(self, err);
  24543. emitCloseNT(self);
  24544. }
  24545. function emitCloseNT(self) {
  24546. if (self._writableState && !self._writableState.emitClose) return;
  24547. if (self._readableState && !self._readableState.emitClose) return;
  24548. self.emit('close');
  24549. }
  24550. function undestroy() {
  24551. if (this._readableState) {
  24552. this._readableState.destroyed = false;
  24553. this._readableState.reading = false;
  24554. this._readableState.ended = false;
  24555. this._readableState.endEmitted = false;
  24556. }
  24557. if (this._writableState) {
  24558. this._writableState.destroyed = false;
  24559. this._writableState.ended = false;
  24560. this._writableState.ending = false;
  24561. this._writableState.finalCalled = false;
  24562. this._writableState.prefinished = false;
  24563. this._writableState.finished = false;
  24564. this._writableState.errorEmitted = false;
  24565. }
  24566. }
  24567. function emitErrorNT(self, err) {
  24568. self.emit('error', err);
  24569. }
  24570. function errorOrDestroy(stream, err) {
  24571. // We have tests that rely on errors being emitted
  24572. // in the same tick, so changing this is semver major.
  24573. // For now when you opt-in to autoDestroy we allow
  24574. // the error to be emitted nextTick. In a future
  24575. // semver major update we should change the default to this.
  24576. var rState = stream._readableState;
  24577. var wState = stream._writableState;
  24578. if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
  24579. }
  24580. module.exports = {
  24581. destroy: destroy,
  24582. undestroy: undestroy,
  24583. errorOrDestroy: errorOrDestroy
  24584. };
  24585. /***/ }),
  24586. /***/ 1086:
  24587. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24588. "use strict";
  24589. // Ported from https://github.com/mafintosh/end-of-stream with
  24590. // permission from the author, Mathias Buus (@mafintosh).
  24591. var ERR_STREAM_PREMATURE_CLOSE = (__webpack_require__(8106)/* .codes.ERR_STREAM_PREMATURE_CLOSE */ .q.ERR_STREAM_PREMATURE_CLOSE);
  24592. function once(callback) {
  24593. var called = false;
  24594. return function () {
  24595. if (called) return;
  24596. called = true;
  24597. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  24598. args[_key] = arguments[_key];
  24599. }
  24600. callback.apply(this, args);
  24601. };
  24602. }
  24603. function noop() {}
  24604. function isRequest(stream) {
  24605. return stream.setHeader && typeof stream.abort === 'function';
  24606. }
  24607. function eos(stream, opts, callback) {
  24608. if (typeof opts === 'function') return eos(stream, null, opts);
  24609. if (!opts) opts = {};
  24610. callback = once(callback || noop);
  24611. var readable = opts.readable || opts.readable !== false && stream.readable;
  24612. var writable = opts.writable || opts.writable !== false && stream.writable;
  24613. var onlegacyfinish = function onlegacyfinish() {
  24614. if (!stream.writable) onfinish();
  24615. };
  24616. var writableEnded = stream._writableState && stream._writableState.finished;
  24617. var onfinish = function onfinish() {
  24618. writable = false;
  24619. writableEnded = true;
  24620. if (!readable) callback.call(stream);
  24621. };
  24622. var readableEnded = stream._readableState && stream._readableState.endEmitted;
  24623. var onend = function onend() {
  24624. readable = false;
  24625. readableEnded = true;
  24626. if (!writable) callback.call(stream);
  24627. };
  24628. var onerror = function onerror(err) {
  24629. callback.call(stream, err);
  24630. };
  24631. var onclose = function onclose() {
  24632. var err;
  24633. if (readable && !readableEnded) {
  24634. if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
  24635. return callback.call(stream, err);
  24636. }
  24637. if (writable && !writableEnded) {
  24638. if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
  24639. return callback.call(stream, err);
  24640. }
  24641. };
  24642. var onrequest = function onrequest() {
  24643. stream.req.on('finish', onfinish);
  24644. };
  24645. if (isRequest(stream)) {
  24646. stream.on('complete', onfinish);
  24647. stream.on('abort', onclose);
  24648. if (stream.req) onrequest();else stream.on('request', onrequest);
  24649. } else if (writable && !stream._writableState) {
  24650. // legacy streams
  24651. stream.on('end', onlegacyfinish);
  24652. stream.on('close', onlegacyfinish);
  24653. }
  24654. stream.on('end', onend);
  24655. stream.on('finish', onfinish);
  24656. if (opts.error !== false) stream.on('error', onerror);
  24657. stream.on('close', onclose);
  24658. return function () {
  24659. stream.removeListener('complete', onfinish);
  24660. stream.removeListener('abort', onclose);
  24661. stream.removeListener('request', onrequest);
  24662. if (stream.req) stream.req.removeListener('finish', onfinish);
  24663. stream.removeListener('end', onlegacyfinish);
  24664. stream.removeListener('close', onlegacyfinish);
  24665. stream.removeListener('finish', onfinish);
  24666. stream.removeListener('end', onend);
  24667. stream.removeListener('error', onerror);
  24668. stream.removeListener('close', onclose);
  24669. };
  24670. }
  24671. module.exports = eos;
  24672. /***/ }),
  24673. /***/ 1265:
  24674. /***/ (function(module) {
  24675. module.exports = function () {
  24676. throw new Error('Readable.from is not available in the browser')
  24677. };
  24678. /***/ }),
  24679. /***/ 6472:
  24680. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24681. "use strict";
  24682. // Ported from https://github.com/mafintosh/pump with
  24683. // permission from the author, Mathias Buus (@mafintosh).
  24684. var eos;
  24685. function once(callback) {
  24686. var called = false;
  24687. return function () {
  24688. if (called) return;
  24689. called = true;
  24690. callback.apply(void 0, arguments);
  24691. };
  24692. }
  24693. var _require$codes = (__webpack_require__(8106)/* .codes */ .q),
  24694. ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
  24695. ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
  24696. function noop(err) {
  24697. // Rethrow the error if it exists to avoid swallowing it
  24698. if (err) throw err;
  24699. }
  24700. function isRequest(stream) {
  24701. return stream.setHeader && typeof stream.abort === 'function';
  24702. }
  24703. function destroyer(stream, reading, writing, callback) {
  24704. callback = once(callback);
  24705. var closed = false;
  24706. stream.on('close', function () {
  24707. closed = true;
  24708. });
  24709. if (eos === undefined) eos = __webpack_require__(1086);
  24710. eos(stream, {
  24711. readable: reading,
  24712. writable: writing
  24713. }, function (err) {
  24714. if (err) return callback(err);
  24715. closed = true;
  24716. callback();
  24717. });
  24718. var destroyed = false;
  24719. return function (err) {
  24720. if (closed) return;
  24721. if (destroyed) return;
  24722. destroyed = true;
  24723. // request.destroy just do .end - .abort is what we want
  24724. if (isRequest(stream)) return stream.abort();
  24725. if (typeof stream.destroy === 'function') return stream.destroy();
  24726. callback(err || new ERR_STREAM_DESTROYED('pipe'));
  24727. };
  24728. }
  24729. function call(fn) {
  24730. fn();
  24731. }
  24732. function pipe(from, to) {
  24733. return from.pipe(to);
  24734. }
  24735. function popCallback(streams) {
  24736. if (!streams.length) return noop;
  24737. if (typeof streams[streams.length - 1] !== 'function') return noop;
  24738. return streams.pop();
  24739. }
  24740. function pipeline() {
  24741. for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
  24742. streams[_key] = arguments[_key];
  24743. }
  24744. var callback = popCallback(streams);
  24745. if (Array.isArray(streams[0])) streams = streams[0];
  24746. if (streams.length < 2) {
  24747. throw new ERR_MISSING_ARGS('streams');
  24748. }
  24749. var error;
  24750. var destroys = streams.map(function (stream, i) {
  24751. var reading = i < streams.length - 1;
  24752. var writing = i > 0;
  24753. return destroyer(stream, reading, writing, function (err) {
  24754. if (!error) error = err;
  24755. if (err) destroys.forEach(call);
  24756. if (reading) return;
  24757. destroys.forEach(call);
  24758. callback(error);
  24759. });
  24760. });
  24761. return streams.reduce(pipe);
  24762. }
  24763. module.exports = pipeline;
  24764. /***/ }),
  24765. /***/ 94:
  24766. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24767. "use strict";
  24768. var ERR_INVALID_OPT_VALUE = (__webpack_require__(8106)/* .codes.ERR_INVALID_OPT_VALUE */ .q.ERR_INVALID_OPT_VALUE);
  24769. function highWaterMarkFrom(options, isDuplex, duplexKey) {
  24770. return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
  24771. }
  24772. function getHighWaterMark(state, options, duplexKey, isDuplex) {
  24773. var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
  24774. if (hwm != null) {
  24775. if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
  24776. var name = isDuplex ? duplexKey : 'highWaterMark';
  24777. throw new ERR_INVALID_OPT_VALUE(name, hwm);
  24778. }
  24779. return Math.floor(hwm);
  24780. }
  24781. // Default value
  24782. return state.objectMode ? 16 : 16 * 1024;
  24783. }
  24784. module.exports = {
  24785. getHighWaterMark: getHighWaterMark
  24786. };
  24787. /***/ }),
  24788. /***/ 3194:
  24789. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  24790. module.exports = __webpack_require__(7187).EventEmitter;
  24791. /***/ }),
  24792. /***/ 2553:
  24793. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  24794. "use strict";
  24795. // Copyright Joyent, Inc. and other Node contributors.
  24796. //
  24797. // Permission is hereby granted, free of charge, to any person obtaining a
  24798. // copy of this software and associated documentation files (the
  24799. // "Software"), to deal in the Software without restriction, including
  24800. // without limitation the rights to use, copy, modify, merge, publish,
  24801. // distribute, sublicense, and/or sell copies of the Software, and to permit
  24802. // persons to whom the Software is furnished to do so, subject to the
  24803. // following conditions:
  24804. //
  24805. // The above copyright notice and this permission notice shall be included
  24806. // in all copies or substantial portions of the Software.
  24807. //
  24808. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  24809. // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24810. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
  24811. // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
  24812. // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  24813. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  24814. // USE OR OTHER DEALINGS IN THE SOFTWARE.
  24815. /*<replacement>*/
  24816. var Buffer = (__webpack_require__(396).Buffer);
  24817. /*</replacement>*/
  24818. var isEncoding = Buffer.isEncoding || function (encoding) {
  24819. encoding = '' + encoding;
  24820. switch (encoding && encoding.toLowerCase()) {
  24821. 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':
  24822. return true;
  24823. default:
  24824. return false;
  24825. }
  24826. };
  24827. function _normalizeEncoding(enc) {
  24828. if (!enc) return 'utf8';
  24829. var retried;
  24830. while (true) {
  24831. switch (enc) {
  24832. case 'utf8':
  24833. case 'utf-8':
  24834. return 'utf8';
  24835. case 'ucs2':
  24836. case 'ucs-2':
  24837. case 'utf16le':
  24838. case 'utf-16le':
  24839. return 'utf16le';
  24840. case 'latin1':
  24841. case 'binary':
  24842. return 'latin1';
  24843. case 'base64':
  24844. case 'ascii':
  24845. case 'hex':
  24846. return enc;
  24847. default:
  24848. if (retried) return; // undefined
  24849. enc = ('' + enc).toLowerCase();
  24850. retried = true;
  24851. }
  24852. }
  24853. };
  24854. // Do not cache `Buffer.isEncoding` when checking encoding names as some
  24855. // modules monkey-patch it to support additional encodings
  24856. function normalizeEncoding(enc) {
  24857. var nenc = _normalizeEncoding(enc);
  24858. if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
  24859. return nenc || enc;
  24860. }
  24861. // StringDecoder provides an interface for efficiently splitting a series of
  24862. // buffers into a series of JS strings without breaking apart multi-byte
  24863. // characters.
  24864. exports.s = StringDecoder;
  24865. function StringDecoder(encoding) {
  24866. this.encoding = normalizeEncoding(encoding);
  24867. var nb;
  24868. switch (this.encoding) {
  24869. case 'utf16le':
  24870. this.text = utf16Text;
  24871. this.end = utf16End;
  24872. nb = 4;
  24873. break;
  24874. case 'utf8':
  24875. this.fillLast = utf8FillLast;
  24876. nb = 4;
  24877. break;
  24878. case 'base64':
  24879. this.text = base64Text;
  24880. this.end = base64End;
  24881. nb = 3;
  24882. break;
  24883. default:
  24884. this.write = simpleWrite;
  24885. this.end = simpleEnd;
  24886. return;
  24887. }
  24888. this.lastNeed = 0;
  24889. this.lastTotal = 0;
  24890. this.lastChar = Buffer.allocUnsafe(nb);
  24891. }
  24892. StringDecoder.prototype.write = function (buf) {
  24893. if (buf.length === 0) return '';
  24894. var r;
  24895. var i;
  24896. if (this.lastNeed) {
  24897. r = this.fillLast(buf);
  24898. if (r === undefined) return '';
  24899. i = this.lastNeed;
  24900. this.lastNeed = 0;
  24901. } else {
  24902. i = 0;
  24903. }
  24904. if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
  24905. return r || '';
  24906. };
  24907. StringDecoder.prototype.end = utf8End;
  24908. // Returns only complete characters in a Buffer
  24909. StringDecoder.prototype.text = utf8Text;
  24910. // Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
  24911. StringDecoder.prototype.fillLast = function (buf) {
  24912. if (this.lastNeed <= buf.length) {
  24913. buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
  24914. return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  24915. }
  24916. buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
  24917. this.lastNeed -= buf.length;
  24918. };
  24919. // Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
  24920. // continuation byte. If an invalid byte is detected, -2 is returned.
  24921. function utf8CheckByte(byte) {
  24922. 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;
  24923. return byte >> 6 === 0x02 ? -1 : -2;
  24924. }
  24925. // Checks at most 3 bytes at the end of a Buffer in order to detect an
  24926. // incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
  24927. // needed to complete the UTF-8 character (if applicable) are returned.
  24928. function utf8CheckIncomplete(self, buf, i) {
  24929. var j = buf.length - 1;
  24930. if (j < i) return 0;
  24931. var nb = utf8CheckByte(buf[j]);
  24932. if (nb >= 0) {
  24933. if (nb > 0) self.lastNeed = nb - 1;
  24934. return nb;
  24935. }
  24936. if (--j < i || nb === -2) return 0;
  24937. nb = utf8CheckByte(buf[j]);
  24938. if (nb >= 0) {
  24939. if (nb > 0) self.lastNeed = nb - 2;
  24940. return nb;
  24941. }
  24942. if (--j < i || nb === -2) return 0;
  24943. nb = utf8CheckByte(buf[j]);
  24944. if (nb >= 0) {
  24945. if (nb > 0) {
  24946. if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
  24947. }
  24948. return nb;
  24949. }
  24950. return 0;
  24951. }
  24952. // Validates as many continuation bytes for a multi-byte UTF-8 character as
  24953. // needed or are available. If we see a non-continuation byte where we expect
  24954. // one, we "replace" the validated continuation bytes we've seen so far with
  24955. // a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
  24956. // behavior. The continuation byte check is included three times in the case
  24957. // where all of the continuation bytes for a character exist in the same buffer.
  24958. // It is also done this way as a slight performance increase instead of using a
  24959. // loop.
  24960. function utf8CheckExtraBytes(self, buf, p) {
  24961. if ((buf[0] & 0xC0) !== 0x80) {
  24962. self.lastNeed = 0;
  24963. return '\ufffd';
  24964. }
  24965. if (self.lastNeed > 1 && buf.length > 1) {
  24966. if ((buf[1] & 0xC0) !== 0x80) {
  24967. self.lastNeed = 1;
  24968. return '\ufffd';
  24969. }
  24970. if (self.lastNeed > 2 && buf.length > 2) {
  24971. if ((buf[2] & 0xC0) !== 0x80) {
  24972. self.lastNeed = 2;
  24973. return '\ufffd';
  24974. }
  24975. }
  24976. }
  24977. }
  24978. // Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
  24979. function utf8FillLast(buf) {
  24980. var p = this.lastTotal - this.lastNeed;
  24981. var r = utf8CheckExtraBytes(this, buf, p);
  24982. if (r !== undefined) return r;
  24983. if (this.lastNeed <= buf.length) {
  24984. buf.copy(this.lastChar, p, 0, this.lastNeed);
  24985. return this.lastChar.toString(this.encoding, 0, this.lastTotal);
  24986. }
  24987. buf.copy(this.lastChar, p, 0, buf.length);
  24988. this.lastNeed -= buf.length;
  24989. }
  24990. // Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
  24991. // partial character, the character's bytes are buffered until the required
  24992. // number of bytes are available.
  24993. function utf8Text(buf, i) {
  24994. var total = utf8CheckIncomplete(this, buf, i);
  24995. if (!this.lastNeed) return buf.toString('utf8', i);
  24996. this.lastTotal = total;
  24997. var end = buf.length - (total - this.lastNeed);
  24998. buf.copy(this.lastChar, 0, end);
  24999. return buf.toString('utf8', i, end);
  25000. }
  25001. // For UTF-8, a replacement character is added when ending on a partial
  25002. // character.
  25003. function utf8End(buf) {
  25004. var r = buf && buf.length ? this.write(buf) : '';
  25005. if (this.lastNeed) return r + '\ufffd';
  25006. return r;
  25007. }
  25008. // UTF-16LE typically needs two bytes per character, but even if we have an even
  25009. // number of bytes available, we need to check if we end on a leading/high
  25010. // surrogate. In that case, we need to wait for the next two bytes in order to
  25011. // decode the last character properly.
  25012. function utf16Text(buf, i) {
  25013. if ((buf.length - i) % 2 === 0) {
  25014. var r = buf.toString('utf16le', i);
  25015. if (r) {
  25016. var c = r.charCodeAt(r.length - 1);
  25017. if (c >= 0xD800 && c <= 0xDBFF) {
  25018. this.lastNeed = 2;
  25019. this.lastTotal = 4;
  25020. this.lastChar[0] = buf[buf.length - 2];
  25021. this.lastChar[1] = buf[buf.length - 1];
  25022. return r.slice(0, -1);
  25023. }
  25024. }
  25025. return r;
  25026. }
  25027. this.lastNeed = 1;
  25028. this.lastTotal = 2;
  25029. this.lastChar[0] = buf[buf.length - 1];
  25030. return buf.toString('utf16le', i, buf.length - 1);
  25031. }
  25032. // For UTF-16LE we do not explicitly append special replacement characters if we
  25033. // end on a partial character, we simply let v8 handle that.
  25034. function utf16End(buf) {
  25035. var r = buf && buf.length ? this.write(buf) : '';
  25036. if (this.lastNeed) {
  25037. var end = this.lastTotal - this.lastNeed;
  25038. return r + this.lastChar.toString('utf16le', 0, end);
  25039. }
  25040. return r;
  25041. }
  25042. function base64Text(buf, i) {
  25043. var n = (buf.length - i) % 3;
  25044. if (n === 0) return buf.toString('base64', i);
  25045. this.lastNeed = 3 - n;
  25046. this.lastTotal = 3;
  25047. if (n === 1) {
  25048. this.lastChar[0] = buf[buf.length - 1];
  25049. } else {
  25050. this.lastChar[0] = buf[buf.length - 2];
  25051. this.lastChar[1] = buf[buf.length - 1];
  25052. }
  25053. return buf.toString('base64', i, buf.length - n);
  25054. }
  25055. function base64End(buf) {
  25056. var r = buf && buf.length ? this.write(buf) : '';
  25057. if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
  25058. return r;
  25059. }
  25060. // Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
  25061. function simpleWrite(buf) {
  25062. return buf.toString(this.encoding);
  25063. }
  25064. function simpleEnd(buf) {
  25065. return buf && buf.length ? this.write(buf) : '';
  25066. }
  25067. /***/ }),
  25068. /***/ 396:
  25069. /***/ (function(module, exports, __webpack_require__) {
  25070. /* eslint-disable node/no-deprecated-api */
  25071. var buffer = __webpack_require__(2783)
  25072. var Buffer = buffer.Buffer
  25073. // alternative to using Object.keys for old browsers
  25074. function copyProps (src, dst) {
  25075. for (var key in src) {
  25076. dst[key] = src[key]
  25077. }
  25078. }
  25079. if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
  25080. module.exports = buffer
  25081. } else {
  25082. // Copy properties from require('buffer')
  25083. copyProps(buffer, exports)
  25084. exports.Buffer = SafeBuffer
  25085. }
  25086. function SafeBuffer (arg, encodingOrOffset, length) {
  25087. return Buffer(arg, encodingOrOffset, length)
  25088. }
  25089. // Copy static methods from Buffer
  25090. copyProps(Buffer, SafeBuffer)
  25091. SafeBuffer.from = function (arg, encodingOrOffset, length) {
  25092. if (typeof arg === 'number') {
  25093. throw new TypeError('Argument must not be a number')
  25094. }
  25095. return Buffer(arg, encodingOrOffset, length)
  25096. }
  25097. SafeBuffer.alloc = function (size, fill, encoding) {
  25098. if (typeof size !== 'number') {
  25099. throw new TypeError('Argument must be a number')
  25100. }
  25101. var buf = Buffer(size)
  25102. if (fill !== undefined) {
  25103. if (typeof encoding === 'string') {
  25104. buf.fill(fill, encoding)
  25105. } else {
  25106. buf.fill(fill)
  25107. }
  25108. } else {
  25109. buf.fill(0)
  25110. }
  25111. return buf
  25112. }
  25113. SafeBuffer.allocUnsafe = function (size) {
  25114. if (typeof size !== 'number') {
  25115. throw new TypeError('Argument must be a number')
  25116. }
  25117. return Buffer(size)
  25118. }
  25119. SafeBuffer.allocUnsafeSlow = function (size) {
  25120. if (typeof size !== 'number') {
  25121. throw new TypeError('Argument must be a number')
  25122. }
  25123. return buffer.SlowBuffer(size)
  25124. }
  25125. /***/ }),
  25126. /***/ 4927:
  25127. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25128. /**
  25129. * Module exports.
  25130. */
  25131. module.exports = deprecate;
  25132. /**
  25133. * Mark that a method should not be used.
  25134. * Returns a modified function which warns once by default.
  25135. *
  25136. * If `localStorage.noDeprecation = true` is set, then it is a no-op.
  25137. *
  25138. * If `localStorage.throwDeprecation = true` is set, then deprecated functions
  25139. * will throw an Error when invoked.
  25140. *
  25141. * If `localStorage.traceDeprecation = true` is set, then deprecated functions
  25142. * will invoke `console.trace()` instead of `console.error()`.
  25143. *
  25144. * @param {Function} fn - the function to deprecate
  25145. * @param {String} msg - the string to print to the console when `fn` is invoked
  25146. * @returns {Function} a new "deprecated" version of `fn`
  25147. * @api public
  25148. */
  25149. function deprecate (fn, msg) {
  25150. if (config('noDeprecation')) {
  25151. return fn;
  25152. }
  25153. var warned = false;
  25154. function deprecated() {
  25155. if (!warned) {
  25156. if (config('throwDeprecation')) {
  25157. throw new Error(msg);
  25158. } else if (config('traceDeprecation')) {
  25159. console.trace(msg);
  25160. } else {
  25161. console.warn(msg);
  25162. }
  25163. warned = true;
  25164. }
  25165. return fn.apply(this, arguments);
  25166. }
  25167. return deprecated;
  25168. }
  25169. /**
  25170. * Checks `localStorage` for boolean values for the given `name`.
  25171. *
  25172. * @param {String} name
  25173. * @returns {Boolean}
  25174. * @api private
  25175. */
  25176. function config (name) {
  25177. // accessing global.localStorage can trigger a DOMException in sandboxed iframes
  25178. try {
  25179. if (!__webpack_require__.g.localStorage) return false;
  25180. } catch (_) {
  25181. return false;
  25182. }
  25183. var val = __webpack_require__.g.localStorage[name];
  25184. if (null == val) return false;
  25185. return String(val).toLowerCase() === 'true';
  25186. }
  25187. /***/ }),
  25188. /***/ 9881:
  25189. /***/ (function(module) {
  25190. module.exports = {
  25191. isArray: function(value) {
  25192. if (Array.isArray) {
  25193. return Array.isArray(value);
  25194. }
  25195. // fallback for older browsers like IE 8
  25196. return Object.prototype.toString.call( value ) === '[object Array]';
  25197. }
  25198. };
  25199. /***/ }),
  25200. /***/ 7888:
  25201. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25202. /*jslint node:true */
  25203. var xml2js = __webpack_require__(1229);
  25204. var xml2json = __webpack_require__(1388);
  25205. var js2xml = __webpack_require__(6501);
  25206. var json2xml = __webpack_require__(4673);
  25207. module.exports = {
  25208. xml2js: xml2js,
  25209. xml2json: xml2json,
  25210. js2xml: js2xml,
  25211. json2xml: json2xml
  25212. };
  25213. /***/ }),
  25214. /***/ 6501:
  25215. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25216. var helper = __webpack_require__(4740);
  25217. var isArray = (__webpack_require__(9881).isArray);
  25218. var currentElement, currentElementName;
  25219. function validateOptions(userOptions) {
  25220. var options = helper.copyOptions(userOptions);
  25221. helper.ensureFlagExists('ignoreDeclaration', options);
  25222. helper.ensureFlagExists('ignoreInstruction', options);
  25223. helper.ensureFlagExists('ignoreAttributes', options);
  25224. helper.ensureFlagExists('ignoreText', options);
  25225. helper.ensureFlagExists('ignoreComment', options);
  25226. helper.ensureFlagExists('ignoreCdata', options);
  25227. helper.ensureFlagExists('ignoreDoctype', options);
  25228. helper.ensureFlagExists('compact', options);
  25229. helper.ensureFlagExists('indentText', options);
  25230. helper.ensureFlagExists('indentCdata', options);
  25231. helper.ensureFlagExists('indentAttributes', options);
  25232. helper.ensureFlagExists('indentInstruction', options);
  25233. helper.ensureFlagExists('fullTagEmptyElement', options);
  25234. helper.ensureFlagExists('noQuotesForNativeAttributes', options);
  25235. helper.ensureSpacesExists(options);
  25236. if (typeof options.spaces === 'number') {
  25237. options.spaces = Array(options.spaces + 1).join(' ');
  25238. }
  25239. helper.ensureKeyExists('declaration', options);
  25240. helper.ensureKeyExists('instruction', options);
  25241. helper.ensureKeyExists('attributes', options);
  25242. helper.ensureKeyExists('text', options);
  25243. helper.ensureKeyExists('comment', options);
  25244. helper.ensureKeyExists('cdata', options);
  25245. helper.ensureKeyExists('doctype', options);
  25246. helper.ensureKeyExists('type', options);
  25247. helper.ensureKeyExists('name', options);
  25248. helper.ensureKeyExists('elements', options);
  25249. helper.checkFnExists('doctype', options);
  25250. helper.checkFnExists('instruction', options);
  25251. helper.checkFnExists('cdata', options);
  25252. helper.checkFnExists('comment', options);
  25253. helper.checkFnExists('text', options);
  25254. helper.checkFnExists('instructionName', options);
  25255. helper.checkFnExists('elementName', options);
  25256. helper.checkFnExists('attributeName', options);
  25257. helper.checkFnExists('attributeValue', options);
  25258. helper.checkFnExists('attributes', options);
  25259. helper.checkFnExists('fullTagEmptyElement', options);
  25260. return options;
  25261. }
  25262. function writeIndentation(options, depth, firstLine) {
  25263. return (!firstLine && options.spaces ? '\n' : '') + Array(depth + 1).join(options.spaces);
  25264. }
  25265. function writeAttributes(attributes, options, depth) {
  25266. if (options.ignoreAttributes) {
  25267. return '';
  25268. }
  25269. if ('attributesFn' in options) {
  25270. attributes = options.attributesFn(attributes, currentElementName, currentElement);
  25271. }
  25272. var key, attr, attrName, quote, result = [];
  25273. for (key in attributes) {
  25274. if (attributes.hasOwnProperty(key) && attributes[key] !== null && attributes[key] !== undefined) {
  25275. quote = options.noQuotesForNativeAttributes && typeof attributes[key] !== 'string' ? '' : '"';
  25276. attr = '' + attributes[key]; // ensure number and boolean are converted to String
  25277. attr = attr.replace(/"/g, '&quot;');
  25278. attrName = 'attributeNameFn' in options ? options.attributeNameFn(key, attr, currentElementName, currentElement) : key;
  25279. result.push((options.spaces && options.indentAttributes? writeIndentation(options, depth+1, false) : ' '));
  25280. result.push(attrName + '=' + quote + ('attributeValueFn' in options ? options.attributeValueFn(attr, key, currentElementName, currentElement) : attr) + quote);
  25281. }
  25282. }
  25283. if (attributes && Object.keys(attributes).length && options.spaces && options.indentAttributes) {
  25284. result.push(writeIndentation(options, depth, false));
  25285. }
  25286. return result.join('');
  25287. }
  25288. function writeDeclaration(declaration, options, depth) {
  25289. currentElement = declaration;
  25290. currentElementName = 'xml';
  25291. return options.ignoreDeclaration ? '' : '<?' + 'xml' + writeAttributes(declaration[options.attributesKey], options, depth) + '?>';
  25292. }
  25293. function writeInstruction(instruction, options, depth) {
  25294. if (options.ignoreInstruction) {
  25295. return '';
  25296. }
  25297. var key;
  25298. for (key in instruction) {
  25299. if (instruction.hasOwnProperty(key)) {
  25300. break;
  25301. }
  25302. }
  25303. var instructionName = 'instructionNameFn' in options ? options.instructionNameFn(key, instruction[key], currentElementName, currentElement) : key;
  25304. if (typeof instruction[key] === 'object') {
  25305. currentElement = instruction;
  25306. currentElementName = instructionName;
  25307. return '<?' + instructionName + writeAttributes(instruction[key][options.attributesKey], options, depth) + '?>';
  25308. } else {
  25309. var instructionValue = instruction[key] ? instruction[key] : '';
  25310. if ('instructionFn' in options) instructionValue = options.instructionFn(instructionValue, key, currentElementName, currentElement);
  25311. return '<?' + instructionName + (instructionValue ? ' ' + instructionValue : '') + '?>';
  25312. }
  25313. }
  25314. function writeComment(comment, options) {
  25315. return options.ignoreComment ? '' : '<!--' + ('commentFn' in options ? options.commentFn(comment, currentElementName, currentElement) : comment) + '-->';
  25316. }
  25317. function writeCdata(cdata, options) {
  25318. return options.ignoreCdata ? '' : '<![CDATA[' + ('cdataFn' in options ? options.cdataFn(cdata, currentElementName, currentElement) : cdata.replace(']]>', ']]]]><![CDATA[>')) + ']]>';
  25319. }
  25320. function writeDoctype(doctype, options) {
  25321. return options.ignoreDoctype ? '' : '<!DOCTYPE ' + ('doctypeFn' in options ? options.doctypeFn(doctype, currentElementName, currentElement) : doctype) + '>';
  25322. }
  25323. function writeText(text, options) {
  25324. if (options.ignoreText) return '';
  25325. text = '' + text; // ensure Number and Boolean are converted to String
  25326. text = text.replace(/&amp;/g, '&'); // desanitize to avoid double sanitization
  25327. text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
  25328. return 'textFn' in options ? options.textFn(text, currentElementName, currentElement) : text;
  25329. }
  25330. function hasContent(element, options) {
  25331. var i;
  25332. if (element.elements && element.elements.length) {
  25333. for (i = 0; i < element.elements.length; ++i) {
  25334. switch (element.elements[i][options.typeKey]) {
  25335. case 'text':
  25336. if (options.indentText) {
  25337. return true;
  25338. }
  25339. break; // skip to next key
  25340. case 'cdata':
  25341. if (options.indentCdata) {
  25342. return true;
  25343. }
  25344. break; // skip to next key
  25345. case 'instruction':
  25346. if (options.indentInstruction) {
  25347. return true;
  25348. }
  25349. break; // skip to next key
  25350. case 'doctype':
  25351. case 'comment':
  25352. case 'element':
  25353. return true;
  25354. default:
  25355. return true;
  25356. }
  25357. }
  25358. }
  25359. return false;
  25360. }
  25361. function writeElement(element, options, depth) {
  25362. currentElement = element;
  25363. currentElementName = element.name;
  25364. var xml = [], elementName = 'elementNameFn' in options ? options.elementNameFn(element.name, element) : element.name;
  25365. xml.push('<' + elementName);
  25366. if (element[options.attributesKey]) {
  25367. xml.push(writeAttributes(element[options.attributesKey], options, depth));
  25368. }
  25369. var withClosingTag = element[options.elementsKey] && element[options.elementsKey].length || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';
  25370. if (!withClosingTag) {
  25371. if ('fullTagEmptyElementFn' in options) {
  25372. withClosingTag = options.fullTagEmptyElementFn(element.name, element);
  25373. } else {
  25374. withClosingTag = options.fullTagEmptyElement;
  25375. }
  25376. }
  25377. if (withClosingTag) {
  25378. xml.push('>');
  25379. if (element[options.elementsKey] && element[options.elementsKey].length) {
  25380. xml.push(writeElements(element[options.elementsKey], options, depth + 1));
  25381. currentElement = element;
  25382. currentElementName = element.name;
  25383. }
  25384. xml.push(options.spaces && hasContent(element, options) ? '\n' + Array(depth + 1).join(options.spaces) : '');
  25385. xml.push('</' + elementName + '>');
  25386. } else {
  25387. xml.push('/>');
  25388. }
  25389. return xml.join('');
  25390. }
  25391. function writeElements(elements, options, depth, firstLine) {
  25392. return elements.reduce(function (xml, element) {
  25393. var indent = writeIndentation(options, depth, firstLine && !xml);
  25394. switch (element.type) {
  25395. case 'element': return xml + indent + writeElement(element, options, depth);
  25396. case 'comment': return xml + indent + writeComment(element[options.commentKey], options);
  25397. case 'doctype': return xml + indent + writeDoctype(element[options.doctypeKey], options);
  25398. case 'cdata': return xml + (options.indentCdata ? indent : '') + writeCdata(element[options.cdataKey], options);
  25399. case 'text': return xml + (options.indentText ? indent : '') + writeText(element[options.textKey], options);
  25400. case 'instruction':
  25401. var instruction = {};
  25402. instruction[element[options.nameKey]] = element[options.attributesKey] ? element : element[options.instructionKey];
  25403. return xml + (options.indentInstruction ? indent : '') + writeInstruction(instruction, options, depth);
  25404. }
  25405. }, '');
  25406. }
  25407. function hasContentCompact(element, options, anyContent) {
  25408. var key;
  25409. for (key in element) {
  25410. if (element.hasOwnProperty(key)) {
  25411. switch (key) {
  25412. case options.parentKey:
  25413. case options.attributesKey:
  25414. break; // skip to next key
  25415. case options.textKey:
  25416. if (options.indentText || anyContent) {
  25417. return true;
  25418. }
  25419. break; // skip to next key
  25420. case options.cdataKey:
  25421. if (options.indentCdata || anyContent) {
  25422. return true;
  25423. }
  25424. break; // skip to next key
  25425. case options.instructionKey:
  25426. if (options.indentInstruction || anyContent) {
  25427. return true;
  25428. }
  25429. break; // skip to next key
  25430. case options.doctypeKey:
  25431. case options.commentKey:
  25432. return true;
  25433. default:
  25434. return true;
  25435. }
  25436. }
  25437. }
  25438. return false;
  25439. }
  25440. function writeElementCompact(element, name, options, depth, indent) {
  25441. currentElement = element;
  25442. currentElementName = name;
  25443. var elementName = 'elementNameFn' in options ? options.elementNameFn(name, element) : name;
  25444. if (typeof element === 'undefined' || element === null || element === '') {
  25445. return 'fullTagEmptyElementFn' in options && options.fullTagEmptyElementFn(name, element) || options.fullTagEmptyElement ? '<' + elementName + '></' + elementName + '>' : '<' + elementName + '/>';
  25446. }
  25447. var xml = [];
  25448. if (name) {
  25449. xml.push('<' + elementName);
  25450. if (typeof element !== 'object') {
  25451. xml.push('>' + writeText(element,options) + '</' + elementName + '>');
  25452. return xml.join('');
  25453. }
  25454. if (element[options.attributesKey]) {
  25455. xml.push(writeAttributes(element[options.attributesKey], options, depth));
  25456. }
  25457. var withClosingTag = hasContentCompact(element, options, true) || element[options.attributesKey] && element[options.attributesKey]['xml:space'] === 'preserve';
  25458. if (!withClosingTag) {
  25459. if ('fullTagEmptyElementFn' in options) {
  25460. withClosingTag = options.fullTagEmptyElementFn(name, element);
  25461. } else {
  25462. withClosingTag = options.fullTagEmptyElement;
  25463. }
  25464. }
  25465. if (withClosingTag) {
  25466. xml.push('>');
  25467. } else {
  25468. xml.push('/>');
  25469. return xml.join('');
  25470. }
  25471. }
  25472. xml.push(writeElementsCompact(element, options, depth + 1, false));
  25473. currentElement = element;
  25474. currentElementName = name;
  25475. if (name) {
  25476. xml.push((indent ? writeIndentation(options, depth, false) : '') + '</' + elementName + '>');
  25477. }
  25478. return xml.join('');
  25479. }
  25480. function writeElementsCompact(element, options, depth, firstLine) {
  25481. var i, key, nodes, xml = [];
  25482. for (key in element) {
  25483. if (element.hasOwnProperty(key)) {
  25484. nodes = isArray(element[key]) ? element[key] : [element[key]];
  25485. for (i = 0; i < nodes.length; ++i) {
  25486. switch (key) {
  25487. case options.declarationKey: xml.push(writeDeclaration(nodes[i], options, depth)); break;
  25488. case options.instructionKey: xml.push((options.indentInstruction ? writeIndentation(options, depth, firstLine) : '') + writeInstruction(nodes[i], options, depth)); break;
  25489. case options.attributesKey: case options.parentKey: break; // skip
  25490. case options.textKey: xml.push((options.indentText ? writeIndentation(options, depth, firstLine) : '') + writeText(nodes[i], options)); break;
  25491. case options.cdataKey: xml.push((options.indentCdata ? writeIndentation(options, depth, firstLine) : '') + writeCdata(nodes[i], options)); break;
  25492. case options.doctypeKey: xml.push(writeIndentation(options, depth, firstLine) + writeDoctype(nodes[i], options)); break;
  25493. case options.commentKey: xml.push(writeIndentation(options, depth, firstLine) + writeComment(nodes[i], options)); break;
  25494. default: xml.push(writeIndentation(options, depth, firstLine) + writeElementCompact(nodes[i], key, options, depth, hasContentCompact(nodes[i], options)));
  25495. }
  25496. firstLine = firstLine && !xml.length;
  25497. }
  25498. }
  25499. }
  25500. return xml.join('');
  25501. }
  25502. module.exports = function (js, options) {
  25503. options = validateOptions(options);
  25504. var xml = [];
  25505. currentElement = js;
  25506. currentElementName = '_root_';
  25507. if (options.compact) {
  25508. xml.push(writeElementsCompact(js, options, 0, true));
  25509. } else {
  25510. if (js[options.declarationKey]) {
  25511. xml.push(writeDeclaration(js[options.declarationKey], options, 0));
  25512. }
  25513. if (js[options.elementsKey] && js[options.elementsKey].length) {
  25514. xml.push(writeElements(js[options.elementsKey], options, 0, !xml.length));
  25515. }
  25516. }
  25517. return xml.join('');
  25518. };
  25519. /***/ }),
  25520. /***/ 4673:
  25521. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25522. var js2xml = __webpack_require__(6501);
  25523. module.exports = function (json, options) {
  25524. if (json instanceof Buffer) {
  25525. json = json.toString();
  25526. }
  25527. var js = null;
  25528. if (typeof (json) === 'string') {
  25529. try {
  25530. js = JSON.parse(json);
  25531. } catch (e) {
  25532. throw new Error('The JSON structure is invalid');
  25533. }
  25534. } else {
  25535. js = json;
  25536. }
  25537. return js2xml(js, options);
  25538. };
  25539. /***/ }),
  25540. /***/ 4740:
  25541. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25542. var isArray = (__webpack_require__(9881).isArray);
  25543. module.exports = {
  25544. copyOptions: function (options) {
  25545. var key, copy = {};
  25546. for (key in options) {
  25547. if (options.hasOwnProperty(key)) {
  25548. copy[key] = options[key];
  25549. }
  25550. }
  25551. return copy;
  25552. },
  25553. ensureFlagExists: function (item, options) {
  25554. if (!(item in options) || typeof options[item] !== 'boolean') {
  25555. options[item] = false;
  25556. }
  25557. },
  25558. ensureSpacesExists: function (options) {
  25559. if (!('spaces' in options) || (typeof options.spaces !== 'number' && typeof options.spaces !== 'string')) {
  25560. options.spaces = 0;
  25561. }
  25562. },
  25563. ensureAlwaysArrayExists: function (options) {
  25564. if (!('alwaysArray' in options) || (typeof options.alwaysArray !== 'boolean' && !isArray(options.alwaysArray))) {
  25565. options.alwaysArray = false;
  25566. }
  25567. },
  25568. ensureKeyExists: function (key, options) {
  25569. if (!(key + 'Key' in options) || typeof options[key + 'Key'] !== 'string') {
  25570. options[key + 'Key'] = options.compact ? '_' + key : key;
  25571. }
  25572. },
  25573. checkFnExists: function (key, options) {
  25574. return key + 'Fn' in options;
  25575. }
  25576. };
  25577. /***/ }),
  25578. /***/ 1229:
  25579. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25580. var sax = __webpack_require__(6099);
  25581. var expat /*= require('node-expat');*/ = { on: function () { }, parse: function () { } };
  25582. var helper = __webpack_require__(4740);
  25583. var isArray = (__webpack_require__(9881).isArray);
  25584. var options;
  25585. var pureJsParser = true;
  25586. var currentElement;
  25587. function validateOptions(userOptions) {
  25588. options = helper.copyOptions(userOptions);
  25589. helper.ensureFlagExists('ignoreDeclaration', options);
  25590. helper.ensureFlagExists('ignoreInstruction', options);
  25591. helper.ensureFlagExists('ignoreAttributes', options);
  25592. helper.ensureFlagExists('ignoreText', options);
  25593. helper.ensureFlagExists('ignoreComment', options);
  25594. helper.ensureFlagExists('ignoreCdata', options);
  25595. helper.ensureFlagExists('ignoreDoctype', options);
  25596. helper.ensureFlagExists('compact', options);
  25597. helper.ensureFlagExists('alwaysChildren', options);
  25598. helper.ensureFlagExists('addParent', options);
  25599. helper.ensureFlagExists('trim', options);
  25600. helper.ensureFlagExists('nativeType', options);
  25601. helper.ensureFlagExists('nativeTypeAttributes', options);
  25602. helper.ensureFlagExists('sanitize', options);
  25603. helper.ensureFlagExists('instructionHasAttributes', options);
  25604. helper.ensureFlagExists('captureSpacesBetweenElements', options);
  25605. helper.ensureAlwaysArrayExists(options);
  25606. helper.ensureKeyExists('declaration', options);
  25607. helper.ensureKeyExists('instruction', options);
  25608. helper.ensureKeyExists('attributes', options);
  25609. helper.ensureKeyExists('text', options);
  25610. helper.ensureKeyExists('comment', options);
  25611. helper.ensureKeyExists('cdata', options);
  25612. helper.ensureKeyExists('doctype', options);
  25613. helper.ensureKeyExists('type', options);
  25614. helper.ensureKeyExists('name', options);
  25615. helper.ensureKeyExists('elements', options);
  25616. helper.ensureKeyExists('parent', options);
  25617. helper.checkFnExists('doctype', options);
  25618. helper.checkFnExists('instruction', options);
  25619. helper.checkFnExists('cdata', options);
  25620. helper.checkFnExists('comment', options);
  25621. helper.checkFnExists('text', options);
  25622. helper.checkFnExists('instructionName', options);
  25623. helper.checkFnExists('elementName', options);
  25624. helper.checkFnExists('attributeName', options);
  25625. helper.checkFnExists('attributeValue', options);
  25626. helper.checkFnExists('attributes', options);
  25627. return options;
  25628. }
  25629. function nativeType(value) {
  25630. var nValue = Number(value);
  25631. if (!isNaN(nValue)) {
  25632. return nValue;
  25633. }
  25634. var bValue = value.toLowerCase();
  25635. if (bValue === 'true') {
  25636. return true;
  25637. } else if (bValue === 'false') {
  25638. return false;
  25639. }
  25640. return value;
  25641. }
  25642. function addField(type, value) {
  25643. var key;
  25644. if (options.compact) {
  25645. if (
  25646. !currentElement[options[type + 'Key']] &&
  25647. (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(options[type + 'Key']) !== -1 : options.alwaysArray)
  25648. ) {
  25649. currentElement[options[type + 'Key']] = [];
  25650. }
  25651. if (currentElement[options[type + 'Key']] && !isArray(currentElement[options[type + 'Key']])) {
  25652. currentElement[options[type + 'Key']] = [currentElement[options[type + 'Key']]];
  25653. }
  25654. if (type + 'Fn' in options && typeof value === 'string') {
  25655. value = options[type + 'Fn'](value, currentElement);
  25656. }
  25657. if (type === 'instruction' && ('instructionFn' in options || 'instructionNameFn' in options)) {
  25658. for (key in value) {
  25659. if (value.hasOwnProperty(key)) {
  25660. if ('instructionFn' in options) {
  25661. value[key] = options.instructionFn(value[key], key, currentElement);
  25662. } else {
  25663. var temp = value[key];
  25664. delete value[key];
  25665. value[options.instructionNameFn(key, temp, currentElement)] = temp;
  25666. }
  25667. }
  25668. }
  25669. }
  25670. if (isArray(currentElement[options[type + 'Key']])) {
  25671. currentElement[options[type + 'Key']].push(value);
  25672. } else {
  25673. currentElement[options[type + 'Key']] = value;
  25674. }
  25675. } else {
  25676. if (!currentElement[options.elementsKey]) {
  25677. currentElement[options.elementsKey] = [];
  25678. }
  25679. var element = {};
  25680. element[options.typeKey] = type;
  25681. if (type === 'instruction') {
  25682. for (key in value) {
  25683. if (value.hasOwnProperty(key)) {
  25684. break;
  25685. }
  25686. }
  25687. element[options.nameKey] = 'instructionNameFn' in options ? options.instructionNameFn(key, value, currentElement) : key;
  25688. if (options.instructionHasAttributes) {
  25689. element[options.attributesKey] = value[key][options.attributesKey];
  25690. if ('instructionFn' in options) {
  25691. element[options.attributesKey] = options.instructionFn(element[options.attributesKey], key, currentElement);
  25692. }
  25693. } else {
  25694. if ('instructionFn' in options) {
  25695. value[key] = options.instructionFn(value[key], key, currentElement);
  25696. }
  25697. element[options.instructionKey] = value[key];
  25698. }
  25699. } else {
  25700. if (type + 'Fn' in options) {
  25701. value = options[type + 'Fn'](value, currentElement);
  25702. }
  25703. element[options[type + 'Key']] = value;
  25704. }
  25705. if (options.addParent) {
  25706. element[options.parentKey] = currentElement;
  25707. }
  25708. currentElement[options.elementsKey].push(element);
  25709. }
  25710. }
  25711. function manipulateAttributes(attributes) {
  25712. if ('attributesFn' in options && attributes) {
  25713. attributes = options.attributesFn(attributes, currentElement);
  25714. }
  25715. if ((options.trim || 'attributeValueFn' in options || 'attributeNameFn' in options || options.nativeTypeAttributes) && attributes) {
  25716. var key;
  25717. for (key in attributes) {
  25718. if (attributes.hasOwnProperty(key)) {
  25719. if (options.trim) attributes[key] = attributes[key].trim();
  25720. if (options.nativeTypeAttributes) {
  25721. attributes[key] = nativeType(attributes[key]);
  25722. }
  25723. if ('attributeValueFn' in options) attributes[key] = options.attributeValueFn(attributes[key], key, currentElement);
  25724. if ('attributeNameFn' in options) {
  25725. var temp = attributes[key];
  25726. delete attributes[key];
  25727. attributes[options.attributeNameFn(key, attributes[key], currentElement)] = temp;
  25728. }
  25729. }
  25730. }
  25731. }
  25732. return attributes;
  25733. }
  25734. function onInstruction(instruction) {
  25735. var attributes = {};
  25736. if (instruction.body && (instruction.name.toLowerCase() === 'xml' || options.instructionHasAttributes)) {
  25737. var attrsRegExp = /([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g;
  25738. var match;
  25739. while ((match = attrsRegExp.exec(instruction.body)) !== null) {
  25740. attributes[match[1]] = match[2] || match[3] || match[4];
  25741. }
  25742. attributes = manipulateAttributes(attributes);
  25743. }
  25744. if (instruction.name.toLowerCase() === 'xml') {
  25745. if (options.ignoreDeclaration) {
  25746. return;
  25747. }
  25748. currentElement[options.declarationKey] = {};
  25749. if (Object.keys(attributes).length) {
  25750. currentElement[options.declarationKey][options.attributesKey] = attributes;
  25751. }
  25752. if (options.addParent) {
  25753. currentElement[options.declarationKey][options.parentKey] = currentElement;
  25754. }
  25755. } else {
  25756. if (options.ignoreInstruction) {
  25757. return;
  25758. }
  25759. if (options.trim) {
  25760. instruction.body = instruction.body.trim();
  25761. }
  25762. var value = {};
  25763. if (options.instructionHasAttributes && Object.keys(attributes).length) {
  25764. value[instruction.name] = {};
  25765. value[instruction.name][options.attributesKey] = attributes;
  25766. } else {
  25767. value[instruction.name] = instruction.body;
  25768. }
  25769. addField('instruction', value);
  25770. }
  25771. }
  25772. function onStartElement(name, attributes) {
  25773. var element;
  25774. if (typeof name === 'object') {
  25775. attributes = name.attributes;
  25776. name = name.name;
  25777. }
  25778. attributes = manipulateAttributes(attributes);
  25779. if ('elementNameFn' in options) {
  25780. name = options.elementNameFn(name, currentElement);
  25781. }
  25782. if (options.compact) {
  25783. element = {};
  25784. if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {
  25785. element[options.attributesKey] = {};
  25786. var key;
  25787. for (key in attributes) {
  25788. if (attributes.hasOwnProperty(key)) {
  25789. element[options.attributesKey][key] = attributes[key];
  25790. }
  25791. }
  25792. }
  25793. if (
  25794. !(name in currentElement) &&
  25795. (isArray(options.alwaysArray) ? options.alwaysArray.indexOf(name) !== -1 : options.alwaysArray)
  25796. ) {
  25797. currentElement[name] = [];
  25798. }
  25799. if (currentElement[name] && !isArray(currentElement[name])) {
  25800. currentElement[name] = [currentElement[name]];
  25801. }
  25802. if (isArray(currentElement[name])) {
  25803. currentElement[name].push(element);
  25804. } else {
  25805. currentElement[name] = element;
  25806. }
  25807. } else {
  25808. if (!currentElement[options.elementsKey]) {
  25809. currentElement[options.elementsKey] = [];
  25810. }
  25811. element = {};
  25812. element[options.typeKey] = 'element';
  25813. element[options.nameKey] = name;
  25814. if (!options.ignoreAttributes && attributes && Object.keys(attributes).length) {
  25815. element[options.attributesKey] = attributes;
  25816. }
  25817. if (options.alwaysChildren) {
  25818. element[options.elementsKey] = [];
  25819. }
  25820. currentElement[options.elementsKey].push(element);
  25821. }
  25822. element[options.parentKey] = currentElement; // will be deleted in onEndElement() if !options.addParent
  25823. currentElement = element;
  25824. }
  25825. function onText(text) {
  25826. if (options.ignoreText) {
  25827. return;
  25828. }
  25829. if (!text.trim() && !options.captureSpacesBetweenElements) {
  25830. return;
  25831. }
  25832. if (options.trim) {
  25833. text = text.trim();
  25834. }
  25835. if (options.nativeType) {
  25836. text = nativeType(text);
  25837. }
  25838. if (options.sanitize) {
  25839. text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
  25840. }
  25841. addField('text', text);
  25842. }
  25843. function onComment(comment) {
  25844. if (options.ignoreComment) {
  25845. return;
  25846. }
  25847. if (options.trim) {
  25848. comment = comment.trim();
  25849. }
  25850. addField('comment', comment);
  25851. }
  25852. function onEndElement(name) {
  25853. var parentElement = currentElement[options.parentKey];
  25854. if (!options.addParent) {
  25855. delete currentElement[options.parentKey];
  25856. }
  25857. currentElement = parentElement;
  25858. }
  25859. function onCdata(cdata) {
  25860. if (options.ignoreCdata) {
  25861. return;
  25862. }
  25863. if (options.trim) {
  25864. cdata = cdata.trim();
  25865. }
  25866. addField('cdata', cdata);
  25867. }
  25868. function onDoctype(doctype) {
  25869. if (options.ignoreDoctype) {
  25870. return;
  25871. }
  25872. doctype = doctype.replace(/^ /, '');
  25873. if (options.trim) {
  25874. doctype = doctype.trim();
  25875. }
  25876. addField('doctype', doctype);
  25877. }
  25878. function onError(error) {
  25879. error.note = error; //console.error(error);
  25880. }
  25881. module.exports = function (xml, userOptions) {
  25882. var parser = pureJsParser ? sax.parser(true, {}) : parser = new expat.Parser('UTF-8');
  25883. var result = {};
  25884. currentElement = result;
  25885. options = validateOptions(userOptions);
  25886. if (pureJsParser) {
  25887. parser.opt = {strictEntities: true};
  25888. parser.onopentag = onStartElement;
  25889. parser.ontext = onText;
  25890. parser.oncomment = onComment;
  25891. parser.onclosetag = onEndElement;
  25892. parser.onerror = onError;
  25893. parser.oncdata = onCdata;
  25894. parser.ondoctype = onDoctype;
  25895. parser.onprocessinginstruction = onInstruction;
  25896. } else {
  25897. parser.on('startElement', onStartElement);
  25898. parser.on('text', onText);
  25899. parser.on('comment', onComment);
  25900. parser.on('endElement', onEndElement);
  25901. parser.on('error', onError);
  25902. //parser.on('startCdata', onStartCdata);
  25903. //parser.on('endCdata', onEndCdata);
  25904. //parser.on('entityDecl', onEntityDecl);
  25905. }
  25906. if (pureJsParser) {
  25907. parser.write(xml).close();
  25908. } else {
  25909. if (!parser.parse(xml)) {
  25910. throw new Error('XML parsing error: ' + parser.getError());
  25911. }
  25912. }
  25913. if (result[options.elementsKey]) {
  25914. var temp = result[options.elementsKey];
  25915. delete result[options.elementsKey];
  25916. result[options.elementsKey] = temp;
  25917. delete result.text;
  25918. }
  25919. return result;
  25920. };
  25921. /***/ }),
  25922. /***/ 1388:
  25923. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  25924. var helper = __webpack_require__(4740);
  25925. var xml2js = __webpack_require__(1229);
  25926. function validateOptions (userOptions) {
  25927. var options = helper.copyOptions(userOptions);
  25928. helper.ensureSpacesExists(options);
  25929. return options;
  25930. }
  25931. module.exports = function(xml, userOptions) {
  25932. var options, js, json, parentKey;
  25933. options = validateOptions(userOptions);
  25934. js = xml2js(xml, options);
  25935. parentKey = 'compact' in options && options.compact ? '_parent' : 'parent';
  25936. // parentKey = ptions.compact ? '_parent' : 'parent'; // consider this
  25937. if ('addParent' in options && options.addParent) {
  25938. json = JSON.stringify(js, function (k, v) { return k === parentKey? '_' : v; }, options.spaces);
  25939. } else {
  25940. json = JSON.stringify(js, null, options.spaces);
  25941. }
  25942. return json.replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029');
  25943. };
  25944. /***/ }),
  25945. /***/ 8399:
  25946. /***/ (function(module) {
  25947. /**
  25948. * geostats() is a tiny and standalone javascript library for classification
  25949. * Project page - https://github.com/simogeo/geostats
  25950. * Copyright (c) 2011 Simon Georget, http://www.empreinte-urbaine.eu
  25951. * Licensed under the MIT license
  25952. */
  25953. (function (definition) {
  25954. // This file will function properly as a <script> tag, or a module
  25955. // using CommonJS and NodeJS or RequireJS module formats.
  25956. // CommonJS
  25957. if (true) {
  25958. module.exports = definition();
  25959. // RequireJS
  25960. } else {}
  25961. })(function () {
  25962. var isInt = function(n) {
  25963. return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
  25964. } // 6 characters
  25965. var _t = function(str) {
  25966. return str;
  25967. };
  25968. //taking from http://stackoverflow.com/questions/18082/validate-decimal-numbers-in-javascript-isnumeric
  25969. var isNumber = function(n) {
  25970. return !isNaN(parseFloat(n)) && isFinite(n);
  25971. }
  25972. //indexOf polyfill
  25973. // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
  25974. if (!Array.prototype.indexOf) {
  25975. Array.prototype.indexOf = function (searchElement, fromIndex) {
  25976. if ( this === undefined || this === null ) {
  25977. throw new TypeError( '"this" is null or not defined' );
  25978. }
  25979. var length = this.length >>> 0; // Hack to convert object.length to a UInt32
  25980. fromIndex = +fromIndex || 0;
  25981. if (Math.abs(fromIndex) === Infinity) {
  25982. fromIndex = 0;
  25983. }
  25984. if (fromIndex < 0) {
  25985. fromIndex += length;
  25986. if (fromIndex < 0) {
  25987. fromIndex = 0;
  25988. }
  25989. }
  25990. for (;fromIndex < length; fromIndex++) {
  25991. if (this[fromIndex] === searchElement) {
  25992. return fromIndex;
  25993. }
  25994. }
  25995. return -1;
  25996. };
  25997. }
  25998. var geostats = function(a) {
  25999. this.objectID = '';
  26000. this.separator = ' - ';
  26001. this.legendSeparator = this.separator;
  26002. this.method = '';
  26003. this.precision = 0;
  26004. this.precisionflag = 'auto';
  26005. this.roundlength = 2; // Number of decimals, round values
  26006. this.is_uniqueValues = false;
  26007. this.debug = false;
  26008. this.silent = false;
  26009. this.bounds = Array();
  26010. this.ranges = Array();
  26011. this.inner_ranges = null;
  26012. this.colors = Array();
  26013. this.counter = Array();
  26014. // statistics information
  26015. this.stat_sorted = null;
  26016. this.stat_mean = null;
  26017. this.stat_median = null;
  26018. this.stat_sum = null;
  26019. this.stat_max = null;
  26020. this.stat_min = null;
  26021. this.stat_pop = null;
  26022. this.stat_variance = null;
  26023. this.stat_stddev = null;
  26024. this.stat_cov = null;
  26025. /**
  26026. * logging method
  26027. */
  26028. this.log = function(msg, force) {
  26029. if(this.debug == true || force != null)
  26030. console.log(this.objectID + "(object id) :: " + msg);
  26031. };
  26032. /**
  26033. * Set bounds
  26034. */
  26035. this.setBounds = function(a) {
  26036. this.log('Setting bounds (' + a.length + ') : ' + a.join());
  26037. this.bounds = Array() // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
  26038. this.bounds = a;
  26039. //this.bounds = this.decimalFormat(a);
  26040. };
  26041. /**
  26042. * Set a new serie
  26043. */
  26044. this.setSerie = function(a) {
  26045. this.log('Setting serie (' + a.length + ') : ' + a.join());
  26046. this.serie = Array() // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
  26047. this.serie = a;
  26048. //reset statistics after changing serie
  26049. this.resetStatistics();
  26050. this.setPrecision();
  26051. };
  26052. /**
  26053. * Set colors
  26054. */
  26055. this.setColors = function(colors) {
  26056. this.log('Setting color ramp (' + colors.length + ') : ' + colors.join());
  26057. this.colors = colors;
  26058. };
  26059. /**
  26060. * Get feature count
  26061. * With bounds array(0, 0.75, 1.5, 2.25, 3);
  26062. * should populate this.counter with 5 keys
  26063. * and increment counters for each key
  26064. */
  26065. this.doCount = function() {
  26066. if (this._nodata())
  26067. return;
  26068. var tmp = this.sorted();
  26069. this.counter = new Array();
  26070. // we init counter with 0 value
  26071. for(i = 0; i < this.bounds.length -1; i++) {
  26072. this.counter[i]= 0;
  26073. }
  26074. for(j=0; j < tmp.length; j++) {
  26075. // get current class for value to increment the counter
  26076. var cclass = this.getClass(tmp[j]);
  26077. this.counter[cclass]++;
  26078. }
  26079. };
  26080. /**
  26081. * Set decimal precision according to user input
  26082. * or automatcally determined according
  26083. * to the given serie.
  26084. */
  26085. this.setPrecision = function(decimals) {
  26086. // only when called from user
  26087. if(typeof decimals !== "undefined") {
  26088. this.precisionflag = 'manual';
  26089. this.precision = decimals;
  26090. }
  26091. // we calculate the maximal decimal length on given serie
  26092. if(this.precisionflag == 'auto') {
  26093. for (var i = 0; i < this.serie.length; i++) {
  26094. // check if the given value is a number and a float
  26095. if (!isNaN((this.serie[i]+"")) && (this.serie[i]+"").toString().indexOf('.') != -1) {
  26096. var precision = (this.serie[i] + "").split(".")[1].length;
  26097. } else {
  26098. var precision = 0;
  26099. }
  26100. if(precision > this.precision) {
  26101. this.precision = precision;
  26102. }
  26103. }
  26104. }
  26105. if(this.precision > 20) {
  26106. // prevent "Uncaught RangeError: toFixed() digits argument must be between 0 and 20" bug. See https://github.com/simogeo/geostats/issues/34
  26107. this.log('this.precision value (' + this.precision + ') is greater than max value. Automatic set-up to 20 to prevent "Uncaught RangeError: toFixed()" when calling decimalFormat() method.');
  26108. this.precision = 20;
  26109. }
  26110. this.log('Calling setPrecision(). Mode : ' + this.precisionflag + ' - Decimals : '+ this.precision);
  26111. this.serie = this.decimalFormat(this.serie);
  26112. };
  26113. /**
  26114. * Format array numbers regarding to precision
  26115. */
  26116. this.decimalFormat = function(a) {
  26117. var b = new Array();
  26118. for (var i = 0; i < a.length; i++) {
  26119. // check if the given value is a number
  26120. if (isNumber(a[i])) {
  26121. b[i] = parseFloat(parseFloat(a[i]).toFixed(this.precision));
  26122. } else {
  26123. b[i] = a[i];
  26124. }
  26125. }
  26126. return b;
  26127. }
  26128. /**
  26129. * Transform a bounds array to a range array the following array : array(0,
  26130. * 0.75, 1.5, 2.25, 3); becomes : array('0-0.75', '0.75-1.5', '1.5-2.25',
  26131. * '2.25-3');
  26132. */
  26133. this.setRanges = function() {
  26134. this.ranges = Array(); // init empty array to prevent bug when calling classification after another with less items (sample getQuantile(6) and getQuantile(4))
  26135. for (i = 0; i < (this.bounds.length - 1); i++) {
  26136. this.ranges[i] = this.bounds[i] + this.separator + this.bounds[i + 1];
  26137. }
  26138. };
  26139. /** return min value */
  26140. this.min = function() {
  26141. if (this._nodata())
  26142. return;
  26143. this.stat_min = this.serie[0];
  26144. for (i = 0; i < this.pop(); i++) {
  26145. if (this.serie[i] < this.stat_min) {
  26146. this.stat_min = this.serie[i];
  26147. }
  26148. }
  26149. return this.stat_min;
  26150. };
  26151. /** return max value */
  26152. this.max = function() {
  26153. if (this._nodata())
  26154. return;
  26155. this.stat_max = this.serie[0];
  26156. for (i = 0; i < this.pop(); i++) {
  26157. if (this.serie[i] > this.stat_max) {
  26158. this.stat_max = this.serie[i];
  26159. }
  26160. }
  26161. return this.stat_max;
  26162. };
  26163. /** return sum value */
  26164. this.sum = function() {
  26165. if (this._nodata())
  26166. return;
  26167. if (this.stat_sum == null) {
  26168. this.stat_sum = 0;
  26169. for (i = 0; i < this.pop(); i++) {
  26170. this.stat_sum += parseFloat(this.serie[i]);
  26171. }
  26172. }
  26173. return this.stat_sum;
  26174. };
  26175. /** return population number */
  26176. this.pop = function() {
  26177. if (this._nodata())
  26178. return;
  26179. if (this.stat_pop == null) {
  26180. this.stat_pop = this.serie.length;
  26181. }
  26182. return this.stat_pop;
  26183. };
  26184. /** return mean value */
  26185. this.mean = function() {
  26186. if (this._nodata())
  26187. return;
  26188. if (this.stat_mean == null) {
  26189. this.stat_mean = parseFloat(this.sum() / this.pop());
  26190. }
  26191. return this.stat_mean;
  26192. };
  26193. /** return median value */
  26194. this.median = function() {
  26195. if (this._nodata())
  26196. return;
  26197. if (this.stat_median == null) {
  26198. this.stat_median = 0;
  26199. var tmp = this.sorted();
  26200. // serie pop is odd
  26201. if (tmp.length % 2) {
  26202. this.stat_median = parseFloat(tmp[(Math.ceil(tmp.length / 2) - 1)]);
  26203. // serie pop is even
  26204. } else {
  26205. this.stat_median = ( parseFloat(tmp[((tmp.length / 2) - 1)]) + parseFloat(tmp[(tmp.length / 2)]) ) / 2;
  26206. }
  26207. }
  26208. return this.stat_median;
  26209. };
  26210. /** return variance value */
  26211. this.variance = function() {
  26212. round = (typeof round === "undefined") ? true : false;
  26213. if (this._nodata())
  26214. return;
  26215. if (this.stat_variance == null) {
  26216. var tmp = 0, serie_mean = this.mean();
  26217. for (var i = 0; i < this.pop(); i++) {
  26218. tmp += Math.pow( (this.serie[i] - serie_mean), 2 );
  26219. }
  26220. this.stat_variance = tmp / this.pop();
  26221. if(round == true) {
  26222. this.stat_variance = Math.round(this.stat_variance * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
  26223. }
  26224. }
  26225. return this.stat_variance;
  26226. };
  26227. /** return standard deviation value */
  26228. this.stddev = function(round) {
  26229. round = (typeof round === "undefined") ? true : false;
  26230. if (this._nodata())
  26231. return;
  26232. if (this.stat_stddev == null) {
  26233. this.stat_stddev = Math.sqrt(this.variance());
  26234. if(round == true) {
  26235. this.stat_stddev = Math.round(this.stat_stddev * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
  26236. }
  26237. }
  26238. return this.stat_stddev;
  26239. };
  26240. /** coefficient of variation - measure of dispersion */
  26241. this.cov = function(round) {
  26242. round = (typeof round === "undefined") ? true : false;
  26243. if (this._nodata())
  26244. return;
  26245. if (this.stat_cov == null) {
  26246. this.stat_cov = this.stddev() / this.mean();
  26247. if(round == true) {
  26248. this.stat_cov = Math.round(this.stat_cov * Math.pow(10,this.roundlength) )/ Math.pow(10,this.roundlength);
  26249. }
  26250. }
  26251. return this.stat_cov;
  26252. };
  26253. /** reset all attributes after setting a new serie */
  26254. this.resetStatistics = function() {
  26255. this.stat_sorted = null;
  26256. this.stat_mean = null;
  26257. this.stat_median = null;
  26258. this.stat_sum = null;
  26259. this.stat_max = null;
  26260. this.stat_min = null;
  26261. this.stat_pop = null;
  26262. this.stat_variance = null;
  26263. this.stat_stddev = null;
  26264. this.stat_cov = null;
  26265. }
  26266. /** data test */
  26267. this._nodata = function() {
  26268. if (this.serie.length == 0) {
  26269. if(this.silent) this.log("[silent mode] Error. You should first enter a serie!", true);
  26270. else throw new TypeError("Error. You should first enter a serie!");
  26271. return 1;
  26272. } else
  26273. return 0;
  26274. };
  26275. /** check if the serie contains negative value */
  26276. this._hasNegativeValue = function() {
  26277. for (i = 0; i < this.serie.length; i++) {
  26278. if(this.serie[i] < 0)
  26279. return true;
  26280. }
  26281. return false;
  26282. };
  26283. /** check if the serie contains zero value */
  26284. this._hasZeroValue = function() {
  26285. for (i = 0; i < this.serie.length; i++) {
  26286. if(parseFloat(this.serie[i]) === 0)
  26287. return true;
  26288. }
  26289. return false;
  26290. };
  26291. /** return sorted values (as array) */
  26292. this.sorted = function() {
  26293. if (this.stat_sorted == null) {
  26294. if(this.is_uniqueValues == false) {
  26295. this.stat_sorted = this.serie.sort(function(a, b) {
  26296. return a - b;
  26297. });
  26298. } else {
  26299. this.stat_sorted = this.serie.sort(function(a,b){
  26300. var nameA=a.toString().toLowerCase(), nameB=b.toString().toLowerCase();
  26301. if(nameA < nameB) return -1;
  26302. if(nameA > nameB) return 1;
  26303. return 0;
  26304. })
  26305. }
  26306. }
  26307. return this.stat_sorted;
  26308. };
  26309. /** return all info */
  26310. this.info = function() {
  26311. if (this._nodata())
  26312. return;
  26313. var content = '';
  26314. content += _t('Population') + ' : ' + this.pop() + ' - [' + _t('Min')
  26315. + ' : ' + this.min() + ' | ' + _t('Max') + ' : ' + this.max()
  26316. + ']' + "\n";
  26317. content += _t('Mean') + ' : ' + this.mean() + ' - ' + _t('Median') + ' : ' + this.median() + "\n";
  26318. content += _t('Variance') + ' : ' + this.variance() + ' - ' + _t('Standard deviation') + ' : ' + this.stddev()
  26319. + ' - ' + _t('Coefficient of variation') + ' : ' + this.cov() + "\n";
  26320. return content;
  26321. };
  26322. /**
  26323. * Set Manual classification Return an array with bounds : ie array(0,
  26324. * 0.75, 1.5, 2.25, 3);
  26325. * Set ranges and prepare data for displaying legend
  26326. *
  26327. */
  26328. this.setClassManually = function(array) {
  26329. if (this._nodata())
  26330. return;
  26331. if(array[0] !== this.min() || array[array.length-1] !== this.max()) {
  26332. if(this.silent) this.log("[silent mode] " + t('Given bounds may not be correct! please check your input.\nMin value : ' + this.min() + ' / Max value : ' + this.max()), true);
  26333. else throw new TypeError(_t('Given bounds may not be correct! please check your input.\nMin value : ' + this.min() + ' / Max value : ' + this.max()));
  26334. return;
  26335. }
  26336. this.setBounds(array);
  26337. this.setRanges();
  26338. // we specify the classification method
  26339. this.method = _t('manual classification') + ' (' + (array.length -1) + ' ' + _t('classes') + ')';
  26340. return this.bounds;
  26341. };
  26342. /**
  26343. * Equal intervals classification Return an array with bounds : ie array(0,
  26344. * 0.75, 1.5, 2.25, 3);
  26345. */
  26346. this.getClassEqInterval = function(nbClass, forceMin, forceMax) {
  26347. if (this._nodata())
  26348. return;
  26349. var tmpMin = (typeof forceMin === "undefined") ? this.min() : forceMin;
  26350. var tmpMax = (typeof forceMax === "undefined") ? this.max() : forceMax;
  26351. var a = Array();
  26352. var val = tmpMin;
  26353. var interval = (tmpMax - tmpMin) / nbClass;
  26354. for (i = 0; i <= nbClass; i++) {
  26355. a[i] = val;
  26356. val += interval;
  26357. }
  26358. //-> Fix last bound to Max of values
  26359. a[nbClass] = tmpMax;
  26360. this.setBounds(a);
  26361. this.setRanges();
  26362. // we specify the classification method
  26363. this.method = _t('eq. intervals') + ' (' + nbClass + ' ' + _t('classes') + ')';
  26364. return this.bounds;
  26365. };
  26366. this.getQuantiles = function(nbClass) {
  26367. var tmp = this.sorted();
  26368. var quantiles = [];
  26369. var step = this.pop() / nbClass;
  26370. for (var i = 1; i < nbClass; i++) {
  26371. var qidx = Math.round(i*step+0.49);
  26372. quantiles.push(tmp[qidx-1]); // zero-based
  26373. }
  26374. return quantiles;
  26375. };
  26376. /**
  26377. * Quantile classification Return an array with bounds : ie array(0, 0.75,
  26378. * 1.5, 2.25, 3);
  26379. */
  26380. this.getClassQuantile = function(nbClass) {
  26381. if (this._nodata())
  26382. return;
  26383. var tmp = this.sorted();
  26384. var bounds = this.getQuantiles(nbClass);
  26385. bounds.unshift(tmp[0]);
  26386. if (bounds[tmp.length - 1] !== tmp[tmp.length - 1])
  26387. bounds.push(tmp[tmp.length - 1]);
  26388. this.setBounds(bounds);
  26389. this.setRanges();
  26390. // we specify the classification method
  26391. this.method = _t('quantile') + ' (' + nbClass + ' ' + _t('classes') + ')';
  26392. return this.bounds;
  26393. };
  26394. /**
  26395. * Standard Deviation classification
  26396. * Return an array with bounds : ie array(0,
  26397. * 0.75, 1.5, 2.25, 3);
  26398. */
  26399. this.getClassStdDeviation = function(nbClass, matchBounds) {
  26400. if (this._nodata())
  26401. return;
  26402. var tmpMax = this.max();
  26403. var tmpMin = this.min();
  26404. var a = Array();
  26405. // number of classes is odd
  26406. if(nbClass % 2 == 1) {
  26407. // Euclidean division to get the inferior bound
  26408. var infBound = Math.floor(nbClass / 2);
  26409. var supBound = infBound + 1;
  26410. // we set the central bounds
  26411. a[infBound] = this.mean() - ( this.stddev() / 2);
  26412. a[supBound] = this.mean() + ( this.stddev() / 2);
  26413. // Values < to infBound, except first one
  26414. for (i = infBound - 1; i > 0; i--) {
  26415. var val = a[i+1] - this.stddev();
  26416. a[i] = val;
  26417. }
  26418. // Values > to supBound, except last one
  26419. for (i = supBound + 1; i < nbClass; i++) {
  26420. var val = a[i-1] + this.stddev();
  26421. a[i] = val;
  26422. }
  26423. // number of classes is even
  26424. } else {
  26425. var meanBound = nbClass / 2;
  26426. // we get the mean value
  26427. a[meanBound] = this.mean();
  26428. // Values < to the mean, except first one
  26429. for (i = meanBound - 1; i > 0; i--) {
  26430. var val = a[i+1] - this.stddev();
  26431. a[i] = val;
  26432. }
  26433. // Values > to the mean, except last one
  26434. for (i = meanBound + 1; i < nbClass; i++) {
  26435. var val = a[i-1] + this.stddev();
  26436. a[i] = val;
  26437. }
  26438. }
  26439. // we finally set the first value
  26440. // do we excatly match min value or not ?
  26441. a[0] = (typeof matchBounds === "undefined") ? a[1]-this.stddev() : this.min();
  26442. // we finally set the last value
  26443. // do we excatly match max value or not ?
  26444. a[nbClass] = (typeof matchBounds === "undefined") ? a[nbClass-1]+this.stddev() : this.max();
  26445. this.setBounds(a);
  26446. this.setRanges();
  26447. // we specify the classification method
  26448. this.method = _t('std deviation') + ' (' + nbClass + ' ' + _t('classes')+ ')';
  26449. return this.bounds;
  26450. };
  26451. /**
  26452. * Geometric Progression classification
  26453. * http://en.wikipedia.org/wiki/Geometric_progression
  26454. * Return an array with bounds : ie array(0,
  26455. * 0.75, 1.5, 2.25, 3);
  26456. */
  26457. this.getClassGeometricProgression = function(nbClass) {
  26458. if (this._nodata())
  26459. return;
  26460. if(this._hasNegativeValue() || this._hasZeroValue()) {
  26461. if(this.silent) this.log("[silent mode] " + _t('geometric progression can\'t be applied with a serie containing negative or zero values.'), true);
  26462. else throw new TypeError(_t('geometric progression can\'t be applied with a serie containing negative or zero values.'));
  26463. return;
  26464. }
  26465. var a = Array();
  26466. var tmpMin = this.min();
  26467. var tmpMax = this.max();
  26468. var logMax = Math.log(tmpMax) / Math.LN10; // max decimal logarithm (or base 10)
  26469. var logMin = Math.log(tmpMin) / Math.LN10;; // min decimal logarithm (or base 10)
  26470. var interval = (logMax - logMin) / nbClass;
  26471. // we compute log bounds
  26472. for (i = 0; i < nbClass; i++) {
  26473. if(i == 0) {
  26474. a[i] = logMin;
  26475. } else {
  26476. a[i] = a[i-1] + interval;
  26477. }
  26478. }
  26479. // we compute antilog
  26480. a = a.map(function(x) { return Math.pow(10, x); });
  26481. // and we finally add max value
  26482. a.push(this.max());
  26483. this.setBounds(a);
  26484. this.setRanges();
  26485. // we specify the classification method
  26486. this.method = _t('geometric progression') + ' (' + nbClass + ' ' + _t('classes') + ')';
  26487. return this.bounds;
  26488. };
  26489. /**
  26490. * Arithmetic Progression classification
  26491. * http://en.wikipedia.org/wiki/Arithmetic_progression
  26492. * Return an array with bounds : ie array(0,
  26493. * 0.75, 1.5, 2.25, 3);
  26494. */
  26495. this.getClassArithmeticProgression = function(nbClass) {
  26496. if (this._nodata())
  26497. return;
  26498. var denominator = 0;
  26499. // we compute the (french) "Raison"
  26500. for (i = 1; i <= nbClass; i++) {
  26501. denominator += i;
  26502. }
  26503. var a = Array();
  26504. var tmpMin = this.min();
  26505. var tmpMax = this.max();
  26506. var interval = (tmpMax - tmpMin) / denominator;
  26507. for (i = 0; i <= nbClass; i++) {
  26508. if(i == 0) {
  26509. a[i] = tmpMin;
  26510. } else {
  26511. a[i] = a[i-1] + (i * interval);
  26512. }
  26513. }
  26514. this.setBounds(a);
  26515. this.setRanges();
  26516. // we specify the classification method
  26517. this.method = _t('arithmetic progression') + ' (' + nbClass + ' ' + _t('classes') + ')';
  26518. return this.bounds;
  26519. };
  26520. /**
  26521. * Credits : Doug Curl (javascript) and Daniel J Lewis (python implementation)
  26522. * http://www.arcgis.com/home/item.html?id=0b633ff2f40d412995b8be377211c47b
  26523. * http://danieljlewis.org/2010/06/07/jenks-natural-breaks-algorithm-in-python/
  26524. */
  26525. this.getClassJenks = function(nbClass) {
  26526. if (this._nodata())
  26527. return;
  26528. dataList = this.sorted();
  26529. // now iterate through the datalist:
  26530. // determine mat1 and mat2
  26531. // really not sure how these 2 different arrays are set - the code for
  26532. // each seems the same!
  26533. // but the effect are 2 different arrays: mat1 and mat2
  26534. var mat1 = []
  26535. for ( var x = 0, xl = dataList.length + 1; x < xl; x++) {
  26536. var temp = []
  26537. for ( var j = 0, jl = nbClass + 1; j < jl; j++) {
  26538. temp.push(0)
  26539. }
  26540. mat1.push(temp)
  26541. }
  26542. var mat2 = []
  26543. for ( var i = 0, il = dataList.length + 1; i < il; i++) {
  26544. var temp2 = []
  26545. for ( var c = 0, cl = nbClass + 1; c < cl; c++) {
  26546. temp2.push(0)
  26547. }
  26548. mat2.push(temp2)
  26549. }
  26550. // absolutely no idea what this does - best I can tell, it sets the 1st
  26551. // group in the
  26552. // mat1 and mat2 arrays to 1 and 0 respectively
  26553. for ( var y = 1, yl = nbClass + 1; y < yl; y++) {
  26554. mat1[0][y] = 1
  26555. mat2[0][y] = 0
  26556. for ( var t = 1, tl = dataList.length + 1; t < tl; t++) {
  26557. mat2[t][y] = Infinity
  26558. }
  26559. var v = 0.0
  26560. }
  26561. // and this part - I'm a little clueless on - but it works
  26562. // pretty sure it iterates across the entire dataset and compares each
  26563. // value to
  26564. // one another to and adjust the indices until you meet the rules:
  26565. // minimum deviation
  26566. // within a class and maximum separation between classes
  26567. for ( var l = 2, ll = dataList.length + 1; l < ll; l++) {
  26568. var s1 = 0.0
  26569. var s2 = 0.0
  26570. var w = 0.0
  26571. for ( var m = 1, ml = l + 1; m < ml; m++) {
  26572. var i3 = l - m + 1
  26573. var val = parseFloat(dataList[i3 - 1])
  26574. s2 += val * val
  26575. s1 += val
  26576. w += 1
  26577. v = s2 - (s1 * s1) / w
  26578. var i4 = i3 - 1
  26579. if (i4 != 0) {
  26580. for ( var p = 2, pl = nbClass + 1; p < pl; p++) {
  26581. if (mat2[l][p] >= (v + mat2[i4][p - 1])) {
  26582. mat1[l][p] = i3
  26583. mat2[l][p] = v + mat2[i4][p - 1]
  26584. }
  26585. }
  26586. }
  26587. }
  26588. mat1[l][1] = 1
  26589. mat2[l][1] = v
  26590. }
  26591. var k = dataList.length
  26592. var kclass = []
  26593. // fill the kclass (classification) array with zeros:
  26594. for (i = 0; i <= nbClass; i++) {
  26595. kclass.push(0);
  26596. }
  26597. // this is the last number in the array:
  26598. kclass[nbClass] = parseFloat(dataList[dataList.length - 1])
  26599. // this is the first number - can set to zero, but want to set to lowest
  26600. // to use for legend:
  26601. kclass[0] = parseFloat(dataList[0])
  26602. var countNum = nbClass
  26603. while (countNum >= 2) {
  26604. var id = parseInt((mat1[k][countNum]) - 2)
  26605. kclass[countNum - 1] = dataList[id]
  26606. k = parseInt((mat1[k][countNum] - 1))
  26607. // spits out the rank and value of the break values:
  26608. // console.log("id="+id,"rank = " + String(mat1[k][countNum]),"val =
  26609. // " + String(dataList[id]))
  26610. // count down:
  26611. countNum -= 1
  26612. }
  26613. // check to see if the 0 and 1 in the array are the same - if so, set 0
  26614. // to 0:
  26615. if (kclass[0] == kclass[1]) {
  26616. kclass[0] = 0
  26617. }
  26618. this.setBounds(kclass);
  26619. this.setRanges();
  26620. this.method = _t('Jenks') + ' (' + nbClass + ' ' + _t('classes') + ')';
  26621. return this.bounds; //array of breaks
  26622. }
  26623. /**
  26624. * Quantile classification Return an array with bounds : ie array(0, 0.75,
  26625. * 1.5, 2.25, 3);
  26626. */
  26627. this.getClassUniqueValues = function() {
  26628. if (this._nodata())
  26629. return;
  26630. this.is_uniqueValues = true;
  26631. var tmp = this.sorted(); // display in alphabetical order
  26632. var a = Array();
  26633. for (i = 0; i < this.pop(); i++) {
  26634. if(a.indexOf(tmp[i]) === -1)
  26635. a.push(tmp[i]);
  26636. }
  26637. this.bounds = a;
  26638. // we specify the classification method
  26639. this.method = _t('unique values');
  26640. return a;
  26641. };
  26642. /**
  26643. * Return the class of a given value.
  26644. * For example value : 6
  26645. * and bounds array = (0, 4, 8, 12);
  26646. * Return 2
  26647. */
  26648. this.getClass = function(value) {
  26649. for(i = 0; i < this.bounds.length; i++) {
  26650. if(this.is_uniqueValues == true) {
  26651. if(value == this.bounds[i])
  26652. return i;
  26653. } else {
  26654. // parseFloat() is necessary
  26655. if(parseFloat(value) <= this.bounds[i + 1]) {
  26656. return i;
  26657. }
  26658. }
  26659. }
  26660. return _t("Unable to get value's class.");
  26661. };
  26662. /**
  26663. * Return the ranges array : array('0-0.75', '0.75-1.5', '1.5-2.25',
  26664. * '2.25-3');
  26665. */
  26666. this.getRanges = function() {
  26667. return this.ranges;
  26668. };
  26669. /**
  26670. * Returns the number/index of this.ranges that value falls into
  26671. */
  26672. this.getRangeNum = function(value) {
  26673. var bounds, i;
  26674. for (i = 0; i < this.ranges.length; i++) {
  26675. bounds = this.ranges[i].split(/ - /);
  26676. if (value <= parseFloat(bounds[1])) {
  26677. return i;
  26678. }
  26679. }
  26680. }
  26681. /*
  26682. * Compute inner ranges based on serie.
  26683. * Produce discontinous ranges used for legend - return an array similar to :
  26684. * array('0.00-0.74', '0.98-1.52', '1.78-2.25', '2.99-3.14');
  26685. * If inner ranges already computed, return array values.
  26686. */
  26687. this.getInnerRanges = function() {
  26688. // if already computed, we return the result
  26689. if(this.inner_ranges != null)
  26690. return this.inner_ranges;
  26691. var a = new Array();
  26692. var tmp = this.sorted();
  26693. var cnt = 1; // bounds array counter
  26694. for (i = 0; i < tmp.length; i++) {
  26695. if(i == 0) var range_firstvalue = tmp[i]; // we init first range value
  26696. if(parseFloat(tmp[i]) > parseFloat(this.bounds[cnt])) {
  26697. a[cnt - 1] = '' + range_firstvalue + this.separator + tmp[i-1];
  26698. var range_firstvalue = tmp[i];
  26699. cnt++;
  26700. }
  26701. // we reach the last range, we finally complete manually
  26702. // and return the array
  26703. if(cnt == (this.bounds.length - 1)) {
  26704. // we set the last value
  26705. a[cnt - 1] = '' + range_firstvalue + this.separator + tmp[tmp.length-1];
  26706. this.inner_ranges = a;
  26707. return this.inner_ranges;
  26708. }
  26709. }
  26710. };
  26711. this.getSortedlist = function() {
  26712. return this.sorted().join(', ');
  26713. };
  26714. /**
  26715. * Return an html legend
  26716. * colors : specify an array of color (hexadecimal values)
  26717. * legend : specify a text input for the legend. By default, just displays 'legend'
  26718. * counter : if not null, display counter value
  26719. * callback : if not null, callback function applied on legend boundaries
  26720. * mode : null, 'default', 'distinct', 'discontinuous' :
  26721. * - if mode is null, will display legend as 'default mode'
  26722. * - 'default' : displays ranges like in ranges array (continuous values), sample : 29.26 - 378.80 / 378.80 - 2762.25 / 2762.25 - 6884.84
  26723. * - 'distinct' : Add + 1 according to decimal precision to distinguish classes (discrete values), sample : 29.26 - 378.80 / 378.81 - 2762.25 / 2762.26 - 6884.84
  26724. * - 'discontinuous' : indicates the range of data actually falling in each class , sample : 29.26 - 225.43 / 852.12 - 2762.20 / 3001.25 - 6884.84 / not implemented yet
  26725. * order : null, 'ASC', 'DESC'
  26726. */
  26727. this.getHtmlLegend = function(colors, legend, counter, callback, mode, order) {
  26728. var cnt= '';
  26729. var elements = new Array();
  26730. this.doCount(); // we do count, even if not displayed
  26731. if(colors != null) {
  26732. ccolors = colors;
  26733. }
  26734. else {
  26735. ccolors = this.colors;
  26736. }
  26737. if(legend != null) {
  26738. lg = legend;
  26739. }
  26740. else {
  26741. lg = 'Legend';
  26742. }
  26743. if(counter != null) {
  26744. getcounter = true;
  26745. }
  26746. else {
  26747. getcounter = false;
  26748. }
  26749. if(callback != null) {
  26750. fn = callback;
  26751. }
  26752. else {
  26753. fn = function(o) {return o;};
  26754. }
  26755. if(mode == null) {
  26756. mode = 'default';
  26757. }
  26758. if(mode == 'discontinuous') {
  26759. this.getInnerRanges();
  26760. // check if some classes are not populated / equivalent of in_array function
  26761. if(this.counter.indexOf(0) !== -1) {
  26762. if(this.silent) this.log("[silent mode] " + _t("Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\nPlease switch to 'default' or 'distinct' modes. Exit!"), true);
  26763. else throw new TypeError(_t("Geostats cannot apply 'discontinuous' mode to the getHtmlLegend() method because some classes are not populated.\nPlease switch to 'default' or 'distinct' modes. Exit!"));
  26764. return;
  26765. }
  26766. }
  26767. if(order !== 'DESC') order = 'ASC';
  26768. if(ccolors.length < this.ranges.length) {
  26769. if(this.silent) this.log("[silent mode] " + _t('The number of colors should fit the number of ranges. Exit!'), true);
  26770. else throw new TypeError(_t('The number of colors should fit the number of ranges. Exit!'));
  26771. return;
  26772. }
  26773. if(this.is_uniqueValues == false) {
  26774. for (i = 0; i < (this.ranges.length); i++) {
  26775. if(getcounter===true) {
  26776. cnt = ' <span class="geostats-legend-counter">(' + this.counter[i] + ')</span>';
  26777. }
  26778. //console.log("Ranges : " + this.ranges[i]);
  26779. // default mode
  26780. var tmp = this.ranges[i].split(this.separator);
  26781. var start_value = parseFloat(tmp[0]).toFixed(this.precision);
  26782. var end_value = parseFloat(tmp[1]).toFixed(this.precision);
  26783. // if mode == 'distinct' and we are not working on the first value
  26784. if(mode == 'distinct' && i != 0) {
  26785. if(isInt(start_value)) {
  26786. start_value = parseInt(start_value) + 1;
  26787. // format to float if necessary
  26788. if(this.precisionflag == 'manual' && this.precision != 0) start_value = parseFloat(start_value).toFixed(this.precision);
  26789. } else {
  26790. start_value = parseFloat(start_value) + (1 / Math.pow(10,this.precision));
  26791. // strangely the formula above return sometimes long decimal values,
  26792. // the following instruction fix it
  26793. start_value = parseFloat(start_value).toFixed(this.precision);
  26794. }
  26795. }
  26796. // if mode == 'discontinuous'
  26797. if(mode == 'discontinuous') {
  26798. var tmp = this.inner_ranges[i].split(this.separator);
  26799. // console.log("Ranges : " + this.inner_ranges[i]);
  26800. var start_value = parseFloat(tmp[0]).toFixed(this.precision);
  26801. var end_value = parseFloat(tmp[1]).toFixed(this.precision);
  26802. }
  26803. // we apply callback function
  26804. var el = fn(start_value) + this.legendSeparator + fn(end_value);
  26805. var block = '<div><div class="geostats-legend-block" style="background-color:' + ccolors[i] + '"></div> ' + el + cnt + '</div>';
  26806. elements.push(block);
  26807. }
  26808. } else {
  26809. // only if classification is done on unique values
  26810. for (i = 0; i < (this.bounds.length); i++) {
  26811. if(getcounter===true) {
  26812. cnt = ' <span class="geostats-legend-counter">(' + this.counter[i] + ')</span>';
  26813. }
  26814. var el = fn(this.bounds[i]);
  26815. var block = '<div><div class="geostats-legend-block" style="background-color:' + ccolors[i] + '"></div> ' + el + cnt + '</div>';
  26816. elements.push(block);
  26817. }
  26818. }
  26819. // do we reverse the return legend ?
  26820. if(order === 'DESC') elements.reverse();
  26821. // finally we create HTML and return it
  26822. var content = '<div class="geostats-legend"><div class="geostats-legend-title">' + _t(lg) + '</div>';
  26823. for (i = 0; i < (elements.length); i++) {
  26824. content += elements[i];
  26825. }
  26826. content += '</div>';
  26827. return content;
  26828. };
  26829. // object constructor
  26830. // At the end of script. If not setPrecision() method is not known
  26831. // we create an object identifier for debugging
  26832. this.objectID = new Date().getUTCMilliseconds();
  26833. this.log('Creating new geostats object');
  26834. if(typeof a !== 'undefined' && a.length > 0) {
  26835. this.serie = a;
  26836. this.setPrecision();
  26837. this.log('Setting serie (' + a.length + ') : ' + a.join());
  26838. } else {
  26839. this.serie = Array();
  26840. };
  26841. // creating aliases on classification function for backward compatibility
  26842. this.getJenks = this.getClassJenks;
  26843. this.getGeometricProgression = this.getClassGeometricProgression;
  26844. this.getEqInterval = this.getClassEqInterval;
  26845. this.getQuantile = this.getClassQuantile;
  26846. this.getStdDeviation = this.getClassStdDeviation;
  26847. this.getUniqueValues = this.getClassUniqueValues;
  26848. this.getArithmeticProgression = this.getClassArithmeticProgression;
  26849. };
  26850. window.geostats = geostats;
  26851. return geostats;
  26852. });
  26853. /***/ }),
  26854. /***/ 8553:
  26855. /***/ (function() {
  26856. /*
  26857. * JsonSQL
  26858. * By: Trent Richardson [http://trentrichardson.com]
  26859. * Version 0.1
  26860. * Last Modified: 1/1/2008
  26861. *
  26862. * Copyright 2008 Trent Richardson
  26863. *
  26864. * Licensed under the Apache License, Version 2.0 (the "License");
  26865. * you may not use this file except in compliance with the License.
  26866. * You may obtain a copy of the License at
  26867. *
  26868. * http://www.apache.org/licenses/LICENSE-2.0
  26869. *
  26870. * Unless required by applicable law or agreed to in writing, software
  26871. * distributed under the License is distributed on an "AS IS" BASIS,
  26872. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  26873. * See the License for the specific language governing permissions and
  26874. * limitations under the License.
  26875. */
  26876. window.jsonsql = {
  26877. query: function(sql,json){
  26878. var returnfields = sql.match(/^(select)\s+([a-z0-9_\,\.\s\*]+)\s+from\s+([a-z0-9_\.]+)(?: where\s+\((.+)\))?\s*(?:order\sby\s+([a-z0-9_\,]+))?\s*(asc|desc|ascnum|descnum)?\s*(?:limit\s+([0-9_\,]+))?/i);
  26879. var ops = {
  26880. fields: returnfields[2].replace(' ','').split(','),
  26881. from: returnfields[3].replace(' ',''),
  26882. where: (returnfields[4] == undefined)? "true":returnfields[4],
  26883. orderby: (returnfields[5] == undefined)? []:returnfields[5].replace(' ','').split(','),
  26884. order: (returnfields[6] == undefined)? "asc":returnfields[6],
  26885. limit: (returnfields[7] == undefined)? []:returnfields[7].replace(' ','').split(',')
  26886. };
  26887. return this.parse(json, ops);
  26888. },
  26889. parse: function(json,ops){
  26890. var o = { fields:["*"], from:"json", where:"", orderby:[], order: "asc", limit:[] };
  26891. for(i in ops) o[i] = ops[i];
  26892. var result = [];
  26893. result = this.returnFilter(json,o);
  26894. result = this.returnOrderBy(result,o.orderby,o.order);
  26895. result = this.returnLimit(result,o.limit);
  26896. return result;
  26897. },
  26898. returnFilter: function(json,jsonsql_o){
  26899. var jsonsql_scope = eval(jsonsql_o.from);
  26900. var jsonsql_result = [];
  26901. var jsonsql_rc = 0;
  26902. if(jsonsql_o.where == "")
  26903. jsonsql_o.where = "true";
  26904. for(var jsonsql_i in jsonsql_scope){
  26905. with(jsonsql_scope[jsonsql_i]){
  26906. if(eval(jsonsql_o.where)){
  26907. jsonsql_result[jsonsql_rc++] = this.returnFields(jsonsql_scope[jsonsql_i],jsonsql_o.fields);
  26908. }
  26909. }
  26910. }
  26911. return jsonsql_result;
  26912. },
  26913. returnFields: function(scope,fields){
  26914. if(fields.length == 0)
  26915. fields = ["*"];
  26916. if(fields[0] == "*")
  26917. return scope;
  26918. var returnobj = {};
  26919. for(var i in fields)
  26920. returnobj[fields[i]] = scope[fields[i]];
  26921. return returnobj;
  26922. },
  26923. returnOrderBy: function(result,orderby,order){
  26924. if(orderby.length == 0)
  26925. return result;
  26926. result.sort(function(a,b){
  26927. switch(order.toLowerCase()){
  26928. case "desc": return (eval('a.'+ orderby[0] +' < b.'+ orderby[0]))? 1:-1;
  26929. case "asc": return (eval('a.'+ orderby[0] +' > b.'+ orderby[0]))? 1:-1;
  26930. case "descnum": return (eval('a.'+ orderby[0] +' - b.'+ orderby[0]));
  26931. case "ascnum": return (eval('b.'+ orderby[0] +' - a.'+ orderby[0]));
  26932. }
  26933. });
  26934. return result;
  26935. },
  26936. returnLimit: function(result,limit){
  26937. switch(limit.length){
  26938. case 0: return result;
  26939. case 1: return result.splice(0,limit[0]);
  26940. case 2: return result.splice(limit[0]-1,limit[1]);
  26941. }
  26942. }
  26943. };
  26944. /***/ }),
  26945. /***/ 2769:
  26946. /***/ (function(module) {
  26947. "use strict";
  26948. module.exports = "data:image/png;base64,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";
  26949. /***/ }),
  26950. /***/ 2721:
  26951. /***/ (function(module) {
  26952. "use strict";
  26953. module.exports = __WEBPACK_EXTERNAL_MODULE__2721__;
  26954. /***/ }),
  26955. /***/ 5973:
  26956. /***/ (function(module) {
  26957. "use strict";
  26958. module.exports = __WEBPACK_EXTERNAL_MODULE__5973__;
  26959. /***/ }),
  26960. /***/ 550:
  26961. /***/ (function(module) {
  26962. "use strict";
  26963. module.exports = __WEBPACK_EXTERNAL_MODULE__550__;
  26964. /***/ }),
  26965. /***/ 2371:
  26966. /***/ (function(module) {
  26967. "use strict";
  26968. module.exports = __WEBPACK_EXTERNAL_MODULE__2371__;
  26969. /***/ }),
  26970. /***/ 3094:
  26971. /***/ (function(module) {
  26972. "use strict";
  26973. module.exports = __WEBPACK_EXTERNAL_MODULE__3094__;
  26974. /***/ }),
  26975. /***/ 3899:
  26976. /***/ (function(module) {
  26977. "use strict";
  26978. module.exports = __WEBPACK_EXTERNAL_MODULE__3899__;
  26979. /***/ }),
  26980. /***/ 2395:
  26981. /***/ (function(module) {
  26982. "use strict";
  26983. module.exports = __WEBPACK_EXTERNAL_MODULE__2395__;
  26984. /***/ }),
  26985. /***/ 2069:
  26986. /***/ (function(module) {
  26987. "use strict";
  26988. module.exports = __WEBPACK_EXTERNAL_MODULE__2069__;
  26989. /***/ }),
  26990. /***/ 375:
  26991. /***/ (function(module) {
  26992. "use strict";
  26993. module.exports = __WEBPACK_EXTERNAL_MODULE__375__;
  26994. /***/ }),
  26995. /***/ 2961:
  26996. /***/ (function() {
  26997. /* (ignored) */
  26998. /***/ }),
  26999. /***/ 9862:
  27000. /***/ (function() {
  27001. /* (ignored) */
  27002. /***/ }),
  27003. /***/ 2860:
  27004. /***/ (function() {
  27005. /* (ignored) */
  27006. /***/ }),
  27007. /***/ 964:
  27008. /***/ (function() {
  27009. /* (ignored) */
  27010. /***/ }),
  27011. /***/ 2783:
  27012. /***/ (function() {
  27013. /* (ignored) */
  27014. /***/ }),
  27015. /***/ 4836:
  27016. /***/ (function(module) {
  27017. function _interopRequireDefault(obj) {
  27018. return obj && obj.__esModule ? obj : {
  27019. "default": obj
  27020. };
  27021. }
  27022. module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
  27023. /***/ }),
  27024. /***/ 5263:
  27025. /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
  27026. var _typeof = (__webpack_require__(8698)["default"]);
  27027. function _getRequireWildcardCache(nodeInterop) {
  27028. if (typeof WeakMap !== "function") return null;
  27029. var cacheBabelInterop = new WeakMap();
  27030. var cacheNodeInterop = new WeakMap();
  27031. return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {
  27032. return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
  27033. })(nodeInterop);
  27034. }
  27035. function _interopRequireWildcard(obj, nodeInterop) {
  27036. if (!nodeInterop && obj && obj.__esModule) {
  27037. return obj;
  27038. }
  27039. if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") {
  27040. return {
  27041. "default": obj
  27042. };
  27043. }
  27044. var cache = _getRequireWildcardCache(nodeInterop);
  27045. if (cache && cache.has(obj)) {
  27046. return cache.get(obj);
  27047. }
  27048. var newObj = {};
  27049. var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
  27050. for (var key in obj) {
  27051. if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
  27052. var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
  27053. if (desc && (desc.get || desc.set)) {
  27054. Object.defineProperty(newObj, key, desc);
  27055. } else {
  27056. newObj[key] = obj[key];
  27057. }
  27058. }
  27059. }
  27060. newObj["default"] = obj;
  27061. if (cache) {
  27062. cache.set(obj, newObj);
  27063. }
  27064. return newObj;
  27065. }
  27066. module.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports["default"] = module.exports;
  27067. /***/ }),
  27068. /***/ 8698:
  27069. /***/ (function(module) {
  27070. function _typeof(obj) {
  27071. "@babel/helpers - typeof";
  27072. return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
  27073. return typeof obj;
  27074. } : function (obj) {
  27075. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  27076. }, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
  27077. }
  27078. module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
  27079. /***/ }),
  27080. /***/ 907:
  27081. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27082. "use strict";
  27083. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27084. /* harmony export */ Z: function() { return /* binding */ _arrayLikeToArray; }
  27085. /* harmony export */ });
  27086. function _arrayLikeToArray(arr, len) {
  27087. if (len == null || len > arr.length) len = arr.length;
  27088. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  27089. return arr2;
  27090. }
  27091. /***/ }),
  27092. /***/ 7326:
  27093. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27094. "use strict";
  27095. __webpack_require__.r(__webpack_exports__);
  27096. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27097. /* harmony export */ "default": function() { return /* binding */ _assertThisInitialized; }
  27098. /* harmony export */ });
  27099. function _assertThisInitialized(self) {
  27100. if (self === void 0) {
  27101. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  27102. }
  27103. return self;
  27104. }
  27105. /***/ }),
  27106. /***/ 5671:
  27107. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27108. "use strict";
  27109. __webpack_require__.r(__webpack_exports__);
  27110. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27111. /* harmony export */ "default": function() { return /* binding */ _classCallCheck; }
  27112. /* harmony export */ });
  27113. function _classCallCheck(instance, Constructor) {
  27114. if (!(instance instanceof Constructor)) {
  27115. throw new TypeError("Cannot call a class as a function");
  27116. }
  27117. }
  27118. /***/ }),
  27119. /***/ 3144:
  27120. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27121. "use strict";
  27122. __webpack_require__.r(__webpack_exports__);
  27123. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27124. /* harmony export */ "default": function() { return /* binding */ _createClass; }
  27125. /* harmony export */ });
  27126. /* harmony import */ var _toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9142);
  27127. function _defineProperties(target, props) {
  27128. for (var i = 0; i < props.length; i++) {
  27129. var descriptor = props[i];
  27130. descriptor.enumerable = descriptor.enumerable || false;
  27131. descriptor.configurable = true;
  27132. if ("value" in descriptor) descriptor.writable = true;
  27133. Object.defineProperty(target, (0,_toPropertyKey_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(descriptor.key), descriptor);
  27134. }
  27135. }
  27136. function _createClass(Constructor, protoProps, staticProps) {
  27137. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  27138. if (staticProps) _defineProperties(Constructor, staticProps);
  27139. Object.defineProperty(Constructor, "prototype", {
  27140. writable: false
  27141. });
  27142. return Constructor;
  27143. }
  27144. /***/ }),
  27145. /***/ 8557:
  27146. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27147. "use strict";
  27148. // ESM COMPAT FLAG
  27149. __webpack_require__.r(__webpack_exports__);
  27150. // EXPORTS
  27151. __webpack_require__.d(__webpack_exports__, {
  27152. "default": function() { return /* binding */ _createSuper; }
  27153. });
  27154. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js
  27155. function _getPrototypeOf(o) {
  27156. _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
  27157. return o.__proto__ || Object.getPrototypeOf(o);
  27158. };
  27159. return _getPrototypeOf(o);
  27160. }
  27161. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js
  27162. function _isNativeReflectConstruct() {
  27163. if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  27164. if (Reflect.construct.sham) return false;
  27165. if (typeof Proxy === "function") return true;
  27166. try {
  27167. Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
  27168. return true;
  27169. } catch (e) {
  27170. return false;
  27171. }
  27172. }
  27173. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js
  27174. var esm_typeof = __webpack_require__(1002);
  27175. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js
  27176. var assertThisInitialized = __webpack_require__(7326);
  27177. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js
  27178. function _possibleConstructorReturn(self, call) {
  27179. if (call && ((0,esm_typeof/* default */.Z)(call) === "object" || typeof call === "function")) {
  27180. return call;
  27181. } else if (call !== void 0) {
  27182. throw new TypeError("Derived constructors may only return object or undefined");
  27183. }
  27184. return (0,assertThisInitialized["default"])(self);
  27185. }
  27186. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/createSuper.js
  27187. function _createSuper(Derived) {
  27188. var hasNativeReflectConstruct = _isNativeReflectConstruct();
  27189. return function _createSuperInternal() {
  27190. var Super = _getPrototypeOf(Derived),
  27191. result;
  27192. if (hasNativeReflectConstruct) {
  27193. var NewTarget = _getPrototypeOf(this).constructor;
  27194. result = Reflect.construct(Super, arguments, NewTarget);
  27195. } else {
  27196. result = Super.apply(this, arguments);
  27197. }
  27198. return _possibleConstructorReturn(this, result);
  27199. };
  27200. }
  27201. /***/ }),
  27202. /***/ 9340:
  27203. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27204. "use strict";
  27205. // ESM COMPAT FLAG
  27206. __webpack_require__.r(__webpack_exports__);
  27207. // EXPORTS
  27208. __webpack_require__.d(__webpack_exports__, {
  27209. "default": function() { return /* binding */ _inherits; }
  27210. });
  27211. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js
  27212. function _setPrototypeOf(o, p) {
  27213. _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
  27214. o.__proto__ = p;
  27215. return o;
  27216. };
  27217. return _setPrototypeOf(o, p);
  27218. }
  27219. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js
  27220. function _inherits(subClass, superClass) {
  27221. if (typeof superClass !== "function" && superClass !== null) {
  27222. throw new TypeError("Super expression must either be null or a function");
  27223. }
  27224. subClass.prototype = Object.create(superClass && superClass.prototype, {
  27225. constructor: {
  27226. value: subClass,
  27227. writable: true,
  27228. configurable: true
  27229. }
  27230. });
  27231. Object.defineProperty(subClass, "prototype", {
  27232. writable: false
  27233. });
  27234. if (superClass) _setPrototypeOf(subClass, superClass);
  27235. }
  27236. /***/ }),
  27237. /***/ 8683:
  27238. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27239. "use strict";
  27240. // ESM COMPAT FLAG
  27241. __webpack_require__.r(__webpack_exports__);
  27242. // EXPORTS
  27243. __webpack_require__.d(__webpack_exports__, {
  27244. "default": function() { return /* binding */ _objectSpread2; }
  27245. });
  27246. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js + 1 modules
  27247. var toPropertyKey = __webpack_require__(9142);
  27248. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
  27249. function _defineProperty(obj, key, value) {
  27250. key = (0,toPropertyKey/* default */.Z)(key);
  27251. if (key in obj) {
  27252. Object.defineProperty(obj, key, {
  27253. value: value,
  27254. enumerable: true,
  27255. configurable: true,
  27256. writable: true
  27257. });
  27258. } else {
  27259. obj[key] = value;
  27260. }
  27261. return obj;
  27262. }
  27263. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js
  27264. function ownKeys(object, enumerableOnly) {
  27265. var keys = Object.keys(object);
  27266. if (Object.getOwnPropertySymbols) {
  27267. var symbols = Object.getOwnPropertySymbols(object);
  27268. enumerableOnly && (symbols = symbols.filter(function (sym) {
  27269. return Object.getOwnPropertyDescriptor(object, sym).enumerable;
  27270. })), keys.push.apply(keys, symbols);
  27271. }
  27272. return keys;
  27273. }
  27274. function _objectSpread2(target) {
  27275. for (var i = 1; i < arguments.length; i++) {
  27276. var source = null != arguments[i] ? arguments[i] : {};
  27277. i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
  27278. _defineProperty(target, key, source[key]);
  27279. }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
  27280. Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
  27281. });
  27282. }
  27283. return target;
  27284. }
  27285. /***/ }),
  27286. /***/ 4925:
  27287. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27288. "use strict";
  27289. // ESM COMPAT FLAG
  27290. __webpack_require__.r(__webpack_exports__);
  27291. // EXPORTS
  27292. __webpack_require__.d(__webpack_exports__, {
  27293. "default": function() { return /* binding */ _objectWithoutProperties; }
  27294. });
  27295. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js
  27296. function _objectWithoutPropertiesLoose(source, excluded) {
  27297. if (source == null) return {};
  27298. var target = {};
  27299. var sourceKeys = Object.keys(source);
  27300. var key, i;
  27301. for (i = 0; i < sourceKeys.length; i++) {
  27302. key = sourceKeys[i];
  27303. if (excluded.indexOf(key) >= 0) continue;
  27304. target[key] = source[key];
  27305. }
  27306. return target;
  27307. }
  27308. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js
  27309. function _objectWithoutProperties(source, excluded) {
  27310. if (source == null) return {};
  27311. var target = _objectWithoutPropertiesLoose(source, excluded);
  27312. var key, i;
  27313. if (Object.getOwnPropertySymbols) {
  27314. var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
  27315. for (i = 0; i < sourceSymbolKeys.length; i++) {
  27316. key = sourceSymbolKeys[i];
  27317. if (excluded.indexOf(key) >= 0) continue;
  27318. if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
  27319. target[key] = source[key];
  27320. }
  27321. }
  27322. return target;
  27323. }
  27324. /***/ }),
  27325. /***/ 885:
  27326. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27327. "use strict";
  27328. // ESM COMPAT FLAG
  27329. __webpack_require__.r(__webpack_exports__);
  27330. // EXPORTS
  27331. __webpack_require__.d(__webpack_exports__, {
  27332. "default": function() { return /* binding */ _slicedToArray; }
  27333. });
  27334. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
  27335. function _arrayWithHoles(arr) {
  27336. if (Array.isArray(arr)) return arr;
  27337. }
  27338. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js
  27339. function _iterableToArrayLimit(arr, i) {
  27340. var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
  27341. if (null != _i) {
  27342. var _s,
  27343. _e,
  27344. _x,
  27345. _r,
  27346. _arr = [],
  27347. _n = !0,
  27348. _d = !1;
  27349. try {
  27350. if (_x = (_i = _i.call(arr)).next, 0 === i) {
  27351. if (Object(_i) !== _i) return;
  27352. _n = !1;
  27353. } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
  27354. } catch (err) {
  27355. _d = !0, _e = err;
  27356. } finally {
  27357. try {
  27358. if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
  27359. } finally {
  27360. if (_d) throw _e;
  27361. }
  27362. }
  27363. return _arr;
  27364. }
  27365. }
  27366. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
  27367. var unsupportedIterableToArray = __webpack_require__(181);
  27368. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
  27369. function _nonIterableRest() {
  27370. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  27371. }
  27372. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js
  27373. function _slicedToArray(arr, i) {
  27374. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || (0,unsupportedIterableToArray/* default */.Z)(arr, i) || _nonIterableRest();
  27375. }
  27376. /***/ }),
  27377. /***/ 2982:
  27378. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27379. "use strict";
  27380. // ESM COMPAT FLAG
  27381. __webpack_require__.r(__webpack_exports__);
  27382. // EXPORTS
  27383. __webpack_require__.d(__webpack_exports__, {
  27384. "default": function() { return /* binding */ _toConsumableArray; }
  27385. });
  27386. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
  27387. var arrayLikeToArray = __webpack_require__(907);
  27388. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
  27389. function _arrayWithoutHoles(arr) {
  27390. if (Array.isArray(arr)) return (0,arrayLikeToArray/* default */.Z)(arr);
  27391. }
  27392. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
  27393. function _iterableToArray(iter) {
  27394. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  27395. }
  27396. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
  27397. var unsupportedIterableToArray = __webpack_require__(181);
  27398. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
  27399. function _nonIterableSpread() {
  27400. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  27401. }
  27402. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
  27403. function _toConsumableArray(arr) {
  27404. return _arrayWithoutHoles(arr) || _iterableToArray(arr) || (0,unsupportedIterableToArray/* default */.Z)(arr) || _nonIterableSpread();
  27405. }
  27406. /***/ }),
  27407. /***/ 9142:
  27408. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27409. "use strict";
  27410. // EXPORTS
  27411. __webpack_require__.d(__webpack_exports__, {
  27412. Z: function() { return /* binding */ _toPropertyKey; }
  27413. });
  27414. // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js
  27415. var esm_typeof = __webpack_require__(1002);
  27416. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js
  27417. function _toPrimitive(input, hint) {
  27418. if ((0,esm_typeof/* default */.Z)(input) !== "object" || input === null) return input;
  27419. var prim = input[Symbol.toPrimitive];
  27420. if (prim !== undefined) {
  27421. var res = prim.call(input, hint || "default");
  27422. if ((0,esm_typeof/* default */.Z)(res) !== "object") return res;
  27423. throw new TypeError("@@toPrimitive must return a primitive value.");
  27424. }
  27425. return (hint === "string" ? String : Number)(input);
  27426. }
  27427. ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js
  27428. function _toPropertyKey(arg) {
  27429. var key = _toPrimitive(arg, "string");
  27430. return (0,esm_typeof/* default */.Z)(key) === "symbol" ? key : String(key);
  27431. }
  27432. /***/ }),
  27433. /***/ 1002:
  27434. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27435. "use strict";
  27436. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27437. /* harmony export */ Z: function() { return /* binding */ _typeof; }
  27438. /* harmony export */ });
  27439. function _typeof(obj) {
  27440. "@babel/helpers - typeof";
  27441. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
  27442. return typeof obj;
  27443. } : function (obj) {
  27444. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  27445. }, _typeof(obj);
  27446. }
  27447. /***/ }),
  27448. /***/ 181:
  27449. /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
  27450. "use strict";
  27451. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  27452. /* harmony export */ Z: function() { return /* binding */ _unsupportedIterableToArray; }
  27453. /* harmony export */ });
  27454. /* harmony import */ var _arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(907);
  27455. function _unsupportedIterableToArray(o, minLen) {
  27456. if (!o) return;
  27457. if (typeof o === "string") return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(o, minLen);
  27458. var n = Object.prototype.toString.call(o).slice(8, -1);
  27459. if (n === "Object" && o.constructor) n = o.constructor.name;
  27460. if (n === "Map" || n === "Set") return Array.from(o);
  27461. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0,_arrayLikeToArray_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .Z)(o, minLen);
  27462. }
  27463. /***/ }),
  27464. /***/ 5618:
  27465. /***/ (function(module) {
  27466. "use strict";
  27467. module.exports = JSON.parse('[{"title":"经典深色","label":"dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53"]},{"title":"经典浅色","label":"light","textColor":"#333","background":"rgba(255, 255, 255,0.6)","colorGroup":["#3fb1e3","#6be6c1","#626c91","#a0a7e6","#c4ebad"]},{"title":"绿色渐变","label":"green-g","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#064049","#165A65","#1F717F","#3097AB","#9AEAF4"]},{"title":"蓝色渐变","label":"blue-g","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#243BCC","#1C55FF","#0C75FF","#338FFF","#00CDF1"]},{"title":"橙红渐变","label":"red-g","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#770000","#882241","#BE3144","#F05940","#FF8417"]},{"title":"紫色渐变","label":"purple-g","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#2F2AA4","#5432D3","#8B3B86","#9740B1","#7B6CF5"]},{"title":"深蓝黑色","label":"bluedark-dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#15D1F2","#499BFF","#2C61FF","#243BCC","#67A9FF"]},{"title":"墨绿黑色","label":"green-dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#2D808D","#53A8B6","#7AC2D0","#BCE4E9","#F1FDFF"]},{"title":"浅蓝黑色","label":"blue-dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#00E9FF","#BBE7FF","#6AE5C1","#46ABFF","#363EFF"]},{"title":"浅灰黑色","label":"grey-dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#52606D","#8894A0","#BACBDB","#D3DDE8","#F2F5F8"]},{"title":"深紫黑色","label":"purple-dark","textColor":"#fff","background":"rgba(0,0,0,0.6)","colorGroup":["#7B6CF6","#5432D3","#241F92","#8B3B86","#E6A5FF"]},{"title":"深蓝白色","label":"blue-light","textColor":"#000","background":"rgba(255,255,255,0.6)","colorGroup":["#243BCC","#2C61FF","#499BFF","#15D1F2","#67A9FF"]},{"title":"深红白色","label":"red-light","textColor":"#000","background":"rgba(255,255,255,0.6)","colorGroup":["#F05940","#BE3144","#882241","#770000","#FF8418"]}]');
  27468. /***/ }),
  27469. /***/ 2158:
  27470. /***/ (function(module) {
  27471. "use strict";
  27472. module.exports = JSON.parse('[{"name":"克拉玛依市","coord":[85.01486759299489,45.406422237230046]},{"name":"昌吉回族自治州","coord":[88.7154624754753,44.26991024636568]},{"name":"石河子市","coord":[86.0208600035924,44.239045558096805]},{"name":"霍林郭勒市","coord":[114.73479243733115,44.16058374713977]},{"name":"本溪市","coord":[124.64357865201586,41.177197783134275]},{"name":"嘉峪关市","coord":[98.16891560537093,39.76279786284264]},{"name":"莱芜市","coord":[117.65723565456207,36.27916499211527]},{"name":"神农架林区","coord":[110.48296222218153,31.581260143666697]},{"name":"天门市","coord":[113.00615321481195,30.64105781887143]},{"name":"鄂州市","coord":[114.94764081970385,30.325634953844585]},{"name":"潜江市","coord":[112.70703817700621,30.349210666019893]},{"name":"仙桃市","coord":[113.34688900729822,30.315951161935402]},{"name":"萍乡市","coord":[113.88072263074415,27.47193090553213]},{"name":"台湾省","coord":[120.14338943402045,23.596002465926095]},{"name":"东莞市","coord":[113.89443658529342,22.897826158636448]},{"name":"中山市","coord":[113.37118387764659,22.501478858616522]},{"name":"珠海市","coord":[113.21799258934986,22.23782602992192]},{"name":"北海市","coord":[109.18248083043899,21.695773689750148]},{"name":"香港","coord":[114.20689279508653,22.36016760139811]},{"name":"舟山市","coord":[122.22514712841459,30.338633120695956]},{"name":"克孜勒苏柯尔克孜","coord":[74.62910472637343,39.59886016069875]},{"name":"喀什地区","coord":[77.19899922143753,37.85462871211595]},{"name":"阿克苏地区","coord":[81.43930290016381,41.067304799230456]},{"name":"和田地区","coord":[80.69780509160952,36.95287032287055]},{"name":"阿里地区","coord":[82.536487505389,32.69566569631762]},{"name":"日喀则地区","coord":[86.5996831353606,29.54861754814263]},{"name":"那曲地区","coord":[88.32523292667608,33.20600450932715]},{"name":"玉树藏族自治州","coord":[95.2107128446203,33.90320387919257]},{"name":"迪庆藏族自治州","coord":[99.42465312188943,28.052797714348895]},{"name":"怒江傈傈族自治州","coord":[98.85737910439825,26.98345757528851]},{"name":"大理白族自治州","coord":[99.93934374816013,25.684737357453045]},{"name":"德宏傣族景颇族自","coord":[98.13830877778075,24.593421919561205]},{"name":"保山市","coord":[99.19031013453166,24.979380341662]},{"name":"临沧市","coord":[99.62483778975081,24.058807858948214]},{"name":"普洱市","coord":[100.94440267992684,23.44121660743221]},{"name":"西双版纳傣族自治","coord":[100.86105801845994,21.882475641324206]},{"name":"拉萨市","coord":[91.3684790613129,30.14176592960237]},{"name":"山南地区","coord":[92.11665242621062,28.33000201578789]},{"name":"林芝地区","coord":[94.9307847458166,29.125110156601963]},{"name":"昌都地区","coord":[97.33912235873476,30.48520825551814]},{"name":"丽江市","coord":[100.65713436205135,26.96190318191959]},{"name":"攀枝花市","coord":[101.73355913301131,26.714486678752795]},{"name":"凉山彝族自治州","coord":[102.08678551422615,27.683020519860396]},{"name":"楚雄彝族自治州","coord":[101.68264761198458,25.369603845264024]},{"name":"红河哈尼族彝族自","coord":[102.95101719613119,23.624860095239875]},{"name":"文山壮族苗族自治","coord":[104.8708359910614,23.579587266862504]},{"name":"百色市","coord":[106.69546907589859,23.98220841166522]},{"name":"崇左市","coord":[107.3277087317123,22.49769755349952]},{"name":"防城港市","coord":[107.88939931155171,21.94550204069006]},{"name":"南宁市","coord":[108.67078983716917,23.12207641861882]},{"name":"钦州市","coord":[108.8532307305186,22.157690108421384]},{"name":"玉林市","coord":[110.26918466489103,22.391823643610415]},{"name":"湛江市","coord":[109.93033457863683,21.086751055633457]},{"name":"茂名市","coord":[110.80336192333934,22.069184739040775]},{"name":"阳江市","coord":[111.70471342186183,22.108751366417575]},{"name":"江门市","coord":[112.53715618649149,22.297368082806777]},{"name":"广州市","coord":[113.4949302208309,23.28359314707863]},{"name":"清远市","coord":[113.10957368131268,24.334444053233856]},{"name":"肇庆市","coord":[112.11117530204233,23.60241158796112]},{"name":"梧州市","coord":[111.01709510772797,23.518132876753846]},{"name":"贺州市","coord":[111.50423061842756,24.4095096817199]},{"name":"桂林市","coord":[110.44046163393094,25.353966673735407]},{"name":"柳州市","coord":[109.34854449214147,24.972408051485047]},{"name":"河池市","coord":[107.81191841865586,24.649291651298164]},{"name":"黔东南苗族侗族自","coord":[108.39952601614591,26.429286420465576]},{"name":"贵阳市","coord":[106.59784062851153,26.797907456479816]},{"name":"安顺市","coord":[105.76161265300635,25.988644902171018]},{"name":"黔西南布依族苗族","coord":[105.5954078788574,25.404850939549405]},{"name":"曲靖市","coord":[103.9164335632742,25.697243690315265]},{"name":"六盘水市","coord":[104.77723228072432,26.15402255629164]},{"name":"毕节地区","coord":[105.03867422931839,27.077913968069666]},{"name":"昭通市","coord":[104.29730513046874,27.62418247971078]},{"name":"宜宾市","coord":[104.76748901448207,28.553501804266475]},{"name":"乐山市","coord":[103.56027669102787,29.160754519210577]},{"name":"自贡市","coord":[104.63272827056402,29.273152614922402]},{"name":"内江市","coord":[104.82644562304716,29.61272653799929]},{"name":"遵义市","coord":[106.82413636302059,28.191847588570702]},{"name":"达州市","coord":[107.59704170009518,31.32138258839703]},{"name":"遂宁市","coord":[105.48979445433736,30.677687821242678]},{"name":"广安市","coord":[106.56708164098042,30.43500706741521]},{"name":"泸州市","coord":[105.42591761727707,28.50277238478137]},{"name":"资阳市","coord":[104.97995126874034,30.154251886139654]},{"name":"雅安市","coord":[102.69931299964517,29.892630706195035]},{"name":"眉山市","coord":[104.07052881858888,29.894202166560405]},{"name":"甘孜藏族自治州","coord":[100.50721042614238,30.975216556269658]},{"name":"果洛藏族自治州","coord":[99.30775565051923,34.03539865224808]},{"name":"海南藏族自治州","coord":[100.39969108016373,35.90048272566899]},{"name":"黄南藏族自治州","coord":[101.5360706381689,35.10286360841902]},{"name":"赣南藏族自治州","coord":[102.97083885806067,34.326752803339026]},{"name":"陇南市","coord":[105.24780098912132,33.57031117443431]},{"name":"天水市","coord":[105.53503634660417,34.62320421368087]},{"name":"定西市","coord":[104.58787768541339,35.08900966621695]},{"name":"临夏回族自治州","coord":[103.2612870434902,35.591577124455235]},{"name":"西宁市","coord":[101.57680657999033,36.84800271717157]},{"name":"海东地区","coord":[102.30909850729282,36.287400615025646]},{"name":"海北藏族自治州","coord":[100.27122484450717,37.892557516083826]},{"name":"金昌市","coord":[102.02244049169511,38.497330414886164]},{"name":"酒泉市","coord":[95.94486678270127,40.56891536586272]},{"name":"海西蒙古族藏族自","coord":[94.67143298050689,36.022725148503724]},{"name":"巴音郭楞蒙古自治","coord":[88.18116214759745,39.556478810319916]},{"name":"哈密地区","coord":[93.84302392518026,42.95015211178875]},{"name":"叶鲁番地区","coord":[89.82035217277885,42.399368632283505]},{"name":"乌鲁木齐市","coord":[88.00048109561487,43.549986370786]},{"name":"阿勒泰地区","coord":[88.11213933257655,47.05593413019629]},{"name":"博尔塔拉蒙古自治","coord":[82.26402238163408,44.671135542630864]},{"name":"伊犁哈萨克自治州","coord":[82.80778717477179,43.53783381365267]},{"name":"阿拉善盟","coord":[103.29923966842289,40.10955801781495]},{"name":"武威市","coord":[102.73362058791429,37.94211141321436]},{"name":"兰州市","coord":[103.73793563506032,36.27379827886003]},{"name":"中卫市","coord":[105.6943786030716,37.20654236148948]},{"name":"银川市","coord":[106.20022174140034,38.52103167597483]},{"name":"石嘴山市","coord":[106.41544011793628,38.84054137571417]},{"name":"乌海市","coord":[106.8984175998405,39.54616572239788]},{"name":"鄂尔多斯市","coord":[108.43285571424619,39.24036799350715]},{"name":"巴彦淖尔市","coord":[107.45840392808307,41.30159860424196]},{"name":"包头市","coord":[110.46472193224272,41.48017783644221]},{"name":"呼和浩特市","coord":[111.48365173603975,40.498363056149884]},{"name":"乌兰察布市","coord":[112.61568977597707,41.75789561273154]},{"name":"大同市","coord":[113.7107192749083,39.898956799744184]},{"name":"朔州市","coord":[112.65428748167508,39.681772914701924]},{"name":"忻州市","coord":[112.36127575589583,38.88990233614568]},{"name":"榆林市","coord":[109.68473112169593,38.19921027134876]},{"name":"延安市","coord":[109.52425222161318,36.406522726136814]},{"name":"庆阳市","coord":[107.73052193155061,36.183821532624464]},{"name":"固原市","coord":[106.20191575442442,36.11634909496382]},{"name":"白银市","coord":[104.68634478137065,36.51582865625868]},{"name":"宝鸡市","coord":[107.33534779230747,34.3387216485855]},{"name":"汉中市","coord":[107.03534754266246,33.00142998064871]},{"name":"广元市","coord":[105.92928137563939,32.21872447205537]},{"name":"巴中市","coord":[107.03422410306194,31.99874720836291]},{"name":"南充市","coord":[106.32964805032347,31.156657700184095]},{"name":"绵阳市","coord":[104.58949560201106,31.88628780630976]},{"name":"德阳市","coord":[104.41542984932845,31.110558133718676]},{"name":"成都市","coord":[103.8852290010473,30.777258040348634]},{"name":"阿坝藏族羌族自治","coord":[102.26209319552814,32.45725845387284]},{"name":"安康市","coord":[109.14236501848015,32.77467694678074]},{"name":"十堰市","coord":[110.39934083416314,32.376209039347906]},{"name":"襄阳市","coord":[111.97539147094662,31.93399822417465]},{"name":"宜昌市","coord":[111.22204852395754,30.772457669035354]},{"name":"恩施市","coord":[109.42158366502872,30.260366574390105]},{"name":"张家界市","coord":[110.59760006538717,29.330107409240718]},{"name":"吉首市","coord":[109.72176899848378,28.681903937242495]},{"name":"铜仁地区","coord":[108.54247523485463,28.11736237519646]},{"name":"重庆市","coord":[107.86007108564992,30.186253395053196]},{"name":"怀化市","coord":[109.94325166787243,27.43919084801186]},{"name":"益阳市","coord":[112.43060358108062,28.75127294553697]},{"name":"娄底市","coord":[111.41891416951897,27.696312460064604]},{"name":"常德市","coord":[111.72571610131646,29.27189463838195]},{"name":"荆州市","coord":[112.65896596965268,30.05161542755362]},{"name":"荆门市","coord":[112.6586855902184,31.01267124474617]},{"name":"岳阳市","coord":[113.2595036144316,29.106247116930163]},{"name":"长沙市","coord":[113.15415586456598,28.222934680488425]},{"name":"湘潭市","coord":[112.51092596317824,27.69881544105668]},{"name":"株州市","coord":[113.49665538546823,27.03993794610501]},{"name":"衡阳市","coord":[112.48849636578527,26.783613569970782]},{"name":"邵阳市","coord":[110.6723832117475,26.81652287086792]},{"name":"永州市","coord":[111.8565364154186,25.768488267811968]},{"name":"韶关市","coord":[113.53420325850979,24.69848878771937]},{"name":"惠州市","coord":[114.32029589634925,23.25504544231892]},{"name":"佛山市","coord":[112.95925897403649,23.10116677189257]},{"name":"云浮市","coord":[111.78042514904234,22.840400494105687]},{"name":"深圳市","coord":[114.13138648919008,22.649563063468342]},{"name":"汕尾市","coord":[115.57412892884373,23.06989642104901]},{"name":"河源市","coord":[114.89746229844398,23.97971937124767]},{"name":"揭阳市","coord":[116.04290004239446,23.304802704715357]},{"name":"汕头市","coord":[116.7008461897183,23.35898625947344]},{"name":"潮州市","coord":[116.75405548481658,23.854381508863064]},{"name":"梅州市","coord":[116.13719397345734,24.15633544812716]},{"name":"漳州市","coord":[117.38279760543345,24.41111215459575]},{"name":"厦门市","coord":[118.04275971554665,24.675908246507944]},{"name":"龙岩市","coord":[116.69341144552507,25.20284542644492]},{"name":"泉州市","coord":[118.12035864630246,25.22984144365049]},{"name":"莆田市","coord":[118.82439690138142,25.439653480972687]},{"name":"福州市","coord":[119.1608285845262,25.99117532466728]},{"name":"三明市","coord":[117.51188176216434,26.318292906961602]},{"name":"南平市","coord":[118.16153136678187,27.306303151805437]},{"name":"抚州市","coord":[116.3455359885574,27.487043655935366]},{"name":"鹰潭市","coord":[117.01082360702333,28.241253742969946]},{"name":"吉安市","coord":[114.91377151807418,26.957486660664525]},{"name":"赣州市","coord":[115.046455717572,25.81565075681663]},{"name":"郴州市","coord":[113.1544526703492,25.871927095452524]},{"name":"新余市","coord":[114.94161795877827,27.79044654578371]},{"name":"宜春市","coord":[115.04574494880995,28.306428044943356]},{"name":"南昌市","coord":[115.9963824234495,28.664803351584705]},{"name":"九江市","coord":[115.53225905704193,29.362905920276297]},{"name":"上饶市","coord":[117.8595355766598,28.765755150094634]},{"name":"景德镇市","coord":[117.25387030721845,29.33426823662448]},{"name":"黄山市","coord":[117.85476357809696,29.969632034273722]},{"name":"池州市","coord":[117.34517113140791,30.208089337922335]},{"name":"铜陵市","coord":[117.93160431300694,30.926442655001676]},{"name":"安庆市","coord":[116.54307680610799,30.524265461641296]},{"name":"黄石市","coord":[115.02354597728443,29.924060229331015]},{"name":"咸宁市","coord":[114.26967602231792,29.652174021136048]},{"name":"黄冈市","coord":[115.2859016705373,30.65856897065683]},{"name":"武汉市","coord":[114.34552076948799,30.68836237966767]},{"name":"随州市","coord":[113.3850627838818,31.87891659924412]},{"name":"信阳市","coord":[114.81374730587638,32.0309685135914]},{"name":"驻马店市","coord":[114.07756451509235,32.896720987266114]},{"name":"商洛市","coord":[109.82044421310393,33.77403373563189]},{"name":"西安市","coord":[109.11839808451401,34.225257215515896]},{"name":"渭南市","coord":[109.75732444226935,35.025913644359306]},{"name":"铜川市","coord":[108.98695328111377,35.19235092947735]},{"name":"咸阳市","coord":[108.36398776446165,34.84311348287181]},{"name":"三门峡市","coord":[110.80049688104964,34.31818709571671]},{"name":"运城市","coord":[111.1736679525165,35.19010372283576]},{"name":"洛阳市","coord":[111.87577573098216,34.33379926109848]},{"name":"平顶山市","coord":[112.80931281928427,33.759895800153096]},{"name":"漯河市","coord":[113.83505724178012,33.70034266174508]},{"name":"许昌市","coord":[113.78762484088509,34.051835688452435]},{"name":"郑州市","coord":[113.49619951867594,34.61181797865449]},{"name":"焦作市","coord":[113.13404280173008,35.134167097471625]},{"name":"晋城市","coord":[112.7495732073233,35.63186423091449]},{"name":"长治市","coord":[112.85900842873183,36.45872910742828]},{"name":"临汾市","coord":[111.49379787924448,36.22810800777857]},{"name":"太原市","coord":[112.15628804033796,37.91704444063036]},{"name":"吕梁市","coord":[111.31901105774872,37.712740463356496]},{"name":"晋中市","coord":[113.08199599739676,37.36532613794343]},{"name":"邯郸市","coord":[114.41824047234618,36.530119932543315]},{"name":"安阳市","coord":[113.88883283163116,35.7797611183252]},{"name":"鹤壁市","coord":[114.3654094911545,35.75770487428472]},{"name":"新乡市","coord":[113.9184107718167,35.348471214026716]},{"name":"开封市","coord":[114.52801677500626,34.61371216679872]},{"name":"周口市","coord":[114.88509782391864,33.69999759722657]},{"name":"阜阳市","coord":[115.44595951398213,32.98060371610532]},{"name":"淮南市","coord":[116.68941991880993,32.79972275772595]},{"name":"蚌埠市","coord":[117.38594715783302,33.106729536033896]},{"name":"淮北市","coord":[116.69651711889378,33.69527529383458]},{"name":"宿州市","coord":[117.30175405886838,33.943330421260015]},{"name":"亳州市","coord":[116.12410804185097,33.46769392946132]},{"name":"商丘市","coord":[115.59575176872548,34.28339840831147]},{"name":"菏泽市","coord":[115.53631974831816,35.197319393220624]},{"name":"濮阳市","coord":[115.3070485514902,35.775883510964334]},{"name":"聊城市","coord":[115.8870069012884,36.40529594548765]},{"name":"邢台市","coord":[114.74259008644859,37.251396750084155]},{"name":"石家庄市","coord":[114.56923838363613,38.13141710980106]},{"name":"阳泉市","coord":[113.39216149668508,38.09075470547468]},{"name":"保定市","coord":[115.261524468934,39.09118520781398]},{"name":"衡水市","coord":[115.8182936677897,37.715661598187154]},{"name":"德州市","coord":[116.4582273790399,37.19372347888644]},{"name":"沧州市","coord":[116.76192710911863,38.20240042039232]},{"name":"廊坊市","coord":[116.50410772133856,39.27896741763884]},{"name":"天津市","coord":[117.31988934444873,39.37154482470619]},{"name":"北京市","coord":[116.59734730757869,40.237112944270976]},{"name":"张家口市","coord":[115.1823606483226,40.83732566607167]},{"name":"唐山市","coord":[117.8693184261954,39.71862889477249]},{"name":"秦皇岛市","coord":[119.30467355367742,39.990574652162564]},{"name":"承德市","coord":[117.16275671911026,41.36623845548547]},{"name":"葫芦岛市","coord":[119.9342336210531,40.5628822626519]},{"name":"朝阳市","coord":[120.11853493535794,41.471852354885755]},{"name":"赤峰市","coord":[118.50943546234379,43.25452976059767]},{"name":"锦州市","coord":[121.5167549323861,41.45933087433065]},{"name":"营口市","coord":[122.58571915054674,40.42093503997384]},{"name":"丹东市","coord":[124.33549382902183,40.46369290272115]},{"name":"辽阳市","coord":[123.34064798039414,41.152331397771356]},{"name":"盘锦市","coord":[122.06718005354679,41.05573599862555]},{"name":"阜新市","coord":[121.93889757908204,42.27641773244204]},{"name":"鞍山市","coord":[122.78904432242356,40.77781183142038]},{"name":"沈阳市","coord":[122.99508899709724,42.1162195010079]},{"name":"铁岭市","coord":[124.23100515588399,42.72666083611828]},{"name":"扶顺市","coord":[124.46027188217573,41.82955407638859]},{"name":"通辽市","coord":[122.0729370657937,43.90889130864869]},{"name":"兴安盟","coord":[120.79456431092532,45.92003249442161]},{"name":"白城市","coord":[123.10619907715235,45.25475749267784]},{"name":"齐齐哈尔市","coord":[124.5462214659102,47.55395009317394]},{"name":"大兴安岭地区","coord":[124.50992855161529,52.18438447846694]},{"name":"黑河市","coord":[127.14721400335922,49.25080134026901]},{"name":"大庆市","coord":[124.40329830095243,46.401048760966745]},{"name":"绥化市","coord":[126.5214484055605,46.76992452194825]},{"name":"松原市","coord":[124.21244334807682,44.75779381338502]},{"name":"四平市","coord":[124.27839350328821,43.52139065090318]},{"name":"通化市","coord":[125.67392830706305,41.91771808663852]},{"name":"辽源市","coord":[125.33529527643432,42.758340204944986]},{"name":"吉林市","coord":[126.83350281902375,43.60730120049175]},{"name":"长春市","coord":[125.53597875970374,44.24624314701737]},{"name":"白山市","coord":[127.16780160322108,42.093893880305075]},{"name":"哈尔滨市","coord":[127.39125008786029,45.36200668820575]},{"name":"鹤岗市","coord":[130.4703811258197,47.66520688940109]},{"name":"伊春市","coord":[128.91240831703635,47.93833794565277]},{"name":"七台河市","coord":[131.2677920224311,45.945099776108584]},{"name":"鸡西市","coord":[132.38059153660274,45.722934218318535]},{"name":"双鸭山市","coord":[132.3184817002743,46.65813679030265]},{"name":"佳木斯市","coord":[132.26174446608726,47.17569713691394]},{"name":"呼伦贝尔市","coord":[122.3210739998419,50.18176996070858]},{"name":"孝感市","coord":[113.83749892135485,31.11757234692128]},{"name":"贵港市","coord":[110.07354588052804,23.380735604767374]},{"name":"黔南布依族苗族自","coord":[107.30931767543106,26.2976919432269]},{"name":"宁德市","coord":[119.52482556634342,27.013151692716413]},{"name":"温州市","coord":[120.30037042732202,27.8699145504001]},{"name":"台州市","coord":[120.88886782713843,28.670799172772313]},{"name":"丽水市","coord":[119.56796851966463,28.170268394477755]},{"name":"衢州市","coord":[118.79479802644406,28.865874397158763]},{"name":"金华市","coord":[119.99381920686633,29.093455548185744]},{"name":"绍兴市","coord":[120.46546691682343,29.69382513836818]},{"name":"宁波市","coord":[121.42142987830871,29.70001162878972]},{"name":"杭州市","coord":[119.4405685790891,29.87218307296989]},{"name":"宣城市","coord":[118.68748382914703,30.628143499626418]},{"name":"湖州市","coord":[119.98261306633574,30.7945175862809]},{"name":"嘉兴市","coord":[120.83889215988998,30.67538495499343]},{"name":"上海市","coord":[121.37534147322967,31.25628247908459]},{"name":"苏州市","coord":[120.6906182622391,31.381280695137775]},{"name":"无锡市","coord":[120.32182300914366,31.54113306724517]},{"name":"常州市","coord":[119.61953292830165,31.611878565375576]},{"name":"南京市","coord":[118.71890548838064,31.910863187910323]},{"name":"镇江市","coord":[119.42349332902813,31.97942313430778]},{"name":"合肥市","coord":[117.30651975617157,31.79407863049138]},{"name":"六安市","coord":[116.24668220575353,31.820846193819513]},{"name":"滁州市","coord":[117.88422385307969,32.51792621904418]},{"name":"泰州市","coord":[120.03124303305091,32.56503102346783]},{"name":"南通市","coord":[120.85599446760912,32.18496706099728]},{"name":"盐城市","coord":[120.01812490612667,33.54219948734023]},{"name":"淮安市","coord":[119.0749424205415,33.39203631772854]},{"name":"宿迁市","coord":[118.45404943216346,33.666258719120265]},{"name":"徐州市","coord":[117.77482249295966,34.30847766157078]},{"name":"济宁市","coord":[116.74147276546373,35.27488504351119]},{"name":"枣庄市","coord":[117.43359942491492,34.884162021736]},{"name":"连云港市","coord":[119.01553213785074,34.54316517587849]},{"name":"临沂市","coord":[118.31478835349617,35.28173079028279]},{"name":"日照市","coord":[119.14265350444272,35.54479073199592]},{"name":"青岛市","coord":[120.27779044405756,36.3464117375903]},{"name":"威海市","coord":[122.12963327195605,37.13879077904251]},{"name":"烟台市","coord":[120.7689567423966,37.19772002195597]},{"name":"潍坊市","coord":[119.02178548592039,36.49292234053931]},{"name":"淄博市","coord":[117.92936024367185,36.60871347163638]},{"name":"泰安市","coord":[116.93810893944303,36.0423330118612]},{"name":"济南市","coord":[117.34560282551296,36.769574973846304]},{"name":"东营市","coord":[118.4915054457184,37.52194690335787]},{"name":"滨州市","coord":[117.67610299757533,37.4439597758601]},{"name":"昆明市","coord":[102.93100245594789,25.481300763922075]},{"name":"玉溪市","coord":[102.23080854291823,24.156168324611663]},{"name":"塔城地区","coord":[83.60908162840168,45.3721852373893]},{"name":"张掖市","coord":[100.47710030600572,38.704239320458385]},{"name":"南阳市","coord":[112.1400670951149,33.03033276715801]},{"name":"扬州市","coord":[119.48949608990988,32.80956776339646]},{"name":"延边朝鲜族自治州","coord":[129.3577692895626,43.24968794080283]},{"name":"牡丹江市","coord":[129.87240796405672,44.7073040108322]},{"name":"澳门","coord":[113.56289691515346,22.14602596262204]},{"name":"吴忠市","coord":[106.76894508116403,37.72566765880316]},{"name":"来宾市","coord":[109.25592217010114,23.86346274681084]},{"name":"平凉市","coord":[107.0708132782897,35.30329631658711]},{"name":"马鞍山市","coord":[118.27245878467022,31.657727937739004]},{"name":"芜湖市","coord":[118.32992684415504,31.081688223101658]},{"name":"澄迈县","coord":[110.04198076060266,19.694955078668105]},{"name":"保亭黎族苗族自治","coord":[109.6055304964257,18.6101488675304]},{"name":"乐东黎族自治县","coord":[109.04051999525574,18.643137437909203]},{"name":"儋州市","coord":[109.3431358337404,19.550974957403195]},{"name":"定安县","coord":[110.38744429685676,19.47557074114284]},{"name":"屯昌县","coord":[110.00574767630334,19.367175093044388]},{"name":"白沙黎族自治县","coord":[109.36860737761768,19.214416393082217]},{"name":"琼中黎族苗族自治","coord":[109.86691465937548,19.073671135862682]},{"name":"东方市","coord":[108.86903802405428,19.017352815445214]},{"name":"昌江黎族自治县","coord":[108.9686431884767,19.182594167127824]},{"name":"海口市","coord":[110.420654296875,19.806565564640795]},{"name":"济源市","coord":[112.38051465474433,35.07958362422394]},{"name":"五指山市","coord":[109.53595187364496,18.832908264613966]},{"name":"大连市","coord":[121.96662235866603,39.444150542439914]},{"name":"文昌市三沙市","coord":[110.81828537536748,19.756501444162936]},{"name":"三亚市","coord":[109.38424600793707,18.39186315877128]},{"name":"万宁市","coord":[110.28485046979574,18.860240588635115]},{"name":"陵水黎族自治县","coord":[109.95577603229562,18.594712684620465]},{"name":"临高县","coord":[109.71915395436967,19.79420403032508]},{"name":"琼海市","coord":[110.41650700703043,19.22315873149372]}]');
  27473. /***/ }),
  27474. /***/ 5385:
  27475. /***/ (function(module) {
  27476. "use strict";
  27477. module.exports = JSON.parse('[{"name":"黑龙江省","coord":[127.64559817675396,48.48668098449708]},{"name":"内蒙古自治区","coord":[118.34519572208615,45.370218276977525]},{"name":"新疆维吾尔自治区","coord":[87.13479065593184,41.75497055053711]},{"name":"吉林省","coord":[126.12985278813787,43.57983207702637]},{"name":"辽宁省","coord":[124.02494773936439,41.105743408203125]},{"name":"甘肃省","coord":[102.87785725633012,37.69582366943361]},{"name":"河北省","coord":[115.66327227481898,39.33383178710938]},{"name":"北京市","coord":[116.62199343603638,40.25053787231445]},{"name":"山西省","coord":[112.45180235808988,37.666561126708984]},{"name":"天津市","coord":[117.35711842642581,39.406789779663086]},{"name":"陕西省","coord":[109.56294003056632,35.64754199981689]},{"name":"宁夏回族自治区","coord":[105.96110877640074,37.3081169128418]},{"name":"青海省","coord":[96.07301048277901,35.44417190551758]},{"name":"山东省","coord":[118.03833752951093,36.29800605773925]},{"name":"西藏自治区","coord":[87.47361520439412,31.6703872680664]},{"name":"河南省","coord":[113.07832397097275,33.87751102447509]},{"name":"江苏省","coord":[119.93926538201052,32.945452690124505]},{"name":"安徽省","coord":[117.15146765881019,32.024482727050774]},{"name":"四川省","coord":[102.28998890142759,30.182161331176758]},{"name":"湖北省","coord":[112.87798261431585,31.157071113586426]},{"name":"重庆市","coord":[107.870126637831,30.188085556030266]},{"name":"上海市","coord":[121.42561166015514,31.276043891906745]},{"name":"浙江省","coord":[119.75337092707514,29.175934791564945]},{"name":"湖南省","coord":[111.52770282777405,27.38110256195069]},{"name":"江西省","coord":[115.51091280655628,27.283511161804206]},{"name":"云南省","coord":[101.27053825991308,25.19783210754396]},{"name":"贵州省","coord":[106.49672346773299,26.92267990112305]},{"name":"福建省","coord":[117.9976766946587,25.939599990844727]},{"name":"广西壮族自治区","coord":[108.98706831086302,23.891559600830078]},{"name":"台湾省","coord":[120.82468432537434,23.602651596069336]},{"name":"香港特别行政区","coord":[114.21036850371561,22.374858856201172]},{"name":"海南省","coord":[109.62792940960824,19.163116455078125]},{"name":"广东省","coord":[113.32127888266032,22.873867034912106]},{"name":"澳门特别行政区","coord":[113.56819996291901,22.160347992976]}]');
  27478. /***/ })
  27479. /******/ });
  27480. /************************************************************************/
  27481. /******/ // The module cache
  27482. /******/ var __webpack_module_cache__ = {};
  27483. /******/
  27484. /******/ // The require function
  27485. /******/ function __webpack_require__(moduleId) {
  27486. /******/ // Check if module is in cache
  27487. /******/ var cachedModule = __webpack_module_cache__[moduleId];
  27488. /******/ if (cachedModule !== undefined) {
  27489. /******/ return cachedModule.exports;
  27490. /******/ }
  27491. /******/ // Create a new module (and put it into the cache)
  27492. /******/ var module = __webpack_module_cache__[moduleId] = {
  27493. /******/ id: moduleId,
  27494. /******/ loaded: false,
  27495. /******/ exports: {}
  27496. /******/ };
  27497. /******/
  27498. /******/ // Execute the module function
  27499. /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
  27500. /******/
  27501. /******/ // Flag the module as loaded
  27502. /******/ module.loaded = true;
  27503. /******/
  27504. /******/ // Return the exports of the module
  27505. /******/ return module.exports;
  27506. /******/ }
  27507. /******/
  27508. /************************************************************************/
  27509. /******/ /* webpack/runtime/define property getters */
  27510. /******/ !function() {
  27511. /******/ // define getter functions for harmony exports
  27512. /******/ __webpack_require__.d = function(exports, definition) {
  27513. /******/ for(var key in definition) {
  27514. /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
  27515. /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
  27516. /******/ }
  27517. /******/ }
  27518. /******/ };
  27519. /******/ }();
  27520. /******/
  27521. /******/ /* webpack/runtime/global */
  27522. /******/ !function() {
  27523. /******/ __webpack_require__.g = (function() {
  27524. /******/ if (typeof globalThis === 'object') return globalThis;
  27525. /******/ try {
  27526. /******/ return this || new Function('return this')();
  27527. /******/ } catch (e) {
  27528. /******/ if (typeof window === 'object') return window;
  27529. /******/ }
  27530. /******/ })();
  27531. /******/ }();
  27532. /******/
  27533. /******/ /* webpack/runtime/hasOwnProperty shorthand */
  27534. /******/ !function() {
  27535. /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
  27536. /******/ }();
  27537. /******/
  27538. /******/ /* webpack/runtime/make namespace object */
  27539. /******/ !function() {
  27540. /******/ // define __esModule on exports
  27541. /******/ __webpack_require__.r = function(exports) {
  27542. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  27543. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  27544. /******/ }
  27545. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  27546. /******/ };
  27547. /******/ }();
  27548. /******/
  27549. /******/ /* webpack/runtime/node module decorator */
  27550. /******/ !function() {
  27551. /******/ __webpack_require__.nmd = function(module) {
  27552. /******/ module.paths = [];
  27553. /******/ if (!module.children) module.children = [];
  27554. /******/ return module;
  27555. /******/ };
  27556. /******/ }();
  27557. /******/
  27558. /************************************************************************/
  27559. /******/
  27560. /******/ // startup
  27561. /******/ // Load entry module and return exports
  27562. /******/ // This entry module is referenced by other modules so it can't be inlined
  27563. /******/ var __webpack_exports__ = __webpack_require__(4483);
  27564. /******/ __webpack_exports__ = __webpack_exports__["default"];
  27565. /******/
  27566. /******/ return __webpack_exports__;
  27567. /******/ })()
  27568. ;
  27569. });