regexes.php 235 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835
  1. <?php
  2. return [
  3. 'user_agent_parsers' => [
  4. ['regex' => '@(GeoEvent Server) (\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'],
  5. ['regex' => '@(ArcGIS Pro)(?: (\\d+)\\.(\\d+)\\.([^ ]+)|)@'],
  6. [
  7. 'regex' => '@ArcGIS Client Using WinInet@',
  8. 'family_replacement' => 'ArcMap',
  9. ],
  10. [
  11. 'regex' => '@(OperationsDashboard)-(?:Windows)-(\\d+)\\.(\\d+)\\.(\\d+)@',
  12. 'family_replacement' => 'Operations Dashboard for ArcGIS',
  13. ],
  14. [
  15. 'regex' => '@(arcgisearth)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  16. 'family_replacement' => 'ArcGIS Earth',
  17. ],
  18. [
  19. 'regex' => '@com.esri.(earth).phone/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  20. 'family_replacement' => 'ArcGIS Earth',
  21. ],
  22. [
  23. 'regex' => '@(arcgis-explorer)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  24. 'family_replacement' => 'Explorer for ArcGIS',
  25. ],
  26. [
  27. 'regex' => '@arcgis-(collector|aurora)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  28. 'family_replacement' => 'Collector for ArcGIS',
  29. ],
  30. [
  31. 'regex' => '@(arcgis-workforce)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  32. 'family_replacement' => 'Workforce for ArcGIS',
  33. ],
  34. [
  35. 'regex' => '@(Collector|Explorer|Workforce)-(?:Android|iOS)-(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  36. 'family_replacement' => '$1 for ArcGIS',
  37. ],
  38. [
  39. 'regex' => '@(Explorer|Collector)/(\\d+) CFNetwork@',
  40. 'family_replacement' => '$1 for ArcGIS',
  41. ],
  42. [
  43. 'regex' => '@ArcGISRuntime-(Android|iOS|NET|Qt)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  44. 'family_replacement' => 'ArcGIS Runtime SDK for $1',
  45. ],
  46. [
  47. 'regex' => '@ArcGIS\\.?(iOS|Android|NET|Qt)(?:-|\\.)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  48. 'family_replacement' => 'ArcGIS Runtime SDK for $1',
  49. ],
  50. [
  51. 'regex' => '@ArcGIS\\.Runtime\\.(Qt)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  52. 'family_replacement' => 'ArcGIS Runtime SDK for $1',
  53. ],
  54. ['regex' => '@^(Luminary)[Stage]+/(\\d+) CFNetwork@'],
  55. ['regex' => '@(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork@'],
  56. [
  57. 'regex' => '@(Antenna)/(\\d+) CFNetwork@',
  58. 'family_replacement' => 'AntennaPod',
  59. ],
  60. ['regex' => '@(TopPodcasts)Pro/(\\d+) CFNetwork@'],
  61. ['regex' => '@(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork@'],
  62. ['regex' => '@^(.{0,200})-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'],
  63. ['regex' => '@^(.{0,200})-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'],
  64. ['regex' => '@^(.{0,200})/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork@'],
  65. ['regex' => '@^(Luminary)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  66. [
  67. 'regex' => '@(espn\\.go)@',
  68. 'family_replacement' => 'ESPN',
  69. ],
  70. [
  71. 'regex' => '@(espnradio\\.com)@',
  72. 'family_replacement' => 'ESPN',
  73. ],
  74. [
  75. 'regex' => '@ESPN APP$@',
  76. 'family_replacement' => 'ESPN',
  77. ],
  78. [
  79. 'regex' => '@(audioboom\\.com)@',
  80. 'family_replacement' => 'AudioBoom',
  81. ],
  82. ['regex' => '@ (Rivo) RHYTHM@'],
  83. [
  84. 'regex' => '@(CFNetwork)(?:/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@',
  85. 'family_replacement' => 'CFNetwork',
  86. ],
  87. [
  88. 'regex' => '@(Pingdom\\.com_bot_version_)(\\d+)\\.(\\d+)@',
  89. 'family_replacement' => 'PingdomBot',
  90. ],
  91. [
  92. 'regex' => '@(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  93. 'family_replacement' => 'PingdomBot',
  94. ],
  95. [
  96. 'regex' => '@(PingdomPageSpeed)/(\\d+)\\.(\\d+)@',
  97. 'family_replacement' => 'PingdomBot',
  98. ],
  99. [
  100. 'regex' => '@ (PTST)/(\\d+)(?:\\.(\\d+)|)$@',
  101. 'family_replacement' => 'WebPageTest.org bot',
  102. ],
  103. ['regex' => '@X11; (Datanyze); Linux@'],
  104. [
  105. 'regex' => '@(NewRelicPinger)/(\\d+)\\.(\\d+)@',
  106. 'family_replacement' => 'NewRelicPingerBot',
  107. ],
  108. [
  109. 'regex' => '@(Tableau)/(\\d+)\\.(\\d+)@',
  110. 'family_replacement' => 'Tableau',
  111. ],
  112. [
  113. 'regex' => '@AppleWebKit/\\d{1,10}\\.\\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)@',
  114. 'family_replacement' => 'Adobe CreativeCloud',
  115. ],
  116. ['regex' => '@(Salesforce)(?:.)\\/(\\d+)\\.(\\d?)@'],
  117. [
  118. 'regex' => '@(\\(StatusCake\\))@',
  119. 'family_replacement' => 'StatusCakeBot',
  120. ],
  121. [
  122. 'regex' => '@(facebookexternalhit)/(\\d+)\\.(\\d+)@',
  123. 'family_replacement' => 'FacebookBot',
  124. ],
  125. [
  126. 'regex' => '@Google.{0,50}/\\+/web/snippet@',
  127. 'family_replacement' => 'GooglePlusBot',
  128. ],
  129. [
  130. 'regex' => '@via ggpht\\.com GoogleImageProxy@',
  131. 'family_replacement' => 'GmailImageProxy',
  132. ],
  133. [
  134. 'regex' => '@YahooMailProxy; https://help\\.yahoo\\.com/kb/yahoo-mail-proxy-SLN28749\\.html@',
  135. 'family_replacement' => 'YahooMailProxy',
  136. ],
  137. [
  138. 'regex' => '@(Twitterbot)/(\\d+)\\.(\\d+)@',
  139. 'family_replacement' => 'Twitterbot',
  140. ],
  141. ['regex' => '@/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  142. ['regex' => '@\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  143. [
  144. 'regex' => '@(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.{0,200} MSIECrawler@',
  145. 'family_replacement' => 'MSIECrawler',
  146. ],
  147. ['regex' => '@(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  148. ['regex' => '@(Google-HTTP-Java-Client|Apache-HttpClient|PostmanRuntime|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'],
  149. [
  150. 'regex' => '@(Pinterest(?:bot|))/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)[;\\s(]+\\+https://www.pinterest.com/bot.html@',
  151. 'family_replacement' => 'Pinterestbot',
  152. ],
  153. ['regex' => '@(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|GoogleOther|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer|GPTBot|Google-InspectionTool)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)@'],
  154. ['regex' => '@\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|go-v\\d|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  155. ['regex' => '@(FME)\\/(\\d+\\.\\d+)\\.(\\d+)\\.(\\d+)@'],
  156. ['regex' => '@(QGIS)\\/(\\d)\\.?0?(\\d{1,2})\\.?0?(\\d{1,2})@'],
  157. ['regex' => '@(JOSM)/(\\d+)\\.(\\d+)@'],
  158. ['regex' => '@(Tygron Platform) \\((\\d+)\\.(\\d+)\\.(\\d+(?:\\.\\d+| RC \\d+\\.\\d+))@'],
  159. [
  160. 'regex' => '@\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)@',
  161. 'family_replacement' => 'Facebook Messenger',
  162. ],
  163. [
  164. 'regex' => '@\\[FB.{0,300};(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  165. 'family_replacement' => 'Facebook',
  166. ],
  167. [
  168. 'regex' => '@\\[FB.{0,300};@',
  169. 'family_replacement' => 'Facebook',
  170. ],
  171. ['regex' => '@(RecipeRadar)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  172. ['regex' => '@^.{0,200}?(?:\\/[A-Za-z0-9\\.]{0,50}|) {0,2}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'],
  173. ['regex' => '@^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'],
  174. ['regex' => '@^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'],
  175. ['regex' => '@(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(@'],
  176. ['regex' => '@(Chimera|SeaMonkey|Camino|Waterfox)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*|)@'],
  177. [
  178. 'regex' => '@(SailfishBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  179. 'family_replacement' => 'Sailfish Browser',
  180. ],
  181. ['regex' => '@\\[(Pinterest)/[^\\]]{1,50}\\]@'],
  182. ['regex' => '@(Pinterest)(?: for Android(?: Tablet|)|)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  183. ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)@'],
  184. ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)@'],
  185. ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)@'],
  186. ['regex' => '@Mozilla.{1,200}Mobile.{1,100}(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  187. ['regex' => '@(Snapchat)\\/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  188. [
  189. 'regex' => '@(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\\/(\\d+)\\.(\\d+)|)@',
  190. 'family_replacement' => 'Twitter',
  191. ],
  192. [
  193. 'regex' => '@(musical_ly) app_version\\/(\\d+)\\.(\\d+)\\.(\\d+)@',
  194. 'family_replacement' => 'TikTok',
  195. ],
  196. [
  197. 'regex' => '@(musical_ly_)(\\d+)\\.(\\d+)\\.(\\d+)@',
  198. 'family_replacement' => 'TikTok',
  199. ],
  200. [
  201. 'regex' => '@(BytedanceWebview)\\/[a-z0-9]+@',
  202. 'family_replacement' => 'TikTok',
  203. ],
  204. [
  205. 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(KAKAOTALK)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  206. 'family_replacement' => 'KakaoTalk',
  207. ],
  208. [
  209. 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(Phantom\\/ios|Phantom\\/android).(\\d+)\\.(\\d+)\\.(\\d+)@',
  210. 'family_replacement' => 'Phantom',
  211. ],
  212. [
  213. 'regex' => '@Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)@',
  214. 'family_replacement' => 'Spider',
  215. ],
  216. [
  217. 'regex' => '@AspiegelBot|PetalBot@',
  218. 'family_replacement' => 'Spider',
  219. ],
  220. [
  221. 'regex' => '@(Firefox)/(\\d+)\\.(\\d+) Basilisk/(\\d+)@',
  222. 'family_replacement' => 'Basilisk',
  223. ],
  224. [
  225. 'regex' => '@(PaleMoon)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  226. 'family_replacement' => 'Pale Moon',
  227. ],
  228. [
  229. 'regex' => '@(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)@',
  230. 'family_replacement' => 'Firefox Mobile',
  231. ],
  232. [
  233. 'regex' => '@(Fennec)/(\\d+)\\.(\\d+)(pre)@',
  234. 'family_replacement' => 'Firefox Mobile',
  235. ],
  236. [
  237. 'regex' => '@(Fennec)/(\\d+)\\.(\\d+)@',
  238. 'family_replacement' => 'Firefox Mobile',
  239. ],
  240. [
  241. 'regex' => '@(?:Mobile|Tablet);.{0,200}(Firefox)/(\\d+)\\.(\\d+)@',
  242. 'family_replacement' => 'Firefox Mobile',
  243. ],
  244. [
  245. 'regex' => '@(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|))@',
  246. 'family_replacement' => 'Firefox ($1)',
  247. ],
  248. [
  249. 'regex' => '@(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)@',
  250. 'family_replacement' => 'Firefox Alpha',
  251. ],
  252. [
  253. 'regex' => '@(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)@',
  254. 'family_replacement' => 'Firefox Beta',
  255. ],
  256. [
  257. 'regex' => '@(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)@',
  258. 'family_replacement' => 'Firefox Alpha',
  259. ],
  260. [
  261. 'regex' => '@(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)@',
  262. 'family_replacement' => 'Firefox Beta',
  263. ],
  264. [
  265. 'regex' => '@(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)@',
  266. 'family_replacement' => 'Firefox ($1)',
  267. ],
  268. [
  269. 'regex' => '@(Firefox).{0,200}Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)@',
  270. 'family_replacement' => 'MicroB',
  271. ],
  272. ['regex' => '@(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)@'],
  273. [
  274. 'regex' => '@(FxiOS)/(\\d+)\\.(\\d+)(\\.(\\d+)|)(\\.(\\d+)|)@',
  275. 'family_replacement' => 'Firefox iOS',
  276. ],
  277. ['regex' => '@(Flock)/(\\d+)\\.(\\d+)(b\\d+?)@'],
  278. ['regex' => '@(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  279. [
  280. 'regex' => '@(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  281. 'family_replacement' => 'Netscape',
  282. ],
  283. [
  284. 'regex' => '@(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)@',
  285. 'family_replacement' => 'Netscape',
  286. ],
  287. [
  288. 'regex' => '@(Netscape6)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)@',
  289. 'family_replacement' => 'Netscape',
  290. ],
  291. [
  292. 'regex' => '@(MyIBrow)/(\\d+)\\.(\\d+)@',
  293. 'family_replacement' => 'My Internet Browser',
  294. ],
  295. [
  296. 'regex' => '@(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)@',
  297. 'family_replacement' => 'UC Browser',
  298. ],
  299. ['regex' => '@(Opera Tablet).{0,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  300. ['regex' => '@(Opera Mini)(?:/att|)/?(\\d+|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  301. [
  302. 'regex' => '@(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\\d+)\\.(\\d+)@',
  303. 'family_replacement' => 'Opera Mobile',
  304. ],
  305. [
  306. 'regex' => '@(Opera)/(\\d+)\\.(\\d+).{1,100}Opera Mobi@',
  307. 'family_replacement' => 'Opera Mobile',
  308. ],
  309. [
  310. 'regex' => '@Opera Mobi.{1,100}(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)@',
  311. 'family_replacement' => 'Opera Mobile',
  312. ],
  313. [
  314. 'regex' => '@Opera Mobi@',
  315. 'family_replacement' => 'Opera Mobile',
  316. ],
  317. ['regex' => '@(Opera)/9.80.{0,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  318. [
  319. 'regex' => '@(?:Mobile Safari).{1,300}(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  320. 'family_replacement' => 'Opera Mobile',
  321. ],
  322. [
  323. 'regex' => '@(?:Chrome).{1,300}(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  324. 'family_replacement' => 'Opera',
  325. ],
  326. [
  327. 'regex' => '@(Coast)/(\\d+).(\\d+).(\\d+)@',
  328. 'family_replacement' => 'Opera Coast',
  329. ],
  330. [
  331. 'regex' => '@(OPiOS)/(\\d+).(\\d+).(\\d+)@',
  332. 'family_replacement' => 'Opera Mini',
  333. ],
  334. [
  335. 'regex' => '@Chrome/.{1,200}( MMS)/(\\d+).(\\d+).(\\d+)@',
  336. 'family_replacement' => 'Opera Neon',
  337. ],
  338. [
  339. 'regex' => '@(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  340. 'family_replacement' => 'webOS Browser',
  341. ],
  342. [
  343. 'regex' => '@(luakit)@',
  344. 'family_replacement' => 'LuaKit',
  345. ],
  346. ['regex' => '@(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)@'],
  347. ['regex' => '@Gecko/\\d+ (Lightning)/(\\d+)\\.(\\d+)\\.?((?:[ab]?\\d+[a-z]*)|(?:\\d*))@'],
  348. [
  349. 'regex' => '@(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|)) \\(Swiftfox\\)@',
  350. 'family_replacement' => 'Swiftfox',
  351. ],
  352. [
  353. 'regex' => '@(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|) \\(Swiftfox\\)@',
  354. 'family_replacement' => 'Swiftfox',
  355. ],
  356. [
  357. 'regex' => '@(rekonq)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Safari@',
  358. 'family_replacement' => 'Rekonq',
  359. ],
  360. [
  361. 'regex' => '@rekonq@',
  362. 'family_replacement' => 'Rekonq',
  363. ],
  364. [
  365. 'regex' => '@(conkeror|Conkeror)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  366. 'family_replacement' => 'Conkeror',
  367. ],
  368. [
  369. 'regex' => '@(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  370. 'family_replacement' => 'Konqueror',
  371. ],
  372. ['regex' => '@(WeTab)-Browser@'],
  373. [
  374. 'regex' => '@(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  375. 'family_replacement' => 'Comodo Dragon',
  376. ],
  377. ['regex' => '@(Symphony) (\\d+).(\\d+)@'],
  378. [
  379. 'regex' => '@PLAYSTATION 3.{1,200}WebKit@',
  380. 'family_replacement' => 'NetFront NX',
  381. ],
  382. [
  383. 'regex' => '@PLAYSTATION 3@',
  384. 'family_replacement' => 'NetFront',
  385. ],
  386. [
  387. 'regex' => '@(PlayStation Portable)@',
  388. 'family_replacement' => 'NetFront',
  389. ],
  390. [
  391. 'regex' => '@(PlayStation Vita)@',
  392. 'family_replacement' => 'NetFront NX',
  393. ],
  394. [
  395. 'regex' => '@AppleWebKit.{1,200} (NX)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  396. 'family_replacement' => 'NetFront NX',
  397. ],
  398. [
  399. 'regex' => '@(Nintendo 3DS)@',
  400. 'family_replacement' => 'NetFront NX',
  401. ],
  402. [
  403. 'regex' => '@(HuaweiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.\\d+@',
  404. 'family_replacement' => 'Huawei Browser',
  405. ],
  406. [
  407. 'regex' => '@(AVG)/(\\d+)\\.(\\d+)\\.(\\d+)\\.\\d+@',
  408. 'family_replacement' => 'AVG',
  409. ],
  410. [
  411. 'regex' => '@(AvastSecureBrowser|Avast)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  412. 'family_replacement' => 'Avast Secure Browser',
  413. ],
  414. ['regex' => '@(Instabridge)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  415. [
  416. 'regex' => '@(AlohaBrowser|ABB)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  417. 'family_replacement' => 'Aloha Browser',
  418. ],
  419. [
  420. 'regex' => '@((?:B|b)rave(?:\\sChrome)?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  421. 'family_replacement' => 'Brave',
  422. ],
  423. [
  424. 'regex' => '@(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)@',
  425. 'family_replacement' => 'Amazon Silk',
  426. ],
  427. ['regex' => '@(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  428. [
  429. 'regex' => '@Windows Phone .{0,200}(Edge)/(\\d+)\\.(\\d+)@',
  430. 'family_replacement' => 'Edge Mobile',
  431. ],
  432. [
  433. 'regex' => '@(EdgiOS|EdgA)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  434. 'family_replacement' => 'Edge Mobile',
  435. ],
  436. [
  437. 'regex' => '@(OculusBrowser)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)@',
  438. 'family_replacement' => 'Oculus Browser',
  439. ],
  440. [
  441. 'regex' => '@(SamsungBrowser)/(\\d+)\\.(\\d+)@',
  442. 'family_replacement' => 'Samsung Internet',
  443. ],
  444. [
  445. 'regex' => '@(SznProhlizec)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  446. 'family_replacement' => 'Seznam prohlížeč',
  447. ],
  448. [
  449. 'regex' => '@(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  450. 'family_replacement' => 'Coc Coc',
  451. ],
  452. [
  453. 'regex' => '@(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  454. 'family_replacement' => 'Maxthon',
  455. ],
  456. ['regex' => '@(Crosswalk)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  457. [
  458. 'regex' => '@(Line)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  459. 'family_replacement' => 'LINE',
  460. ],
  461. [
  462. 'regex' => '@(MiuiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  463. 'family_replacement' => 'MiuiBrowser',
  464. ],
  465. [
  466. 'regex' => '@(Mint Browser)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  467. 'family_replacement' => 'Mint Browser',
  468. ],
  469. [
  470. 'regex' => '@(TopBuzz)/(\\d+).(\\d+).(\\d+)@',
  471. 'family_replacement' => 'TopBuzz',
  472. ],
  473. [
  474. 'regex' => '@Mozilla.{1,200}Android.{1,200}(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  475. 'family_replacement' => 'Google',
  476. ],
  477. [
  478. 'regex' => '@(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  479. 'family_replacement' => 'Baidu Browser',
  480. ],
  481. [
  482. 'regex' => '@(FlyFlow|flyflow|baiduboxapp)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  483. 'family_replacement' => 'Baidu Explorer',
  484. ],
  485. [
  486. 'regex' => '@(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@',
  487. 'family_replacement' => 'QQ Browser Mini',
  488. ],
  489. [
  490. 'regex' => '@(MQQBrowser)(?:/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@',
  491. 'family_replacement' => 'QQ Browser Mobile',
  492. ],
  493. [
  494. 'regex' => '@(QQBrowser)(?:/(\\d+)(?:\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)|)@',
  495. 'family_replacement' => 'QQ Browser',
  496. ],
  497. [
  498. 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(DuckDuckGo)/(\\d+)@',
  499. 'family_replacement' => 'DuckDuckGo Mobile',
  500. ],
  501. [
  502. 'regex' => '@Mozilla.{1,200}(DuckDuckGo)/(\\d+)@',
  503. 'family_replacement' => 'DuckDuckGo',
  504. ],
  505. [
  506. 'regex' => '@Mozilla.{1,200}Mobile.{1,100}(Ddg)/(\\d+)(?:\\.(\\d+)|)@',
  507. 'family_replacement' => 'DuckDuckGo Mobile',
  508. ],
  509. [
  510. 'regex' => '@Mozilla.{1,200}(Ddg)/(\\d+)(?:\\.(\\d+)|)@',
  511. 'family_replacement' => 'DuckDuckGo',
  512. ],
  513. [
  514. 'regex' => '@(Tenta/)(\\d+)\\.(\\d+)\\.(\\d+)@',
  515. 'family_replacement' => 'Tenta Browser',
  516. ],
  517. [
  518. 'regex' => '@(Ecosia) ios\\@(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  519. 'family_replacement' => 'Ecosia iOS',
  520. ],
  521. [
  522. 'regex' => '@(Ecosia) android\\@(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  523. 'family_replacement' => 'Ecosia Android',
  524. ],
  525. ['regex' => '@(VivoBrowser)\\/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  526. ['regex' => '@(HiBrowser)\\/v(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  527. [
  528. 'regex' => '@(weibo)__(\\d+)\\.(\\d+)\\.(\\d+)@',
  529. 'family_replacement' => 'Weibo',
  530. ],
  531. [
  532. 'regex' => '@(WeiboliteiOS|WeiboIntliOS)@',
  533. 'family_replacement' => 'Weibo',
  534. ],
  535. [
  536. 'regex' => '@Version/.{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  537. 'family_replacement' => 'Chrome Mobile WebView',
  538. ],
  539. [
  540. 'regex' => '@; wv\\).{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  541. 'family_replacement' => 'Chrome Mobile WebView',
  542. ],
  543. [
  544. 'regex' => '@(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  545. 'family_replacement' => 'Chrome Mobile',
  546. ],
  547. [
  548. 'regex' => '@(CriOS)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  549. 'family_replacement' => 'Chrome Mobile iOS',
  550. ],
  551. [
  552. 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)@',
  553. 'family_replacement' => 'Chrome Mobile',
  554. ],
  555. [
  556. 'regex' => '@ Mobile .{1,300}(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  557. 'family_replacement' => 'Chrome Mobile',
  558. ],
  559. [
  560. 'regex' => '@(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  561. 'family_replacement' => 'Chrome Frame',
  562. ],
  563. [
  564. 'regex' => '@(SLP Browser)/(\\d+)\\.(\\d+)@',
  565. 'family_replacement' => 'Tizen Browser',
  566. ],
  567. [
  568. 'regex' => '@(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)@',
  569. 'family_replacement' => 'Sogou Explorer',
  570. ],
  571. [
  572. 'regex' => '@(Rackspace Monitoring)/(\\d+)\\.(\\d+)@',
  573. 'family_replacement' => 'RackspaceBot',
  574. ],
  575. ['regex' => '@(PRTG Network Monitor)@'],
  576. ['regex' => '@(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  577. [
  578. 'regex' => '@(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  579. 'family_replacement' => 'Yandex Browser',
  580. ],
  581. [
  582. 'regex' => '@(YaSearchBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  583. 'family_replacement' => 'Yandex Browser',
  584. ],
  585. [
  586. 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).{0,100} MRCHROME@',
  587. 'family_replacement' => 'Mail.ru Chromium Browser',
  588. ],
  589. ['regex' => '@(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)@'],
  590. ['regex' => '@(PodCruncher|Downcast)[ /]?(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  591. ['regex' => '@ (BoxNotes)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  592. [
  593. 'regex' => '@(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)@',
  594. 'family_replacement' => 'Whale',
  595. ],
  596. [
  597. 'regex' => '@(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  598. 'family_replacement' => 'Whale',
  599. ],
  600. ['regex' => '@(1Password)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  601. ['regex' => '@(Ghost)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  602. ['regex' => '@PAN (GlobalProtect)/(\\d+)\\.(\\d+)\\.(\\d+) .{1,100} \\(X11; Linux x86_64\\)@'],
  603. [
  604. 'regex' => '@^(surveyon)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  605. 'family_replacement' => 'Surveyon',
  606. ],
  607. [
  608. 'regex' => '@(115Browser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  609. 'family_replacement' => '115 Browser',
  610. ],
  611. [
  612. 'regex' => '@(Avira)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  613. 'family_replacement' => 'Avira',
  614. ],
  615. [
  616. 'regex' => '@(CCleaner)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  617. 'family_replacement' => 'CCleaner',
  618. ],
  619. [
  620. 'regex' => '@(Norton)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  621. 'family_replacement' => 'Norton',
  622. ],
  623. [
  624. 'regex' => '@(Quark)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  625. 'family_replacement' => 'Quark',
  626. ],
  627. [
  628. 'regex' => '@(QuarkPC)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  629. 'family_replacement' => 'Quark PC',
  630. ],
  631. [
  632. 'regex' => '@(SLBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) SLBChan/(\\d+)@',
  633. 'family_replacement' => 'Smart Lenovo Browser',
  634. ],
  635. [
  636. 'regex' => '@(Atom)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  637. 'family_replacement' => 'Atom Browser',
  638. ],
  639. [
  640. 'regex' => '@(Chrome)/\\d+\\.\\d+\\.\\d+\\.\\d+ .* QIHU 360(?:SEi18n|ENT)@',
  641. 'family_replacement' => '360 Secure Browser',
  642. ],
  643. [
  644. 'regex' => '@(Decentr)@',
  645. 'family_replacement' => 'Decentr Web3 Browser',
  646. ],
  647. [
  648. 'regex' => '@(Sparrow)@',
  649. 'family_replacement' => 'Sparrow Browser',
  650. ],
  651. [
  652. 'regex' => '@(Chromium GOST)@',
  653. 'family_replacement' => 'Chromium GOST Browser',
  654. ],
  655. [
  656. 'regex' => '@(AOLShield)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  657. 'family_replacement' => 'AOL Shield Browser',
  658. ],
  659. [
  660. 'regex' => '@(Hola)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  661. 'family_replacement' => 'Hola Browser',
  662. ],
  663. [
  664. 'regex' => '@(CravingExplorer)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  665. 'family_replacement' => 'Craving Explorer Browser',
  666. ],
  667. [
  668. 'regex' => '@(Talon)@',
  669. 'family_replacement' => 'Talon Cyber Security Browser',
  670. ],
  671. [
  672. 'regex' => '@(Qaxbrowser)@',
  673. 'family_replacement' => 'QAX Browser',
  674. ],
  675. [
  676. 'regex' => '@(ADG)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  677. 'family_replacement' => 'AOL Desktop Gold Browser',
  678. ],
  679. [
  680. 'regex' => '@(SberBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  681. 'family_replacement' => 'Sber Browser',
  682. ],
  683. [
  684. 'regex' => '@(JiSu)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  685. 'family_replacement' => 'JiSu Browser',
  686. ],
  687. [
  688. 'regex' => '@(Wolvic)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  689. 'family_replacement' => 'Wolvic Browser',
  690. ],
  691. [
  692. 'regex' => '@(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  693. 'family_replacement' => 'Slack Desktop Client',
  694. ],
  695. [
  696. 'regex' => '@(HipChat)/?(\\d+|)@',
  697. 'family_replacement' => 'HipChat Desktop Client',
  698. ],
  699. ['regex' => '@\\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  700. [
  701. 'regex' => '@Microsoft Office Outlook 12\\.\\d+\\.\\d+|MSOffice 12@',
  702. 'family_replacement' => 'Outlook',
  703. 'v1_replacement' => '2007',
  704. ],
  705. [
  706. 'regex' => '@Microsoft Outlook 14\\.\\d+\\.\\d+|MSOffice 14@',
  707. 'family_replacement' => 'Outlook',
  708. 'v1_replacement' => '2010',
  709. ],
  710. [
  711. 'regex' => '@Microsoft Outlook 15\\.\\d+\\.\\d+@',
  712. 'family_replacement' => 'Outlook',
  713. 'v1_replacement' => '2013',
  714. ],
  715. [
  716. 'regex' => '@Microsoft Outlook (?:Mail )?16\\.\\d+\\.\\d+|MSOffice 16@',
  717. 'family_replacement' => 'Outlook',
  718. 'v1_replacement' => '2016',
  719. ],
  720. ['regex' => '@Microsoft Office (Word) 2014@'],
  721. [
  722. 'regex' => '@Outlook-Express\\/7\\.0@',
  723. 'family_replacement' => 'Windows Live Mail',
  724. ],
  725. ['regex' => '@(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  726. [
  727. 'regex' => '@(Thunderbird)/(\\d+)\\.(\\d+)(?:\\.(\\d+(?:pre|))|)@',
  728. 'family_replacement' => 'Thunderbird',
  729. ],
  730. [
  731. 'regex' => '@(Postbox)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  732. 'family_replacement' => 'Postbox',
  733. ],
  734. [
  735. 'regex' => '@(Barca(?:Pro)?)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  736. 'family_replacement' => 'Barca',
  737. ],
  738. [
  739. 'regex' => '@(Lotus-Notes)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  740. 'family_replacement' => 'Lotus Notes',
  741. ],
  742. [
  743. 'regex' => '@Superhuman@',
  744. 'family_replacement' => 'Superhuman',
  745. ],
  746. ['regex' => '@(Vivaldi)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  747. [
  748. 'regex' => '@(Edge?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@',
  749. 'family_replacement' => 'Edge',
  750. ],
  751. [
  752. 'regex' => '@(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]{0,100} Iron[^/]@',
  753. 'family_replacement' => 'Iron',
  754. ],
  755. ['regex' => '@\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  756. ['regex' => '@(HeadlessChrome)(?:/(\\d+)\\.(\\d+)\\.(\\d+)|)@'],
  757. ['regex' => '@(Evolution)/(\\d+)\\.(\\d+)\\.(\\d+\\.\\d+)@'],
  758. ['regex' => '@(RCM CardDAV plugin)/(\\d+)\\.(\\d+)\\.(\\d+(?:-dev|))@'],
  759. ['regex' => '@(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  760. ['regex' => '@(Chromium|Chrome)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  761. [
  762. 'regex' => '@(IEMobile)[ /](\\d+)\\.(\\d+)@',
  763. 'family_replacement' => 'IE Mobile',
  764. ],
  765. ['regex' => '@(BacaBerita App)\\/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  766. ['regex' => '@^(bPod|Pocket Casts|Player FM)$@'],
  767. ['regex' => '@^(AlexaMediaPlayer|VLC)/(\\d+)\\.(\\d+)\\.([^.\\s]+)@'],
  768. ['regex' => '@^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  769. ['regex' => '@^(Peapod|Liferea)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)@'],
  770. ['regex' => '@^(bPod|Player FM) BMID/(\\S+)@'],
  771. ['regex' => '@^(Podcast ?Addict)/v(\\d+) @'],
  772. [
  773. 'regex' => '@^(Podcast ?Addict) @',
  774. 'family_replacement' => 'PodcastAddict',
  775. ],
  776. ['regex' => '@(Replay) AV@'],
  777. ['regex' => '@(VOX) Music Player@'],
  778. ['regex' => '@(CITA) RSS Aggregator/(\\d+)\\.(\\d+)@'],
  779. ['regex' => '@(Pocket Casts)$@'],
  780. ['regex' => '@(Player FM)$@'],
  781. ['regex' => '@(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)@'],
  782. ['regex' => '@(philpodder)/(\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)@'],
  783. ['regex' => '@(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)@'],
  784. ['regex' => '@(QuickTime)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  785. ['regex' => '@(Kinoma)(\\d+)@'],
  786. [
  787. 'regex' => '@(Fancy) Cloud Music (\\d+)\\.(\\d+)@',
  788. 'family_replacement' => 'FancyMusic',
  789. ],
  790. [
  791. 'regex' => '@EspnDownloadManager@',
  792. 'family_replacement' => 'ESPN',
  793. ],
  794. ['regex' => '@(ESPN) Radio (\\d+)\\.(\\d+)(?:\\.(\\d+)|) ?(?:rv:(\\d+)|) @'],
  795. ['regex' => '@(podracer|jPodder) v ?(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  796. ['regex' => '@(ZDM)/(\\d+)\\.(\\d+)[; ]?@'],
  797. ['regex' => '@(Zune|BeyondPod) (\\d+)(?:\\.(\\d+)|)[\\);]@'],
  798. ['regex' => '@(WMPlayer)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@'],
  799. [
  800. 'regex' => '@^(Lavf)@',
  801. 'family_replacement' => 'WMPlayer',
  802. ],
  803. ['regex' => '@^(RSSRadio)[ /]?(\\d+|)@'],
  804. [
  805. 'regex' => '@(RSS_Radio) (\\d+)\\.(\\d+)@',
  806. 'family_replacement' => 'RSSRadio',
  807. ],
  808. [
  809. 'regex' => '@(Podkicker) \\S+/(\\d+)\\.(\\d+)\\.(\\d+)@',
  810. 'family_replacement' => 'Podkicker',
  811. ],
  812. ['regex' => '@^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  813. ['regex' => '@^(Stitcher)/iOS@'],
  814. ['regex' => '@^(Stitcher)/Android@'],
  815. ['regex' => '@^(VLC) .{0,200}version (\\d+)\\.(\\d+)\\.(\\d+)@'],
  816. ['regex' => '@ (VLC) for@'],
  817. [
  818. 'regex' => '@(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  819. 'family_replacement' => 'VLC',
  820. ],
  821. ['regex' => '@^(foobar)\\S{1,10}/(\\d+)\\.(\\d+|)\\.?([\\da-z]+|)@'],
  822. ['regex' => '@^(Clementine)\\S{1,10} (\\d+)\\.(\\d+|)\\.?(\\d+|)@'],
  823. [
  824. 'regex' => '@(amarok)/(\\d+)\\.(\\d+|)\\.?(\\d+|)@',
  825. 'family_replacement' => 'Amarok',
  826. ],
  827. ['regex' => '@(Custom)-Feed Reader@'],
  828. ['regex' => '@(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)@'],
  829. ['regex' => '@(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  830. ['regex' => '@(Kindle)/(\\d+)\\.(\\d+)@'],
  831. [
  832. 'regex' => '@(Android) Donut@',
  833. 'v1_replacement' => '1',
  834. 'v2_replacement' => '2',
  835. ],
  836. [
  837. 'regex' => '@(Android) Eclair@',
  838. 'v1_replacement' => '2',
  839. 'v2_replacement' => '1',
  840. ],
  841. [
  842. 'regex' => '@(Android) Froyo@',
  843. 'v1_replacement' => '2',
  844. 'v2_replacement' => '2',
  845. ],
  846. [
  847. 'regex' => '@(Android) Gingerbread@',
  848. 'v1_replacement' => '2',
  849. 'v2_replacement' => '3',
  850. ],
  851. [
  852. 'regex' => '@(Android) Honeycomb@',
  853. 'v1_replacement' => '3',
  854. ],
  855. [
  856. 'regex' => '@(MSIE) (\\d+)\\.(\\d+).{0,100}XBLWP7@',
  857. 'family_replacement' => 'IE Large Screen',
  858. ],
  859. ['regex' => '@(Nextcloud)@'],
  860. ['regex' => '@(mirall)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  861. [
  862. 'regex' => '@(ownCloud-android)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  863. 'family_replacement' => 'Owncloud',
  864. ],
  865. [
  866. 'regex' => '@(OC)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) \\(Skype for Business\\)@',
  867. 'family_replacement' => 'Skype',
  868. ],
  869. [
  870. 'regex' => '@(OpenVAS)(?:-VT)?(?:[ \\/](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@',
  871. 'family_replacement' => 'OpenVAS Scanner',
  872. ],
  873. ['regex' => '@(AnyConnect)\\/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'],
  874. [
  875. 'regex' => '@compatible; monitis@',
  876. 'family_replacement' => 'Monitis',
  877. ],
  878. ['regex' => '@(Obigo)InternetBrowser@'],
  879. ['regex' => '@(Obigo)\\-Browser@'],
  880. [
  881. 'regex' => '@(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+)|)@',
  882. 'family_replacement' => 'Obigo',
  883. ],
  884. [
  885. 'regex' => '@(MAXTHON|Maxthon) (\\d+)\\.(\\d+)@',
  886. 'family_replacement' => 'Maxthon',
  887. ],
  888. [
  889. 'regex' => '@(Maxthon|MyIE2|Uzbl|Shiira)@',
  890. 'v1_replacement' => '0',
  891. ],
  892. ['regex' => '@(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)@'],
  893. [
  894. 'regex' => '@(NCSA_Mosaic)/(\\d+)\\.(\\d+)@',
  895. 'family_replacement' => 'NCSA Mosaic',
  896. ],
  897. [
  898. 'regex' => '@(POLARIS)/(\\d+)\\.(\\d+)@',
  899. 'family_replacement' => 'Polaris',
  900. ],
  901. [
  902. 'regex' => '@(Embider)/(\\d+)\\.(\\d+)@',
  903. 'family_replacement' => 'Polaris',
  904. ],
  905. [
  906. 'regex' => '@(BonEcho)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)@',
  907. 'family_replacement' => 'Bon Echo',
  908. ],
  909. [
  910. 'regex' => '@(TopBuzz) com.alex.NewsMaster/(\\d+).(\\d+).(\\d+)@',
  911. 'family_replacement' => 'TopBuzz',
  912. ],
  913. [
  914. 'regex' => '@(TopBuzz) com.mobilesrepublic.newsrepublic/(\\d+).(\\d+).(\\d+)@',
  915. 'family_replacement' => 'TopBuzz',
  916. ],
  917. [
  918. 'regex' => '@(TopBuzz) com.topbuzz.videoen/(\\d+).(\\d+).(\\d+)@',
  919. 'family_replacement' => 'TopBuzz',
  920. ],
  921. [
  922. 'regex' => '@(iPod|iPhone|iPad).{1,200}GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile@',
  923. 'family_replacement' => 'Google',
  924. ],
  925. [
  926. 'regex' => '@(iPod|iPhone|iPad).{1,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).{1,200}[ +]Safari@',
  927. 'family_replacement' => 'Mobile Safari',
  928. ],
  929. [
  930. 'regex' => '@(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).{0,30} AppleNews\\/\\d+\\.\\d+(?:\\.\\d+|)@',
  931. 'family_replacement' => 'Mobile Safari UI/WKWebView',
  932. ],
  933. [
  934. 'regex' => '@(iPod|iPhone|iPad).{1,200}Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  935. 'family_replacement' => 'Mobile Safari UI/WKWebView',
  936. ],
  937. [
  938. 'regex' => '@(iPod|iPod touch|iPhone|iPad).{0,200} Safari@',
  939. 'family_replacement' => 'Mobile Safari',
  940. ],
  941. [
  942. 'regex' => '@(iPod|iPod touch|iPhone|iPad)@',
  943. 'family_replacement' => 'Mobile Safari UI/WKWebView',
  944. ],
  945. [
  946. 'regex' => '@(Watch)(\\d+),(\\d+)@',
  947. 'family_replacement' => 'Apple $1 App',
  948. ],
  949. ['regex' => '@(Outlook-iOS)/\\d+\\.\\d+\\.prod\\.iphone \\((\\d+)\\.(\\d+)\\.(\\d+)\\)@'],
  950. ['regex' => '@(AvantGo) (\\d+).(\\d+)@'],
  951. [
  952. 'regex' => '@(OneBrowser)/(\\d+).(\\d+)@',
  953. 'family_replacement' => 'ONE Browser',
  954. ],
  955. [
  956. 'regex' => '@(Avant)@',
  957. 'v1_replacement' => '1',
  958. ],
  959. [
  960. 'regex' => '@(QtCarBrowser)@',
  961. 'v1_replacement' => '1',
  962. ],
  963. [
  964. 'regex' => '@^(iBrowser/Mini)(\\d+).(\\d+)@',
  965. 'family_replacement' => 'iBrowser Mini',
  966. ],
  967. ['regex' => '@^(iBrowser|iRAPP)/(\\d+).(\\d+)@'],
  968. [
  969. 'regex' => '@^(Nokia)@',
  970. 'family_replacement' => 'Nokia Services (WAP) Browser',
  971. ],
  972. [
  973. 'regex' => '@(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)@',
  974. 'family_replacement' => 'Nokia Browser',
  975. ],
  976. [
  977. 'regex' => '@(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)@',
  978. 'family_replacement' => 'Nokia Browser',
  979. ],
  980. [
  981. 'regex' => '@(NokiaBrowser)/(\\d+)\\.(\\d+)@',
  982. 'family_replacement' => 'Nokia Browser',
  983. ],
  984. [
  985. 'regex' => '@(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)@',
  986. 'family_replacement' => 'Nokia Browser',
  987. ],
  988. [
  989. 'regex' => '@(Series60)/5\\.0@',
  990. 'family_replacement' => 'Nokia Browser',
  991. 'v1_replacement' => '7',
  992. 'v2_replacement' => '0',
  993. ],
  994. [
  995. 'regex' => '@(Series60)/(\\d+)\\.(\\d+)@',
  996. 'family_replacement' => 'Nokia OSS Browser',
  997. ],
  998. [
  999. 'regex' => '@(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)@',
  1000. 'family_replacement' => 'Ovi Browser',
  1001. ],
  1002. ['regex' => '@(Nokia)[EN]?(\\d+)@'],
  1003. [
  1004. 'regex' => '@(PlayBook).{1,200}RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)@',
  1005. 'family_replacement' => 'BlackBerry WebKit',
  1006. ],
  1007. [
  1008. 'regex' => '@(Black[bB]erry|BB10).{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1009. 'family_replacement' => 'BlackBerry WebKit',
  1010. ],
  1011. [
  1012. 'regex' => '@(Black[bB]erry)\\s?(\\d+)@',
  1013. 'family_replacement' => 'BlackBerry',
  1014. ],
  1015. ['regex' => '@(OmniWeb)/v(\\d+)\\.(\\d+)@'],
  1016. [
  1017. 'regex' => '@(Blazer)/(\\d+)\\.(\\d+)@',
  1018. 'family_replacement' => 'Palm Blazer',
  1019. ],
  1020. [
  1021. 'regex' => '@(Pre)/(\\d+)\\.(\\d+)@',
  1022. 'family_replacement' => 'Palm Pre',
  1023. ],
  1024. ['regex' => '@(ELinks)/(\\d+)\\.(\\d+)@'],
  1025. ['regex' => '@(ELinks) \\((\\d+)\\.(\\d+)@'],
  1026. ['regex' => '@(Links) \\((\\d+)\\.(\\d+)@'],
  1027. ['regex' => '@(QtWeb) Internet Browser/(\\d+)\\.(\\d+)@'],
  1028. ['regex' => '@(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1029. [
  1030. 'regex' => '@(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .{0,200} Safari@',
  1031. 'family_replacement' => 'WebKit Nightly',
  1032. ],
  1033. [
  1034. 'regex' => '@(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).{0,100}Safari/@',
  1035. 'family_replacement' => 'Safari',
  1036. ],
  1037. ['regex' => '@(Safari)/\\d+@'],
  1038. ['regex' => '@(OLPC)/Update(\\d+)\\.(\\d+)@'],
  1039. [
  1040. 'regex' => '@(OLPC)/Update()\\.(\\d+)@',
  1041. 'v1_replacement' => '0',
  1042. ],
  1043. ['regex' => '@(SEMC\\-Browser)/(\\d+)\\.(\\d+)@'],
  1044. [
  1045. 'regex' => '@(Teleca)@',
  1046. 'family_replacement' => 'Teleca Browser',
  1047. ],
  1048. [
  1049. 'regex' => '@(Phantom)/V(\\d+)\\.(\\d+)@',
  1050. 'family_replacement' => 'Phantom Browser',
  1051. ],
  1052. [
  1053. 'regex' => '@(Trident)/(7|8)\\.(0)@',
  1054. 'family_replacement' => 'IE',
  1055. 'v1_replacement' => '11',
  1056. ],
  1057. [
  1058. 'regex' => '@(Trident)/(6)\\.(0)@',
  1059. 'family_replacement' => 'IE',
  1060. 'v1_replacement' => '10',
  1061. ],
  1062. [
  1063. 'regex' => '@(Trident)/(5)\\.(0)@',
  1064. 'family_replacement' => 'IE',
  1065. 'v1_replacement' => '9',
  1066. ],
  1067. [
  1068. 'regex' => '@(Trident)/(4)\\.(0)@',
  1069. 'family_replacement' => 'IE',
  1070. 'v1_replacement' => '8',
  1071. ],
  1072. ['regex' => '@(Espial)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  1073. [
  1074. 'regex' => '@(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1075. 'family_replacement' => 'Apple Mail',
  1076. ],
  1077. ['regex' => '@(Firefox)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|$)@'],
  1078. ['regex' => '@(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*|)@'],
  1079. [
  1080. 'regex' => '@([MS]?IE) (\\d+)\\.(\\d+)@',
  1081. 'family_replacement' => 'IE',
  1082. ],
  1083. [
  1084. 'regex' => '@(python-requests)/(\\d+)\\.(\\d+)@',
  1085. 'family_replacement' => 'Python Requests',
  1086. ],
  1087. ['regex' => '@\\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC|HTTPie)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)@'],
  1088. [
  1089. 'regex' => '@^(cf)\\/(\\d+)\\.(\\d+)\\.(\\S+)@',
  1090. 'family_replacement' => 'CloudFoundry',
  1091. ],
  1092. ['regex' => '@^(sap-leonardo-iot-sdk-nodejs) \\/ (\\d+)\\.(\\d+)\\.(\\d+)@'],
  1093. ['regex' => '@^(SAP NetWeaver Application Server) \\(1.0;(\\d{1})(\\d{2})\\)@'],
  1094. [
  1095. 'regex' => '@^(\\w+-HTTPClient)\\/(\\d+)\\.(\\d+)-(\\S+)@',
  1096. 'family_replacement' => 'HTTPClient',
  1097. ],
  1098. ['regex' => '@^(go-cli)\\s(\\d+)\\.(\\d+).(\\S+)@'],
  1099. ['regex' => '@^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\\/v?(\\d+)\\.(\\d+)\\.?(\\d*)@'],
  1100. ['regex' => '@^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)@'],
  1101. [
  1102. 'regex' => '@(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1103. 'family_replacement' => 'Python aiohttp',
  1104. ],
  1105. ['regex' => '@(Java)[/ ]?\\d{1}\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)@'],
  1106. ['regex' => '@(Java)[/ ]?(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1107. ['regex' => '@(minio-go)/v(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1108. ['regex' => '@^(ureq)[/ ](\\d+)\\.(\\d+).(\\d+)@'],
  1109. ['regex' => '@^(http\\.rb)/(\\d+)\\.(\\d+).(\\d+)@'],
  1110. ['regex' => '@^(GuzzleHttp)/(\\d+)\\.(\\d+).(\\d+)@'],
  1111. ['regex' => '@^(grab)\\b@'],
  1112. ['regex' => '@^(Cyberduck)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.\\d+|)@'],
  1113. ['regex' => '@^(S3 Browser) (\\d+)[.-](\\d+)[.-](\\d+)(?:\\s*https?://s3browser\\.com|)@'],
  1114. ['regex' => '@(S3Gof3r)@'],
  1115. ['regex' => '@\\b(ibm-cos-sdk-(?:core|java|js|python))/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@'],
  1116. ['regex' => '@^(rusoto)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1117. ['regex' => '@^(rclone)/v(\\d+)\\.(\\d+)@'],
  1118. ['regex' => '@^(Roku)/DVP-(\\d+)\\.(\\d+)@'],
  1119. [
  1120. 'regex' => '@(Kurio)\\/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1121. 'family_replacement' => 'Kurio App',
  1122. ],
  1123. ['regex' => '@^(Box(?: Sync)?)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1124. [
  1125. 'regex' => '@^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1126. 'family_replacement' => 'ViaFree',
  1127. ],
  1128. ['regex' => '@(Transmit)/(\\d+)\\.(\\d+)\\.(\\d+)@'],
  1129. ['regex' => '@(Download Master)@'],
  1130. ['regex' => '@\\b(HTTrack) (\\d+)\\.(\\d+)(?:[\\.\\-](\\d+)|)@'],
  1131. ['regex' => '@(Ladybird)\\/(\\d+)\\.(\\d+)@'],
  1132. ['regex' => '@(MullvadBrowser)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  1133. ],
  1134. 'os_parsers' => [
  1135. [
  1136. 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 4.0@',
  1137. 'os_v1_replacement' => '2013',
  1138. ],
  1139. [
  1140. 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 3.0@',
  1141. 'os_v1_replacement' => '2012',
  1142. ],
  1143. [
  1144. 'regex' => '@HbbTV/1.1.1 \\(;;;;;\\) Maple_2011@',
  1145. 'os_replacement' => 'Samsung',
  1146. 'os_v1_replacement' => '2011',
  1147. ],
  1148. [
  1149. 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC@',
  1150. 'os_v2_replacement' => 'UE40F7000',
  1151. ],
  1152. [
  1153. 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC@',
  1154. 'os_v2_replacement' => 'UE32F4500',
  1155. ],
  1156. [
  1157. 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/4@',
  1158. 'os_v1_replacement' => '2013',
  1159. ],
  1160. [
  1161. 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/3@',
  1162. 'os_v1_replacement' => '2012',
  1163. ],
  1164. [
  1165. 'regex' => '@HbbTV/1\\.1\\.1 \\(; (Philips);.{0,200}NETTV/2@',
  1166. 'os_v1_replacement' => '2011',
  1167. ],
  1168. [
  1169. 'regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+.{0,100}(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)@',
  1170. 'os_replacement' => 'FireHbbTV',
  1171. ],
  1172. ['regex' => '@HbbTV/\\d+\\.\\d+\\.\\d+ \\(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\\)@'],
  1173. [
  1174. 'regex' => '@AspiegelBot|PetalBot@',
  1175. 'os_replacement' => 'Other',
  1176. ],
  1177. ['regex' => '@(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)@'],
  1178. [
  1179. 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).{0,100}Outlook-iOS-Android@',
  1180. 'os_replacement' => 'iOS',
  1181. ],
  1182. ['regex' => '@ArcGIS\\.?(iOS|Android)-\\d+\\.\\d+(?:\\.\\d+|)(?:[^\\/]{1,50}|)\\/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@'],
  1183. ['regex' => '@ArcGISRuntime-(?:Android|iOS)\\/\\d+\\.\\d+(?:\\.\\d+|) \\((Android|iOS) (\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|);@'],
  1184. [
  1185. 'regex' => '@(Android) (\\d+)(?:\\.(\\d+)).*CrKey@',
  1186. 'os_replacement' => 'Chromecast Android',
  1187. ],
  1188. [
  1189. 'regex' => '@Fuchsia.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@',
  1190. 'os_replacement' => 'Chromecast Fuchsia',
  1191. ],
  1192. [
  1193. 'regex' => '@Linux.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|).*DeviceType/SmartSpeaker@',
  1194. 'os_replacement' => 'Chromecast SmartSpeaker',
  1195. ],
  1196. [
  1197. 'regex' => '@Linux.*(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@',
  1198. 'os_replacement' => 'Chromecast Linux',
  1199. ],
  1200. ['regex' => '@(Android)[ \\-/](\\d+)(?:\\.(\\d+)|)(?:[.\\-]([a-z0-9]+)|)@'],
  1201. [
  1202. 'regex' => '@(Android) Donut@',
  1203. 'os_v1_replacement' => '1',
  1204. 'os_v2_replacement' => '2',
  1205. ],
  1206. [
  1207. 'regex' => '@(Android) Eclair@',
  1208. 'os_v1_replacement' => '2',
  1209. 'os_v2_replacement' => '1',
  1210. ],
  1211. [
  1212. 'regex' => '@(Android) Froyo@',
  1213. 'os_v1_replacement' => '2',
  1214. 'os_v2_replacement' => '2',
  1215. ],
  1216. [
  1217. 'regex' => '@(Android) Gingerbread@',
  1218. 'os_v1_replacement' => '2',
  1219. 'os_v2_replacement' => '3',
  1220. ],
  1221. [
  1222. 'regex' => '@(Android) Honeycomb@',
  1223. 'os_v1_replacement' => '3',
  1224. ],
  1225. ['regex' => '@(Android) (\\d+);@'],
  1226. ['regex' => '@(Android): (\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|);@'],
  1227. [
  1228. 'regex' => '@^UCWEB.{0,200}; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]{1,100})|);@',
  1229. 'os_replacement' => 'Android',
  1230. ],
  1231. [
  1232. 'regex' => '@^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);@',
  1233. 'os_replacement' => 'iOS',
  1234. ],
  1235. [
  1236. 'regex' => '@^UCWEB.{0,200}; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);@',
  1237. 'os_replacement' => 'Windows Phone',
  1238. ],
  1239. [
  1240. 'regex' => '@^(JUC).{0,200}; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]{1,100})|)@',
  1241. 'os_replacement' => 'Android',
  1242. ],
  1243. [
  1244. 'regex' => '@(android)\\s(?:mobile\\/)(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)@',
  1245. 'os_replacement' => 'Android',
  1246. ],
  1247. [
  1248. 'regex' => '@Quest@',
  1249. 'os_replacement' => 'Android',
  1250. ],
  1251. [
  1252. 'regex' => '@(Silk-Accelerated=[a-z]{4,5})@',
  1253. 'os_replacement' => 'Android',
  1254. ],
  1255. [
  1256. 'regex' => '@(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$@',
  1257. 'os_replacement' => 'Chrome OS',
  1258. ],
  1259. [
  1260. 'regex' => '@(XBLWP7)@',
  1261. 'os_replacement' => 'Windows Phone',
  1262. ],
  1263. [
  1264. 'regex' => '@(Windows ?Mobile)@',
  1265. 'os_replacement' => 'Windows Mobile',
  1266. ],
  1267. [
  1268. 'regex' => '@(Windows 10)@',
  1269. 'os_replacement' => 'Windows',
  1270. 'os_v1_replacement' => '10',
  1271. ],
  1272. [
  1273. 'regex' => '@(Windows (?:NT 5\\.2|NT 5\\.1))@',
  1274. 'os_replacement' => 'Windows',
  1275. 'os_v1_replacement' => 'XP',
  1276. ],
  1277. [
  1278. 'regex' => '@(Win(?:dows NT |32NT\\/)6\\.1)@',
  1279. 'os_replacement' => 'Windows',
  1280. 'os_v1_replacement' => '7',
  1281. ],
  1282. [
  1283. 'regex' => '@(Win(?:dows NT |32NT\\/)6\\.0)@',
  1284. 'os_replacement' => 'Windows',
  1285. 'os_v1_replacement' => 'Vista',
  1286. ],
  1287. [
  1288. 'regex' => '@(Win 9x 4\\.90)@',
  1289. 'os_replacement' => 'Windows',
  1290. 'os_v1_replacement' => 'ME',
  1291. ],
  1292. [
  1293. 'regex' => '@(Windows NT 6\\.2; ARM;)@',
  1294. 'os_replacement' => 'Windows',
  1295. 'os_v1_replacement' => 'RT',
  1296. ],
  1297. [
  1298. 'regex' => '@(Win(?:dows NT |32NT\\/)6\\.2)@',
  1299. 'os_replacement' => 'Windows',
  1300. 'os_v1_replacement' => '8',
  1301. ],
  1302. [
  1303. 'regex' => '@(Windows NT 6\\.3; ARM;)@',
  1304. 'os_replacement' => 'Windows',
  1305. 'os_v1_replacement' => 'RT 8',
  1306. 'os_v2_replacement' => '1',
  1307. ],
  1308. [
  1309. 'regex' => '@(Win(?:dows NT |32NT\\/)6\\.3)@',
  1310. 'os_replacement' => 'Windows',
  1311. 'os_v1_replacement' => '8',
  1312. 'os_v2_replacement' => '1',
  1313. ],
  1314. [
  1315. 'regex' => '@(Win(?:dows NT |32NT\\/)6\\.4)@',
  1316. 'os_replacement' => 'Windows',
  1317. 'os_v1_replacement' => '10',
  1318. ],
  1319. [
  1320. 'regex' => '@(Windows NT 10\\.0)@',
  1321. 'os_replacement' => 'Windows',
  1322. 'os_v1_replacement' => '10',
  1323. ],
  1324. [
  1325. 'regex' => '@(Windows NT 5\\.0)@',
  1326. 'os_replacement' => 'Windows',
  1327. 'os_v1_replacement' => '2000',
  1328. ],
  1329. [
  1330. 'regex' => '@(WinNT4.0)@',
  1331. 'os_replacement' => 'Windows',
  1332. 'os_v1_replacement' => 'NT 4.0',
  1333. ],
  1334. [
  1335. 'regex' => '@(Windows ?CE)@',
  1336. 'os_replacement' => 'Windows',
  1337. 'os_v1_replacement' => 'CE',
  1338. ],
  1339. [
  1340. 'regex' => '@Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)@',
  1341. 'os_replacement' => 'Windows',
  1342. 'os_v1_replacement' => '$1',
  1343. ],
  1344. [
  1345. 'regex' => '@Win16@',
  1346. 'os_replacement' => 'Windows',
  1347. 'os_v1_replacement' => '3.1',
  1348. ],
  1349. [
  1350. 'regex' => '@Win32@',
  1351. 'os_replacement' => 'Windows',
  1352. 'os_v1_replacement' => '95',
  1353. ],
  1354. [
  1355. 'regex' => '@^Box.{0,200}Windows/([\\d.]+);@',
  1356. 'os_replacement' => 'Windows',
  1357. 'os_v1_replacement' => '$1',
  1358. ],
  1359. ['regex' => '@(Tizen)[/ ](\\d+)\\.(\\d+)@'],
  1360. [
  1361. 'regex' => '@Intel Mac OS X.+(CriOS|EdgiOS)/\\d+@',
  1362. 'os_replacement' => 'iOS',
  1363. ],
  1364. [
  1365. 'regex' => '@((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+)|)|Mach-O)@',
  1366. 'os_replacement' => 'Mac OS X',
  1367. ],
  1368. [
  1369. 'regex' => '@Mac OS X\\s.{1,50}\\s(\\d+).(\\d+).(\\d+)@',
  1370. 'os_replacement' => 'Mac OS X',
  1371. 'os_v1_replacement' => '$1',
  1372. 'os_v2_replacement' => '$2',
  1373. 'os_v3_replacement' => '$3',
  1374. ],
  1375. [
  1376. 'regex' => '@ (Dar)(win)/(9).(\\d+).{0,100}\\((?:i386|x86_64|Power Macintosh)\\)@',
  1377. 'os_replacement' => 'Mac OS X',
  1378. 'os_v1_replacement' => '10',
  1379. 'os_v2_replacement' => '5',
  1380. ],
  1381. [
  1382. 'regex' => '@ (Dar)(win)/(10).(\\d+).{0,100}\\((?:i386|x86_64)\\)@',
  1383. 'os_replacement' => 'Mac OS X',
  1384. 'os_v1_replacement' => '10',
  1385. 'os_v2_replacement' => '6',
  1386. ],
  1387. [
  1388. 'regex' => '@ (Dar)(win)/(11).(\\d+).{0,100}\\((?:i386|x86_64)\\)@',
  1389. 'os_replacement' => 'Mac OS X',
  1390. 'os_v1_replacement' => '10',
  1391. 'os_v2_replacement' => '7',
  1392. ],
  1393. [
  1394. 'regex' => '@ (Dar)(win)/(12).(\\d+).{0,100}\\((?:i386|x86_64)\\)@',
  1395. 'os_replacement' => 'Mac OS X',
  1396. 'os_v1_replacement' => '10',
  1397. 'os_v2_replacement' => '8',
  1398. ],
  1399. [
  1400. 'regex' => '@ (Dar)(win)/(13).(\\d+).{0,100}\\((?:i386|x86_64)\\)@',
  1401. 'os_replacement' => 'Mac OS X',
  1402. 'os_v1_replacement' => '10',
  1403. 'os_v2_replacement' => '9',
  1404. ],
  1405. [
  1406. 'regex' => '@Mac_PowerPC@',
  1407. 'os_replacement' => 'Mac OS',
  1408. ],
  1409. ['regex' => '@(?:PPC|Intel) (Mac OS X)@'],
  1410. [
  1411. 'regex' => '@^Box.{0,200};(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)@',
  1412. 'os_replacement' => 'Mac OS X',
  1413. ],
  1414. [
  1415. 'regex' => '@darwin; arm64@',
  1416. 'os_replacement' => 'Mac OS X',
  1417. ],
  1418. [
  1419. 'regex' => '@(Apple\\s?TV)(?:/(\\d+)\\.(\\d+)|)@',
  1420. 'os_replacement' => 'ATV OS X',
  1421. ],
  1422. [
  1423. 'regex' => '@(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)@',
  1424. 'os_replacement' => 'iOS',
  1425. ],
  1426. [
  1427. 'regex' => '@(iPhone|iPad|iPod); Opera@',
  1428. 'os_replacement' => 'iOS',
  1429. ],
  1430. [
  1431. 'regex' => '@(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\\d+)\\.(\\d+)@',
  1432. 'os_replacement' => 'iOS',
  1433. ],
  1434. [
  1435. 'regex' => '@(CFNetwork)/(5)48\\.0\\.3.{0,100} Darwin/11\\.0\\.0@',
  1436. 'os_replacement' => 'iOS',
  1437. ],
  1438. [
  1439. 'regex' => '@(CFNetwork)/(5)48\\.(0)\\.4.{0,100} Darwin/(1)1\\.0\\.0@',
  1440. 'os_replacement' => 'iOS',
  1441. ],
  1442. [
  1443. 'regex' => '@(CFNetwork)/(5)48\\.(1)\\.4@',
  1444. 'os_replacement' => 'iOS',
  1445. ],
  1446. [
  1447. 'regex' => '@(CFNetwork)/(4)85\\.1(3)\\.9@',
  1448. 'os_replacement' => 'iOS',
  1449. ],
  1450. [
  1451. 'regex' => '@(CFNetwork)/(6)09\\.(1)\\.4@',
  1452. 'os_replacement' => 'iOS',
  1453. ],
  1454. [
  1455. 'regex' => '@(CFNetwork)/(6)(0)9@',
  1456. 'os_replacement' => 'iOS',
  1457. ],
  1458. [
  1459. 'regex' => '@(CFNetwork)/6(7)2\\.(1)\\.13@',
  1460. 'os_replacement' => 'iOS',
  1461. ],
  1462. [
  1463. 'regex' => '@(CFNetwork)/6(7)2\\.(1)\\.(1)4@',
  1464. 'os_replacement' => 'iOS',
  1465. ],
  1466. [
  1467. 'regex' => '@(CF)(Network)/6(7)(2)\\.1\\.15@',
  1468. 'os_replacement' => 'iOS',
  1469. 'os_v1_replacement' => '7',
  1470. 'os_v2_replacement' => '1',
  1471. ],
  1472. [
  1473. 'regex' => '@(CFNetwork)/6(7)2\\.(0)\\.(?:2|8)@',
  1474. 'os_replacement' => 'iOS',
  1475. ],
  1476. [
  1477. 'regex' => '@(CFNetwork)/709\\.1@',
  1478. 'os_replacement' => 'iOS',
  1479. 'os_v1_replacement' => '8',
  1480. 'os_v2_replacement' => '0.b5',
  1481. ],
  1482. [
  1483. 'regex' => '@(CF)(Network)/711\\.(\\d)@',
  1484. 'os_replacement' => 'iOS',
  1485. 'os_v1_replacement' => '8',
  1486. ],
  1487. [
  1488. 'regex' => '@(CF)(Network)/(720)\\.(\\d)@',
  1489. 'os_replacement' => 'Mac OS X',
  1490. 'os_v1_replacement' => '10',
  1491. 'os_v2_replacement' => '10',
  1492. ],
  1493. [
  1494. 'regex' => '@(CF)(Network)/(760)\\.(\\d)@',
  1495. 'os_replacement' => 'Mac OS X',
  1496. 'os_v1_replacement' => '10',
  1497. 'os_v2_replacement' => '11',
  1498. ],
  1499. [
  1500. 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.4\\.\\d+@',
  1501. 'os_replacement' => 'iOS',
  1502. 'os_v1_replacement' => '9',
  1503. 'os_v2_replacement' => '3',
  1504. 'os_v3_replacement' => '1',
  1505. ],
  1506. [
  1507. 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.5\\.\\d+@',
  1508. 'os_replacement' => 'iOS',
  1509. 'os_v1_replacement' => '9',
  1510. 'os_v2_replacement' => '3',
  1511. 'os_v3_replacement' => '2',
  1512. ],
  1513. [
  1514. 'regex' => '@CFNetwork/7.{0,100} Darwin/15\\.6\\.\\d+@',
  1515. 'os_replacement' => 'iOS',
  1516. 'os_v1_replacement' => '9',
  1517. 'os_v2_replacement' => '3',
  1518. 'os_v3_replacement' => '5',
  1519. ],
  1520. [
  1521. 'regex' => '@(CF)(Network)/758\\.(\\d)@',
  1522. 'os_replacement' => 'iOS',
  1523. 'os_v1_replacement' => '9',
  1524. ],
  1525. [
  1526. 'regex' => '@CFNetwork/808\\.3 Darwin/16\\.3\\.\\d+@',
  1527. 'os_replacement' => 'iOS',
  1528. 'os_v1_replacement' => '10',
  1529. 'os_v2_replacement' => '2',
  1530. 'os_v3_replacement' => '1',
  1531. ],
  1532. [
  1533. 'regex' => '@(CF)(Network)/808\\.(\\d)@',
  1534. 'os_replacement' => 'iOS',
  1535. 'os_v1_replacement' => '10',
  1536. ],
  1537. [
  1538. 'regex' => '@CFNetwork/.{0,100} Darwin/17\\.\\d+.{0,100}\\(x86_64\\)@',
  1539. 'os_replacement' => 'Mac OS X',
  1540. 'os_v1_replacement' => '10',
  1541. 'os_v2_replacement' => '13',
  1542. ],
  1543. [
  1544. 'regex' => '@CFNetwork/.{0,100} Darwin/16\\.\\d+.{0,100}\\(x86_64\\)@',
  1545. 'os_replacement' => 'Mac OS X',
  1546. 'os_v1_replacement' => '10',
  1547. 'os_v2_replacement' => '12',
  1548. ],
  1549. [
  1550. 'regex' => '@CFNetwork/8.{0,100} Darwin/15\\.\\d+.{0,100}\\(x86_64\\)@',
  1551. 'os_replacement' => 'Mac OS X',
  1552. 'os_v1_replacement' => '10',
  1553. 'os_v2_replacement' => '11',
  1554. ],
  1555. [
  1556. 'regex' => '@CFNetwork/.{0,100} Darwin/(9)\\.\\d+@',
  1557. 'os_replacement' => 'iOS',
  1558. 'os_v1_replacement' => '1',
  1559. ],
  1560. [
  1561. 'regex' => '@CFNetwork/.{0,100} Darwin/(10)\\.\\d+@',
  1562. 'os_replacement' => 'iOS',
  1563. 'os_v1_replacement' => '4',
  1564. ],
  1565. [
  1566. 'regex' => '@CFNetwork/.{0,100} Darwin/(11)\\.\\d+@',
  1567. 'os_replacement' => 'iOS',
  1568. 'os_v1_replacement' => '5',
  1569. ],
  1570. [
  1571. 'regex' => '@CFNetwork/.{0,100} Darwin/(13)\\.\\d+@',
  1572. 'os_replacement' => 'iOS',
  1573. 'os_v1_replacement' => '6',
  1574. ],
  1575. [
  1576. 'regex' => '@CFNetwork/6.{0,100} Darwin/(14)\\.\\d+@',
  1577. 'os_replacement' => 'iOS',
  1578. 'os_v1_replacement' => '7',
  1579. ],
  1580. [
  1581. 'regex' => '@CFNetwork/7.{0,100} Darwin/(14)\\.\\d+@',
  1582. 'os_replacement' => 'iOS',
  1583. 'os_v1_replacement' => '8',
  1584. 'os_v2_replacement' => '0',
  1585. ],
  1586. [
  1587. 'regex' => '@CFNetwork/7.{0,100} Darwin/(15)\\.\\d+@',
  1588. 'os_replacement' => 'iOS',
  1589. 'os_v1_replacement' => '9',
  1590. 'os_v2_replacement' => '0',
  1591. ],
  1592. [
  1593. 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.5\\.\\d+@',
  1594. 'os_replacement' => 'iOS',
  1595. 'os_v1_replacement' => '10',
  1596. 'os_v2_replacement' => '3',
  1597. ],
  1598. [
  1599. 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.6\\.\\d+@',
  1600. 'os_replacement' => 'iOS',
  1601. 'os_v1_replacement' => '10',
  1602. 'os_v2_replacement' => '3',
  1603. 'os_v3_replacement' => '2',
  1604. ],
  1605. [
  1606. 'regex' => '@CFNetwork/8.{0,100} Darwin/16\\.7\\.\\d+@',
  1607. 'os_replacement' => 'iOS',
  1608. 'os_v1_replacement' => '10',
  1609. 'os_v2_replacement' => '3',
  1610. 'os_v3_replacement' => '3',
  1611. ],
  1612. [
  1613. 'regex' => '@CFNetwork/8.{0,100} Darwin/(16)\\.\\d+@',
  1614. 'os_replacement' => 'iOS',
  1615. 'os_v1_replacement' => '10',
  1616. ],
  1617. [
  1618. 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.0\\.\\d+@',
  1619. 'os_replacement' => 'iOS',
  1620. 'os_v1_replacement' => '11',
  1621. 'os_v2_replacement' => '0',
  1622. ],
  1623. [
  1624. 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.2\\.\\d+@',
  1625. 'os_replacement' => 'iOS',
  1626. 'os_v1_replacement' => '11',
  1627. 'os_v2_replacement' => '1',
  1628. ],
  1629. [
  1630. 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.3\\.\\d+@',
  1631. 'os_replacement' => 'iOS',
  1632. 'os_v1_replacement' => '11',
  1633. 'os_v2_replacement' => '2',
  1634. ],
  1635. [
  1636. 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.4\\.\\d+@',
  1637. 'os_replacement' => 'iOS',
  1638. 'os_v1_replacement' => '11',
  1639. 'os_v2_replacement' => '2',
  1640. 'os_v3_replacement' => '6',
  1641. ],
  1642. [
  1643. 'regex' => '@CFNetwork/8.{0,100} Darwin/17\\.5\\.\\d+@',
  1644. 'os_replacement' => 'iOS',
  1645. 'os_v1_replacement' => '11',
  1646. 'os_v2_replacement' => '3',
  1647. ],
  1648. [
  1649. 'regex' => '@CFNetwork/9.{0,100} Darwin/17\\.6\\.\\d+@',
  1650. 'os_replacement' => 'iOS',
  1651. 'os_v1_replacement' => '11',
  1652. 'os_v2_replacement' => '4',
  1653. ],
  1654. [
  1655. 'regex' => '@CFNetwork/9.{0,100} Darwin/17\\.7\\.\\d+@',
  1656. 'os_replacement' => 'iOS',
  1657. 'os_v1_replacement' => '11',
  1658. 'os_v2_replacement' => '4',
  1659. 'os_v3_replacement' => '1',
  1660. ],
  1661. [
  1662. 'regex' => '@CFNetwork/8.{0,100} Darwin/(17)\\.\\d+@',
  1663. 'os_replacement' => 'iOS',
  1664. 'os_v1_replacement' => '11',
  1665. ],
  1666. [
  1667. 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.0\\.\\d+@',
  1668. 'os_replacement' => 'iOS',
  1669. 'os_v1_replacement' => '12',
  1670. 'os_v2_replacement' => '0',
  1671. ],
  1672. [
  1673. 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.2\\.\\d+@',
  1674. 'os_replacement' => 'iOS',
  1675. 'os_v1_replacement' => '12',
  1676. 'os_v2_replacement' => '1',
  1677. ],
  1678. [
  1679. 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.5\\.\\d+@',
  1680. 'os_replacement' => 'iOS',
  1681. 'os_v1_replacement' => '12',
  1682. 'os_v2_replacement' => '2',
  1683. ],
  1684. [
  1685. 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.6\\.\\d+@',
  1686. 'os_replacement' => 'iOS',
  1687. 'os_v1_replacement' => '12',
  1688. 'os_v2_replacement' => '3',
  1689. ],
  1690. [
  1691. 'regex' => '@CFNetwork/9.{0,100} Darwin/18\\.7\\.\\d+@',
  1692. 'os_replacement' => 'iOS',
  1693. 'os_v1_replacement' => '12',
  1694. 'os_v2_replacement' => '4',
  1695. ],
  1696. [
  1697. 'regex' => '@CFNetwork/9.{0,100} Darwin/(18)\\.\\d+@',
  1698. 'os_replacement' => 'iOS',
  1699. 'os_v1_replacement' => '12',
  1700. ],
  1701. [
  1702. 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.2\\.\\d+@',
  1703. 'os_replacement' => 'iOS',
  1704. 'os_v1_replacement' => '13',
  1705. 'os_v2_replacement' => '3',
  1706. ],
  1707. [
  1708. 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.3\\.\\d+@',
  1709. 'os_replacement' => 'iOS',
  1710. 'os_v1_replacement' => '13',
  1711. 'os_v2_replacement' => '3',
  1712. 'os_v3_replacement' => '1',
  1713. ],
  1714. [
  1715. 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.4\\.\\d+@',
  1716. 'os_replacement' => 'iOS',
  1717. 'os_v1_replacement' => '13',
  1718. 'os_v2_replacement' => '4',
  1719. ],
  1720. [
  1721. 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.5\\.\\d+@',
  1722. 'os_replacement' => 'iOS',
  1723. 'os_v1_replacement' => '13',
  1724. 'os_v2_replacement' => '5',
  1725. ],
  1726. [
  1727. 'regex' => '@CFNetwork/11.{0,100} Darwin/19\\.6\\.\\d+@',
  1728. 'os_replacement' => 'iOS',
  1729. 'os_v1_replacement' => '13',
  1730. 'os_v2_replacement' => '6',
  1731. ],
  1732. [
  1733. 'regex' => '@CFNetwork/1[01].{0,100} Darwin/19\\.\\d+@',
  1734. 'os_replacement' => 'iOS',
  1735. 'os_v1_replacement' => '13',
  1736. ],
  1737. [
  1738. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.1\\.\\d+@',
  1739. 'os_replacement' => 'iOS',
  1740. 'os_v1_replacement' => '14',
  1741. 'os_v2_replacement' => '2',
  1742. ],
  1743. [
  1744. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.2\\.\\d+@',
  1745. 'os_replacement' => 'iOS',
  1746. 'os_v1_replacement' => '14',
  1747. 'os_v2_replacement' => '3',
  1748. ],
  1749. [
  1750. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.3\\.\\d+@',
  1751. 'os_replacement' => 'iOS',
  1752. 'os_v1_replacement' => '14',
  1753. 'os_v2_replacement' => '4',
  1754. ],
  1755. [
  1756. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.4\\.\\d+@',
  1757. 'os_replacement' => 'iOS',
  1758. 'os_v1_replacement' => '14',
  1759. 'os_v2_replacement' => '5',
  1760. ],
  1761. [
  1762. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.5\\.\\d+@',
  1763. 'os_replacement' => 'iOS',
  1764. 'os_v1_replacement' => '14',
  1765. 'os_v2_replacement' => '6',
  1766. ],
  1767. [
  1768. 'regex' => '@CFNetwork/12.{0,100} Darwin/20\\.6\\.\\d+@',
  1769. 'os_replacement' => 'iOS',
  1770. 'os_v1_replacement' => '14',
  1771. 'os_v2_replacement' => '8',
  1772. ],
  1773. [
  1774. 'regex' => '@CFNetwork/.{0,100} Darwin/(20)\\.\\d+@',
  1775. 'os_replacement' => 'iOS',
  1776. 'os_v1_replacement' => '14',
  1777. ],
  1778. [
  1779. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.0\\.\\d+@',
  1780. 'os_replacement' => 'iOS',
  1781. 'os_v1_replacement' => '15',
  1782. 'os_v2_replacement' => '0',
  1783. ],
  1784. [
  1785. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.1\\.\\d+@',
  1786. 'os_replacement' => 'iOS',
  1787. 'os_v1_replacement' => '15',
  1788. 'os_v2_replacement' => '1',
  1789. ],
  1790. [
  1791. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.2\\.\\d+@',
  1792. 'os_replacement' => 'iOS',
  1793. 'os_v1_replacement' => '15',
  1794. 'os_v2_replacement' => '2',
  1795. ],
  1796. [
  1797. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.3\\.\\d+@',
  1798. 'os_replacement' => 'iOS',
  1799. 'os_v1_replacement' => '15',
  1800. 'os_v2_replacement' => '3',
  1801. ],
  1802. [
  1803. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.4\\.\\d+@',
  1804. 'os_replacement' => 'iOS',
  1805. 'os_v1_replacement' => '15',
  1806. 'os_v2_replacement' => '4',
  1807. ],
  1808. [
  1809. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.5\\.\\d+@',
  1810. 'os_replacement' => 'iOS',
  1811. 'os_v1_replacement' => '15',
  1812. 'os_v2_replacement' => '5',
  1813. ],
  1814. [
  1815. 'regex' => '@CFNetwork/13.{0,100} Darwin/21\\.6\\.\\d+@',
  1816. 'os_replacement' => 'iOS',
  1817. 'os_v1_replacement' => '15',
  1818. 'os_v2_replacement' => '6',
  1819. ],
  1820. [
  1821. 'regex' => '@CFNetwork/.{0,100} Darwin/(21)\\.\\d+@',
  1822. 'os_replacement' => 'iOS',
  1823. 'os_v1_replacement' => '15',
  1824. ],
  1825. [
  1826. 'regex' => '@CFNetwork/.{0,100} Darwin/22\\.([0-5])\\.\\d+@',
  1827. 'os_replacement' => 'iOS',
  1828. 'os_v1_replacement' => '16',
  1829. 'os_v2_replacement' => '$1',
  1830. ],
  1831. [
  1832. 'regex' => '@CFNetwork/.{0,100} Darwin/(22)\\.\\d+@',
  1833. 'os_replacement' => 'iOS',
  1834. 'os_v1_replacement' => '16',
  1835. ],
  1836. [
  1837. 'regex' => '@CFNetwork/.{0,100} Darwin/23\\.([0-5])\\.\\d+@',
  1838. 'os_replacement' => 'iOS',
  1839. 'os_v1_replacement' => '17',
  1840. 'os_v2_replacement' => '$1',
  1841. ],
  1842. [
  1843. 'regex' => '@CFNetwork/.{0,100} Darwin/(23)\\.\\d+@',
  1844. 'os_replacement' => 'iOS',
  1845. 'os_v1_replacement' => '17',
  1846. ],
  1847. [
  1848. 'regex' => '@CFNetwork/.{0,100} Darwin/24\\.([0-5])\\.\\d+@',
  1849. 'os_replacement' => 'iOS',
  1850. 'os_v1_replacement' => '18',
  1851. 'os_v2_replacement' => '$1',
  1852. ],
  1853. [
  1854. 'regex' => '@CFNetwork/.{0,100} Darwin/(24)\\.\\d+@',
  1855. 'os_replacement' => 'iOS',
  1856. 'os_v1_replacement' => '18',
  1857. ],
  1858. [
  1859. 'regex' => '@CFNetwork/.{0,100} Darwin/@',
  1860. 'os_replacement' => 'iOS',
  1861. ],
  1862. [
  1863. 'regex' => '@\\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\\d,\\d/|\\d,\\d; )|iPad/)(\\d{1,2})[_\\.](\\d{1,2})(?:[_\\.](\\d+)|)@',
  1864. 'os_replacement' => 'iOS',
  1865. ],
  1866. ['regex' => '@\\((iOS);@'],
  1867. [
  1868. 'regex' => '@(watchOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1869. 'os_replacement' => 'WatchOS',
  1870. ],
  1871. ['regex' => '@Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone@'],
  1872. [
  1873. 'regex' => '@(iPod|iPhone|iPad)@',
  1874. 'os_replacement' => 'iOS',
  1875. ],
  1876. [
  1877. 'regex' => '@(tvOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1878. 'os_replacement' => 'tvOS',
  1879. ],
  1880. [
  1881. 'regex' => '@(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1882. 'os_replacement' => 'Chrome OS',
  1883. ],
  1884. [
  1885. 'regex' => '@([Dd]ebian)@',
  1886. 'os_replacement' => 'Debian',
  1887. ],
  1888. ['regex' => '@(Linux Mint)(?:/(\\d+)|)@'],
  1889. ['regex' => '@(Mandriva)(?: Linux|)/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d)|)@'],
  1890. [
  1891. 'regex' => '@(Symbian[Oo][Ss])[/ ](\\d+)\\.(\\d+)@',
  1892. 'os_replacement' => 'Symbian OS',
  1893. ],
  1894. [
  1895. 'regex' => '@(Symbian/3).{1,200}NokiaBrowser/7\\.3@',
  1896. 'os_replacement' => 'Symbian^3 Anna',
  1897. ],
  1898. [
  1899. 'regex' => '@(Symbian/3).{1,200}NokiaBrowser/7\\.4@',
  1900. 'os_replacement' => 'Symbian^3 Belle',
  1901. ],
  1902. [
  1903. 'regex' => '@(Symbian/3)@',
  1904. 'os_replacement' => 'Symbian^3',
  1905. ],
  1906. [
  1907. 'regex' => '@\\b(Series 60|SymbOS|S60Version|S60V\\d|S60\\b)@',
  1908. 'os_replacement' => 'Symbian OS',
  1909. ],
  1910. ['regex' => '@(MeeGo)@'],
  1911. [
  1912. 'regex' => '@Symbian [Oo][Ss]@',
  1913. 'os_replacement' => 'Symbian OS',
  1914. ],
  1915. [
  1916. 'regex' => '@Series40;@',
  1917. 'os_replacement' => 'Nokia Series 40',
  1918. ],
  1919. [
  1920. 'regex' => '@Series30Plus;@',
  1921. 'os_replacement' => 'Nokia Series 30 Plus',
  1922. ],
  1923. [
  1924. 'regex' => '@(BB10);.{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)@',
  1925. 'os_replacement' => 'BlackBerry OS',
  1926. ],
  1927. [
  1928. 'regex' => '@(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1929. 'os_replacement' => 'BlackBerry OS',
  1930. ],
  1931. [
  1932. 'regex' => '@(Black[Bb]erry).{1,200}Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1933. 'os_replacement' => 'BlackBerry OS',
  1934. ],
  1935. [
  1936. 'regex' => '@(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)@',
  1937. 'os_replacement' => 'BlackBerry Tablet OS',
  1938. ],
  1939. [
  1940. 'regex' => '@(Play[Bb]ook)@',
  1941. 'os_replacement' => 'BlackBerry Tablet OS',
  1942. ],
  1943. [
  1944. 'regex' => '@(Black[Bb]erry)@',
  1945. 'os_replacement' => 'BlackBerry OS',
  1946. ],
  1947. [
  1948. 'regex' => '@(K[Aa][Ii]OS)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  1949. 'os_replacement' => 'KaiOS',
  1950. ],
  1951. [
  1952. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\\d+\\.\\d+@',
  1953. 'os_replacement' => 'Firefox OS',
  1954. 'os_v1_replacement' => '1',
  1955. 'os_v2_replacement' => '0',
  1956. 'os_v3_replacement' => '1',
  1957. ],
  1958. [
  1959. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\\d+\\.\\d+@',
  1960. 'os_replacement' => 'Firefox OS',
  1961. 'os_v1_replacement' => '1',
  1962. 'os_v2_replacement' => '1',
  1963. ],
  1964. [
  1965. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\\d+\\.\\d+@',
  1966. 'os_replacement' => 'Firefox OS',
  1967. 'os_v1_replacement' => '1',
  1968. 'os_v2_replacement' => '2',
  1969. ],
  1970. [
  1971. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\\d+\\.\\d+@',
  1972. 'os_replacement' => 'Firefox OS',
  1973. 'os_v1_replacement' => '1',
  1974. 'os_v2_replacement' => '3',
  1975. ],
  1976. [
  1977. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\\d+\\.\\d+@',
  1978. 'os_replacement' => 'Firefox OS',
  1979. 'os_v1_replacement' => '1',
  1980. 'os_v2_replacement' => '4',
  1981. ],
  1982. [
  1983. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\\d+\\.\\d+@',
  1984. 'os_replacement' => 'Firefox OS',
  1985. 'os_v1_replacement' => '2',
  1986. 'os_v2_replacement' => '0',
  1987. ],
  1988. [
  1989. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\\d+\\.\\d+@',
  1990. 'os_replacement' => 'Firefox OS',
  1991. 'os_v1_replacement' => '2',
  1992. 'os_v2_replacement' => '1',
  1993. ],
  1994. [
  1995. 'regex' => '@\\((?:Mobile|Tablet);.{1,200}Firefox/\\d+\\.\\d+@',
  1996. 'os_replacement' => 'Firefox OS',
  1997. ],
  1998. ['regex' => '@(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)@'],
  1999. ['regex' => '@(BREW);@'],
  2000. [
  2001. 'regex' => '@(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)@',
  2002. 'os_replacement' => 'Brew MP',
  2003. ],
  2004. [
  2005. 'regex' => '@BMP;@',
  2006. 'os_replacement' => 'Brew MP',
  2007. ],
  2008. ['regex' => '@(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+)|)|/[\\da-z]+)@'],
  2009. ['regex' => '@(WebTV)/(\\d+).(\\d+)@'],
  2010. [
  2011. 'regex' => '@(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)@',
  2012. 'os_replacement' => 'webOS',
  2013. ],
  2014. ['regex' => '@(VRE);@'],
  2015. ['regex' => '@(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)@'],
  2016. [
  2017. 'regex' => '@(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).{0,100}gentoo@',
  2018. 'os_replacement' => 'Gentoo',
  2019. ],
  2020. ['regex' => '@\\((Bada);@'],
  2021. ['regex' => '@(Windows|Android|WeTab|Maemo|Web0S)@'],
  2022. ['regex' => '@(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|SerenityOS|(?:Free|Open|Net|\\b)BSD)@'],
  2023. ['regex' => '@(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)@'],
  2024. [
  2025. 'regex' => '@SunOS@',
  2026. 'os_replacement' => 'Solaris',
  2027. ],
  2028. [
  2029. 'regex' => '@\\(linux-gnu\\)@',
  2030. 'os_replacement' => 'Linux',
  2031. ],
  2032. [
  2033. 'regex' => '@\\(x86_64-redhat-linux-gnu\\)@',
  2034. 'os_replacement' => 'Red Hat',
  2035. ],
  2036. [
  2037. 'regex' => '@\\((freebsd)(\\d+)\\.(\\d+)\\)@',
  2038. 'os_replacement' => 'FreeBSD',
  2039. ],
  2040. [
  2041. 'regex' => '@linux@',
  2042. 'os_replacement' => 'Linux',
  2043. ],
  2044. ['regex' => '@^(Roku)/DVP-(\\d+)\\.(\\d+)@'],
  2045. [
  2046. 'regex' => '@os\\/macos[#]?(\\d*)[.]?(\\d*)[.]?(\\d*)@',
  2047. 'os_replacement' => 'Mac OS X',
  2048. 'os_v1_replacement' => '$1',
  2049. 'os_v2_replacement' => '$2',
  2050. 'os_v3_replacement' => '$3',
  2051. ],
  2052. ['regex' => '@(HarmonyOS)[\\s;]+(\\d+|)\\.?(\\d+|)\\.?(\\d+|)@'],
  2053. ],
  2054. 'device_parsers' => [
  2055. [
  2056. 'regex' => '@^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html|Google-InspectionTool)|AdsBot-Google-Mobile.{0,200}iPhone)@i',
  2057. 'device_replacement' => 'Spider',
  2058. 'brand_replacement' => 'Spider',
  2059. 'model_replacement' => 'Smartphone',
  2060. ],
  2061. [
  2062. 'regex' => '@^.{0,100}?(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)@i',
  2063. 'device_replacement' => 'Spider',
  2064. 'brand_replacement' => 'Spider',
  2065. 'model_replacement' => 'Feature Phone',
  2066. ],
  2067. [
  2068. 'regex' => '@ PTST/\\d+(?:\\.\\d+|)$@',
  2069. 'device_replacement' => 'Spider',
  2070. 'brand_replacement' => 'Spider',
  2071. ],
  2072. [
  2073. 'regex' => '@X11; Datanyze; Linux@',
  2074. 'device_replacement' => 'Spider',
  2075. 'brand_replacement' => 'Spider',
  2076. ],
  2077. [
  2078. 'regex' => '@Mozilla.{1,100}Mobile.{1,100}(AspiegelBot|PetalBot)@',
  2079. 'device_replacement' => 'Spider',
  2080. 'brand_replacement' => 'Spider',
  2081. 'model_replacement' => 'Smartphone',
  2082. ],
  2083. [
  2084. 'regex' => '@Mozilla.{0,200}(AspiegelBot|PetalBot)@',
  2085. 'device_replacement' => 'Spider',
  2086. 'brand_replacement' => 'Spider',
  2087. 'model_replacement' => 'Desktop',
  2088. ],
  2089. [
  2090. 'regex' => '@\\bSmartWatch {0,2}\\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};@',
  2091. 'device_replacement' => '$1 $2',
  2092. 'brand_replacement' => '$1',
  2093. 'model_replacement' => '$2',
  2094. ],
  2095. [
  2096. 'regex' => '@Android Application[^\\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \\w{1,20} - @',
  2097. 'device_replacement' => '$1 $2',
  2098. 'brand_replacement' => '$1$2',
  2099. 'model_replacement' => '$3',
  2100. ],
  2101. [
  2102. 'regex' => '@Android Application[^\\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.{1,200}) \\w{1,20} - @i',
  2103. 'device_replacement' => '$1 $2',
  2104. 'brand_replacement' => '$1',
  2105. 'model_replacement' => '$2',
  2106. ],
  2107. [
  2108. 'regex' => '@Android Application[^\\-]{1,300} - ([^ ]+) (.{1,200}) \\w{1,20} - @',
  2109. 'device_replacement' => '$1 $2',
  2110. 'brand_replacement' => '$1',
  2111. 'model_replacement' => '$2',
  2112. ],
  2113. [
  2114. 'regex' => '@; {0,2}([BLRQ]C\\d{4}[A-Z]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2115. 'device_replacement' => '3Q $1',
  2116. 'brand_replacement' => '3Q',
  2117. 'model_replacement' => '$1',
  2118. ],
  2119. [
  2120. 'regex' => '@; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2121. 'device_replacement' => '3Q $1',
  2122. 'brand_replacement' => '3Q',
  2123. 'model_replacement' => '$1',
  2124. ],
  2125. [
  2126. 'regex' => '@Android [34].{0,200}; {0,2}(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2127. 'device_replacement' => '$1',
  2128. 'brand_replacement' => 'Acer',
  2129. 'model_replacement' => '$1',
  2130. ],
  2131. [
  2132. 'regex' => '@; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2133. 'device_replacement' => '$1',
  2134. 'brand_replacement' => 'Acer',
  2135. 'model_replacement' => '$1',
  2136. ],
  2137. [
  2138. 'regex' => '@; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\\d+)(?: Build|\\) AppleWebKit)@',
  2139. 'device_replacement' => '$1',
  2140. 'brand_replacement' => 'Acer',
  2141. 'model_replacement' => '$1',
  2142. ],
  2143. [
  2144. 'regex' => '@; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2145. 'device_replacement' => '$1$2',
  2146. 'brand_replacement' => 'Acer',
  2147. 'model_replacement' => '$2',
  2148. ],
  2149. [
  2150. 'regex' => '@; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\\) AppleWebKit)@',
  2151. 'device_replacement' => '$1$2',
  2152. 'brand_replacement' => 'Advent',
  2153. 'model_replacement' => '$2',
  2154. ],
  2155. [
  2156. 'regex' => '@; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2157. 'device_replacement' => '$1$2',
  2158. 'brand_replacement' => 'Ainol',
  2159. 'model_replacement' => '$2',
  2160. ],
  2161. [
  2162. 'regex' => '@; {0,2}AIRIS[ _\\-]?([^/;\\)]+) {0,2}(?:;|\\)|Build)@i',
  2163. 'device_replacement' => '$1',
  2164. 'brand_replacement' => 'Airis',
  2165. 'model_replacement' => '$1',
  2166. ],
  2167. [
  2168. 'regex' => '@; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2169. 'device_replacement' => '$1',
  2170. 'brand_replacement' => 'Airis',
  2171. 'model_replacement' => '$1',
  2172. ],
  2173. [
  2174. 'regex' => '@; {0,2}Airpad[ \\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2175. 'device_replacement' => 'Airpad $1',
  2176. 'brand_replacement' => 'Airpad',
  2177. 'model_replacement' => '$1',
  2178. ],
  2179. [
  2180. 'regex' => '@; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)@',
  2181. 'device_replacement' => 'Alcatel One Touch $2',
  2182. 'brand_replacement' => 'Alcatel',
  2183. 'model_replacement' => 'One Touch $2',
  2184. ],
  2185. [
  2186. 'regex' => '@; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2187. 'device_replacement' => 'Alcatel One Touch $1',
  2188. 'brand_replacement' => 'Alcatel',
  2189. 'model_replacement' => 'One Touch $1',
  2190. ],
  2191. [
  2192. 'regex' => '@; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2193. 'device_replacement' => '$1 $2',
  2194. 'brand_replacement' => '$1',
  2195. 'model_replacement' => '$2',
  2196. ],
  2197. [
  2198. 'regex' => '@; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)@',
  2199. 'device_replacement' => 'Alcatel $1',
  2200. 'brand_replacement' => 'Alcatel',
  2201. 'model_replacement' => '$1',
  2202. ],
  2203. [
  2204. 'regex' => '@; {0,2}BASE_Lutea_3(?: Build|\\) AppleWebKit)@',
  2205. 'device_replacement' => 'Alcatel One Touch 998',
  2206. 'brand_replacement' => 'Alcatel',
  2207. 'model_replacement' => 'One Touch 998',
  2208. ],
  2209. [
  2210. 'regex' => '@; {0,2}BASE_Varia(?: Build|\\) AppleWebKit)@',
  2211. 'device_replacement' => 'Alcatel One Touch 918D',
  2212. 'brand_replacement' => 'Alcatel',
  2213. 'model_replacement' => 'One Touch 918D',
  2214. ],
  2215. [
  2216. 'regex' => '@; {0,2}((?:FINE|Fine)\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2217. 'device_replacement' => '$1',
  2218. 'brand_replacement' => 'Allfine',
  2219. 'model_replacement' => '$1',
  2220. ],
  2221. [
  2222. 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\\) AppleWebKit)@',
  2223. 'device_replacement' => '$1$2',
  2224. 'brand_replacement' => 'Allview',
  2225. 'model_replacement' => '$2',
  2226. ],
  2227. [
  2228. 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)@',
  2229. 'device_replacement' => '$1$2',
  2230. 'brand_replacement' => 'Allview',
  2231. 'model_replacement' => '$2',
  2232. ],
  2233. [
  2234. 'regex' => '@; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)@',
  2235. 'device_replacement' => '$1$2',
  2236. 'brand_replacement' => 'Allview',
  2237. 'model_replacement' => '$2',
  2238. ],
  2239. [
  2240. 'regex' => '@; {0,2}(A13-MID)(?: Build|\\) AppleWebKit)@',
  2241. 'device_replacement' => '$1',
  2242. 'brand_replacement' => 'Allwinner',
  2243. 'model_replacement' => '$1',
  2244. ],
  2245. [
  2246. 'regex' => '@; {0,2}(Allwinner)[ _\\-]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2247. 'device_replacement' => '$1 $2',
  2248. 'brand_replacement' => 'Allwinner',
  2249. 'model_replacement' => '$1',
  2250. ],
  2251. [
  2252. 'regex' => '@; {0,2}(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)@',
  2253. 'device_replacement' => '$1',
  2254. 'brand_replacement' => 'Amaway',
  2255. 'model_replacement' => '$1',
  2256. ],
  2257. [
  2258. 'regex' => '@; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2259. 'device_replacement' => 'Amoi $1',
  2260. 'brand_replacement' => 'Amoi',
  2261. 'model_replacement' => '$1',
  2262. ],
  2263. [
  2264. 'regex' => '@^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux@',
  2265. 'device_replacement' => 'Amoi $1',
  2266. 'brand_replacement' => 'Amoi',
  2267. 'model_replacement' => '$1',
  2268. ],
  2269. [
  2270. 'regex' => '@; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2271. 'device_replacement' => '$1',
  2272. 'brand_replacement' => 'Aoc',
  2273. 'model_replacement' => '$1',
  2274. ],
  2275. [
  2276. 'regex' => '@; {0,2}(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)@',
  2277. 'device_replacement' => 'Aoson $1',
  2278. 'brand_replacement' => 'Aoson',
  2279. 'model_replacement' => '$1',
  2280. ],
  2281. [
  2282. 'regex' => '@; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2283. 'device_replacement' => 'Aoson $1',
  2284. 'brand_replacement' => 'Aoson',
  2285. 'model_replacement' => '$1',
  2286. ],
  2287. [
  2288. 'regex' => '@; {0,2}[Aa]panda[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2289. 'device_replacement' => 'Apanda $1',
  2290. 'brand_replacement' => 'Apanda',
  2291. 'model_replacement' => '$1',
  2292. ],
  2293. [
  2294. 'regex' => '@; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2295. 'device_replacement' => 'Archos $1',
  2296. 'brand_replacement' => 'Archos',
  2297. 'model_replacement' => '$1',
  2298. ],
  2299. [
  2300. 'regex' => '@ARCHOS; GOGI; ([^;]{1,200});@',
  2301. 'device_replacement' => 'Archos $1',
  2302. 'brand_replacement' => 'Archos',
  2303. 'model_replacement' => '$1',
  2304. ],
  2305. [
  2306. 'regex' => '@(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\\(\\)\\-]|$)@',
  2307. 'device_replacement' => 'Archos $1',
  2308. 'brand_replacement' => 'Archos',
  2309. 'model_replacement' => '$1',
  2310. ],
  2311. [
  2312. 'regex' => '@; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)@',
  2313. 'device_replacement' => 'Archos $1',
  2314. 'brand_replacement' => 'Archos',
  2315. 'model_replacement' => '$1',
  2316. ],
  2317. [
  2318. 'regex' => '@; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)@',
  2319. 'device_replacement' => 'Archos $1',
  2320. 'brand_replacement' => 'Archos',
  2321. 'model_replacement' => '$1',
  2322. ],
  2323. [
  2324. 'regex' => '@; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2325. 'device_replacement' => '$1',
  2326. 'brand_replacement' => 'Arival',
  2327. 'model_replacement' => '$1',
  2328. ],
  2329. [
  2330. 'regex' => '@; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2331. 'device_replacement' => '$1 $2',
  2332. 'brand_replacement' => 'Arival',
  2333. 'model_replacement' => '$1 $2',
  2334. ],
  2335. [
  2336. 'regex' => '@; {0,2}(AN\\d[^;/]{1,100}|ARCHM\\d+)(?: Build|\\) AppleWebKit)@',
  2337. 'device_replacement' => 'Arnova $1',
  2338. 'brand_replacement' => 'Arnova',
  2339. 'model_replacement' => '$1',
  2340. ],
  2341. [
  2342. 'regex' => '@; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2343. 'device_replacement' => 'Arnova $1',
  2344. 'brand_replacement' => 'Arnova',
  2345. 'model_replacement' => '$1',
  2346. ],
  2347. [
  2348. 'regex' => '@; {0,2}(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)@',
  2349. 'device_replacement' => 'Assistant $1-$2',
  2350. 'brand_replacement' => 'Assistant',
  2351. 'model_replacement' => '$1-$2',
  2352. ],
  2353. [
  2354. 'regex' => '@; {0,2}(ME17\\d[^;/]*|ME3\\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)@',
  2355. 'device_replacement' => 'Asus $1',
  2356. 'brand_replacement' => 'Asus',
  2357. 'model_replacement' => '$1',
  2358. ],
  2359. [
  2360. 'regex' => '@; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2361. 'device_replacement' => 'Asus $1',
  2362. 'brand_replacement' => 'Asus',
  2363. 'model_replacement' => '$1',
  2364. ],
  2365. [
  2366. 'regex' => '@; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2367. 'device_replacement' => 'Garmin-Asus $1',
  2368. 'brand_replacement' => 'Garmin-Asus',
  2369. 'model_replacement' => '$1',
  2370. ],
  2371. [
  2372. 'regex' => '@; {0,2}(Garminfone)(?: Build|\\) AppleWebKit)@',
  2373. 'device_replacement' => 'Garmin $1',
  2374. 'brand_replacement' => 'Garmin-Asus',
  2375. 'model_replacement' => '$1',
  2376. ],
  2377. [
  2378. 'regex' => '@; (\\@TAB-[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2379. 'device_replacement' => '$1',
  2380. 'brand_replacement' => 'Attab',
  2381. 'model_replacement' => '$1',
  2382. ],
  2383. [
  2384. 'regex' => '@; {0,2}(T-(?:07|[^0]\\d)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2385. 'device_replacement' => '$1',
  2386. 'brand_replacement' => 'Audiosonic',
  2387. 'model_replacement' => '$1',
  2388. ],
  2389. [
  2390. 'regex' => '@; {0,2}(?:Axioo[ _\\-]([^;/]{1,100}?)|(picopad)[ _\\-]([^;/]{1,100}?))(?: Build|\\) AppleWebKit)@i',
  2391. 'device_replacement' => 'Axioo $1$2 $3',
  2392. 'brand_replacement' => 'Axioo',
  2393. 'model_replacement' => '$1$2 $3',
  2394. ],
  2395. [
  2396. 'regex' => '@; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)@',
  2397. 'device_replacement' => '$1',
  2398. 'brand_replacement' => 'Azend',
  2399. 'model_replacement' => '$1',
  2400. ],
  2401. [
  2402. 'regex' => '@; {0,2}(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)@i',
  2403. 'device_replacement' => '$1',
  2404. 'brand_replacement' => 'Bak',
  2405. 'model_replacement' => '$1',
  2406. ],
  2407. [
  2408. 'regex' => '@; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)@',
  2409. 'device_replacement' => 'Bedove $1',
  2410. 'brand_replacement' => 'Bedove',
  2411. 'model_replacement' => '$1',
  2412. ],
  2413. [
  2414. 'regex' => '@; {0,2}(JC-[^;/]*)(?: Build|\\) AppleWebKit)@',
  2415. 'device_replacement' => 'Benss $1',
  2416. 'brand_replacement' => 'Benss',
  2417. 'model_replacement' => '$1',
  2418. ],
  2419. [
  2420. 'regex' => '@; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2421. 'device_replacement' => '$1 $2',
  2422. 'brand_replacement' => 'Blackberry',
  2423. 'model_replacement' => '$2',
  2424. ],
  2425. [
  2426. 'regex' => '@; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2427. 'device_replacement' => '$1 $2',
  2428. 'brand_replacement' => '$1',
  2429. 'model_replacement' => '$2',
  2430. ],
  2431. [
  2432. 'regex' => '@; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2433. 'device_replacement' => '$1 $2',
  2434. 'brand_replacement' => '$1',
  2435. 'model_replacement' => '$2',
  2436. ],
  2437. [
  2438. 'regex' => '@; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2439. 'device_replacement' => 'Blaupunkt $1',
  2440. 'brand_replacement' => 'Blaupunkt',
  2441. 'model_replacement' => '$1',
  2442. ],
  2443. [
  2444. 'regex' => '@; {0,2}((?:BLU|Blu)[ _\\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2445. 'device_replacement' => '$1$2',
  2446. 'brand_replacement' => 'Blu',
  2447. 'model_replacement' => '$2',
  2448. ],
  2449. [
  2450. 'regex' => '@; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)@',
  2451. 'device_replacement' => '$1',
  2452. 'brand_replacement' => 'Blu',
  2453. 'model_replacement' => '$1',
  2454. ],
  2455. [
  2456. 'regex' => '@; {0,2}(TOUCH\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2457. 'device_replacement' => '$1',
  2458. 'brand_replacement' => 'Blusens',
  2459. 'model_replacement' => '$1',
  2460. ],
  2461. [
  2462. 'regex' => '@; {0,2}(AX5\\d+)(?: Build|\\) AppleWebKit)@',
  2463. 'device_replacement' => '$1',
  2464. 'brand_replacement' => 'Bmobile',
  2465. 'model_replacement' => '$1',
  2466. ],
  2467. [
  2468. 'regex' => '@; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\\) AppleWebKit)@',
  2469. 'device_replacement' => '$1 $2',
  2470. 'brand_replacement' => 'bq',
  2471. 'model_replacement' => '$2',
  2472. ],
  2473. [
  2474. 'regex' => '@; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2475. 'device_replacement' => '$1',
  2476. 'brand_replacement' => 'bq',
  2477. 'model_replacement' => '$1',
  2478. ],
  2479. [
  2480. 'regex' => '@; {0,2}((?:B-Tab|B-TAB) ?\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2481. 'device_replacement' => '$1',
  2482. 'brand_replacement' => 'Braun',
  2483. 'model_replacement' => '$1',
  2484. ],
  2485. [
  2486. 'regex' => '@; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2487. 'device_replacement' => '$1 $2',
  2488. 'brand_replacement' => '$1',
  2489. 'model_replacement' => '$2',
  2490. ],
  2491. [
  2492. 'regex' => '@; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2493. 'device_replacement' => 'Captiva $1',
  2494. 'brand_replacement' => 'Captiva',
  2495. 'model_replacement' => '$1',
  2496. ],
  2497. [
  2498. 'regex' => '@; {0,2}(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)@',
  2499. 'device_replacement' => '$1',
  2500. 'brand_replacement' => 'Casio',
  2501. 'model_replacement' => '$1',
  2502. ],
  2503. [
  2504. 'regex' => '@; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2505. 'device_replacement' => 'Cat $1',
  2506. 'brand_replacement' => 'Cat',
  2507. 'model_replacement' => '$1',
  2508. ],
  2509. [
  2510. 'regex' => '@; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2511. 'device_replacement' => 'Cat $1',
  2512. 'brand_replacement' => 'Cat',
  2513. 'model_replacement' => '$1',
  2514. ],
  2515. [
  2516. 'regex' => '@; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)@',
  2517. 'device_replacement' => '$1',
  2518. 'brand_replacement' => 'Cat',
  2519. 'model_replacement' => 'Tablet PHOENIX 8.1J0',
  2520. ],
  2521. [
  2522. 'regex' => '@; {0,2}(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))@',
  2523. 'device_replacement' => '$1',
  2524. 'brand_replacement' => 'Celkon',
  2525. 'model_replacement' => '$1',
  2526. ],
  2527. [
  2528. 'regex' => '@Build/(?:[Cc]elkon)+_?([^;/_\\)]+)@',
  2529. 'device_replacement' => '$1',
  2530. 'brand_replacement' => 'Celkon',
  2531. 'model_replacement' => '$1',
  2532. ],
  2533. [
  2534. 'regex' => '@; {0,2}(CT)-?(\\d+)(?: Build|\\) AppleWebKit)@',
  2535. 'device_replacement' => '$1$2',
  2536. 'brand_replacement' => 'Celkon',
  2537. 'model_replacement' => '$1$2',
  2538. ],
  2539. [
  2540. 'regex' => '@; {0,2}(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))@',
  2541. 'device_replacement' => '$1',
  2542. 'brand_replacement' => 'Celkon',
  2543. 'model_replacement' => '$1',
  2544. ],
  2545. [
  2546. 'regex' => '@; {0,2}(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)@',
  2547. 'device_replacement' => '$1',
  2548. 'brand_replacement' => 'ChangJia',
  2549. 'model_replacement' => '$1',
  2550. ],
  2551. [
  2552. 'regex' => '@CrKey.*DeviceType/([^/]*)@',
  2553. 'brand_replacement' => 'Google',
  2554. 'device_replacement' => 'Chromecast',
  2555. 'model_replacement' => '$1',
  2556. ],
  2557. [
  2558. 'regex' => '@Fuchsia.*CrKey@',
  2559. 'brand_replacement' => 'Google',
  2560. 'device_replacement' => 'Chromecast',
  2561. 'model_replacement' => 'Nest Hub',
  2562. ],
  2563. [
  2564. 'regex' => '@Linux.*CrKey/1.36@',
  2565. 'brand_replacement' => 'Google',
  2566. 'device_replacement' => 'Chromecast',
  2567. 'model_replacement' => 'First Generation',
  2568. ],
  2569. [
  2570. 'regex' => '@CrKey/@',
  2571. 'brand_replacement' => 'Google',
  2572. 'device_replacement' => 'Chromecast',
  2573. 'model_replacement' => 'Chromecast',
  2574. ],
  2575. [
  2576. 'regex' => '@; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2577. 'device_replacement' => '$1 $2 $3',
  2578. 'brand_replacement' => 'Cloudfone',
  2579. 'model_replacement' => '$1 $2 $3',
  2580. ],
  2581. [
  2582. 'regex' => '@; {0,2}(Excite|ICE)[ _](\\d+[^;/]{0,100}?)(?: Build|\\) AppleWebKit)@',
  2583. 'device_replacement' => 'Cloudfone $1 $2',
  2584. 'brand_replacement' => 'Cloudfone',
  2585. 'model_replacement' => 'Cloudfone $1 $2',
  2586. ],
  2587. [
  2588. 'regex' => '@; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2589. 'device_replacement' => '$1 $2',
  2590. 'brand_replacement' => 'Cloudfone',
  2591. 'model_replacement' => '$1 $2',
  2592. ],
  2593. [
  2594. 'regex' => '@; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2595. 'device_replacement' => '$1',
  2596. 'brand_replacement' => 'Cmx',
  2597. 'model_replacement' => '$1',
  2598. ],
  2599. [
  2600. 'regex' => '@; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\\)])@',
  2601. 'device_replacement' => 'CobyKyros $1$2',
  2602. 'brand_replacement' => 'CobyKyros',
  2603. 'model_replacement' => '$1$2',
  2604. ],
  2605. [
  2606. 'regex' => '@; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2607. 'device_replacement' => '$1$2',
  2608. 'brand_replacement' => 'Coolpad',
  2609. 'model_replacement' => '$1$2',
  2610. ],
  2611. [
  2612. 'regex' => '@; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\\) AppleWebKit)@i',
  2613. 'device_replacement' => '$1$2',
  2614. 'brand_replacement' => 'Cube',
  2615. 'model_replacement' => '$2',
  2616. ],
  2617. [
  2618. 'regex' => '@; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2619. 'device_replacement' => '$1',
  2620. 'brand_replacement' => 'Cubot',
  2621. 'model_replacement' => '$1',
  2622. ],
  2623. [
  2624. 'regex' => '@; {0,2}(BOBBY)(?: Build|\\) AppleWebKit)@i',
  2625. 'device_replacement' => '$1',
  2626. 'brand_replacement' => 'Cubot',
  2627. 'model_replacement' => '$1',
  2628. ],
  2629. [
  2630. 'regex' => '@; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2631. 'device_replacement' => '$1',
  2632. 'brand_replacement' => 'Danew',
  2633. 'model_replacement' => '$1',
  2634. ],
  2635. [
  2636. 'regex' => '@; {0,2}(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)@',
  2637. 'device_replacement' => 'Dell $1$2',
  2638. 'brand_replacement' => 'Dell',
  2639. 'model_replacement' => '$1$2',
  2640. ],
  2641. [
  2642. 'regex' => '@; {0,2}(001DL)(?: Build|\\) AppleWebKit)@',
  2643. 'device_replacement' => 'Dell $1',
  2644. 'brand_replacement' => 'Dell',
  2645. 'model_replacement' => 'Streak',
  2646. ],
  2647. [
  2648. 'regex' => '@; {0,2}(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)@',
  2649. 'device_replacement' => 'Dell $1',
  2650. 'brand_replacement' => 'Dell',
  2651. 'model_replacement' => 'Streak',
  2652. ],
  2653. [
  2654. 'regex' => '@; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\\) AppleWebKit)@',
  2655. 'device_replacement' => 'Dell $1',
  2656. 'brand_replacement' => 'Dell',
  2657. 'model_replacement' => 'Streak Pro',
  2658. ],
  2659. [
  2660. 'regex' => '@; {0,2}([Ss]treak ?7)(?: Build|\\) AppleWebKit)@',
  2661. 'device_replacement' => 'Dell $1',
  2662. 'brand_replacement' => 'Dell',
  2663. 'model_replacement' => 'Streak 7',
  2664. ],
  2665. [
  2666. 'regex' => '@; {0,2}(Mini-3iX)(?: Build|\\) AppleWebKit)@',
  2667. 'device_replacement' => 'Dell $1',
  2668. 'brand_replacement' => 'Dell',
  2669. 'model_replacement' => '$1',
  2670. ],
  2671. [
  2672. 'regex' => '@; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)@',
  2673. 'device_replacement' => 'Dell $1',
  2674. 'brand_replacement' => 'Dell',
  2675. 'model_replacement' => '$1',
  2676. ],
  2677. [
  2678. 'regex' => '@; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2679. 'device_replacement' => 'Dell $1',
  2680. 'brand_replacement' => 'Dell',
  2681. 'model_replacement' => '$1',
  2682. ],
  2683. [
  2684. 'regex' => '@; {0,2}(TA[CD]-\\d+[^;/]{0,100})(?: Build|\\) AppleWebKit)@',
  2685. 'device_replacement' => '$1',
  2686. 'brand_replacement' => 'Denver',
  2687. 'model_replacement' => '$1',
  2688. ],
  2689. [
  2690. 'regex' => '@; {0,2}(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)@',
  2691. 'device_replacement' => '$1',
  2692. 'brand_replacement' => 'Dex',
  2693. 'model_replacement' => '$1',
  2694. ],
  2695. [
  2696. 'regex' => '@; {0,2}(AirTab)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2697. 'device_replacement' => '$1 $2',
  2698. 'brand_replacement' => 'DNS',
  2699. 'model_replacement' => '$1 $2',
  2700. ],
  2701. [
  2702. 'regex' => '@; {0,2}(F\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2703. 'device_replacement' => '$1',
  2704. 'brand_replacement' => 'Fujitsu',
  2705. 'model_replacement' => '$1',
  2706. ],
  2707. [
  2708. 'regex' => '@; {0,2}(HT-03A)(?: Build|\\) AppleWebKit)@',
  2709. 'device_replacement' => '$1',
  2710. 'brand_replacement' => 'HTC',
  2711. 'model_replacement' => 'Magic',
  2712. ],
  2713. [
  2714. 'regex' => '@; {0,2}(HT\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2715. 'device_replacement' => '$1',
  2716. 'brand_replacement' => 'HTC',
  2717. 'model_replacement' => '$1',
  2718. ],
  2719. [
  2720. 'regex' => '@; {0,2}(L\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2721. 'device_replacement' => '$1',
  2722. 'brand_replacement' => 'LG',
  2723. 'model_replacement' => '$1',
  2724. ],
  2725. [
  2726. 'regex' => '@; {0,2}(N\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2727. 'device_replacement' => '$1',
  2728. 'brand_replacement' => 'Nec',
  2729. 'model_replacement' => '$1',
  2730. ],
  2731. [
  2732. 'regex' => '@; {0,2}(P\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2733. 'device_replacement' => '$1',
  2734. 'brand_replacement' => 'Panasonic',
  2735. 'model_replacement' => '$1',
  2736. ],
  2737. [
  2738. 'regex' => '@; {0,2}(SC\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2739. 'device_replacement' => '$1',
  2740. 'brand_replacement' => 'Samsung',
  2741. 'model_replacement' => '$1',
  2742. ],
  2743. [
  2744. 'regex' => '@; {0,2}(SH\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2745. 'device_replacement' => '$1',
  2746. 'brand_replacement' => 'Sharp',
  2747. 'model_replacement' => '$1',
  2748. ],
  2749. [
  2750. 'regex' => '@; {0,2}(SO\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2751. 'device_replacement' => '$1',
  2752. 'brand_replacement' => 'SonyEricsson',
  2753. 'model_replacement' => '$1',
  2754. ],
  2755. [
  2756. 'regex' => '@; {0,2}(T\\-0[12][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2757. 'device_replacement' => '$1',
  2758. 'brand_replacement' => 'Toshiba',
  2759. 'model_replacement' => '$1',
  2760. ],
  2761. [
  2762. 'regex' => '@; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2763. 'device_replacement' => '$1 $2',
  2764. 'brand_replacement' => 'DOOV',
  2765. 'model_replacement' => '$2',
  2766. ],
  2767. [
  2768. 'regex' => '@; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2769. 'device_replacement' => '$1 $2',
  2770. 'brand_replacement' => 'Enot',
  2771. 'model_replacement' => '$2',
  2772. ],
  2773. [
  2774. 'regex' => '@; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)@',
  2775. 'device_replacement' => 'CROSS $1',
  2776. 'brand_replacement' => 'Evercoss',
  2777. 'model_replacement' => 'Cross $1',
  2778. ],
  2779. [
  2780. 'regex' => '@; {0,2}(CROSS|Cross)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2781. 'device_replacement' => '$1 $2',
  2782. 'brand_replacement' => 'Evercoss',
  2783. 'model_replacement' => 'Cross $2',
  2784. ],
  2785. [
  2786. 'regex' => '@; {0,2}Explay[_ ](.{1,200}?)(?:[\\)]| Build)@',
  2787. 'device_replacement' => '$1',
  2788. 'brand_replacement' => 'Explay',
  2789. 'model_replacement' => '$1',
  2790. ],
  2791. [
  2792. 'regex' => '@; {0,2}(IQ.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2793. 'device_replacement' => '$1',
  2794. 'brand_replacement' => 'Fly',
  2795. 'model_replacement' => '$1',
  2796. ],
  2797. [
  2798. 'regex' => '@; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\\d+[^;]{0,100}?);?(?: Build|\\) AppleWebKit)@',
  2799. 'device_replacement' => '$1 $2',
  2800. 'brand_replacement' => 'Fly',
  2801. 'model_replacement' => '$2',
  2802. ],
  2803. [
  2804. 'regex' => '@; {0,2}(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)@',
  2805. 'device_replacement' => '$1',
  2806. 'brand_replacement' => 'Fujitsu',
  2807. 'model_replacement' => '$1',
  2808. ],
  2809. [
  2810. 'regex' => '@; {0,2}(G1)(?: Build|\\) AppleWebKit)@',
  2811. 'device_replacement' => '$1',
  2812. 'brand_replacement' => 'Galapad',
  2813. 'model_replacement' => '$1',
  2814. ],
  2815. [
  2816. 'regex' => '@; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2817. 'device_replacement' => '$1 $2',
  2818. 'brand_replacement' => '$1',
  2819. 'model_replacement' => '$2',
  2820. ],
  2821. [
  2822. 'regex' => '@; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2823. 'device_replacement' => '$1 $2',
  2824. 'brand_replacement' => 'Gfive',
  2825. 'model_replacement' => '$2',
  2826. ],
  2827. [
  2828. 'regex' => '@; {0,2}(Gionee)[ _\\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\\) AppleWebKit)@i',
  2829. 'device_replacement' => '$1 $2',
  2830. 'brand_replacement' => 'Gionee',
  2831. 'model_replacement' => '$2',
  2832. ],
  2833. [
  2834. 'regex' => '@; {0,2}(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)@',
  2835. 'device_replacement' => 'Gionee $1',
  2836. 'brand_replacement' => 'Gionee',
  2837. 'model_replacement' => '$1',
  2838. ],
  2839. [
  2840. 'regex' => '@; {0,2}(E3) Build/JOP40D@',
  2841. 'device_replacement' => 'Gionee $1',
  2842. 'brand_replacement' => 'Gionee',
  2843. 'model_replacement' => '$1',
  2844. ],
  2845. [
  2846. 'regex' => '@\\sGIONEE[-\\s_](\\w*)@i',
  2847. 'device_replacement' => 'Gionee $1',
  2848. 'brand_replacement' => 'Gionee',
  2849. 'model_replacement' => '$1',
  2850. ],
  2851. [
  2852. 'regex' => '@; {0,2}((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]{0,100}|PLAYTAB)(?: Build|\\) AppleWebKit)@',
  2853. 'device_replacement' => 'GoClever $1',
  2854. 'brand_replacement' => 'GoClever',
  2855. 'model_replacement' => '$1',
  2856. ],
  2857. [
  2858. 'regex' => '@; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2859. 'device_replacement' => 'GoClever $1',
  2860. 'brand_replacement' => 'GoClever',
  2861. 'model_replacement' => '$1',
  2862. ],
  2863. [
  2864. 'regex' => '@; {0,2}(Glass \\d+)(?: Build|\\) AppleWebKit)@',
  2865. 'device_replacement' => '$1',
  2866. 'brand_replacement' => 'Google',
  2867. 'model_replacement' => '$1',
  2868. ],
  2869. [
  2870. 'regex' => '@; {0,2}([g|G]oogle)? (Pixel[ a-zA-z0-9]{1,100});(?: Build|.{0,50}\\) AppleWebKit)@',
  2871. 'device_replacement' => '$2',
  2872. 'brand_replacement' => 'Google',
  2873. 'model_replacement' => '$2',
  2874. ],
  2875. [
  2876. 'regex' => '@; {0,2}([g|G]oogle)? (Pixel.{0,200}?)(?: Build|\\) AppleWebKit)@',
  2877. 'device_replacement' => '$2',
  2878. 'brand_replacement' => 'Google',
  2879. 'model_replacement' => '$2',
  2880. ],
  2881. [
  2882. 'regex' => '@; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\\) AppleWebKit)@',
  2883. 'device_replacement' => '$1 $2',
  2884. 'brand_replacement' => 'Gigabyte',
  2885. 'model_replacement' => '$1 $2',
  2886. ],
  2887. [
  2888. 'regex' => '@; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\\) AppleWebKit)@',
  2889. 'device_replacement' => 'Freescale $1',
  2890. 'brand_replacement' => 'Freescale',
  2891. 'model_replacement' => '$1',
  2892. ],
  2893. [
  2894. 'regex' => '@; {0,2}Haier[ _\\-]([^/]{1,50})(?: Build|\\) AppleWebKit)@',
  2895. 'device_replacement' => 'Haier $1',
  2896. 'brand_replacement' => 'Haier',
  2897. 'model_replacement' => '$1',
  2898. ],
  2899. [
  2900. 'regex' => '@; {0,2}(PAD1016)(?: Build|\\) AppleWebKit)@',
  2901. 'device_replacement' => 'Haipad $1',
  2902. 'brand_replacement' => 'Haipad',
  2903. 'model_replacement' => '$1',
  2904. ],
  2905. [
  2906. 'regex' => '@; {0,2}(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)@',
  2907. 'device_replacement' => 'Haipad $1',
  2908. 'brand_replacement' => 'Haipad',
  2909. 'model_replacement' => '$1',
  2910. ],
  2911. [
  2912. 'regex' => '@; {0,2}(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])@',
  2913. 'device_replacement' => 'Hannspree $1',
  2914. 'brand_replacement' => 'Hannspree',
  2915. 'model_replacement' => '$1',
  2916. ],
  2917. [
  2918. 'regex' => '@Build/HCL ME Tablet ([^;\\)]{1,3})[\\);]@',
  2919. 'device_replacement' => 'HCLme $1',
  2920. 'brand_replacement' => 'HCLme',
  2921. 'model_replacement' => '$1',
  2922. ],
  2923. [
  2924. 'regex' => '@; {0,2}([^;\\/]+) Build/HCL@',
  2925. 'device_replacement' => 'HCLme $1',
  2926. 'brand_replacement' => 'HCLme',
  2927. 'model_replacement' => '$1',
  2928. ],
  2929. [
  2930. 'regex' => '@; {0,2}(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)@',
  2931. 'device_replacement' => 'Hena $1',
  2932. 'brand_replacement' => 'Hena',
  2933. 'model_replacement' => '$1',
  2934. ],
  2935. [
  2936. 'regex' => '@; {0,2}(EG\\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  2937. 'device_replacement' => 'Hisense $1',
  2938. 'brand_replacement' => 'Hisense',
  2939. 'model_replacement' => '$1',
  2940. ],
  2941. [
  2942. 'regex' => '@; {0,2}(andromax[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  2943. 'device_replacement' => 'Hisense $1',
  2944. 'brand_replacement' => 'Hisense',
  2945. 'model_replacement' => '$1',
  2946. ],
  2947. [
  2948. 'regex' => '@; {0,2}(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)@',
  2949. 'device_replacement' => 'AMAZE $1$2',
  2950. 'brand_replacement' => 'hitech',
  2951. 'model_replacement' => 'AMAZE $1$2',
  2952. ],
  2953. [
  2954. 'regex' => '@; {0,2}(PlayBook)(?: Build|\\) AppleWebKit)@',
  2955. 'device_replacement' => 'HP $1',
  2956. 'brand_replacement' => 'HP',
  2957. 'model_replacement' => '$1',
  2958. ],
  2959. [
  2960. 'regex' => '@; {0,2}HP ([^/]{1,50})(?: Build|\\) AppleWebKit)@',
  2961. 'device_replacement' => 'HP $1',
  2962. 'brand_replacement' => 'HP',
  2963. 'model_replacement' => '$1',
  2964. ],
  2965. [
  2966. 'regex' => '@; {0,2}([^/]{1,30}_tenderloin)(?: Build|\\) AppleWebKit)@',
  2967. 'device_replacement' => 'HP TouchPad',
  2968. 'brand_replacement' => 'HP',
  2969. 'model_replacement' => 'TouchPad',
  2970. ],
  2971. [
  2972. 'regex' => '@; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)@',
  2973. 'device_replacement' => '$1$2',
  2974. 'brand_replacement' => 'Huawei',
  2975. 'model_replacement' => '$2',
  2976. ],
  2977. [
  2978. 'regex' => '@; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\\d+[^\\);]{1,50})\\)@',
  2979. 'device_replacement' => '$1',
  2980. 'brand_replacement' => 'Huawei',
  2981. 'model_replacement' => '$2',
  2982. ],
  2983. [
  2984. 'regex' => '@; {0,2}(S7|M860) Build@',
  2985. 'device_replacement' => '$1',
  2986. 'brand_replacement' => 'Huawei',
  2987. 'model_replacement' => '$1',
  2988. ],
  2989. [
  2990. 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build@',
  2991. 'device_replacement' => '$1$2',
  2992. 'brand_replacement' => 'Huawei',
  2993. 'model_replacement' => '$2',
  2994. ],
  2995. [
  2996. 'regex' => '@; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build@',
  2997. 'device_replacement' => '$1$2',
  2998. 'brand_replacement' => 'Huawei',
  2999. 'model_replacement' => '$2',
  3000. ],
  3001. [
  3002. 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]{1,100}) Build@',
  3003. 'device_replacement' => '$1$2',
  3004. 'brand_replacement' => 'Huawei',
  3005. 'model_replacement' => '$2',
  3006. ],
  3007. [
  3008. 'regex' => '@; {0,2}((?:HUAWEI|Huawei)[ _\\-]?)([^;/]{1,100}) Build@',
  3009. 'device_replacement' => '$1$2',
  3010. 'brand_replacement' => 'Huawei',
  3011. 'model_replacement' => '$2',
  3012. ],
  3013. [
  3014. 'regex' => '@; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei@',
  3015. 'device_replacement' => '$1',
  3016. 'brand_replacement' => 'Huawei',
  3017. 'model_replacement' => '$1',
  3018. ],
  3019. [
  3020. 'regex' => '@; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)@',
  3021. 'device_replacement' => '$1',
  3022. 'brand_replacement' => 'Huawei',
  3023. 'model_replacement' => '$1',
  3024. ],
  3025. [
  3026. 'regex' => '@; {0,2}([Uu])([89]\\d{3}) Build@',
  3027. 'device_replacement' => '$1$2',
  3028. 'brand_replacement' => 'Huawei',
  3029. 'model_replacement' => 'U$2',
  3030. ],
  3031. [
  3032. 'regex' => '@; {0,2}(?:Ideos |IDEOS )(S7) Build@',
  3033. 'device_replacement' => 'Huawei Ideos$1',
  3034. 'brand_replacement' => 'Huawei',
  3035. 'model_replacement' => 'Ideos$1',
  3036. ],
  3037. [
  3038. 'regex' => '@; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\\s{0,5}|\\s{0,5})Build@',
  3039. 'device_replacement' => 'Huawei Ideos$1',
  3040. 'brand_replacement' => 'Huawei',
  3041. 'model_replacement' => 'Ideos$1',
  3042. ],
  3043. [
  3044. 'regex' => '@; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]@',
  3045. 'device_replacement' => 'Huawei $1',
  3046. 'brand_replacement' => 'Huawei',
  3047. 'model_replacement' => '$1',
  3048. ],
  3049. [
  3050. 'regex' => '@; {0,2}((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]@',
  3051. 'device_replacement' => 'Huawei $1',
  3052. 'brand_replacement' => 'Huawei',
  3053. 'model_replacement' => '$1',
  3054. ],
  3055. [
  3056. 'regex' => '@; {0,2}([^;]{1,200}) Build/(HONOR|Honor)@',
  3057. 'device_replacement' => 'Huawei Honor $1',
  3058. 'brand_replacement' => 'Huawei',
  3059. 'model_replacement' => 'Honor $1',
  3060. ],
  3061. [
  3062. 'regex' => '@; {0,2}HTC[ _]([^;]{1,200}); Windows Phone@',
  3063. 'device_replacement' => 'HTC $1',
  3064. 'brand_replacement' => 'HTC',
  3065. 'model_replacement' => '$1',
  3066. ],
  3067. [
  3068. 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@',
  3069. 'device_replacement' => 'HTC $1',
  3070. 'brand_replacement' => 'HTC',
  3071. 'model_replacement' => '$1',
  3072. ],
  3073. [
  3074. 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@',
  3075. 'device_replacement' => 'HTC $1 $2',
  3076. 'brand_replacement' => 'HTC',
  3077. 'model_replacement' => '$1 $2',
  3078. ],
  3079. [
  3080. 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@',
  3081. 'device_replacement' => 'HTC $1 $2 $3',
  3082. 'brand_replacement' => 'HTC',
  3083. 'model_replacement' => '$1 $2 $3',
  3084. ],
  3085. [
  3086. 'regex' => '@; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: {0,2}Build|\\))@',
  3087. 'device_replacement' => 'HTC $1 $2 $3 $4',
  3088. 'brand_replacement' => 'HTC',
  3089. 'model_replacement' => '$1 $2 $3 $4',
  3090. ],
  3091. [
  3092. 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\\)]| - )@',
  3093. 'device_replacement' => 'HTC $1',
  3094. 'brand_replacement' => 'HTC',
  3095. 'model_replacement' => '$1',
  3096. ],
  3097. [
  3098. 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: {0,2}Build|[;\\)]| - )@',
  3099. 'device_replacement' => 'HTC $1 $2',
  3100. 'brand_replacement' => 'HTC',
  3101. 'model_replacement' => '$1 $2',
  3102. ],
  3103. [
  3104. 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: {0,2}Build|[;\\)]| - )@',
  3105. 'device_replacement' => 'HTC $1 $2 $3',
  3106. 'brand_replacement' => 'HTC',
  3107. 'model_replacement' => '$1 $2 $3',
  3108. ],
  3109. [
  3110. 'regex' => '@; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\\)]| - )@',
  3111. 'device_replacement' => 'HTC $1 $2 $3 $4',
  3112. 'brand_replacement' => 'HTC',
  3113. 'model_replacement' => '$1 $2 $3 $4',
  3114. ],
  3115. [
  3116. 'regex' => '@HTC Streaming Player [^\\/]{0,30}/[^\\/]{0,10}/ htc_([^/]{1,10}) /@',
  3117. 'device_replacement' => 'HTC $1',
  3118. 'brand_replacement' => 'HTC',
  3119. 'model_replacement' => '$1',
  3120. ],
  3121. [
  3122. 'regex' => '@(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)@i',
  3123. 'device_replacement' => 'HTC $1',
  3124. 'brand_replacement' => 'HTC',
  3125. 'model_replacement' => '$1',
  3126. ],
  3127. [
  3128. 'regex' => '@; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])@i',
  3129. 'device_replacement' => 'HTC $1',
  3130. 'brand_replacement' => 'HTC',
  3131. 'model_replacement' => '$1',
  3132. ],
  3133. [
  3134. 'regex' => '@; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\\)]|Build|MIUI|1\\.0)@i',
  3135. 'device_replacement' => 'HTC $1 $2',
  3136. 'brand_replacement' => 'HTC',
  3137. 'model_replacement' => '$1 $2',
  3138. ],
  3139. [
  3140. 'regex' => '@; {0,2}HYUNDAI (T\\d[^/]{0,10})(?: Build|\\) AppleWebKit)@',
  3141. 'device_replacement' => 'Hyundai $1',
  3142. 'brand_replacement' => 'Hyundai',
  3143. 'model_replacement' => '$1',
  3144. ],
  3145. [
  3146. 'regex' => '@; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\\) AppleWebKit)@',
  3147. 'device_replacement' => 'Hyundai $1',
  3148. 'brand_replacement' => 'Hyundai',
  3149. 'model_replacement' => '$1',
  3150. ],
  3151. [
  3152. 'regex' => '@; {0,2}(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)@',
  3153. 'device_replacement' => 'Hyundai $1',
  3154. 'brand_replacement' => 'Hyundai',
  3155. 'model_replacement' => '$1',
  3156. ],
  3157. [
  3158. 'regex' => '@; {0,2}(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)@i',
  3159. 'device_replacement' => '$1 $2',
  3160. 'brand_replacement' => 'iBall',
  3161. 'model_replacement' => '$1 $2',
  3162. ],
  3163. [
  3164. 'regex' => '@; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\\) AppleWebKit)@i',
  3165. 'device_replacement' => '$1 $2',
  3166. 'brand_replacement' => 'iBall',
  3167. 'model_replacement' => '$2',
  3168. ],
  3169. [
  3170. 'regex' => '@; {0,2}(NT-\\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\\) AppleWebKit)@',
  3171. 'device_replacement' => '$1',
  3172. 'brand_replacement' => 'IconBIT',
  3173. 'model_replacement' => '$1',
  3174. ],
  3175. [
  3176. 'regex' => '@; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3177. 'device_replacement' => '$1 $2',
  3178. 'brand_replacement' => 'IMO',
  3179. 'model_replacement' => '$2',
  3180. ],
  3181. [
  3182. 'regex' => '@; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\\) AppleWebKit)@i',
  3183. 'device_replacement' => 'i-mobile $1',
  3184. 'brand_replacement' => 'imobile',
  3185. 'model_replacement' => '$1',
  3186. ],
  3187. [
  3188. 'regex' => '@; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\\) AppleWebKit)@i',
  3189. 'device_replacement' => 'i-mobile $1',
  3190. 'brand_replacement' => 'imobile',
  3191. 'model_replacement' => '$1',
  3192. ],
  3193. [
  3194. 'regex' => '@; {0,2}(ImPAD) ?(\\d+(?:.){0,100}?)(?: Build|\\) AppleWebKit)@',
  3195. 'device_replacement' => '$1 $2',
  3196. 'brand_replacement' => 'Impression',
  3197. 'model_replacement' => '$1 $2',
  3198. ],
  3199. [
  3200. 'regex' => '@; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3201. 'device_replacement' => '$1 $2',
  3202. 'brand_replacement' => 'Infinix',
  3203. 'model_replacement' => '$2',
  3204. ],
  3205. [
  3206. 'regex' => '@; {0,2}(Informer)[ \\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3207. 'device_replacement' => '$1 $2',
  3208. 'brand_replacement' => 'Informer',
  3209. 'model_replacement' => '$2',
  3210. ],
  3211. [
  3212. 'regex' => '@; {0,2}(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)@',
  3213. 'device_replacement' => 'Intenso $1',
  3214. 'brand_replacement' => 'Intenso',
  3215. 'model_replacement' => '$1 $2',
  3216. ],
  3217. [
  3218. 'regex' => '@; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]{1,100}?) {0,2}(?:Build|;)@',
  3219. 'device_replacement' => '$1$2$3',
  3220. 'brand_replacement' => 'Intex',
  3221. 'model_replacement' => '$1 $3',
  3222. ],
  3223. [
  3224. 'regex' => '@; {0,2}(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) {0,2}(?:Build|;)@',
  3225. 'device_replacement' => '$1 $2',
  3226. 'brand_replacement' => 'Intex',
  3227. 'model_replacement' => '$1 $2',
  3228. ],
  3229. [
  3230. 'regex' => '@; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)@',
  3231. 'device_replacement' => '$1 $2 $3',
  3232. 'brand_replacement' => 'Intex',
  3233. 'model_replacement' => 'iBuddy $2 $3',
  3234. ],
  3235. [
  3236. 'regex' => '@; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)@',
  3237. 'device_replacement' => '$1 $2',
  3238. 'brand_replacement' => 'Intex',
  3239. 'model_replacement' => 'iBuddy $2',
  3240. ],
  3241. [
  3242. 'regex' => '@; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\\) AppleWebKit)@i',
  3243. 'device_replacement' => '$1 $2',
  3244. 'brand_replacement' => 'iOCEAN',
  3245. 'model_replacement' => '$2',
  3246. ],
  3247. [
  3248. 'regex' => '@; {0,2}(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3249. 'device_replacement' => 'ionik $1',
  3250. 'brand_replacement' => 'ionik',
  3251. 'model_replacement' => '$1',
  3252. ],
  3253. [
  3254. 'regex' => '@; {0,2}(M702pro)(?: Build|\\) AppleWebKit)@',
  3255. 'device_replacement' => '$1',
  3256. 'brand_replacement' => 'Iru',
  3257. 'model_replacement' => '$1',
  3258. ],
  3259. [
  3260. 'regex' => '@; {0,2}itel ([^;/]*)(?: Build|\\) AppleWebKit)@',
  3261. 'device_replacement' => 'Itel $1',
  3262. 'brand_replacement' => 'Itel',
  3263. 'model_replacement' => '$1',
  3264. ],
  3265. [
  3266. 'regex' => '@; {0,2}(DE88Plus|MD70)(?: Build|\\) AppleWebKit)@',
  3267. 'device_replacement' => '$1',
  3268. 'brand_replacement' => 'Ivio',
  3269. 'model_replacement' => '$1',
  3270. ],
  3271. [
  3272. 'regex' => '@; {0,2}IVIO[_\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3273. 'device_replacement' => '$1',
  3274. 'brand_replacement' => 'Ivio',
  3275. 'model_replacement' => '$1',
  3276. ],
  3277. [
  3278. 'regex' => '@; {0,2}(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)@',
  3279. 'device_replacement' => '$1',
  3280. 'brand_replacement' => 'Jaytech',
  3281. 'model_replacement' => '$1',
  3282. ],
  3283. [
  3284. 'regex' => '@; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\\) AppleWebKit)@',
  3285. 'device_replacement' => '$1',
  3286. 'brand_replacement' => 'Jiayu',
  3287. 'model_replacement' => '$1',
  3288. ],
  3289. [
  3290. 'regex' => '@; {0,2}(JXD)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3291. 'device_replacement' => '$1 $2',
  3292. 'brand_replacement' => 'JXD',
  3293. 'model_replacement' => '$2',
  3294. ],
  3295. [
  3296. 'regex' => '@; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)@i',
  3297. 'device_replacement' => '$1',
  3298. 'brand_replacement' => 'Karbonn',
  3299. 'model_replacement' => '$1',
  3300. ],
  3301. [
  3302. 'regex' => '@; {0,2}([^;]{1,200}) Build/Karbonn@',
  3303. 'device_replacement' => '$1',
  3304. 'brand_replacement' => 'Karbonn',
  3305. 'model_replacement' => '$1',
  3306. ],
  3307. [
  3308. 'regex' => '@; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build@',
  3309. 'device_replacement' => '$1',
  3310. 'brand_replacement' => 'Karbonn',
  3311. 'model_replacement' => '$1',
  3312. ],
  3313. [
  3314. 'regex' => '@; {0,2}(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)@',
  3315. 'device_replacement' => '$1',
  3316. 'brand_replacement' => 'Sharp',
  3317. 'model_replacement' => '$1',
  3318. ],
  3319. [
  3320. 'regex' => '@; {0,2}(IS04)(?: Build|\\) AppleWebKit)@',
  3321. 'device_replacement' => '$1',
  3322. 'brand_replacement' => 'Regza',
  3323. 'model_replacement' => '$1',
  3324. ],
  3325. [
  3326. 'regex' => '@; {0,2}(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)@',
  3327. 'device_replacement' => '$1',
  3328. 'brand_replacement' => 'Pantech',
  3329. 'model_replacement' => '$1',
  3330. ],
  3331. [
  3332. 'regex' => '@; {0,2}(IS11S)(?: Build|\\) AppleWebKit)@',
  3333. 'device_replacement' => '$1',
  3334. 'brand_replacement' => 'SonyEricsson',
  3335. 'model_replacement' => 'Xperia Acro',
  3336. ],
  3337. [
  3338. 'regex' => '@; {0,2}(IS11CA)(?: Build|\\) AppleWebKit)@',
  3339. 'device_replacement' => '$1',
  3340. 'brand_replacement' => 'Casio',
  3341. 'model_replacement' => 'GzOne $1',
  3342. ],
  3343. [
  3344. 'regex' => '@; {0,2}(IS11LG)(?: Build|\\) AppleWebKit)@',
  3345. 'device_replacement' => '$1',
  3346. 'brand_replacement' => 'LG',
  3347. 'model_replacement' => 'Optimus X',
  3348. ],
  3349. [
  3350. 'regex' => '@; {0,2}(IS11N)(?: Build|\\) AppleWebKit)@',
  3351. 'device_replacement' => '$1',
  3352. 'brand_replacement' => 'Medias',
  3353. 'model_replacement' => '$1',
  3354. ],
  3355. [
  3356. 'regex' => '@; {0,2}(IS11PT)(?: Build|\\) AppleWebKit)@',
  3357. 'device_replacement' => '$1',
  3358. 'brand_replacement' => 'Pantech',
  3359. 'model_replacement' => 'MIRACH',
  3360. ],
  3361. [
  3362. 'regex' => '@; {0,2}(IS12F)(?: Build|\\) AppleWebKit)@',
  3363. 'device_replacement' => '$1',
  3364. 'brand_replacement' => 'Fujitsu',
  3365. 'model_replacement' => 'Arrows ES',
  3366. ],
  3367. [
  3368. 'regex' => '@; {0,2}(IS12M)(?: Build|\\) AppleWebKit)@',
  3369. 'device_replacement' => '$1',
  3370. 'brand_replacement' => 'Motorola',
  3371. 'model_replacement' => 'XT909',
  3372. ],
  3373. [
  3374. 'regex' => '@; {0,2}(IS12S)(?: Build|\\) AppleWebKit)@',
  3375. 'device_replacement' => '$1',
  3376. 'brand_replacement' => 'SonyEricsson',
  3377. 'model_replacement' => 'Xperia Acro HD',
  3378. ],
  3379. [
  3380. 'regex' => '@; {0,2}(ISW11F)(?: Build|\\) AppleWebKit)@',
  3381. 'device_replacement' => '$1',
  3382. 'brand_replacement' => 'Fujitsu',
  3383. 'model_replacement' => 'Arrowz Z',
  3384. ],
  3385. [
  3386. 'regex' => '@; {0,2}(ISW11HT)(?: Build|\\) AppleWebKit)@',
  3387. 'device_replacement' => '$1',
  3388. 'brand_replacement' => 'HTC',
  3389. 'model_replacement' => 'EVO',
  3390. ],
  3391. [
  3392. 'regex' => '@; {0,2}(ISW11K)(?: Build|\\) AppleWebKit)@',
  3393. 'device_replacement' => '$1',
  3394. 'brand_replacement' => 'Kyocera',
  3395. 'model_replacement' => 'DIGNO',
  3396. ],
  3397. [
  3398. 'regex' => '@; {0,2}(ISW11M)(?: Build|\\) AppleWebKit)@',
  3399. 'device_replacement' => '$1',
  3400. 'brand_replacement' => 'Motorola',
  3401. 'model_replacement' => 'Photon',
  3402. ],
  3403. [
  3404. 'regex' => '@; {0,2}(ISW11SC)(?: Build|\\) AppleWebKit)@',
  3405. 'device_replacement' => '$1',
  3406. 'brand_replacement' => 'Samsung',
  3407. 'model_replacement' => 'GALAXY S II WiMAX',
  3408. ],
  3409. [
  3410. 'regex' => '@; {0,2}(ISW12HT)(?: Build|\\) AppleWebKit)@',
  3411. 'device_replacement' => '$1',
  3412. 'brand_replacement' => 'HTC',
  3413. 'model_replacement' => 'EVO 3D',
  3414. ],
  3415. [
  3416. 'regex' => '@; {0,2}(ISW13HT)(?: Build|\\) AppleWebKit)@',
  3417. 'device_replacement' => '$1',
  3418. 'brand_replacement' => 'HTC',
  3419. 'model_replacement' => 'J',
  3420. ],
  3421. [
  3422. 'regex' => '@; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)@',
  3423. 'device_replacement' => '$1',
  3424. 'brand_replacement' => 'KDDI',
  3425. 'model_replacement' => '$1',
  3426. ],
  3427. [
  3428. 'regex' => '@; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3429. 'device_replacement' => '$1',
  3430. 'brand_replacement' => 'KDDI',
  3431. 'model_replacement' => '$1',
  3432. ],
  3433. [
  3434. 'regex' => '@; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3435. 'device_replacement' => '$1 $2',
  3436. 'brand_replacement' => 'Kingcom',
  3437. 'model_replacement' => '$1 $2',
  3438. ],
  3439. [
  3440. 'regex' => '@; {0,2}(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)@i',
  3441. 'device_replacement' => '$1',
  3442. 'brand_replacement' => 'Kobo',
  3443. 'model_replacement' => '$1',
  3444. ],
  3445. [
  3446. 'regex' => '@\\b(Kobo Touch)\\b@',
  3447. 'device_replacement' => '$1',
  3448. 'brand_replacement' => 'Kobo',
  3449. 'model_replacement' => '$1',
  3450. ],
  3451. [
  3452. 'regex' => '@; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3453. 'device_replacement' => '$1 $2',
  3454. 'brand_replacement' => 'Ktouch',
  3455. 'model_replacement' => '$2',
  3456. ],
  3457. [
  3458. 'regex' => '@; {0,2}((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)@i',
  3459. 'device_replacement' => '$1',
  3460. 'brand_replacement' => 'KTtech',
  3461. 'model_replacement' => '$1',
  3462. ],
  3463. [
  3464. 'regex' => '@; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)@',
  3465. 'device_replacement' => '$1',
  3466. 'brand_replacement' => 'Kyocera',
  3467. 'model_replacement' => '$1',
  3468. ],
  3469. [
  3470. 'regex' => '@; {0,2}(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) {0,2}(?:;|\\)|Build)@i',
  3471. 'device_replacement' => 'Iris $1',
  3472. 'brand_replacement' => 'Lava',
  3473. 'model_replacement' => 'Iris $1',
  3474. ],
  3475. [
  3476. 'regex' => '@; {0,2}LAVA[ _]([^;/]{1,100}) Build@',
  3477. 'device_replacement' => '$1',
  3478. 'brand_replacement' => 'Lava',
  3479. 'model_replacement' => '$1',
  3480. ],
  3481. [
  3482. 'regex' => '@; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\\) AppleWebKit)@',
  3483. 'device_replacement' => 'Lemon $1$2',
  3484. 'brand_replacement' => 'Lemon',
  3485. 'model_replacement' => '$1$2',
  3486. ],
  3487. [
  3488. 'regex' => '@; {0,2}(TAB-1012)(?: Build|\\) AppleWebKit)@',
  3489. 'device_replacement' => 'Lenco $1',
  3490. 'brand_replacement' => 'Lenco',
  3491. 'model_replacement' => '$1',
  3492. ],
  3493. [
  3494. 'regex' => '@; Lenco ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3495. 'device_replacement' => 'Lenco $1',
  3496. 'brand_replacement' => 'Lenco',
  3497. 'model_replacement' => '$1',
  3498. ],
  3499. [
  3500. 'regex' => '@; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build@',
  3501. 'device_replacement' => '$1',
  3502. 'brand_replacement' => 'Lenovo',
  3503. 'model_replacement' => '$1',
  3504. ],
  3505. [
  3506. 'regex' => '@; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build@',
  3507. 'device_replacement' => 'Lenovo $1 $2',
  3508. 'brand_replacement' => 'Lenovo',
  3509. 'model_replacement' => '$1 $2',
  3510. ],
  3511. [
  3512. 'regex' => '@; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build@',
  3513. 'device_replacement' => 'Lenovo $1 $2',
  3514. 'brand_replacement' => 'Lenovo',
  3515. 'model_replacement' => '$1 $2',
  3516. ],
  3517. [
  3518. 'regex' => '@; {0,2}(ThinkPad) ?(Tablet) Build/@',
  3519. 'device_replacement' => 'Lenovo $1 $2',
  3520. 'brand_replacement' => 'Lenovo',
  3521. 'model_replacement' => '$1 $2',
  3522. ],
  3523. [
  3524. 'regex' => '@; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\\)])@',
  3525. 'device_replacement' => 'Lenovo $1',
  3526. 'brand_replacement' => 'Lenovo',
  3527. 'model_replacement' => '$1',
  3528. ],
  3529. [
  3530. 'regex' => '@[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\\d+) Build/@',
  3531. 'device_replacement' => 'Lenovo $1 $2 $3',
  3532. 'brand_replacement' => 'Lenovo',
  3533. 'model_replacement' => '$1 $2 $3',
  3534. ],
  3535. [
  3536. 'regex' => '@; {0,2}(?:Ideapad |)K1 Build/@',
  3537. 'device_replacement' => 'Lenovo Ideapad K1',
  3538. 'brand_replacement' => 'Lenovo',
  3539. 'model_replacement' => 'Ideapad K1',
  3540. ],
  3541. [
  3542. 'regex' => '@; {0,2}(3GC101|3GW10[01]|A390) Build/@',
  3543. 'device_replacement' => '$1',
  3544. 'brand_replacement' => 'Lenovo',
  3545. 'model_replacement' => '$1',
  3546. ],
  3547. [
  3548. 'regex' => '@\\b(?:Lenovo|LENOVO)+[ _\\-]?([^,;:/ ]+)@',
  3549. 'device_replacement' => 'Lenovo $1',
  3550. 'brand_replacement' => 'Lenovo',
  3551. 'model_replacement' => '$1',
  3552. ],
  3553. [
  3554. 'regex' => '@; {0,2}(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)@',
  3555. 'device_replacement' => '$1$2',
  3556. 'brand_replacement' => 'Lexibook',
  3557. 'model_replacement' => '$1$2',
  3558. ],
  3559. [
  3560. 'regex' => '@; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)@',
  3561. 'device_replacement' => '$1',
  3562. 'brand_replacement' => 'LG',
  3563. 'model_replacement' => '$1',
  3564. ],
  3565. [
  3566. 'regex' => '@[;:] {0,2}(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) {0,2}(?:Build|[;\\)])@',
  3567. 'device_replacement' => '$1',
  3568. 'brand_replacement' => 'LG',
  3569. 'model_replacement' => '$1',
  3570. ],
  3571. [
  3572. 'regex' => '@; {0,2}(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)@',
  3573. 'device_replacement' => '$1$2',
  3574. 'brand_replacement' => 'LG',
  3575. 'model_replacement' => '$2',
  3576. ],
  3577. [
  3578. 'regex' => '@; {0,2}(LG[ \\-]|LG)([^;/]{1,100})[;/]? Build@',
  3579. 'device_replacement' => '$1$2',
  3580. 'brand_replacement' => 'LG',
  3581. 'model_replacement' => '$2',
  3582. ],
  3583. [
  3584. 'regex' => '@^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android@',
  3585. 'device_replacement' => '$1 $2',
  3586. 'brand_replacement' => 'LG',
  3587. 'model_replacement' => '$2',
  3588. ],
  3589. [
  3590. 'regex' => '@(Web0S); Linux/(SmartTV)@',
  3591. 'device_replacement' => 'LG $1 $2',
  3592. 'brand_replacement' => 'LG',
  3593. 'model_replacement' => '$1 $2',
  3594. ],
  3595. [
  3596. 'regex' => '@; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3597. 'device_replacement' => '$1',
  3598. 'brand_replacement' => 'Malata',
  3599. 'model_replacement' => '$1',
  3600. ],
  3601. [
  3602. 'regex' => '@; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3603. 'device_replacement' => '$1',
  3604. 'brand_replacement' => 'Malata',
  3605. 'model_replacement' => '$1',
  3606. ],
  3607. [
  3608. 'regex' => '@; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)@',
  3609. 'device_replacement' => '$1',
  3610. 'brand_replacement' => 'Manta',
  3611. 'model_replacement' => '$1',
  3612. ],
  3613. [
  3614. 'regex' => '@; {0,2}(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)@',
  3615. 'device_replacement' => '$1',
  3616. 'brand_replacement' => 'Match',
  3617. 'model_replacement' => '$1',
  3618. ],
  3619. [
  3620. 'regex' => '@; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\\d.{0,200}?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)@',
  3621. 'device_replacement' => 'Maxx $1',
  3622. 'brand_replacement' => 'Maxx',
  3623. 'model_replacement' => '$1',
  3624. ],
  3625. [
  3626. 'regex' => '@; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\\d{2,}[^;/]{1,30}?)(?: Build|\\) AppleWebKit)@',
  3627. 'device_replacement' => 'Mediacom $1',
  3628. 'brand_replacement' => 'Mediacom',
  3629. 'model_replacement' => '$1',
  3630. ],
  3631. [
  3632. 'regex' => '@; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\\d{2,}[^;/]{1,30}?)(?: Build|\\) AppleWebKit)@',
  3633. 'device_replacement' => 'Mediacom $1',
  3634. 'brand_replacement' => 'Mediacom',
  3635. 'model_replacement' => '$1',
  3636. ],
  3637. [
  3638. 'regex' => '@; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3639. 'device_replacement' => 'Medion Lifetab $1',
  3640. 'brand_replacement' => 'Medion',
  3641. 'model_replacement' => 'Lifetab $1',
  3642. ],
  3643. [
  3644. 'regex' => '@; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3645. 'device_replacement' => 'Medion $1',
  3646. 'brand_replacement' => 'Medion',
  3647. 'model_replacement' => '$1',
  3648. ],
  3649. [
  3650. 'regex' => '@; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)@',
  3651. 'device_replacement' => 'Meizu $1',
  3652. 'brand_replacement' => 'Meizu',
  3653. 'model_replacement' => '$1',
  3654. ],
  3655. [
  3656. 'regex' => '@; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\\)])@',
  3657. 'device_replacement' => 'Meizu $1',
  3658. 'brand_replacement' => 'Meizu',
  3659. 'model_replacement' => '$1',
  3660. ],
  3661. [
  3662. 'regex' => '@Quest 3@',
  3663. 'device_replacement' => 'Quest',
  3664. 'brand_replacement' => 'Meta',
  3665. 'model_replacement' => 'Quest 3',
  3666. ],
  3667. [
  3668. 'regex' => '@Quest 2@',
  3669. 'device_replacement' => 'Quest',
  3670. 'brand_replacement' => 'Meta',
  3671. 'model_replacement' => 'Quest 2',
  3672. ],
  3673. [
  3674. 'regex' => '@Quest Pro@',
  3675. 'device_replacement' => 'Quest',
  3676. 'brand_replacement' => 'Meta',
  3677. 'model_replacement' => 'Quest Pro',
  3678. ],
  3679. [
  3680. 'regex' => '@Quest@',
  3681. 'device_replacement' => 'Quest',
  3682. 'brand_replacement' => 'Meta',
  3683. 'model_replacement' => 'Quest',
  3684. ],
  3685. [
  3686. 'regex' => '@; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build@i',
  3687. 'device_replacement' => 'Micromax $1$2',
  3688. 'brand_replacement' => 'Micromax',
  3689. 'model_replacement' => '$1$2',
  3690. ],
  3691. [
  3692. 'regex' => '@; {0,2}Micromax[ _](A\\d{2,3}[^;/]*) Build@i',
  3693. 'device_replacement' => 'Micromax $1',
  3694. 'brand_replacement' => 'Micromax',
  3695. 'model_replacement' => '$1',
  3696. ],
  3697. [
  3698. 'regex' => '@; {0,2}(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build@i',
  3699. 'device_replacement' => 'Micromax $1',
  3700. 'brand_replacement' => 'Micromax',
  3701. 'model_replacement' => '$1',
  3702. ],
  3703. [
  3704. 'regex' => '@; {0,2}Micromax[ _](P\\d{3}[^;/]*) Build@i',
  3705. 'device_replacement' => 'Micromax $1',
  3706. 'brand_replacement' => 'Micromax',
  3707. 'model_replacement' => '$1',
  3708. ],
  3709. [
  3710. 'regex' => '@; {0,2}(P\\d{3}|P\\d{3}\\(Funbook\\)) Build@i',
  3711. 'device_replacement' => 'Micromax $1',
  3712. 'brand_replacement' => 'Micromax',
  3713. 'model_replacement' => '$1',
  3714. ],
  3715. [
  3716. 'regex' => '@; {0,2}(MITO)[ _\\-]?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3717. 'device_replacement' => '$1 $2',
  3718. 'brand_replacement' => 'Mito',
  3719. 'model_replacement' => '$2',
  3720. ],
  3721. [
  3722. 'regex' => '@; {0,2}(Cynus)[ _](F5|T\\d|.{1,200}?) {0,2}(?:Build|[;/\\)])@i',
  3723. 'device_replacement' => '$1 $2',
  3724. 'brand_replacement' => 'Mobistel',
  3725. 'model_replacement' => '$1 $2',
  3726. ],
  3727. [
  3728. 'regex' => '@; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3729. 'device_replacement' => '$1$2 $3',
  3730. 'brand_replacement' => 'Modecom',
  3731. 'model_replacement' => '$2 $3',
  3732. ],
  3733. [
  3734. 'regex' => '@; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3735. 'device_replacement' => '$1 $2',
  3736. 'brand_replacement' => 'Modecom',
  3737. 'model_replacement' => '$2',
  3738. ],
  3739. [
  3740. 'regex' => '@; {0,2}(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build@',
  3741. 'device_replacement' => 'Motorola $1',
  3742. 'brand_replacement' => 'Motorola',
  3743. 'model_replacement' => '$1',
  3744. ],
  3745. [
  3746. 'regex' => '@; {0,2}(Milestone )(XT[^;/]*) Build@',
  3747. 'device_replacement' => 'Motorola $1$2',
  3748. 'brand_replacement' => 'Motorola',
  3749. 'model_replacement' => '$2',
  3750. ],
  3751. [
  3752. 'regex' => '@; {0,2}(Motoroi ?x|Droid X|DROIDX) Build@i',
  3753. 'device_replacement' => 'Motorola $1',
  3754. 'brand_replacement' => 'Motorola',
  3755. 'model_replacement' => 'DROID X',
  3756. ],
  3757. [
  3758. 'regex' => '@; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build@',
  3759. 'device_replacement' => 'Motorola $1',
  3760. 'brand_replacement' => 'Motorola',
  3761. 'model_replacement' => '$1',
  3762. ],
  3763. [
  3764. 'regex' => '@; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build@',
  3765. 'device_replacement' => '$1',
  3766. 'brand_replacement' => 'Motorola',
  3767. 'model_replacement' => '$1',
  3768. ],
  3769. [
  3770. 'regex' => '@; {0,2}(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]{1,100}) Build@',
  3771. 'device_replacement' => '$1$2',
  3772. 'brand_replacement' => 'Motorola',
  3773. 'model_replacement' => '$2',
  3774. ],
  3775. [
  3776. 'regex' => '@; {0,2}(Moto[_ ]?|MOT\\-)([^;/]{1,100}) Build@',
  3777. 'device_replacement' => '$1$2',
  3778. 'brand_replacement' => 'Motorola',
  3779. 'model_replacement' => '$2',
  3780. ],
  3781. [
  3782. 'regex' => '@; {0,2}((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)@',
  3783. 'device_replacement' => '$1',
  3784. 'brand_replacement' => 'Mpman',
  3785. 'model_replacement' => '$1',
  3786. ],
  3787. [
  3788. 'regex' => '@; {0,2}(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  3789. 'device_replacement' => '$1',
  3790. 'brand_replacement' => 'Msi',
  3791. 'model_replacement' => '$1',
  3792. ],
  3793. [
  3794. 'regex' => '@; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3795. 'device_replacement' => '$1',
  3796. 'brand_replacement' => 'Multilaser',
  3797. 'model_replacement' => '$1',
  3798. ],
  3799. [
  3800. 'regex' => '@; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3801. 'device_replacement' => '$1$2 $3',
  3802. 'brand_replacement' => 'MyPhone',
  3803. 'model_replacement' => '$1$2 $3',
  3804. ],
  3805. [
  3806. 'regex' => '@; {0,2}(My)\\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3807. 'device_replacement' => '$1$2 $3',
  3808. 'brand_replacement' => 'MyPhone',
  3809. 'model_replacement' => '$3',
  3810. ],
  3811. [
  3812. 'regex' => '@; {0,2}(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)@i',
  3813. 'device_replacement' => '$1 $2',
  3814. 'brand_replacement' => 'MyPhone',
  3815. 'model_replacement' => '$1 $2',
  3816. ],
  3817. [
  3818. 'regex' => '@; {0,2}(myTab[^;/]*)(?: Build|\\) AppleWebKit)@',
  3819. 'device_replacement' => '$1',
  3820. 'brand_replacement' => 'Mytab',
  3821. 'model_replacement' => '$1',
  3822. ],
  3823. [
  3824. 'regex' => '@; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3825. 'device_replacement' => '$1$2',
  3826. 'brand_replacement' => 'Nabi',
  3827. 'model_replacement' => '$2',
  3828. ],
  3829. [
  3830. 'regex' => '@; {0,2}(N-\\d+[CDE])(?: Build|\\) AppleWebKit)@',
  3831. 'device_replacement' => '$1',
  3832. 'brand_replacement' => 'Nec',
  3833. 'model_replacement' => '$1',
  3834. ],
  3835. [
  3836. 'regex' => '@; ?(NEC-)(.{0,200}?)(?: Build|\\) AppleWebKit)@',
  3837. 'device_replacement' => '$1$2',
  3838. 'brand_replacement' => 'Nec',
  3839. 'model_replacement' => '$2',
  3840. ],
  3841. [
  3842. 'regex' => '@; {0,2}(LT-NA7)(?: Build|\\) AppleWebKit)@',
  3843. 'device_replacement' => '$1',
  3844. 'brand_replacement' => 'Nec',
  3845. 'model_replacement' => 'Lifetouch Note',
  3846. ],
  3847. [
  3848. 'regex' => '@; {0,2}(NXM\\d+[A-Za-z0-9_]{0,50}|Next\\d[A-Za-z0-9_ \\-]{0,50}|NEXT\\d[A-Za-z0-9_ \\-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\\);])@',
  3849. 'device_replacement' => '$1',
  3850. 'brand_replacement' => 'Nextbook',
  3851. 'model_replacement' => '$1',
  3852. ],
  3853. [
  3854. 'regex' => '@; {0,2}(Nokia)([ _\\-]{0,5})([^;/]{0,50}) Build@i',
  3855. 'device_replacement' => '$1$2$3',
  3856. 'brand_replacement' => 'Nokia',
  3857. 'model_replacement' => '$3',
  3858. ],
  3859. [
  3860. 'regex' => '@; {0,2}(TA\\-\\d{4})(?: Build|\\) AppleWebKit)@',
  3861. 'device_replacement' => 'Nokia $1',
  3862. 'brand_replacement' => 'Nokia',
  3863. 'model_replacement' => '$1',
  3864. ],
  3865. [
  3866. 'regex' => '@; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3867. 'device_replacement' => '$1$2',
  3868. 'brand_replacement' => 'Nook',
  3869. 'model_replacement' => '$2',
  3870. ],
  3871. [
  3872. 'regex' => '@; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)@',
  3873. 'device_replacement' => '$1$2',
  3874. 'brand_replacement' => 'Nook',
  3875. 'model_replacement' => '$2',
  3876. ],
  3877. [
  3878. 'regex' => '@; Build/(Nook)@',
  3879. 'device_replacement' => '$1',
  3880. 'brand_replacement' => 'Nook',
  3881. 'model_replacement' => 'Tablet',
  3882. ],
  3883. [
  3884. 'regex' => '@; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3885. 'device_replacement' => 'Olivetti $1',
  3886. 'brand_replacement' => 'Olivetti',
  3887. 'model_replacement' => '$1',
  3888. ],
  3889. [
  3890. 'regex' => '@; {0,2}OMEGA[ _\\-](MID[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3891. 'device_replacement' => 'Omega $1',
  3892. 'brand_replacement' => 'Omega',
  3893. 'model_replacement' => '$1',
  3894. ],
  3895. [
  3896. 'regex' => '@^(MID7500|MID\\d+) Mozilla/5\\.0 \\(iPad;@',
  3897. 'device_replacement' => 'Omega $1',
  3898. 'brand_replacement' => 'Omega',
  3899. 'model_replacement' => '$1',
  3900. ],
  3901. [
  3902. 'regex' => '@; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)@',
  3903. 'device_replacement' => 'Openpeak $1',
  3904. 'brand_replacement' => 'Openpeak',
  3905. 'model_replacement' => '$1',
  3906. ],
  3907. [
  3908. 'regex' => '@; {0,2}(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2}|[AFR]\\d{1,2}[a-z]{1,2})(?: Build|\\) AppleWebKit)@',
  3909. 'device_replacement' => 'Oppo $1',
  3910. 'brand_replacement' => 'Oppo',
  3911. 'model_replacement' => '$1',
  3912. ],
  3913. [
  3914. 'regex' => '@; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3915. 'device_replacement' => 'Oppo $1',
  3916. 'brand_replacement' => 'Oppo',
  3917. 'model_replacement' => '$1',
  3918. ],
  3919. [
  3920. 'regex' => '@; {0,2}(CPH\\d{1,4}|RMX\\d{1,4}|P[A-Z]{3}\\d{2})(?: Build|\\) AppleWebKit)@',
  3921. 'device_replacement' => 'Oppo $1',
  3922. 'brand_replacement' => 'Oppo',
  3923. ],
  3924. [
  3925. 'regex' => '@; {0,2}(A1601)(?: Build|\\) AppleWebKit)@',
  3926. 'device_replacement' => 'Oppo F1s',
  3927. 'brand_replacement' => 'Oppo',
  3928. 'model_replacement' => '$1',
  3929. ],
  3930. [
  3931. 'regex' => '@; {0,2}(?:Odys\\-|ODYS\\-|ODYS )([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3932. 'device_replacement' => 'Odys $1',
  3933. 'brand_replacement' => 'Odys',
  3934. 'model_replacement' => '$1',
  3935. ],
  3936. [
  3937. 'regex' => '@; {0,2}(SELECT) ?(7)(?: Build|\\) AppleWebKit)@',
  3938. 'device_replacement' => 'Odys $1 $2',
  3939. 'brand_replacement' => 'Odys',
  3940. 'model_replacement' => '$1 $2',
  3941. ],
  3942. [
  3943. 'regex' => '@; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)@',
  3944. 'device_replacement' => 'Odys $1 $2 $3',
  3945. 'brand_replacement' => 'Odys',
  3946. 'model_replacement' => '$1 $2 $3',
  3947. ],
  3948. [
  3949. 'regex' => '@; {0,2}(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)@',
  3950. 'device_replacement' => 'Odys $1',
  3951. 'brand_replacement' => 'Odys',
  3952. 'model_replacement' => '$1',
  3953. ],
  3954. [
  3955. 'regex' => '@; (ONE [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)@',
  3956. 'device_replacement' => 'OnePlus $1',
  3957. 'brand_replacement' => 'OnePlus',
  3958. 'model_replacement' => '$1',
  3959. ],
  3960. [
  3961. 'regex' => '@; (ONEPLUS [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)@',
  3962. 'device_replacement' => 'OnePlus $1',
  3963. 'brand_replacement' => 'OnePlus',
  3964. 'model_replacement' => '$1',
  3965. ],
  3966. [
  3967. 'regex' => '@; {0,2}(HD1903|GM1917|IN2025|LE2115|LE2127|HD1907|BE2012|BE2025|BE2026|BE2028|BE2029|DE2117|DE2118|EB2101|GM1900|GM1910|GM1915|HD1905|HD1925|IN2015|IN2017|IN2019|KB2005|KB2007|LE2117|LE2125|BE2015|GM1903|HD1900|HD1901|HD1910|HD1913|IN2010|IN2013|IN2020|LE2111|LE2120|LE2121|LE2123|BE2011|IN2023|KB2003|LE2113|NE2215|DN2101)(?: Build|\\) AppleWebKit)@',
  3968. 'device_replacement' => 'OnePlus $1',
  3969. 'brand_replacement' => 'OnePlus',
  3970. 'model_replacement' => 'OnePlus $1',
  3971. ],
  3972. [
  3973. 'regex' => '@; (OnePlus[ a-zA-z0-9]{0,50});((?: Build|.{0,50}\\) AppleWebKit))@',
  3974. 'device_replacement' => '$1',
  3975. 'brand_replacement' => 'OnePlus',
  3976. 'model_replacement' => '$1',
  3977. ],
  3978. [
  3979. 'regex' => '@; (OnePlus[ a-zA-z0-9]{0,50})((?: Build|\\) AppleWebKit))@',
  3980. 'device_replacement' => '$1',
  3981. 'brand_replacement' => 'OnePlus',
  3982. 'model_replacement' => '$1',
  3983. ],
  3984. [
  3985. 'regex' => '@; {0,2}(TP-\\d+)(?: Build|\\) AppleWebKit)@',
  3986. 'device_replacement' => 'Orion $1',
  3987. 'brand_replacement' => 'Orion',
  3988. 'model_replacement' => '$1',
  3989. ],
  3990. [
  3991. 'regex' => '@; {0,2}(G100W?)(?: Build|\\) AppleWebKit)@',
  3992. 'device_replacement' => 'PackardBell $1',
  3993. 'brand_replacement' => 'PackardBell',
  3994. 'model_replacement' => '$1',
  3995. ],
  3996. [
  3997. 'regex' => '@; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  3998. 'device_replacement' => '$1 $2',
  3999. 'brand_replacement' => '$1',
  4000. 'model_replacement' => '$2',
  4001. ],
  4002. [
  4003. 'regex' => '@; {0,2}(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)@',
  4004. 'device_replacement' => 'Panasonic $1',
  4005. 'brand_replacement' => 'Panasonic',
  4006. 'model_replacement' => '$1',
  4007. ],
  4008. [
  4009. 'regex' => '@; {0,2}(dL1|DL1)(?: Build|\\) AppleWebKit)@',
  4010. 'device_replacement' => 'Panasonic $1',
  4011. 'brand_replacement' => 'Panasonic',
  4012. 'model_replacement' => '$1',
  4013. ],
  4014. [
  4015. 'regex' => '@; {0,2}(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]{1,100}).{0,30} Build/@',
  4016. 'device_replacement' => 'Pantech $1$2',
  4017. 'brand_replacement' => 'Pantech',
  4018. 'model_replacement' => '$1$2',
  4019. ],
  4020. [
  4021. 'regex' => '@; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/@',
  4022. 'device_replacement' => '$1',
  4023. 'brand_replacement' => 'Pantech',
  4024. 'model_replacement' => '$1',
  4025. ],
  4026. [
  4027. 'regex' => '@; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/@',
  4028. 'device_replacement' => 'Pantech $1',
  4029. 'brand_replacement' => 'Pantech',
  4030. 'model_replacement' => '$1',
  4031. ],
  4032. [
  4033. 'regex' => '@; {0,2}(papyre)[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  4034. 'device_replacement' => '$1 $2',
  4035. 'brand_replacement' => 'Papyre',
  4036. 'model_replacement' => '$2',
  4037. ],
  4038. [
  4039. 'regex' => '@; {0,2}(?:Touchlet )?(X10\\.[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4040. 'device_replacement' => 'Pearl $1',
  4041. 'brand_replacement' => 'Pearl',
  4042. 'model_replacement' => '$1',
  4043. ],
  4044. [
  4045. 'regex' => '@; PHICOMM (i800)(?: Build|\\) AppleWebKit)@',
  4046. 'device_replacement' => 'Phicomm $1',
  4047. 'brand_replacement' => 'Phicomm',
  4048. 'model_replacement' => '$1',
  4049. ],
  4050. [
  4051. 'regex' => '@; PHICOMM ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4052. 'device_replacement' => 'Phicomm $1',
  4053. 'brand_replacement' => 'Phicomm',
  4054. 'model_replacement' => '$1',
  4055. ],
  4056. [
  4057. 'regex' => '@; {0,2}(FWS\\d{3}[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4058. 'device_replacement' => 'Phicomm $1',
  4059. 'brand_replacement' => 'Phicomm',
  4060. 'model_replacement' => '$1',
  4061. ],
  4062. [
  4063. 'regex' => '@; {0,2}(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)@',
  4064. 'device_replacement' => '$1',
  4065. 'brand_replacement' => 'Philips',
  4066. 'model_replacement' => '$1',
  4067. ],
  4068. [
  4069. 'regex' => '@; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4070. 'device_replacement' => 'Philips $1',
  4071. 'brand_replacement' => 'Philips',
  4072. 'model_replacement' => '$1',
  4073. ],
  4074. [
  4075. 'regex' => '@Android 4\\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)@',
  4076. 'device_replacement' => 'Pipo $1$2',
  4077. 'brand_replacement' => 'Pipo',
  4078. 'model_replacement' => '$1$2',
  4079. ],
  4080. [
  4081. 'regex' => '@; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4082. 'device_replacement' => '$1',
  4083. 'brand_replacement' => 'Ployer',
  4084. 'model_replacement' => '$1',
  4085. ],
  4086. [
  4087. 'regex' => '@; {0,2}(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]{0,30}?)(\\/[^;/]{0,30}|)(?: Build|\\) AppleWebKit)@',
  4088. 'device_replacement' => '$1',
  4089. 'brand_replacement' => 'Polaroid',
  4090. 'model_replacement' => '$1',
  4091. ],
  4092. [
  4093. 'regex' => '@; {0,2}(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)@',
  4094. 'device_replacement' => '$1',
  4095. 'brand_replacement' => 'Polaroid',
  4096. 'model_replacement' => '$1',
  4097. ],
  4098. [
  4099. 'regex' => '@; {0,2}(POMP)[ _\\-](.{1,200}?) {0,2}(?:Build|[;/\\)])@',
  4100. 'device_replacement' => '$1 $2',
  4101. 'brand_replacement' => 'Pomp',
  4102. 'model_replacement' => '$2',
  4103. ],
  4104. [
  4105. 'regex' => '@; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)@',
  4106. 'device_replacement' => '$1',
  4107. 'brand_replacement' => 'Positivo',
  4108. 'model_replacement' => '$1',
  4109. ],
  4110. [
  4111. 'regex' => '@; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4112. 'device_replacement' => '$1',
  4113. 'brand_replacement' => 'Positivo',
  4114. 'model_replacement' => '$1',
  4115. ],
  4116. [
  4117. 'regex' => '@; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4118. 'device_replacement' => '$1',
  4119. 'brand_replacement' => 'POV',
  4120. 'model_replacement' => '$1',
  4121. ],
  4122. [
  4123. 'regex' => '@; {0,2}POV[ _\\-]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4124. 'device_replacement' => 'POV $1',
  4125. 'brand_replacement' => 'POV',
  4126. 'model_replacement' => '$1',
  4127. ],
  4128. [
  4129. 'regex' => '@; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)@',
  4130. 'device_replacement' => 'POV $1',
  4131. 'brand_replacement' => 'POV',
  4132. 'model_replacement' => '$1',
  4133. ],
  4134. [
  4135. 'regex' => '@; {0,2}(?:Prestigio |)((?:PAP|PMP)\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4136. 'device_replacement' => 'Prestigio $1',
  4137. 'brand_replacement' => 'Prestigio',
  4138. 'model_replacement' => '$1',
  4139. ],
  4140. [
  4141. 'regex' => '@; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\\) AppleWebKit)@',
  4142. 'device_replacement' => '$1',
  4143. 'brand_replacement' => 'Proscan',
  4144. 'model_replacement' => '$1',
  4145. ],
  4146. [
  4147. 'regex' => '@; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)@',
  4148. 'device_replacement' => '$1 $2',
  4149. 'brand_replacement' => 'Qmobile',
  4150. 'model_replacement' => '$1 $2',
  4151. ],
  4152. [
  4153. 'regex' => '@; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)@',
  4154. 'device_replacement' => 'Qmobile $2 $3',
  4155. 'brand_replacement' => 'Qmobile',
  4156. 'model_replacement' => '$2 $3',
  4157. ],
  4158. [
  4159. 'regex' => '@; {0,2}(Q\\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4160. 'device_replacement' => 'Qmobile $2',
  4161. 'brand_replacement' => 'Qmobile',
  4162. 'model_replacement' => '$2',
  4163. ],
  4164. [
  4165. 'regex' => '@; {0,2}(Q\\-Smart)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4166. 'device_replacement' => '$1 $2',
  4167. 'brand_replacement' => 'Qmobilevn',
  4168. 'model_replacement' => '$2',
  4169. ],
  4170. [
  4171. 'regex' => '@; {0,2}(Q\\-?[Mm]obile)[ _\\-](S[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4172. 'device_replacement' => '$1 $2',
  4173. 'brand_replacement' => 'Qmobilevn',
  4174. 'model_replacement' => '$2',
  4175. ],
  4176. [
  4177. 'regex' => '@; {0,2}(TA1013)(?: Build|\\) AppleWebKit)@',
  4178. 'device_replacement' => '$1',
  4179. 'brand_replacement' => 'Quanta',
  4180. 'model_replacement' => '$1',
  4181. ],
  4182. [
  4183. 'regex' => '@; (RCT\\w+)(?: Build|\\) AppleWebKit)@',
  4184. 'device_replacement' => '$1',
  4185. 'brand_replacement' => 'RCA',
  4186. 'model_replacement' => '$1',
  4187. ],
  4188. [
  4189. 'regex' => '@; RCA (\\w+)(?: Build|\\) AppleWebKit)@',
  4190. 'device_replacement' => 'RCA $1',
  4191. 'brand_replacement' => 'RCA',
  4192. 'model_replacement' => '$1',
  4193. ],
  4194. [
  4195. 'regex' => '@; {0,2}(RK\\d+),?(?: Build|\\) AppleWebKit)@',
  4196. 'device_replacement' => '$1',
  4197. 'brand_replacement' => 'Rockchip',
  4198. 'model_replacement' => '$1',
  4199. ],
  4200. [
  4201. 'regex' => '@ Build/(RK\\d+)@',
  4202. 'device_replacement' => '$1',
  4203. 'brand_replacement' => 'Rockchip',
  4204. 'model_replacement' => '$1',
  4205. ],
  4206. [
  4207. 'regex' => '@; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]{0,100})\\/?[^;/]{0,50} Build/@',
  4208. 'device_replacement' => 'Samsung $1$2',
  4209. 'brand_replacement' => 'Samsung',
  4210. 'model_replacement' => '$2',
  4211. ],
  4212. [
  4213. 'regex' => '@; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/@',
  4214. 'device_replacement' => 'Samsung $1$2',
  4215. 'brand_replacement' => 'Samsung',
  4216. 'model_replacement' => '$2',
  4217. ],
  4218. [
  4219. 'regex' => '@; {0,2}(SAMSUNG |Samsung )([^\\/]{0,50})\\/[^ ]{0,50} Build/@',
  4220. 'device_replacement' => 'Samsung $2',
  4221. 'brand_replacement' => 'Samsung',
  4222. 'model_replacement' => '$2',
  4223. ],
  4224. [
  4225. 'regex' => '@; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/@',
  4226. 'device_replacement' => 'Samsung $1',
  4227. 'brand_replacement' => 'Samsung',
  4228. 'model_replacement' => '$1',
  4229. ],
  4230. [
  4231. 'regex' => '@; {0,2}(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]{1,100}) Build@',
  4232. 'device_replacement' => 'Samsung $2',
  4233. 'brand_replacement' => 'Samsung',
  4234. 'model_replacement' => '$2',
  4235. ],
  4236. [
  4237. 'regex' => '@; {0,2}(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]{0,50})(\\/[^ ]{0,50}) Build@',
  4238. 'device_replacement' => 'Samsung $1$2$3',
  4239. 'brand_replacement' => 'Samsung',
  4240. 'model_replacement' => '$2',
  4241. ],
  4242. [
  4243. 'regex' => '@(?:; {0,2}|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])@',
  4244. 'device_replacement' => 'Samsung $1',
  4245. 'brand_replacement' => 'Samsung',
  4246. 'model_replacement' => '$1',
  4247. ],
  4248. [
  4249. 'regex' => '@; (SAMSUNG-)([A-Za-z0-9\\-]{0,50}).{0,200} Build/@',
  4250. 'device_replacement' => 'Samsung $1$2',
  4251. 'brand_replacement' => 'Samsung',
  4252. 'model_replacement' => '$2',
  4253. ],
  4254. [
  4255. 'regex' => '@; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build@',
  4256. 'device_replacement' => 'Samsung $1',
  4257. 'brand_replacement' => 'Samsung',
  4258. 'model_replacement' => '$1',
  4259. ],
  4260. [
  4261. 'regex' => '@; {0,2}((?:SC)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\\)@',
  4262. 'device_replacement' => 'Samsung $1',
  4263. 'brand_replacement' => 'Samsung',
  4264. 'model_replacement' => '$1',
  4265. ],
  4266. [
  4267. 'regex' => '@ ((?:SCH)\\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build@',
  4268. 'device_replacement' => 'Samsung $1',
  4269. 'brand_replacement' => 'Samsung',
  4270. 'model_replacement' => '$1',
  4271. ],
  4272. [
  4273. 'regex' => '@; {0,2}(Behold ?(?:2|II)|YP\\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build@',
  4274. 'device_replacement' => 'Samsung $1',
  4275. 'brand_replacement' => 'Samsung',
  4276. 'model_replacement' => '$1',
  4277. ],
  4278. [
  4279. 'regex' => '@; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]@',
  4280. 'device_replacement' => 'Samsung $1',
  4281. 'brand_replacement' => 'Samsung',
  4282. 'model_replacement' => '$1',
  4283. ],
  4284. [
  4285. 'regex' => '@; {0,2}(SH\\-?\\d\\d[^;/]{1,100}|SBM\\d[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4286. 'device_replacement' => '$1',
  4287. 'brand_replacement' => 'Sharp',
  4288. 'model_replacement' => '$1',
  4289. ],
  4290. [
  4291. 'regex' => '@; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4292. 'device_replacement' => '$1$2',
  4293. 'brand_replacement' => 'Sharp',
  4294. 'model_replacement' => '$2',
  4295. ],
  4296. [
  4297. 'regex' => '@; {0,2}(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)@',
  4298. 'device_replacement' => '$1',
  4299. 'brand_replacement' => 'Simvalley',
  4300. 'model_replacement' => '$1',
  4301. ],
  4302. [
  4303. 'regex' => '@; {0,2}(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)@',
  4304. 'device_replacement' => '$1',
  4305. 'brand_replacement' => 'Simvalley',
  4306. 'model_replacement' => '$1',
  4307. ],
  4308. [
  4309. 'regex' => '@; {0,2}(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)@',
  4310. 'device_replacement' => '$1',
  4311. 'brand_replacement' => 'Simvalley',
  4312. 'model_replacement' => '$1',
  4313. ],
  4314. [
  4315. 'regex' => '@; {0,2}(SK\\-.{0,200}?)(?: Build|\\) AppleWebKit)@',
  4316. 'device_replacement' => '$1',
  4317. 'brand_replacement' => 'SKtelesys',
  4318. 'model_replacement' => '$1',
  4319. ],
  4320. [
  4321. 'regex' => '@; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4322. 'device_replacement' => '$1',
  4323. 'brand_replacement' => 'Skytex',
  4324. 'model_replacement' => '$1',
  4325. ],
  4326. [
  4327. 'regex' => '@; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4328. 'device_replacement' => '$1',
  4329. 'brand_replacement' => 'Skytex',
  4330. 'model_replacement' => '$1',
  4331. ],
  4332. [
  4333. 'regex' => '@; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4334. 'device_replacement' => '$1 $2',
  4335. 'brand_replacement' => '$1',
  4336. 'model_replacement' => '$2',
  4337. ],
  4338. [
  4339. 'regex' => '@; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4340. 'device_replacement' => '$1',
  4341. 'brand_replacement' => 'Smartbitt',
  4342. 'model_replacement' => '$1',
  4343. ],
  4344. [
  4345. 'regex' => '@; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build@',
  4346. 'device_replacement' => '$1',
  4347. 'brand_replacement' => 'Sharp',
  4348. 'model_replacement' => '$1',
  4349. ],
  4350. [
  4351. 'regex' => '@; {0,2}(003P|101P|101P11C|102P) Build@',
  4352. 'device_replacement' => '$1',
  4353. 'brand_replacement' => 'Panasonic',
  4354. 'model_replacement' => '$1',
  4355. ],
  4356. [
  4357. 'regex' => '@; {0,2}(00\\dZ) Build/@',
  4358. 'device_replacement' => '$1',
  4359. 'brand_replacement' => 'ZTE',
  4360. 'model_replacement' => '$1',
  4361. ],
  4362. [
  4363. 'regex' => '@; HTC(X06HT) Build@',
  4364. 'device_replacement' => '$1',
  4365. 'brand_replacement' => 'HTC',
  4366. 'model_replacement' => '$1',
  4367. ],
  4368. [
  4369. 'regex' => '@; {0,2}(001HT|X06HT) Build@',
  4370. 'device_replacement' => '$1',
  4371. 'brand_replacement' => 'HTC',
  4372. 'model_replacement' => '$1',
  4373. ],
  4374. [
  4375. 'regex' => '@; {0,2}(201M) Build@',
  4376. 'device_replacement' => '$1',
  4377. 'brand_replacement' => 'Motorola',
  4378. 'model_replacement' => 'XT902',
  4379. ],
  4380. [
  4381. 'regex' => '@; {0,2}(ST\\d{4}.{0,200})Build/ST@',
  4382. 'device_replacement' => 'Trekstor $1',
  4383. 'brand_replacement' => 'Trekstor',
  4384. 'model_replacement' => '$1',
  4385. ],
  4386. [
  4387. 'regex' => '@; {0,2}(ST\\d{4}.{0,200}?)(?: Build|\\) AppleWebKit)@',
  4388. 'device_replacement' => 'Trekstor $1',
  4389. 'brand_replacement' => 'Trekstor',
  4390. 'model_replacement' => '$1',
  4391. ],
  4392. [
  4393. 'regex' => '@; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build@',
  4394. 'device_replacement' => '$1$2',
  4395. 'brand_replacement' => 'SonyEricsson',
  4396. 'model_replacement' => '$2',
  4397. ],
  4398. [
  4399. 'regex' => '@; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build@',
  4400. 'device_replacement' => '$1',
  4401. 'brand_replacement' => 'SonyEricsson',
  4402. 'model_replacement' => '$1',
  4403. ],
  4404. [
  4405. 'regex' => '@; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]{0,50}) Build@i',
  4406. 'device_replacement' => '$1',
  4407. 'brand_replacement' => 'SonyEricsson',
  4408. 'model_replacement' => '$1',
  4409. ],
  4410. [
  4411. 'regex' => '@; Sony (Tablet[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4412. 'device_replacement' => 'Sony $1',
  4413. 'brand_replacement' => 'Sony',
  4414. 'model_replacement' => '$1',
  4415. ],
  4416. [
  4417. 'regex' => '@; Sony ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4418. 'device_replacement' => 'Sony $1',
  4419. 'brand_replacement' => 'Sony',
  4420. 'model_replacement' => '$1',
  4421. ],
  4422. [
  4423. 'regex' => '@; {0,2}(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)@',
  4424. 'device_replacement' => '$1 $2',
  4425. 'brand_replacement' => '$1',
  4426. 'model_replacement' => '$2',
  4427. ],
  4428. [
  4429. 'regex' => '@; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4430. 'device_replacement' => '$1',
  4431. 'brand_replacement' => 'Sony',
  4432. 'model_replacement' => '$1',
  4433. ],
  4434. [
  4435. 'regex' => '@; {0,2}(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)@',
  4436. 'device_replacement' => '$1',
  4437. 'brand_replacement' => 'Sony',
  4438. 'model_replacement' => '$1',
  4439. ],
  4440. [
  4441. 'regex' => '@; {0,2}(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)@',
  4442. 'device_replacement' => '$1',
  4443. 'brand_replacement' => 'Sony',
  4444. 'model_replacement' => '$1',
  4445. ],
  4446. [
  4447. 'regex' => '@; {0,2}(NW-Z1000Series)(?: Build|\\) AppleWebKit)@',
  4448. 'device_replacement' => '$1',
  4449. 'brand_replacement' => 'Sony',
  4450. 'model_replacement' => '$1',
  4451. ],
  4452. [
  4453. 'regex' => '@PLAYSTATION 3@',
  4454. 'device_replacement' => 'PlayStation 3',
  4455. 'brand_replacement' => 'Sony',
  4456. 'model_replacement' => 'PlayStation 3',
  4457. ],
  4458. [
  4459. 'regex' => '@(PlayStation (?:Portable|Vita|\\d+))@',
  4460. 'device_replacement' => '$1',
  4461. 'brand_replacement' => 'Sony',
  4462. 'model_replacement' => '$1',
  4463. ],
  4464. [
  4465. 'regex' => '@; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)@',
  4466. 'device_replacement' => '$1$2$3$4',
  4467. 'brand_replacement' => 'Spice',
  4468. 'model_replacement' => 'Mi$4',
  4469. ],
  4470. [
  4471. 'regex' => '@; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])@',
  4472. 'device_replacement' => '$1$2',
  4473. 'brand_replacement' => 'Sprint',
  4474. 'model_replacement' => '$2',
  4475. ],
  4476. [
  4477. 'regex' => '@\\b(Sprint)[: ]([^;,/ ]+)@',
  4478. 'device_replacement' => '$1$2',
  4479. 'brand_replacement' => 'Sprint',
  4480. 'model_replacement' => '$2',
  4481. ],
  4482. [
  4483. 'regex' => '@; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4484. 'device_replacement' => '$1$2$3',
  4485. 'brand_replacement' => 'Tagi',
  4486. 'model_replacement' => '$2$3',
  4487. ],
  4488. [
  4489. 'regex' => '@; {0,2}(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)@',
  4490. 'device_replacement' => 'Tecmobile $1',
  4491. 'brand_replacement' => 'Tecmobile',
  4492. 'model_replacement' => '$1',
  4493. ],
  4494. [
  4495. 'regex' => '@; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4496. 'device_replacement' => '$1$2',
  4497. 'brand_replacement' => 'Tecno',
  4498. 'model_replacement' => '$2',
  4499. ],
  4500. [
  4501. 'regex' => '@; {0,2}Android for (Telechips|Techvision) ([^ ]+) @i',
  4502. 'device_replacement' => '$1 $2',
  4503. 'brand_replacement' => '$1',
  4504. 'model_replacement' => '$2',
  4505. ],
  4506. [
  4507. 'regex' => '@; {0,2}(T-Hub2)(?: Build|\\) AppleWebKit)@',
  4508. 'device_replacement' => '$1',
  4509. 'brand_replacement' => 'Telstra',
  4510. 'model_replacement' => '$1',
  4511. ],
  4512. [
  4513. 'regex' => '@; {0,2}(PAD) ?(100[12])(?: Build|\\) AppleWebKit)@',
  4514. 'device_replacement' => 'Terra $1$2',
  4515. 'brand_replacement' => 'Terra',
  4516. 'model_replacement' => '$1$2',
  4517. ],
  4518. [
  4519. 'regex' => '@; {0,2}(T[BM]-\\d{3}[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4520. 'device_replacement' => '$1',
  4521. 'brand_replacement' => 'Texet',
  4522. 'model_replacement' => '$1',
  4523. ],
  4524. [
  4525. 'regex' => '@; {0,2}(tolino [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4526. 'device_replacement' => '$1',
  4527. 'brand_replacement' => 'Thalia',
  4528. 'model_replacement' => '$1',
  4529. ],
  4530. [
  4531. 'regex' => '@; {0,2}Build/.{0,200} (TOLINO_BROWSER)@',
  4532. 'device_replacement' => '$1',
  4533. 'brand_replacement' => 'Thalia',
  4534. 'model_replacement' => 'Tolino Shine',
  4535. ],
  4536. [
  4537. 'regex' => '@; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4538. 'device_replacement' => '$1 $2',
  4539. 'brand_replacement' => 'Thl',
  4540. 'model_replacement' => '$2',
  4541. ],
  4542. [
  4543. 'regex' => '@; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)@',
  4544. 'device_replacement' => '$1',
  4545. 'brand_replacement' => 'Thl',
  4546. 'model_replacement' => '$1',
  4547. ],
  4548. [
  4549. 'regex' => '@; {0,2}(T-Mobile[ _]G2[ _]Touch) Build@',
  4550. 'device_replacement' => '$1',
  4551. 'brand_replacement' => 'HTC',
  4552. 'model_replacement' => 'Hero',
  4553. ],
  4554. [
  4555. 'regex' => '@; {0,2}(T-Mobile[ _]G2) Build@',
  4556. 'device_replacement' => '$1',
  4557. 'brand_replacement' => 'HTC',
  4558. 'model_replacement' => 'Desire Z',
  4559. ],
  4560. [
  4561. 'regex' => '@; {0,2}(T-Mobile myTouch Q) Build@',
  4562. 'device_replacement' => '$1',
  4563. 'brand_replacement' => 'Huawei',
  4564. 'model_replacement' => 'U8730',
  4565. ],
  4566. [
  4567. 'regex' => '@; {0,2}(T-Mobile myTouch) Build@',
  4568. 'device_replacement' => '$1',
  4569. 'brand_replacement' => 'Huawei',
  4570. 'model_replacement' => 'U8680',
  4571. ],
  4572. [
  4573. 'regex' => '@; {0,2}(T-Mobile_Espresso) Build@',
  4574. 'device_replacement' => '$1',
  4575. 'brand_replacement' => 'HTC',
  4576. 'model_replacement' => 'Espresso',
  4577. ],
  4578. [
  4579. 'regex' => '@; {0,2}(T-Mobile G1) Build@',
  4580. 'device_replacement' => '$1',
  4581. 'brand_replacement' => 'HTC',
  4582. 'model_replacement' => 'Dream',
  4583. ],
  4584. [
  4585. 'regex' => '@\\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\\/]*) (?:Mozilla|Build)@',
  4586. 'device_replacement' => '$1$2 $3 $4',
  4587. 'brand_replacement' => 'HTC',
  4588. 'model_replacement' => '$2 $3 $4',
  4589. ],
  4590. [
  4591. 'regex' => '@\\b(T-Mobile)_([^_]+)_(.{0,200}) Build@',
  4592. 'device_replacement' => '$1 $2 $3',
  4593. 'brand_replacement' => 'Tmobile',
  4594. 'model_replacement' => '$2 $3',
  4595. ],
  4596. [
  4597. 'regex' => '@\\b(T-Mobile)[_ ]?(.{0,200}?)Build@',
  4598. 'device_replacement' => '$1 $2',
  4599. 'brand_replacement' => 'Tmobile',
  4600. 'model_replacement' => '$2',
  4601. ],
  4602. [
  4603. 'regex' => '@ (ATP[0-9]{4})(?: Build|\\) AppleWebKit)@',
  4604. 'device_replacement' => '$1',
  4605. 'brand_replacement' => 'Tomtec',
  4606. 'model_replacement' => '$1',
  4607. ],
  4608. [
  4609. 'regex' => '@ ?(TOOKY)[ _\\-]([^;/]{1,100}) ?(?:Build|;)@i',
  4610. 'device_replacement' => '$1 $2',
  4611. 'brand_replacement' => 'Tooky',
  4612. 'model_replacement' => '$2',
  4613. ],
  4614. [
  4615. 'regex' => '@\\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)@',
  4616. 'device_replacement' => '$1',
  4617. 'brand_replacement' => 'Toshiba',
  4618. 'model_replacement' => 'Folio 100',
  4619. ],
  4620. [
  4621. 'regex' => '@; {0,2}([Ff]olio ?100)(?: Build|\\) AppleWebKit)@',
  4622. 'device_replacement' => '$1',
  4623. 'brand_replacement' => 'Toshiba',
  4624. 'model_replacement' => 'Folio 100',
  4625. ],
  4626. [
  4627. 'regex' => '@; {0,2}(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\\) AppleWebKit)@',
  4628. 'device_replacement' => 'Toshiba $1',
  4629. 'brand_replacement' => 'Toshiba',
  4630. 'model_replacement' => '$1',
  4631. ],
  4632. [
  4633. 'regex' => '@; {0,2}(TM-MID\\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)@',
  4634. 'device_replacement' => '$1',
  4635. 'brand_replacement' => 'Touchmate',
  4636. 'model_replacement' => '$1',
  4637. ],
  4638. [
  4639. 'regex' => '@; {0,2}(TM-SM\\d+[^;/]{1,50}?)(?: Build|\\) AppleWebKit)@',
  4640. 'device_replacement' => '$1',
  4641. 'brand_replacement' => 'Touchmate',
  4642. 'model_replacement' => '$1',
  4643. ],
  4644. [
  4645. 'regex' => '@; {0,2}(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)@',
  4646. 'device_replacement' => '$1',
  4647. 'brand_replacement' => 'Treq',
  4648. 'model_replacement' => '$1',
  4649. ],
  4650. [
  4651. 'regex' => '@; {0,2}(TREQ[ _\\-])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  4652. 'device_replacement' => '$1$2',
  4653. 'brand_replacement' => 'Treq',
  4654. 'model_replacement' => '$2',
  4655. ],
  4656. [
  4657. 'regex' => '@; {0,2}(X-?5|X-?3)(?: Build|\\) AppleWebKit)@',
  4658. 'device_replacement' => '$1',
  4659. 'brand_replacement' => 'Umeox',
  4660. 'model_replacement' => '$1',
  4661. ],
  4662. [
  4663. 'regex' => '@; {0,2}(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)@',
  4664. 'device_replacement' => '$1',
  4665. 'brand_replacement' => 'Umeox',
  4666. 'model_replacement' => '$1',
  4667. ],
  4668. [
  4669. 'regex' => '@; thor Build/@',
  4670. 'device_replacement' => 'Thor',
  4671. 'brand_replacement' => 'Vernee',
  4672. 'model_replacement' => 'Thor',
  4673. ],
  4674. [
  4675. 'regex' => '@; Thor (E)? Build/@',
  4676. 'device_replacement' => 'Thor $1',
  4677. 'brand_replacement' => 'Vernee',
  4678. 'model_replacement' => 'Thor',
  4679. ],
  4680. [
  4681. 'regex' => '@; Apollo Lite Build/@',
  4682. 'device_replacement' => 'Apollo Lite',
  4683. 'brand_replacement' => 'Vernee',
  4684. 'model_replacement' => 'Apollo',
  4685. ],
  4686. [
  4687. 'regex' => '@(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\\) AppleWebKit)@i',
  4688. 'device_replacement' => 'Versus $1',
  4689. 'brand_replacement' => 'Versus',
  4690. 'model_replacement' => '$1',
  4691. ],
  4692. [
  4693. 'regex' => '@(VERTU) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4694. 'device_replacement' => '$1 $2',
  4695. 'brand_replacement' => 'Vertu',
  4696. 'model_replacement' => '$2',
  4697. ],
  4698. [
  4699. 'regex' => '@; {0,2}(Videocon)[ _\\-]([^;/]{1,100}?) {0,2}(?:Build|;)@',
  4700. 'device_replacement' => '$1 $2',
  4701. 'brand_replacement' => 'Videocon',
  4702. 'model_replacement' => '$2',
  4703. ],
  4704. [
  4705. 'regex' => '@ (VT\\d{2}[A-Za-z]*)(?: Build|\\) AppleWebKit)@',
  4706. 'device_replacement' => '$1',
  4707. 'brand_replacement' => 'Videocon',
  4708. 'model_replacement' => '$1',
  4709. ],
  4710. [
  4711. 'regex' => '@; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4712. 'device_replacement' => '$1',
  4713. 'brand_replacement' => 'Viewsonic',
  4714. 'model_replacement' => '$1',
  4715. ],
  4716. [
  4717. 'regex' => '@; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4718. 'device_replacement' => '$1$2',
  4719. 'brand_replacement' => 'Viewsonic',
  4720. 'model_replacement' => '$2',
  4721. ],
  4722. [
  4723. 'regex' => '@; {0,2}(GTablet.{0,200}?)(?: Build|\\) AppleWebKit)@',
  4724. 'device_replacement' => '$1',
  4725. 'brand_replacement' => 'Viewsonic',
  4726. 'model_replacement' => '$1',
  4727. ],
  4728. [
  4729. 'regex' => '@; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4730. 'device_replacement' => '$1 $2',
  4731. 'brand_replacement' => 'vivo',
  4732. 'model_replacement' => '$2',
  4733. ],
  4734. [
  4735. 'regex' => '@(Vodafone) (.{0,200}?)(?: Build|\\) AppleWebKit)@',
  4736. 'device_replacement' => '$1 $2',
  4737. 'brand_replacement' => '$1',
  4738. 'model_replacement' => '$2',
  4739. ],
  4740. [
  4741. 'regex' => '@; {0,2}(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  4742. 'device_replacement' => 'Walton $1',
  4743. 'brand_replacement' => 'Walton',
  4744. 'model_replacement' => '$1',
  4745. ],
  4746. [
  4747. 'regex' => '@; {0,2}(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  4748. 'device_replacement' => 'Wiko $1',
  4749. 'brand_replacement' => 'Wiko',
  4750. 'model_replacement' => '$1',
  4751. ],
  4752. [
  4753. 'regex' => '@; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4754. 'device_replacement' => 'Wellcom $1',
  4755. 'brand_replacement' => 'Wellcom',
  4756. 'model_replacement' => '$1',
  4757. ],
  4758. [
  4759. 'regex' => '@(?:(WeTab)-Browser|; (wetab) Build)@',
  4760. 'device_replacement' => '$1',
  4761. 'brand_replacement' => 'WeTab',
  4762. 'model_replacement' => 'WeTab',
  4763. ],
  4764. [
  4765. 'regex' => '@; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4766. 'device_replacement' => 'Wolfgang $1',
  4767. 'brand_replacement' => 'Wolfgang',
  4768. 'model_replacement' => '$1',
  4769. ],
  4770. [
  4771. 'regex' => '@; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4772. 'device_replacement' => 'Woxter $1',
  4773. 'brand_replacement' => 'Woxter',
  4774. 'model_replacement' => '$1',
  4775. ],
  4776. [
  4777. 'regex' => '@; {0,2}(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)@',
  4778. 'device_replacement' => 'Yarvik $1',
  4779. 'brand_replacement' => 'Yarvik',
  4780. 'model_replacement' => '$1',
  4781. ],
  4782. [
  4783. 'regex' => '@; {0,2}([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])@',
  4784. 'device_replacement' => 'Yifang $1$2$3',
  4785. 'brand_replacement' => 'Yifang',
  4786. 'model_replacement' => '$2',
  4787. ],
  4788. [
  4789. 'regex' => '@; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/@',
  4790. 'device_replacement' => 'XiaoMi $1',
  4791. 'brand_replacement' => 'XiaoMi',
  4792. 'model_replacement' => '$1',
  4793. ],
  4794. [
  4795. 'regex' => '@; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)@',
  4796. 'device_replacement' => 'XiaoMi $1',
  4797. 'brand_replacement' => 'XiaoMi',
  4798. 'model_replacement' => '$1',
  4799. ],
  4800. [
  4801. 'regex' => '@; {0,2}(MIX) (Build|MIUI)/@',
  4802. 'device_replacement' => 'XiaoMi $1',
  4803. 'brand_replacement' => 'XiaoMi',
  4804. 'model_replacement' => '$1',
  4805. ],
  4806. [
  4807. 'regex' => '@; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/@',
  4808. 'device_replacement' => 'XiaoMi $1',
  4809. 'brand_replacement' => 'XiaoMi',
  4810. 'model_replacement' => '$1',
  4811. ],
  4812. [
  4813. 'regex' => '@; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\\) AppleWebKit)@i',
  4814. 'device_replacement' => 'Xolo $1',
  4815. 'brand_replacement' => 'Xolo',
  4816. 'model_replacement' => '$1',
  4817. ],
  4818. [
  4819. 'regex' => '@; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@i',
  4820. 'device_replacement' => 'Xolo $1',
  4821. 'brand_replacement' => 'Xolo',
  4822. 'model_replacement' => '$1',
  4823. ],
  4824. [
  4825. 'regex' => '@; {0,2}(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)@i',
  4826. 'device_replacement' => 'Xolo $1',
  4827. 'brand_replacement' => 'Xolo',
  4828. 'model_replacement' => '$1',
  4829. ],
  4830. [
  4831. 'regex' => '@; {0,2}(PAD ?[79]\\d+[^;/]{0,50}|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)@',
  4832. 'device_replacement' => 'Xoro $1',
  4833. 'brand_replacement' => 'Xoro',
  4834. 'model_replacement' => '$1',
  4835. ],
  4836. [
  4837. 'regex' => '@; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\\) AppleWebKit)@',
  4838. 'device_replacement' => '$1$2$3',
  4839. 'brand_replacement' => 'Zopo',
  4840. 'model_replacement' => '$1$2$3',
  4841. ],
  4842. [
  4843. 'regex' => '@; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)@',
  4844. 'device_replacement' => '$1 $2',
  4845. 'brand_replacement' => 'ZiiLabs',
  4846. 'model_replacement' => '$2',
  4847. ],
  4848. [
  4849. 'regex' => '@; {0,2}(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)@',
  4850. 'device_replacement' => '$1 $2',
  4851. 'brand_replacement' => 'ZiiLabs',
  4852. 'model_replacement' => '$2',
  4853. ],
  4854. [
  4855. 'regex' => '@; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)@',
  4856. 'device_replacement' => '$1',
  4857. 'brand_replacement' => 'ZTE',
  4858. 'model_replacement' => '$1',
  4859. ],
  4860. [
  4861. 'regex' => '@; {0,2}([A-Z]\\d+)_USA_[^;]{0,200}(?: Build|\\) AppleWebKit)@',
  4862. 'device_replacement' => '$1',
  4863. 'brand_replacement' => 'ZTE',
  4864. 'model_replacement' => '$1',
  4865. ],
  4866. [
  4867. 'regex' => '@; {0,2}(SmartTab\\d+)[^;]{0,50}(?: Build|\\) AppleWebKit)@',
  4868. 'device_replacement' => '$1',
  4869. 'brand_replacement' => 'ZTE',
  4870. 'model_replacement' => '$1',
  4871. ],
  4872. [
  4873. 'regex' => '@; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)@',
  4874. 'device_replacement' => 'ZTE Blade$1',
  4875. 'brand_replacement' => 'ZTE',
  4876. 'model_replacement' => 'Blade$1',
  4877. ],
  4878. [
  4879. 'regex' => '@; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)@',
  4880. 'device_replacement' => 'ZTE Skate$1',
  4881. 'brand_replacement' => 'ZTE',
  4882. 'model_replacement' => 'Skate$1',
  4883. ],
  4884. [
  4885. 'regex' => '@; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)@',
  4886. 'device_replacement' => '$1$2',
  4887. 'brand_replacement' => 'ZTE',
  4888. 'model_replacement' => '$1$2',
  4889. ],
  4890. [
  4891. 'regex' => '@; {0,2}(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\\) AppleWebKit)@',
  4892. 'device_replacement' => 'ZTE $1',
  4893. 'brand_replacement' => 'ZTE',
  4894. 'model_replacement' => '$1',
  4895. ],
  4896. [
  4897. 'regex' => '@; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\\) AppleWebKit)@',
  4898. 'device_replacement' => '$1 $2',
  4899. 'brand_replacement' => 'ZTE',
  4900. 'model_replacement' => '$1 $2',
  4901. ],
  4902. [
  4903. 'regex' => '@; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\\) AppleWebKit)@i',
  4904. 'device_replacement' => '$1',
  4905. 'brand_replacement' => 'ZTE',
  4906. 'model_replacement' => '$1',
  4907. ],
  4908. [
  4909. 'regex' => '@; {0,2}(vp9plus)\\)@',
  4910. 'device_replacement' => '$1',
  4911. 'brand_replacement' => 'ZTE',
  4912. 'model_replacement' => '$1',
  4913. ],
  4914. [
  4915. 'regex' => '@; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\\) AppleWebKit)@',
  4916. 'device_replacement' => '$1',
  4917. 'brand_replacement' => 'Zync',
  4918. 'model_replacement' => '$1',
  4919. ],
  4920. [
  4921. 'regex' => '@; ?(KFOT|Kindle Fire) Build\\b@',
  4922. 'device_replacement' => 'Kindle Fire',
  4923. 'brand_replacement' => 'Amazon',
  4924. 'model_replacement' => 'Kindle Fire',
  4925. ],
  4926. [
  4927. 'regex' => '@; ?(KFOTE|Amazon Kindle Fire2) Build\\b@',
  4928. 'device_replacement' => 'Kindle Fire 2',
  4929. 'brand_replacement' => 'Amazon',
  4930. 'model_replacement' => 'Kindle Fire 2',
  4931. ],
  4932. [
  4933. 'regex' => '@; ?(KFTT) Build\\b@',
  4934. 'device_replacement' => 'Kindle Fire HD',
  4935. 'brand_replacement' => 'Amazon',
  4936. 'model_replacement' => 'Kindle Fire HD 7"',
  4937. ],
  4938. [
  4939. 'regex' => '@; ?(KFJWI) Build\\b@',
  4940. 'device_replacement' => 'Kindle Fire HD 8.9" WiFi',
  4941. 'brand_replacement' => 'Amazon',
  4942. 'model_replacement' => 'Kindle Fire HD 8.9" WiFi',
  4943. ],
  4944. [
  4945. 'regex' => '@; ?(KFJWA) Build\\b@',
  4946. 'device_replacement' => 'Kindle Fire HD 8.9" 4G',
  4947. 'brand_replacement' => 'Amazon',
  4948. 'model_replacement' => 'Kindle Fire HD 8.9" 4G',
  4949. ],
  4950. [
  4951. 'regex' => '@; ?(KFSOWI) Build\\b@',
  4952. 'device_replacement' => 'Kindle Fire HD 7" WiFi',
  4953. 'brand_replacement' => 'Amazon',
  4954. 'model_replacement' => 'Kindle Fire HD 7" WiFi',
  4955. ],
  4956. [
  4957. 'regex' => '@; ?(KFTHWI) Build\\b@',
  4958. 'device_replacement' => 'Kindle Fire HDX 7" WiFi',
  4959. 'brand_replacement' => 'Amazon',
  4960. 'model_replacement' => 'Kindle Fire HDX 7" WiFi',
  4961. ],
  4962. [
  4963. 'regex' => '@; ?(KFTHWA) Build\\b@',
  4964. 'device_replacement' => 'Kindle Fire HDX 7" 4G',
  4965. 'brand_replacement' => 'Amazon',
  4966. 'model_replacement' => 'Kindle Fire HDX 7" 4G',
  4967. ],
  4968. [
  4969. 'regex' => '@; ?(KFAPWI) Build\\b@',
  4970. 'device_replacement' => 'Kindle Fire HDX 8.9" WiFi',
  4971. 'brand_replacement' => 'Amazon',
  4972. 'model_replacement' => 'Kindle Fire HDX 8.9" WiFi',
  4973. ],
  4974. [
  4975. 'regex' => '@; ?(KFAPWA) Build\\b@',
  4976. 'device_replacement' => 'Kindle Fire HDX 8.9" 4G',
  4977. 'brand_replacement' => 'Amazon',
  4978. 'model_replacement' => 'Kindle Fire HDX 8.9" 4G',
  4979. ],
  4980. [
  4981. 'regex' => '@; ?Amazon ([^;/]{1,100}) Build\\b@',
  4982. 'device_replacement' => '$1',
  4983. 'brand_replacement' => 'Amazon',
  4984. 'model_replacement' => '$1',
  4985. ],
  4986. [
  4987. 'regex' => '@; ?(Kindle) Build\\b@',
  4988. 'device_replacement' => 'Kindle',
  4989. 'brand_replacement' => 'Amazon',
  4990. 'model_replacement' => 'Kindle',
  4991. ],
  4992. [
  4993. 'regex' => '@; ?(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|) Build\\b@',
  4994. 'device_replacement' => 'Kindle Fire',
  4995. 'brand_replacement' => 'Amazon',
  4996. 'model_replacement' => 'Kindle Fire$2',
  4997. ],
  4998. [
  4999. 'regex' => '@ (Kindle)/(\\d+\\.\\d+)@',
  5000. 'device_replacement' => 'Kindle',
  5001. 'brand_replacement' => 'Amazon',
  5002. 'model_replacement' => '$1 $2',
  5003. ],
  5004. [
  5005. 'regex' => '@ (Silk|Kindle)/(\\d+)\\.@',
  5006. 'device_replacement' => 'Kindle',
  5007. 'brand_replacement' => 'Amazon',
  5008. 'model_replacement' => 'Kindle',
  5009. ],
  5010. [
  5011. 'regex' => '@(sprd)\\-([^/]{1,50})/@',
  5012. 'device_replacement' => '$1 $2',
  5013. 'brand_replacement' => '$1',
  5014. 'model_replacement' => '$2',
  5015. ],
  5016. [
  5017. 'regex' => '@; {0,2}(H\\d{2}00\\+?) Build@',
  5018. 'device_replacement' => '$1',
  5019. 'brand_replacement' => 'Hero',
  5020. 'model_replacement' => '$1',
  5021. ],
  5022. [
  5023. 'regex' => '@; {0,2}(iphone|iPhone5) Build/@',
  5024. 'device_replacement' => 'Xianghe $1',
  5025. 'brand_replacement' => 'Xianghe',
  5026. 'model_replacement' => '$1',
  5027. ],
  5028. [
  5029. 'regex' => '@; {0,2}(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/@',
  5030. 'device_replacement' => 'Xianghe $1',
  5031. 'brand_replacement' => 'Xianghe',
  5032. 'model_replacement' => '$1',
  5033. ],
  5034. [
  5035. 'regex' => '@\\bUSCC[_\\-]?([^ ;/\\)]+)@',
  5036. 'device_replacement' => '$1',
  5037. 'brand_replacement' => 'Cellular',
  5038. 'model_replacement' => '$1',
  5039. ],
  5040. [
  5041. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\\)]+)@',
  5042. 'device_replacement' => 'Alcatel $1',
  5043. 'brand_replacement' => 'Alcatel',
  5044. 'model_replacement' => '$1',
  5045. ],
  5046. [
  5047. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\\)]+)@',
  5048. 'device_replacement' => 'Asus $1',
  5049. 'brand_replacement' => 'Asus',
  5050. 'model_replacement' => '$1',
  5051. ],
  5052. [
  5053. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\\)]+)@',
  5054. 'device_replacement' => 'Dell $1',
  5055. 'brand_replacement' => 'Dell',
  5056. 'model_replacement' => '$1',
  5057. ],
  5058. [
  5059. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\\)]+)@',
  5060. 'device_replacement' => 'HTC $1',
  5061. 'brand_replacement' => 'HTC',
  5062. 'model_replacement' => '$1',
  5063. ],
  5064. [
  5065. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\\)]+)@',
  5066. 'device_replacement' => 'Huawei $1',
  5067. 'brand_replacement' => 'Huawei',
  5068. 'model_replacement' => '$1',
  5069. ],
  5070. [
  5071. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \\-]|)([^;,\\)]+)@',
  5072. 'device_replacement' => 'LG $1',
  5073. 'brand_replacement' => 'LG',
  5074. 'model_replacement' => '$1',
  5075. ],
  5076. [
  5077. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)@',
  5078. 'device_replacement' => 'Lumia $1',
  5079. 'brand_replacement' => 'Nokia',
  5080. 'model_replacement' => 'Lumia $1',
  5081. ],
  5082. [
  5083. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\\d{3,})@',
  5084. 'device_replacement' => 'Nokia $1',
  5085. 'brand_replacement' => 'Nokia',
  5086. 'model_replacement' => '$1',
  5087. ],
  5088. [
  5089. 'regex' => '@(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)@',
  5090. 'device_replacement' => 'Nokia $1',
  5091. 'brand_replacement' => 'Nokia',
  5092. 'model_replacement' => '$1',
  5093. ],
  5094. [
  5095. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\\)]+)@',
  5096. 'device_replacement' => 'Microsoft $1',
  5097. 'brand_replacement' => 'Microsoft',
  5098. 'model_replacement' => '$1',
  5099. ],
  5100. [
  5101. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\\.\\)]+)@',
  5102. 'device_replacement' => 'Samsung $1',
  5103. 'brand_replacement' => 'Samsung',
  5104. 'model_replacement' => '$1',
  5105. ],
  5106. [
  5107. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\\)]+)@',
  5108. 'device_replacement' => 'Toshiba $1',
  5109. 'brand_replacement' => 'Toshiba',
  5110. 'model_replacement' => '$1',
  5111. ],
  5112. [
  5113. 'regex' => '@Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\\)]+)@',
  5114. 'device_replacement' => '$1 $2',
  5115. 'brand_replacement' => '$1',
  5116. 'model_replacement' => '$2',
  5117. ],
  5118. [
  5119. 'regex' => '@(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]{1,50}).{0,200} Bada/@',
  5120. 'device_replacement' => 'Samsung $1',
  5121. 'brand_replacement' => 'Samsung',
  5122. 'model_replacement' => '$1',
  5123. ],
  5124. [
  5125. 'regex' => '@\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/@',
  5126. 'device_replacement' => 'Alcatel $1 $2 $3',
  5127. 'brand_replacement' => 'Alcatel',
  5128. 'model_replacement' => 'One Touch $3',
  5129. ],
  5130. [
  5131. 'regex' => '@\\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/@',
  5132. 'device_replacement' => 'ZTE $1$2',
  5133. 'brand_replacement' => 'ZTE',
  5134. 'model_replacement' => '$1$2',
  5135. ],
  5136. [
  5137. 'regex' => '@\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]{1,200}\\) Gecko/[^\\/]{1,200} Firefox/[^\\/]{1,200} KaiOS/@',
  5138. 'device_replacement' => 'Alcatel $1',
  5139. 'brand_replacement' => 'Alcatel',
  5140. 'model_replacement' => '$1',
  5141. ],
  5142. [
  5143. 'regex' => '@\\(Mobile; LYF\\/([A-Za-z0-9\\-]{1,100})\\/.{0,100};.{0,100}rv:[^\\)]{1,100}\\) Gecko/[^\\/]{1,100} Firefox/[^\\/]{1,100} KAIOS/@',
  5144. 'device_replacement' => 'LYF $1',
  5145. 'brand_replacement' => 'LYF',
  5146. 'model_replacement' => '$1',
  5147. ],
  5148. [
  5149. 'regex' => '@\\(Mobile; Nokia_([A-Za-z0-9\\-]{1,100})_.{1,100}; rv:[^\\)]{1,100}\\) Gecko/[^\\/]{1,100} Firefox/[^\\/]{1,100} KAIOS/@',
  5150. 'device_replacement' => 'Nokia $1',
  5151. 'brand_replacement' => 'Nokia',
  5152. 'model_replacement' => '$1',
  5153. ],
  5154. [
  5155. 'regex' => '@Nokia(N[0-9]+)([A-Za-z_\\-][A-Za-z0-9_\\-]*)@',
  5156. 'device_replacement' => 'Nokia $1',
  5157. 'brand_replacement' => 'Nokia',
  5158. 'model_replacement' => '$1$2',
  5159. ],
  5160. [
  5161. 'regex' => '@(?:NOKIA|Nokia)(?:\\-| {0,2})(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))@',
  5162. 'device_replacement' => 'Nokia $1$2$3',
  5163. 'brand_replacement' => 'Nokia',
  5164. 'model_replacement' => '$1$2$3',
  5165. ],
  5166. [
  5167. 'regex' => '@Lumia ([A-Za-z0-9\\-]+)@',
  5168. 'device_replacement' => 'Lumia $1',
  5169. 'brand_replacement' => 'Nokia',
  5170. 'model_replacement' => 'Lumia $1',
  5171. ],
  5172. [
  5173. 'regex' => '@\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\\)@',
  5174. 'device_replacement' => '$1 $2',
  5175. 'brand_replacement' => '$1',
  5176. 'model_replacement' => '$2',
  5177. ],
  5178. [
  5179. 'regex' => '@\\(Symbian(?:/3|); U; ([^;]{1,200});@',
  5180. 'device_replacement' => 'Nokia $1',
  5181. 'brand_replacement' => 'Nokia',
  5182. 'model_replacement' => '$1',
  5183. ],
  5184. [
  5185. 'regex' => '@BB10; ([A-Za-z0-9\\- ]+)\\)@',
  5186. 'device_replacement' => 'BlackBerry $1',
  5187. 'brand_replacement' => 'BlackBerry',
  5188. 'model_replacement' => '$1',
  5189. ],
  5190. [
  5191. 'regex' => '@Play[Bb]ook.{1,200}RIM Tablet OS@',
  5192. 'device_replacement' => 'BlackBerry Playbook',
  5193. 'brand_replacement' => 'BlackBerry',
  5194. 'model_replacement' => 'Playbook',
  5195. ],
  5196. [
  5197. 'regex' => '@Black[Bb]erry ([0-9]+);@',
  5198. 'device_replacement' => 'BlackBerry $1',
  5199. 'brand_replacement' => 'BlackBerry',
  5200. 'model_replacement' => '$1',
  5201. ],
  5202. [
  5203. 'regex' => '@Black[Bb]erry([0-9]+)@',
  5204. 'device_replacement' => 'BlackBerry $1',
  5205. 'brand_replacement' => 'BlackBerry',
  5206. 'model_replacement' => '$1',
  5207. ],
  5208. [
  5209. 'regex' => '@Black[Bb]erry;@',
  5210. 'device_replacement' => 'BlackBerry',
  5211. 'brand_replacement' => 'BlackBerry',
  5212. ],
  5213. [
  5214. 'regex' => '@(Pre|Pixi)/\\d+\\.\\d+@',
  5215. 'device_replacement' => 'Palm $1',
  5216. 'brand_replacement' => 'Palm',
  5217. 'model_replacement' => '$1',
  5218. ],
  5219. [
  5220. 'regex' => '@Palm([0-9]+)@',
  5221. 'device_replacement' => 'Palm $1',
  5222. 'brand_replacement' => 'Palm',
  5223. 'model_replacement' => '$1',
  5224. ],
  5225. [
  5226. 'regex' => '@Treo([A-Za-z0-9]+)@',
  5227. 'device_replacement' => 'Palm Treo $1',
  5228. 'brand_replacement' => 'Palm',
  5229. 'model_replacement' => 'Treo $1',
  5230. ],
  5231. [
  5232. 'regex' => '@webOS.{0,200}(P160U(?:NA|))/(\\d+).(\\d+)@',
  5233. 'device_replacement' => 'HP Veer',
  5234. 'brand_replacement' => 'HP',
  5235. 'model_replacement' => 'Veer',
  5236. ],
  5237. [
  5238. 'regex' => '@(Touch[Pp]ad)/\\d+\\.\\d+@',
  5239. 'device_replacement' => 'HP TouchPad',
  5240. 'brand_replacement' => 'HP',
  5241. 'model_replacement' => 'TouchPad',
  5242. ],
  5243. [
  5244. 'regex' => '@HPiPAQ([A-Za-z0-9]{1,20})/\\d+\\.\\d+@',
  5245. 'device_replacement' => 'HP iPAQ $1',
  5246. 'brand_replacement' => 'HP',
  5247. 'model_replacement' => 'iPAQ $1',
  5248. ],
  5249. [
  5250. 'regex' => '@PDA; (PalmOS)/sony/model ([a-z]+)/Revision@',
  5251. 'device_replacement' => '$1',
  5252. 'brand_replacement' => 'Sony',
  5253. 'model_replacement' => '$1 $2',
  5254. ],
  5255. [
  5256. 'regex' => '@(Apple\\s?TV)@',
  5257. 'device_replacement' => 'AppleTV',
  5258. 'brand_replacement' => 'Apple',
  5259. 'model_replacement' => 'AppleTV',
  5260. ],
  5261. [
  5262. 'regex' => '@(QtCarBrowser)@',
  5263. 'device_replacement' => 'Tesla Model S',
  5264. 'brand_replacement' => 'Tesla',
  5265. 'model_replacement' => 'Model S',
  5266. ],
  5267. [
  5268. 'regex' => '@(iPhone|iPad|iPod)(\\d+,\\d+)@',
  5269. 'device_replacement' => '$1',
  5270. 'brand_replacement' => 'Apple',
  5271. 'model_replacement' => '$1$2',
  5272. ],
  5273. [
  5274. 'regex' => '@(iPad)(?:;| Simulator;)@',
  5275. 'device_replacement' => '$1',
  5276. 'brand_replacement' => 'Apple',
  5277. 'model_replacement' => '$1',
  5278. ],
  5279. [
  5280. 'regex' => '@(iPod)(?:;| touch;| Simulator;)@',
  5281. 'device_replacement' => '$1',
  5282. 'brand_replacement' => 'Apple',
  5283. 'model_replacement' => '$1',
  5284. ],
  5285. [
  5286. 'regex' => '@(iPhone)(?:;| Simulator;)@',
  5287. 'device_replacement' => '$1',
  5288. 'brand_replacement' => 'Apple',
  5289. 'model_replacement' => '$1',
  5290. ],
  5291. [
  5292. 'regex' => '@(Watch)(\\d+,\\d+)@',
  5293. 'device_replacement' => 'Apple $1',
  5294. 'brand_replacement' => 'Apple',
  5295. 'model_replacement' => '$1$2',
  5296. ],
  5297. [
  5298. 'regex' => '@(Apple Watch)(?:;| Simulator;)@',
  5299. 'device_replacement' => '$1',
  5300. 'brand_replacement' => 'Apple',
  5301. 'model_replacement' => '$1',
  5302. ],
  5303. [
  5304. 'regex' => '@(HomePod)(?:;| Simulator;)@',
  5305. 'device_replacement' => '$1',
  5306. 'brand_replacement' => 'Apple',
  5307. 'model_replacement' => '$1',
  5308. ],
  5309. [
  5310. 'regex' => '@iPhone@',
  5311. 'device_replacement' => 'iPhone',
  5312. 'brand_replacement' => 'Apple',
  5313. 'model_replacement' => 'iPhone',
  5314. ],
  5315. [
  5316. 'regex' => '@CFNetwork/.{0,100} Darwin/\\d.{0,100}\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)@',
  5317. 'device_replacement' => '$1$2,$3',
  5318. 'brand_replacement' => 'Apple',
  5319. 'model_replacement' => '$1$2,$3',
  5320. ],
  5321. [
  5322. 'regex' => '@CFNetwork/.{0,100} Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)@',
  5323. 'device_replacement' => 'Mac',
  5324. 'brand_replacement' => 'Apple',
  5325. 'model_replacement' => 'Mac',
  5326. ],
  5327. [
  5328. 'regex' => '@CFNetwork/.{0,100} Darwin/\\d@',
  5329. 'device_replacement' => 'iOS-Device',
  5330. 'brand_replacement' => 'Apple',
  5331. 'model_replacement' => 'iOS-Device',
  5332. ],
  5333. [
  5334. 'regex' => '@Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone@',
  5335. 'brand_replacement' => 'Apple',
  5336. 'device_replacement' => 'iPhone',
  5337. 'model_replacement' => 'iPhone',
  5338. ],
  5339. [
  5340. 'regex' => '@acer_([A-Za-z0-9]+)_@',
  5341. 'device_replacement' => 'Acer $1',
  5342. 'brand_replacement' => 'Acer',
  5343. 'model_replacement' => '$1',
  5344. ],
  5345. [
  5346. 'regex' => '@(?:ALCATEL|Alcatel)-([A-Za-z0-9\\-]+)@',
  5347. 'device_replacement' => 'Alcatel $1',
  5348. 'brand_replacement' => 'Alcatel',
  5349. 'model_replacement' => '$1',
  5350. ],
  5351. [
  5352. 'regex' => '@(?:Amoi|AMOI)\\-([A-Za-z0-9]+)@',
  5353. 'device_replacement' => 'Amoi $1',
  5354. 'brand_replacement' => 'Amoi',
  5355. 'model_replacement' => '$1',
  5356. ],
  5357. [
  5358. 'regex' => '@(?:; |\\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)@',
  5359. 'device_replacement' => 'Asus $1',
  5360. 'brand_replacement' => 'Asus',
  5361. 'model_replacement' => '$1',
  5362. ],
  5363. [
  5364. 'regex' => '@(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)@',
  5365. 'device_replacement' => 'Asus $1',
  5366. 'brand_replacement' => 'Asus',
  5367. 'model_replacement' => '$1',
  5368. ],
  5369. [
  5370. 'regex' => '@(?:ASUS)_([A-Za-z0-9\\-]+)@',
  5371. 'device_replacement' => 'Asus $1',
  5372. 'brand_replacement' => 'Asus',
  5373. 'model_replacement' => '$1',
  5374. ],
  5375. [
  5376. 'regex' => '@\\bBIRD[ \\-\\.]([A-Za-z0-9]+)@',
  5377. 'device_replacement' => 'Bird $1',
  5378. 'brand_replacement' => 'Bird',
  5379. 'model_replacement' => '$1',
  5380. ],
  5381. [
  5382. 'regex' => '@\\bDell ([A-Za-z0-9]+)@',
  5383. 'device_replacement' => 'Dell $1',
  5384. 'brand_replacement' => 'Dell',
  5385. 'model_replacement' => '$1',
  5386. ],
  5387. [
  5388. 'regex' => '@DoCoMo/2\\.0 ([A-Za-z0-9]+)@',
  5389. 'device_replacement' => 'DoCoMo $1',
  5390. 'brand_replacement' => 'DoCoMo',
  5391. 'model_replacement' => '$1',
  5392. ],
  5393. [
  5394. 'regex' => '@^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA@',
  5395. 'device_replacement' => 'DoCoMo $1',
  5396. 'brand_replacement' => 'DoCoMo',
  5397. 'model_replacement' => '$1',
  5398. ],
  5399. [
  5400. 'regex' => '@^.{0,50}?([A-Za-z0-9]{1,30});FOMA@',
  5401. 'device_replacement' => 'DoCoMo $1',
  5402. 'brand_replacement' => 'DoCoMo',
  5403. 'model_replacement' => '$1',
  5404. ],
  5405. [
  5406. 'regex' => '@\\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)@',
  5407. 'device_replacement' => 'HTC $1',
  5408. 'brand_replacement' => 'HTC',
  5409. 'model_replacement' => '$1',
  5410. ],
  5411. [
  5412. 'regex' => '@Huawei([A-Za-z0-9]+)@',
  5413. 'device_replacement' => 'Huawei $1',
  5414. 'brand_replacement' => 'Huawei',
  5415. 'model_replacement' => '$1',
  5416. ],
  5417. [
  5418. 'regex' => '@HUAWEI-([A-Za-z0-9]+)@',
  5419. 'device_replacement' => 'Huawei $1',
  5420. 'brand_replacement' => 'Huawei',
  5421. 'model_replacement' => '$1',
  5422. ],
  5423. [
  5424. 'regex' => '@HUAWEI ([A-Za-z0-9\\-]+)@',
  5425. 'device_replacement' => 'Huawei $1',
  5426. 'brand_replacement' => 'Huawei',
  5427. 'model_replacement' => '$1',
  5428. ],
  5429. [
  5430. 'regex' => '@vodafone([A-Za-z0-9]+)@',
  5431. 'device_replacement' => 'Huawei Vodafone $1',
  5432. 'brand_replacement' => 'Huawei',
  5433. 'model_replacement' => 'Vodafone $1',
  5434. ],
  5435. [
  5436. 'regex' => '@i\\-mate ([A-Za-z0-9]+)@',
  5437. 'device_replacement' => 'i-mate $1',
  5438. 'brand_replacement' => 'i-mate',
  5439. 'model_replacement' => '$1',
  5440. ],
  5441. [
  5442. 'regex' => '@Kyocera\\-([A-Za-z0-9]+)@',
  5443. 'device_replacement' => 'Kyocera $1',
  5444. 'brand_replacement' => 'Kyocera',
  5445. 'model_replacement' => '$1',
  5446. ],
  5447. [
  5448. 'regex' => '@KWC\\-([A-Za-z0-9]+)@',
  5449. 'device_replacement' => 'Kyocera $1',
  5450. 'brand_replacement' => 'Kyocera',
  5451. 'model_replacement' => '$1',
  5452. ],
  5453. [
  5454. 'regex' => '@Lenovo[_\\-]([A-Za-z0-9]+)@',
  5455. 'device_replacement' => 'Lenovo $1',
  5456. 'brand_replacement' => 'Lenovo',
  5457. 'model_replacement' => '$1',
  5458. ],
  5459. [
  5460. 'regex' => '@(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\( ?;(LG)E ?;([^;]{0,30})@',
  5461. 'device_replacement' => '$1',
  5462. 'brand_replacement' => '$2',
  5463. 'model_replacement' => '$3',
  5464. ],
  5465. [
  5466. 'regex' => '@(HbbTV)/1\\.1\\.1.{0,200}CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]{0,200}?)[;\\s].{0,30}(LF[^;]{1,200});?@',
  5467. 'device_replacement' => '$1',
  5468. 'brand_replacement' => 'Thomson',
  5469. 'model_replacement' => '$4',
  5470. ],
  5471. [
  5472. 'regex' => '@(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); {0,2}CE-HTML(?:/1\\.\\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});@',
  5473. 'device_replacement' => '$1',
  5474. 'brand_replacement' => '$2',
  5475. 'model_replacement' => '$3',
  5476. ],
  5477. [
  5478. 'regex' => '@(HbbTV)/1\\.1\\.1 \\(;;;;;\\) Maple_2011@',
  5479. 'device_replacement' => '$1',
  5480. 'brand_replacement' => 'Samsung',
  5481. ],
  5482. [
  5483. 'regex' => '@(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})@',
  5484. 'device_replacement' => '$1',
  5485. 'brand_replacement' => '$2$3',
  5486. 'model_replacement' => '$4',
  5487. ],
  5488. [
  5489. 'regex' => '@(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+@',
  5490. 'device_replacement' => '$1',
  5491. ],
  5492. [
  5493. 'regex' => '@LGE; (?:Media\\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+@',
  5494. 'device_replacement' => 'NetCast$2',
  5495. 'brand_replacement' => 'LG',
  5496. 'model_replacement' => '$1',
  5497. ],
  5498. [
  5499. 'regex' => '@InettvBrowser/[0-9]{1,30}\\.[0-9A-Z]{1,30} \\([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\\)]{0,10}\\)@',
  5500. 'device_replacement' => 'Inettv',
  5501. 'brand_replacement' => '$1',
  5502. 'model_replacement' => '$2',
  5503. ],
  5504. [
  5505. 'regex' => '@InettvBrowser/[0-9]{1,30}\\.[0-9A-Z]{1,30} \\([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\\)]{0,10}\\)@',
  5506. 'device_replacement' => 'Inettv',
  5507. 'brand_replacement' => 'Generic_Inettv',
  5508. 'model_replacement' => '$1',
  5509. ],
  5510. [
  5511. 'regex' => '@(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)@',
  5512. 'device_replacement' => 'Inettv',
  5513. 'brand_replacement' => 'Generic_Inettv',
  5514. ],
  5515. [
  5516. 'regex' => '@Series60/\\d\\.\\d (LG)[\\-]?([A-Za-z0-9 \\-]+)@',
  5517. 'device_replacement' => '$1 $2',
  5518. 'brand_replacement' => '$1',
  5519. 'model_replacement' => '$2',
  5520. ],
  5521. [
  5522. 'regex' => '@\\b(?:LGE[ \\-]LG\\-(?:AX|)|LGE |LGE?-LG|LGE?[ \\-]|LG[ /\\-]|lg[\\-])([A-Za-z0-9]+)\\b@',
  5523. 'device_replacement' => 'LG $1',
  5524. 'brand_replacement' => 'LG',
  5525. 'model_replacement' => '$1',
  5526. ],
  5527. [
  5528. 'regex' => '@(?:^LG[\\-]?|^LGE[\\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)@',
  5529. 'device_replacement' => 'LG $1',
  5530. 'brand_replacement' => 'LG',
  5531. 'model_replacement' => '$1',
  5532. ],
  5533. [
  5534. 'regex' => '@^LG([0-9]+[A-Za-z]*)@',
  5535. 'device_replacement' => 'LG $1',
  5536. 'brand_replacement' => 'LG',
  5537. 'model_replacement' => '$1',
  5538. ],
  5539. [
  5540. 'regex' => '@(KIN\\.[^ ]+) (\\d+)\\.(\\d+)@',
  5541. 'device_replacement' => 'Microsoft $1',
  5542. 'brand_replacement' => 'Microsoft',
  5543. 'model_replacement' => '$1',
  5544. ],
  5545. [
  5546. 'regex' => '@(?:MSIE|XBMC).{0,200}\\b(Xbox)\\b@',
  5547. 'device_replacement' => '$1',
  5548. 'brand_replacement' => 'Microsoft',
  5549. 'model_replacement' => '$1',
  5550. ],
  5551. [
  5552. 'regex' => '@; ARM; Trident/6\\.0; Touch[\\);]@',
  5553. 'device_replacement' => 'Microsoft Surface RT',
  5554. 'brand_replacement' => 'Microsoft',
  5555. 'model_replacement' => 'Surface RT',
  5556. ],
  5557. [
  5558. 'regex' => '@Motorola\\-([A-Za-z0-9]+)@',
  5559. 'device_replacement' => 'Motorola $1',
  5560. 'brand_replacement' => 'Motorola',
  5561. 'model_replacement' => '$1',
  5562. ],
  5563. [
  5564. 'regex' => '@MOTO\\-([A-Za-z0-9]+)@',
  5565. 'device_replacement' => 'Motorola $1',
  5566. 'brand_replacement' => 'Motorola',
  5567. 'model_replacement' => '$1',
  5568. ],
  5569. [
  5570. 'regex' => '@MOT\\-([A-z0-9][A-z0-9\\-]*)@',
  5571. 'device_replacement' => 'Motorola $1',
  5572. 'brand_replacement' => 'Motorola',
  5573. 'model_replacement' => '$1',
  5574. ],
  5575. [
  5576. 'regex' => '@; (moto[ a-zA-z0-9()]{0,50});((?: Build|.{0,50}\\) AppleWebKit))@',
  5577. 'device_replacement' => '$1',
  5578. 'brand_replacement' => 'Motorola',
  5579. 'model_replacement' => '$1',
  5580. ],
  5581. [
  5582. 'regex' => '@; {0,2}(moto)(.{0,50})(?: Build|\\) AppleWebKit)@',
  5583. 'device_replacement' => 'Motorola$2',
  5584. 'brand_replacement' => 'Motorola',
  5585. 'model_replacement' => '$2',
  5586. ],
  5587. [
  5588. 'regex' => '@Nintendo WiiU@',
  5589. 'device_replacement' => 'Nintendo Wii U',
  5590. 'brand_replacement' => 'Nintendo',
  5591. 'model_replacement' => 'Wii U',
  5592. ],
  5593. [
  5594. 'regex' => '@Nintendo (Switch|DS|3DS|DSi|Wii);@',
  5595. 'device_replacement' => 'Nintendo $1',
  5596. 'brand_replacement' => 'Nintendo',
  5597. 'model_replacement' => '$1',
  5598. ],
  5599. [
  5600. 'regex' => '@(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\\-]+)@',
  5601. 'device_replacement' => 'Pantech $1',
  5602. 'brand_replacement' => 'Pantech',
  5603. 'model_replacement' => '$1',
  5604. ],
  5605. [
  5606. 'regex' => '@Philips([A-Za-z0-9]+)@',
  5607. 'device_replacement' => 'Philips $1',
  5608. 'brand_replacement' => 'Philips',
  5609. 'model_replacement' => '$1',
  5610. ],
  5611. [
  5612. 'regex' => '@Philips ([A-Za-z0-9]+)@',
  5613. 'device_replacement' => 'Philips $1',
  5614. 'brand_replacement' => 'Philips',
  5615. 'model_replacement' => '$1',
  5616. ],
  5617. [
  5618. 'regex' => '@(SMART-TV); .{0,200} Tizen @',
  5619. 'device_replacement' => 'Samsung $1',
  5620. 'brand_replacement' => 'Samsung',
  5621. 'model_replacement' => '$1',
  5622. ],
  5623. [
  5624. 'regex' => '@SymbianOS/9\\.\\d.{0,200} Samsung[/\\-]([A-Za-z0-9 \\-]+)@',
  5625. 'device_replacement' => 'Samsung $1',
  5626. 'brand_replacement' => 'Samsung',
  5627. 'model_replacement' => '$1',
  5628. ],
  5629. [
  5630. 'regex' => '@(Samsung)(SGH)(i[0-9]+)@',
  5631. 'device_replacement' => '$1 $2$3',
  5632. 'brand_replacement' => '$1',
  5633. 'model_replacement' => '$2-$3',
  5634. ],
  5635. [
  5636. 'regex' => '@SAMSUNG-ANDROID-MMS/([^;/]{1,100})@',
  5637. 'device_replacement' => '$1',
  5638. 'brand_replacement' => 'Samsung',
  5639. 'model_replacement' => '$1',
  5640. ],
  5641. [
  5642. 'regex' => '@SAMSUNG(?:; |[ -/])([A-Za-z0-9\\-]+)@i',
  5643. 'device_replacement' => 'Samsung $1',
  5644. 'brand_replacement' => 'Samsung',
  5645. 'model_replacement' => '$1',
  5646. ],
  5647. [
  5648. 'regex' => '@(Dreamcast)@',
  5649. 'device_replacement' => 'Sega $1',
  5650. 'brand_replacement' => 'Sega',
  5651. 'model_replacement' => '$1',
  5652. ],
  5653. [
  5654. 'regex' => '@^SIE-([A-Za-z0-9]+)@',
  5655. 'device_replacement' => 'Siemens $1',
  5656. 'brand_replacement' => 'Siemens',
  5657. 'model_replacement' => '$1',
  5658. ],
  5659. [
  5660. 'regex' => '@Softbank/[12]\\.0/([A-Za-z0-9]+)@',
  5661. 'device_replacement' => 'Softbank $1',
  5662. 'brand_replacement' => 'Softbank',
  5663. 'model_replacement' => '$1',
  5664. ],
  5665. [
  5666. 'regex' => '@SonyEricsson ?([A-Za-z0-9\\-]+)@',
  5667. 'device_replacement' => 'Ericsson $1',
  5668. 'brand_replacement' => 'SonyEricsson',
  5669. 'model_replacement' => '$1',
  5670. ],
  5671. [
  5672. 'regex' => '@Android [^;]{1,200}; ([^ ]+) (Sony)/@',
  5673. 'device_replacement' => '$2 $1',
  5674. 'brand_replacement' => '$2',
  5675. 'model_replacement' => '$1',
  5676. ],
  5677. [
  5678. 'regex' => '@(Sony)(?:BDP\\/|\\/|)([^ /;\\)]+)[ /;\\)]@',
  5679. 'device_replacement' => '$1 $2',
  5680. 'brand_replacement' => '$1',
  5681. 'model_replacement' => '$2',
  5682. ],
  5683. [
  5684. 'regex' => '@Puffin/[\\d\\.]+IT@',
  5685. 'device_replacement' => 'iPad',
  5686. 'brand_replacement' => 'Apple',
  5687. 'model_replacement' => 'iPad',
  5688. ],
  5689. [
  5690. 'regex' => '@Puffin/[\\d\\.]+IP@',
  5691. 'device_replacement' => 'iPhone',
  5692. 'brand_replacement' => 'Apple',
  5693. 'model_replacement' => 'iPhone',
  5694. ],
  5695. [
  5696. 'regex' => '@Puffin/[\\d\\.]+AT@',
  5697. 'device_replacement' => 'Generic Tablet',
  5698. 'brand_replacement' => 'Generic',
  5699. 'model_replacement' => 'Tablet',
  5700. ],
  5701. [
  5702. 'regex' => '@Puffin/[\\d\\.]+AP@',
  5703. 'device_replacement' => 'Generic Smartphone',
  5704. 'brand_replacement' => 'Generic',
  5705. 'model_replacement' => 'Smartphone',
  5706. ],
  5707. [
  5708. 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\\))@',
  5709. 'brand_replacement' => 'Generic_Android',
  5710. 'model_replacement' => '$1',
  5711. ],
  5712. [
  5713. 'regex' => '@Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@',
  5714. 'brand_replacement' => 'Generic_Android',
  5715. 'model_replacement' => '$1',
  5716. ],
  5717. [
  5718. 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@',
  5719. 'brand_replacement' => 'Generic_Android',
  5720. 'model_replacement' => '$1',
  5721. ],
  5722. [
  5723. 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[A-Za-z]{0,2}\\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\\))@',
  5724. 'brand_replacement' => 'Generic_Android',
  5725. 'model_replacement' => '$1',
  5726. ],
  5727. [
  5728. 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,2}[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))@',
  5729. 'device_replacement' => 'Generic Smartphone',
  5730. 'brand_replacement' => 'Generic',
  5731. 'model_replacement' => 'Smartphone',
  5732. ],
  5733. [
  5734. 'regex' => '@Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); {0,3}\\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\\))@',
  5735. 'brand_replacement' => 'Generic_Android',
  5736. 'model_replacement' => '$1',
  5737. ],
  5738. [
  5739. 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\) AppleWebKit).{1,200}? Mobile Safari@',
  5740. 'brand_replacement' => 'Generic_Android',
  5741. 'model_replacement' => '$1',
  5742. ],
  5743. [
  5744. 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\) AppleWebKit).{1,200}? Safari@',
  5745. 'brand_replacement' => 'Generic_Android_Tablet',
  5746. 'model_replacement' => '$1',
  5747. ],
  5748. [
  5749. 'regex' => '@Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]{1,100}?)(?: Build|\\))@',
  5750. 'brand_replacement' => 'Generic_Android',
  5751. 'model_replacement' => '$1',
  5752. ],
  5753. [
  5754. 'regex' => '@(GoogleTV)@',
  5755. 'brand_replacement' => 'Generic_Inettv',
  5756. 'model_replacement' => '$1',
  5757. ],
  5758. [
  5759. 'regex' => '@(WebTV)/\\d+.\\d+@',
  5760. 'brand_replacement' => 'Generic_Inettv',
  5761. 'model_replacement' => '$1',
  5762. ],
  5763. [
  5764. 'regex' => '@^(Roku)/DVP-\\d+\\.\\d+@',
  5765. 'brand_replacement' => 'Generic_Inettv',
  5766. 'model_replacement' => '$1',
  5767. ],
  5768. [
  5769. 'regex' => '@(Android 3\\.\\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))@i',
  5770. 'device_replacement' => 'Generic Tablet',
  5771. 'brand_replacement' => 'Generic',
  5772. 'model_replacement' => 'Tablet',
  5773. ],
  5774. [
  5775. 'regex' => '@(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\\(webOS/|PalmOS)@',
  5776. 'device_replacement' => 'Generic Smartphone',
  5777. 'brand_replacement' => 'Generic',
  5778. 'model_replacement' => 'Smartphone',
  5779. ],
  5780. [
  5781. 'regex' => '@(hiptop|avantgo|plucker|xiino|blazer|elaine)@i',
  5782. 'device_replacement' => 'Generic Smartphone',
  5783. 'brand_replacement' => 'Generic',
  5784. 'model_replacement' => 'Smartphone',
  5785. ],
  5786. [
  5787. 'regex' => '@^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper|RecipeRadar|GPTBot|Google-InspectionTool)@i',
  5788. 'device_replacement' => 'Spider',
  5789. 'brand_replacement' => 'Spider',
  5790. 'model_replacement' => 'Desktop',
  5791. ],
  5792. [
  5793. 'regex' => '@^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bmobile|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|dorado|el(?:38|39|48|49|50|55|58|68)|el[3456]\\d{2}dual|erk0|esl8|ex300|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)@i',
  5794. 'device_replacement' => 'Generic Feature Phone',
  5795. 'brand_replacement' => 'Generic',
  5796. 'model_replacement' => 'Feature Phone',
  5797. ],
  5798. [
  5799. 'regex' => '@^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i\\-mobile|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)@i',
  5800. 'device_replacement' => 'Generic Feature Phone',
  5801. 'brand_replacement' => 'Generic',
  5802. 'model_replacement' => 'Feature Phone',
  5803. ],
  5804. [
  5805. 'regex' => '@^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)@i',
  5806. 'device_replacement' => 'Generic Feature Phone',
  5807. 'brand_replacement' => 'Generic',
  5808. 'model_replacement' => 'Feature Phone',
  5809. ],
  5810. [
  5811. 'regex' => '@^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vertu|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)@i',
  5812. 'device_replacement' => 'Generic Feature Phone',
  5813. 'brand_replacement' => 'Generic',
  5814. 'model_replacement' => 'Feature Phone',
  5815. ],
  5816. [
  5817. 'regex' => '@^(Ice)$@',
  5818. 'device_replacement' => 'Generic Feature Phone',
  5819. 'brand_replacement' => 'Generic',
  5820. 'model_replacement' => 'Feature Phone',
  5821. ],
  5822. [
  5823. 'regex' => '@(wap[\\-\\ ]browser|maui|netfront|obigo|teleca|up\\.browser|midp|Opera Mini)@i',
  5824. 'device_replacement' => 'Generic Feature Phone',
  5825. 'brand_replacement' => 'Generic',
  5826. 'model_replacement' => 'Feature Phone',
  5827. ],
  5828. [
  5829. 'regex' => '@Mac OS@',
  5830. 'device_replacement' => 'Mac',
  5831. 'brand_replacement' => 'Apple',
  5832. 'model_replacement' => 'Mac',
  5833. ],
  5834. ],
  5835. ];