12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017 |
- (global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/vendor"],{
- /***/ 1:
- /*!************************************************************!*\
- !*** ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js ***!
- \************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });exports.createApp = createApp;exports.createComponent = createComponent;exports.createPage = createPage;exports.default = void 0;var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 2));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(Object(source), true).forEach(function (key) {_defineProperty(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(Object(source)).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}function _slicedToArray(arr, i) {return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();}function _nonIterableRest() {throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _iterableToArrayLimit(arr, i) {if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"] != null) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}function _arrayWithHoles(arr) {if (Array.isArray(arr)) return arr;}function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}function _toConsumableArray(arr) {return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();}function _nonIterableSpread() {throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _unsupportedIterableToArray(o, minLen) {if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(o);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);}function _iterableToArray(iter) {if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);}function _arrayWithoutHoles(arr) {if (Array.isArray(arr)) return _arrayLikeToArray(arr);}function _arrayLikeToArray(arr, len) {if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) {arr2[i] = arr[i];}return arr2;}
- var _toString = Object.prototype.toString;
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- function isFn(fn) {
- return typeof fn === 'function';
- }
- function isStr(str) {
- return typeof str === 'string';
- }
- function isPlainObject(obj) {
- return _toString.call(obj) === '[object Object]';
- }
- function hasOwn(obj, key) {
- return hasOwnProperty.call(obj, key);
- }
- function noop() {}
- /**
- * Create a cached version of a pure function.
- */
- function cached(fn) {
- var cache = Object.create(null);
- return function cachedFn(str) {
- var hit = cache[str];
- return hit || (cache[str] = fn(str));
- };
- }
- /**
- * Camelize a hyphen-delimited string.
- */
- var camelizeRE = /-(\w)/g;
- var camelize = cached(function (str) {
- return str.replace(camelizeRE, function (_, c) {return c ? c.toUpperCase() : '';});
- });
- var HOOKS = [
- 'invoke',
- 'success',
- 'fail',
- 'complete',
- 'returnValue'];
- var globalInterceptors = {};
- var scopedInterceptors = {};
- function mergeHook(parentVal, childVal) {
- var res = childVal ?
- parentVal ?
- parentVal.concat(childVal) :
- Array.isArray(childVal) ?
- childVal : [childVal] :
- parentVal;
- return res ?
- dedupeHooks(res) :
- res;
- }
- function dedupeHooks(hooks) {
- var res = [];
- for (var i = 0; i < hooks.length; i++) {
- if (res.indexOf(hooks[i]) === -1) {
- res.push(hooks[i]);
- }
- }
- return res;
- }
- function removeHook(hooks, hook) {
- var index = hooks.indexOf(hook);
- if (index !== -1) {
- hooks.splice(index, 1);
- }
- }
- function mergeInterceptorHook(interceptor, option) {
- Object.keys(option).forEach(function (hook) {
- if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
- interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
- }
- });
- }
- function removeInterceptorHook(interceptor, option) {
- if (!interceptor || !option) {
- return;
- }
- Object.keys(option).forEach(function (hook) {
- if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
- removeHook(interceptor[hook], option[hook]);
- }
- });
- }
- function addInterceptor(method, option) {
- if (typeof method === 'string' && isPlainObject(option)) {
- mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
- } else if (isPlainObject(method)) {
- mergeInterceptorHook(globalInterceptors, method);
- }
- }
- function removeInterceptor(method, option) {
- if (typeof method === 'string') {
- if (isPlainObject(option)) {
- removeInterceptorHook(scopedInterceptors[method], option);
- } else {
- delete scopedInterceptors[method];
- }
- } else if (isPlainObject(method)) {
- removeInterceptorHook(globalInterceptors, method);
- }
- }
- function wrapperHook(hook) {
- return function (data) {
- return hook(data) || data;
- };
- }
- function isPromise(obj) {
- return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
- }
- function queue(hooks, data) {
- var promise = false;
- for (var i = 0; i < hooks.length; i++) {
- var hook = hooks[i];
- if (promise) {
- promise = Promise.resolve(wrapperHook(hook));
- } else {
- var res = hook(data);
- if (isPromise(res)) {
- promise = Promise.resolve(res);
- }
- if (res === false) {
- return {
- then: function then() {} };
- }
- }
- }
- return promise || {
- then: function then(callback) {
- return callback(data);
- } };
- }
- function wrapperOptions(interceptor) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- ['success', 'fail', 'complete'].forEach(function (name) {
- if (Array.isArray(interceptor[name])) {
- var oldCallback = options[name];
- options[name] = function callbackInterceptor(res) {
- queue(interceptor[name], res).then(function (res) {
- /* eslint-disable no-mixed-operators */
- return isFn(oldCallback) && oldCallback(res) || res;
- });
- };
- }
- });
- return options;
- }
- function wrapperReturnValue(method, returnValue) {
- var returnValueHooks = [];
- if (Array.isArray(globalInterceptors.returnValue)) {
- returnValueHooks.push.apply(returnValueHooks, _toConsumableArray(globalInterceptors.returnValue));
- }
- var interceptor = scopedInterceptors[method];
- if (interceptor && Array.isArray(interceptor.returnValue)) {
- returnValueHooks.push.apply(returnValueHooks, _toConsumableArray(interceptor.returnValue));
- }
- returnValueHooks.forEach(function (hook) {
- returnValue = hook(returnValue) || returnValue;
- });
- return returnValue;
- }
- function getApiInterceptorHooks(method) {
- var interceptor = Object.create(null);
- Object.keys(globalInterceptors).forEach(function (hook) {
- if (hook !== 'returnValue') {
- interceptor[hook] = globalInterceptors[hook].slice();
- }
- });
- var scopedInterceptor = scopedInterceptors[method];
- if (scopedInterceptor) {
- Object.keys(scopedInterceptor).forEach(function (hook) {
- if (hook !== 'returnValue') {
- interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
- }
- });
- }
- return interceptor;
- }
- function invokeApi(method, api, options) {for (var _len = arguments.length, params = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {params[_key - 3] = arguments[_key];}
- var interceptor = getApiInterceptorHooks(method);
- if (interceptor && Object.keys(interceptor).length) {
- if (Array.isArray(interceptor.invoke)) {
- var res = queue(interceptor.invoke, options);
- return res.then(function (options) {
- return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
- });
- } else {
- return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
- }
- }
- return api.apply(void 0, [options].concat(params));
- }
- var promiseInterceptor = {
- returnValue: function returnValue(res) {
- if (!isPromise(res)) {
- return res;
- }
- return res.then(function (res) {
- return res[1];
- }).catch(function (res) {
- return res[0];
- });
- } };
- var SYNC_API_RE =
- /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
- var CONTEXT_API_RE = /^create|Manager$/;
- // Context例外情况
- var CONTEXT_API_RE_EXC = ['createBLEConnection'];
- // 同步例外情况
- var ASYNC_API = ['createBLEConnection'];
- var CALLBACK_API_RE = /^on|^off/;
- function isContextApi(name) {
- return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
- }
- function isSyncApi(name) {
- return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
- }
- function isCallbackApi(name) {
- return CALLBACK_API_RE.test(name) && name !== 'onPush';
- }
- function handlePromise(promise) {
- return promise.then(function (data) {
- return [null, data];
- }).
- catch(function (err) {return [err];});
- }
- function shouldPromise(name) {
- if (
- isContextApi(name) ||
- isSyncApi(name) ||
- isCallbackApi(name))
- {
- return false;
- }
- return true;
- }
- /* eslint-disable no-extend-native */
- if (!Promise.prototype.finally) {
- Promise.prototype.finally = function (callback) {
- var promise = this.constructor;
- return this.then(
- function (value) {return promise.resolve(callback()).then(function () {return value;});},
- function (reason) {return promise.resolve(callback()).then(function () {
- throw reason;
- });});
- };
- }
- function promisify(name, api) {
- if (!shouldPromise(name)) {
- return api;
- }
- return function promiseApi() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {params[_key2 - 1] = arguments[_key2];}
- if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
- return wrapperReturnValue(name, invokeApi.apply(void 0, [name, api, options].concat(params)));
- }
- return wrapperReturnValue(name, handlePromise(new Promise(function (resolve, reject) {
- invokeApi.apply(void 0, [name, api, Object.assign({}, options, {
- success: resolve,
- fail: reject })].concat(
- params));
- })));
- };
- }
- var EPS = 1e-4;
- var BASE_DEVICE_WIDTH = 750;
- var isIOS = false;
- var deviceWidth = 0;
- var deviceDPR = 0;
- function checkDeviceWidth() {var _wx$getSystemInfoSync =
- wx.getSystemInfoSync(),platform = _wx$getSystemInfoSync.platform,pixelRatio = _wx$getSystemInfoSync.pixelRatio,windowWidth = _wx$getSystemInfoSync.windowWidth; // uni=>wx runtime 编译目标是 uni 对象,内部不允许直接使用 uni
- deviceWidth = windowWidth;
- deviceDPR = pixelRatio;
- isIOS = platform === 'ios';
- }
- function upx2px(number, newDeviceWidth) {
- if (deviceWidth === 0) {
- checkDeviceWidth();
- }
- number = Number(number);
- if (number === 0) {
- return 0;
- }
- var result = number / BASE_DEVICE_WIDTH * (newDeviceWidth || deviceWidth);
- if (result < 0) {
- result = -result;
- }
- result = Math.floor(result + EPS);
- if (result === 0) {
- if (deviceDPR === 1 || !isIOS) {
- result = 1;
- } else {
- result = 0.5;
- }
- }
- return number < 0 ? -result : result;
- }
- var interceptors = {
- promiseInterceptor: promiseInterceptor };
- var baseApi = /*#__PURE__*/Object.freeze({
- __proto__: null,
- upx2px: upx2px,
- addInterceptor: addInterceptor,
- removeInterceptor: removeInterceptor,
- interceptors: interceptors });var
- EventChannel = /*#__PURE__*/function () {
- function EventChannel(id, events) {var _this = this;_classCallCheck(this, EventChannel);
- this.id = id;
- this.listener = {};
- this.emitCache = {};
- if (events) {
- Object.keys(events).forEach(function (name) {
- _this.on(name, events[name]);
- });
- }
- }_createClass(EventChannel, [{ key: "emit", value: function emit(
- eventName) {for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {args[_key3 - 1] = arguments[_key3];}
- var fns = this.listener[eventName];
- if (!fns) {
- return (this.emitCache[eventName] || (this.emitCache[eventName] = [])).push(args);
- }
- fns.forEach(function (opt) {
- opt.fn.apply(opt.fn, args);
- });
- this.listener[eventName] = fns.filter(function (opt) {return opt.type !== 'once';});
- } }, { key: "on", value: function on(
- eventName, fn) {
- this._addListener(eventName, 'on', fn);
- this._clearCache(eventName);
- } }, { key: "once", value: function once(
- eventName, fn) {
- this._addListener(eventName, 'once', fn);
- this._clearCache(eventName);
- } }, { key: "off", value: function off(
- eventName, fn) {
- var fns = this.listener[eventName];
- if (!fns) {
- return;
- }
- if (fn) {
- for (var i = 0; i < fns.length;) {
- if (fns[i].fn === fn) {
- fns.splice(i, 1);
- i--;
- }
- i++;
- }
- } else {
- delete this.listener[eventName];
- }
- } }, { key: "_clearCache", value: function _clearCache(
- eventName) {
- var cacheArgs = this.emitCache[eventName];
- if (cacheArgs) {
- for (; cacheArgs.length > 0;) {
- this.emit.apply(this, [eventName].concat(cacheArgs.shift()));
- }
- }
- } }, { key: "_addListener", value: function _addListener(
- eventName, type, fn) {
- (this.listener[eventName] || (this.listener[eventName] = [])).push({
- fn: fn,
- type: type });
- } }]);return EventChannel;}();
- var eventChannels = {};
- var eventChannelStack = [];
- var id = 0;
- function initEventChannel(events) {var cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
- id++;
- var eventChannel = new EventChannel(id, events);
- if (cache) {
- eventChannels[id] = eventChannel;
- eventChannelStack.push(eventChannel);
- }
- return eventChannel;
- }
- function getEventChannel(id) {
- if (id) {
- var eventChannel = eventChannels[id];
- delete eventChannels[id];
- return eventChannel;
- }
- return eventChannelStack.shift();
- }
- var navigateTo = {
- args: function args(fromArgs, toArgs) {
- var id = initEventChannel(fromArgs.events).id;
- if (fromArgs.url) {
- fromArgs.url = fromArgs.url + (fromArgs.url.indexOf('?') === -1 ? '?' : '&') + '__id__=' + id;
- }
- },
- returnValue: function returnValue(fromRes, toRes) {
- fromRes.eventChannel = getEventChannel();
- } };
- function findExistsPageIndex(url) {
- var pages = getCurrentPages();
- var len = pages.length;
- while (len--) {
- var page = pages[len];
- if (page.$page && page.$page.fullPath === url) {
- return len;
- }
- }
- return -1;
- }
- var redirectTo = {
- name: function name(fromArgs) {
- if (fromArgs.exists === 'back' && fromArgs.delta) {
- return 'navigateBack';
- }
- return 'redirectTo';
- },
- args: function args(fromArgs) {
- if (fromArgs.exists === 'back' && fromArgs.url) {
- var existsPageIndex = findExistsPageIndex(fromArgs.url);
- if (existsPageIndex !== -1) {
- var delta = getCurrentPages().length - 1 - existsPageIndex;
- if (delta > 0) {
- fromArgs.delta = delta;
- }
- }
- }
- } };
- var previewImage = {
- args: function args(fromArgs) {
- var currentIndex = parseInt(fromArgs.current);
- if (isNaN(currentIndex)) {
- return;
- }
- var urls = fromArgs.urls;
- if (!Array.isArray(urls)) {
- return;
- }
- var len = urls.length;
- if (!len) {
- return;
- }
- if (currentIndex < 0) {
- currentIndex = 0;
- } else if (currentIndex >= len) {
- currentIndex = len - 1;
- }
- if (currentIndex > 0) {
- fromArgs.current = urls[currentIndex];
- fromArgs.urls = urls.filter(
- function (item, index) {return index < currentIndex ? item !== urls[currentIndex] : true;});
- } else {
- fromArgs.current = urls[0];
- }
- return {
- indicator: false,
- loop: false };
- } };
- function addSafeAreaInsets(result) {
- if (result.safeArea) {
- var safeArea = result.safeArea;
- result.safeAreaInsets = {
- top: safeArea.top,
- left: safeArea.left,
- right: result.windowWidth - safeArea.right,
- bottom: result.windowHeight - safeArea.bottom };
- }
- }
- var protocols = {
- redirectTo: redirectTo,
- navigateTo: navigateTo,
- previewImage: previewImage,
- getSystemInfo: {
- returnValue: addSafeAreaInsets },
- getSystemInfoSync: {
- returnValue: addSafeAreaInsets } };
- var todos = [
- 'vibrate',
- 'preloadPage',
- 'unPreloadPage',
- 'loadSubPackage'];
- var canIUses = [];
- var CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
- function processCallback(methodName, method, returnValue) {
- return function (res) {
- return method(processReturnValue(methodName, res, returnValue));
- };
- }
- function processArgs(methodName, fromArgs) {var argsOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};var returnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};var keepFromArgs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
- if (isPlainObject(fromArgs)) {// 一般 api 的参数解析
- var toArgs = keepFromArgs === true ? fromArgs : {}; // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
- if (isFn(argsOption)) {
- argsOption = argsOption(fromArgs, toArgs) || {};
- }
- for (var key in fromArgs) {
- if (hasOwn(argsOption, key)) {
- var keyOption = argsOption[key];
- if (isFn(keyOption)) {
- keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
- }
- if (!keyOption) {// 不支持的参数
- console.warn("\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F ".concat(methodName, "\u6682\u4E0D\u652F\u6301").concat(key));
- } else if (isStr(keyOption)) {// 重写参数 key
- toArgs[keyOption] = fromArgs[key];
- } else if (isPlainObject(keyOption)) {// {name:newName,value:value}可重新指定参数 key:value
- toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
- }
- } else if (CALLBACKS.indexOf(key) !== -1) {
- if (isFn(fromArgs[key])) {
- toArgs[key] = processCallback(methodName, fromArgs[key], returnValue);
- }
- } else {
- if (!keepFromArgs) {
- toArgs[key] = fromArgs[key];
- }
- }
- }
- return toArgs;
- } else if (isFn(fromArgs)) {
- fromArgs = processCallback(methodName, fromArgs, returnValue);
- }
- return fromArgs;
- }
- function processReturnValue(methodName, res, returnValue) {var keepReturnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
- if (isFn(protocols.returnValue)) {// 处理通用 returnValue
- res = protocols.returnValue(methodName, res);
- }
- return processArgs(methodName, res, returnValue, {}, keepReturnValue);
- }
- function wrapper(methodName, method) {
- if (hasOwn(protocols, methodName)) {
- var protocol = protocols[methodName];
- if (!protocol) {// 暂不支持的 api
- return function () {
- console.error("\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F \u6682\u4E0D\u652F\u6301".concat(methodName));
- };
- }
- return function (arg1, arg2) {// 目前 api 最多两个参数
- var options = protocol;
- if (isFn(protocol)) {
- options = protocol(arg1);
- }
- arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
- var args = [arg1];
- if (typeof arg2 !== 'undefined') {
- args.push(arg2);
- }
- if (isFn(options.name)) {
- methodName = options.name(arg1);
- } else if (isStr(options.name)) {
- methodName = options.name;
- }
- var returnValue = wx[methodName].apply(wx, args);
- if (isSyncApi(methodName)) {// 同步 api
- return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
- }
- return returnValue;
- };
- }
- return method;
- }
- var todoApis = Object.create(null);
- var TODOS = [
- 'onTabBarMidButtonTap',
- 'subscribePush',
- 'unsubscribePush',
- 'onPush',
- 'offPush',
- 'share'];
- function createTodoApi(name) {
- return function todoApi(_ref)
- {var fail = _ref.fail,complete = _ref.complete;
- var res = {
- errMsg: "".concat(name, ":fail:\u6682\u4E0D\u652F\u6301 ").concat(name, " \u65B9\u6CD5") };
- isFn(fail) && fail(res);
- isFn(complete) && complete(res);
- };
- }
- TODOS.forEach(function (name) {
- todoApis[name] = createTodoApi(name);
- });
- var providers = {
- oauth: ['weixin'],
- share: ['weixin'],
- payment: ['wxpay'],
- push: ['weixin'] };
- function getProvider(_ref2)
- {var service = _ref2.service,success = _ref2.success,fail = _ref2.fail,complete = _ref2.complete;
- var res = false;
- if (providers[service]) {
- res = {
- errMsg: 'getProvider:ok',
- service: service,
- provider: providers[service] };
- isFn(success) && success(res);
- } else {
- res = {
- errMsg: 'getProvider:fail:服务[' + service + ']不存在' };
- isFn(fail) && fail(res);
- }
- isFn(complete) && complete(res);
- }
- var extraApi = /*#__PURE__*/Object.freeze({
- __proto__: null,
- getProvider: getProvider });
- var getEmitter = function () {
- var Emitter;
- return function getUniEmitter() {
- if (!Emitter) {
- Emitter = new _vue.default();
- }
- return Emitter;
- };
- }();
- function apply(ctx, method, args) {
- return ctx[method].apply(ctx, args);
- }
- function $on() {
- return apply(getEmitter(), '$on', Array.prototype.slice.call(arguments));
- }
- function $off() {
- return apply(getEmitter(), '$off', Array.prototype.slice.call(arguments));
- }
- function $once() {
- return apply(getEmitter(), '$once', Array.prototype.slice.call(arguments));
- }
- function $emit() {
- return apply(getEmitter(), '$emit', Array.prototype.slice.call(arguments));
- }
- var eventApi = /*#__PURE__*/Object.freeze({
- __proto__: null,
- $on: $on,
- $off: $off,
- $once: $once,
- $emit: $emit });
- var api = /*#__PURE__*/Object.freeze({
- __proto__: null });
- var MPPage = Page;
- var MPComponent = Component;
- var customizeRE = /:/g;
- var customize = cached(function (str) {
- return camelize(str.replace(customizeRE, '-'));
- });
- function initTriggerEvent(mpInstance) {
- {
- if (!wx.canIUse('nextTick')) {
- return;
- }
- }
- var oldTriggerEvent = mpInstance.triggerEvent;
- mpInstance.triggerEvent = function (event) {for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {args[_key4 - 1] = arguments[_key4];}
- return oldTriggerEvent.apply(mpInstance, [customize(event)].concat(args));
- };
- }
- function initHook(name, options) {
- var oldHook = options[name];
- if (!oldHook) {
- options[name] = function () {
- initTriggerEvent(this);
- };
- } else {
- options[name] = function () {
- initTriggerEvent(this);for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {args[_key5] = arguments[_key5];}
- return oldHook.apply(this, args);
- };
- }
- }
- Page = function Page() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- initHook('onLoad', options);
- return MPPage(options);
- };
- Component = function Component() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- initHook('created', options);
- return MPComponent(options);
- };
- var PAGE_EVENT_HOOKS = [
- 'onPullDownRefresh',
- 'onReachBottom',
- 'onAddToFavorites',
- 'onShareTimeline',
- 'onShareAppMessage',
- 'onPageScroll',
- 'onResize',
- 'onTabItemTap'];
- function initMocks(vm, mocks) {
- var mpInstance = vm.$mp[vm.mpType];
- mocks.forEach(function (mock) {
- if (hasOwn(mpInstance, mock)) {
- vm[mock] = mpInstance[mock];
- }
- });
- }
- function hasHook(hook, vueOptions) {
- if (!vueOptions) {
- return true;
- }
- if (_vue.default.options && Array.isArray(_vue.default.options[hook])) {
- return true;
- }
- vueOptions = vueOptions.default || vueOptions;
- if (isFn(vueOptions)) {
- if (isFn(vueOptions.extendOptions[hook])) {
- return true;
- }
- if (vueOptions.super &&
- vueOptions.super.options &&
- Array.isArray(vueOptions.super.options[hook])) {
- return true;
- }
- return false;
- }
- if (isFn(vueOptions[hook])) {
- return true;
- }
- var mixins = vueOptions.mixins;
- if (Array.isArray(mixins)) {
- return !!mixins.find(function (mixin) {return hasHook(hook, mixin);});
- }
- }
- function initHooks(mpOptions, hooks, vueOptions) {
- hooks.forEach(function (hook) {
- if (hasHook(hook, vueOptions)) {
- mpOptions[hook] = function (args) {
- return this.$vm && this.$vm.__call_hook(hook, args);
- };
- }
- });
- }
- function initVueComponent(Vue, vueOptions) {
- vueOptions = vueOptions.default || vueOptions;
- var VueComponent;
- if (isFn(vueOptions)) {
- VueComponent = vueOptions;
- } else {
- VueComponent = Vue.extend(vueOptions);
- }
- vueOptions = VueComponent.options;
- return [VueComponent, vueOptions];
- }
- function initSlots(vm, vueSlots) {
- if (Array.isArray(vueSlots) && vueSlots.length) {
- var $slots = Object.create(null);
- vueSlots.forEach(function (slotName) {
- $slots[slotName] = true;
- });
- vm.$scopedSlots = vm.$slots = $slots;
- }
- }
- function initVueIds(vueIds, mpInstance) {
- vueIds = (vueIds || '').split(',');
- var len = vueIds.length;
- if (len === 1) {
- mpInstance._$vueId = vueIds[0];
- } else if (len === 2) {
- mpInstance._$vueId = vueIds[0];
- mpInstance._$vuePid = vueIds[1];
- }
- }
- function initData(vueOptions, context) {
- var data = vueOptions.data || {};
- var methods = vueOptions.methods || {};
- if (typeof data === 'function') {
- try {
- data = data.call(context); // 支持 Vue.prototype 上挂的数据
- } catch (e) {
- if (Object({"NODE_ENV":"development","VUE_APP_PLATFORM":"mp-weixin","BASE_URL":"/"}).VUE_APP_DEBUG) {
- console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data);
- }
- }
- } else {
- try {
- // 对 data 格式化
- data = JSON.parse(JSON.stringify(data));
- } catch (e) {}
- }
- if (!isPlainObject(data)) {
- data = {};
- }
- Object.keys(methods).forEach(function (methodName) {
- if (context.__lifecycle_hooks__.indexOf(methodName) === -1 && !hasOwn(data, methodName)) {
- data[methodName] = methods[methodName];
- }
- });
- return data;
- }
- var PROP_TYPES = [String, Number, Boolean, Object, Array, null];
- function createObserver(name) {
- return function observer(newVal, oldVal) {
- if (this.$vm) {
- this.$vm[name] = newVal; // 为了触发其他非 render watcher
- }
- };
- }
- function initBehaviors(vueOptions, initBehavior) {
- var vueBehaviors = vueOptions.behaviors;
- var vueExtends = vueOptions.extends;
- var vueMixins = vueOptions.mixins;
- var vueProps = vueOptions.props;
- if (!vueProps) {
- vueOptions.props = vueProps = [];
- }
- var behaviors = [];
- if (Array.isArray(vueBehaviors)) {
- vueBehaviors.forEach(function (behavior) {
- behaviors.push(behavior.replace('uni://', "wx".concat("://")));
- if (behavior === 'uni://form-field') {
- if (Array.isArray(vueProps)) {
- vueProps.push('name');
- vueProps.push('value');
- } else {
- vueProps.name = {
- type: String,
- default: '' };
- vueProps.value = {
- type: [String, Number, Boolean, Array, Object, Date],
- default: '' };
- }
- }
- });
- }
- if (isPlainObject(vueExtends) && vueExtends.props) {
- behaviors.push(
- initBehavior({
- properties: initProperties(vueExtends.props, true) }));
- }
- if (Array.isArray(vueMixins)) {
- vueMixins.forEach(function (vueMixin) {
- if (isPlainObject(vueMixin) && vueMixin.props) {
- behaviors.push(
- initBehavior({
- properties: initProperties(vueMixin.props, true) }));
- }
- });
- }
- return behaviors;
- }
- function parsePropType(key, type, defaultValue, file) {
- // [String]=>String
- if (Array.isArray(type) && type.length === 1) {
- return type[0];
- }
- return type;
- }
- function initProperties(props) {var isBehavior = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
- var properties = {};
- if (!isBehavior) {
- properties.vueId = {
- type: String,
- value: '' };
- // 用于字节跳动小程序模拟抽象节点
- properties.generic = {
- type: Object,
- value: null };
- properties.vueSlots = { // 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
- type: null,
- value: [],
- observer: function observer(newVal, oldVal) {
- var $slots = Object.create(null);
- newVal.forEach(function (slotName) {
- $slots[slotName] = true;
- });
- this.setData({
- $slots: $slots });
- } };
- }
- if (Array.isArray(props)) {// ['title']
- props.forEach(function (key) {
- properties[key] = {
- type: null,
- observer: createObserver(key) };
- });
- } else if (isPlainObject(props)) {// {title:{type:String,default:''},content:String}
- Object.keys(props).forEach(function (key) {
- var opts = props[key];
- if (isPlainObject(opts)) {// title:{type:String,default:''}
- var value = opts.default;
- if (isFn(value)) {
- value = value();
- }
- opts.type = parsePropType(key, opts.type);
- properties[key] = {
- type: PROP_TYPES.indexOf(opts.type) !== -1 ? opts.type : null,
- value: value,
- observer: createObserver(key) };
- } else {// content:String
- var type = parsePropType(key, opts);
- properties[key] = {
- type: PROP_TYPES.indexOf(type) !== -1 ? type : null,
- observer: createObserver(key) };
- }
- });
- }
- return properties;
- }
- function wrapper$1(event) {
- // TODO 又得兼容 mpvue 的 mp 对象
- try {
- event.mp = JSON.parse(JSON.stringify(event));
- } catch (e) {}
- event.stopPropagation = noop;
- event.preventDefault = noop;
- event.target = event.target || {};
- if (!hasOwn(event, 'detail')) {
- event.detail = {};
- }
- if (hasOwn(event, 'markerId')) {
- event.detail = typeof event.detail === 'object' ? event.detail : {};
- event.detail.markerId = event.markerId;
- }
- if (isPlainObject(event.detail)) {
- event.target = Object.assign({}, event.target, event.detail);
- }
- return event;
- }
- function getExtraValue(vm, dataPathsArray) {
- var context = vm;
- dataPathsArray.forEach(function (dataPathArray) {
- var dataPath = dataPathArray[0];
- var value = dataPathArray[2];
- if (dataPath || typeof value !== 'undefined') {// ['','',index,'disable']
- var propPath = dataPathArray[1];
- var valuePath = dataPathArray[3];
- var vFor;
- if (Number.isInteger(dataPath)) {
- vFor = dataPath;
- } else if (!dataPath) {
- vFor = context;
- } else if (typeof dataPath === 'string' && dataPath) {
- if (dataPath.indexOf('#s#') === 0) {
- vFor = dataPath.substr(3);
- } else {
- vFor = vm.__get_value(dataPath, context);
- }
- }
- if (Number.isInteger(vFor)) {
- context = value;
- } else if (!propPath) {
- context = vFor[value];
- } else {
- if (Array.isArray(vFor)) {
- context = vFor.find(function (vForItem) {
- return vm.__get_value(propPath, vForItem) === value;
- });
- } else if (isPlainObject(vFor)) {
- context = Object.keys(vFor).find(function (vForKey) {
- return vm.__get_value(propPath, vFor[vForKey]) === value;
- });
- } else {
- console.error('v-for 暂不支持循环数据:', vFor);
- }
- }
- if (valuePath) {
- context = vm.__get_value(valuePath, context);
- }
- }
- });
- return context;
- }
- function processEventExtra(vm, extra, event) {
- var extraObj = {};
- if (Array.isArray(extra) && extra.length) {
- /**
- *[
- * ['data.items', 'data.id', item.data.id],
- * ['metas', 'id', meta.id]
- *],
- *[
- * ['data.items', 'data.id', item.data.id],
- * ['metas', 'id', meta.id]
- *],
- *'test'
- */
- extra.forEach(function (dataPath, index) {
- if (typeof dataPath === 'string') {
- if (!dataPath) {// model,prop.sync
- extraObj['$' + index] = vm;
- } else {
- if (dataPath === '$event') {// $event
- extraObj['$' + index] = event;
- } else if (dataPath === 'arguments') {
- if (event.detail && event.detail.__args__) {
- extraObj['$' + index] = event.detail.__args__;
- } else {
- extraObj['$' + index] = [event];
- }
- } else if (dataPath.indexOf('$event.') === 0) {// $event.target.value
- extraObj['$' + index] = vm.__get_value(dataPath.replace('$event.', ''), event);
- } else {
- extraObj['$' + index] = vm.__get_value(dataPath);
- }
- }
- } else {
- extraObj['$' + index] = getExtraValue(vm, dataPath);
- }
- });
- }
- return extraObj;
- }
- function getObjByArray(arr) {
- var obj = {};
- for (var i = 1; i < arr.length; i++) {
- var element = arr[i];
- obj[element[0]] = element[1];
- }
- return obj;
- }
- function processEventArgs(vm, event) {var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];var extra = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];var isCustom = arguments.length > 4 ? arguments[4] : undefined;var methodName = arguments.length > 5 ? arguments[5] : undefined;
- var isCustomMPEvent = false; // wxcomponent 组件,传递原始 event 对象
- if (isCustom) {// 自定义事件
- isCustomMPEvent = event.currentTarget &&
- event.currentTarget.dataset &&
- event.currentTarget.dataset.comType === 'wx';
- if (!args.length) {// 无参数,直接传入 event 或 detail 数组
- if (isCustomMPEvent) {
- return [event];
- }
- return event.detail.__args__ || event.detail;
- }
- }
- var extraObj = processEventExtra(vm, extra, event);
- var ret = [];
- args.forEach(function (arg) {
- if (arg === '$event') {
- if (methodName === '__set_model' && !isCustom) {// input v-model value
- ret.push(event.target.value);
- } else {
- if (isCustom && !isCustomMPEvent) {
- ret.push(event.detail.__args__[0]);
- } else {// wxcomponent 组件或内置组件
- ret.push(event);
- }
- }
- } else {
- if (Array.isArray(arg) && arg[0] === 'o') {
- ret.push(getObjByArray(arg));
- } else if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
- ret.push(extraObj[arg]);
- } else {
- ret.push(arg);
- }
- }
- });
- return ret;
- }
- var ONCE = '~';
- var CUSTOM = '^';
- function isMatchEventType(eventType, optType) {
- return eventType === optType ||
- optType === 'regionchange' && (
- eventType === 'begin' ||
- eventType === 'end');
- }
- function getContextVm(vm) {
- var $parent = vm.$parent;
- // 父组件是 scoped slots 或者其他自定义组件时继续查找
- while ($parent && $parent.$parent && ($parent.$options.generic || $parent.$parent.$options.generic || $parent.$scope._$vuePid)) {
- $parent = $parent.$parent;
- }
- return $parent && $parent.$parent;
- }
- function handleEvent(event) {var _this2 = this;
- event = wrapper$1(event);
- // [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
- var dataset = (event.currentTarget || event.target).dataset;
- if (!dataset) {
- return console.warn('事件信息不存在');
- }
- var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
- if (!eventOpts) {
- return console.warn('事件信息不存在');
- }
- // [['handle',[1,2,a]],['handle1',[1,2,a]]]
- var eventType = event.type;
- var ret = [];
- eventOpts.forEach(function (eventOpt) {
- var type = eventOpt[0];
- var eventsArray = eventOpt[1];
- var isCustom = type.charAt(0) === CUSTOM;
- type = isCustom ? type.slice(1) : type;
- var isOnce = type.charAt(0) === ONCE;
- type = isOnce ? type.slice(1) : type;
- if (eventsArray && isMatchEventType(eventType, type)) {
- eventsArray.forEach(function (eventArray) {
- var methodName = eventArray[0];
- if (methodName) {
- var handlerCtx = _this2.$vm;
- if (handlerCtx.$options.generic) {// mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
- handlerCtx = getContextVm(handlerCtx) || handlerCtx;
- }
- if (methodName === '$emit') {
- handlerCtx.$emit.apply(handlerCtx,
- processEventArgs(
- _this2.$vm,
- event,
- eventArray[1],
- eventArray[2],
- isCustom,
- methodName));
- return;
- }
- var handler = handlerCtx[methodName];
- if (!isFn(handler)) {
- throw new Error(" _vm.".concat(methodName, " is not a function"));
- }
- if (isOnce) {
- if (handler.once) {
- return;
- }
- handler.once = true;
- }
- var params = processEventArgs(
- _this2.$vm,
- event,
- eventArray[1],
- eventArray[2],
- isCustom,
- methodName);
- // 参数尾部增加原始事件对象用于复杂表达式内获取额外数据
- // eslint-disable-next-line no-sparse-arrays
- ret.push(handler.apply(handlerCtx, (Array.isArray(params) ? params : []).concat([,,,,,,,,,, event])));
- }
- });
- }
- });
- if (
- eventType === 'input' &&
- ret.length === 1 &&
- typeof ret[0] !== 'undefined')
- {
- return ret[0];
- }
- }
- var hooks = [
- 'onShow',
- 'onHide',
- 'onError',
- 'onPageNotFound',
- 'onThemeChange',
- 'onUnhandledRejection'];
- function parseBaseApp(vm, _ref3)
- {var mocks = _ref3.mocks,initRefs = _ref3.initRefs;
- if (vm.$options.store) {
- _vue.default.prototype.$store = vm.$options.store;
- }
- _vue.default.prototype.mpHost = "mp-weixin";
- _vue.default.mixin({
- beforeCreate: function beforeCreate() {
- if (!this.$options.mpType) {
- return;
- }
- this.mpType = this.$options.mpType;
- this.$mp = _defineProperty({
- data: {} },
- this.mpType, this.$options.mpInstance);
- this.$scope = this.$options.mpInstance;
- delete this.$options.mpType;
- delete this.$options.mpInstance;
- if (this.mpType !== 'app') {
- initRefs(this);
- initMocks(this, mocks);
- }
- } });
- var appOptions = {
- onLaunch: function onLaunch(args) {
- if (this.$vm) {// 已经初始化过了,主要是为了百度,百度 onShow 在 onLaunch 之前
- return;
- }
- {
- if (!wx.canIUse('nextTick')) {// 事实 上2.2.3 即可,简单使用 2.3.0 的 nextTick 判断
- console.error('当前微信基础库版本过低,请将 微信开发者工具-详情-项目设置-调试基础库版本 更换为`2.3.0`以上');
- }
- }
- this.$vm = vm;
- this.$vm.$mp = {
- app: this };
- this.$vm.$scope = this;
- // vm 上也挂载 globalData
- this.$vm.globalData = this.globalData;
- this.$vm._isMounted = true;
- this.$vm.__call_hook('mounted', args);
- this.$vm.__call_hook('onLaunch', args);
- } };
- // 兼容旧版本 globalData
- appOptions.globalData = vm.$options.globalData || {};
- // 将 methods 中的方法挂在 getApp() 中
- var methods = vm.$options.methods;
- if (methods) {
- Object.keys(methods).forEach(function (name) {
- appOptions[name] = methods[name];
- });
- }
- initHooks(appOptions, hooks);
- return appOptions;
- }
- var mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__'];
- function findVmByVueId(vm, vuePid) {
- var $children = vm.$children;
- // 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
- for (var i = $children.length - 1; i >= 0; i--) {
- var childVm = $children[i];
- if (childVm.$scope._$vueId === vuePid) {
- return childVm;
- }
- }
- // 反向递归查找
- var parentVm;
- for (var _i = $children.length - 1; _i >= 0; _i--) {
- parentVm = findVmByVueId($children[_i], vuePid);
- if (parentVm) {
- return parentVm;
- }
- }
- }
- function initBehavior(options) {
- return Behavior(options);
- }
- function isPage() {
- return !!this.route;
- }
- function initRelation(detail) {
- this.triggerEvent('__l', detail);
- }
- function initRefs(vm) {
- var mpInstance = vm.$scope;
- Object.defineProperty(vm, '$refs', {
- get: function get() {
- var $refs = {};
- var components = mpInstance.selectAllComponents('.vue-ref');
- components.forEach(function (component) {
- var ref = component.dataset.ref;
- $refs[ref] = component.$vm || component;
- });
- var forComponents = mpInstance.selectAllComponents('.vue-ref-in-for');
- forComponents.forEach(function (component) {
- var ref = component.dataset.ref;
- if (!$refs[ref]) {
- $refs[ref] = [];
- }
- $refs[ref].push(component.$vm || component);
- });
- return $refs;
- } });
- }
- function handleLink(event) {var _ref4 =
- event.detail || event.value,vuePid = _ref4.vuePid,vueOptions = _ref4.vueOptions; // detail 是微信,value 是百度(dipatch)
- var parentVm;
- if (vuePid) {
- parentVm = findVmByVueId(this.$vm, vuePid);
- }
- if (!parentVm) {
- parentVm = this.$vm;
- }
- vueOptions.parent = parentVm;
- }
- function parseApp(vm) {
- return parseBaseApp(vm, {
- mocks: mocks,
- initRefs: initRefs });
- }
- function createApp(vm) {
- _vue.default.prototype.getOpenerEventChannel = function () {
- if (!this.__eventChannel__) {
- this.__eventChannel__ = new EventChannel();
- }
- return this.__eventChannel__;
- };
- var callHook = _vue.default.prototype.__call_hook;
- _vue.default.prototype.__call_hook = function (hook, args) {
- if (hook === 'onLoad' && args && args.__id__) {
- this.__eventChannel__ = getEventChannel(args.__id__);
- delete args.__id__;
- }
- return callHook.call(this, hook, args);
- };
- App(parseApp(vm));
- return vm;
- }
- var encodeReserveRE = /[!'()*]/g;
- var encodeReserveReplacer = function encodeReserveReplacer(c) {return '%' + c.charCodeAt(0).toString(16);};
- var commaRE = /%2C/g;
- // fixed encodeURIComponent which is more conformant to RFC3986:
- // - escapes [!'()*]
- // - preserve commas
- var encode = function encode(str) {return encodeURIComponent(str).
- replace(encodeReserveRE, encodeReserveReplacer).
- replace(commaRE, ',');};
- function stringifyQuery(obj) {var encodeStr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : encode;
- var res = obj ? Object.keys(obj).map(function (key) {
- var val = obj[key];
- if (val === undefined) {
- return '';
- }
- if (val === null) {
- return encodeStr(key);
- }
- if (Array.isArray(val)) {
- var result = [];
- val.forEach(function (val2) {
- if (val2 === undefined) {
- return;
- }
- if (val2 === null) {
- result.push(encodeStr(key));
- } else {
- result.push(encodeStr(key) + '=' + encodeStr(val2));
- }
- });
- return result.join('&');
- }
- return encodeStr(key) + '=' + encodeStr(val);
- }).filter(function (x) {return x.length > 0;}).join('&') : null;
- return res ? "?".concat(res) : '';
- }
- function parseBaseComponent(vueComponentOptions)
- {var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},isPage = _ref5.isPage,initRelation = _ref5.initRelation;var _initVueComponent =
- initVueComponent(_vue.default, vueComponentOptions),_initVueComponent2 = _slicedToArray(_initVueComponent, 2),VueComponent = _initVueComponent2[0],vueOptions = _initVueComponent2[1];
- var options = _objectSpread({
- multipleSlots: true,
- addGlobalClass: true },
- vueOptions.options || {});
- {
- // 微信 multipleSlots 部分情况有 bug,导致内容顺序错乱 如 u-list,提供覆盖选项
- if (vueOptions['mp-weixin'] && vueOptions['mp-weixin'].options) {
- Object.assign(options, vueOptions['mp-weixin'].options);
- }
- }
- var componentOptions = {
- options: options,
- data: initData(vueOptions, _vue.default.prototype),
- behaviors: initBehaviors(vueOptions, initBehavior),
- properties: initProperties(vueOptions.props, false, vueOptions.__file),
- lifetimes: {
- attached: function attached() {
- var properties = this.properties;
- var options = {
- mpType: isPage.call(this) ? 'page' : 'component',
- mpInstance: this,
- propsData: properties };
- initVueIds(properties.vueId, this);
- // 处理父子关系
- initRelation.call(this, {
- vuePid: this._$vuePid,
- vueOptions: options });
- // 初始化 vue 实例
- this.$vm = new VueComponent(options);
- // 处理$slots,$scopedSlots(暂不支持动态变化$slots)
- initSlots(this.$vm, properties.vueSlots);
- // 触发首次 setData
- this.$vm.$mount();
- },
- ready: function ready() {
- // 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
- // https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
- if (this.$vm) {
- this.$vm._isMounted = true;
- this.$vm.__call_hook('mounted');
- this.$vm.__call_hook('onReady');
- }
- },
- detached: function detached() {
- this.$vm && this.$vm.$destroy();
- } },
- pageLifetimes: {
- show: function show(args) {
- this.$vm && this.$vm.__call_hook('onPageShow', args);
- },
- hide: function hide() {
- this.$vm && this.$vm.__call_hook('onPageHide');
- },
- resize: function resize(size) {
- this.$vm && this.$vm.__call_hook('onPageResize', size);
- } },
- methods: {
- __l: handleLink,
- __e: handleEvent } };
- // externalClasses
- if (vueOptions.externalClasses) {
- componentOptions.externalClasses = vueOptions.externalClasses;
- }
- if (Array.isArray(vueOptions.wxsCallMethods)) {
- vueOptions.wxsCallMethods.forEach(function (callMethod) {
- componentOptions.methods[callMethod] = function (args) {
- return this.$vm[callMethod](args);
- };
- });
- }
- if (isPage) {
- return componentOptions;
- }
- return [componentOptions, VueComponent];
- }
- function parseComponent(vueComponentOptions) {
- return parseBaseComponent(vueComponentOptions, {
- isPage: isPage,
- initRelation: initRelation });
- }
- var hooks$1 = [
- 'onShow',
- 'onHide',
- 'onUnload'];
- hooks$1.push.apply(hooks$1, PAGE_EVENT_HOOKS);
- function parseBasePage(vuePageOptions, _ref6)
- {var isPage = _ref6.isPage,initRelation = _ref6.initRelation;
- var pageOptions = parseComponent(vuePageOptions);
- initHooks(pageOptions.methods, hooks$1, vuePageOptions);
- pageOptions.methods.onLoad = function (query) {
- this.options = query;
- var copyQuery = Object.assign({}, query);
- delete copyQuery.__id__;
- this.$page = {
- fullPath: '/' + (this.route || this.is) + stringifyQuery(copyQuery) };
- this.$vm.$mp.query = query; // 兼容 mpvue
- this.$vm.__call_hook('onLoad', query);
- };
- return pageOptions;
- }
- function parsePage(vuePageOptions) {
- return parseBasePage(vuePageOptions, {
- isPage: isPage,
- initRelation: initRelation });
- }
- function createPage(vuePageOptions) {
- {
- return Component(parsePage(vuePageOptions));
- }
- }
- function createComponent(vueOptions) {
- {
- return Component(parseComponent(vueOptions));
- }
- }
- todos.forEach(function (todoApi) {
- protocols[todoApi] = false;
- });
- canIUses.forEach(function (canIUseApi) {
- var apiName = protocols[canIUseApi] && protocols[canIUseApi].name ? protocols[canIUseApi].name :
- canIUseApi;
- if (!wx.canIUse(apiName)) {
- protocols[canIUseApi] = false;
- }
- });
- var uni = {};
- if (typeof Proxy !== 'undefined' && "mp-weixin" !== 'app-plus') {
- uni = new Proxy({}, {
- get: function get(target, name) {
- if (hasOwn(target, name)) {
- return target[name];
- }
- if (baseApi[name]) {
- return baseApi[name];
- }
- if (api[name]) {
- return promisify(name, api[name]);
- }
- {
- if (extraApi[name]) {
- return promisify(name, extraApi[name]);
- }
- if (todoApis[name]) {
- return promisify(name, todoApis[name]);
- }
- }
- if (eventApi[name]) {
- return eventApi[name];
- }
- if (!hasOwn(wx, name) && !hasOwn(protocols, name)) {
- return;
- }
- return promisify(name, wrapper(name, wx[name]));
- },
- set: function set(target, name, value) {
- target[name] = value;
- return true;
- } });
- } else {
- Object.keys(baseApi).forEach(function (name) {
- uni[name] = baseApi[name];
- });
- {
- Object.keys(todoApis).forEach(function (name) {
- uni[name] = promisify(name, todoApis[name]);
- });
- Object.keys(extraApi).forEach(function (name) {
- uni[name] = promisify(name, todoApis[name]);
- });
- }
- Object.keys(eventApi).forEach(function (name) {
- uni[name] = eventApi[name];
- });
- Object.keys(api).forEach(function (name) {
- uni[name] = promisify(name, api[name]);
- });
- Object.keys(wx).forEach(function (name) {
- if (hasOwn(wx, name) || hasOwn(protocols, name)) {
- uni[name] = promisify(name, wrapper(name, wx[name]));
- }
- });
- }
- wx.createApp = createApp;
- wx.createPage = createPage;
- wx.createComponent = createComponent;
- var uni$1 = uni;var _default =
- uni$1;exports.default = _default;
- /***/ }),
- /***/ 10:
- /*!**********************************************************************************************************!*\
- !*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js ***!
- \**********************************************************************************************************/
- /*! exports provided: default */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return normalizeComponent; });
- /* globals __VUE_SSR_CONTEXT__ */
- // IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
- // This module is a runtime utility for cleaner component module output and will
- // be included in the final webpack user bundle.
- function normalizeComponent (
- scriptExports,
- render,
- staticRenderFns,
- functionalTemplate,
- injectStyles,
- scopeId,
- moduleIdentifier, /* server only */
- shadowMode, /* vue-cli only */
- components, // fixed by xxxxxx auto components
- renderjs // fixed by xxxxxx renderjs
- ) {
- // Vue.extend constructor export interop
- var options = typeof scriptExports === 'function'
- ? scriptExports.options
- : scriptExports
- // fixed by xxxxxx auto components
- if (components) {
- if (!options.components) {
- options.components = {}
- }
- var hasOwn = Object.prototype.hasOwnProperty
- for (var name in components) {
- if (hasOwn.call(components, name) && !hasOwn.call(options.components, name)) {
- options.components[name] = components[name]
- }
- }
- }
- // fixed by xxxxxx renderjs
- if (renderjs) {
- (renderjs.beforeCreate || (renderjs.beforeCreate = [])).unshift(function() {
- this[renderjs.__module] = this
- });
- (options.mixins || (options.mixins = [])).push(renderjs)
- }
- // render functions
- if (render) {
- options.render = render
- options.staticRenderFns = staticRenderFns
- options._compiled = true
- }
- // functional template
- if (functionalTemplate) {
- options.functional = true
- }
- // scopedId
- if (scopeId) {
- options._scopeId = 'data-v-' + scopeId
- }
- var hook
- if (moduleIdentifier) { // server build
- hook = function (context) {
- // 2.3 injection
- context =
- context || // cached call
- (this.$vnode && this.$vnode.ssrContext) || // stateful
- (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
- // 2.2 with runInNewContext: true
- if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
- context = __VUE_SSR_CONTEXT__
- }
- // inject component styles
- if (injectStyles) {
- injectStyles.call(this, context)
- }
- // register component module identifier for async chunk inferrence
- if (context && context._registeredComponents) {
- context._registeredComponents.add(moduleIdentifier)
- }
- }
- // used by ssr in case component is cached and beforeCreate
- // never gets called
- options._ssrRegister = hook
- } else if (injectStyles) {
- hook = shadowMode
- ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }
- : injectStyles
- }
- if (hook) {
- if (options.functional) {
- // for template-only hot-reload because in that case the render fn doesn't
- // go through the normalizer
- options._injectStyles = hook
- // register for functioal component in vue file
- var originalRender = options.render
- options.render = function renderWithStyleInjection (h, context) {
- hook.call(context)
- return originalRender(h, context)
- }
- } else {
- // inject component registration as beforeCreate hook
- var existing = options.beforeCreate
- options.beforeCreate = existing
- ? [].concat(existing, hook)
- : [hook]
- }
- }
- return {
- exports: scriptExports,
- options: options
- }
- }
- /***/ }),
- /***/ 2:
- /*!******************************************************************************************!*\
- !*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/mp-vue/dist/mp.runtime.esm.js ***!
- \******************************************************************************************/
- /*! exports provided: default */
- /***/ (function(module, __webpack_exports__, __webpack_require__) {
- "use strict";
- __webpack_require__.r(__webpack_exports__);
- /* WEBPACK VAR INJECTION */(function(global) {/*!
- * Vue.js v2.6.11
- * (c) 2014-2020 Evan You
- * Released under the MIT License.
- */
- /* */
- var emptyObject = Object.freeze({});
- // These helpers produce better VM code in JS engines due to their
- // explicitness and function inlining.
- function isUndef (v) {
- return v === undefined || v === null
- }
- function isDef (v) {
- return v !== undefined && v !== null
- }
- function isTrue (v) {
- return v === true
- }
- function isFalse (v) {
- return v === false
- }
- /**
- * Check if value is primitive.
- */
- function isPrimitive (value) {
- return (
- typeof value === 'string' ||
- typeof value === 'number' ||
- // $flow-disable-line
- typeof value === 'symbol' ||
- typeof value === 'boolean'
- )
- }
- /**
- * Quick object check - this is primarily used to tell
- * Objects from primitive values when we know the value
- * is a JSON-compliant type.
- */
- function isObject (obj) {
- return obj !== null && typeof obj === 'object'
- }
- /**
- * Get the raw type string of a value, e.g., [object Object].
- */
- var _toString = Object.prototype.toString;
- function toRawType (value) {
- return _toString.call(value).slice(8, -1)
- }
- /**
- * Strict object type check. Only returns true
- * for plain JavaScript objects.
- */
- function isPlainObject (obj) {
- return _toString.call(obj) === '[object Object]'
- }
- function isRegExp (v) {
- return _toString.call(v) === '[object RegExp]'
- }
- /**
- * Check if val is a valid array index.
- */
- function isValidArrayIndex (val) {
- var n = parseFloat(String(val));
- return n >= 0 && Math.floor(n) === n && isFinite(val)
- }
- function isPromise (val) {
- return (
- isDef(val) &&
- typeof val.then === 'function' &&
- typeof val.catch === 'function'
- )
- }
- /**
- * Convert a value to a string that is actually rendered.
- */
- function toString (val) {
- return val == null
- ? ''
- : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
- ? JSON.stringify(val, null, 2)
- : String(val)
- }
- /**
- * Convert an input value to a number for persistence.
- * If the conversion fails, return original string.
- */
- function toNumber (val) {
- var n = parseFloat(val);
- return isNaN(n) ? val : n
- }
- /**
- * Make a map and return a function for checking if a key
- * is in that map.
- */
- function makeMap (
- str,
- expectsLowerCase
- ) {
- var map = Object.create(null);
- var list = str.split(',');
- for (var i = 0; i < list.length; i++) {
- map[list[i]] = true;
- }
- return expectsLowerCase
- ? function (val) { return map[val.toLowerCase()]; }
- : function (val) { return map[val]; }
- }
- /**
- * Check if a tag is a built-in tag.
- */
- var isBuiltInTag = makeMap('slot,component', true);
- /**
- * Check if an attribute is a reserved attribute.
- */
- var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
- /**
- * Remove an item from an array.
- */
- function remove (arr, item) {
- if (arr.length) {
- var index = arr.indexOf(item);
- if (index > -1) {
- return arr.splice(index, 1)
- }
- }
- }
- /**
- * Check whether an object has the property.
- */
- var hasOwnProperty = Object.prototype.hasOwnProperty;
- function hasOwn (obj, key) {
- return hasOwnProperty.call(obj, key)
- }
- /**
- * Create a cached version of a pure function.
- */
- function cached (fn) {
- var cache = Object.create(null);
- return (function cachedFn (str) {
- var hit = cache[str];
- return hit || (cache[str] = fn(str))
- })
- }
- /**
- * Camelize a hyphen-delimited string.
- */
- var camelizeRE = /-(\w)/g;
- var camelize = cached(function (str) {
- return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
- });
- /**
- * Capitalize a string.
- */
- var capitalize = cached(function (str) {
- return str.charAt(0).toUpperCase() + str.slice(1)
- });
- /**
- * Hyphenate a camelCase string.
- */
- var hyphenateRE = /\B([A-Z])/g;
- var hyphenate = cached(function (str) {
- return str.replace(hyphenateRE, '-$1').toLowerCase()
- });
- /**
- * Simple bind polyfill for environments that do not support it,
- * e.g., PhantomJS 1.x. Technically, we don't need this anymore
- * since native bind is now performant enough in most browsers.
- * But removing it would mean breaking code that was able to run in
- * PhantomJS 1.x, so this must be kept for backward compatibility.
- */
- /* istanbul ignore next */
- function polyfillBind (fn, ctx) {
- function boundFn (a) {
- var l = arguments.length;
- return l
- ? l > 1
- ? fn.apply(ctx, arguments)
- : fn.call(ctx, a)
- : fn.call(ctx)
- }
- boundFn._length = fn.length;
- return boundFn
- }
- function nativeBind (fn, ctx) {
- return fn.bind(ctx)
- }
- var bind = Function.prototype.bind
- ? nativeBind
- : polyfillBind;
- /**
- * Convert an Array-like object to a real Array.
- */
- function toArray (list, start) {
- start = start || 0;
- var i = list.length - start;
- var ret = new Array(i);
- while (i--) {
- ret[i] = list[i + start];
- }
- return ret
- }
- /**
- * Mix properties into target object.
- */
- function extend (to, _from) {
- for (var key in _from) {
- to[key] = _from[key];
- }
- return to
- }
- /**
- * Merge an Array of Objects into a single Object.
- */
- function toObject (arr) {
- var res = {};
- for (var i = 0; i < arr.length; i++) {
- if (arr[i]) {
- extend(res, arr[i]);
- }
- }
- return res
- }
- /* eslint-disable no-unused-vars */
- /**
- * Perform no operation.
- * Stubbing args to make Flow happy without leaving useless transpiled code
- * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
- */
- function noop (a, b, c) {}
- /**
- * Always return false.
- */
- var no = function (a, b, c) { return false; };
- /* eslint-enable no-unused-vars */
- /**
- * Return the same value.
- */
- var identity = function (_) { return _; };
- /**
- * Check if two values are loosely equal - that is,
- * if they are plain objects, do they have the same shape?
- */
- function looseEqual (a, b) {
- if (a === b) { return true }
- var isObjectA = isObject(a);
- var isObjectB = isObject(b);
- if (isObjectA && isObjectB) {
- try {
- var isArrayA = Array.isArray(a);
- var isArrayB = Array.isArray(b);
- if (isArrayA && isArrayB) {
- return a.length === b.length && a.every(function (e, i) {
- return looseEqual(e, b[i])
- })
- } else if (a instanceof Date && b instanceof Date) {
- return a.getTime() === b.getTime()
- } else if (!isArrayA && !isArrayB) {
- var keysA = Object.keys(a);
- var keysB = Object.keys(b);
- return keysA.length === keysB.length && keysA.every(function (key) {
- return looseEqual(a[key], b[key])
- })
- } else {
- /* istanbul ignore next */
- return false
- }
- } catch (e) {
- /* istanbul ignore next */
- return false
- }
- } else if (!isObjectA && !isObjectB) {
- return String(a) === String(b)
- } else {
- return false
- }
- }
- /**
- * Return the first index at which a loosely equal value can be
- * found in the array (if value is a plain object, the array must
- * contain an object of the same shape), or -1 if it is not present.
- */
- function looseIndexOf (arr, val) {
- for (var i = 0; i < arr.length; i++) {
- if (looseEqual(arr[i], val)) { return i }
- }
- return -1
- }
- /**
- * Ensure a function is called only once.
- */
- function once (fn) {
- var called = false;
- return function () {
- if (!called) {
- called = true;
- fn.apply(this, arguments);
- }
- }
- }
- var ASSET_TYPES = [
- 'component',
- 'directive',
- 'filter'
- ];
- var LIFECYCLE_HOOKS = [
- 'beforeCreate',
- 'created',
- 'beforeMount',
- 'mounted',
- 'beforeUpdate',
- 'updated',
- 'beforeDestroy',
- 'destroyed',
- 'activated',
- 'deactivated',
- 'errorCaptured',
- 'serverPrefetch'
- ];
- /* */
- var config = ({
- /**
- * Option merge strategies (used in core/util/options)
- */
- // $flow-disable-line
- optionMergeStrategies: Object.create(null),
- /**
- * Whether to suppress warnings.
- */
- silent: false,
- /**
- * Show production mode tip message on boot?
- */
- productionTip: "development" !== 'production',
- /**
- * Whether to enable devtools
- */
- devtools: "development" !== 'production',
- /**
- * Whether to record perf
- */
- performance: false,
- /**
- * Error handler for watcher errors
- */
- errorHandler: null,
- /**
- * Warn handler for watcher warns
- */
- warnHandler: null,
- /**
- * Ignore certain custom elements
- */
- ignoredElements: [],
- /**
- * Custom user key aliases for v-on
- */
- // $flow-disable-line
- keyCodes: Object.create(null),
- /**
- * Check if a tag is reserved so that it cannot be registered as a
- * component. This is platform-dependent and may be overwritten.
- */
- isReservedTag: no,
- /**
- * Check if an attribute is reserved so that it cannot be used as a component
- * prop. This is platform-dependent and may be overwritten.
- */
- isReservedAttr: no,
- /**
- * Check if a tag is an unknown element.
- * Platform-dependent.
- */
- isUnknownElement: no,
- /**
- * Get the namespace of an element
- */
- getTagNamespace: noop,
- /**
- * Parse the real tag name for the specific platform.
- */
- parsePlatformTagName: identity,
- /**
- * Check if an attribute must be bound using property, e.g. value
- * Platform-dependent.
- */
- mustUseProp: no,
- /**
- * Perform updates asynchronously. Intended to be used by Vue Test Utils
- * This will significantly reduce performance if set to false.
- */
- async: true,
- /**
- * Exposed for legacy reasons
- */
- _lifecycleHooks: LIFECYCLE_HOOKS
- });
- /* */
- /**
- * unicode letters used for parsing html tags, component names and property paths.
- * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
- * skipping \u10000-\uEFFFF due to it freezing up PhantomJS
- */
- var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
- /**
- * Check if a string starts with $ or _
- */
- function isReserved (str) {
- var c = (str + '').charCodeAt(0);
- return c === 0x24 || c === 0x5F
- }
- /**
- * Define a property.
- */
- function def (obj, key, val, enumerable) {
- Object.defineProperty(obj, key, {
- value: val,
- enumerable: !!enumerable,
- writable: true,
- configurable: true
- });
- }
- /**
- * Parse simple path.
- */
- var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
- function parsePath (path) {
- if (bailRE.test(path)) {
- return
- }
- var segments = path.split('.');
- return function (obj) {
- for (var i = 0; i < segments.length; i++) {
- if (!obj) { return }
- obj = obj[segments[i]];
- }
- return obj
- }
- }
- /* */
- // can we use __proto__?
- var hasProto = '__proto__' in {};
- // Browser environment sniffing
- var inBrowser = typeof window !== 'undefined';
- var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
- var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
- var UA = inBrowser && window.navigator.userAgent.toLowerCase();
- var isIE = UA && /msie|trident/.test(UA);
- var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
- var isEdge = UA && UA.indexOf('edge/') > 0;
- var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
- var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
- var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
- var isPhantomJS = UA && /phantomjs/.test(UA);
- var isFF = UA && UA.match(/firefox\/(\d+)/);
- // Firefox has a "watch" function on Object.prototype...
- var nativeWatch = ({}).watch;
- if (inBrowser) {
- try {
- var opts = {};
- Object.defineProperty(opts, 'passive', ({
- get: function get () {
- }
- })); // https://github.com/facebook/flow/issues/285
- window.addEventListener('test-passive', null, opts);
- } catch (e) {}
- }
- // this needs to be lazy-evaled because vue may be required before
- // vue-server-renderer can set VUE_ENV
- var _isServer;
- var isServerRendering = function () {
- if (_isServer === undefined) {
- /* istanbul ignore if */
- if (!inBrowser && !inWeex && typeof global !== 'undefined') {
- // detect presence of vue-server-renderer and avoid
- // Webpack shimming the process
- _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
- } else {
- _isServer = false;
- }
- }
- return _isServer
- };
- // detect devtools
- var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
- /* istanbul ignore next */
- function isNative (Ctor) {
- return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
- }
- var hasSymbol =
- typeof Symbol !== 'undefined' && isNative(Symbol) &&
- typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
- var _Set;
- /* istanbul ignore if */ // $flow-disable-line
- if (typeof Set !== 'undefined' && isNative(Set)) {
- // use native Set when available.
- _Set = Set;
- } else {
- // a non-standard Set polyfill that only works with primitive keys.
- _Set = /*@__PURE__*/(function () {
- function Set () {
- this.set = Object.create(null);
- }
- Set.prototype.has = function has (key) {
- return this.set[key] === true
- };
- Set.prototype.add = function add (key) {
- this.set[key] = true;
- };
- Set.prototype.clear = function clear () {
- this.set = Object.create(null);
- };
- return Set;
- }());
- }
- /* */
- var warn = noop;
- var tip = noop;
- var generateComponentTrace = (noop); // work around flow check
- var formatComponentName = (noop);
- if (true) {
- var hasConsole = typeof console !== 'undefined';
- var classifyRE = /(?:^|[-_])(\w)/g;
- var classify = function (str) { return str
- .replace(classifyRE, function (c) { return c.toUpperCase(); })
- .replace(/[-_]/g, ''); };
- warn = function (msg, vm) {
- var trace = vm ? generateComponentTrace(vm) : '';
- if (config.warnHandler) {
- config.warnHandler.call(null, msg, vm, trace);
- } else if (hasConsole && (!config.silent)) {
- console.error(("[Vue warn]: " + msg + trace));
- }
- };
- tip = function (msg, vm) {
- if (hasConsole && (!config.silent)) {
- console.warn("[Vue tip]: " + msg + (
- vm ? generateComponentTrace(vm) : ''
- ));
- }
- };
- formatComponentName = function (vm, includeFile) {
- if (vm.$root === vm) {
- if (vm.$options && vm.$options.__file) { // fixed by xxxxxx
- return ('') + vm.$options.__file
- }
- return '<Root>'
- }
- var options = typeof vm === 'function' && vm.cid != null
- ? vm.options
- : vm._isVue
- ? vm.$options || vm.constructor.options
- : vm;
- var name = options.name || options._componentTag;
- var file = options.__file;
- if (!name && file) {
- var match = file.match(/([^/\\]+)\.vue$/);
- name = match && match[1];
- }
- return (
- (name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
- (file && includeFile !== false ? (" at " + file) : '')
- )
- };
- var repeat = function (str, n) {
- var res = '';
- while (n) {
- if (n % 2 === 1) { res += str; }
- if (n > 1) { str += str; }
- n >>= 1;
- }
- return res
- };
- generateComponentTrace = function (vm) {
- if (vm._isVue && vm.$parent) {
- var tree = [];
- var currentRecursiveSequence = 0;
- while (vm && vm.$options.name !== 'PageBody') {
- if (tree.length > 0) {
- var last = tree[tree.length - 1];
- if (last.constructor === vm.constructor) {
- currentRecursiveSequence++;
- vm = vm.$parent;
- continue
- } else if (currentRecursiveSequence > 0) {
- tree[tree.length - 1] = [last, currentRecursiveSequence];
- currentRecursiveSequence = 0;
- }
- }
- !vm.$options.isReserved && tree.push(vm);
- vm = vm.$parent;
- }
- return '\n\nfound in\n\n' + tree
- .map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
- ? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
- : formatComponentName(vm))); })
- .join('\n')
- } else {
- return ("\n\n(found in " + (formatComponentName(vm)) + ")")
- }
- };
- }
- /* */
- var uid = 0;
- /**
- * A dep is an observable that can have multiple
- * directives subscribing to it.
- */
- var Dep = function Dep () {
- this.id = uid++;
- this.subs = [];
- };
- Dep.prototype.addSub = function addSub (sub) {
- this.subs.push(sub);
- };
- Dep.prototype.removeSub = function removeSub (sub) {
- remove(this.subs, sub);
- };
- Dep.prototype.depend = function depend () {
- if (Dep.SharedObject.target) {
- Dep.SharedObject.target.addDep(this);
- }
- };
- Dep.prototype.notify = function notify () {
- // stabilize the subscriber list first
- var subs = this.subs.slice();
- if ( true && !config.async) {
- // subs aren't sorted in scheduler if not running async
- // we need to sort them now to make sure they fire in correct
- // order
- subs.sort(function (a, b) { return a.id - b.id; });
- }
- for (var i = 0, l = subs.length; i < l; i++) {
- subs[i].update();
- }
- };
- // The current target watcher being evaluated.
- // This is globally unique because only one watcher
- // can be evaluated at a time.
- // fixed by xxxxxx (nvue shared vuex)
- /* eslint-disable no-undef */
- Dep.SharedObject = {};
- Dep.SharedObject.target = null;
- Dep.SharedObject.targetStack = [];
- function pushTarget (target) {
- Dep.SharedObject.targetStack.push(target);
- Dep.SharedObject.target = target;
- }
- function popTarget () {
- Dep.SharedObject.targetStack.pop();
- Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];
- }
- /* */
- var VNode = function VNode (
- tag,
- data,
- children,
- text,
- elm,
- context,
- componentOptions,
- asyncFactory
- ) {
- this.tag = tag;
- this.data = data;
- this.children = children;
- this.text = text;
- this.elm = elm;
- this.ns = undefined;
- this.context = context;
- this.fnContext = undefined;
- this.fnOptions = undefined;
- this.fnScopeId = undefined;
- this.key = data && data.key;
- this.componentOptions = componentOptions;
- this.componentInstance = undefined;
- this.parent = undefined;
- this.raw = false;
- this.isStatic = false;
- this.isRootInsert = true;
- this.isComment = false;
- this.isCloned = false;
- this.isOnce = false;
- this.asyncFactory = asyncFactory;
- this.asyncMeta = undefined;
- this.isAsyncPlaceholder = false;
- };
- var prototypeAccessors = { child: { configurable: true } };
- // DEPRECATED: alias for componentInstance for backwards compat.
- /* istanbul ignore next */
- prototypeAccessors.child.get = function () {
- return this.componentInstance
- };
- Object.defineProperties( VNode.prototype, prototypeAccessors );
- var createEmptyVNode = function (text) {
- if ( text === void 0 ) text = '';
- var node = new VNode();
- node.text = text;
- node.isComment = true;
- return node
- };
- function createTextVNode (val) {
- return new VNode(undefined, undefined, undefined, String(val))
- }
- // optimized shallow clone
- // used for static nodes and slot nodes because they may be reused across
- // multiple renders, cloning them avoids errors when DOM manipulations rely
- // on their elm reference.
- function cloneVNode (vnode) {
- var cloned = new VNode(
- vnode.tag,
- vnode.data,
- // #7975
- // clone children array to avoid mutating original in case of cloning
- // a child.
- vnode.children && vnode.children.slice(),
- vnode.text,
- vnode.elm,
- vnode.context,
- vnode.componentOptions,
- vnode.asyncFactory
- );
- cloned.ns = vnode.ns;
- cloned.isStatic = vnode.isStatic;
- cloned.key = vnode.key;
- cloned.isComment = vnode.isComment;
- cloned.fnContext = vnode.fnContext;
- cloned.fnOptions = vnode.fnOptions;
- cloned.fnScopeId = vnode.fnScopeId;
- cloned.asyncMeta = vnode.asyncMeta;
- cloned.isCloned = true;
- return cloned
- }
- /*
- * not type checking this file because flow doesn't play well with
- * dynamically accessing methods on Array prototype
- */
- var arrayProto = Array.prototype;
- var arrayMethods = Object.create(arrayProto);
- var methodsToPatch = [
- 'push',
- 'pop',
- 'shift',
- 'unshift',
- 'splice',
- 'sort',
- 'reverse'
- ];
- /**
- * Intercept mutating methods and emit events
- */
- methodsToPatch.forEach(function (method) {
- // cache original method
- var original = arrayProto[method];
- def(arrayMethods, method, function mutator () {
- var args = [], len = arguments.length;
- while ( len-- ) args[ len ] = arguments[ len ];
- var result = original.apply(this, args);
- var ob = this.__ob__;
- var inserted;
- switch (method) {
- case 'push':
- case 'unshift':
- inserted = args;
- break
- case 'splice':
- inserted = args.slice(2);
- break
- }
- if (inserted) { ob.observeArray(inserted); }
- // notify change
- ob.dep.notify();
- return result
- });
- });
- /* */
- var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
- /**
- * In some cases we may want to disable observation inside a component's
- * update computation.
- */
- var shouldObserve = true;
- function toggleObserving (value) {
- shouldObserve = value;
- }
- /**
- * Observer class that is attached to each observed
- * object. Once attached, the observer converts the target
- * object's property keys into getter/setters that
- * collect dependencies and dispatch updates.
- */
- var Observer = function Observer (value) {
- this.value = value;
- this.dep = new Dep();
- this.vmCount = 0;
- def(value, '__ob__', this);
- if (Array.isArray(value)) {
- if (hasProto) {
- {// fixed by xxxxxx 微信小程序使用 plugins 之后,数组方法被直接挂载到了数组对象上,需要执行 copyAugment 逻辑
- if(value.push !== value.__proto__.push){
- copyAugment(value, arrayMethods, arrayKeys);
- } else {
- protoAugment(value, arrayMethods);
- }
- }
- } else {
- copyAugment(value, arrayMethods, arrayKeys);
- }
- this.observeArray(value);
- } else {
- this.walk(value);
- }
- };
- /**
- * Walk through all properties and convert them into
- * getter/setters. This method should only be called when
- * value type is Object.
- */
- Observer.prototype.walk = function walk (obj) {
- var keys = Object.keys(obj);
- for (var i = 0; i < keys.length; i++) {
- defineReactive$$1(obj, keys[i]);
- }
- };
- /**
- * Observe a list of Array items.
- */
- Observer.prototype.observeArray = function observeArray (items) {
- for (var i = 0, l = items.length; i < l; i++) {
- observe(items[i]);
- }
- };
- // helpers
- /**
- * Augment a target Object or Array by intercepting
- * the prototype chain using __proto__
- */
- function protoAugment (target, src) {
- /* eslint-disable no-proto */
- target.__proto__ = src;
- /* eslint-enable no-proto */
- }
- /**
- * Augment a target Object or Array by defining
- * hidden properties.
- */
- /* istanbul ignore next */
- function copyAugment (target, src, keys) {
- for (var i = 0, l = keys.length; i < l; i++) {
- var key = keys[i];
- def(target, key, src[key]);
- }
- }
- /**
- * Attempt to create an observer instance for a value,
- * returns the new observer if successfully observed,
- * or the existing observer if the value already has one.
- */
- function observe (value, asRootData) {
- if (!isObject(value) || value instanceof VNode) {
- return
- }
- var ob;
- if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
- ob = value.__ob__;
- } else if (
- shouldObserve &&
- !isServerRendering() &&
- (Array.isArray(value) || isPlainObject(value)) &&
- Object.isExtensible(value) &&
- !value._isVue
- ) {
- ob = new Observer(value);
- }
- if (asRootData && ob) {
- ob.vmCount++;
- }
- return ob
- }
- /**
- * Define a reactive property on an Object.
- */
- function defineReactive$$1 (
- obj,
- key,
- val,
- customSetter,
- shallow
- ) {
- var dep = new Dep();
- var property = Object.getOwnPropertyDescriptor(obj, key);
- if (property && property.configurable === false) {
- return
- }
- // cater for pre-defined getter/setters
- var getter = property && property.get;
- var setter = property && property.set;
- if ((!getter || setter) && arguments.length === 2) {
- val = obj[key];
- }
- var childOb = !shallow && observe(val);
- Object.defineProperty(obj, key, {
- enumerable: true,
- configurable: true,
- get: function reactiveGetter () {
- var value = getter ? getter.call(obj) : val;
- if (Dep.SharedObject.target) { // fixed by xxxxxx
- dep.depend();
- if (childOb) {
- childOb.dep.depend();
- if (Array.isArray(value)) {
- dependArray(value);
- }
- }
- }
- return value
- },
- set: function reactiveSetter (newVal) {
- var value = getter ? getter.call(obj) : val;
- /* eslint-disable no-self-compare */
- if (newVal === value || (newVal !== newVal && value !== value)) {
- return
- }
- /* eslint-enable no-self-compare */
- if ( true && customSetter) {
- customSetter();
- }
- // #7981: for accessor properties without setter
- if (getter && !setter) { return }
- if (setter) {
- setter.call(obj, newVal);
- } else {
- val = newVal;
- }
- childOb = !shallow && observe(newVal);
- dep.notify();
- }
- });
- }
- /**
- * Set a property on an object. Adds the new property and
- * triggers change notification if the property doesn't
- * already exist.
- */
- function set (target, key, val) {
- if ( true &&
- (isUndef(target) || isPrimitive(target))
- ) {
- warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
- }
- if (Array.isArray(target) && isValidArrayIndex(key)) {
- target.length = Math.max(target.length, key);
- target.splice(key, 1, val);
- return val
- }
- if (key in target && !(key in Object.prototype)) {
- target[key] = val;
- return val
- }
- var ob = (target).__ob__;
- if (target._isVue || (ob && ob.vmCount)) {
- true && warn(
- 'Avoid adding reactive properties to a Vue instance or its root $data ' +
- 'at runtime - declare it upfront in the data option.'
- );
- return val
- }
- if (!ob) {
- target[key] = val;
- return val
- }
- defineReactive$$1(ob.value, key, val);
- ob.dep.notify();
- return val
- }
- /**
- * Delete a property and trigger change if necessary.
- */
- function del (target, key) {
- if ( true &&
- (isUndef(target) || isPrimitive(target))
- ) {
- warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
- }
- if (Array.isArray(target) && isValidArrayIndex(key)) {
- target.splice(key, 1);
- return
- }
- var ob = (target).__ob__;
- if (target._isVue || (ob && ob.vmCount)) {
- true && warn(
- 'Avoid deleting properties on a Vue instance or its root $data ' +
- '- just set it to null.'
- );
- return
- }
- if (!hasOwn(target, key)) {
- return
- }
- delete target[key];
- if (!ob) {
- return
- }
- ob.dep.notify();
- }
- /**
- * Collect dependencies on array elements when the array is touched, since
- * we cannot intercept array element access like property getters.
- */
- function dependArray (value) {
- for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
- e = value[i];
- e && e.__ob__ && e.__ob__.dep.depend();
- if (Array.isArray(e)) {
- dependArray(e);
- }
- }
- }
- /* */
- /**
- * Option overwriting strategies are functions that handle
- * how to merge a parent option value and a child option
- * value into the final value.
- */
- var strats = config.optionMergeStrategies;
- /**
- * Options with restrictions
- */
- if (true) {
- strats.el = strats.propsData = function (parent, child, vm, key) {
- if (!vm) {
- warn(
- "option \"" + key + "\" can only be used during instance " +
- 'creation with the `new` keyword.'
- );
- }
- return defaultStrat(parent, child)
- };
- }
- /**
- * Helper that recursively merges two data objects together.
- */
- function mergeData (to, from) {
- if (!from) { return to }
- var key, toVal, fromVal;
- var keys = hasSymbol
- ? Reflect.ownKeys(from)
- : Object.keys(from);
- for (var i = 0; i < keys.length; i++) {
- key = keys[i];
- // in case the object is already observed...
- if (key === '__ob__') { continue }
- toVal = to[key];
- fromVal = from[key];
- if (!hasOwn(to, key)) {
- set(to, key, fromVal);
- } else if (
- toVal !== fromVal &&
- isPlainObject(toVal) &&
- isPlainObject(fromVal)
- ) {
- mergeData(toVal, fromVal);
- }
- }
- return to
- }
- /**
- * Data
- */
- function mergeDataOrFn (
- parentVal,
- childVal,
- vm
- ) {
- if (!vm) {
- // in a Vue.extend merge, both should be functions
- if (!childVal) {
- return parentVal
- }
- if (!parentVal) {
- return childVal
- }
- // when parentVal & childVal are both present,
- // we need to return a function that returns the
- // merged result of both functions... no need to
- // check if parentVal is a function here because
- // it has to be a function to pass previous merges.
- return function mergedDataFn () {
- return mergeData(
- typeof childVal === 'function' ? childVal.call(this, this) : childVal,
- typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
- )
- }
- } else {
- return function mergedInstanceDataFn () {
- // instance merge
- var instanceData = typeof childVal === 'function'
- ? childVal.call(vm, vm)
- : childVal;
- var defaultData = typeof parentVal === 'function'
- ? parentVal.call(vm, vm)
- : parentVal;
- if (instanceData) {
- return mergeData(instanceData, defaultData)
- } else {
- return defaultData
- }
- }
- }
- }
- strats.data = function (
- parentVal,
- childVal,
- vm
- ) {
- if (!vm) {
- if (childVal && typeof childVal !== 'function') {
- true && warn(
- 'The "data" option should be a function ' +
- 'that returns a per-instance value in component ' +
- 'definitions.',
- vm
- );
- return parentVal
- }
- return mergeDataOrFn(parentVal, childVal)
- }
- return mergeDataOrFn(parentVal, childVal, vm)
- };
- /**
- * Hooks and props are merged as arrays.
- */
- function mergeHook (
- parentVal,
- childVal
- ) {
- var res = childVal
- ? parentVal
- ? parentVal.concat(childVal)
- : Array.isArray(childVal)
- ? childVal
- : [childVal]
- : parentVal;
- return res
- ? dedupeHooks(res)
- : res
- }
- function dedupeHooks (hooks) {
- var res = [];
- for (var i = 0; i < hooks.length; i++) {
- if (res.indexOf(hooks[i]) === -1) {
- res.push(hooks[i]);
- }
- }
- return res
- }
- LIFECYCLE_HOOKS.forEach(function (hook) {
- strats[hook] = mergeHook;
- });
- /**
- * Assets
- *
- * When a vm is present (instance creation), we need to do
- * a three-way merge between constructor options, instance
- * options and parent options.
- */
- function mergeAssets (
- parentVal,
- childVal,
- vm,
- key
- ) {
- var res = Object.create(parentVal || null);
- if (childVal) {
- true && assertObjectType(key, childVal, vm);
- return extend(res, childVal)
- } else {
- return res
- }
- }
- ASSET_TYPES.forEach(function (type) {
- strats[type + 's'] = mergeAssets;
- });
- /**
- * Watchers.
- *
- * Watchers hashes should not overwrite one
- * another, so we merge them as arrays.
- */
- strats.watch = function (
- parentVal,
- childVal,
- vm,
- key
- ) {
- // work around Firefox's Object.prototype.watch...
- if (parentVal === nativeWatch) { parentVal = undefined; }
- if (childVal === nativeWatch) { childVal = undefined; }
- /* istanbul ignore if */
- if (!childVal) { return Object.create(parentVal || null) }
- if (true) {
- assertObjectType(key, childVal, vm);
- }
- if (!parentVal) { return childVal }
- var ret = {};
- extend(ret, parentVal);
- for (var key$1 in childVal) {
- var parent = ret[key$1];
- var child = childVal[key$1];
- if (parent && !Array.isArray(parent)) {
- parent = [parent];
- }
- ret[key$1] = parent
- ? parent.concat(child)
- : Array.isArray(child) ? child : [child];
- }
- return ret
- };
- /**
- * Other object hashes.
- */
- strats.props =
- strats.methods =
- strats.inject =
- strats.computed = function (
- parentVal,
- childVal,
- vm,
- key
- ) {
- if (childVal && "development" !== 'production') {
- assertObjectType(key, childVal, vm);
- }
- if (!parentVal) { return childVal }
- var ret = Object.create(null);
- extend(ret, parentVal);
- if (childVal) { extend(ret, childVal); }
- return ret
- };
- strats.provide = mergeDataOrFn;
- /**
- * Default strategy.
- */
- var defaultStrat = function (parentVal, childVal) {
- return childVal === undefined
- ? parentVal
- : childVal
- };
- /**
- * Validate component names
- */
- function checkComponents (options) {
- for (var key in options.components) {
- validateComponentName(key);
- }
- }
- function validateComponentName (name) {
- if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) {
- warn(
- 'Invalid component name: "' + name + '". Component names ' +
- 'should conform to valid custom element name in html5 specification.'
- );
- }
- if (isBuiltInTag(name) || config.isReservedTag(name)) {
- warn(
- 'Do not use built-in or reserved HTML elements as component ' +
- 'id: ' + name
- );
- }
- }
- /**
- * Ensure all props option syntax are normalized into the
- * Object-based format.
- */
- function normalizeProps (options, vm) {
- var props = options.props;
- if (!props) { return }
- var res = {};
- var i, val, name;
- if (Array.isArray(props)) {
- i = props.length;
- while (i--) {
- val = props[i];
- if (typeof val === 'string') {
- name = camelize(val);
- res[name] = { type: null };
- } else if (true) {
- warn('props must be strings when using array syntax.');
- }
- }
- } else if (isPlainObject(props)) {
- for (var key in props) {
- val = props[key];
- name = camelize(key);
- res[name] = isPlainObject(val)
- ? val
- : { type: val };
- }
- } else if (true) {
- warn(
- "Invalid value for option \"props\": expected an Array or an Object, " +
- "but got " + (toRawType(props)) + ".",
- vm
- );
- }
- options.props = res;
- }
- /**
- * Normalize all injections into Object-based format
- */
- function normalizeInject (options, vm) {
- var inject = options.inject;
- if (!inject) { return }
- var normalized = options.inject = {};
- if (Array.isArray(inject)) {
- for (var i = 0; i < inject.length; i++) {
- normalized[inject[i]] = { from: inject[i] };
- }
- } else if (isPlainObject(inject)) {
- for (var key in inject) {
- var val = inject[key];
- normalized[key] = isPlainObject(val)
- ? extend({ from: key }, val)
- : { from: val };
- }
- } else if (true) {
- warn(
- "Invalid value for option \"inject\": expected an Array or an Object, " +
- "but got " + (toRawType(inject)) + ".",
- vm
- );
- }
- }
- /**
- * Normalize raw function directives into object format.
- */
- function normalizeDirectives (options) {
- var dirs = options.directives;
- if (dirs) {
- for (var key in dirs) {
- var def$$1 = dirs[key];
- if (typeof def$$1 === 'function') {
- dirs[key] = { bind: def$$1, update: def$$1 };
- }
- }
- }
- }
- function assertObjectType (name, value, vm) {
- if (!isPlainObject(value)) {
- warn(
- "Invalid value for option \"" + name + "\": expected an Object, " +
- "but got " + (toRawType(value)) + ".",
- vm
- );
- }
- }
- /**
- * Merge two option objects into a new one.
- * Core utility used in both instantiation and inheritance.
- */
- function mergeOptions (
- parent,
- child,
- vm
- ) {
- if (true) {
- checkComponents(child);
- }
- if (typeof child === 'function') {
- child = child.options;
- }
- normalizeProps(child, vm);
- normalizeInject(child, vm);
- normalizeDirectives(child);
- // Apply extends and mixins on the child options,
- // but only if it is a raw options object that isn't
- // the result of another mergeOptions call.
- // Only merged options has the _base property.
- if (!child._base) {
- if (child.extends) {
- parent = mergeOptions(parent, child.extends, vm);
- }
- if (child.mixins) {
- for (var i = 0, l = child.mixins.length; i < l; i++) {
- parent = mergeOptions(parent, child.mixins[i], vm);
- }
- }
- }
- var options = {};
- var key;
- for (key in parent) {
- mergeField(key);
- }
- for (key in child) {
- if (!hasOwn(parent, key)) {
- mergeField(key);
- }
- }
- function mergeField (key) {
- var strat = strats[key] || defaultStrat;
- options[key] = strat(parent[key], child[key], vm, key);
- }
- return options
- }
- /**
- * Resolve an asset.
- * This function is used because child instances need access
- * to assets defined in its ancestor chain.
- */
- function resolveAsset (
- options,
- type,
- id,
- warnMissing
- ) {
- /* istanbul ignore if */
- if (typeof id !== 'string') {
- return
- }
- var assets = options[type];
- // check local registration variations first
- if (hasOwn(assets, id)) { return assets[id] }
- var camelizedId = camelize(id);
- if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
- var PascalCaseId = capitalize(camelizedId);
- if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
- // fallback to prototype chain
- var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
- if ( true && warnMissing && !res) {
- warn(
- 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
- options
- );
- }
- return res
- }
- /* */
- function validateProp (
- key,
- propOptions,
- propsData,
- vm
- ) {
- var prop = propOptions[key];
- var absent = !hasOwn(propsData, key);
- var value = propsData[key];
- // boolean casting
- var booleanIndex = getTypeIndex(Boolean, prop.type);
- if (booleanIndex > -1) {
- if (absent && !hasOwn(prop, 'default')) {
- value = false;
- } else if (value === '' || value === hyphenate(key)) {
- // only cast empty string / same name to boolean if
- // boolean has higher priority
- var stringIndex = getTypeIndex(String, prop.type);
- if (stringIndex < 0 || booleanIndex < stringIndex) {
- value = true;
- }
- }
- }
- // check default value
- if (value === undefined) {
- value = getPropDefaultValue(vm, prop, key);
- // since the default value is a fresh copy,
- // make sure to observe it.
- var prevShouldObserve = shouldObserve;
- toggleObserving(true);
- observe(value);
- toggleObserving(prevShouldObserve);
- }
- if (
- true
- ) {
- assertProp(prop, key, value, vm, absent);
- }
- return value
- }
- /**
- * Get the default value of a prop.
- */
- function getPropDefaultValue (vm, prop, key) {
- // no default, return undefined
- if (!hasOwn(prop, 'default')) {
- return undefined
- }
- var def = prop.default;
- // warn against non-factory defaults for Object & Array
- if ( true && isObject(def)) {
- warn(
- 'Invalid default value for prop "' + key + '": ' +
- 'Props with type Object/Array must use a factory function ' +
- 'to return the default value.',
- vm
- );
- }
- // the raw prop value was also undefined from previous render,
- // return previous default value to avoid unnecessary watcher trigger
- if (vm && vm.$options.propsData &&
- vm.$options.propsData[key] === undefined &&
- vm._props[key] !== undefined
- ) {
- return vm._props[key]
- }
- // call factory function for non-Function types
- // a value is Function if its prototype is function even across different execution context
- return typeof def === 'function' && getType(prop.type) !== 'Function'
- ? def.call(vm)
- : def
- }
- /**
- * Assert whether a prop is valid.
- */
- function assertProp (
- prop,
- name,
- value,
- vm,
- absent
- ) {
- if (prop.required && absent) {
- warn(
- 'Missing required prop: "' + name + '"',
- vm
- );
- return
- }
- if (value == null && !prop.required) {
- return
- }
- var type = prop.type;
- var valid = !type || type === true;
- var expectedTypes = [];
- if (type) {
- if (!Array.isArray(type)) {
- type = [type];
- }
- for (var i = 0; i < type.length && !valid; i++) {
- var assertedType = assertType(value, type[i]);
- expectedTypes.push(assertedType.expectedType || '');
- valid = assertedType.valid;
- }
- }
- if (!valid) {
- warn(
- getInvalidTypeMessage(name, value, expectedTypes),
- vm
- );
- return
- }
- var validator = prop.validator;
- if (validator) {
- if (!validator(value)) {
- warn(
- 'Invalid prop: custom validator check failed for prop "' + name + '".',
- vm
- );
- }
- }
- }
- var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
- function assertType (value, type) {
- var valid;
- var expectedType = getType(type);
- if (simpleCheckRE.test(expectedType)) {
- var t = typeof value;
- valid = t === expectedType.toLowerCase();
- // for primitive wrapper objects
- if (!valid && t === 'object') {
- valid = value instanceof type;
- }
- } else if (expectedType === 'Object') {
- valid = isPlainObject(value);
- } else if (expectedType === 'Array') {
- valid = Array.isArray(value);
- } else {
- valid = value instanceof type;
- }
- return {
- valid: valid,
- expectedType: expectedType
- }
- }
- /**
- * Use function string name to check built-in types,
- * because a simple equality check will fail when running
- * across different vms / iframes.
- */
- function getType (fn) {
- var match = fn && fn.toString().match(/^\s*function (\w+)/);
- return match ? match[1] : ''
- }
- function isSameType (a, b) {
- return getType(a) === getType(b)
- }
- function getTypeIndex (type, expectedTypes) {
- if (!Array.isArray(expectedTypes)) {
- return isSameType(expectedTypes, type) ? 0 : -1
- }
- for (var i = 0, len = expectedTypes.length; i < len; i++) {
- if (isSameType(expectedTypes[i], type)) {
- return i
- }
- }
- return -1
- }
- function getInvalidTypeMessage (name, value, expectedTypes) {
- var message = "Invalid prop: type check failed for prop \"" + name + "\"." +
- " Expected " + (expectedTypes.map(capitalize).join(', '));
- var expectedType = expectedTypes[0];
- var receivedType = toRawType(value);
- var expectedValue = styleValue(value, expectedType);
- var receivedValue = styleValue(value, receivedType);
- // check if we need to specify expected value
- if (expectedTypes.length === 1 &&
- isExplicable(expectedType) &&
- !isBoolean(expectedType, receivedType)) {
- message += " with value " + expectedValue;
- }
- message += ", got " + receivedType + " ";
- // check if we need to specify received value
- if (isExplicable(receivedType)) {
- message += "with value " + receivedValue + ".";
- }
- return message
- }
- function styleValue (value, type) {
- if (type === 'String') {
- return ("\"" + value + "\"")
- } else if (type === 'Number') {
- return ("" + (Number(value)))
- } else {
- return ("" + value)
- }
- }
- function isExplicable (value) {
- var explicitTypes = ['string', 'number', 'boolean'];
- return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })
- }
- function isBoolean () {
- var args = [], len = arguments.length;
- while ( len-- ) args[ len ] = arguments[ len ];
- return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })
- }
- /* */
- function handleError (err, vm, info) {
- // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
- // See: https://github.com/vuejs/vuex/issues/1505
- pushTarget();
- try {
- if (vm) {
- var cur = vm;
- while ((cur = cur.$parent)) {
- var hooks = cur.$options.errorCaptured;
- if (hooks) {
- for (var i = 0; i < hooks.length; i++) {
- try {
- var capture = hooks[i].call(cur, err, vm, info) === false;
- if (capture) { return }
- } catch (e) {
- globalHandleError(e, cur, 'errorCaptured hook');
- }
- }
- }
- }
- }
- globalHandleError(err, vm, info);
- } finally {
- popTarget();
- }
- }
- function invokeWithErrorHandling (
- handler,
- context,
- args,
- vm,
- info
- ) {
- var res;
- try {
- res = args ? handler.apply(context, args) : handler.call(context);
- if (res && !res._isVue && isPromise(res) && !res._handled) {
- res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
- // issue #9511
- // avoid catch triggering multiple times when nested calls
- res._handled = true;
- }
- } catch (e) {
- handleError(e, vm, info);
- }
- return res
- }
- function globalHandleError (err, vm, info) {
- if (config.errorHandler) {
- try {
- return config.errorHandler.call(null, err, vm, info)
- } catch (e) {
- // if the user intentionally throws the original error in the handler,
- // do not log it twice
- if (e !== err) {
- logError(e, null, 'config.errorHandler');
- }
- }
- }
- logError(err, vm, info);
- }
- function logError (err, vm, info) {
- if (true) {
- warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
- }
- /* istanbul ignore else */
- if ((inBrowser || inWeex) && typeof console !== 'undefined') {
- console.error(err);
- } else {
- throw err
- }
- }
- /* */
- var callbacks = [];
- var pending = false;
- function flushCallbacks () {
- pending = false;
- var copies = callbacks.slice(0);
- callbacks.length = 0;
- for (var i = 0; i < copies.length; i++) {
- copies[i]();
- }
- }
- // Here we have async deferring wrappers using microtasks.
- // In 2.5 we used (macro) tasks (in combination with microtasks).
- // However, it has subtle problems when state is changed right before repaint
- // (e.g. #6813, out-in transitions).
- // Also, using (macro) tasks in event handler would cause some weird behaviors
- // that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
- // So we now use microtasks everywhere, again.
- // A major drawback of this tradeoff is that there are some scenarios
- // where microtasks have too high a priority and fire in between supposedly
- // sequential events (e.g. #4521, #6690, which have workarounds)
- // or even between bubbling of the same event (#6566).
- var timerFunc;
- // The nextTick behavior leverages the microtask queue, which can be accessed
- // via either native Promise.then or MutationObserver.
- // MutationObserver has wider support, however it is seriously bugged in
- // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
- // completely stops working after triggering a few times... so, if native
- // Promise is available, we will use it:
- /* istanbul ignore next, $flow-disable-line */
- if (typeof Promise !== 'undefined' && isNative(Promise)) {
- var p = Promise.resolve();
- timerFunc = function () {
- p.then(flushCallbacks);
- // In problematic UIWebViews, Promise.then doesn't completely break, but
- // it can get stuck in a weird state where callbacks are pushed into the
- // microtask queue but the queue isn't being flushed, until the browser
- // needs to do some other work, e.g. handle a timer. Therefore we can
- // "force" the microtask queue to be flushed by adding an empty timer.
- if (isIOS) { setTimeout(noop); }
- };
- } else if (!isIE && typeof MutationObserver !== 'undefined' && (
- isNative(MutationObserver) ||
- // PhantomJS and iOS 7.x
- MutationObserver.toString() === '[object MutationObserverConstructor]'
- )) {
- // Use MutationObserver where native Promise is not available,
- // e.g. PhantomJS, iOS7, Android 4.4
- // (#6466 MutationObserver is unreliable in IE11)
- var counter = 1;
- var observer = new MutationObserver(flushCallbacks);
- var textNode = document.createTextNode(String(counter));
- observer.observe(textNode, {
- characterData: true
- });
- timerFunc = function () {
- counter = (counter + 1) % 2;
- textNode.data = String(counter);
- };
- } else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
- // Fallback to setImmediate.
- // Technically it leverages the (macro) task queue,
- // but it is still a better choice than setTimeout.
- timerFunc = function () {
- setImmediate(flushCallbacks);
- };
- } else {
- // Fallback to setTimeout.
- timerFunc = function () {
- setTimeout(flushCallbacks, 0);
- };
- }
- function nextTick (cb, ctx) {
- var _resolve;
- callbacks.push(function () {
- if (cb) {
- try {
- cb.call(ctx);
- } catch (e) {
- handleError(e, ctx, 'nextTick');
- }
- } else if (_resolve) {
- _resolve(ctx);
- }
- });
- if (!pending) {
- pending = true;
- timerFunc();
- }
- // $flow-disable-line
- if (!cb && typeof Promise !== 'undefined') {
- return new Promise(function (resolve) {
- _resolve = resolve;
- })
- }
- }
- /* */
- /* not type checking this file because flow doesn't play well with Proxy */
- var initProxy;
- if (true) {
- var allowedGlobals = makeMap(
- 'Infinity,undefined,NaN,isFinite,isNaN,' +
- 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
- 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
- 'require' // for Webpack/Browserify
- );
- var warnNonPresent = function (target, key) {
- warn(
- "Property or method \"" + key + "\" is not defined on the instance but " +
- 'referenced during render. Make sure that this property is reactive, ' +
- 'either in the data option, or for class-based components, by ' +
- 'initializing the property. ' +
- 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
- target
- );
- };
- var warnReservedPrefix = function (target, key) {
- warn(
- "Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " +
- 'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
- 'prevent conflicts with Vue internals. ' +
- 'See: https://vuejs.org/v2/api/#data',
- target
- );
- };
- var hasProxy =
- typeof Proxy !== 'undefined' && isNative(Proxy);
- if (hasProxy) {
- var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
- config.keyCodes = new Proxy(config.keyCodes, {
- set: function set (target, key, value) {
- if (isBuiltInModifier(key)) {
- warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
- return false
- } else {
- target[key] = value;
- return true
- }
- }
- });
- }
- var hasHandler = {
- has: function has (target, key) {
- var has = key in target;
- var isAllowed = allowedGlobals(key) ||
- (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
- if (!has && !isAllowed) {
- if (key in target.$data) { warnReservedPrefix(target, key); }
- else { warnNonPresent(target, key); }
- }
- return has || !isAllowed
- }
- };
- var getHandler = {
- get: function get (target, key) {
- if (typeof key === 'string' && !(key in target)) {
- if (key in target.$data) { warnReservedPrefix(target, key); }
- else { warnNonPresent(target, key); }
- }
- return target[key]
- }
- };
- initProxy = function initProxy (vm) {
- if (hasProxy) {
- // determine which proxy handler to use
- var options = vm.$options;
- var handlers = options.render && options.render._withStripped
- ? getHandler
- : hasHandler;
- vm._renderProxy = new Proxy(vm, handlers);
- } else {
- vm._renderProxy = vm;
- }
- };
- }
- /* */
- var seenObjects = new _Set();
- /**
- * Recursively traverse an object to evoke all converted
- * getters, so that every nested property inside the object
- * is collected as a "deep" dependency.
- */
- function traverse (val) {
- _traverse(val, seenObjects);
- seenObjects.clear();
- }
- function _traverse (val, seen) {
- var i, keys;
- var isA = Array.isArray(val);
- if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
- return
- }
- if (val.__ob__) {
- var depId = val.__ob__.dep.id;
- if (seen.has(depId)) {
- return
- }
- seen.add(depId);
- }
- if (isA) {
- i = val.length;
- while (i--) { _traverse(val[i], seen); }
- } else {
- keys = Object.keys(val);
- i = keys.length;
- while (i--) { _traverse(val[keys[i]], seen); }
- }
- }
- var mark;
- var measure;
- if (true) {
- var perf = inBrowser && window.performance;
- /* istanbul ignore if */
- if (
- perf &&
- perf.mark &&
- perf.measure &&
- perf.clearMarks &&
- perf.clearMeasures
- ) {
- mark = function (tag) { return perf.mark(tag); };
- measure = function (name, startTag, endTag) {
- perf.measure(name, startTag, endTag);
- perf.clearMarks(startTag);
- perf.clearMarks(endTag);
- // perf.clearMeasures(name)
- };
- }
- }
- /* */
- var normalizeEvent = cached(function (name) {
- var passive = name.charAt(0) === '&';
- name = passive ? name.slice(1) : name;
- var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
- name = once$$1 ? name.slice(1) : name;
- var capture = name.charAt(0) === '!';
- name = capture ? name.slice(1) : name;
- return {
- name: name,
- once: once$$1,
- capture: capture,
- passive: passive
- }
- });
- function createFnInvoker (fns, vm) {
- function invoker () {
- var arguments$1 = arguments;
- var fns = invoker.fns;
- if (Array.isArray(fns)) {
- var cloned = fns.slice();
- for (var i = 0; i < cloned.length; i++) {
- invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
- }
- } else {
- // return handler return value for single handlers
- return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
- }
- }
- invoker.fns = fns;
- return invoker
- }
- function updateListeners (
- on,
- oldOn,
- add,
- remove$$1,
- createOnceHandler,
- vm
- ) {
- var name, def$$1, cur, old, event;
- for (name in on) {
- def$$1 = cur = on[name];
- old = oldOn[name];
- event = normalizeEvent(name);
- if (isUndef(cur)) {
- true && warn(
- "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
- vm
- );
- } else if (isUndef(old)) {
- if (isUndef(cur.fns)) {
- cur = on[name] = createFnInvoker(cur, vm);
- }
- if (isTrue(event.once)) {
- cur = on[name] = createOnceHandler(event.name, cur, event.capture);
- }
- add(event.name, cur, event.capture, event.passive, event.params);
- } else if (cur !== old) {
- old.fns = cur;
- on[name] = old;
- }
- }
- for (name in oldOn) {
- if (isUndef(on[name])) {
- event = normalizeEvent(name);
- remove$$1(event.name, oldOn[name], event.capture);
- }
- }
- }
- /* */
- /* */
- // fixed by xxxxxx (mp properties)
- function extractPropertiesFromVNodeData(data, Ctor, res, context) {
- var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties;
- if (isUndef(propOptions)) {
- return res
- }
- var externalClasses = Ctor.options.mpOptions.externalClasses || [];
- var attrs = data.attrs;
- var props = data.props;
- if (isDef(attrs) || isDef(props)) {
- for (var key in propOptions) {
- var altKey = hyphenate(key);
- var result = checkProp(res, props, key, altKey, true) ||
- checkProp(res, attrs, key, altKey, false);
- // externalClass
- if (
- result &&
- res[key] &&
- externalClasses.indexOf(altKey) !== -1 &&
- context[camelize(res[key])]
- ) {
- // 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串)
- res[key] = context[camelize(res[key])];
- }
- }
- }
- return res
- }
- function extractPropsFromVNodeData (
- data,
- Ctor,
- tag,
- context// fixed by xxxxxx
- ) {
- // we are only extracting raw values here.
- // validation and default values are handled in the child
- // component itself.
- var propOptions = Ctor.options.props;
- if (isUndef(propOptions)) {
- // fixed by xxxxxx
- return extractPropertiesFromVNodeData(data, Ctor, {}, context)
- }
- var res = {};
- var attrs = data.attrs;
- var props = data.props;
- if (isDef(attrs) || isDef(props)) {
- for (var key in propOptions) {
- var altKey = hyphenate(key);
- if (true) {
- var keyInLowerCase = key.toLowerCase();
- if (
- key !== keyInLowerCase &&
- attrs && hasOwn(attrs, keyInLowerCase)
- ) {
- tip(
- "Prop \"" + keyInLowerCase + "\" is passed to component " +
- (formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
- " \"" + key + "\". " +
- "Note that HTML attributes are case-insensitive and camelCased " +
- "props need to use their kebab-case equivalents when using in-DOM " +
- "templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
- );
- }
- }
- checkProp(res, props, key, altKey, true) ||
- checkProp(res, attrs, key, altKey, false);
- }
- }
- // fixed by xxxxxx
- return extractPropertiesFromVNodeData(data, Ctor, res, context)
- }
- function checkProp (
- res,
- hash,
- key,
- altKey,
- preserve
- ) {
- if (isDef(hash)) {
- if (hasOwn(hash, key)) {
- res[key] = hash[key];
- if (!preserve) {
- delete hash[key];
- }
- return true
- } else if (hasOwn(hash, altKey)) {
- res[key] = hash[altKey];
- if (!preserve) {
- delete hash[altKey];
- }
- return true
- }
- }
- return false
- }
- /* */
- // The template compiler attempts to minimize the need for normalization by
- // statically analyzing the template at compile time.
- //
- // For plain HTML markup, normalization can be completely skipped because the
- // generated render function is guaranteed to return Array<VNode>. There are
- // two cases where extra normalization is needed:
- // 1. When the children contains components - because a functional component
- // may return an Array instead of a single root. In this case, just a simple
- // normalization is needed - if any child is an Array, we flatten the whole
- // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
- // because functional components already normalize their own children.
- function simpleNormalizeChildren (children) {
- for (var i = 0; i < children.length; i++) {
- if (Array.isArray(children[i])) {
- return Array.prototype.concat.apply([], children)
- }
- }
- return children
- }
- // 2. When the children contains constructs that always generated nested Arrays,
- // e.g. <template>, <slot>, v-for, or when the children is provided by user
- // with hand-written render functions / JSX. In such cases a full normalization
- // is needed to cater to all possible types of children values.
- function normalizeChildren (children) {
- return isPrimitive(children)
- ? [createTextVNode(children)]
- : Array.isArray(children)
- ? normalizeArrayChildren(children)
- : undefined
- }
- function isTextNode (node) {
- return isDef(node) && isDef(node.text) && isFalse(node.isComment)
- }
- function normalizeArrayChildren (children, nestedIndex) {
- var res = [];
- var i, c, lastIndex, last;
- for (i = 0; i < children.length; i++) {
- c = children[i];
- if (isUndef(c) || typeof c === 'boolean') { continue }
- lastIndex = res.length - 1;
- last = res[lastIndex];
- // nested
- if (Array.isArray(c)) {
- if (c.length > 0) {
- c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
- // merge adjacent text nodes
- if (isTextNode(c[0]) && isTextNode(last)) {
- res[lastIndex] = createTextVNode(last.text + (c[0]).text);
- c.shift();
- }
- res.push.apply(res, c);
- }
- } else if (isPrimitive(c)) {
- if (isTextNode(last)) {
- // merge adjacent text nodes
- // this is necessary for SSR hydration because text nodes are
- // essentially merged when rendered to HTML strings
- res[lastIndex] = createTextVNode(last.text + c);
- } else if (c !== '') {
- // convert primitive to vnode
- res.push(createTextVNode(c));
- }
- } else {
- if (isTextNode(c) && isTextNode(last)) {
- // merge adjacent text nodes
- res[lastIndex] = createTextVNode(last.text + c.text);
- } else {
- // default key for nested array children (likely generated by v-for)
- if (isTrue(children._isVList) &&
- isDef(c.tag) &&
- isUndef(c.key) &&
- isDef(nestedIndex)) {
- c.key = "__vlist" + nestedIndex + "_" + i + "__";
- }
- res.push(c);
- }
- }
- }
- return res
- }
- /* */
- function initProvide (vm) {
- var provide = vm.$options.provide;
- if (provide) {
- vm._provided = typeof provide === 'function'
- ? provide.call(vm)
- : provide;
- }
- }
- function initInjections (vm) {
- var result = resolveInject(vm.$options.inject, vm);
- if (result) {
- toggleObserving(false);
- Object.keys(result).forEach(function (key) {
- /* istanbul ignore else */
- if (true) {
- defineReactive$$1(vm, key, result[key], function () {
- warn(
- "Avoid mutating an injected value directly since the changes will be " +
- "overwritten whenever the provided component re-renders. " +
- "injection being mutated: \"" + key + "\"",
- vm
- );
- });
- } else {}
- });
- toggleObserving(true);
- }
- }
- function resolveInject (inject, vm) {
- if (inject) {
- // inject is :any because flow is not smart enough to figure out cached
- var result = Object.create(null);
- var keys = hasSymbol
- ? Reflect.ownKeys(inject)
- : Object.keys(inject);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- // #6574 in case the inject object is observed...
- if (key === '__ob__') { continue }
- var provideKey = inject[key].from;
- var source = vm;
- while (source) {
- if (source._provided && hasOwn(source._provided, provideKey)) {
- result[key] = source._provided[provideKey];
- break
- }
- source = source.$parent;
- }
- if (!source) {
- if ('default' in inject[key]) {
- var provideDefault = inject[key].default;
- result[key] = typeof provideDefault === 'function'
- ? provideDefault.call(vm)
- : provideDefault;
- } else if (true) {
- warn(("Injection \"" + key + "\" not found"), vm);
- }
- }
- }
- return result
- }
- }
- /* */
- /**
- * Runtime helper for resolving raw children VNodes into a slot object.
- */
- function resolveSlots (
- children,
- context
- ) {
- if (!children || !children.length) {
- return {}
- }
- var slots = {};
- for (var i = 0, l = children.length; i < l; i++) {
- var child = children[i];
- var data = child.data;
- // remove slot attribute if the node is resolved as a Vue slot node
- if (data && data.attrs && data.attrs.slot) {
- delete data.attrs.slot;
- }
- // named slots should only be respected if the vnode was rendered in the
- // same context.
- if ((child.context === context || child.fnContext === context) &&
- data && data.slot != null
- ) {
- var name = data.slot;
- var slot = (slots[name] || (slots[name] = []));
- if (child.tag === 'template') {
- slot.push.apply(slot, child.children || []);
- } else {
- slot.push(child);
- }
- } else {
- // fixed by xxxxxx 临时 hack 掉 uni-app 中的异步 name slot page
- if(child.asyncMeta && child.asyncMeta.data && child.asyncMeta.data.slot === 'page'){
- (slots['page'] || (slots['page'] = [])).push(child);
- }else{
- (slots.default || (slots.default = [])).push(child);
- }
- }
- }
- // ignore slots that contains only whitespace
- for (var name$1 in slots) {
- if (slots[name$1].every(isWhitespace)) {
- delete slots[name$1];
- }
- }
- return slots
- }
- function isWhitespace (node) {
- return (node.isComment && !node.asyncFactory) || node.text === ' '
- }
- /* */
- function normalizeScopedSlots (
- slots,
- normalSlots,
- prevSlots
- ) {
- var res;
- var hasNormalSlots = Object.keys(normalSlots).length > 0;
- var isStable = slots ? !!slots.$stable : !hasNormalSlots;
- var key = slots && slots.$key;
- if (!slots) {
- res = {};
- } else if (slots._normalized) {
- // fast path 1: child component re-render only, parent did not change
- return slots._normalized
- } else if (
- isStable &&
- prevSlots &&
- prevSlots !== emptyObject &&
- key === prevSlots.$key &&
- !hasNormalSlots &&
- !prevSlots.$hasNormal
- ) {
- // fast path 2: stable scoped slots w/ no normal slots to proxy,
- // only need to normalize once
- return prevSlots
- } else {
- res = {};
- for (var key$1 in slots) {
- if (slots[key$1] && key$1[0] !== '$') {
- res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
- }
- }
- }
- // expose normal slots on scopedSlots
- for (var key$2 in normalSlots) {
- if (!(key$2 in res)) {
- res[key$2] = proxyNormalSlot(normalSlots, key$2);
- }
- }
- // avoriaz seems to mock a non-extensible $scopedSlots object
- // and when that is passed down this would cause an error
- if (slots && Object.isExtensible(slots)) {
- (slots)._normalized = res;
- }
- def(res, '$stable', isStable);
- def(res, '$key', key);
- def(res, '$hasNormal', hasNormalSlots);
- return res
- }
- function normalizeScopedSlot(normalSlots, key, fn) {
- var normalized = function () {
- var res = arguments.length ? fn.apply(null, arguments) : fn({});
- res = res && typeof res === 'object' && !Array.isArray(res)
- ? [res] // single vnode
- : normalizeChildren(res);
- return res && (
- res.length === 0 ||
- (res.length === 1 && res[0].isComment) // #9658
- ) ? undefined
- : res
- };
- // this is a slot using the new v-slot syntax without scope. although it is
- // compiled as a scoped slot, render fn users would expect it to be present
- // on this.$slots because the usage is semantically a normal slot.
- if (fn.proxy) {
- Object.defineProperty(normalSlots, key, {
- get: normalized,
- enumerable: true,
- configurable: true
- });
- }
- return normalized
- }
- function proxyNormalSlot(slots, key) {
- return function () { return slots[key]; }
- }
- /* */
- /**
- * Runtime helper for rendering v-for lists.
- */
- function renderList (
- val,
- render
- ) {
- var ret, i, l, keys, key;
- if (Array.isArray(val) || typeof val === 'string') {
- ret = new Array(val.length);
- for (i = 0, l = val.length; i < l; i++) {
- ret[i] = render(val[i], i, i, i); // fixed by xxxxxx
- }
- } else if (typeof val === 'number') {
- ret = new Array(val);
- for (i = 0; i < val; i++) {
- ret[i] = render(i + 1, i, i, i); // fixed by xxxxxx
- }
- } else if (isObject(val)) {
- if (hasSymbol && val[Symbol.iterator]) {
- ret = [];
- var iterator = val[Symbol.iterator]();
- var result = iterator.next();
- while (!result.done) {
- ret.push(render(result.value, ret.length, i++, i)); // fixed by xxxxxx
- result = iterator.next();
- }
- } else {
- keys = Object.keys(val);
- ret = new Array(keys.length);
- for (i = 0, l = keys.length; i < l; i++) {
- key = keys[i];
- ret[i] = render(val[key], key, i, i); // fixed by xxxxxx
- }
- }
- }
- if (!isDef(ret)) {
- ret = [];
- }
- (ret)._isVList = true;
- return ret
- }
- /* */
- /**
- * Runtime helper for rendering <slot>
- */
- function renderSlot (
- name,
- fallback,
- props,
- bindObject
- ) {
- var scopedSlotFn = this.$scopedSlots[name];
- var nodes;
- if (scopedSlotFn) { // scoped slot
- props = props || {};
- if (bindObject) {
- if ( true && !isObject(bindObject)) {
- warn(
- 'slot v-bind without argument expects an Object',
- this
- );
- }
- props = extend(extend({}, bindObject), props);
- }
- // fixed by xxxxxx app-plus scopedSlot
- nodes = scopedSlotFn(props, this, props._i) || fallback;
- } else {
- nodes = this.$slots[name] || fallback;
- }
- var target = props && props.slot;
- if (target) {
- return this.$createElement('template', { slot: target }, nodes)
- } else {
- return nodes
- }
- }
- /* */
- /**
- * Runtime helper for resolving filters
- */
- function resolveFilter (id) {
- return resolveAsset(this.$options, 'filters', id, true) || identity
- }
- /* */
- function isKeyNotMatch (expect, actual) {
- if (Array.isArray(expect)) {
- return expect.indexOf(actual) === -1
- } else {
- return expect !== actual
- }
- }
- /**
- * Runtime helper for checking keyCodes from config.
- * exposed as Vue.prototype._k
- * passing in eventKeyName as last argument separately for backwards compat
- */
- function checkKeyCodes (
- eventKeyCode,
- key,
- builtInKeyCode,
- eventKeyName,
- builtInKeyName
- ) {
- var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
- if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
- return isKeyNotMatch(builtInKeyName, eventKeyName)
- } else if (mappedKeyCode) {
- return isKeyNotMatch(mappedKeyCode, eventKeyCode)
- } else if (eventKeyName) {
- return hyphenate(eventKeyName) !== key
- }
- }
- /* */
- /**
- * Runtime helper for merging v-bind="object" into a VNode's data.
- */
- function bindObjectProps (
- data,
- tag,
- value,
- asProp,
- isSync
- ) {
- if (value) {
- if (!isObject(value)) {
- true && warn(
- 'v-bind without argument expects an Object or Array value',
- this
- );
- } else {
- if (Array.isArray(value)) {
- value = toObject(value);
- }
- var hash;
- var loop = function ( key ) {
- if (
- key === 'class' ||
- key === 'style' ||
- isReservedAttribute(key)
- ) {
- hash = data;
- } else {
- var type = data.attrs && data.attrs.type;
- hash = asProp || config.mustUseProp(tag, type, key)
- ? data.domProps || (data.domProps = {})
- : data.attrs || (data.attrs = {});
- }
- var camelizedKey = camelize(key);
- var hyphenatedKey = hyphenate(key);
- if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
- hash[key] = value[key];
- if (isSync) {
- var on = data.on || (data.on = {});
- on[("update:" + key)] = function ($event) {
- value[key] = $event;
- };
- }
- }
- };
- for (var key in value) loop( key );
- }
- }
- return data
- }
- /* */
- /**
- * Runtime helper for rendering static trees.
- */
- function renderStatic (
- index,
- isInFor
- ) {
- var cached = this._staticTrees || (this._staticTrees = []);
- var tree = cached[index];
- // if has already-rendered static tree and not inside v-for,
- // we can reuse the same tree.
- if (tree && !isInFor) {
- return tree
- }
- // otherwise, render a fresh tree.
- tree = cached[index] = this.$options.staticRenderFns[index].call(
- this._renderProxy,
- null,
- this // for render fns generated for functional component templates
- );
- markStatic(tree, ("__static__" + index), false);
- return tree
- }
- /**
- * Runtime helper for v-once.
- * Effectively it means marking the node as static with a unique key.
- */
- function markOnce (
- tree,
- index,
- key
- ) {
- markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
- return tree
- }
- function markStatic (
- tree,
- key,
- isOnce
- ) {
- if (Array.isArray(tree)) {
- for (var i = 0; i < tree.length; i++) {
- if (tree[i] && typeof tree[i] !== 'string') {
- markStaticNode(tree[i], (key + "_" + i), isOnce);
- }
- }
- } else {
- markStaticNode(tree, key, isOnce);
- }
- }
- function markStaticNode (node, key, isOnce) {
- node.isStatic = true;
- node.key = key;
- node.isOnce = isOnce;
- }
- /* */
- function bindObjectListeners (data, value) {
- if (value) {
- if (!isPlainObject(value)) {
- true && warn(
- 'v-on without argument expects an Object value',
- this
- );
- } else {
- var on = data.on = data.on ? extend({}, data.on) : {};
- for (var key in value) {
- var existing = on[key];
- var ours = value[key];
- on[key] = existing ? [].concat(existing, ours) : ours;
- }
- }
- }
- return data
- }
- /* */
- function resolveScopedSlots (
- fns, // see flow/vnode
- res,
- // the following are added in 2.6
- hasDynamicKeys,
- contentHashKey
- ) {
- res = res || { $stable: !hasDynamicKeys };
- for (var i = 0; i < fns.length; i++) {
- var slot = fns[i];
- if (Array.isArray(slot)) {
- resolveScopedSlots(slot, res, hasDynamicKeys);
- } else if (slot) {
- // marker for reverse proxying v-slot without scope on this.$slots
- if (slot.proxy) {
- slot.fn.proxy = true;
- }
- res[slot.key] = slot.fn;
- }
- }
- if (contentHashKey) {
- (res).$key = contentHashKey;
- }
- return res
- }
- /* */
- function bindDynamicKeys (baseObj, values) {
- for (var i = 0; i < values.length; i += 2) {
- var key = values[i];
- if (typeof key === 'string' && key) {
- baseObj[values[i]] = values[i + 1];
- } else if ( true && key !== '' && key !== null) {
- // null is a special value for explicitly removing a binding
- warn(
- ("Invalid value for dynamic directive argument (expected string or null): " + key),
- this
- );
- }
- }
- return baseObj
- }
- // helper to dynamically append modifier runtime markers to event names.
- // ensure only append when value is already string, otherwise it will be cast
- // to string and cause the type check to miss.
- function prependModifier (value, symbol) {
- return typeof value === 'string' ? symbol + value : value
- }
- /* */
- function installRenderHelpers (target) {
- target._o = markOnce;
- target._n = toNumber;
- target._s = toString;
- target._l = renderList;
- target._t = renderSlot;
- target._q = looseEqual;
- target._i = looseIndexOf;
- target._m = renderStatic;
- target._f = resolveFilter;
- target._k = checkKeyCodes;
- target._b = bindObjectProps;
- target._v = createTextVNode;
- target._e = createEmptyVNode;
- target._u = resolveScopedSlots;
- target._g = bindObjectListeners;
- target._d = bindDynamicKeys;
- target._p = prependModifier;
- }
- /* */
- function FunctionalRenderContext (
- data,
- props,
- children,
- parent,
- Ctor
- ) {
- var this$1 = this;
- var options = Ctor.options;
- // ensure the createElement function in functional components
- // gets a unique context - this is necessary for correct named slot check
- var contextVm;
- if (hasOwn(parent, '_uid')) {
- contextVm = Object.create(parent);
- // $flow-disable-line
- contextVm._original = parent;
- } else {
- // the context vm passed in is a functional context as well.
- // in this case we want to make sure we are able to get a hold to the
- // real context instance.
- contextVm = parent;
- // $flow-disable-line
- parent = parent._original;
- }
- var isCompiled = isTrue(options._compiled);
- var needNormalization = !isCompiled;
- this.data = data;
- this.props = props;
- this.children = children;
- this.parent = parent;
- this.listeners = data.on || emptyObject;
- this.injections = resolveInject(options.inject, parent);
- this.slots = function () {
- if (!this$1.$slots) {
- normalizeScopedSlots(
- data.scopedSlots,
- this$1.$slots = resolveSlots(children, parent)
- );
- }
- return this$1.$slots
- };
- Object.defineProperty(this, 'scopedSlots', ({
- enumerable: true,
- get: function get () {
- return normalizeScopedSlots(data.scopedSlots, this.slots())
- }
- }));
- // support for compiled functional template
- if (isCompiled) {
- // exposing $options for renderStatic()
- this.$options = options;
- // pre-resolve slots for renderSlot()
- this.$slots = this.slots();
- this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);
- }
- if (options._scopeId) {
- this._c = function (a, b, c, d) {
- var vnode = createElement(contextVm, a, b, c, d, needNormalization);
- if (vnode && !Array.isArray(vnode)) {
- vnode.fnScopeId = options._scopeId;
- vnode.fnContext = parent;
- }
- return vnode
- };
- } else {
- this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
- }
- }
- installRenderHelpers(FunctionalRenderContext.prototype);
- function createFunctionalComponent (
- Ctor,
- propsData,
- data,
- contextVm,
- children
- ) {
- var options = Ctor.options;
- var props = {};
- var propOptions = options.props;
- if (isDef(propOptions)) {
- for (var key in propOptions) {
- props[key] = validateProp(key, propOptions, propsData || emptyObject);
- }
- } else {
- if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
- if (isDef(data.props)) { mergeProps(props, data.props); }
- }
- var renderContext = new FunctionalRenderContext(
- data,
- props,
- children,
- contextVm,
- Ctor
- );
- var vnode = options.render.call(null, renderContext._c, renderContext);
- if (vnode instanceof VNode) {
- return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)
- } else if (Array.isArray(vnode)) {
- var vnodes = normalizeChildren(vnode) || [];
- var res = new Array(vnodes.length);
- for (var i = 0; i < vnodes.length; i++) {
- res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);
- }
- return res
- }
- }
- function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
- // #7817 clone node before setting fnContext, otherwise if the node is reused
- // (e.g. it was from a cached normal slot) the fnContext causes named slots
- // that should not be matched to match.
- var clone = cloneVNode(vnode);
- clone.fnContext = contextVm;
- clone.fnOptions = options;
- if (true) {
- (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;
- }
- if (data.slot) {
- (clone.data || (clone.data = {})).slot = data.slot;
- }
- return clone
- }
- function mergeProps (to, from) {
- for (var key in from) {
- to[camelize(key)] = from[key];
- }
- }
- /* */
- /* */
- /* */
- /* */
- // inline hooks to be invoked on component VNodes during patch
- var componentVNodeHooks = {
- init: function init (vnode, hydrating) {
- if (
- vnode.componentInstance &&
- !vnode.componentInstance._isDestroyed &&
- vnode.data.keepAlive
- ) {
- // kept-alive components, treat as a patch
- var mountedNode = vnode; // work around flow
- componentVNodeHooks.prepatch(mountedNode, mountedNode);
- } else {
- var child = vnode.componentInstance = createComponentInstanceForVnode(
- vnode,
- activeInstance
- );
- child.$mount(hydrating ? vnode.elm : undefined, hydrating);
- }
- },
- prepatch: function prepatch (oldVnode, vnode) {
- var options = vnode.componentOptions;
- var child = vnode.componentInstance = oldVnode.componentInstance;
- updateChildComponent(
- child,
- options.propsData, // updated props
- options.listeners, // updated listeners
- vnode, // new parent vnode
- options.children // new children
- );
- },
- insert: function insert (vnode) {
- var context = vnode.context;
- var componentInstance = vnode.componentInstance;
- if (!componentInstance._isMounted) {
- callHook(componentInstance, 'onServiceCreated');
- callHook(componentInstance, 'onServiceAttached');
- componentInstance._isMounted = true;
- callHook(componentInstance, 'mounted');
- }
- if (vnode.data.keepAlive) {
- if (context._isMounted) {
- // vue-router#1212
- // During updates, a kept-alive component's child components may
- // change, so directly walking the tree here may call activated hooks
- // on incorrect children. Instead we push them into a queue which will
- // be processed after the whole patch process ended.
- queueActivatedComponent(componentInstance);
- } else {
- activateChildComponent(componentInstance, true /* direct */);
- }
- }
- },
- destroy: function destroy (vnode) {
- var componentInstance = vnode.componentInstance;
- if (!componentInstance._isDestroyed) {
- if (!vnode.data.keepAlive) {
- componentInstance.$destroy();
- } else {
- deactivateChildComponent(componentInstance, true /* direct */);
- }
- }
- }
- };
- var hooksToMerge = Object.keys(componentVNodeHooks);
- function createComponent (
- Ctor,
- data,
- context,
- children,
- tag
- ) {
- if (isUndef(Ctor)) {
- return
- }
- var baseCtor = context.$options._base;
- // plain options object: turn it into a constructor
- if (isObject(Ctor)) {
- Ctor = baseCtor.extend(Ctor);
- }
- // if at this stage it's not a constructor or an async component factory,
- // reject.
- if (typeof Ctor !== 'function') {
- if (true) {
- warn(("Invalid Component definition: " + (String(Ctor))), context);
- }
- return
- }
- // async component
- var asyncFactory;
- if (isUndef(Ctor.cid)) {
- asyncFactory = Ctor;
- Ctor = resolveAsyncComponent(asyncFactory, baseCtor);
- if (Ctor === undefined) {
- // return a placeholder node for async component, which is rendered
- // as a comment node but preserves all the raw information for the node.
- // the information will be used for async server-rendering and hydration.
- return createAsyncPlaceholder(
- asyncFactory,
- data,
- context,
- children,
- tag
- )
- }
- }
- data = data || {};
- // resolve constructor options in case global mixins are applied after
- // component constructor creation
- resolveConstructorOptions(Ctor);
- // transform component v-model data into props & events
- if (isDef(data.model)) {
- transformModel(Ctor.options, data);
- }
- // extract props
- var propsData = extractPropsFromVNodeData(data, Ctor, tag, context); // fixed by xxxxxx
- // functional component
- if (isTrue(Ctor.options.functional)) {
- return createFunctionalComponent(Ctor, propsData, data, context, children)
- }
- // extract listeners, since these needs to be treated as
- // child component listeners instead of DOM listeners
- var listeners = data.on;
- // replace with listeners with .native modifier
- // so it gets processed during parent component patch.
- data.on = data.nativeOn;
- if (isTrue(Ctor.options.abstract)) {
- // abstract components do not keep anything
- // other than props & listeners & slot
- // work around flow
- var slot = data.slot;
- data = {};
- if (slot) {
- data.slot = slot;
- }
- }
- // install component management hooks onto the placeholder node
- installComponentHooks(data);
- // return a placeholder vnode
- var name = Ctor.options.name || tag;
- var vnode = new VNode(
- ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
- data, undefined, undefined, undefined, context,
- { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
- asyncFactory
- );
- return vnode
- }
- function createComponentInstanceForVnode (
- vnode, // we know it's MountedComponentVNode but flow doesn't
- parent // activeInstance in lifecycle state
- ) {
- var options = {
- _isComponent: true,
- _parentVnode: vnode,
- parent: parent
- };
- // check inline-template render functions
- var inlineTemplate = vnode.data.inlineTemplate;
- if (isDef(inlineTemplate)) {
- options.render = inlineTemplate.render;
- options.staticRenderFns = inlineTemplate.staticRenderFns;
- }
- return new vnode.componentOptions.Ctor(options)
- }
- function installComponentHooks (data) {
- var hooks = data.hook || (data.hook = {});
- for (var i = 0; i < hooksToMerge.length; i++) {
- var key = hooksToMerge[i];
- var existing = hooks[key];
- var toMerge = componentVNodeHooks[key];
- if (existing !== toMerge && !(existing && existing._merged)) {
- hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;
- }
- }
- }
- function mergeHook$1 (f1, f2) {
- var merged = function (a, b) {
- // flow complains about extra args which is why we use any
- f1(a, b);
- f2(a, b);
- };
- merged._merged = true;
- return merged
- }
- // transform component v-model info (value and callback) into
- // prop and event handler respectively.
- function transformModel (options, data) {
- var prop = (options.model && options.model.prop) || 'value';
- var event = (options.model && options.model.event) || 'input'
- ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
- var on = data.on || (data.on = {});
- var existing = on[event];
- var callback = data.model.callback;
- if (isDef(existing)) {
- if (
- Array.isArray(existing)
- ? existing.indexOf(callback) === -1
- : existing !== callback
- ) {
- on[event] = [callback].concat(existing);
- }
- } else {
- on[event] = callback;
- }
- }
- /* */
- var SIMPLE_NORMALIZE = 1;
- var ALWAYS_NORMALIZE = 2;
- // wrapper function for providing a more flexible interface
- // without getting yelled at by flow
- function createElement (
- context,
- tag,
- data,
- children,
- normalizationType,
- alwaysNormalize
- ) {
- if (Array.isArray(data) || isPrimitive(data)) {
- normalizationType = children;
- children = data;
- data = undefined;
- }
- if (isTrue(alwaysNormalize)) {
- normalizationType = ALWAYS_NORMALIZE;
- }
- return _createElement(context, tag, data, children, normalizationType)
- }
- function _createElement (
- context,
- tag,
- data,
- children,
- normalizationType
- ) {
- if (isDef(data) && isDef((data).__ob__)) {
- true && warn(
- "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
- 'Always create fresh vnode data objects in each render!',
- context
- );
- return createEmptyVNode()
- }
- // object syntax in v-bind
- if (isDef(data) && isDef(data.is)) {
- tag = data.is;
- }
- if (!tag) {
- // in case of component :is set to falsy value
- return createEmptyVNode()
- }
- // warn against non-primitive key
- if ( true &&
- isDef(data) && isDef(data.key) && !isPrimitive(data.key)
- ) {
- {
- warn(
- 'Avoid using non-primitive value as key, ' +
- 'use string/number value instead.',
- context
- );
- }
- }
- // support single function children as default scoped slot
- if (Array.isArray(children) &&
- typeof children[0] === 'function'
- ) {
- data = data || {};
- data.scopedSlots = { default: children[0] };
- children.length = 0;
- }
- if (normalizationType === ALWAYS_NORMALIZE) {
- children = normalizeChildren(children);
- } else if (normalizationType === SIMPLE_NORMALIZE) {
- children = simpleNormalizeChildren(children);
- }
- var vnode, ns;
- if (typeof tag === 'string') {
- var Ctor;
- ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
- if (config.isReservedTag(tag)) {
- // platform built-in elements
- if ( true && isDef(data) && isDef(data.nativeOn)) {
- warn(
- ("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."),
- context
- );
- }
- vnode = new VNode(
- config.parsePlatformTagName(tag), data, children,
- undefined, undefined, context
- );
- } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
- // component
- vnode = createComponent(Ctor, data, context, children, tag);
- } else {
- // unknown or unlisted namespaced elements
- // check at runtime because it may get assigned a namespace when its
- // parent normalizes children
- vnode = new VNode(
- tag, data, children,
- undefined, undefined, context
- );
- }
- } else {
- // direct component options / constructor
- vnode = createComponent(tag, data, context, children);
- }
- if (Array.isArray(vnode)) {
- return vnode
- } else if (isDef(vnode)) {
- if (isDef(ns)) { applyNS(vnode, ns); }
- if (isDef(data)) { registerDeepBindings(data); }
- return vnode
- } else {
- return createEmptyVNode()
- }
- }
- function applyNS (vnode, ns, force) {
- vnode.ns = ns;
- if (vnode.tag === 'foreignObject') {
- // use default namespace inside foreignObject
- ns = undefined;
- force = true;
- }
- if (isDef(vnode.children)) {
- for (var i = 0, l = vnode.children.length; i < l; i++) {
- var child = vnode.children[i];
- if (isDef(child.tag) && (
- isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
- applyNS(child, ns, force);
- }
- }
- }
- }
- // ref #5318
- // necessary to ensure parent re-render when deep bindings like :style and
- // :class are used on slot nodes
- function registerDeepBindings (data) {
- if (isObject(data.style)) {
- traverse(data.style);
- }
- if (isObject(data.class)) {
- traverse(data.class);
- }
- }
- /* */
- function initRender (vm) {
- vm._vnode = null; // the root of the child tree
- vm._staticTrees = null; // v-once cached trees
- var options = vm.$options;
- var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
- var renderContext = parentVnode && parentVnode.context;
- vm.$slots = resolveSlots(options._renderChildren, renderContext);
- vm.$scopedSlots = emptyObject;
- // bind the createElement fn to this instance
- // so that we get proper render context inside it.
- // args order: tag, data, children, normalizationType, alwaysNormalize
- // internal version is used by render functions compiled from templates
- vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
- // normalization is always applied for the public version, used in
- // user-written render functions.
- vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
- // $attrs & $listeners are exposed for easier HOC creation.
- // they need to be reactive so that HOCs using them are always updated
- var parentData = parentVnode && parentVnode.data;
- /* istanbul ignore else */
- if (true) {
- defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
- !isUpdatingChildComponent && warn("$attrs is readonly.", vm);
- }, true);
- defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {
- !isUpdatingChildComponent && warn("$listeners is readonly.", vm);
- }, true);
- } else {}
- }
- var currentRenderingInstance = null;
- function renderMixin (Vue) {
- // install runtime convenience helpers
- installRenderHelpers(Vue.prototype);
- Vue.prototype.$nextTick = function (fn) {
- return nextTick(fn, this)
- };
- Vue.prototype._render = function () {
- var vm = this;
- var ref = vm.$options;
- var render = ref.render;
- var _parentVnode = ref._parentVnode;
- if (_parentVnode) {
- vm.$scopedSlots = normalizeScopedSlots(
- _parentVnode.data.scopedSlots,
- vm.$slots,
- vm.$scopedSlots
- );
- }
- // set parent vnode. this allows render functions to have access
- // to the data on the placeholder node.
- vm.$vnode = _parentVnode;
- // render self
- var vnode;
- try {
- // There's no need to maintain a stack because all render fns are called
- // separately from one another. Nested component's render fns are called
- // when parent component is patched.
- currentRenderingInstance = vm;
- vnode = render.call(vm._renderProxy, vm.$createElement);
- } catch (e) {
- handleError(e, vm, "render");
- // return error render result,
- // or previous vnode to prevent render error causing blank component
- /* istanbul ignore else */
- if ( true && vm.$options.renderError) {
- try {
- vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
- } catch (e) {
- handleError(e, vm, "renderError");
- vnode = vm._vnode;
- }
- } else {
- vnode = vm._vnode;
- }
- } finally {
- currentRenderingInstance = null;
- }
- // if the returned array contains only a single node, allow it
- if (Array.isArray(vnode) && vnode.length === 1) {
- vnode = vnode[0];
- }
- // return empty vnode in case the render function errored out
- if (!(vnode instanceof VNode)) {
- if ( true && Array.isArray(vnode)) {
- warn(
- 'Multiple root nodes returned from render function. Render function ' +
- 'should return a single root node.',
- vm
- );
- }
- vnode = createEmptyVNode();
- }
- // set parent
- vnode.parent = _parentVnode;
- return vnode
- };
- }
- /* */
- function ensureCtor (comp, base) {
- if (
- comp.__esModule ||
- (hasSymbol && comp[Symbol.toStringTag] === 'Module')
- ) {
- comp = comp.default;
- }
- return isObject(comp)
- ? base.extend(comp)
- : comp
- }
- function createAsyncPlaceholder (
- factory,
- data,
- context,
- children,
- tag
- ) {
- var node = createEmptyVNode();
- node.asyncFactory = factory;
- node.asyncMeta = { data: data, context: context, children: children, tag: tag };
- return node
- }
- function resolveAsyncComponent (
- factory,
- baseCtor
- ) {
- if (isTrue(factory.error) && isDef(factory.errorComp)) {
- return factory.errorComp
- }
- if (isDef(factory.resolved)) {
- return factory.resolved
- }
- var owner = currentRenderingInstance;
- if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
- // already pending
- factory.owners.push(owner);
- }
- if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
- return factory.loadingComp
- }
- if (owner && !isDef(factory.owners)) {
- var owners = factory.owners = [owner];
- var sync = true;
- var timerLoading = null;
- var timerTimeout = null
- ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
- var forceRender = function (renderCompleted) {
- for (var i = 0, l = owners.length; i < l; i++) {
- (owners[i]).$forceUpdate();
- }
- if (renderCompleted) {
- owners.length = 0;
- if (timerLoading !== null) {
- clearTimeout(timerLoading);
- timerLoading = null;
- }
- if (timerTimeout !== null) {
- clearTimeout(timerTimeout);
- timerTimeout = null;
- }
- }
- };
- var resolve = once(function (res) {
- // cache resolved
- factory.resolved = ensureCtor(res, baseCtor);
- // invoke callbacks only if this is not a synchronous resolve
- // (async resolves are shimmed as synchronous during SSR)
- if (!sync) {
- forceRender(true);
- } else {
- owners.length = 0;
- }
- });
- var reject = once(function (reason) {
- true && warn(
- "Failed to resolve async component: " + (String(factory)) +
- (reason ? ("\nReason: " + reason) : '')
- );
- if (isDef(factory.errorComp)) {
- factory.error = true;
- forceRender(true);
- }
- });
- var res = factory(resolve, reject);
- if (isObject(res)) {
- if (isPromise(res)) {
- // () => Promise
- if (isUndef(factory.resolved)) {
- res.then(resolve, reject);
- }
- } else if (isPromise(res.component)) {
- res.component.then(resolve, reject);
- if (isDef(res.error)) {
- factory.errorComp = ensureCtor(res.error, baseCtor);
- }
- if (isDef(res.loading)) {
- factory.loadingComp = ensureCtor(res.loading, baseCtor);
- if (res.delay === 0) {
- factory.loading = true;
- } else {
- timerLoading = setTimeout(function () {
- timerLoading = null;
- if (isUndef(factory.resolved) && isUndef(factory.error)) {
- factory.loading = true;
- forceRender(false);
- }
- }, res.delay || 200);
- }
- }
- if (isDef(res.timeout)) {
- timerTimeout = setTimeout(function () {
- timerTimeout = null;
- if (isUndef(factory.resolved)) {
- reject(
- true
- ? ("timeout (" + (res.timeout) + "ms)")
- : undefined
- );
- }
- }, res.timeout);
- }
- }
- }
- sync = false;
- // return in case resolved synchronously
- return factory.loading
- ? factory.loadingComp
- : factory.resolved
- }
- }
- /* */
- function isAsyncPlaceholder (node) {
- return node.isComment && node.asyncFactory
- }
- /* */
- function getFirstComponentChild (children) {
- if (Array.isArray(children)) {
- for (var i = 0; i < children.length; i++) {
- var c = children[i];
- if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
- return c
- }
- }
- }
- }
- /* */
- /* */
- function initEvents (vm) {
- vm._events = Object.create(null);
- vm._hasHookEvent = false;
- // init parent attached events
- var listeners = vm.$options._parentListeners;
- if (listeners) {
- updateComponentListeners(vm, listeners);
- }
- }
- var target;
- function add (event, fn) {
- target.$on(event, fn);
- }
- function remove$1 (event, fn) {
- target.$off(event, fn);
- }
- function createOnceHandler (event, fn) {
- var _target = target;
- return function onceHandler () {
- var res = fn.apply(null, arguments);
- if (res !== null) {
- _target.$off(event, onceHandler);
- }
- }
- }
- function updateComponentListeners (
- vm,
- listeners,
- oldListeners
- ) {
- target = vm;
- updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
- target = undefined;
- }
- function eventsMixin (Vue) {
- var hookRE = /^hook:/;
- Vue.prototype.$on = function (event, fn) {
- var vm = this;
- if (Array.isArray(event)) {
- for (var i = 0, l = event.length; i < l; i++) {
- vm.$on(event[i], fn);
- }
- } else {
- (vm._events[event] || (vm._events[event] = [])).push(fn);
- // optimize hook:event cost by using a boolean flag marked at registration
- // instead of a hash lookup
- if (hookRE.test(event)) {
- vm._hasHookEvent = true;
- }
- }
- return vm
- };
- Vue.prototype.$once = function (event, fn) {
- var vm = this;
- function on () {
- vm.$off(event, on);
- fn.apply(vm, arguments);
- }
- on.fn = fn;
- vm.$on(event, on);
- return vm
- };
- Vue.prototype.$off = function (event, fn) {
- var vm = this;
- // all
- if (!arguments.length) {
- vm._events = Object.create(null);
- return vm
- }
- // array of events
- if (Array.isArray(event)) {
- for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
- vm.$off(event[i$1], fn);
- }
- return vm
- }
- // specific event
- var cbs = vm._events[event];
- if (!cbs) {
- return vm
- }
- if (!fn) {
- vm._events[event] = null;
- return vm
- }
- // specific handler
- var cb;
- var i = cbs.length;
- while (i--) {
- cb = cbs[i];
- if (cb === fn || cb.fn === fn) {
- cbs.splice(i, 1);
- break
- }
- }
- return vm
- };
- Vue.prototype.$emit = function (event) {
- var vm = this;
- if (true) {
- var lowerCaseEvent = event.toLowerCase();
- if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
- tip(
- "Event \"" + lowerCaseEvent + "\" is emitted in component " +
- (formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
- "Note that HTML attributes are case-insensitive and you cannot use " +
- "v-on to listen to camelCase events when using in-DOM templates. " +
- "You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
- );
- }
- }
- var cbs = vm._events[event];
- if (cbs) {
- cbs = cbs.length > 1 ? toArray(cbs) : cbs;
- var args = toArray(arguments, 1);
- var info = "event handler for \"" + event + "\"";
- for (var i = 0, l = cbs.length; i < l; i++) {
- invokeWithErrorHandling(cbs[i], vm, args, vm, info);
- }
- }
- return vm
- };
- }
- /* */
- var activeInstance = null;
- var isUpdatingChildComponent = false;
- function setActiveInstance(vm) {
- var prevActiveInstance = activeInstance;
- activeInstance = vm;
- return function () {
- activeInstance = prevActiveInstance;
- }
- }
- function initLifecycle (vm) {
- var options = vm.$options;
- // locate first non-abstract parent
- var parent = options.parent;
- if (parent && !options.abstract) {
- while (parent.$options.abstract && parent.$parent) {
- parent = parent.$parent;
- }
- parent.$children.push(vm);
- }
- vm.$parent = parent;
- vm.$root = parent ? parent.$root : vm;
- vm.$children = [];
- vm.$refs = {};
- vm._watcher = null;
- vm._inactive = null;
- vm._directInactive = false;
- vm._isMounted = false;
- vm._isDestroyed = false;
- vm._isBeingDestroyed = false;
- }
- function lifecycleMixin (Vue) {
- Vue.prototype._update = function (vnode, hydrating) {
- var vm = this;
- var prevEl = vm.$el;
- var prevVnode = vm._vnode;
- var restoreActiveInstance = setActiveInstance(vm);
- vm._vnode = vnode;
- // Vue.prototype.__patch__ is injected in entry points
- // based on the rendering backend used.
- if (!prevVnode) {
- // initial render
- vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
- } else {
- // updates
- vm.$el = vm.__patch__(prevVnode, vnode);
- }
- restoreActiveInstance();
- // update __vue__ reference
- if (prevEl) {
- prevEl.__vue__ = null;
- }
- if (vm.$el) {
- vm.$el.__vue__ = vm;
- }
- // if parent is an HOC, update its $el as well
- if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
- vm.$parent.$el = vm.$el;
- }
- // updated hook is called by the scheduler to ensure that children are
- // updated in a parent's updated hook.
- };
- Vue.prototype.$forceUpdate = function () {
- var vm = this;
- if (vm._watcher) {
- vm._watcher.update();
- }
- };
- Vue.prototype.$destroy = function () {
- var vm = this;
- if (vm._isBeingDestroyed) {
- return
- }
- callHook(vm, 'beforeDestroy');
- vm._isBeingDestroyed = true;
- // remove self from parent
- var parent = vm.$parent;
- if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
- remove(parent.$children, vm);
- }
- // teardown watchers
- if (vm._watcher) {
- vm._watcher.teardown();
- }
- var i = vm._watchers.length;
- while (i--) {
- vm._watchers[i].teardown();
- }
- // remove reference from data ob
- // frozen object may not have observer.
- if (vm._data.__ob__) {
- vm._data.__ob__.vmCount--;
- }
- // call the last hook...
- vm._isDestroyed = true;
- // invoke destroy hooks on current rendered tree
- vm.__patch__(vm._vnode, null);
- // fire destroyed hook
- callHook(vm, 'destroyed');
- // turn off all instance listeners.
- vm.$off();
- // remove __vue__ reference
- if (vm.$el) {
- vm.$el.__vue__ = null;
- }
- // release circular reference (#6759)
- if (vm.$vnode) {
- vm.$vnode.parent = null;
- }
- };
- }
- function updateChildComponent (
- vm,
- propsData,
- listeners,
- parentVnode,
- renderChildren
- ) {
- if (true) {
- isUpdatingChildComponent = true;
- }
- // determine whether component has slot children
- // we need to do this before overwriting $options._renderChildren.
- // check if there are dynamic scopedSlots (hand-written or compiled but with
- // dynamic slot names). Static scoped slots compiled from template has the
- // "$stable" marker.
- var newScopedSlots = parentVnode.data.scopedSlots;
- var oldScopedSlots = vm.$scopedSlots;
- var hasDynamicScopedSlot = !!(
- (newScopedSlots && !newScopedSlots.$stable) ||
- (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
- (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
- );
- // Any static slot children from the parent may have changed during parent's
- // update. Dynamic scoped slots may also have changed. In such cases, a forced
- // update is necessary to ensure correctness.
- var needsForceUpdate = !!(
- renderChildren || // has new static slots
- vm.$options._renderChildren || // has old static slots
- hasDynamicScopedSlot
- );
- vm.$options._parentVnode = parentVnode;
- vm.$vnode = parentVnode; // update vm's placeholder node without re-render
- if (vm._vnode) { // update child tree's parent
- vm._vnode.parent = parentVnode;
- }
- vm.$options._renderChildren = renderChildren;
- // update $attrs and $listeners hash
- // these are also reactive so they may trigger child update if the child
- // used them during render
- vm.$attrs = parentVnode.data.attrs || emptyObject;
- vm.$listeners = listeners || emptyObject;
- // update props
- if (propsData && vm.$options.props) {
- toggleObserving(false);
- var props = vm._props;
- var propKeys = vm.$options._propKeys || [];
- for (var i = 0; i < propKeys.length; i++) {
- var key = propKeys[i];
- var propOptions = vm.$options.props; // wtf flow?
- props[key] = validateProp(key, propOptions, propsData, vm);
- }
- toggleObserving(true);
- // keep a copy of raw propsData
- vm.$options.propsData = propsData;
- }
-
- // fixed by xxxxxx update properties(mp runtime)
- vm._$updateProperties && vm._$updateProperties(vm);
-
- // update listeners
- listeners = listeners || emptyObject;
- var oldListeners = vm.$options._parentListeners;
- vm.$options._parentListeners = listeners;
- updateComponentListeners(vm, listeners, oldListeners);
- // resolve slots + force update if has children
- if (needsForceUpdate) {
- vm.$slots = resolveSlots(renderChildren, parentVnode.context);
- vm.$forceUpdate();
- }
- if (true) {
- isUpdatingChildComponent = false;
- }
- }
- function isInInactiveTree (vm) {
- while (vm && (vm = vm.$parent)) {
- if (vm._inactive) { return true }
- }
- return false
- }
- function activateChildComponent (vm, direct) {
- if (direct) {
- vm._directInactive = false;
- if (isInInactiveTree(vm)) {
- return
- }
- } else if (vm._directInactive) {
- return
- }
- if (vm._inactive || vm._inactive === null) {
- vm._inactive = false;
- for (var i = 0; i < vm.$children.length; i++) {
- activateChildComponent(vm.$children[i]);
- }
- callHook(vm, 'activated');
- }
- }
- function deactivateChildComponent (vm, direct) {
- if (direct) {
- vm._directInactive = true;
- if (isInInactiveTree(vm)) {
- return
- }
- }
- if (!vm._inactive) {
- vm._inactive = true;
- for (var i = 0; i < vm.$children.length; i++) {
- deactivateChildComponent(vm.$children[i]);
- }
- callHook(vm, 'deactivated');
- }
- }
- function callHook (vm, hook) {
- // #7573 disable dep collection when invoking lifecycle hooks
- pushTarget();
- var handlers = vm.$options[hook];
- var info = hook + " hook";
- if (handlers) {
- for (var i = 0, j = handlers.length; i < j; i++) {
- invokeWithErrorHandling(handlers[i], vm, null, vm, info);
- }
- }
- if (vm._hasHookEvent) {
- vm.$emit('hook:' + hook);
- }
- popTarget();
- }
- /* */
- var MAX_UPDATE_COUNT = 100;
- var queue = [];
- var activatedChildren = [];
- var has = {};
- var circular = {};
- var waiting = false;
- var flushing = false;
- var index = 0;
- /**
- * Reset the scheduler's state.
- */
- function resetSchedulerState () {
- index = queue.length = activatedChildren.length = 0;
- has = {};
- if (true) {
- circular = {};
- }
- waiting = flushing = false;
- }
- // Async edge case #6566 requires saving the timestamp when event listeners are
- // attached. However, calling performance.now() has a perf overhead especially
- // if the page has thousands of event listeners. Instead, we take a timestamp
- // every time the scheduler flushes and use that for all event listeners
- // attached during that flush.
- var currentFlushTimestamp = 0;
- // Async edge case fix requires storing an event listener's attach timestamp.
- var getNow = Date.now;
- // Determine what event timestamp the browser is using. Annoyingly, the
- // timestamp can either be hi-res (relative to page load) or low-res
- // (relative to UNIX epoch), so in order to compare time we have to use the
- // same timestamp type when saving the flush timestamp.
- // All IE versions use low-res event timestamps, and have problematic clock
- // implementations (#9632)
- if (inBrowser && !isIE) {
- var performance = window.performance;
- if (
- performance &&
- typeof performance.now === 'function' &&
- getNow() > document.createEvent('Event').timeStamp
- ) {
- // if the event timestamp, although evaluated AFTER the Date.now(), is
- // smaller than it, it means the event is using a hi-res timestamp,
- // and we need to use the hi-res version for event listener timestamps as
- // well.
- getNow = function () { return performance.now(); };
- }
- }
- /**
- * Flush both queues and run the watchers.
- */
- function flushSchedulerQueue () {
- currentFlushTimestamp = getNow();
- flushing = true;
- var watcher, id;
- // Sort queue before flush.
- // This ensures that:
- // 1. Components are updated from parent to child. (because parent is always
- // created before the child)
- // 2. A component's user watchers are run before its render watcher (because
- // user watchers are created before the render watcher)
- // 3. If a component is destroyed during a parent component's watcher run,
- // its watchers can be skipped.
- queue.sort(function (a, b) { return a.id - b.id; });
- // do not cache length because more watchers might be pushed
- // as we run existing watchers
- for (index = 0; index < queue.length; index++) {
- watcher = queue[index];
- if (watcher.before) {
- watcher.before();
- }
- id = watcher.id;
- has[id] = null;
- watcher.run();
- // in dev build, check and stop circular updates.
- if ( true && has[id] != null) {
- circular[id] = (circular[id] || 0) + 1;
- if (circular[id] > MAX_UPDATE_COUNT) {
- warn(
- 'You may have an infinite update loop ' + (
- watcher.user
- ? ("in watcher with expression \"" + (watcher.expression) + "\"")
- : "in a component render function."
- ),
- watcher.vm
- );
- break
- }
- }
- }
- // keep copies of post queues before resetting state
- var activatedQueue = activatedChildren.slice();
- var updatedQueue = queue.slice();
- resetSchedulerState();
- // call component updated and activated hooks
- callActivatedHooks(activatedQueue);
- callUpdatedHooks(updatedQueue);
- // devtool hook
- /* istanbul ignore if */
- if (devtools && config.devtools) {
- devtools.emit('flush');
- }
- }
- function callUpdatedHooks (queue) {
- var i = queue.length;
- while (i--) {
- var watcher = queue[i];
- var vm = watcher.vm;
- if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
- callHook(vm, 'updated');
- }
- }
- }
- /**
- * Queue a kept-alive component that was activated during patch.
- * The queue will be processed after the entire tree has been patched.
- */
- function queueActivatedComponent (vm) {
- // setting _inactive to false here so that a render function can
- // rely on checking whether it's in an inactive tree (e.g. router-view)
- vm._inactive = false;
- activatedChildren.push(vm);
- }
- function callActivatedHooks (queue) {
- for (var i = 0; i < queue.length; i++) {
- queue[i]._inactive = true;
- activateChildComponent(queue[i], true /* true */);
- }
- }
- /**
- * Push a watcher into the watcher queue.
- * Jobs with duplicate IDs will be skipped unless it's
- * pushed when the queue is being flushed.
- */
- function queueWatcher (watcher) {
- var id = watcher.id;
- if (has[id] == null) {
- has[id] = true;
- if (!flushing) {
- queue.push(watcher);
- } else {
- // if already flushing, splice the watcher based on its id
- // if already past its id, it will be run next immediately.
- var i = queue.length - 1;
- while (i > index && queue[i].id > watcher.id) {
- i--;
- }
- queue.splice(i + 1, 0, watcher);
- }
- // queue the flush
- if (!waiting) {
- waiting = true;
- if ( true && !config.async) {
- flushSchedulerQueue();
- return
- }
- nextTick(flushSchedulerQueue);
- }
- }
- }
- /* */
- var uid$2 = 0;
- /**
- * A watcher parses an expression, collects dependencies,
- * and fires callback when the expression value changes.
- * This is used for both the $watch() api and directives.
- */
- var Watcher = function Watcher (
- vm,
- expOrFn,
- cb,
- options,
- isRenderWatcher
- ) {
- this.vm = vm;
- if (isRenderWatcher) {
- vm._watcher = this;
- }
- vm._watchers.push(this);
- // options
- if (options) {
- this.deep = !!options.deep;
- this.user = !!options.user;
- this.lazy = !!options.lazy;
- this.sync = !!options.sync;
- this.before = options.before;
- } else {
- this.deep = this.user = this.lazy = this.sync = false;
- }
- this.cb = cb;
- this.id = ++uid$2; // uid for batching
- this.active = true;
- this.dirty = this.lazy; // for lazy watchers
- this.deps = [];
- this.newDeps = [];
- this.depIds = new _Set();
- this.newDepIds = new _Set();
- this.expression = true
- ? expOrFn.toString()
- : undefined;
- // parse expression for getter
- if (typeof expOrFn === 'function') {
- this.getter = expOrFn;
- } else {
- this.getter = parsePath(expOrFn);
- if (!this.getter) {
- this.getter = noop;
- true && warn(
- "Failed watching path: \"" + expOrFn + "\" " +
- 'Watcher only accepts simple dot-delimited paths. ' +
- 'For full control, use a function instead.',
- vm
- );
- }
- }
- this.value = this.lazy
- ? undefined
- : this.get();
- };
- /**
- * Evaluate the getter, and re-collect dependencies.
- */
- Watcher.prototype.get = function get () {
- pushTarget(this);
- var value;
- var vm = this.vm;
- try {
- value = this.getter.call(vm, vm);
- } catch (e) {
- if (this.user) {
- handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
- } else {
- throw e
- }
- } finally {
- // "touch" every property so they are all tracked as
- // dependencies for deep watching
- if (this.deep) {
- traverse(value);
- }
- popTarget();
- this.cleanupDeps();
- }
- return value
- };
- /**
- * Add a dependency to this directive.
- */
- Watcher.prototype.addDep = function addDep (dep) {
- var id = dep.id;
- if (!this.newDepIds.has(id)) {
- this.newDepIds.add(id);
- this.newDeps.push(dep);
- if (!this.depIds.has(id)) {
- dep.addSub(this);
- }
- }
- };
- /**
- * Clean up for dependency collection.
- */
- Watcher.prototype.cleanupDeps = function cleanupDeps () {
- var i = this.deps.length;
- while (i--) {
- var dep = this.deps[i];
- if (!this.newDepIds.has(dep.id)) {
- dep.removeSub(this);
- }
- }
- var tmp = this.depIds;
- this.depIds = this.newDepIds;
- this.newDepIds = tmp;
- this.newDepIds.clear();
- tmp = this.deps;
- this.deps = this.newDeps;
- this.newDeps = tmp;
- this.newDeps.length = 0;
- };
- /**
- * Subscriber interface.
- * Will be called when a dependency changes.
- */
- Watcher.prototype.update = function update () {
- /* istanbul ignore else */
- if (this.lazy) {
- this.dirty = true;
- } else if (this.sync) {
- this.run();
- } else {
- queueWatcher(this);
- }
- };
- /**
- * Scheduler job interface.
- * Will be called by the scheduler.
- */
- Watcher.prototype.run = function run () {
- if (this.active) {
- var value = this.get();
- if (
- value !== this.value ||
- // Deep watchers and watchers on Object/Arrays should fire even
- // when the value is the same, because the value may
- // have mutated.
- isObject(value) ||
- this.deep
- ) {
- // set new value
- var oldValue = this.value;
- this.value = value;
- if (this.user) {
- try {
- this.cb.call(this.vm, value, oldValue);
- } catch (e) {
- handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
- }
- } else {
- this.cb.call(this.vm, value, oldValue);
- }
- }
- }
- };
- /**
- * Evaluate the value of the watcher.
- * This only gets called for lazy watchers.
- */
- Watcher.prototype.evaluate = function evaluate () {
- this.value = this.get();
- this.dirty = false;
- };
- /**
- * Depend on all deps collected by this watcher.
- */
- Watcher.prototype.depend = function depend () {
- var i = this.deps.length;
- while (i--) {
- this.deps[i].depend();
- }
- };
- /**
- * Remove self from all dependencies' subscriber list.
- */
- Watcher.prototype.teardown = function teardown () {
- if (this.active) {
- // remove self from vm's watcher list
- // this is a somewhat expensive operation so we skip it
- // if the vm is being destroyed.
- if (!this.vm._isBeingDestroyed) {
- remove(this.vm._watchers, this);
- }
- var i = this.deps.length;
- while (i--) {
- this.deps[i].removeSub(this);
- }
- this.active = false;
- }
- };
- /* */
- var sharedPropertyDefinition = {
- enumerable: true,
- configurable: true,
- get: noop,
- set: noop
- };
- function proxy (target, sourceKey, key) {
- sharedPropertyDefinition.get = function proxyGetter () {
- return this[sourceKey][key]
- };
- sharedPropertyDefinition.set = function proxySetter (val) {
- this[sourceKey][key] = val;
- };
- Object.defineProperty(target, key, sharedPropertyDefinition);
- }
- function initState (vm) {
- vm._watchers = [];
- var opts = vm.$options;
- if (opts.props) { initProps(vm, opts.props); }
- if (opts.methods) { initMethods(vm, opts.methods); }
- if (opts.data) {
- initData(vm);
- } else {
- observe(vm._data = {}, true /* asRootData */);
- }
- if (opts.computed) { initComputed(vm, opts.computed); }
- if (opts.watch && opts.watch !== nativeWatch) {
- initWatch(vm, opts.watch);
- }
- }
- function initProps (vm, propsOptions) {
- var propsData = vm.$options.propsData || {};
- var props = vm._props = {};
- // cache prop keys so that future props updates can iterate using Array
- // instead of dynamic object key enumeration.
- var keys = vm.$options._propKeys = [];
- var isRoot = !vm.$parent;
- // root instance props should be converted
- if (!isRoot) {
- toggleObserving(false);
- }
- var loop = function ( key ) {
- keys.push(key);
- var value = validateProp(key, propsOptions, propsData, vm);
- /* istanbul ignore else */
- if (true) {
- var hyphenatedKey = hyphenate(key);
- if (isReservedAttribute(hyphenatedKey) ||
- config.isReservedAttr(hyphenatedKey)) {
- warn(
- ("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
- vm
- );
- }
- defineReactive$$1(props, key, value, function () {
- if (!isRoot && !isUpdatingChildComponent) {
- {
- if(vm.mpHost === 'mp-baidu'){//百度 observer 在 setData callback 之后触发,直接忽略该 warn
- return
- }
- //fixed by xxxxxx __next_tick_pending,uni://form-field 时不告警
- if(
- key === 'value' &&
- Array.isArray(vm.$options.behaviors) &&
- vm.$options.behaviors.indexOf('uni://form-field') !== -1
- ){
- return
- }
- if(vm._getFormData){
- return
- }
- var $parent = vm.$parent;
- while($parent){
- if($parent.__next_tick_pending){
- return
- }
- $parent = $parent.$parent;
- }
- }
- warn(
- "Avoid mutating a prop directly since the value will be " +
- "overwritten whenever the parent component re-renders. " +
- "Instead, use a data or computed property based on the prop's " +
- "value. Prop being mutated: \"" + key + "\"",
- vm
- );
- }
- });
- } else {}
- // static props are already proxied on the component's prototype
- // during Vue.extend(). We only need to proxy props defined at
- // instantiation here.
- if (!(key in vm)) {
- proxy(vm, "_props", key);
- }
- };
- for (var key in propsOptions) loop( key );
- toggleObserving(true);
- }
- function initData (vm) {
- var data = vm.$options.data;
- data = vm._data = typeof data === 'function'
- ? getData(data, vm)
- : data || {};
- if (!isPlainObject(data)) {
- data = {};
- true && warn(
- 'data functions should return an object:\n' +
- 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
- vm
- );
- }
- // proxy data on instance
- var keys = Object.keys(data);
- var props = vm.$options.props;
- var methods = vm.$options.methods;
- var i = keys.length;
- while (i--) {
- var key = keys[i];
- if (true) {
- if (methods && hasOwn(methods, key)) {
- warn(
- ("Method \"" + key + "\" has already been defined as a data property."),
- vm
- );
- }
- }
- if (props && hasOwn(props, key)) {
- true && warn(
- "The data property \"" + key + "\" is already declared as a prop. " +
- "Use prop default value instead.",
- vm
- );
- } else if (!isReserved(key)) {
- proxy(vm, "_data", key);
- }
- }
- // observe data
- observe(data, true /* asRootData */);
- }
- function getData (data, vm) {
- // #7573 disable dep collection when invoking data getters
- pushTarget();
- try {
- return data.call(vm, vm)
- } catch (e) {
- handleError(e, vm, "data()");
- return {}
- } finally {
- popTarget();
- }
- }
- var computedWatcherOptions = { lazy: true };
- function initComputed (vm, computed) {
- // $flow-disable-line
- var watchers = vm._computedWatchers = Object.create(null);
- // computed properties are just getters during SSR
- var isSSR = isServerRendering();
- for (var key in computed) {
- var userDef = computed[key];
- var getter = typeof userDef === 'function' ? userDef : userDef.get;
- if ( true && getter == null) {
- warn(
- ("Getter is missing for computed property \"" + key + "\"."),
- vm
- );
- }
- if (!isSSR) {
- // create internal watcher for the computed property.
- watchers[key] = new Watcher(
- vm,
- getter || noop,
- noop,
- computedWatcherOptions
- );
- }
- // component-defined computed properties are already defined on the
- // component prototype. We only need to define computed properties defined
- // at instantiation here.
- if (!(key in vm)) {
- defineComputed(vm, key, userDef);
- } else if (true) {
- if (key in vm.$data) {
- warn(("The computed property \"" + key + "\" is already defined in data."), vm);
- } else if (vm.$options.props && key in vm.$options.props) {
- warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
- }
- }
- }
- }
- function defineComputed (
- target,
- key,
- userDef
- ) {
- var shouldCache = !isServerRendering();
- if (typeof userDef === 'function') {
- sharedPropertyDefinition.get = shouldCache
- ? createComputedGetter(key)
- : createGetterInvoker(userDef);
- sharedPropertyDefinition.set = noop;
- } else {
- sharedPropertyDefinition.get = userDef.get
- ? shouldCache && userDef.cache !== false
- ? createComputedGetter(key)
- : createGetterInvoker(userDef.get)
- : noop;
- sharedPropertyDefinition.set = userDef.set || noop;
- }
- if ( true &&
- sharedPropertyDefinition.set === noop) {
- sharedPropertyDefinition.set = function () {
- warn(
- ("Computed property \"" + key + "\" was assigned to but it has no setter."),
- this
- );
- };
- }
- Object.defineProperty(target, key, sharedPropertyDefinition);
- }
- function createComputedGetter (key) {
- return function computedGetter () {
- var watcher = this._computedWatchers && this._computedWatchers[key];
- if (watcher) {
- if (watcher.dirty) {
- watcher.evaluate();
- }
- if (Dep.SharedObject.target) {// fixed by xxxxxx
- watcher.depend();
- }
- return watcher.value
- }
- }
- }
- function createGetterInvoker(fn) {
- return function computedGetter () {
- return fn.call(this, this)
- }
- }
- function initMethods (vm, methods) {
- var props = vm.$options.props;
- for (var key in methods) {
- if (true) {
- if (typeof methods[key] !== 'function') {
- warn(
- "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
- "Did you reference the function correctly?",
- vm
- );
- }
- if (props && hasOwn(props, key)) {
- warn(
- ("Method \"" + key + "\" has already been defined as a prop."),
- vm
- );
- }
- if ((key in vm) && isReserved(key)) {
- warn(
- "Method \"" + key + "\" conflicts with an existing Vue instance method. " +
- "Avoid defining component methods that start with _ or $."
- );
- }
- }
- vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
- }
- }
- function initWatch (vm, watch) {
- for (var key in watch) {
- var handler = watch[key];
- if (Array.isArray(handler)) {
- for (var i = 0; i < handler.length; i++) {
- createWatcher(vm, key, handler[i]);
- }
- } else {
- createWatcher(vm, key, handler);
- }
- }
- }
- function createWatcher (
- vm,
- expOrFn,
- handler,
- options
- ) {
- if (isPlainObject(handler)) {
- options = handler;
- handler = handler.handler;
- }
- if (typeof handler === 'string') {
- handler = vm[handler];
- }
- return vm.$watch(expOrFn, handler, options)
- }
- function stateMixin (Vue) {
- // flow somehow has problems with directly declared definition object
- // when using Object.defineProperty, so we have to procedurally build up
- // the object here.
- var dataDef = {};
- dataDef.get = function () { return this._data };
- var propsDef = {};
- propsDef.get = function () { return this._props };
- if (true) {
- dataDef.set = function () {
- warn(
- 'Avoid replacing instance root $data. ' +
- 'Use nested data properties instead.',
- this
- );
- };
- propsDef.set = function () {
- warn("$props is readonly.", this);
- };
- }
- Object.defineProperty(Vue.prototype, '$data', dataDef);
- Object.defineProperty(Vue.prototype, '$props', propsDef);
- Vue.prototype.$set = set;
- Vue.prototype.$delete = del;
- Vue.prototype.$watch = function (
- expOrFn,
- cb,
- options
- ) {
- var vm = this;
- if (isPlainObject(cb)) {
- return createWatcher(vm, expOrFn, cb, options)
- }
- options = options || {};
- options.user = true;
- var watcher = new Watcher(vm, expOrFn, cb, options);
- if (options.immediate) {
- try {
- cb.call(vm, watcher.value);
- } catch (error) {
- handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
- }
- }
- return function unwatchFn () {
- watcher.teardown();
- }
- };
- }
- /* */
- var uid$3 = 0;
- function initMixin (Vue) {
- Vue.prototype._init = function (options) {
- var vm = this;
- // a uid
- vm._uid = uid$3++;
- var startTag, endTag;
- /* istanbul ignore if */
- if ( true && config.performance && mark) {
- startTag = "vue-perf-start:" + (vm._uid);
- endTag = "vue-perf-end:" + (vm._uid);
- mark(startTag);
- }
- // a flag to avoid this being observed
- vm._isVue = true;
- // merge options
- if (options && options._isComponent) {
- // optimize internal component instantiation
- // since dynamic options merging is pretty slow, and none of the
- // internal component options needs special treatment.
- initInternalComponent(vm, options);
- } else {
- vm.$options = mergeOptions(
- resolveConstructorOptions(vm.constructor),
- options || {},
- vm
- );
- }
- /* istanbul ignore else */
- if (true) {
- initProxy(vm);
- } else {}
- // expose real self
- vm._self = vm;
- initLifecycle(vm);
- initEvents(vm);
- initRender(vm);
- callHook(vm, 'beforeCreate');
- !vm._$fallback && initInjections(vm); // resolve injections before data/props
- initState(vm);
- !vm._$fallback && initProvide(vm); // resolve provide after data/props
- !vm._$fallback && callHook(vm, 'created');
- /* istanbul ignore if */
- if ( true && config.performance && mark) {
- vm._name = formatComponentName(vm, false);
- mark(endTag);
- measure(("vue " + (vm._name) + " init"), startTag, endTag);
- }
- if (vm.$options.el) {
- vm.$mount(vm.$options.el);
- }
- };
- }
- function initInternalComponent (vm, options) {
- var opts = vm.$options = Object.create(vm.constructor.options);
- // doing this because it's faster than dynamic enumeration.
- var parentVnode = options._parentVnode;
- opts.parent = options.parent;
- opts._parentVnode = parentVnode;
- var vnodeComponentOptions = parentVnode.componentOptions;
- opts.propsData = vnodeComponentOptions.propsData;
- opts._parentListeners = vnodeComponentOptions.listeners;
- opts._renderChildren = vnodeComponentOptions.children;
- opts._componentTag = vnodeComponentOptions.tag;
- if (options.render) {
- opts.render = options.render;
- opts.staticRenderFns = options.staticRenderFns;
- }
- }
- function resolveConstructorOptions (Ctor) {
- var options = Ctor.options;
- if (Ctor.super) {
- var superOptions = resolveConstructorOptions(Ctor.super);
- var cachedSuperOptions = Ctor.superOptions;
- if (superOptions !== cachedSuperOptions) {
- // super option changed,
- // need to resolve new options.
- Ctor.superOptions = superOptions;
- // check if there are any late-modified/attached options (#4976)
- var modifiedOptions = resolveModifiedOptions(Ctor);
- // update base extend options
- if (modifiedOptions) {
- extend(Ctor.extendOptions, modifiedOptions);
- }
- options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
- if (options.name) {
- options.components[options.name] = Ctor;
- }
- }
- }
- return options
- }
- function resolveModifiedOptions (Ctor) {
- var modified;
- var latest = Ctor.options;
- var sealed = Ctor.sealedOptions;
- for (var key in latest) {
- if (latest[key] !== sealed[key]) {
- if (!modified) { modified = {}; }
- modified[key] = latest[key];
- }
- }
- return modified
- }
- function Vue (options) {
- if ( true &&
- !(this instanceof Vue)
- ) {
- warn('Vue is a constructor and should be called with the `new` keyword');
- }
- this._init(options);
- }
- initMixin(Vue);
- stateMixin(Vue);
- eventsMixin(Vue);
- lifecycleMixin(Vue);
- renderMixin(Vue);
- /* */
- function initUse (Vue) {
- Vue.use = function (plugin) {
- var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
- if (installedPlugins.indexOf(plugin) > -1) {
- return this
- }
- // additional parameters
- var args = toArray(arguments, 1);
- args.unshift(this);
- if (typeof plugin.install === 'function') {
- plugin.install.apply(plugin, args);
- } else if (typeof plugin === 'function') {
- plugin.apply(null, args);
- }
- installedPlugins.push(plugin);
- return this
- };
- }
- /* */
- function initMixin$1 (Vue) {
- Vue.mixin = function (mixin) {
- this.options = mergeOptions(this.options, mixin);
- return this
- };
- }
- /* */
- function initExtend (Vue) {
- /**
- * Each instance constructor, including Vue, has a unique
- * cid. This enables us to create wrapped "child
- * constructors" for prototypal inheritance and cache them.
- */
- Vue.cid = 0;
- var cid = 1;
- /**
- * Class inheritance
- */
- Vue.extend = function (extendOptions) {
- extendOptions = extendOptions || {};
- var Super = this;
- var SuperId = Super.cid;
- var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
- if (cachedCtors[SuperId]) {
- return cachedCtors[SuperId]
- }
- var name = extendOptions.name || Super.options.name;
- if ( true && name) {
- validateComponentName(name);
- }
- var Sub = function VueComponent (options) {
- this._init(options);
- };
- Sub.prototype = Object.create(Super.prototype);
- Sub.prototype.constructor = Sub;
- Sub.cid = cid++;
- Sub.options = mergeOptions(
- Super.options,
- extendOptions
- );
- Sub['super'] = Super;
- // For props and computed properties, we define the proxy getters on
- // the Vue instances at extension time, on the extended prototype. This
- // avoids Object.defineProperty calls for each instance created.
- if (Sub.options.props) {
- initProps$1(Sub);
- }
- if (Sub.options.computed) {
- initComputed$1(Sub);
- }
- // allow further extension/mixin/plugin usage
- Sub.extend = Super.extend;
- Sub.mixin = Super.mixin;
- Sub.use = Super.use;
- // create asset registers, so extended classes
- // can have their private assets too.
- ASSET_TYPES.forEach(function (type) {
- Sub[type] = Super[type];
- });
- // enable recursive self-lookup
- if (name) {
- Sub.options.components[name] = Sub;
- }
- // keep a reference to the super options at extension time.
- // later at instantiation we can check if Super's options have
- // been updated.
- Sub.superOptions = Super.options;
- Sub.extendOptions = extendOptions;
- Sub.sealedOptions = extend({}, Sub.options);
- // cache constructor
- cachedCtors[SuperId] = Sub;
- return Sub
- };
- }
- function initProps$1 (Comp) {
- var props = Comp.options.props;
- for (var key in props) {
- proxy(Comp.prototype, "_props", key);
- }
- }
- function initComputed$1 (Comp) {
- var computed = Comp.options.computed;
- for (var key in computed) {
- defineComputed(Comp.prototype, key, computed[key]);
- }
- }
- /* */
- function initAssetRegisters (Vue) {
- /**
- * Create asset registration methods.
- */
- ASSET_TYPES.forEach(function (type) {
- Vue[type] = function (
- id,
- definition
- ) {
- if (!definition) {
- return this.options[type + 's'][id]
- } else {
- /* istanbul ignore if */
- if ( true && type === 'component') {
- validateComponentName(id);
- }
- if (type === 'component' && isPlainObject(definition)) {
- definition.name = definition.name || id;
- definition = this.options._base.extend(definition);
- }
- if (type === 'directive' && typeof definition === 'function') {
- definition = { bind: definition, update: definition };
- }
- this.options[type + 's'][id] = definition;
- return definition
- }
- };
- });
- }
- /* */
- function getComponentName (opts) {
- return opts && (opts.Ctor.options.name || opts.tag)
- }
- function matches (pattern, name) {
- if (Array.isArray(pattern)) {
- return pattern.indexOf(name) > -1
- } else if (typeof pattern === 'string') {
- return pattern.split(',').indexOf(name) > -1
- } else if (isRegExp(pattern)) {
- return pattern.test(name)
- }
- /* istanbul ignore next */
- return false
- }
- function pruneCache (keepAliveInstance, filter) {
- var cache = keepAliveInstance.cache;
- var keys = keepAliveInstance.keys;
- var _vnode = keepAliveInstance._vnode;
- for (var key in cache) {
- var cachedNode = cache[key];
- if (cachedNode) {
- var name = getComponentName(cachedNode.componentOptions);
- if (name && !filter(name)) {
- pruneCacheEntry(cache, key, keys, _vnode);
- }
- }
- }
- }
- function pruneCacheEntry (
- cache,
- key,
- keys,
- current
- ) {
- var cached$$1 = cache[key];
- if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
- cached$$1.componentInstance.$destroy();
- }
- cache[key] = null;
- remove(keys, key);
- }
- var patternTypes = [String, RegExp, Array];
- var KeepAlive = {
- name: 'keep-alive',
- abstract: true,
- props: {
- include: patternTypes,
- exclude: patternTypes,
- max: [String, Number]
- },
- created: function created () {
- this.cache = Object.create(null);
- this.keys = [];
- },
- destroyed: function destroyed () {
- for (var key in this.cache) {
- pruneCacheEntry(this.cache, key, this.keys);
- }
- },
- mounted: function mounted () {
- var this$1 = this;
- this.$watch('include', function (val) {
- pruneCache(this$1, function (name) { return matches(val, name); });
- });
- this.$watch('exclude', function (val) {
- pruneCache(this$1, function (name) { return !matches(val, name); });
- });
- },
- render: function render () {
- var slot = this.$slots.default;
- var vnode = getFirstComponentChild(slot);
- var componentOptions = vnode && vnode.componentOptions;
- if (componentOptions) {
- // check pattern
- var name = getComponentName(componentOptions);
- var ref = this;
- var include = ref.include;
- var exclude = ref.exclude;
- if (
- // not included
- (include && (!name || !matches(include, name))) ||
- // excluded
- (exclude && name && matches(exclude, name))
- ) {
- return vnode
- }
- var ref$1 = this;
- var cache = ref$1.cache;
- var keys = ref$1.keys;
- var key = vnode.key == null
- // same constructor may get registered as different local components
- // so cid alone is not enough (#3269)
- ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
- : vnode.key;
- if (cache[key]) {
- vnode.componentInstance = cache[key].componentInstance;
- // make current key freshest
- remove(keys, key);
- keys.push(key);
- } else {
- cache[key] = vnode;
- keys.push(key);
- // prune oldest entry
- if (this.max && keys.length > parseInt(this.max)) {
- pruneCacheEntry(cache, keys[0], keys, this._vnode);
- }
- }
- vnode.data.keepAlive = true;
- }
- return vnode || (slot && slot[0])
- }
- };
- var builtInComponents = {
- KeepAlive: KeepAlive
- };
- /* */
- function initGlobalAPI (Vue) {
- // config
- var configDef = {};
- configDef.get = function () { return config; };
- if (true) {
- configDef.set = function () {
- warn(
- 'Do not replace the Vue.config object, set individual fields instead.'
- );
- };
- }
- Object.defineProperty(Vue, 'config', configDef);
- // exposed util methods.
- // NOTE: these are not considered part of the public API - avoid relying on
- // them unless you are aware of the risk.
- Vue.util = {
- warn: warn,
- extend: extend,
- mergeOptions: mergeOptions,
- defineReactive: defineReactive$$1
- };
- Vue.set = set;
- Vue.delete = del;
- Vue.nextTick = nextTick;
- // 2.6 explicit observable API
- Vue.observable = function (obj) {
- observe(obj);
- return obj
- };
- Vue.options = Object.create(null);
- ASSET_TYPES.forEach(function (type) {
- Vue.options[type + 's'] = Object.create(null);
- });
- // this is used to identify the "base" constructor to extend all plain-object
- // components with in Weex's multi-instance scenarios.
- Vue.options._base = Vue;
- extend(Vue.options.components, builtInComponents);
- initUse(Vue);
- initMixin$1(Vue);
- initExtend(Vue);
- initAssetRegisters(Vue);
- }
- initGlobalAPI(Vue);
- Object.defineProperty(Vue.prototype, '$isServer', {
- get: isServerRendering
- });
- Object.defineProperty(Vue.prototype, '$ssrContext', {
- get: function get () {
- /* istanbul ignore next */
- return this.$vnode && this.$vnode.ssrContext
- }
- });
- // expose FunctionalRenderContext for ssr runtime helper installation
- Object.defineProperty(Vue, 'FunctionalRenderContext', {
- value: FunctionalRenderContext
- });
- Vue.version = '2.6.11';
- /**
- * https://raw.githubusercontent.com/Tencent/westore/master/packages/westore/utils/diff.js
- */
- var ARRAYTYPE = '[object Array]';
- var OBJECTTYPE = '[object Object]';
- // const FUNCTIONTYPE = '[object Function]'
- function diff(current, pre) {
- var result = {};
- syncKeys(current, pre);
- _diff(current, pre, '', result);
- return result
- }
- function syncKeys(current, pre) {
- if (current === pre) { return }
- var rootCurrentType = type(current);
- var rootPreType = type(pre);
- if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {
- if(Object.keys(current).length >= Object.keys(pre).length){
- for (var key in pre) {
- var currentValue = current[key];
- if (currentValue === undefined) {
- current[key] = null;
- } else {
- syncKeys(currentValue, pre[key]);
- }
- }
- }
- } else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {
- if (current.length >= pre.length) {
- pre.forEach(function (item, index) {
- syncKeys(current[index], item);
- });
- }
- }
- }
- function _diff(current, pre, path, result) {
- if (current === pre) { return }
- var rootCurrentType = type(current);
- var rootPreType = type(pre);
- if (rootCurrentType == OBJECTTYPE) {
- if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {
- setResult(result, path, current);
- } else {
- var loop = function ( key ) {
- var currentValue = current[key];
- var preValue = pre[key];
- var currentType = type(currentValue);
- var preType = type(preValue);
- if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {
- if (currentValue != pre[key]) {
- setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
- }
- } else if (currentType == ARRAYTYPE) {
- if (preType != ARRAYTYPE) {
- setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
- } else {
- if (currentValue.length < preValue.length) {
- setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
- } else {
- currentValue.forEach(function (item, index) {
- _diff(item, preValue[index], (path == '' ? '' : path + ".") + key + '[' + index + ']', result);
- });
- }
- }
- } else if (currentType == OBJECTTYPE) {
- if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {
- setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
- } else {
- for (var subKey in currentValue) {
- _diff(currentValue[subKey], preValue[subKey], (path == '' ? '' : path + ".") + key + '.' + subKey, result);
- }
- }
- }
- };
- for (var key in current) loop( key );
- }
- } else if (rootCurrentType == ARRAYTYPE) {
- if (rootPreType != ARRAYTYPE) {
- setResult(result, path, current);
- } else {
- if (current.length < pre.length) {
- setResult(result, path, current);
- } else {
- current.forEach(function (item, index) {
- _diff(item, pre[index], path + '[' + index + ']', result);
- });
- }
- }
- } else {
- setResult(result, path, current);
- }
- }
- function setResult(result, k, v) {
- // if (type(v) != FUNCTIONTYPE) {
- result[k] = v;
- // }
- }
- function type(obj) {
- return Object.prototype.toString.call(obj)
- }
- /* */
- function flushCallbacks$1(vm) {
- if (vm.__next_tick_callbacks && vm.__next_tick_callbacks.length) {
- if (Object({"NODE_ENV":"development","VUE_APP_PLATFORM":"mp-weixin","BASE_URL":"/"}).VUE_APP_DEBUG) {
- var mpInstance = vm.$scope;
- console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
- ']:flushCallbacks[' + vm.__next_tick_callbacks.length + ']');
- }
- var copies = vm.__next_tick_callbacks.slice(0);
- vm.__next_tick_callbacks.length = 0;
- for (var i = 0; i < copies.length; i++) {
- copies[i]();
- }
- }
- }
- function hasRenderWatcher(vm) {
- return queue.find(function (watcher) { return vm._watcher === watcher; })
- }
- function nextTick$1(vm, cb) {
- //1.nextTick 之前 已 setData 且 setData 还未回调完成
- //2.nextTick 之前存在 render watcher
- if (!vm.__next_tick_pending && !hasRenderWatcher(vm)) {
- if(Object({"NODE_ENV":"development","VUE_APP_PLATFORM":"mp-weixin","BASE_URL":"/"}).VUE_APP_DEBUG){
- var mpInstance = vm.$scope;
- console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
- ']:nextVueTick');
- }
- return nextTick(cb, vm)
- }else{
- if(Object({"NODE_ENV":"development","VUE_APP_PLATFORM":"mp-weixin","BASE_URL":"/"}).VUE_APP_DEBUG){
- var mpInstance$1 = vm.$scope;
- console.log('[' + (+new Date) + '][' + (mpInstance$1.is || mpInstance$1.route) + '][' + vm._uid +
- ']:nextMPTick');
- }
- }
- var _resolve;
- if (!vm.__next_tick_callbacks) {
- vm.__next_tick_callbacks = [];
- }
- vm.__next_tick_callbacks.push(function () {
- if (cb) {
- try {
- cb.call(vm);
- } catch (e) {
- handleError(e, vm, 'nextTick');
- }
- } else if (_resolve) {
- _resolve(vm);
- }
- });
- // $flow-disable-line
- if (!cb && typeof Promise !== 'undefined') {
- return new Promise(function (resolve) {
- _resolve = resolve;
- })
- }
- }
- /* */
- function cloneWithData(vm) {
- // 确保当前 vm 所有数据被同步
- var ret = Object.create(null);
- var dataKeys = [].concat(
- Object.keys(vm._data || {}),
- Object.keys(vm._computedWatchers || {}));
- dataKeys.reduce(function(ret, key) {
- ret[key] = vm[key];
- return ret
- }, ret);
- // vue-composition-api
- var rawBindings = vm.__secret_vfa_state__ && vm.__secret_vfa_state__.rawBindings;
- if (rawBindings) {
- Object.keys(rawBindings).forEach(function (key) {
- ret[key] = vm[key];
- });
- }
-
- //TODO 需要把无用数据处理掉,比如 list=>l0 则 list 需要移除,否则多传输一份数据
- Object.assign(ret, vm.$mp.data || {});
- if (
- Array.isArray(vm.$options.behaviors) &&
- vm.$options.behaviors.indexOf('uni://form-field') !== -1
- ) { //form-field
- ret['name'] = vm.name;
- ret['value'] = vm.value;
- }
- return JSON.parse(JSON.stringify(ret))
- }
- var patch = function(oldVnode, vnode) {
- var this$1 = this;
- if (vnode === null) { //destroy
- return
- }
- if (this.mpType === 'page' || this.mpType === 'component') {
- var mpInstance = this.$scope;
- var data = Object.create(null);
- try {
- data = cloneWithData(this);
- } catch (err) {
- console.error(err);
- }
- data.__webviewId__ = mpInstance.data.__webviewId__;
- var mpData = Object.create(null);
- Object.keys(data).forEach(function (key) { //仅同步 data 中有的数据
- mpData[key] = mpInstance.data[key];
- });
- var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);
- if (Object.keys(diffData).length) {
- if (Object({"NODE_ENV":"development","VUE_APP_PLATFORM":"mp-weixin","BASE_URL":"/"}).VUE_APP_DEBUG) {
- console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + this._uid +
- ']差量更新',
- JSON.stringify(diffData));
- }
- this.__next_tick_pending = true;
- mpInstance.setData(diffData, function () {
- this$1.__next_tick_pending = false;
- flushCallbacks$1(this$1);
- });
- } else {
- flushCallbacks$1(this);
- }
- }
- };
- /* */
- function createEmptyRender() {
- }
- function mountComponent$1(
- vm,
- el,
- hydrating
- ) {
- if (!vm.mpType) {//main.js 中的 new Vue
- return vm
- }
- if (vm.mpType === 'app') {
- vm.$options.render = createEmptyRender;
- }
- if (!vm.$options.render) {
- vm.$options.render = createEmptyRender;
- if (true) {
- /* istanbul ignore if */
- if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
- vm.$options.el || el) {
- warn(
- 'You are using the runtime-only build of Vue where the template ' +
- 'compiler is not available. Either pre-compile the templates into ' +
- 'render functions, or use the compiler-included build.',
- vm
- );
- } else {
- warn(
- 'Failed to mount component: template or render function not defined.',
- vm
- );
- }
- }
- }
-
- !vm._$fallback && callHook(vm, 'beforeMount');
- var updateComponent = function () {
- vm._update(vm._render(), hydrating);
- };
- // we set this to vm._watcher inside the watcher's constructor
- // since the watcher's initial patch may call $forceUpdate (e.g. inside child
- // component's mounted hook), which relies on vm._watcher being already defined
- new Watcher(vm, updateComponent, noop, {
- before: function before() {
- if (vm._isMounted && !vm._isDestroyed) {
- callHook(vm, 'beforeUpdate');
- }
- }
- }, true /* isRenderWatcher */);
- hydrating = false;
- return vm
- }
- /* */
- function renderClass (
- staticClass,
- dynamicClass
- ) {
- if (isDef(staticClass) || isDef(dynamicClass)) {
- return concat(staticClass, stringifyClass(dynamicClass))
- }
- /* istanbul ignore next */
- return ''
- }
- function concat (a, b) {
- return a ? b ? (a + ' ' + b) : a : (b || '')
- }
- function stringifyClass (value) {
- if (Array.isArray(value)) {
- return stringifyArray(value)
- }
- if (isObject(value)) {
- return stringifyObject(value)
- }
- if (typeof value === 'string') {
- return value
- }
- /* istanbul ignore next */
- return ''
- }
- function stringifyArray (value) {
- var res = '';
- var stringified;
- for (var i = 0, l = value.length; i < l; i++) {
- if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
- if (res) { res += ' '; }
- res += stringified;
- }
- }
- return res
- }
- function stringifyObject (value) {
- var res = '';
- for (var key in value) {
- if (value[key]) {
- if (res) { res += ' '; }
- res += key;
- }
- }
- return res
- }
- /* */
- var parseStyleText = cached(function (cssText) {
- var res = {};
- var listDelimiter = /;(?![^(]*\))/g;
- var propertyDelimiter = /:(.+)/;
- cssText.split(listDelimiter).forEach(function (item) {
- if (item) {
- var tmp = item.split(propertyDelimiter);
- tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
- }
- });
- return res
- });
- // normalize possible array / string values into Object
- function normalizeStyleBinding (bindingStyle) {
- if (Array.isArray(bindingStyle)) {
- return toObject(bindingStyle)
- }
- if (typeof bindingStyle === 'string') {
- return parseStyleText(bindingStyle)
- }
- return bindingStyle
- }
- /* */
- var MP_METHODS = ['createSelectorQuery', 'createIntersectionObserver', 'selectAllComponents', 'selectComponent'];
- function getTarget(obj, path) {
- var parts = path.split('.');
- var key = parts[0];
- if (key.indexOf('__$n') === 0) { //number index
- key = parseInt(key.replace('__$n', ''));
- }
- if (parts.length === 1) {
- return obj[key]
- }
- return getTarget(obj[key], parts.slice(1).join('.'))
- }
- function internalMixin(Vue) {
- Vue.config.errorHandler = function(err, vm, info) {
- Vue.util.warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
- console.error(err);
- /* eslint-disable no-undef */
- var app = getApp();
- if (app && app.onError) {
- app.onError(err);
- }
- };
- var oldEmit = Vue.prototype.$emit;
- Vue.prototype.$emit = function(event) {
- if (this.$scope && event) {
- this.$scope['triggerEvent'](event, {
- __args__: toArray(arguments, 1)
- });
- }
- return oldEmit.apply(this, arguments)
- };
- Vue.prototype.$nextTick = function(fn) {
- return nextTick$1(this, fn)
- };
- MP_METHODS.forEach(function (method) {
- Vue.prototype[method] = function(args) {
- if (this.$scope && this.$scope[method]) {
- return this.$scope[method](args)
- }
- // mp-alipay
- if (typeof my === 'undefined') {
- return
- }
- if (method === 'createSelectorQuery') {
- /* eslint-disable no-undef */
- return my.createSelectorQuery(args)
- } else if (method === 'createIntersectionObserver') {
- /* eslint-disable no-undef */
- return my.createIntersectionObserver(args)
- }
- // TODO mp-alipay 暂不支持 selectAllComponents,selectComponent
- };
- });
- Vue.prototype.__init_provide = initProvide;
- Vue.prototype.__init_injections = initInjections;
- Vue.prototype.__call_hook = function(hook, args) {
- var vm = this;
- // #7573 disable dep collection when invoking lifecycle hooks
- pushTarget();
- var handlers = vm.$options[hook];
- var info = hook + " hook";
- var ret;
- if (handlers) {
- for (var i = 0, j = handlers.length; i < j; i++) {
- ret = invokeWithErrorHandling(handlers[i], vm, args ? [args] : null, vm, info);
- }
- }
- if (vm._hasHookEvent) {
- vm.$emit('hook:' + hook, args);
- }
- popTarget();
- return ret
- };
- Vue.prototype.__set_model = function(target, key, value, modifiers) {
- if (Array.isArray(modifiers)) {
- if (modifiers.indexOf('trim') !== -1) {
- value = value.trim();
- }
- if (modifiers.indexOf('number') !== -1) {
- value = this._n(value);
- }
- }
- if (!target) {
- target = this;
- }
- target[key] = value;
- };
- Vue.prototype.__set_sync = function(target, key, value) {
- if (!target) {
- target = this;
- }
- target[key] = value;
- };
- Vue.prototype.__get_orig = function(item) {
- if (isPlainObject(item)) {
- return item['$orig'] || item
- }
- return item
- };
- Vue.prototype.__get_value = function(dataPath, target) {
- return getTarget(target || this, dataPath)
- };
- Vue.prototype.__get_class = function(dynamicClass, staticClass) {
- return renderClass(staticClass, dynamicClass)
- };
- Vue.prototype.__get_style = function(dynamicStyle, staticStyle) {
- if (!dynamicStyle && !staticStyle) {
- return ''
- }
- var dynamicStyleObj = normalizeStyleBinding(dynamicStyle);
- var styleObj = staticStyle ? extend(staticStyle, dynamicStyleObj) : dynamicStyleObj;
- return Object.keys(styleObj).map(function (name) { return ((hyphenate(name)) + ":" + (styleObj[name])); }).join(';')
- };
- Vue.prototype.__map = function(val, iteratee) {
- //TODO 暂不考虑 string
- var ret, i, l, keys, key;
- if (Array.isArray(val)) {
- ret = new Array(val.length);
- for (i = 0, l = val.length; i < l; i++) {
- ret[i] = iteratee(val[i], i);
- }
- return ret
- } else if (isObject(val)) {
- keys = Object.keys(val);
- ret = Object.create(null);
- for (i = 0, l = keys.length; i < l; i++) {
- key = keys[i];
- ret[key] = iteratee(val[key], key, i);
- }
- return ret
- } else if (typeof val === 'number') {
- ret = new Array(val);
- for (i = 0, l = val; i < l; i++) {
- // 第一个参数暂时仍和小程序一致
- ret[i] = iteratee(i, i);
- }
- return ret
- }
- return []
- };
- }
- /* */
- var LIFECYCLE_HOOKS$1 = [
- //App
- 'onLaunch',
- 'onShow',
- 'onHide',
- 'onUniNViewMessage',
- 'onPageNotFound',
- 'onThemeChange',
- 'onError',
- 'onUnhandledRejection',
- //Page
- 'onLoad',
- // 'onShow',
- 'onReady',
- // 'onHide',
- 'onUnload',
- 'onPullDownRefresh',
- 'onReachBottom',
- 'onTabItemTap',
- 'onAddToFavorites',
- 'onShareTimeline',
- 'onShareAppMessage',
- 'onResize',
- 'onPageScroll',
- 'onNavigationBarButtonTap',
- 'onBackPress',
- 'onNavigationBarSearchInputChanged',
- 'onNavigationBarSearchInputConfirmed',
- 'onNavigationBarSearchInputClicked',
- //Component
- // 'onReady', // 兼容旧版本,应该移除该事件
- 'onPageShow',
- 'onPageHide',
- 'onPageResize'
- ];
- function lifecycleMixin$1(Vue) {
- //fixed vue-class-component
- var oldExtend = Vue.extend;
- Vue.extend = function(extendOptions) {
- extendOptions = extendOptions || {};
- var methods = extendOptions.methods;
- if (methods) {
- Object.keys(methods).forEach(function (methodName) {
- if (LIFECYCLE_HOOKS$1.indexOf(methodName)!==-1) {
- extendOptions[methodName] = methods[methodName];
- delete methods[methodName];
- }
- });
- }
- return oldExtend.call(this, extendOptions)
- };
- var strategies = Vue.config.optionMergeStrategies;
- var mergeHook = strategies.created;
- LIFECYCLE_HOOKS$1.forEach(function (hook) {
- strategies[hook] = mergeHook;
- });
- Vue.prototype.__lifecycle_hooks__ = LIFECYCLE_HOOKS$1;
- }
- /* */
- // install platform patch function
- Vue.prototype.__patch__ = patch;
- // public mount method
- Vue.prototype.$mount = function(
- el ,
- hydrating
- ) {
- return mountComponent$1(this, el, hydrating)
- };
- lifecycleMixin$1(Vue);
- internalMixin(Vue);
- /* */
- /* harmony default export */ __webpack_exports__["default"] = (Vue);
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ 3)))
- /***/ }),
- /***/ 3:
- /*!***********************************!*\
- !*** (webpack)/buildin/global.js ***!
- \***********************************/
- /*! no static exports found */
- /***/ (function(module, exports) {
- var g;
- // This works in non-strict mode
- g = (function() {
- return this;
- })();
- try {
- // This works if eval is allowed (see CSP)
- g = g || new Function("return this")();
- } catch (e) {
- // This works if the window reference is available
- if (typeof window === "object") g = window;
- }
- // g can still be undefined, but nothing to do about it...
- // We return undefined, instead of nothing here, so it's
- // easier to handle this case. if(!global) { ...}
- module.exports = g;
- /***/ }),
- /***/ 4:
- /*!***************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/pages.json ***!
- \***************************************************/
- /*! no static exports found */
- /***/ (function(module, exports) {
- /***/ }),
- /***/ 40:
- /*!***************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/static/html/js/test.js ***!
- \***************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {var require;var require;/*
- html2canvas 0.5.0-beta4 <http://html2canvas.hertzen.com>
- Copyright (c) 2017 Niklas von Hertzen
- 2017-06-14 Custom build by Erik Koopmans, featuring latest bugfixes and features
- Released under MIT License
- */
- (function (f) {if (true) {module.exports = f();} else { var g; }})(function () {var define, module, exports;return function e(t, n, r) {function s(o, u) {if (!n[o]) {if (!t[o]) {var a = typeof require == "function" && require;if (!u && a) return require(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw f.code = "MODULE_NOT_FOUND", f;}var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {var n = t[o][1][e];return s(n ? n : e);}, l, l.exports, e, t, n, r);}return n[o].exports;}var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) {s(r[o]);}return s;}({ 1: [function (_dereq_, module, exports) {
- (function (global) {
- /*! https://mths.be/punycode v1.4.1 by @mathias */
- ;(function (root) {
- /** Detect free variables */
- var freeExports = typeof exports == 'object' && exports &&
- !exports.nodeType && exports;
- var freeModule = typeof module == 'object' && module &&
- !module.nodeType && module;
- var freeGlobal = typeof global == 'object' && global;
- if (
- freeGlobal.global === freeGlobal ||
- freeGlobal.window === freeGlobal ||
- freeGlobal.self === freeGlobal)
- {
- root = freeGlobal;
- }
- /**
- * The `punycode` object.
- * @name punycode
- * @type Object
- */
- var punycode,
- /** Highest positive signed 32-bit float value */
- maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
- /** Bootstring parameters */
- base = 36,
- tMin = 1,
- tMax = 26,
- skew = 38,
- damp = 700,
- initialBias = 72,
- initialN = 128, // 0x80
- delimiter = '-', // '\x2D'
- /** Regular expressions */
- regexPunycode = /^xn--/,
- regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
- regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
- /** Error messages */
- errors = {
- 'overflow': 'Overflow: input needs wider integers to process',
- 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input' },
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
- /** Temporary variable */
- key;
- /*--------------------------------------------------------------------------*/
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw new RangeError(errors[type]);
- }
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- var result = [];
- while (length--) {
- result[length] = fn(array[length]);
- }
- return result;
- }
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings or email
- * addresses.
- * @private
- * @param {String} domain The domain name or email address.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- var parts = string.split('@');
- var result = '';
- if (parts.length > 1) {
- // In email addresses, only the domain name should be punycoded. Leave
- // the local part (i.e. everything up to `@`) intact.
- result = parts[0] + '@';
- string = parts[1];
- }
- // Avoid `split(regex)` for IE8 compatibility. See #17.
- string = string.replace(regexSeparators, '\x2E');
- var labels = string.split('.');
- var encoded = map(labels, fn).join('.');
- return result + encoded;
- }
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // high surrogate, and there is a next character
- extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) {// low surrogate
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // unmatched surrogate; only append this code unit, in case the next
- // code unit is the high surrogate of a surrogate pair
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- }
- /**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function (value) {
- var output = '';
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- if (codePoint - 48 < 10) {
- return codePoint - 22;
- }
- if (codePoint - 65 < 26) {
- return codePoint - 65;
- }
- if (codePoint - 97 < 26) {
- return codePoint - 97;
- }
- return base;
- }
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
- /**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- /** Cached calculation results */
- baseMinusT;
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base;; /* no condition */k += base) {
- if (index >= inputLength) {
- error('invalid-input');
- }
- digit = basicToDigit(input.charCodeAt(index++));
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
- i += digit * w;
- t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
- if (digit < t) {
- break;
- }
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
- w *= baseMinusT;
- }
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
- n += floor(i / out);
- i %= out;
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
- }
- return ucs2encode(output);
- }
- /**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
- // Cache the length
- inputLength = input.length;
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
- handledCPCount = basicLength = output.length;
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
- // Main encoding loop:
- while (handledCPCount < inputLength) {
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
- // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base;; /* no condition */k += base) {
- t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
- q = floor(qMinusT / baseMinusT);
- }
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
- ++delta;
- ++n;
- }
- return output.join('');
- }
- /**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
- * it doesn't matter if you call it on a string that has already been
- * converted to Unicode.
- * @memberOf punycode
- * @param {String} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(input) {
- return mapDomain(input, function (string) {
- return regexPunycode.test(string) ?
- decode(string.slice(4).toLowerCase()) :
- string;
- });
- }
- /**
- * Converts a Unicode string representing a domain name or an email address to
- * Punycode. Only the non-ASCII parts of the domain name will be converted,
- * i.e. it doesn't matter if you call it with a domain that's already in
- * ASCII.
- * @memberOf punycode
- * @param {String} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {String} The Punycode representation of the given domain name or
- * email address.
- */
- function toASCII(input) {
- return mapDomain(input, function (string) {
- return regexNonASCII.test(string) ?
- 'xn--' + encode(string) :
- string;
- });
- }
- /*--------------------------------------------------------------------------*/
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.4.1',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see <https://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode };
- /** Expose `punycode` */
- // Some AMD build optimizers, like r.js, check for specific condition patterns
- // like the following:
- if (
- typeof define == 'function' &&
- typeof define.amd == 'object' &&
- define.amd)
- {
- define('punycode', function () {
- return punycode;
- });
- } else if (freeExports && freeModule) {
- if (module.exports == freeExports) {
- // in Node.js, io.js, or RingoJS v0.8.0+
- freeModule.exports = punycode;
- } else {
- // in Narwhal or RingoJS v0.7.0-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else {
- // in Rhino or a web browser
- root.punycode = punycode;
- }
- })(this);
- }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
- }, {}], 2: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- function restoreOwnerScroll(ownerDocument, x, y) {
- if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {
- ownerDocument.defaultView.scrollTo(x, y);
- }
- }
- function cloneCanvasContents(canvas, clonedCanvas) {
- try {
- if (clonedCanvas) {
- clonedCanvas.width = canvas.width;
- clonedCanvas.height = canvas.height;
- clonedCanvas.getContext("2d").putImageData(canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height), 0, 0);
- }
- } catch (e) {
- log("Unable to copy canvas content from", canvas, e);
- }
- }
- function cloneNode(node, javascriptEnabled) {
- var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false);
- var child = node.firstChild;
- while (child) {
- if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') {
- clone.appendChild(cloneNode(child, javascriptEnabled));
- }
- child = child.nextSibling;
- }
- if (node.nodeType === 1) {
- clone._scrollTop = node.scrollTop;
- clone._scrollLeft = node.scrollLeft;
- if (node.nodeName === "CANVAS") {
- cloneCanvasContents(node, clone);
- } else if (node.nodeName === "TEXTAREA" || node.nodeName === "SELECT") {
- clone.value = node.value;
- }
- }
- return clone;
- }
- function initNode(node) {
- if (node.nodeType === 1) {
- node.scrollTop = node._scrollTop;
- node.scrollLeft = node._scrollLeft;
- var child = node.firstChild;
- while (child) {
- initNode(child);
- child = child.nextSibling;
- }
- }
- }
- module.exports = function (ownerDocument, containerDocument, width, height, options, x, y) {
- var documentElement = cloneNode(ownerDocument.documentElement, options.javascriptEnabled);
- var container = containerDocument.createElement("iframe");
- container.className = "html2canvas-container";
- container.style.visibility = "hidden";
- container.style.position = "fixed";
- container.style.left = "-10000px";
- container.style.top = "0px";
- container.style.border = "0";
- container.width = width;
- container.height = height;
- container.scrolling = "no"; // ios won't scroll without it
- containerDocument.body.appendChild(container);
- return new Promise(function (resolve) {
- var documentClone = container.contentWindow.document;
- /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle
- if window url is about:blank, we can assign the url to current by writing onto the document
- */
- container.contentWindow.onload = container.onload = function () {
- var interval = setInterval(function () {
- if (documentClone.body.childNodes.length > 0) {
- initNode(documentClone.documentElement);
- clearInterval(interval);
- if (options.type === "view") {
- container.contentWindow.scrollTo(x, y);
- if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) && (container.contentWindow.scrollY !== y || container.contentWindow.scrollX !== x)) {
- documentClone.documentElement.style.top = -y + "px";
- documentClone.documentElement.style.left = -x + "px";
- documentClone.documentElement.style.position = 'absolute';
- }
- }
- resolve(container);
- }
- }, 50);
- };
- documentClone.open();
- documentClone.write("<!DOCTYPE html><html></html>");
- // Chrome scrolls the parent document for some reason after the write to the cloned window???
- restoreOwnerScroll(ownerDocument, x, y);
- documentClone.replaceChild(documentClone.adoptNode(documentElement), documentClone.documentElement);
- documentClone.close();
- });
- };
- }, { "./log": 13 }], 3: [function (_dereq_, module, exports) {
- // http://dev.w3.org/csswg/css-color/
- function Color(value) {
- this.r = 0;
- this.g = 0;
- this.b = 0;
- this.a = null;
- var result = this.fromArray(value) ||
- this.namedColor(value) ||
- this.rgb(value) ||
- this.rgba(value) ||
- this.hex6(value) ||
- this.hex3(value);
- }
- Color.prototype.darken = function (amount) {
- var a = 1 - amount;
- return new Color([
- Math.round(this.r * a),
- Math.round(this.g * a),
- Math.round(this.b * a),
- this.a]);
- };
- Color.prototype.isTransparent = function () {
- return this.a === 0;
- };
- Color.prototype.isBlack = function () {
- return this.r === 0 && this.g === 0 && this.b === 0;
- };
- Color.prototype.fromArray = function (array) {
- if (Array.isArray(array)) {
- this.r = Math.min(array[0], 255);
- this.g = Math.min(array[1], 255);
- this.b = Math.min(array[2], 255);
- if (array.length > 3) {
- this.a = array[3];
- }
- }
- return Array.isArray(array);
- };
- var _hex3 = /^#([a-f0-9]{3})$/i;
- Color.prototype.hex3 = function (value) {
- var match = null;
- if ((match = value.match(_hex3)) !== null) {
- this.r = parseInt(match[1][0] + match[1][0], 16);
- this.g = parseInt(match[1][1] + match[1][1], 16);
- this.b = parseInt(match[1][2] + match[1][2], 16);
- }
- return match !== null;
- };
- var _hex6 = /^#([a-f0-9]{6})$/i;
- Color.prototype.hex6 = function (value) {
- var match = null;
- if ((match = value.match(_hex6)) !== null) {
- this.r = parseInt(match[1].substring(0, 2), 16);
- this.g = parseInt(match[1].substring(2, 4), 16);
- this.b = parseInt(match[1].substring(4, 6), 16);
- }
- return match !== null;
- };
- var _rgb = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;
- Color.prototype.rgb = function (value) {
- var match = null;
- if ((match = value.match(_rgb)) !== null) {
- this.r = Number(match[1]);
- this.g = Number(match[2]);
- this.b = Number(match[3]);
- }
- return match !== null;
- };
- var _rgba = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;
- Color.prototype.rgba = function (value) {
- var match = null;
- if ((match = value.match(_rgba)) !== null) {
- this.r = Number(match[1]);
- this.g = Number(match[2]);
- this.b = Number(match[3]);
- this.a = Number(match[4]);
- }
- return match !== null;
- };
- Color.prototype.toString = function () {
- return this.a !== null && this.a !== 1 ?
- "rgba(" + [this.r, this.g, this.b, this.a].join(",") + ")" :
- "rgb(" + [this.r, this.g, this.b].join(",") + ")";
- };
- Color.prototype.namedColor = function (value) {
- value = value.toLowerCase();
- var color = colors[value];
- if (color) {
- this.r = color[0];
- this.g = color[1];
- this.b = color[2];
- } else if (value === "transparent") {
- this.r = this.g = this.b = this.a = 0;
- return true;
- }
- return !!color;
- };
- Color.prototype.isColor = true;
- // JSON.stringify([].slice.call($$('.named-color-table tr'), 1).map(function(row) { return [row.childNodes[3].textContent, row.childNodes[5].textContent.trim().split(",").map(Number)] }).reduce(function(data, row) {data[row[0]] = row[1]; return data}, {}))
- var colors = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "darkkhaki": [189, 183, 107],
- "darkmagenta": [139, 0, 139],
- "darkolivegreen": [85, 107, 47],
- "darkorange": [255, 140, 0],
- "darkorchid": [153, 50, 204],
- "darkred": [139, 0, 0],
- "darksalmon": [233, 150, 122],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50] };
- module.exports = Color;
- }, {}], 4: [function (_dereq_, module, exports) {
- var Support = _dereq_('./support');
- var CanvasRenderer = _dereq_('./renderers/canvas');
- var ImageLoader = _dereq_('./imageloader');
- var NodeParser = _dereq_('./nodeparser');
- var NodeContainer = _dereq_('./nodecontainer');
- var log = _dereq_('./log');
- var utils = _dereq_('./utils');
- var createWindowClone = _dereq_('./clone');
- var loadUrlDocument = _dereq_('./proxy').loadUrlDocument;
- var getBounds = utils.getBounds;
- var html2canvasNodeAttribute = "data-html2canvas-node";
- var html2canvasCloneIndex = 0;
- function html2canvas(nodeList, options) {
- var index = html2canvasCloneIndex++;
- options = options || {};
- if (options.logging) {
- log.options.logging = true;
- log.options.start = Date.now();
- }
- options.async = typeof options.async === "undefined" ? true : options.async;
- options.allowTaint = typeof options.allowTaint === "undefined" ? false : options.allowTaint;
- options.removeContainer = typeof options.removeContainer === "undefined" ? true : options.removeContainer;
- options.javascriptEnabled = typeof options.javascriptEnabled === "undefined" ? false : options.javascriptEnabled;
- options.imageTimeout = typeof options.imageTimeout === "undefined" ? 10000 : options.imageTimeout;
- options.renderer = typeof options.renderer === "function" ? options.renderer : CanvasRenderer;
- options.strict = !!options.strict;
- if (typeof nodeList === "string") {
- if (typeof options.proxy !== "string") {
- return Promise.reject("Proxy must be used when rendering url");
- }
- var width = options.width != null ? options.width : window.innerWidth;
- var height = options.height != null ? options.height : window.innerHeight;
- return loadUrlDocument(absoluteUrl(nodeList), options.proxy, document, width, height, options).then(function (container) {
- return renderWindow(container.contentWindow.document.documentElement, container, options, width, height);
- });
- }
- var node = (nodeList === undefined ? [document.documentElement] : nodeList.length ? nodeList : [nodeList])[0];
- node.setAttribute(html2canvasNodeAttribute + index, index);
- return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function (canvas) {
- if (typeof options.onrendered === "function") {
- log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
- options.onrendered(canvas);
- }
- return canvas;
- });
- }
- html2canvas.CanvasRenderer = CanvasRenderer;
- html2canvas.NodeContainer = NodeContainer;
- html2canvas.log = log;
- html2canvas.utils = utils;
- var html2canvasExport = typeof document === "undefined" || typeof Object.create !== "function" || typeof document.createElement("canvas").getContext !== "function" ? function () {
- return Promise.reject("No canvas support");
- } : html2canvas;
- module.exports = html2canvasExport;
- if (typeof define === 'function' && define.amd) {
- define('html2canvas', [], function () {
- return html2canvasExport;
- });
- }
- function renderDocument(document, options, windowWidth, windowHeight, html2canvasIndex) {
- return createWindowClone(document, document, windowWidth, windowHeight, options, document.defaultView.pageXOffset, document.defaultView.pageYOffset).then(function (container) {
- log("Document cloned");
- var attributeName = html2canvasNodeAttribute + html2canvasIndex;
- var selector = "[" + attributeName + "='" + html2canvasIndex + "']";
- document.querySelector(selector).removeAttribute(attributeName);
- var clonedWindow = container.contentWindow;
- var node = clonedWindow.document.querySelector(selector);
- var oncloneHandler = typeof options.onclone === "function" ? Promise.resolve(options.onclone(clonedWindow.document)) : Promise.resolve(true);
- return oncloneHandler.then(function () {
- return renderWindow(node, container, options, windowWidth, windowHeight);
- });
- });
- }
- function renderWindow(node, container, options, windowWidth, windowHeight) {
- var clonedWindow = container.contentWindow;
- var support = new Support(clonedWindow.document);
- var imageLoader = new ImageLoader(options, support);
- var bounds = getBounds(node);
- var width = options.type === "view" ? windowWidth : bounds.right + 1;
- var height = options.type === "view" ? windowHeight : bounds.bottom + 1;
- var renderer = new options.renderer(width, height, imageLoader, options, document);
- var parser = new NodeParser(node, renderer, support, imageLoader, options);
- return parser.ready.then(function () {
- log("Finished rendering");
- var canvas;
- if (options.type === "view") {
- canvas = crop(renderer.canvas, { width: renderer.canvas.width, height: renderer.canvas.height, top: 0, left: 0, x: 0, y: 0 });
- } else if (node === clonedWindow.document.body || node === clonedWindow.document.documentElement || options.canvas != null) {
- canvas = renderer.canvas;
- } else if (options.scale) {
- var origBounds = { width: options.width != null ? options.width : bounds.width, height: options.height != null ? options.height : bounds.height, top: bounds.top, left: bounds.left, x: 0, y: 0 };
- var cropBounds = {};
- for (var key in origBounds) {
- if (origBounds.hasOwnProperty(key)) {cropBounds[key] = origBounds[key] * options.scale;}
- }
- canvas = crop(renderer.canvas, cropBounds);
- canvas.style.width = origBounds.width + 'px';
- canvas.style.height = origBounds.height + 'px';
- } else {
- canvas = crop(renderer.canvas, { width: options.width != null ? options.width : bounds.width, height: options.height != null ? options.height : bounds.height, top: bounds.top, left: bounds.left, x: 0, y: 0 });
- }
- cleanupContainer(container, options);
- return canvas;
- });
- }
- function cleanupContainer(container, options) {
- if (options.removeContainer) {
- container.parentNode.removeChild(container);
- log("Cleaned up container");
- }
- }
- function crop(canvas, bounds) {
- var croppedCanvas = document.createElement("canvas");
- var x1 = Math.min(canvas.width - 1, Math.max(0, bounds.left));
- var x2 = Math.min(canvas.width, Math.max(1, bounds.left + bounds.width));
- var y1 = Math.min(canvas.height - 1, Math.max(0, bounds.top));
- var y2 = Math.min(canvas.height, Math.max(1, bounds.top + bounds.height));
- croppedCanvas.width = bounds.width;
- croppedCanvas.height = bounds.height;
- var width = x2 - x1;
- var height = y2 - y1;
- log("Cropping canvas at:", "left:", bounds.left, "top:", bounds.top, "width:", width, "height:", height);
- log("Resulting crop with width", bounds.width, "and height", bounds.height, "with x", x1, "and y", y1);
- croppedCanvas.getContext("2d").drawImage(canvas, x1, y1, width, height, bounds.x, bounds.y, width, height);
- return croppedCanvas;
- }
- function documentWidth(doc) {
- return Math.max(
- Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),
- Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),
- Math.max(doc.body.clientWidth, doc.documentElement.clientWidth));
- }
- function documentHeight(doc) {
- return Math.max(
- Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),
- Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),
- Math.max(doc.body.clientHeight, doc.documentElement.clientHeight));
- }
- function absoluteUrl(url) {
- var link = document.createElement("a");
- link.href = url;
- link.href = link.href;
- return link;
- }
- }, { "./clone": 2, "./imageloader": 11, "./log": 13, "./nodecontainer": 14, "./nodeparser": 15, "./proxy": 16, "./renderers/canvas": 20, "./support": 22, "./utils": 26 }], 5: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var smallImage = _dereq_('./utils').smallImage;
- function DummyImageContainer(src) {
- this.src = src;
- log("DummyImageContainer for", src);
- if (!this.promise || !this.image) {
- log("Initiating DummyImageContainer");
- DummyImageContainer.prototype.image = new Image();
- var image = this.image;
- DummyImageContainer.prototype.promise = new Promise(function (resolve, reject) {
- image.onload = resolve;
- image.onerror = reject;
- image.src = smallImage();
- if (image.complete === true) {
- resolve(image);
- }
- });
- }
- }
- module.exports = DummyImageContainer;
- }, { "./log": 13, "./utils": 26 }], 6: [function (_dereq_, module, exports) {
- var smallImage = _dereq_('./utils').smallImage;
- function Font(family, size) {
- var container = document.createElement('div'),
- img = document.createElement('img'),
- span = document.createElement('span'),
- sampleText = 'Hidden Text',
- baseline,
- middle;
- container.style.visibility = "hidden";
- container.style.fontFamily = family;
- container.style.fontSize = size;
- container.style.margin = 0;
- container.style.padding = 0;
- document.body.appendChild(container);
- img.src = smallImage();
- img.width = 1;
- img.height = 1;
- img.style.margin = 0;
- img.style.padding = 0;
- img.style.verticalAlign = "baseline";
- span.style.fontFamily = family;
- span.style.fontSize = size;
- span.style.margin = 0;
- span.style.padding = 0;
- span.appendChild(document.createTextNode(sampleText));
- container.appendChild(span);
- container.appendChild(img);
- baseline = img.offsetTop - span.offsetTop + 1;
- container.removeChild(span);
- container.appendChild(document.createTextNode(sampleText));
- container.style.lineHeight = "normal";
- img.style.verticalAlign = "super";
- middle = img.offsetTop - container.offsetTop + 1;
- document.body.removeChild(container);
- this.baseline = baseline;
- this.lineWidth = 1;
- this.middle = middle;
- }
- module.exports = Font;
- }, { "./utils": 26 }], 7: [function (_dereq_, module, exports) {
- var Font = _dereq_('./font');
- function FontMetrics() {
- this.data = {};
- }
- FontMetrics.prototype.getMetrics = function (family, size) {
- if (this.data[family + "-" + size] === undefined) {
- this.data[family + "-" + size] = new Font(family, size);
- }
- return this.data[family + "-" + size];
- };
- module.exports = FontMetrics;
- }, { "./font": 6 }], 8: [function (_dereq_, module, exports) {
- var utils = _dereq_('./utils');
- var getBounds = utils.getBounds;
- var loadUrlDocument = _dereq_('./proxy').loadUrlDocument;
- function FrameContainer(container, sameOrigin, options) {
- this.image = null;
- this.src = container;
- var self = this;
- var bounds = getBounds(container);
- this.promise = (!sameOrigin ? this.proxyLoad(options.proxy, bounds, options) : new Promise(function (resolve) {
- if (container.contentWindow.document.URL === "about:blank" || container.contentWindow.document.documentElement == null) {
- container.contentWindow.onload = container.onload = function () {
- resolve(container);
- };
- } else {
- resolve(container);
- }
- })).then(function (container) {
- var html2canvas = _dereq_('./core');
- return html2canvas(container.contentWindow.document.documentElement, { type: 'view', width: container.width, height: container.height, proxy: options.proxy, javascriptEnabled: options.javascriptEnabled, removeContainer: options.removeContainer, allowTaint: options.allowTaint, imageTimeout: options.imageTimeout / 2 });
- }).then(function (canvas) {
- return self.image = canvas;
- });
- }
- FrameContainer.prototype.proxyLoad = function (proxy, bounds, options) {
- var container = this.src;
- return loadUrlDocument(container.src, proxy, container.ownerDocument, bounds.width, bounds.height, options);
- };
- module.exports = FrameContainer;
- }, { "./core": 4, "./proxy": 16, "./utils": 26 }], 9: [function (_dereq_, module, exports) {
- function GradientContainer(imageData) {
- this.src = imageData.value;
- this.colorStops = [];
- this.type = null;
- this.x0 = 0.5;
- this.y0 = 0.5;
- this.x1 = 0.5;
- this.y1 = 0.5;
- this.promise = Promise.resolve(true);
- }
- GradientContainer.TYPES = {
- LINEAR: 1,
- RADIAL: 2 };
- // TODO: support hsl[a], negative %/length values
- // TODO: support <angle> (e.g. -?\d{1,3}(?:\.\d+)deg, etc. : https://developer.mozilla.org/docs/Web/CSS/angle )
- GradientContainer.REGEXP_COLORSTOP = /^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;
- module.exports = GradientContainer;
- }, {}], 10: [function (_dereq_, module, exports) {
- function ImageContainer(src, cors) {
- this.src = src;
- this.image = new Image();
- var self = this;
- this.tainted = null;
- this.promise = new Promise(function (resolve, reject) {
- self.image.onload = resolve;
- self.image.onerror = reject;
- if (cors) {
- self.image.crossOrigin = "anonymous";
- }
- self.image.src = src;
- if (self.image.complete === true) {
- resolve(self.image);
- }
- });
- }
- module.exports = ImageContainer;
- }, {}], 11: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var ImageContainer = _dereq_('./imagecontainer');
- var DummyImageContainer = _dereq_('./dummyimagecontainer');
- var ProxyImageContainer = _dereq_('./proxyimagecontainer');
- var FrameContainer = _dereq_('./framecontainer');
- var SVGContainer = _dereq_('./svgcontainer');
- var SVGNodeContainer = _dereq_('./svgnodecontainer');
- var LinearGradientContainer = _dereq_('./lineargradientcontainer');
- var WebkitGradientContainer = _dereq_('./webkitgradientcontainer');
- var bind = _dereq_('./utils').bind;
- function ImageLoader(options, support) {
- this.link = null;
- this.options = options;
- this.support = support;
- this.origin = this.getOrigin(window.location.href);
- }
- ImageLoader.prototype.findImages = function (nodes) {
- var images = [];
- nodes.reduce(function (imageNodes, container) {
- switch (container.node.nodeName) {
- case "IMG":
- return imageNodes.concat([{
- args: [container.node.src],
- method: "url" }]);
- case "svg":
- case "IFRAME":
- return imageNodes.concat([{
- args: [container.node],
- method: container.node.nodeName }]);}
- return imageNodes;
- }, []).forEach(this.addImage(images, this.loadImage), this);
- return images;
- };
- ImageLoader.prototype.findBackgroundImage = function (images, container) {
- container.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(images, this.loadImage), this);
- return images;
- };
- ImageLoader.prototype.addImage = function (images, callback) {
- return function (newImage) {
- newImage.args.forEach(function (image) {
- if (!this.imageExists(images, image)) {
- images.splice(0, 0, callback.call(this, newImage));
- log('Added image #' + images.length, typeof image === "string" ? image.substring(0, 100) : image);
- }
- }, this);
- };
- };
- ImageLoader.prototype.hasImageBackground = function (imageData) {
- return imageData.method !== "none";
- };
- ImageLoader.prototype.loadImage = function (imageData) {
- if (imageData.method === "url") {
- var src = imageData.args[0];
- if (this.isSVG(src) && !this.support.svg && !this.options.allowTaint) {
- return new SVGContainer(src);
- } else if (src.match(/data:image\/.*;base64,/i)) {
- return new ImageContainer(src.replace(/url\(['"]{0,}|['"]{0,}\)$/ig, ''), false);
- } else if (this.isSameOrigin(src) || this.options.allowTaint === true || this.isSVG(src)) {
- return new ImageContainer(src, false);
- } else if (this.support.cors && !this.options.allowTaint && this.options.useCORS) {
- return new ImageContainer(src, true);
- } else if (this.options.proxy) {
- return new ProxyImageContainer(src, this.options.proxy);
- } else {
- return new DummyImageContainer(src);
- }
- } else if (imageData.method === "linear-gradient") {
- return new LinearGradientContainer(imageData);
- } else if (imageData.method === "gradient") {
- return new WebkitGradientContainer(imageData);
- } else if (imageData.method === "svg") {
- return new SVGNodeContainer(imageData.args[0], this.support.svg);
- } else if (imageData.method === "IFRAME") {
- return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options);
- } else {
- return new DummyImageContainer(imageData);
- }
- };
- ImageLoader.prototype.isSVG = function (src) {
- return src.substring(src.length - 3).toLowerCase() === "svg" || SVGContainer.prototype.isInline(src);
- };
- ImageLoader.prototype.imageExists = function (images, src) {
- return images.some(function (image) {
- return image.src === src;
- });
- };
- ImageLoader.prototype.isSameOrigin = function (url) {
- return this.getOrigin(url) === this.origin;
- };
- ImageLoader.prototype.getOrigin = function (url) {
- var link = this.link || (this.link = document.createElement("a"));
- link.href = url;
- link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/
- return link.protocol + link.hostname + link.port;
- };
- ImageLoader.prototype.getPromise = function (container) {
- return this.timeout(container, this.options.imageTimeout)['catch'](function () {
- var dummy = new DummyImageContainer(container.src);
- return dummy.promise.then(function (image) {
- container.image = image;
- });
- });
- };
- ImageLoader.prototype.get = function (src) {
- var found = null;
- return this.images.some(function (img) {
- return (found = img).src === src;
- }) ? found : null;
- };
- ImageLoader.prototype.fetch = function (nodes) {
- this.images = nodes.reduce(bind(this.findBackgroundImage, this), this.findImages(nodes));
- this.images.forEach(function (image, index) {
- image.promise.then(function () {
- log("Succesfully loaded image #" + (index + 1), image);
- }, function (e) {
- log("Failed loading image #" + (index + 1), image, e);
- });
- });
- this.ready = Promise.all(this.images.map(this.getPromise, this));
- log("Finished searching images");
- return this;
- };
- ImageLoader.prototype.timeout = function (container, timeout) {
- var timer;
- var promise = Promise.race([container.promise, new Promise(function (res, reject) {
- timer = setTimeout(function () {
- log("Timed out loading image", container);
- reject(container);
- }, timeout);
- })]).then(function (container) {
- clearTimeout(timer);
- return container;
- });
- promise['catch'](function () {
- clearTimeout(timer);
- });
- return promise;
- };
- module.exports = ImageLoader;
- }, { "./dummyimagecontainer": 5, "./framecontainer": 8, "./imagecontainer": 10, "./lineargradientcontainer": 12, "./log": 13, "./proxyimagecontainer": 17, "./svgcontainer": 23, "./svgnodecontainer": 24, "./utils": 26, "./webkitgradientcontainer": 27 }], 12: [function (_dereq_, module, exports) {
- var GradientContainer = _dereq_('./gradientcontainer');
- var Color = _dereq_('./color');
- function LinearGradientContainer(imageData) {
- GradientContainer.apply(this, arguments);
- this.type = GradientContainer.TYPES.LINEAR;
- var hasDirection = LinearGradientContainer.REGEXP_DIRECTION.test(imageData.args[0]) ||
- !GradientContainer.REGEXP_COLORSTOP.test(imageData.args[0]);
- if (hasDirection) {
- imageData.args[0].split(/\s+/).reverse().forEach(function (position, index) {
- switch (position) {
- case "left":
- this.x0 = 0;
- this.x1 = 1;
- break;
- case "top":
- this.y0 = 0;
- this.y1 = 1;
- break;
- case "right":
- this.x0 = 1;
- this.x1 = 0;
- break;
- case "bottom":
- this.y0 = 1;
- this.y1 = 0;
- break;
- case "to":
- var y0 = this.y0;
- var x0 = this.x0;
- this.y0 = this.y1;
- this.x0 = this.x1;
- this.x1 = x0;
- this.y1 = y0;
- break;
- case "center":
- break; // centered by default
- // Firefox internally converts position keywords to percentages:
- // http://www.w3.org/TR/2010/WD-CSS2-20101207/colors.html#propdef-background-position
- default: // percentage or absolute length
- // TODO: support absolute start point positions (e.g., use bounds to convert px to a ratio)
- var ratio = parseFloat(position, 10) * 1e-2;
- if (isNaN(ratio)) {// invalid or unhandled value
- break;
- }
- if (index === 0) {
- this.y0 = ratio;
- this.y1 = 1 - this.y0;
- } else {
- this.x0 = ratio;
- this.x1 = 1 - this.x0;
- }
- break;}
- }, this);
- } else {
- this.y0 = 0;
- this.y1 = 1;
- }
- this.colorStops = imageData.args.slice(hasDirection ? 1 : 0).map(function (colorStop) {
- var colorStopMatch = colorStop.match(GradientContainer.REGEXP_COLORSTOP);
- var value = +colorStopMatch[2];
- var unit = value === 0 ? "%" : colorStopMatch[3]; // treat "0" as "0%"
- return {
- color: new Color(colorStopMatch[1]),
- // TODO: support absolute stop positions (e.g., compute gradient line length & convert px to ratio)
- stop: unit === "%" ? value / 100 : null };
- });
- if (this.colorStops[0].stop === null) {
- this.colorStops[0].stop = 0;
- }
- if (this.colorStops[this.colorStops.length - 1].stop === null) {
- this.colorStops[this.colorStops.length - 1].stop = 1;
- }
- // calculates and fills-in explicit stop positions when omitted from rule
- this.colorStops.forEach(function (colorStop, index) {
- if (colorStop.stop === null) {
- this.colorStops.slice(index).some(function (find, count) {
- if (find.stop !== null) {
- colorStop.stop = (find.stop - this.colorStops[index - 1].stop) / (count + 1) + this.colorStops[index - 1].stop;
- return true;
- } else {
- return false;
- }
- }, this);
- }
- }, this);
- }
- LinearGradientContainer.prototype = Object.create(GradientContainer.prototype);
- // TODO: support <angle> (e.g. -?\d{1,3}(?:\.\d+)deg, etc. : https://developer.mozilla.org/docs/Web/CSS/angle )
- LinearGradientContainer.REGEXP_DIRECTION = /^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;
- module.exports = LinearGradientContainer;
- }, { "./color": 3, "./gradientcontainer": 9 }], 13: [function (_dereq_, module, exports) {
- var logger = function logger() {
- if (logger.options.logging && window.console && window.console.log) {
- Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - logger.options.start + "ms", "html2canvas:"].concat([].slice.call(arguments, 0)));
- }
- };
- logger.options = { logging: false };
- module.exports = logger;
- }, {}], 14: [function (_dereq_, module, exports) {
- var Color = _dereq_('./color');
- var utils = _dereq_('./utils');
- var getBounds = utils.getBounds;
- var parseBackgrounds = utils.parseBackgrounds;
- var offsetBounds = utils.offsetBounds;
- function NodeContainer(node, parent) {
- this.node = node;
- this.parent = parent;
- this.stack = null;
- this.bounds = null;
- this.borders = null;
- this.clip = [];
- this.backgroundClip = [];
- this.offsetBounds = null;
- this.visible = null;
- this.computedStyles = null;
- this.colors = {};
- this.styles = {};
- this.backgroundImages = null;
- this.transformData = null;
- this.transformMatrix = null;
- this.isPseudoElement = false;
- this.opacity = null;
- }
- NodeContainer.prototype.cloneTo = function (stack) {
- stack.visible = this.visible;
- stack.borders = this.borders;
- stack.bounds = this.bounds;
- stack.clip = this.clip;
- stack.backgroundClip = this.backgroundClip;
- stack.computedStyles = this.computedStyles;
- stack.styles = this.styles;
- stack.backgroundImages = this.backgroundImages;
- stack.opacity = this.opacity;
- };
- NodeContainer.prototype.getOpacity = function () {
- return this.opacity === null ? this.opacity = this.cssFloat('opacity') : this.opacity;
- };
- NodeContainer.prototype.assignStack = function (stack) {
- this.stack = stack;
- stack.children.push(this);
- };
- NodeContainer.prototype.isElementVisible = function () {
- return this.node.nodeType === Node.TEXT_NODE ? this.parent.visible :
- this.css('display') !== "none" &&
- this.css('visibility') !== "hidden" &&
- !this.node.hasAttribute("data-html2canvas-ignore") && (
- this.node.nodeName !== "INPUT" || this.node.getAttribute("type") !== "hidden");
- };
- NodeContainer.prototype.css = function (attribute) {
- if (!this.computedStyles) {
- this.computedStyles = this.isPseudoElement ? this.parent.computedStyle(this.before ? ":before" : ":after") : this.computedStyle(null);
- }
- return this.styles[attribute] || (this.styles[attribute] = this.computedStyles[attribute]);
- };
- NodeContainer.prototype.prefixedCss = function (attribute) {
- var prefixes = ["webkit", "moz", "ms", "o"];
- var value = this.css(attribute);
- if (value === undefined) {
- prefixes.some(function (prefix) {
- value = this.css(prefix + attribute.substr(0, 1).toUpperCase() + attribute.substr(1));
- return value !== undefined;
- }, this);
- }
- return value === undefined ? null : value;
- };
- NodeContainer.prototype.computedStyle = function (type) {
- return this.node.ownerDocument.defaultView.getComputedStyle(this.node, type);
- };
- NodeContainer.prototype.cssInt = function (attribute) {
- var value = parseInt(this.css(attribute), 10);
- return isNaN(value) ? 0 : value; // borders in old IE are throwing 'medium' for demo.html
- };
- NodeContainer.prototype.color = function (attribute) {
- return this.colors[attribute] || (this.colors[attribute] = new Color(this.css(attribute)));
- };
- NodeContainer.prototype.cssFloat = function (attribute) {
- var value = parseFloat(this.css(attribute));
- return isNaN(value) ? 0 : value;
- };
- NodeContainer.prototype.fontWeight = function () {
- var weight = this.css("fontWeight");
- switch (parseInt(weight, 10)) {
- case 401:
- weight = "bold";
- break;
- case 400:
- weight = "normal";
- break;}
- return weight;
- };
- NodeContainer.prototype.parseClip = function () {
- var matches = this.css('clip').match(this.CLIP);
- if (matches) {
- return {
- top: parseInt(matches[1], 10),
- right: parseInt(matches[2], 10),
- bottom: parseInt(matches[3], 10),
- left: parseInt(matches[4], 10) };
- }
- return null;
- };
- NodeContainer.prototype.parseBackgroundImages = function () {
- return this.backgroundImages || (this.backgroundImages = parseBackgrounds(this.css("backgroundImage")));
- };
- NodeContainer.prototype.cssList = function (property, index) {
- var value = (this.css(property) || '').split(',');
- value = value[index || 0] || value[0] || 'auto';
- value = value.trim().split(' ');
- if (value.length === 1) {
- value = [value[0], isPercentage(value[0]) ? 'auto' : value[0]];
- }
- return value;
- };
- NodeContainer.prototype.parseBackgroundSize = function (bounds, image, index) {
- var size = this.cssList("backgroundSize", index);
- var width, height;
- if (isPercentage(size[0])) {
- width = bounds.width * parseFloat(size[0]) / 100;
- } else if (/contain|cover/.test(size[0])) {
- var targetRatio = bounds.width / bounds.height,currentRatio = image.width / image.height;
- return targetRatio < currentRatio ^ size[0] === 'contain' ? { width: bounds.height * currentRatio, height: bounds.height } : { width: bounds.width, height: bounds.width / currentRatio };
- } else {
- width = parseInt(size[0], 10);
- }
- if (size[0] === 'auto' && size[1] === 'auto') {
- height = image.height;
- } else if (size[1] === 'auto') {
- height = width / image.width * image.height;
- } else if (isPercentage(size[1])) {
- height = bounds.height * parseFloat(size[1]) / 100;
- } else {
- height = parseInt(size[1], 10);
- }
- if (size[0] === 'auto') {
- width = height / image.height * image.width;
- }
- return { width: width, height: height };
- };
- NodeContainer.prototype.parseBackgroundPosition = function (bounds, image, index, backgroundSize) {
- var position = this.cssList('backgroundPosition', index);
- var left, top;
- if (isPercentage(position[0])) {
- left = (bounds.width - (backgroundSize || image).width) * (parseFloat(position[0]) / 100);
- } else {
- left = parseInt(position[0], 10);
- }
- if (position[1] === 'auto') {
- top = left / image.width * image.height;
- } else if (isPercentage(position[1])) {
- top = (bounds.height - (backgroundSize || image).height) * parseFloat(position[1]) / 100;
- } else {
- top = parseInt(position[1], 10);
- }
- if (position[0] === 'auto') {
- left = top / image.height * image.width;
- }
- return { left: left, top: top };
- };
- NodeContainer.prototype.parseBackgroundRepeat = function (index) {
- return this.cssList("backgroundRepeat", index)[0];
- };
- NodeContainer.prototype.parseTextShadows = function () {
- var textShadow = this.css("textShadow");
- var results = [];
- if (textShadow && textShadow !== 'none') {
- var shadows = textShadow.match(this.TEXT_SHADOW_PROPERTY);
- for (var i = 0; shadows && i < shadows.length; i++) {
- var s = shadows[i].match(this.TEXT_SHADOW_VALUES);
- results.push({
- color: new Color(s[0]),
- offsetX: s[1] ? parseFloat(s[1].replace('px', '')) : 0,
- offsetY: s[2] ? parseFloat(s[2].replace('px', '')) : 0,
- blur: s[3] ? s[3].replace('px', '') : 0 });
- }
- }
- return results;
- };
- NodeContainer.prototype.parseTransform = function () {
- if (!this.transformData) {
- if (this.hasTransform()) {
- var offset = this.parseBounds();
- var origin = this.prefixedCss("transformOrigin").split(" ").map(removePx).map(asFloat);
- origin[0] += offset.left;
- origin[1] += offset.top;
- this.transformData = {
- origin: origin,
- matrix: this.parseTransformMatrix() };
- } else {
- this.transformData = {
- origin: [0, 0],
- matrix: [1, 0, 0, 1, 0, 0] };
- }
- }
- return this.transformData;
- };
- NodeContainer.prototype.parseTransformMatrix = function () {
- if (!this.transformMatrix) {
- var transform = this.prefixedCss("transform");
- var matrix = transform ? parseMatrix(transform.match(this.MATRIX_PROPERTY)) : null;
- this.transformMatrix = matrix ? matrix : [1, 0, 0, 1, 0, 0];
- }
- return this.transformMatrix;
- };
- NodeContainer.prototype.inverseTransform = function () {
- var transformData = this.parseTransform();
- return { origin: transformData.origin, matrix: matrixInverse(transformData.matrix) };
- };
- NodeContainer.prototype.parseBounds = function () {
- return this.bounds || (this.bounds = this.hasTransform() ? offsetBounds(this.node) : getBounds(this.node));
- };
- NodeContainer.prototype.hasTransform = function () {
- return this.parseTransformMatrix().join(",") !== "1,0,0,1,0,0" || this.parent && this.parent.hasTransform();
- };
- NodeContainer.prototype.getValue = function () {
- var value = this.node.value || "";
- if (this.node.tagName === "SELECT") {
- value = selectionValue(this.node);
- } else if (this.node.type === "password") {
- value = Array(value.length + 1).join("\u2022"); // jshint ignore:line
- }
- return value.length === 0 ? this.node.placeholder || "" : value;
- };
- NodeContainer.prototype.MATRIX_PROPERTY = /(matrix|matrix3d)\((.+)\)/;
- NodeContainer.prototype.TEXT_SHADOW_PROPERTY = /((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g;
- NodeContainer.prototype.TEXT_SHADOW_VALUES = /(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g;
- NodeContainer.prototype.CLIP = /^rect\((\d+)px,? (\d+)px,? (\d+)px,? (\d+)px\)$/;
- function selectionValue(node) {
- var option = node.options[node.selectedIndex || 0];
- return option ? option.text || "" : "";
- }
- function parseMatrix(match) {
- if (match && match[1] === "matrix") {
- return match[2].split(",").map(function (s) {
- return parseFloat(s.trim());
- });
- } else if (match && match[1] === "matrix3d") {
- var matrix3d = match[2].split(",").map(function (s) {
- return parseFloat(s.trim());
- });
- return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]];
- }
- }
- function matrixInverse(m) {
- // This is programmed specifically for transform matrices, which have a fixed structure.
- var a = m[0],b = m[2],c = m[4],d = m[1],e = m[3],f = m[5];
- var det = a * e - b * d;
- var M = [e, -d, -b, a, b * f - c * e, c * d - a * f].map(function (val) {return val / det;});
- return M;
- }
- function isPercentage(value) {
- return value.toString().indexOf("%") !== -1;
- }
- function removePx(str) {
- return str.replace("px", "");
- }
- function asFloat(str) {
- return parseFloat(str);
- }
- module.exports = NodeContainer;
- }, { "./color": 3, "./utils": 26 }], 15: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var punycode = _dereq_('punycode');
- var NodeContainer = _dereq_('./nodecontainer');
- var TextContainer = _dereq_('./textcontainer');
- var PseudoElementContainer = _dereq_('./pseudoelementcontainer');
- var FontMetrics = _dereq_('./fontmetrics');
- var Color = _dereq_('./color');
- var StackingContext = _dereq_('./stackingcontext');
- var utils = _dereq_('./utils');
- var bind = utils.bind;
- var getBounds = utils.getBounds;
- var parseBackgrounds = utils.parseBackgrounds;
- var offsetBounds = utils.offsetBounds;
- function NodeParser(element, renderer, support, imageLoader, options) {
- log("Starting NodeParser");
- this.renderer = renderer;
- this.options = options;
- this.range = null;
- this.support = support;
- this.renderQueue = [];
- this.stack = new StackingContext(true, 1, element.ownerDocument, null);
- var parent = new NodeContainer(element, null);
- if (options.background) {
- renderer.rectangle(0, 0, renderer.width, renderer.height, new Color(options.background));
- }
- if (element === element.ownerDocument.documentElement) {
- // http://www.w3.org/TR/css3-background/#special-backgrounds
- var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
- renderer.rectangle(0, 0, renderer.width, renderer.height, canvasBackground.color('backgroundColor'));
- }
- parent.visibile = parent.isElementVisible();
- this.createPseudoHideStyles(element.ownerDocument);
- this.disableAnimations(element.ownerDocument);
- this.nodes = flatten([parent].concat(this.getChildren(parent)).filter(function (container) {
- return container.visible = container.isElementVisible();
- }).map(this.getPseudoElements, this));
- this.fontMetrics = new FontMetrics();
- log("Fetched nodes, total:", this.nodes.length);
- log("Calculate overflow clips");
- this.calculateOverflowClips();
- log("Start fetching images");
- this.images = imageLoader.fetch(this.nodes.filter(isElement));
- this.ready = this.images.ready.then(bind(function () {
- log("Images loaded, starting parsing");
- log("Creating stacking contexts");
- this.createStackingContexts();
- log("Sorting stacking contexts");
- this.sortStackingContexts(this.stack);
- this.parse(this.stack);
- log("Render queue created with " + this.renderQueue.length + " items");
- return new Promise(bind(function (resolve) {
- if (!options.async) {
- this.renderQueue.forEach(this.paint, this);
- resolve();
- } else if (typeof options.async === "function") {
- options.async.call(this, this.renderQueue, resolve);
- } else if (this.renderQueue.length > 0) {
- this.renderIndex = 0;
- this.asyncRenderer(this.renderQueue, resolve);
- } else {
- resolve();
- }
- }, this));
- }, this));
- }
- NodeParser.prototype.calculateOverflowClips = function () {
- this.nodes.forEach(function (container) {
- if (isElement(container)) {
- if (isPseudoElement(container)) {
- container.appendToDOM();
- }
- container.borders = this.parseBorders(container);
- var clip = container.css('overflow') === "hidden" ? [container.borders.clip] : [];
- var cssClip = container.parseClip();
- if (cssClip && ["absolute", "fixed"].indexOf(container.css('position')) !== -1) {
- clip.push([["rect",
- container.bounds.left + cssClip.left,
- container.bounds.top + cssClip.top,
- cssClip.right - cssClip.left,
- cssClip.bottom - cssClip.top]]);
- }
- container.clip = hasParentClip(container) ? container.parent.clip.concat(clip) : clip;
- container.backgroundClip = container.css('overflow') !== "hidden" ? container.clip.concat([container.borders.clip]) : container.clip;
- if (isPseudoElement(container)) {
- container.cleanDOM();
- }
- } else if (isTextNode(container)) {
- container.clip = hasParentClip(container) ? container.parent.clip : [];
- }
- if (!isPseudoElement(container)) {
- container.bounds = null;
- }
- }, this);
- };
- function hasParentClip(container) {
- return container.parent && container.parent.clip.length;
- }
- NodeParser.prototype.asyncRenderer = function (queue, resolve, asyncTimer) {
- asyncTimer = asyncTimer || Date.now();
- this.paint(queue[this.renderIndex++]);
- if (queue.length === this.renderIndex) {
- resolve();
- } else if (asyncTimer + 20 > Date.now()) {
- this.asyncRenderer(queue, resolve, asyncTimer);
- } else {
- setTimeout(bind(function () {
- this.asyncRenderer(queue, resolve);
- }, this), 0);
- }
- };
- NodeParser.prototype.createPseudoHideStyles = function (document) {
- this.createStyles(document, '.' + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ':before { content: "" !important; display: none !important; }' +
- '.' + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER + ':after { content: "" !important; display: none !important; }');
- };
- NodeParser.prototype.disableAnimations = function (document) {
- this.createStyles(document, '* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; ' +
- '-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}');
- };
- NodeParser.prototype.createStyles = function (document, styles) {
- var hidePseudoElements = document.createElement('style');
- hidePseudoElements.innerHTML = styles;
- document.body.appendChild(hidePseudoElements);
- };
- NodeParser.prototype.getPseudoElements = function (container) {
- var nodes = [[container]];
- if (container.node.nodeType === Node.ELEMENT_NODE) {
- var before = this.getPseudoElement(container, ":before");
- var after = this.getPseudoElement(container, ":after");
- if (before) {
- nodes.push(before);
- }
- if (after) {
- nodes.push(after);
- }
- }
- return flatten(nodes);
- };
- function toCamelCase(str) {
- return str.replace(/(\-[a-z])/g, function (match) {
- return match.toUpperCase().replace('-', '');
- });
- }
- NodeParser.prototype.getPseudoElement = function (container, type) {
- var style = container.computedStyle(type);
- if (!style || !style.content || style.content === "none" || style.content === "-moz-alt-content" || style.display === "none") {
- return null;
- }
- var content = stripQuotes(style.content);
- var isImage = content.substr(0, 3) === 'url';
- var pseudoNode = document.createElement(isImage ? 'img' : 'html2canvaspseudoelement');
- var pseudoContainer = new PseudoElementContainer(pseudoNode, container, type);
- for (var i = style.length - 1; i >= 0; i--) {
- var property = toCamelCase(style.item(i));
- pseudoNode.style[property] = style[property];
- }
- pseudoNode.className = PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + " " + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
- if (isImage) {
- pseudoNode.src = parseBackgrounds(content)[0].args[0];
- return [pseudoContainer];
- } else {
- var text = document.createTextNode(content);
- pseudoNode.appendChild(text);
- return [pseudoContainer, new TextContainer(text, pseudoContainer)];
- }
- };
- NodeParser.prototype.getChildren = function (parentContainer) {
- return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function (node) {
- var container = [node.nodeType === Node.TEXT_NODE ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
- return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : [] : container;
- }, this));
- };
- NodeParser.prototype.newStackingContext = function (container, hasOwnStacking) {
- var stack = new StackingContext(hasOwnStacking, container.getOpacity(), container.node, container.parent);
- container.cloneTo(stack);
- var parentStack = hasOwnStacking ? stack.getParentStack(this) : stack.parent.stack;
- parentStack.contexts.push(stack);
- container.stack = stack;
- };
- NodeParser.prototype.createStackingContexts = function () {
- this.nodes.forEach(function (container) {
- if (isElement(container) && (this.isRootElement(container) || hasOpacity(container) || isPositionedForStacking(container) || this.isBodyWithTransparentRoot(container) || container.hasTransform())) {
- this.newStackingContext(container, true);
- } else if (isElement(container) && (isPositioned(container) && zIndex0(container) || isInlineBlock(container) || isFloating(container))) {
- this.newStackingContext(container, false);
- } else {
- container.assignStack(container.parent.stack);
- }
- }, this);
- };
- NodeParser.prototype.isBodyWithTransparentRoot = function (container) {
- return container.node.nodeName === "BODY" && container.parent.color('backgroundColor').isTransparent();
- };
- NodeParser.prototype.isRootElement = function (container) {
- return container.parent === null;
- };
- NodeParser.prototype.sortStackingContexts = function (stack) {
- stack.contexts.sort(zIndexSort(stack.contexts.slice(0)));
- stack.contexts.forEach(this.sortStackingContexts, this);
- };
- NodeParser.prototype.parseTextBounds = function (container) {
- return function (text, index, textList) {
- if (container.parent.css("textDecoration").substr(0, 4) !== "none" || text.trim().length !== 0) {
- if (this.support.rangeBounds && !container.parent.hasTransform()) {
- var offset = textList.slice(0, index).join("").length;
- return this.getRangeBounds(container.node, offset, text.length);
- } else if (container.node && typeof container.node.data === "string") {
- var replacementNode = container.node.splitText(text.length);
- var bounds = this.getWrapperBounds(container.node, container.parent.hasTransform());
- container.node = replacementNode;
- return bounds;
- }
- } else if (!this.support.rangeBounds || container.parent.hasTransform()) {
- container.node = container.node.splitText(text.length);
- }
- return {};
- };
- };
- NodeParser.prototype.getWrapperBounds = function (node, transform) {
- var wrapper = node.ownerDocument.createElement('html2canvaswrapper');
- var parent = node.parentNode,
- backupText = node.cloneNode(true);
- wrapper.appendChild(node.cloneNode(true));
- parent.replaceChild(wrapper, node);
- var bounds = transform ? offsetBounds(wrapper) : getBounds(wrapper);
- parent.replaceChild(backupText, wrapper);
- return bounds;
- };
- NodeParser.prototype.getRangeBounds = function (node, offset, length) {
- var range = this.range || (this.range = node.ownerDocument.createRange());
- range.setStart(node, offset);
- range.setEnd(node, offset + length);
- return range.getBoundingClientRect();
- };
- function ClearTransform() {}
- NodeParser.prototype.parse = function (stack) {
- // http://www.w3.org/TR/CSS21/visuren.html#z-index
- var negativeZindex = stack.contexts.filter(negativeZIndex); // 2. the child stacking contexts with negative stack levels (most negative first).
- var descendantElements = stack.children.filter(isElement);
- var descendantNonFloats = descendantElements.filter(not(isFloating));
- var nonInlineNonPositionedDescendants = descendantNonFloats.filter(not(isPositioned)).filter(not(inlineLevel)); // 3 the in-flow, non-inline-level, non-positioned descendants.
- var nonPositionedFloats = descendantElements.filter(not(isPositioned)).filter(isFloating); // 4. the non-positioned floats.
- var inFlow = descendantNonFloats.filter(not(isPositioned)).filter(inlineLevel); // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
- var stackLevel0 = stack.contexts.concat(descendantNonFloats.filter(isPositioned)).filter(zIndex0); // 6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
- var text = stack.children.filter(isTextNode).filter(hasText);
- var positiveZindex = stack.contexts.filter(positiveZIndex); // 7. the child stacking contexts with positive stack levels (least positive first).
- negativeZindex.concat(nonInlineNonPositionedDescendants).concat(nonPositionedFloats).
- concat(inFlow).concat(stackLevel0).concat(text).concat(positiveZindex).forEach(function (container) {
- this.renderQueue.push(container);
- if (isStackingContext(container)) {
- this.parse(container);
- this.renderQueue.push(new ClearTransform());
- }
- }, this);
- };
- NodeParser.prototype.paint = function (container) {
- try {
- if (container instanceof ClearTransform) {
- this.renderer.ctx.restore();
- } else if (isTextNode(container)) {
- if (isPseudoElement(container.parent)) {
- container.parent.appendToDOM();
- }
- this.paintText(container);
- if (isPseudoElement(container.parent)) {
- container.parent.cleanDOM();
- }
- } else {
- this.paintNode(container);
- }
- } catch (e) {
- log(e);
- if (this.options.strict) {
- throw e;
- }
- }
- };
- NodeParser.prototype.paintNode = function (container) {
- if (isStackingContext(container)) {
- this.renderer.setOpacity(container.opacity);
- this.renderer.ctx.save();
- if (container.hasTransform()) {
- this.renderer.setTransform(container.parseTransform());
- }
- }
- if (container.node.nodeName === "INPUT" && container.node.type === "checkbox") {
- this.paintCheckbox(container);
- } else if (container.node.nodeName === "INPUT" && container.node.type === "radio") {
- this.paintRadio(container);
- } else {
- this.paintElement(container);
- }
- };
- NodeParser.prototype.paintElement = function (container) {
- var bounds = container.parseBounds();
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.renderBackground(container, bounds, container.borders.borders.map(getWidth));
- }, this, container);
- this.renderer.mask(container.backgroundClip, function () {
- this.renderer.renderShadows(container, container.borders.clip);
- }, this, container);
- this.renderer.clip(container.clip, function () {
- this.renderer.renderBorders(container.borders.borders);
- }, this, container);
- this.renderer.clip(container.backgroundClip, function () {
- switch (container.node.nodeName) {
- case "svg":
- case "IFRAME":
- var imgContainer = this.images.get(container.node);
- if (imgContainer) {
- this.renderer.renderImage(container, bounds, container.borders, imgContainer);
- } else {
- log("Error loading <" + container.node.nodeName + ">", container.node);
- }
- break;
- case "IMG":
- var imageContainer = this.images.get(container.node.src);
- if (imageContainer) {
- this.renderer.renderImage(container, bounds, container.borders, imageContainer);
- } else {
- log("Error loading <img>", container.node.src);
- }
- break;
- case "CANVAS":
- this.renderer.renderImage(container, bounds, container.borders, { image: container.node });
- break;
- case "SELECT":
- case "INPUT":
- case "TEXTAREA":
- this.paintFormValue(container);
- break;}
- }, this, container);
- };
- NodeParser.prototype.paintCheckbox = function (container) {
- var b = container.parseBounds();
- var size = Math.min(b.width, b.height);
- var bounds = { width: size - 1, height: size - 1, top: b.top, left: b.left };
- var r = [3, 3];
- var radius = [r, r, r, r];
- var borders = [1, 1, 1, 1].map(function (w) {
- return { color: new Color('#A5A5A5'), width: w };
- });
- var borderPoints = calculateCurvePoints(bounds, radius, borders);
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.rectangle(bounds.left + 1, bounds.top + 1, bounds.width - 2, bounds.height - 2, new Color("#DEDEDE"));
- this.renderer.renderBorders(calculateBorders(borders, bounds, borderPoints, radius));
- if (container.node.checked) {
- this.renderer.font(new Color('#424242'), 'normal', 'normal', 'bold', size - 3 + "px", 'arial');
- this.renderer.text("\u2714", bounds.left + size / 6, bounds.top + size - 1);
- }
- }, this, container);
- };
- NodeParser.prototype.paintRadio = function (container) {
- var bounds = container.parseBounds();
- var size = Math.min(bounds.width, bounds.height) - 2;
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.circleStroke(bounds.left + 1, bounds.top + 1, size, new Color('#DEDEDE'), 1, new Color('#A5A5A5'));
- if (container.node.checked) {
- this.renderer.circle(Math.ceil(bounds.left + size / 4) + 1, Math.ceil(bounds.top + size / 4) + 1, Math.floor(size / 2), new Color('#424242'));
- }
- }, this, container);
- };
- NodeParser.prototype.paintFormValue = function (container) {
- var value = container.getValue();
- if (value.length > 0) {
- var document = container.node.ownerDocument;
- var wrapper = document.createElement('html2canvaswrapper');
- var properties = ['lineHeight', 'textAlign', 'fontFamily', 'fontWeight', 'fontSize', 'color',
- 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom',
- 'width', 'height', 'borderLeftStyle', 'borderTopStyle', 'borderLeftWidth', 'borderTopWidth',
- 'boxSizing', 'whiteSpace', 'wordWrap'];
- properties.forEach(function (property) {
- try {
- wrapper.style[property] = container.css(property);
- } catch (e) {
- // Older IE has issues with "border"
- log("html2canvas: Parse: Exception caught in renderFormValue: " + e.message);
- }
- });
- var bounds = container.parseBounds();
- wrapper.style.position = "fixed";
- wrapper.style.left = bounds.left + "px";
- wrapper.style.top = bounds.top + "px";
- wrapper.textContent = value;
- document.body.appendChild(wrapper);
- this.paintText(new TextContainer(wrapper.firstChild, container));
- document.body.removeChild(wrapper);
- }
- };
- NodeParser.prototype.paintText = function (container) {
- container.applyTextTransform();
- var characters = punycode.ucs2.decode(container.node.data);
- var wordRendering = (!this.options.letterRendering || noLetterSpacing(container)) && !hasUnicode(container.node.data);
- var textList = wordRendering ? getWords(characters) : characters.map(function (character) {
- return punycode.ucs2.encode([character]);
- });
- if (!wordRendering) {
- container.parent.node.style.fontVariantLigatures = 'none';
- }
- var weight = container.parent.fontWeight();
- var size = container.parent.css('fontSize');
- var family = container.parent.css('fontFamily');
- var shadows = container.parent.parseTextShadows();
- this.renderer.font(container.parent.color('color'), container.parent.css('fontStyle'), container.parent.css('fontVariant'), weight, size, family);
- if (shadows.length) {
- // TODO: support multiple text shadows
- this.renderer.fontShadow(shadows[0].color, shadows[0].offsetX, shadows[0].offsetY, shadows[0].blur);
- } else {
- this.renderer.clearShadow();
- }
- this.renderer.clip(container.parent.clip, function () {
- textList.map(this.parseTextBounds(container), this).forEach(function (bounds, index) {
- if (bounds) {
- this.renderer.text(textList[index], bounds.left, bounds.bottom);
- this.renderTextDecoration(container.parent, bounds, this.fontMetrics.getMetrics(family, size));
- }
- }, this);
- }, this, container.parent);
- };
- NodeParser.prototype.renderTextDecoration = function (container, bounds, metrics) {
- switch (container.css("textDecoration").split(" ")[0]) {
- case "underline":
- // Draws a line at the baseline of the font
- // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size
- this.renderer.rectangle(bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, container.color("color"));
- break;
- case "overline":
- this.renderer.rectangle(bounds.left, Math.round(bounds.top), bounds.width, 1, container.color("color"));
- break;
- case "line-through":
- // TODO try and find exact position for line-through
- this.renderer.rectangle(bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, container.color("color"));
- break;}
- };
- var borderColorTransforms = {
- inset: [
- ["darken", 0.60],
- ["darken", 0.10],
- ["darken", 0.10],
- ["darken", 0.60]] };
- NodeParser.prototype.parseBorders = function (container) {
- var nodeBounds = container.parseBounds();
- var radius = getBorderRadiusData(container);
- var borders = ["Top", "Right", "Bottom", "Left"].map(function (side, index) {
- var style = container.css('border' + side + 'Style');
- var color = container.color('border' + side + 'Color');
- if (style === "inset" && color.isBlack()) {
- color = new Color([255, 255, 255, color.a]); // this is wrong, but
- }
- var colorTransform = borderColorTransforms[style] ? borderColorTransforms[style][index] : null;
- return {
- width: container.cssInt('border' + side + 'Width'),
- color: colorTransform ? color[colorTransform[0]](colorTransform[1]) : color,
- style: style,
- pathArgs: null,
- args: null };
- });
- var borderPoints = calculateCurvePoints(nodeBounds, radius, borders);
- return {
- clip: this.parseBackgroundClip(container, borderPoints, borders, radius, nodeBounds),
- borders: calculateBorders(borders, nodeBounds, borderPoints, radius) };
- };
- function calculateBorders(borders, nodeBounds, borderPoints, radius) {
- var pathBounds = {
- top: nodeBounds.top + borders[0].width / 2,
- right: nodeBounds.right - borders[1].width / 2,
- bottom: nodeBounds.bottom - borders[2].width / 2,
- left: nodeBounds.left + borders[3].width / 2 };
- return borders.map(function (border, borderSide) {
- if (border.width > 0) {
- var bx = nodeBounds.left;
- var by = nodeBounds.top;
- var bw = nodeBounds.width;
- var bh = nodeBounds.height - borders[2].width;
- switch (borderSide) {
- case 0:
- // top border
- bh = borders[0].width;
- border.args = drawSide({
- c1: [bx, by],
- c2: [bx + bw, by],
- c3: [bx + bw - borders[1].width, by + bh],
- c4: [bx + borders[3].width, by + bh] },
- radius[0], radius[1],
- borderPoints.topLeftOuter, borderPoints.topLeftInner, borderPoints.topRightOuter, borderPoints.topRightInner);
- border.pathArgs = drawSidePath({
- c1: [pathBounds.left, pathBounds.top],
- c2: [pathBounds.right, pathBounds.top] },
- radius[0], radius[1],
- borderPoints.topLeft, borderPoints.topRight);
- break;
- case 1:
- // right border
- bx = nodeBounds.left + nodeBounds.width - borders[1].width;
- bw = borders[1].width;
- border.args = drawSide({
- c1: [bx + bw, by],
- c2: [bx + bw, by + bh + borders[2].width],
- c3: [bx, by + bh],
- c4: [bx, by + borders[0].width] },
- radius[1], radius[2],
- borderPoints.topRightOuter, borderPoints.topRightInner, borderPoints.bottomRightOuter, borderPoints.bottomRightInner);
- border.pathArgs = drawSidePath({
- c1: [pathBounds.right, pathBounds.top],
- c2: [pathBounds.right, pathBounds.bottom] },
- radius[1], radius[2],
- borderPoints.topRight, borderPoints.bottomRight);
- break;
- case 2:
- // bottom border
- by = by + nodeBounds.height - borders[2].width;
- bh = borders[2].width;
- border.args = drawSide({
- c1: [bx + bw, by + bh],
- c2: [bx, by + bh],
- c3: [bx + borders[3].width, by],
- c4: [bx + bw - borders[3].width, by] },
- radius[2], radius[3],
- borderPoints.bottomRightOuter, borderPoints.bottomRightInner, borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner);
- border.pathArgs = drawSidePath({
- c1: [pathBounds.right, pathBounds.bottom],
- c2: [pathBounds.left, pathBounds.bottom] },
- radius[2], radius[3],
- borderPoints.bottomRight, borderPoints.bottomLeft);
- break;
- case 3:
- // left border
- bw = borders[3].width;
- border.args = drawSide({
- c1: [bx, by + bh + borders[2].width],
- c2: [bx, by],
- c3: [bx + bw, by + borders[0].width],
- c4: [bx + bw, by + bh] },
- radius[3], radius[0],
- borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner, borderPoints.topLeftOuter, borderPoints.topLeftInner);
- border.pathArgs = drawSidePath({
- c1: [pathBounds.left, pathBounds.bottom],
- c2: [pathBounds.left, pathBounds.top] },
- radius[3], radius[0],
- borderPoints.bottomLeft, borderPoints.topLeft);
- break;}
- }
- return border;
- });
- }
- NodeParser.prototype.parseBackgroundClip = function (container, borderPoints, borders, radius, bounds) {
- var backgroundClip = container.css('backgroundClip'),
- borderArgs = [];
- switch (backgroundClip) {
- case "content-box":
- case "padding-box":
- parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftInner, borderPoints.topRightInner, bounds.left + borders[3].width, bounds.top + borders[0].width);
- parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightInner, borderPoints.bottomRightInner, bounds.left + bounds.width - borders[1].width, bounds.top + borders[0].width);
- parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightInner, borderPoints.bottomLeftInner, bounds.left + bounds.width - borders[1].width, bounds.top + bounds.height - borders[2].width);
- parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftInner, borderPoints.topLeftInner, bounds.left + borders[3].width, bounds.top + bounds.height - borders[2].width);
- break;
- default:
- parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftOuter, borderPoints.topRightOuter, bounds.left, bounds.top);
- parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightOuter, borderPoints.bottomRightOuter, bounds.left + bounds.width, bounds.top);
- parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightOuter, borderPoints.bottomLeftOuter, bounds.left + bounds.width, bounds.top + bounds.height);
- parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftOuter, borderPoints.topLeftOuter, bounds.left, bounds.top + bounds.height);
- break;}
- return borderArgs;
- };
- function getCurvePoints(x, y, r1, r2) {
- var kappa = 4 * ((Math.sqrt(2) - 1) / 3);
- var ox = r1 * kappa, // control point offset horizontal
- oy = r2 * kappa, // control point offset vertical
- xm = x + r1, // x-middle
- ym = y + r2; // y-middle
- return {
- topLeft: bezierCurve({ x: x, y: ym }, { x: x, y: ym - oy }, { x: xm - ox, y: y }, { x: xm, y: y }),
- topRight: bezierCurve({ x: x, y: y }, { x: x + ox, y: y }, { x: xm, y: ym - oy }, { x: xm, y: ym }),
- bottomRight: bezierCurve({ x: xm, y: y }, { x: xm, y: y + oy }, { x: x + ox, y: ym }, { x: x, y: ym }),
- bottomLeft: bezierCurve({ x: xm, y: ym }, { x: xm - ox, y: ym }, { x: x, y: y + oy }, { x: x, y: y }) };
- }
- function calculateCurvePoints(bounds, borderRadius, borders) {
- var x = bounds.left,
- y = bounds.top,
- width = bounds.width,
- height = bounds.height,
- tlh = borderRadius[0][0] < width / 2 ? borderRadius[0][0] : width / 2,
- tlv = borderRadius[0][1] < height / 2 ? borderRadius[0][1] : height / 2,
- trh = borderRadius[1][0] < width / 2 ? borderRadius[1][0] : width / 2,
- trv = borderRadius[1][1] < height / 2 ? borderRadius[1][1] : height / 2,
- brh = borderRadius[2][0] < width / 2 ? borderRadius[2][0] : width / 2,
- brv = borderRadius[2][1] < height / 2 ? borderRadius[2][1] : height / 2,
- blh = borderRadius[3][0] < width / 2 ? borderRadius[3][0] : width / 2,
- blv = borderRadius[3][1] < height / 2 ? borderRadius[3][1] : height / 2;
- var topWidth = width - trh,
- rightHeight = height - brv,
- bottomWidth = width - brh,
- leftHeight = height - blv;
- return {
- topLeft: getCurvePoints(x + borders[3].width / 2, y + borders[0].width / 2, Math.max(0, tlh - borders[3].width / 2), Math.max(0, tlv - borders[0].width / 2)).topLeft.subdivide(0.5),
- topRight: getCurvePoints(x + Math.min(topWidth, width + borders[3].width / 2), y + borders[0].width / 2, topWidth > width + borders[3].width / 2 ? 0 : trh - borders[3].width / 2, trv - borders[0].width / 2).topRight.subdivide(0.5),
- bottomRight: getCurvePoints(x + Math.min(bottomWidth, width - borders[3].width / 2), y + Math.min(rightHeight, height + borders[0].width / 2), Math.max(0, brh - borders[1].width / 2), brv - borders[2].width / 2).bottomRight.subdivide(0.5),
- bottomLeft: getCurvePoints(x + borders[3].width / 2, y + leftHeight, Math.max(0, blh - borders[3].width / 2), blv - borders[2].width / 2).bottomLeft.subdivide(0.5),
- topLeftOuter: getCurvePoints(x, y, tlh, tlv).topLeft.subdivide(0.5),
- topLeftInner: getCurvePoints(x + borders[3].width, y + borders[0].width, Math.max(0, tlh - borders[3].width), Math.max(0, tlv - borders[0].width)).topLeft.subdivide(0.5),
- topRightOuter: getCurvePoints(x + topWidth, y, trh, trv).topRight.subdivide(0.5),
- topRightInner: getCurvePoints(x + Math.min(topWidth, width + borders[3].width), y + borders[0].width, topWidth > width + borders[3].width ? 0 : trh - borders[3].width, trv - borders[0].width).topRight.subdivide(0.5),
- bottomRightOuter: getCurvePoints(x + bottomWidth, y + rightHeight, brh, brv).bottomRight.subdivide(0.5),
- bottomRightInner: getCurvePoints(x + Math.min(bottomWidth, width - borders[3].width), y + Math.min(rightHeight, height + borders[0].width), Math.max(0, brh - borders[1].width), brv - borders[2].width).bottomRight.subdivide(0.5),
- bottomLeftOuter: getCurvePoints(x, y + leftHeight, blh, blv).bottomLeft.subdivide(0.5),
- bottomLeftInner: getCurvePoints(x + borders[3].width, y + leftHeight, Math.max(0, blh - borders[3].width), blv - borders[2].width).bottomLeft.subdivide(0.5) };
- }
- function bezierCurve(start, startControl, endControl, end) {
- var lerp = function lerp(a, b, t) {
- return {
- x: a.x + (b.x - a.x) * t,
- y: a.y + (b.y - a.y) * t };
- };
- return {
- start: start,
- startControl: startControl,
- endControl: endControl,
- end: end,
- subdivide: function subdivide(t) {
- var ab = lerp(start, startControl, t),
- bc = lerp(startControl, endControl, t),
- cd = lerp(endControl, end, t),
- abbc = lerp(ab, bc, t),
- bccd = lerp(bc, cd, t),
- dest = lerp(abbc, bccd, t);
- return [bezierCurve(start, ab, abbc, dest), bezierCurve(dest, bccd, cd, end)];
- },
- curveTo: function curveTo(borderArgs) {
- borderArgs.push(["bezierCurve", startControl.x, startControl.y, endControl.x, endControl.y, end.x, end.y]);
- },
- curveToReversed: function curveToReversed(borderArgs) {
- borderArgs.push(["bezierCurve", endControl.x, endControl.y, startControl.x, startControl.y, start.x, start.y]);
- } };
- }
- function drawSide(borderData, radius1, radius2, outer1, inner1, outer2, inner2) {
- var borderArgs = [];
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", outer1[1].start.x, outer1[1].start.y]);
- outer1[1].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c1[0], borderData.c1[1]]);
- }
- if (radius2[0] > 0 || radius2[1] > 0) {
- borderArgs.push(["line", outer2[0].start.x, outer2[0].start.y]);
- outer2[0].curveTo(borderArgs);
- borderArgs.push(["line", inner2[0].end.x, inner2[0].end.y]);
- inner2[0].curveToReversed(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c2[0], borderData.c2[1]]);
- borderArgs.push(["line", borderData.c3[0], borderData.c3[1]]);
- }
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", inner1[1].end.x, inner1[1].end.y]);
- inner1[1].curveToReversed(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c4[0], borderData.c4[1]]);
- }
- return borderArgs;
- }
- function drawSidePath(borderData, radius1, radius2, curve1, curve2) {
- var borderArgs = [];
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", curve1[1].start.x, curve1[1].start.y]);
- curve1[1].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c1[0], borderData.c1[1]]);
- }
- if (radius2[0] > 0 || radius2[1] > 0) {
- borderArgs.push(["line", curve2[0].start.x, curve2[0].start.y]);
- curve2[0].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c2[0], borderData.c2[1]]);
- }
- return borderArgs;
- }
- function parseCorner(borderArgs, radius1, radius2, corner1, corner2, x, y) {
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", corner1[0].start.x, corner1[0].start.y]);
- corner1[0].curveTo(borderArgs);
- corner1[1].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", x, y]);
- }
- if (radius2[0] > 0 || radius2[1] > 0) {
- borderArgs.push(["line", corner2[0].start.x, corner2[0].start.y]);
- }
- }
- function negativeZIndex(container) {
- return container.cssInt("zIndex") < 0;
- }
- function positiveZIndex(container) {
- return container.cssInt("zIndex") > 0;
- }
- function zIndex0(container) {
- return container.cssInt("zIndex") === 0;
- }
- function inlineLevel(container) {
- return ["inline", "inline-block", "inline-table"].indexOf(container.css("display")) !== -1;
- }
- function isStackingContext(container) {
- return container instanceof StackingContext;
- }
- function hasText(container) {
- return container.node.data.trim().length > 0;
- }
- function noLetterSpacing(container) {
- return /^(normal|none|0px)$/.test(container.parent.css("letterSpacing"));
- }
- function getBorderRadiusData(container) {
- return ["TopLeft", "TopRight", "BottomRight", "BottomLeft"].map(function (side) {
- var value = container.css('border' + side + 'Radius');
- var arr = value.split(" ");
- if (arr.length <= 1) {
- arr[1] = arr[0];
- }
- return arr.map(asInt);
- });
- }
- function renderableNode(node) {
- return node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE;
- }
- function isPositionedForStacking(container) {
- var position = container.css("position");
- var zIndex = ["absolute", "relative", "fixed"].indexOf(position) !== -1 ? container.css("zIndex") : "auto";
- return zIndex !== "auto";
- }
- function isPositioned(container) {
- return container.css("position") !== "static";
- }
- function isFloating(container) {
- return container.css("float") !== "none";
- }
- function isInlineBlock(container) {
- return ["inline-block", "inline-table"].indexOf(container.css("display")) !== -1;
- }
- function not(callback) {
- var context = this;
- return function () {
- return !callback.apply(context, arguments);
- };
- }
- function isElement(container) {
- return container.node.nodeType === Node.ELEMENT_NODE;
- }
- function isPseudoElement(container) {
- return container.isPseudoElement === true;
- }
- function isTextNode(container) {
- return container.node.nodeType === Node.TEXT_NODE;
- }
- function zIndexSort(contexts) {
- return function (a, b) {
- return a.cssInt("zIndex") + contexts.indexOf(a) / contexts.length - (b.cssInt("zIndex") + contexts.indexOf(b) / contexts.length);
- };
- }
- function hasOpacity(container) {
- return container.getOpacity() < 1;
- }
- function asInt(value) {
- return parseInt(value, 10);
- }
- function getWidth(border) {
- return border.width;
- }
- function nonIgnoredElement(nodeContainer) {
- return nodeContainer.node.nodeType !== Node.ELEMENT_NODE || ["SCRIPT", "HEAD", "TITLE", "OBJECT", "BR", "OPTION"].indexOf(nodeContainer.node.nodeName) === -1;
- }
- function flatten(arrays) {
- return [].concat.apply([], arrays);
- }
- function stripQuotes(content) {
- var first = content.substr(0, 1);
- return first === content.substr(content.length - 1) && first.match(/'|"/) ? content.substr(1, content.length - 2) : content;
- }
- function getWords(characters) {
- var words = [],i = 0,onWordBoundary = false,word;
- while (characters.length) {
- if (isWordBoundary(characters[i]) === onWordBoundary) {
- word = characters.splice(0, i);
- if (word.length) {
- words.push(punycode.ucs2.encode(word));
- }
- onWordBoundary = !onWordBoundary;
- i = 0;
- } else {
- i++;
- }
- if (i >= characters.length) {
- word = characters.splice(0, i);
- if (word.length) {
- words.push(punycode.ucs2.encode(word));
- }
- }
- }
- return words;
- }
- function isWordBoundary(characterCode) {
- return [
- 32, // <space>
- 13, // \r
- 10, // \n
- 9, // \t
- 45 // -
- ].indexOf(characterCode) !== -1;
- }
- function hasUnicode(string) {
- return /[^\u0000-\u00ff]/.test(string);
- }
- module.exports = NodeParser;
- }, { "./color": 3, "./fontmetrics": 7, "./log": 13, "./nodecontainer": 14, "./pseudoelementcontainer": 18, "./stackingcontext": 21, "./textcontainer": 25, "./utils": 26, "punycode": 1 }], 16: [function (_dereq_, module, exports) {
- var XHR = _dereq_('./xhr');
- var utils = _dereq_('./utils');
- var log = _dereq_('./log');
- var createWindowClone = _dereq_('./clone');
- var decode64 = utils.decode64;
- function Proxy(src, proxyUrl, document) {
- var supportsCORS = ('withCredentials' in new XMLHttpRequest());
- if (!proxyUrl) {
- return Promise.reject("No proxy configured");
- }
- var callback = createCallback(supportsCORS);
- var url = createProxyUrl(proxyUrl, src, callback);
- return supportsCORS ? XHR(url) : jsonp(document, url, callback).then(function (response) {
- return decode64(response.content);
- });
- }
- var proxyCount = 0;
- function ProxyURL(src, proxyUrl, document) {
- var supportsCORSImage = ('crossOrigin' in new Image());
- var callback = createCallback(supportsCORSImage);
- var url = createProxyUrl(proxyUrl, src, callback);
- return supportsCORSImage ? Promise.resolve(url) : jsonp(document, url, callback).then(function (response) {
- return "data:" + response.type + ";base64," + response.content;
- });
- }
- function jsonp(document, url, callback) {
- return new Promise(function (resolve, reject) {
- var s = document.createElement("script");
- var cleanup = function cleanup() {
- delete window.html2canvas.proxy[callback];
- document.body.removeChild(s);
- };
- window.html2canvas.proxy[callback] = function (response) {
- cleanup();
- resolve(response);
- };
- s.src = url;
- s.onerror = function (e) {
- cleanup();
- reject(e);
- };
- document.body.appendChild(s);
- });
- }
- function createCallback(useCORS) {
- return !useCORS ? "html2canvas_" + Date.now() + "_" + ++proxyCount + "_" + Math.round(Math.random() * 100000) : "";
- }
- function createProxyUrl(proxyUrl, src, callback) {
- return proxyUrl + "?url=" + encodeURIComponent(src) + (callback.length ? "&callback=html2canvas.proxy." + callback : "");
- }
- function documentFromHTML(src) {
- return function (html) {
- var parser = new DOMParser(),doc;
- try {
- doc = parser.parseFromString(html, "text/html");
- } catch (e) {
- log("DOMParser not supported, falling back to createHTMLDocument");
- doc = document.implementation.createHTMLDocument("");
- try {
- doc.open();
- doc.write(html);
- doc.close();
- } catch (ee) {
- log("createHTMLDocument write not supported, falling back to document.body.innerHTML");
- doc.body.innerHTML = html; // ie9 doesnt support writing to documentElement
- }
- }
- var b = doc.querySelector("base");
- if (!b || !b.href.host) {
- var base = doc.createElement("base");
- base.href = src;
- doc.head.insertBefore(base, doc.head.firstChild);
- }
- return doc;
- };
- }
- function loadUrlDocument(src, proxy, document, width, height, options) {
- return new Proxy(src, proxy, window.document).then(documentFromHTML(src)).then(function (doc) {
- return createWindowClone(doc, document, width, height, options, 0, 0);
- });
- }
- exports.Proxy = Proxy;
- exports.ProxyURL = ProxyURL;
- exports.loadUrlDocument = loadUrlDocument;
- }, { "./clone": 2, "./log": 13, "./utils": 26, "./xhr": 28 }], 17: [function (_dereq_, module, exports) {
- var ProxyURL = _dereq_('./proxy').ProxyURL;
- function ProxyImageContainer(src, proxy) {
- var link = document.createElement("a");
- link.href = src;
- src = link.href;
- this.src = src;
- this.image = new Image();
- var self = this;
- this.promise = new Promise(function (resolve, reject) {
- self.image.crossOrigin = "Anonymous";
- self.image.onload = resolve;
- self.image.onerror = reject;
- new ProxyURL(src, proxy, document).then(function (url) {
- self.image.src = url;
- })['catch'](reject);
- });
- }
- module.exports = ProxyImageContainer;
- }, { "./proxy": 16 }], 18: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function PseudoElementContainer(node, parent, type) {
- NodeContainer.call(this, node, parent);
- this.isPseudoElement = true;
- this.before = type === ":before";
- }
- PseudoElementContainer.prototype.cloneTo = function (stack) {
- PseudoElementContainer.prototype.cloneTo.call(this, stack);
- stack.isPseudoElement = true;
- stack.before = this.before;
- };
- PseudoElementContainer.prototype = Object.create(NodeContainer.prototype);
- PseudoElementContainer.prototype.appendToDOM = function () {
- if (this.before) {
- this.parent.node.insertBefore(this.node, this.parent.node.firstChild);
- } else {
- this.parent.node.appendChild(this.node);
- }
- this.parent.node.className += " " + this.getHideClass();
- };
- PseudoElementContainer.prototype.cleanDOM = function () {
- this.node.parentNode.removeChild(this.node);
- this.parent.node.className = this.parent.node.className.replace(this.getHideClass(), "");
- };
- PseudoElementContainer.prototype.getHideClass = function () {
- return this["PSEUDO_HIDE_ELEMENT_CLASS_" + (this.before ? "BEFORE" : "AFTER")];
- };
- PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = "___html2canvas___pseudoelement_before";
- PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER = "___html2canvas___pseudoelement_after";
- module.exports = PseudoElementContainer;
- }, { "./nodecontainer": 14 }], 19: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- function Renderer(width, height, images, options, document) {
- this.width = width;
- this.height = height;
- this.images = images;
- this.options = options;
- this.document = document;
- }
- Renderer.prototype.renderImage = function (container, bounds, borderData, imageContainer) {
- var paddingLeft = container.cssInt('paddingLeft'),
- paddingTop = container.cssInt('paddingTop'),
- paddingRight = container.cssInt('paddingRight'),
- paddingBottom = container.cssInt('paddingBottom'),
- borders = borderData.borders;
- var width = bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight);
- var height = bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom);
- this.drawImage(
- imageContainer,
- 0,
- 0,
- imageContainer.image.width || width,
- imageContainer.image.height || height,
- bounds.left + paddingLeft + borders[3].width,
- bounds.top + paddingTop + borders[0].width,
- width,
- height);
- };
- Renderer.prototype.renderBackground = function (container, bounds, borderData) {
- if (bounds.height > 0 && bounds.width > 0) {
- this.renderBackgroundColor(container, bounds);
- this.renderBackgroundImage(container, bounds, borderData);
- }
- };
- Renderer.prototype.renderBackgroundColor = function (container, bounds) {
- var color = container.color("backgroundColor");
- if (!color.isTransparent()) {
- this.rectangle(bounds.left, bounds.top, bounds.width, bounds.height, color);
- }
- };
- Renderer.prototype.renderShadows = function (container, shape) {
- var boxShadow = container.css('boxShadow');
- if (boxShadow !== 'none') {
- var shadows = boxShadow.split(/,(?![^(]*\))/);
- this.shadow(shape, shadows);
- }
- };
- Renderer.prototype.renderBorders = function (borders) {
- borders.forEach(this.renderBorder, this);
- };
- Renderer.prototype.renderBorder = function (data) {
- if (!data.color.isTransparent() && data.args !== null) {
- if (data.style === 'dashed' || data.style === 'dotted') {
- var dash = data.style === 'dashed' ? 3 : data.width;
- this.ctx.setLineDash([dash]);
- this.path(data.pathArgs);
- this.ctx.strokeStyle = data.color;
- this.ctx.lineWidth = data.width;
- this.ctx.stroke();
- } else {
- this.drawShape(data.args, data.color);
- }
- }
- };
- Renderer.prototype.renderBackgroundImage = function (container, bounds, borderData) {
- var backgroundImages = container.parseBackgroundImages();
- backgroundImages.reverse().forEach(function (backgroundImage, index, arr) {
- switch (backgroundImage.method) {
- case "url":
- var image = this.images.get(backgroundImage.args[0]);
- if (image) {
- this.renderBackgroundRepeating(container, bounds, image, arr.length - (index + 1), borderData);
- } else {
- log("Error loading background-image", backgroundImage.args[0]);
- }
- break;
- case "linear-gradient":
- case "gradient":
- var gradientImage = this.images.get(backgroundImage.value);
- if (gradientImage) {
- this.renderBackgroundGradient(gradientImage, bounds, borderData);
- } else {
- log("Error loading background-image", backgroundImage.args[0]);
- }
- break;
- case "none":
- break;
- default:
- log("Unknown background-image type", backgroundImage.args[0]);}
- }, this);
- };
- Renderer.prototype.renderBackgroundRepeating = function (container, bounds, imageContainer, index, borderData) {
- var size = container.parseBackgroundSize(bounds, imageContainer.image, index);
- var position = container.parseBackgroundPosition(bounds, imageContainer.image, index, size);
- var repeat = container.parseBackgroundRepeat(index);
- switch (repeat) {
- case "repeat-x":
- case "repeat no-repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + borderData[3], bounds.top + position.top + borderData[0], 99999, size.height, borderData);
- break;
- case "repeat-y":
- case "no-repeat repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + position.left + borderData[3], bounds.top + borderData[0], size.width, 99999, borderData);
- break;
- case "no-repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + position.left + borderData[3], bounds.top + position.top + borderData[0], size.width, size.height, borderData);
- break;
- default:
- this.renderBackgroundRepeat(imageContainer, position, size, { top: bounds.top, left: bounds.left }, borderData[3], borderData[0]);
- break;}
- };
- module.exports = Renderer;
- }, { "./log": 13 }], 20: [function (_dereq_, module, exports) {
- var Renderer = _dereq_('../renderer');
- var LinearGradientContainer = _dereq_('../lineargradientcontainer');
- var log = _dereq_('../log');
- function CanvasRenderer(width, height) {
- Renderer.apply(this, arguments);
- this.canvas = this.options.canvas || this.document.createElement("canvas");
- this.ctx = this.canvas.getContext("2d");
- if (!this.options.canvas) {
- if (this.options.dpi) {
- this.options.scale = this.options.dpi / 96; // 1 CSS inch = 96px.
- }
- if (this.options.scale) {
- this.canvas.style.width = width + 'px';
- this.canvas.style.height = height + 'px';
- this.canvas.width = Math.floor(width * this.options.scale);
- this.canvas.height = Math.floor(height * this.options.scale);
- this.ctx.scale(this.options.scale, this.options.scale);
- } else {
- this.canvas.width = width;
- this.canvas.height = height;
- }
- }
- this.taintCtx = this.document.createElement("canvas").getContext("2d");
- this.ctx.textBaseline = "bottom";
- this.variables = {};
- log("Initialized CanvasRenderer with size", width, "x", height);
- }
- CanvasRenderer.prototype = Object.create(Renderer.prototype);
- CanvasRenderer.prototype.setFillStyle = function (fillStyle) {
- this.ctx.fillStyle = typeof fillStyle === "object" && !!fillStyle.isColor ? fillStyle.toString() : fillStyle;
- return this.ctx;
- };
- CanvasRenderer.prototype.rectangle = function (left, top, width, height, color) {
- this.setFillStyle(color).fillRect(left, top, width, height);
- };
- CanvasRenderer.prototype.circle = function (left, top, size, color) {
- this.setFillStyle(color);
- this.ctx.beginPath();
- this.ctx.arc(left + size / 2, top + size / 2, size / 2, 0, Math.PI * 2, true);
- this.ctx.closePath();
- this.ctx.fill();
- };
- CanvasRenderer.prototype.circleStroke = function (left, top, size, color, stroke, strokeColor) {
- this.circle(left, top, size, color);
- this.ctx.strokeStyle = strokeColor.toString();
- this.ctx.stroke();
- };
- CanvasRenderer.prototype.shadow = function (shape, shadows) {
- var parseShadow = function parseShadow(str) {
- var propertyFilters = { color: /^(#|rgb|hsl|(?!(inset|initial|inherit))\D+)/i, inset: /^inset/i, px: /px$/i };
- var pxPropertyNames = ['x', 'y', 'blur', 'spread'];
- var properties = str.split(/ (?![^(]*\))/);
- var info = {};
- for (var key in propertyFilters) {
- info[key] = properties.filter(propertyFilters[key].test.bind(propertyFilters[key]));
- info[key] = info[key].length === 0 ? null : info[key].length === 1 ? info[key][0] : info[key];
- }
- for (var i = 0; i < info.px.length; i++) {
- info[pxPropertyNames[i]] = parseInt(info.px[i]);
- }
- return info;
- };
- var drawShadow = function drawShadow(shadow) {
- var info = parseShadow(shadow);
- if (!info.inset) {
- context.shadowOffsetX = info.x;
- context.shadowOffsetY = info.y;
- context.shadowColor = info.color;
- context.shadowBlur = info.blur;
- context.fill();
- }
- };
- var context = this.setFillStyle('white');
- context.save();
- this.shape(shape);
- shadows.forEach(drawShadow, this);
- context.restore();
- };
- CanvasRenderer.prototype.drawShape = function (shape, color) {
- this.shape(shape);
- this.setFillStyle(color).fill();
- };
- CanvasRenderer.prototype.taints = function (imageContainer) {
- if (imageContainer.tainted === null) {
- this.taintCtx.drawImage(imageContainer.image, 0, 0);
- try {
- this.taintCtx.getImageData(0, 0, 1, 1);
- imageContainer.tainted = false;
- } catch (e) {
- this.taintCtx = document.createElement("canvas").getContext("2d");
- imageContainer.tainted = true;
- }
- }
- return imageContainer.tainted;
- };
- CanvasRenderer.prototype.drawImage = function (imageContainer, sx, sy, sw, sh, dx, dy, dw, dh) {
- if (!this.taints(imageContainer) || this.options.allowTaint) {
- this.ctx.drawImage(imageContainer.image, sx, sy, sw, sh, dx, dy, dw, dh);
- }
- };
- CanvasRenderer.prototype.clip = function (shapes, callback, context, container) {
- this.ctx.save();
- if (container && container.hasTransform()) {
- this.setTransform(container.inverseTransform());
- shapes.filter(hasEntries).forEach(function (shape) {
- this.shape(shape).clip();
- }, this);
- this.setTransform(container.parseTransform());
- } else {
- shapes.filter(hasEntries).forEach(function (shape) {
- this.shape(shape).clip();
- }, this);
- }
- callback.call(context);
- this.ctx.restore();
- };
- CanvasRenderer.prototype.mask = function (shapes, callback, context, container) {
- var borderClip = shapes[shapes.length - 1];
- if (borderClip && borderClip.length) {
- var canvasBorderCCW = ["rect", this.canvas.width, 0, -this.canvas.width, this.canvas.height];
- var maskShape = [canvasBorderCCW].concat(borderClip).concat([borderClip[0]]);
- shapes = shapes.slice(0, -1).concat([maskShape]);
- }
- this.clip(shapes, callback, context, container);
- };
- CanvasRenderer.prototype.shape = function (shape) {
- this.ctx.beginPath();
- shape.forEach(function (point, index) {
- if (point[0] === "rect") {
- this.ctx.rect.apply(this.ctx, point.slice(1));
- } else {
- this.ctx[index === 0 ? "moveTo" : point[0] + "To"].apply(this.ctx, point.slice(1));
- }
- }, this);
- this.ctx.closePath();
- return this.ctx;
- };
- CanvasRenderer.prototype.path = function (shape) {
- this.ctx.beginPath();
- shape.forEach(function (point, index) {
- if (point[0] === "rect") {
- this.ctx.rect.apply(this.ctx, point.slice(1));
- } else {
- this.ctx[index === 0 ? "moveTo" : point[0] + "To"].apply(this.ctx, point.slice(1));
- }
- }, this);
- return this.ctx;
- };
- CanvasRenderer.prototype.font = function (color, style, variant, weight, size, family) {
- variant = /^(normal|small-caps)$/i.test(variant) ? variant : '';
- this.setFillStyle(color).font = [style, variant, weight, size, family].join(" ").split(",")[0];
- };
- CanvasRenderer.prototype.fontShadow = function (color, offsetX, offsetY, blur) {
- this.setVariable("shadowColor", color.toString()).
- setVariable("shadowOffsetY", offsetX).
- setVariable("shadowOffsetX", offsetY).
- setVariable("shadowBlur", blur);
- };
- CanvasRenderer.prototype.clearShadow = function () {
- this.setVariable("shadowColor", "rgba(0,0,0,0)");
- };
- CanvasRenderer.prototype.setOpacity = function (opacity) {
- this.ctx.globalAlpha = opacity;
- };
- CanvasRenderer.prototype.setTransform = function (transform) {
- this.ctx.translate(transform.origin[0], transform.origin[1]);
- this.ctx.transform.apply(this.ctx, transform.matrix);
- this.ctx.translate(-transform.origin[0], -transform.origin[1]);
- };
- CanvasRenderer.prototype.setVariable = function (property, value) {
- if (this.variables[property] !== value) {
- this.variables[property] = this.ctx[property] = value;
- }
- return this;
- };
- CanvasRenderer.prototype.text = function (text, left, bottom) {
- this.ctx.fillText(text, left, bottom);
- };
- CanvasRenderer.prototype.backgroundRepeatShape = function (imageContainer, backgroundPosition, size, bounds, left, top, width, height, borderData) {
- var shape = [
- ["line", Math.round(left), Math.round(top)],
- ["line", Math.round(left + width), Math.round(top)],
- ["line", Math.round(left + width), Math.round(height + top)],
- ["line", Math.round(left), Math.round(height + top)]];
- this.clip([shape], function () {
- this.renderBackgroundRepeat(imageContainer, backgroundPosition, size, bounds, borderData[3], borderData[0]);
- }, this);
- };
- CanvasRenderer.prototype.renderBackgroundRepeat = function (imageContainer, backgroundPosition, size, bounds, borderLeft, borderTop) {
- var offsetX = Math.round(bounds.left + backgroundPosition.left + borderLeft),offsetY = Math.round(bounds.top + backgroundPosition.top + borderTop);
- this.setFillStyle(this.ctx.createPattern(this.resizeImage(imageContainer, size), "repeat"));
- this.ctx.translate(offsetX, offsetY);
- this.ctx.fill();
- this.ctx.translate(-offsetX, -offsetY);
- };
- CanvasRenderer.prototype.renderBackgroundGradient = function (gradientImage, bounds) {
- if (gradientImage instanceof LinearGradientContainer) {
- var gradient = this.ctx.createLinearGradient(
- bounds.left + bounds.width * gradientImage.x0,
- bounds.top + bounds.height * gradientImage.y0,
- bounds.left + bounds.width * gradientImage.x1,
- bounds.top + bounds.height * gradientImage.y1);
- gradientImage.colorStops.forEach(function (colorStop) {
- gradient.addColorStop(colorStop.stop, colorStop.color.toString());
- });
- this.rectangle(bounds.left, bounds.top, bounds.width, bounds.height, gradient);
- }
- };
- CanvasRenderer.prototype.resizeImage = function (imageContainer, size) {
- var image = imageContainer.image;
- if (image.width === size.width && image.height === size.height) {
- return image;
- }
- var ctx,canvas = document.createElement('canvas');
- canvas.width = size.width;
- canvas.height = size.height;
- ctx = canvas.getContext("2d");
- ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height);
- return canvas;
- };
- function hasEntries(array) {
- return array.length > 0;
- }
- module.exports = CanvasRenderer;
- }, { "../lineargradientcontainer": 12, "../log": 13, "../renderer": 19 }], 21: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function StackingContext(hasOwnStacking, opacity, element, parent) {
- NodeContainer.call(this, element, parent);
- this.ownStacking = hasOwnStacking;
- this.contexts = [];
- this.children = [];
- this.opacity = (this.parent ? this.parent.stack.opacity : 1) * opacity;
- }
- StackingContext.prototype = Object.create(NodeContainer.prototype);
- StackingContext.prototype.getParentStack = function (context) {
- var parentStack = this.parent ? this.parent.stack : null;
- return parentStack ? parentStack.ownStacking ? parentStack : parentStack.getParentStack(context) : context.stack;
- };
- module.exports = StackingContext;
- }, { "./nodecontainer": 14 }], 22: [function (_dereq_, module, exports) {
- function Support(document) {
- this.rangeBounds = this.testRangeBounds(document);
- this.cors = this.testCORS();
- this.svg = this.testSVG();
- }
- Support.prototype.testRangeBounds = function (document) {
- var range,testElement,rangeBounds,rangeHeight,support = false;
- if (document.createRange) {
- range = document.createRange();
- if (range.getBoundingClientRect) {
- testElement = document.createElement('boundtest');
- testElement.style.height = "123px";
- testElement.style.display = "block";
- document.body.appendChild(testElement);
- range.selectNode(testElement);
- rangeBounds = range.getBoundingClientRect();
- rangeHeight = rangeBounds.height;
- if (rangeHeight === 123) {
- support = true;
- }
- document.body.removeChild(testElement);
- }
- }
- return support;
- };
- Support.prototype.testCORS = function () {
- return typeof new Image().crossOrigin !== "undefined";
- };
- Support.prototype.testSVG = function () {
- var img = new Image();
- var canvas = document.createElement("canvas");
- var ctx = canvas.getContext("2d");
- img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
- try {
- ctx.drawImage(img, 0, 0);
- canvas.toDataURL();
- } catch (e) {
- return false;
- }
- return true;
- };
- module.exports = Support;
- }, {}], 23: [function (_dereq_, module, exports) {
- var XHR = _dereq_('./xhr');
- var decode64 = _dereq_('./utils').decode64;
- function SVGContainer(src) {
- this.src = src;
- this.image = null;
- var self = this;
- this.promise = this.hasFabric().then(function () {
- return self.isInline(src) ? Promise.resolve(self.inlineFormatting(src)) : XHR(src);
- }).then(function (svg) {
- return new Promise(function (resolve) {
- window.html2canvas.svg.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve));
- });
- });
- }
- SVGContainer.prototype.hasFabric = function () {
- return !window.html2canvas.svg || !window.html2canvas.svg.fabric ? Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) : Promise.resolve();
- };
- SVGContainer.prototype.inlineFormatting = function (src) {
- return /^data:image\/svg\+xml;base64,/.test(src) ? this.decode64(this.removeContentType(src)) : this.removeContentType(src);
- };
- SVGContainer.prototype.removeContentType = function (src) {
- return src.replace(/^data:image\/svg\+xml(;base64)?,/, '');
- };
- SVGContainer.prototype.isInline = function (src) {
- return /^data:image\/svg\+xml/i.test(src);
- };
- SVGContainer.prototype.createCanvas = function (resolve) {
- var self = this;
- return function (objects, options) {
- var canvas = new window.html2canvas.svg.fabric.StaticCanvas('c');
- self.image = canvas.lowerCanvasEl;
- canvas.
- setWidth(options.width).
- setHeight(options.height).
- add(window.html2canvas.svg.fabric.util.groupSVGElements(objects, options)).
- renderAll();
- resolve(canvas.lowerCanvasEl);
- };
- };
- SVGContainer.prototype.decode64 = function (str) {
- return typeof window.atob === "function" ? window.atob(str) : decode64(str);
- };
- module.exports = SVGContainer;
- }, { "./utils": 26, "./xhr": 28 }], 24: [function (_dereq_, module, exports) {
- var SVGContainer = _dereq_('./svgcontainer');
- function SVGNodeContainer(node, _native) {
- this.src = node;
- this.image = null;
- var self = this;
- this.promise = _native ? new Promise(function (resolve, reject) {
- self.image = new Image();
- self.image.onload = resolve;
- self.image.onerror = reject;
- self.image.src = "data:image/svg+xml," + new XMLSerializer().serializeToString(node);
- if (self.image.complete === true) {
- resolve(self.image);
- }
- }) : this.hasFabric().then(function () {
- return new Promise(function (resolve) {
- window.html2canvas.svg.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
- });
- });
- }
- SVGNodeContainer.prototype = Object.create(SVGContainer.prototype);
- module.exports = SVGNodeContainer;
- }, { "./svgcontainer": 23 }], 25: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function TextContainer(node, parent) {
- NodeContainer.call(this, node, parent);
- }
- TextContainer.prototype = Object.create(NodeContainer.prototype);
- TextContainer.prototype.applyTextTransform = function () {
- this.node.data = this.transform(this.parent.css("textTransform"));
- };
- TextContainer.prototype.transform = function (transform) {
- var text = this.node.data;
- switch (transform) {
- case "lowercase":
- return text.toLowerCase();
- case "capitalize":
- return text.replace(/(^|\s|:|-|\(|\))([a-z])/g, capitalize);
- case "uppercase":
- return text.toUpperCase();
- default:
- return text;}
- };
- function capitalize(m, p1, p2) {
- if (m.length > 0) {
- return p1 + p2.toUpperCase();
- }
- }
- module.exports = TextContainer;
- }, { "./nodecontainer": 14 }], 26: [function (_dereq_, module, exports) {
- exports.smallImage = function smallImage() {
- return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
- };
- exports.bind = function (callback, context) {
- return function () {
- return callback.apply(context, arguments);
- };
- };
- /*
- * base64-arraybuffer
- * https://github.com/niklasvh/base64-arraybuffer
- *
- * Copyright (c) 2012 Niklas von Hertzen
- * Licensed under the MIT license.
- */
- exports.decode64 = function (base64) {
- var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var len = base64.length,i,encoded1,encoded2,encoded3,encoded4,byte1,byte2,byte3;
- var output = "";
- for (i = 0; i < len; i += 4) {
- encoded1 = chars.indexOf(base64[i]);
- encoded2 = chars.indexOf(base64[i + 1]);
- encoded3 = chars.indexOf(base64[i + 2]);
- encoded4 = chars.indexOf(base64[i + 3]);
- byte1 = encoded1 << 2 | encoded2 >> 4;
- byte2 = (encoded2 & 15) << 4 | encoded3 >> 2;
- byte3 = (encoded3 & 3) << 6 | encoded4;
- if (encoded3 === 64) {
- output += String.fromCharCode(byte1);
- } else if (encoded4 === 64 || encoded4 === -1) {
- output += String.fromCharCode(byte1, byte2);
- } else {
- output += String.fromCharCode(byte1, byte2, byte3);
- }
- }
- return output;
- };
- exports.getBounds = function (node) {
- if (node.getBoundingClientRect) {
- var clientRect = node.getBoundingClientRect();
- var width = node.offsetWidth == null ? clientRect.width : node.offsetWidth;
- return {
- top: clientRect.top,
- bottom: clientRect.bottom || clientRect.top + clientRect.height,
- right: clientRect.left + width,
- left: clientRect.left,
- width: width,
- height: node.offsetHeight == null ? clientRect.height : node.offsetHeight };
- }
- return {};
- };
- exports.offsetBounds = function (node) {
- var parent = node.offsetParent ? exports.offsetBounds(node.offsetParent) : { top: 0, left: 0 };
- return {
- top: node.offsetTop + parent.top,
- bottom: node.offsetTop + node.offsetHeight + parent.top,
- right: node.offsetLeft + parent.left + node.offsetWidth,
- left: node.offsetLeft + parent.left,
- width: node.offsetWidth,
- height: node.offsetHeight };
- };
- exports.parseBackgrounds = function (backgroundImage) {
- var whitespace = ' \r\n\t',
- method,definition,prefix,prefix_i,block,results = [],
- mode = 0,numParen = 0,quote,args;
- var appendResult = function appendResult() {
- if (method) {
- if (definition.substr(0, 1) === '"') {
- definition = definition.substr(1, definition.length - 2);
- }
- if (definition) {
- args.push(definition);
- }
- if (method.substr(0, 1) === '-' && (prefix_i = method.indexOf('-', 1) + 1) > 0) {
- prefix = method.substr(0, prefix_i);
- method = method.substr(prefix_i);
- }
- results.push({
- prefix: prefix,
- method: method.toLowerCase(),
- value: block,
- args: args,
- image: null });
- }
- args = [];
- method = prefix = definition = block = '';
- };
- args = [];
- method = prefix = definition = block = '';
- backgroundImage.split("").forEach(function (c) {
- if (mode === 0 && whitespace.indexOf(c) > -1) {
- return;
- }
- switch (c) {
- case '"':
- if (!quote) {
- quote = c;
- } else if (quote === c) {
- quote = null;
- }
- break;
- case '(':
- if (quote) {
- break;
- } else if (mode === 0) {
- mode = 1;
- block += c;
- return;
- } else {
- numParen++;
- }
- break;
- case ')':
- if (quote) {
- break;
- } else if (mode === 1) {
- if (numParen === 0) {
- mode = 0;
- block += c;
- appendResult();
- return;
- } else {
- numParen--;
- }
- }
- break;
- case ',':
- if (quote) {
- break;
- } else if (mode === 0) {
- appendResult();
- return;
- } else if (mode === 1) {
- if (numParen === 0 && !method.match(/^url$/i)) {
- args.push(definition);
- definition = '';
- block += c;
- return;
- }
- }
- break;}
- block += c;
- if (mode === 0) {
- method += c;
- } else {
- definition += c;
- }
- });
- appendResult();
- return results;
- };
- }, {}], 27: [function (_dereq_, module, exports) {
- var GradientContainer = _dereq_('./gradientcontainer');
- function WebkitGradientContainer(imageData) {
- GradientContainer.apply(this, arguments);
- this.type = imageData.args[0] === "linear" ? GradientContainer.TYPES.LINEAR : GradientContainer.TYPES.RADIAL;
- }
- WebkitGradientContainer.prototype = Object.create(GradientContainer.prototype);
- module.exports = WebkitGradientContainer;
- }, { "./gradientcontainer": 9 }], 28: [function (_dereq_, module, exports) {
- function XHR(url) {
- return new Promise(function (resolve, reject) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url);
- xhr.onload = function () {
- if (xhr.status === 200) {
- resolve(xhr.responseText);
- } else {
- reject(new Error(xhr.statusText));
- }
- };
- xhr.onerror = function () {
- reject(new Error("Network Error"));
- };
- xhr.send();
- });
- }
- module.exports = XHR;
- }, {}] }, {}, [4])(4);
- });
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../../../Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node_modules/webpack/buildin/global.js */ 3)))
- /***/ }),
- /***/ 49:
- /*!**********************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/static/html/js/html2canvas.js ***!
- \**********************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- /* WEBPACK VAR INJECTION */(function(global) {var require;var require;/*
- html2canvas 0.5.0-beta3 <http://html2canvas.hertzen.com>
- Copyright (c) 2016 Niklas von Hertzen
- Released under License
- */
- !function (e) {if (true) module.exports = e();else { var f; }}(function () {var define, module, exports;return function e(t, n, r) {function s(o, u) {if (!n[o]) {if (!t[o]) {var a = typeof require == "function" && require;if (!u && a) return require(o, !0);if (i) return i(o, !0);var f = new Error("Cannot find module '" + o + "'");throw f.code = "MODULE_NOT_FOUND", f;}var l = n[o] = { exports: {} };t[o][0].call(l.exports, function (e) {var n = t[o][1][e];return s(n ? n : e);}, l, l.exports, e, t, n, r);}return n[o].exports;}var i = typeof require == "function" && require;for (var o = 0; o < r.length; o++) {s(r[o]);}return s;}({ 1: [function (_dereq_, module, exports) {
- (function (global) {
- /*! http://mths.be/punycode v1.2.4 by @mathias */
- ;(function (root) {
- /** Detect free variables */
- var freeExports = typeof exports == 'object' && exports;
- var freeModule = typeof module == 'object' && module &&
- module.exports == freeExports && module;
- var freeGlobal = typeof global == 'object' && global;
- if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
- root = freeGlobal;
- }
- /**
- * The `punycode` object.
- * @name punycode
- * @type Object
- */
- var punycode,
- /** Highest positive signed 32-bit float value */
- maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
- /** Bootstring parameters */
- base = 36,
- tMin = 1,
- tMax = 26,
- skew = 38,
- damp = 700,
- initialBias = 72,
- initialN = 128, // 0x80
- delimiter = '-', // '\x2D'
- /** Regular expressions */
- regexPunycode = /^xn--/,
- regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
- regexSeparators = /\x2E|\u3002|\uFF0E|\uFF61/g, // RFC 3490 separators
- /** Error messages */
- errors = {
- 'overflow': 'Overflow: input needs wider integers to process',
- 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input' },
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
- /** Temporary variable */
- key;
- /*--------------------------------------------------------------------------*/
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw RangeError(errors[type]);
- }
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- while (length--) {
- array[length] = fn(array[length]);
- }
- return array;
- }
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings.
- * @private
- * @param {String} domain The domain name.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- return map(string.split(regexSeparators), fn).join('.');
- }
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see <http://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // high surrogate, and there is a next character
- extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) {// low surrogate
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // unmatched surrogate; only append this code unit, in case the next
- // code unit is the high surrogate of a surrogate pair
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- }
- /**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function (value) {
- var output = '';
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- if (codePoint - 48 < 10) {
- return codePoint - 22;
- }
- if (codePoint - 65 < 26) {
- return codePoint - 65;
- }
- if (codePoint - 97 < 26) {
- return codePoint - 97;
- }
- return base;
- }
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * http://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
- /**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- /** Cached calculation results */
- baseMinusT;
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base;; /* no condition */k += base) {
- if (index >= inputLength) {
- error('invalid-input');
- }
- digit = basicToDigit(input.charCodeAt(index++));
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
- i += digit * w;
- t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
- if (digit < t) {
- break;
- }
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
- w *= baseMinusT;
- }
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
- n += floor(i / out);
- i %= out;
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
- }
- return ucs2encode(output);
- }
- /**
- * Converts a string of Unicode symbols to a Punycode string of ASCII-only
- * symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
- // Cache the length
- inputLength = input.length;
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
- handledCPCount = basicLength = output.length;
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
- // Main encoding loop:
- while (handledCPCount < inputLength) {
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
- // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base;; /* no condition */k += base) {
- t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)));
- q = floor(qMinusT / baseMinusT);
- }
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
- ++delta;
- ++n;
- }
- return output.join('');
- }
- /**
- * Converts a Punycode string representing a domain name to Unicode. Only the
- * Punycoded parts of the domain name will be converted, i.e. it doesn't
- * matter if you call it on a string that has already been converted to
- * Unicode.
- * @memberOf punycode
- * @param {String} domain The Punycode domain name to convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(domain) {
- return mapDomain(domain, function (string) {
- return regexPunycode.test(string) ?
- decode(string.slice(4).toLowerCase()) :
- string;
- });
- }
- /**
- * Converts a Unicode string representing a domain name to Punycode. Only the
- * non-ASCII parts of the domain name will be converted, i.e. it doesn't
- * matter if you call it with a domain that's already in ASCII.
- * @memberOf punycode
- * @param {String} domain The domain name to convert, as a Unicode string.
- * @returns {String} The Punycode representation of the given domain name.
- */
- function toASCII(domain) {
- return mapDomain(domain, function (string) {
- return regexNonASCII.test(string) ?
- 'xn--' + encode(string) :
- string;
- });
- }
- /*--------------------------------------------------------------------------*/
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.2.4',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see <http://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode };
- /** Expose `punycode` */
- // Some AMD build optimizers, like r.js, check for specific condition patterns
- // like the following:
- if (
- typeof define == 'function' &&
- typeof define.amd == 'object' &&
- define.amd)
- {
- define('punycode', function () {
- return punycode;
- });
- } else if (freeExports && !freeExports.nodeType) {
- if (freeModule) {// in Node.js or RingoJS v0.8.0+
- freeModule.exports = punycode;
- } else {// in Narwhal or RingoJS v0.7.0-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else {// in Rhino or a web browser
- root.punycode = punycode;
- }
- })(this);
- }).call(this, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
- }, {}], 2: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- function restoreOwnerScroll(ownerDocument, x, y) {
- if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {
- ownerDocument.defaultView.scrollTo(x, y);
- }
- }
- function cloneCanvasContents(canvas, clonedCanvas) {
- try {
- if (clonedCanvas) {
- clonedCanvas.width = canvas.width;
- clonedCanvas.height = canvas.height;
- clonedCanvas.getContext("2d").putImageData(canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height), 0, 0);
- }
- } catch (e) {
- log("Unable to copy canvas content from", canvas, e);
- }
- }
- function cloneNode(node, javascriptEnabled) {
- var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false);
- var child = node.firstChild;
- while (child) {
- if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') {
- clone.appendChild(cloneNode(child, javascriptEnabled));
- }
- child = child.nextSibling;
- }
- if (node.nodeType === 1) {
- clone._scrollTop = node.scrollTop;
- clone._scrollLeft = node.scrollLeft;
- if (node.nodeName === "CANVAS") {
- cloneCanvasContents(node, clone);
- } else if (node.nodeName === "TEXTAREA" || node.nodeName === "SELECT") {
- clone.value = node.value;
- }
- }
- return clone;
- }
- function initNode(node) {
- if (node.nodeType === 1) {
- node.scrollTop = node._scrollTop;
- node.scrollLeft = node._scrollLeft;
- var child = node.firstChild;
- while (child) {
- initNode(child);
- child = child.nextSibling;
- }
- }
- }
- module.exports = function (ownerDocument, containerDocument, width, height, options, x, y) {
- var documentElement = cloneNode(ownerDocument.documentElement, options.javascriptEnabled);
- var container = containerDocument.createElement("iframe");
- container.className = "html2canvas-container";
- container.style.visibility = "hidden";
- container.style.position = "fixed";
- container.style.left = "-10000px";
- container.style.top = "0px";
- container.style.border = "0";
- container.width = width;
- container.height = height;
- container.scrolling = "no"; // ios won't scroll without it
- containerDocument.body.appendChild(container);
- return new Promise(function (resolve) {
- var documentClone = container.contentWindow.document;
- /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle
- if window url is about:blank, we can assign the url to current by writing onto the document
- */
- container.contentWindow.onload = container.onload = function () {
- var interval = setInterval(function () {
- if (documentClone.body.childNodes.length > 0) {
- initNode(documentClone.documentElement);
- clearInterval(interval);
- if (options.type === "view") {
- container.contentWindow.scrollTo(x, y);
- if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) && (container.contentWindow.scrollY !== y || container.contentWindow.scrollX !== x)) {
- documentClone.documentElement.style.top = -y + "px";
- documentClone.documentElement.style.left = -x + "px";
- documentClone.documentElement.style.position = 'absolute';
- }
- }
- resolve(container);
- }
- }, 50);
- };
- documentClone.open();
- documentClone.write("<!DOCTYPE html><html></html>");
- // Chrome scrolls the parent document for some reason after the write to the cloned window???
- restoreOwnerScroll(ownerDocument, x, y);
- documentClone.replaceChild(documentClone.adoptNode(documentElement), documentClone.documentElement);
- documentClone.close();
- });
- };
- }, { "./log": 13 }], 3: [function (_dereq_, module, exports) {
- // http://dev.w3.org/csswg/css-color/
- function Color(value) {
- this.r = 0;
- this.g = 0;
- this.b = 0;
- this.a = null;
- var result = this.fromArray(value) ||
- this.namedColor(value) ||
- this.rgb(value) ||
- this.rgba(value) ||
- this.hex6(value) ||
- this.hex3(value);
- }
- Color.prototype.darken = function (amount) {
- var a = 1 - amount;
- return new Color([
- Math.round(this.r * a),
- Math.round(this.g * a),
- Math.round(this.b * a),
- this.a]);
- };
- Color.prototype.isTransparent = function () {
- return this.a === 0;
- };
- Color.prototype.isBlack = function () {
- return this.r === 0 && this.g === 0 && this.b === 0;
- };
- Color.prototype.fromArray = function (array) {
- if (Array.isArray(array)) {
- this.r = Math.min(array[0], 255);
- this.g = Math.min(array[1], 255);
- this.b = Math.min(array[2], 255);
- if (array.length > 3) {
- this.a = array[3];
- }
- }
- return Array.isArray(array);
- };
- var _hex3 = /^#([a-f0-9]{3})$/i;
- Color.prototype.hex3 = function (value) {
- var match = null;
- if ((match = value.match(_hex3)) !== null) {
- this.r = parseInt(match[1][0] + match[1][0], 16);
- this.g = parseInt(match[1][1] + match[1][1], 16);
- this.b = parseInt(match[1][2] + match[1][2], 16);
- }
- return match !== null;
- };
- var _hex6 = /^#([a-f0-9]{6})$/i;
- Color.prototype.hex6 = function (value) {
- var match = null;
- if ((match = value.match(_hex6)) !== null) {
- this.r = parseInt(match[1].substring(0, 2), 16);
- this.g = parseInt(match[1].substring(2, 4), 16);
- this.b = parseInt(match[1].substring(4, 6), 16);
- }
- return match !== null;
- };
- var _rgb = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/;
- Color.prototype.rgb = function (value) {
- var match = null;
- if ((match = value.match(_rgb)) !== null) {
- this.r = Number(match[1]);
- this.g = Number(match[2]);
- this.b = Number(match[3]);
- }
- return match !== null;
- };
- var _rgba = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/;
- Color.prototype.rgba = function (value) {
- var match = null;
- if ((match = value.match(_rgba)) !== null) {
- this.r = Number(match[1]);
- this.g = Number(match[2]);
- this.b = Number(match[3]);
- this.a = Number(match[4]);
- }
- return match !== null;
- };
- Color.prototype.toString = function () {
- return this.a !== null && this.a !== 1 ?
- "rgba(" + [this.r, this.g, this.b, this.a].join(",") + ")" :
- "rgb(" + [this.r, this.g, this.b].join(",") + ")";
- };
- Color.prototype.namedColor = function (value) {
- value = value.toLowerCase();
- var color = colors[value];
- if (color) {
- this.r = color[0];
- this.g = color[1];
- this.b = color[2];
- } else if (value === "transparent") {
- this.r = this.g = this.b = this.a = 0;
- return true;
- }
- return !!color;
- };
- Color.prototype.isColor = true;
- // JSON.stringify([].slice.call($$('.named-color-table tr'), 1).map(function(row) { return [row.childNodes[3].textContent, row.childNodes[5].textContent.trim().split(",").map(Number)] }).reduce(function(data, row) {data[row[0]] = row[1]; return data}, {}))
- var colors = {
- "aliceblue": [240, 248, 255],
- "antiquewhite": [250, 235, 215],
- "aqua": [0, 255, 255],
- "aquamarine": [127, 255, 212],
- "azure": [240, 255, 255],
- "beige": [245, 245, 220],
- "bisque": [255, 228, 196],
- "black": [0, 0, 0],
- "blanchedalmond": [255, 235, 205],
- "blue": [0, 0, 255],
- "blueviolet": [138, 43, 226],
- "brown": [165, 42, 42],
- "burlywood": [222, 184, 135],
- "cadetblue": [95, 158, 160],
- "chartreuse": [127, 255, 0],
- "chocolate": [210, 105, 30],
- "coral": [255, 127, 80],
- "cornflowerblue": [100, 149, 237],
- "cornsilk": [255, 248, 220],
- "crimson": [220, 20, 60],
- "cyan": [0, 255, 255],
- "darkblue": [0, 0, 139],
- "darkcyan": [0, 139, 139],
- "darkgoldenrod": [184, 134, 11],
- "darkgray": [169, 169, 169],
- "darkgreen": [0, 100, 0],
- "darkgrey": [169, 169, 169],
- "darkkhaki": [189, 183, 107],
- "darkmagenta": [139, 0, 139],
- "darkolivegreen": [85, 107, 47],
- "darkorange": [255, 140, 0],
- "darkorchid": [153, 50, 204],
- "darkred": [139, 0, 0],
- "darksalmon": [233, 150, 122],
- "darkseagreen": [143, 188, 143],
- "darkslateblue": [72, 61, 139],
- "darkslategray": [47, 79, 79],
- "darkslategrey": [47, 79, 79],
- "darkturquoise": [0, 206, 209],
- "darkviolet": [148, 0, 211],
- "deeppink": [255, 20, 147],
- "deepskyblue": [0, 191, 255],
- "dimgray": [105, 105, 105],
- "dimgrey": [105, 105, 105],
- "dodgerblue": [30, 144, 255],
- "firebrick": [178, 34, 34],
- "floralwhite": [255, 250, 240],
- "forestgreen": [34, 139, 34],
- "fuchsia": [255, 0, 255],
- "gainsboro": [220, 220, 220],
- "ghostwhite": [248, 248, 255],
- "gold": [255, 215, 0],
- "goldenrod": [218, 165, 32],
- "gray": [128, 128, 128],
- "green": [0, 128, 0],
- "greenyellow": [173, 255, 47],
- "grey": [128, 128, 128],
- "honeydew": [240, 255, 240],
- "hotpink": [255, 105, 180],
- "indianred": [205, 92, 92],
- "indigo": [75, 0, 130],
- "ivory": [255, 255, 240],
- "khaki": [240, 230, 140],
- "lavender": [230, 230, 250],
- "lavenderblush": [255, 240, 245],
- "lawngreen": [124, 252, 0],
- "lemonchiffon": [255, 250, 205],
- "lightblue": [173, 216, 230],
- "lightcoral": [240, 128, 128],
- "lightcyan": [224, 255, 255],
- "lightgoldenrodyellow": [250, 250, 210],
- "lightgray": [211, 211, 211],
- "lightgreen": [144, 238, 144],
- "lightgrey": [211, 211, 211],
- "lightpink": [255, 182, 193],
- "lightsalmon": [255, 160, 122],
- "lightseagreen": [32, 178, 170],
- "lightskyblue": [135, 206, 250],
- "lightslategray": [119, 136, 153],
- "lightslategrey": [119, 136, 153],
- "lightsteelblue": [176, 196, 222],
- "lightyellow": [255, 255, 224],
- "lime": [0, 255, 0],
- "limegreen": [50, 205, 50],
- "linen": [250, 240, 230],
- "magenta": [255, 0, 255],
- "maroon": [128, 0, 0],
- "mediumaquamarine": [102, 205, 170],
- "mediumblue": [0, 0, 205],
- "mediumorchid": [186, 85, 211],
- "mediumpurple": [147, 112, 219],
- "mediumseagreen": [60, 179, 113],
- "mediumslateblue": [123, 104, 238],
- "mediumspringgreen": [0, 250, 154],
- "mediumturquoise": [72, 209, 204],
- "mediumvioletred": [199, 21, 133],
- "midnightblue": [25, 25, 112],
- "mintcream": [245, 255, 250],
- "mistyrose": [255, 228, 225],
- "moccasin": [255, 228, 181],
- "navajowhite": [255, 222, 173],
- "navy": [0, 0, 128],
- "oldlace": [253, 245, 230],
- "olive": [128, 128, 0],
- "olivedrab": [107, 142, 35],
- "orange": [255, 165, 0],
- "orangered": [255, 69, 0],
- "orchid": [218, 112, 214],
- "palegoldenrod": [238, 232, 170],
- "palegreen": [152, 251, 152],
- "paleturquoise": [175, 238, 238],
- "palevioletred": [219, 112, 147],
- "papayawhip": [255, 239, 213],
- "peachpuff": [255, 218, 185],
- "peru": [205, 133, 63],
- "pink": [255, 192, 203],
- "plum": [221, 160, 221],
- "powderblue": [176, 224, 230],
- "purple": [128, 0, 128],
- "rebeccapurple": [102, 51, 153],
- "red": [255, 0, 0],
- "rosybrown": [188, 143, 143],
- "royalblue": [65, 105, 225],
- "saddlebrown": [139, 69, 19],
- "salmon": [250, 128, 114],
- "sandybrown": [244, 164, 96],
- "seagreen": [46, 139, 87],
- "seashell": [255, 245, 238],
- "sienna": [160, 82, 45],
- "silver": [192, 192, 192],
- "skyblue": [135, 206, 235],
- "slateblue": [106, 90, 205],
- "slategray": [112, 128, 144],
- "slategrey": [112, 128, 144],
- "snow": [255, 250, 250],
- "springgreen": [0, 255, 127],
- "steelblue": [70, 130, 180],
- "tan": [210, 180, 140],
- "teal": [0, 128, 128],
- "thistle": [216, 191, 216],
- "tomato": [255, 99, 71],
- "turquoise": [64, 224, 208],
- "violet": [238, 130, 238],
- "wheat": [245, 222, 179],
- "white": [255, 255, 255],
- "whitesmoke": [245, 245, 245],
- "yellow": [255, 255, 0],
- "yellowgreen": [154, 205, 50] };
- module.exports = Color;
- }, {}], 4: [function (_dereq_, module, exports) {
- var Support = _dereq_('./support');
- var CanvasRenderer = _dereq_('./renderers/canvas');
- var ImageLoader = _dereq_('./imageloader');
- var NodeParser = _dereq_('./nodeparser');
- var NodeContainer = _dereq_('./nodecontainer');
- var log = _dereq_('./log');
- var utils = _dereq_('./utils');
- var createWindowClone = _dereq_('./clone');
- var loadUrlDocument = _dereq_('./proxy').loadUrlDocument;
- var getBounds = utils.getBounds;
- var html2canvasNodeAttribute = "data-html2canvas-node";
- var html2canvasCloneIndex = 0;
- function html2canvas(nodeList, options) {
- var index = html2canvasCloneIndex++;
- options = options || {};
- if (options.logging) {
- log.options.logging = true;
- log.options.start = Date.now();
- }
- options.async = typeof options.async === "undefined" ? true : options.async;
- options.allowTaint = typeof options.allowTaint === "undefined" ? false : options.allowTaint;
- options.removeContainer = typeof options.removeContainer === "undefined" ? true : options.removeContainer;
- options.javascriptEnabled = typeof options.javascriptEnabled === "undefined" ? false : options.javascriptEnabled;
- options.imageTimeout = typeof options.imageTimeout === "undefined" ? 10000 : options.imageTimeout;
- options.renderer = typeof options.renderer === "function" ? options.renderer : CanvasRenderer;
- options.strict = !!options.strict;
- if (typeof nodeList === "string") {
- if (typeof options.proxy !== "string") {
- return Promise.reject("Proxy must be used when rendering url");
- }
- var width = options.width != null ? options.width : window.innerWidth;
- var height = options.height != null ? options.height : window.innerHeight;
- return loadUrlDocument(absoluteUrl(nodeList), options.proxy, document, width, height, options).then(function (container) {
- return renderWindow(container.contentWindow.document.documentElement, container, options, width, height);
- });
- }
- var node = (nodeList === undefined ? [document.documentElement] : nodeList.length ? nodeList : [nodeList])[0];
- node.setAttribute(html2canvasNodeAttribute + index, index);
- return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function (canvas) {
- if (typeof options.onrendered === "function") {
- log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas");
- options.onrendered(canvas);
- }
- return canvas;
- });
- }
- html2canvas.CanvasRenderer = CanvasRenderer;
- html2canvas.NodeContainer = NodeContainer;
- html2canvas.log = log;
- html2canvas.utils = utils;
- var html2canvasExport = typeof document === "undefined" || typeof Object.create !== "function" || typeof document.createElement("canvas").getContext !== "function" ? function () {
- return Promise.reject("No canvas support");
- } : html2canvas;
- module.exports = html2canvasExport;
- if (typeof define === 'function' && define.amd) {
- define('html2canvas', [], function () {
- return html2canvasExport;
- });
- }
- function renderDocument(document, options, windowWidth, windowHeight, html2canvasIndex) {
- return createWindowClone(document, document, windowWidth, windowHeight, options, document.defaultView.pageXOffset, document.defaultView.pageYOffset).then(function (container) {
- log("Document cloned");
- var attributeName = html2canvasNodeAttribute + html2canvasIndex;
- var selector = "[" + attributeName + "='" + html2canvasIndex + "']";
- document.querySelector(selector).removeAttribute(attributeName);
- var clonedWindow = container.contentWindow;
- var node = clonedWindow.document.querySelector(selector);
- var oncloneHandler = typeof options.onclone === "function" ? Promise.resolve(options.onclone(clonedWindow.document)) : Promise.resolve(true);
- return oncloneHandler.then(function () {
- return renderWindow(node, container, options, windowWidth, windowHeight);
- });
- });
- }
- function renderWindow(node, container, options, windowWidth, windowHeight) {
- var clonedWindow = container.contentWindow;
- var support = new Support(clonedWindow.document);
- var imageLoader = new ImageLoader(options, support);
- var bounds = getBounds(node);
- var width = options.type === "view" ? windowWidth : documentWidth(clonedWindow.document);
- var height = options.type === "view" ? windowHeight : documentHeight(clonedWindow.document);
- var renderer = new options.renderer(width, height, imageLoader, options, document);
- var parser = new NodeParser(node, renderer, support, imageLoader, options);
- return parser.ready.then(function () {
- log("Finished rendering");
- var canvas;
- if (options.type === "view") {
- canvas = crop(renderer.canvas, { width: renderer.canvas.width, height: renderer.canvas.height, top: 0, left: 0, x: 0, y: 0 });
- } else if (node === clonedWindow.document.body || node === clonedWindow.document.documentElement || options.canvas != null) {
- canvas = renderer.canvas;
- } else {
- canvas = crop(renderer.canvas, { width: options.width != null ? options.width : bounds.width, height: options.height != null ? options.height : bounds.height, top: bounds.top, left: bounds.left, x: 0, y: 0 });
- }
- cleanupContainer(container, options);
- return canvas;
- });
- }
- function cleanupContainer(container, options) {
- if (options.removeContainer) {
- container.parentNode.removeChild(container);
- log("Cleaned up container");
- }
- }
- function crop(canvas, bounds) {
- var croppedCanvas = document.createElement("canvas");
- var x1 = Math.min(canvas.width - 1, Math.max(0, bounds.left));
- var x2 = Math.min(canvas.width, Math.max(1, bounds.left + bounds.width));
- var y1 = Math.min(canvas.height - 1, Math.max(0, bounds.top));
- var y2 = Math.min(canvas.height, Math.max(1, bounds.top + bounds.height));
- croppedCanvas.width = bounds.width;
- croppedCanvas.height = bounds.height;
- var width = x2 - x1;
- var height = y2 - y1;
- log("Cropping canvas at:", "left:", bounds.left, "top:", bounds.top, "width:", width, "height:", height);
- log("Resulting crop with width", bounds.width, "and height", bounds.height, "with x", x1, "and y", y1);
- croppedCanvas.getContext("2d").drawImage(canvas, x1, y1, width, height, bounds.x, bounds.y, width, height);
- return croppedCanvas;
- }
- function documentWidth(doc) {
- return Math.max(
- Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth),
- Math.max(doc.body.offsetWidth, doc.documentElement.offsetWidth),
- Math.max(doc.body.clientWidth, doc.documentElement.clientWidth));
- }
- function documentHeight(doc) {
- return Math.max(
- Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight),
- Math.max(doc.body.offsetHeight, doc.documentElement.offsetHeight),
- Math.max(doc.body.clientHeight, doc.documentElement.clientHeight));
- }
- function absoluteUrl(url) {
- var link = document.createElement("a");
- link.href = url;
- link.href = link.href;
- return link;
- }
- }, { "./clone": 2, "./imageloader": 11, "./log": 13, "./nodecontainer": 14, "./nodeparser": 15, "./proxy": 16, "./renderers/canvas": 20, "./support": 22, "./utils": 26 }], 5: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var smallImage = _dereq_('./utils').smallImage;
- function DummyImageContainer(src) {
- this.src = src;
- log("DummyImageContainer for", src);
- if (!this.promise || !this.image) {
- log("Initiating DummyImageContainer");
- DummyImageContainer.prototype.image = new Image();
- var image = this.image;
- DummyImageContainer.prototype.promise = new Promise(function (resolve, reject) {
- image.onload = resolve;
- image.onerror = reject;
- image.src = smallImage();
- if (image.complete === true) {
- resolve(image);
- }
- });
- }
- }
- module.exports = DummyImageContainer;
- }, { "./log": 13, "./utils": 26 }], 6: [function (_dereq_, module, exports) {
- var smallImage = _dereq_('./utils').smallImage;
- function Font(family, size) {
- var container = document.createElement('div'),
- img = document.createElement('img'),
- span = document.createElement('span'),
- sampleText = 'Hidden Text',
- baseline,
- middle;
- container.style.visibility = "hidden";
- container.style.fontFamily = family;
- container.style.fontSize = size;
- container.style.margin = 0;
- container.style.padding = 0;
- document.body.appendChild(container);
- img.src = smallImage();
- img.width = 1;
- img.height = 1;
- img.style.margin = 0;
- img.style.padding = 0;
- img.style.verticalAlign = "baseline";
- span.style.fontFamily = family;
- span.style.fontSize = size;
- span.style.margin = 0;
- span.style.padding = 0;
- span.appendChild(document.createTextNode(sampleText));
- container.appendChild(span);
- container.appendChild(img);
- baseline = img.offsetTop - span.offsetTop + 1;
- container.removeChild(span);
- container.appendChild(document.createTextNode(sampleText));
- container.style.lineHeight = "normal";
- img.style.verticalAlign = "super";
- middle = img.offsetTop - container.offsetTop + 1;
- document.body.removeChild(container);
- this.baseline = baseline;
- this.lineWidth = 1;
- this.middle = middle;
- }
- module.exports = Font;
- }, { "./utils": 26 }], 7: [function (_dereq_, module, exports) {
- var Font = _dereq_('./font');
- function FontMetrics() {
- this.data = {};
- }
- FontMetrics.prototype.getMetrics = function (family, size) {
- if (this.data[family + "-" + size] === undefined) {
- this.data[family + "-" + size] = new Font(family, size);
- }
- return this.data[family + "-" + size];
- };
- module.exports = FontMetrics;
- }, { "./font": 6 }], 8: [function (_dereq_, module, exports) {
- var utils = _dereq_('./utils');
- var getBounds = utils.getBounds;
- var loadUrlDocument = _dereq_('./proxy').loadUrlDocument;
- function FrameContainer(container, sameOrigin, options) {
- this.image = null;
- this.src = container;
- var self = this;
- var bounds = getBounds(container);
- this.promise = (!sameOrigin ? this.proxyLoad(options.proxy, bounds, options) : new Promise(function (resolve) {
- if (container.contentWindow.document.URL === "about:blank" || container.contentWindow.document.documentElement == null) {
- container.contentWindow.onload = container.onload = function () {
- resolve(container);
- };
- } else {
- resolve(container);
- }
- })).then(function (container) {
- var html2canvas = _dereq_('./core');
- return html2canvas(container.contentWindow.document.documentElement, { type: 'view', width: container.width, height: container.height, proxy: options.proxy, javascriptEnabled: options.javascriptEnabled, removeContainer: options.removeContainer, allowTaint: options.allowTaint, imageTimeout: options.imageTimeout / 2 });
- }).then(function (canvas) {
- return self.image = canvas;
- });
- }
- FrameContainer.prototype.proxyLoad = function (proxy, bounds, options) {
- var container = this.src;
- return loadUrlDocument(container.src, proxy, container.ownerDocument, bounds.width, bounds.height, options);
- };
- module.exports = FrameContainer;
- }, { "./core": 4, "./proxy": 16, "./utils": 26 }], 9: [function (_dereq_, module, exports) {
- function GradientContainer(imageData) {
- this.src = imageData.value;
- this.colorStops = [];
- this.type = null;
- this.x0 = 0.5;
- this.y0 = 0.5;
- this.x1 = 0.5;
- this.y1 = 0.5;
- this.promise = Promise.resolve(true);
- }
- GradientContainer.TYPES = {
- LINEAR: 1,
- RADIAL: 2 };
- // TODO: support hsl[a], negative %/length values
- // TODO: support <angle> (e.g. -?\d{1,3}(?:\.\d+)deg, etc. : https://developer.mozilla.org/docs/Web/CSS/angle )
- GradientContainer.REGEXP_COLORSTOP = /^\s*(rgba?\(\s*\d{1,3},\s*\d{1,3},\s*\d{1,3}(?:,\s*[0-9\.]+)?\s*\)|[a-z]{3,20}|#[a-f0-9]{3,6})(?:\s+(\d{1,3}(?:\.\d+)?)(%|px)?)?(?:\s|$)/i;
- module.exports = GradientContainer;
- }, {}], 10: [function (_dereq_, module, exports) {
- function ImageContainer(src, cors) {
- this.src = src;
- this.image = new Image();
- var self = this;
- this.tainted = null;
- this.promise = new Promise(function (resolve, reject) {
- self.image.onload = resolve;
- self.image.onerror = reject;
- if (cors) {
- self.image.crossOrigin = "anonymous";
- }
- self.image.src = src;
- if (self.image.complete === true) {
- resolve(self.image);
- }
- });
- }
- module.exports = ImageContainer;
- }, {}], 11: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var ImageContainer = _dereq_('./imagecontainer');
- var DummyImageContainer = _dereq_('./dummyimagecontainer');
- var ProxyImageContainer = _dereq_('./proxyimagecontainer');
- var FrameContainer = _dereq_('./framecontainer');
- var SVGContainer = _dereq_('./svgcontainer');
- var SVGNodeContainer = _dereq_('./svgnodecontainer');
- var LinearGradientContainer = _dereq_('./lineargradientcontainer');
- var WebkitGradientContainer = _dereq_('./webkitgradientcontainer');
- var bind = _dereq_('./utils').bind;
- function ImageLoader(options, support) {
- this.link = null;
- this.options = options;
- this.support = support;
- this.origin = this.getOrigin(window.location.href);
- }
- ImageLoader.prototype.findImages = function (nodes) {
- var images = [];
- nodes.reduce(function (imageNodes, container) {
- switch (container.node.nodeName) {
- case "IMG":
- return imageNodes.concat([{
- args: [container.node.src],
- method: "url" }]);
- case "svg":
- case "IFRAME":
- return imageNodes.concat([{
- args: [container.node],
- method: container.node.nodeName }]);}
- return imageNodes;
- }, []).forEach(this.addImage(images, this.loadImage), this);
- return images;
- };
- ImageLoader.prototype.findBackgroundImage = function (images, container) {
- container.parseBackgroundImages().filter(this.hasImageBackground).forEach(this.addImage(images, this.loadImage), this);
- return images;
- };
- ImageLoader.prototype.addImage = function (images, callback) {
- return function (newImage) {
- newImage.args.forEach(function (image) {
- if (!this.imageExists(images, image)) {
- images.splice(0, 0, callback.call(this, newImage));
- log('Added image #' + images.length, typeof image === "string" ? image.substring(0, 100) : image);
- }
- }, this);
- };
- };
- ImageLoader.prototype.hasImageBackground = function (imageData) {
- return imageData.method !== "none";
- };
- ImageLoader.prototype.loadImage = function (imageData) {
- if (imageData.method === "url") {
- var src = imageData.args[0];
- if (this.isSVG(src) && !this.support.svg && !this.options.allowTaint) {
- return new SVGContainer(src);
- } else if (src.match(/data:image\/.*;base64,/i)) {
- return new ImageContainer(src.replace(/url\(['"]{0,}|['"]{0,}\)$/ig, ''), false);
- } else if (this.isSameOrigin(src) || this.options.allowTaint === true || this.isSVG(src)) {
- return new ImageContainer(src, false);
- } else if (this.support.cors && !this.options.allowTaint && this.options.useCORS) {
- return new ImageContainer(src, true);
- } else if (this.options.proxy) {
- return new ProxyImageContainer(src, this.options.proxy);
- } else {
- return new DummyImageContainer(src);
- }
- } else if (imageData.method === "linear-gradient") {
- return new LinearGradientContainer(imageData);
- } else if (imageData.method === "gradient") {
- return new WebkitGradientContainer(imageData);
- } else if (imageData.method === "svg") {
- return new SVGNodeContainer(imageData.args[0], this.support.svg);
- } else if (imageData.method === "IFRAME") {
- return new FrameContainer(imageData.args[0], this.isSameOrigin(imageData.args[0].src), this.options);
- } else {
- return new DummyImageContainer(imageData);
- }
- };
- ImageLoader.prototype.isSVG = function (src) {
- return src.substring(src.length - 3).toLowerCase() === "svg" || SVGContainer.prototype.isInline(src);
- };
- ImageLoader.prototype.imageExists = function (images, src) {
- return images.some(function (image) {
- return image.src === src;
- });
- };
- ImageLoader.prototype.isSameOrigin = function (url) {
- return this.getOrigin(url) === this.origin;
- };
- ImageLoader.prototype.getOrigin = function (url) {
- var link = this.link || (this.link = document.createElement("a"));
- link.href = url;
- link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/
- return link.protocol + link.hostname + link.port;
- };
- ImageLoader.prototype.getPromise = function (container) {
- return this.timeout(container, this.options.imageTimeout)['catch'](function () {
- var dummy = new DummyImageContainer(container.src);
- return dummy.promise.then(function (image) {
- container.image = image;
- });
- });
- };
- ImageLoader.prototype.get = function (src) {
- var found = null;
- return this.images.some(function (img) {
- return (found = img).src === src;
- }) ? found : null;
- };
- ImageLoader.prototype.fetch = function (nodes) {
- this.images = nodes.reduce(bind(this.findBackgroundImage, this), this.findImages(nodes));
- this.images.forEach(function (image, index) {
- image.promise.then(function () {
- log("Succesfully loaded image #" + (index + 1), image);
- }, function (e) {
- log("Failed loading image #" + (index + 1), image, e);
- });
- });
- this.ready = Promise.all(this.images.map(this.getPromise, this));
- log("Finished searching images");
- return this;
- };
- ImageLoader.prototype.timeout = function (container, timeout) {
- var timer;
- var promise = Promise.race([container.promise, new Promise(function (res, reject) {
- timer = setTimeout(function () {
- log("Timed out loading image", container);
- reject(container);
- }, timeout);
- })]).then(function (container) {
- clearTimeout(timer);
- return container;
- });
- promise['catch'](function () {
- clearTimeout(timer);
- });
- return promise;
- };
- module.exports = ImageLoader;
- }, { "./dummyimagecontainer": 5, "./framecontainer": 8, "./imagecontainer": 10, "./lineargradientcontainer": 12, "./log": 13, "./proxyimagecontainer": 17, "./svgcontainer": 23, "./svgnodecontainer": 24, "./utils": 26, "./webkitgradientcontainer": 27 }], 12: [function (_dereq_, module, exports) {
- var GradientContainer = _dereq_('./gradientcontainer');
- var Color = _dereq_('./color');
- function LinearGradientContainer(imageData) {
- GradientContainer.apply(this, arguments);
- this.type = GradientContainer.TYPES.LINEAR;
- var hasDirection = LinearGradientContainer.REGEXP_DIRECTION.test(imageData.args[0]) ||
- !GradientContainer.REGEXP_COLORSTOP.test(imageData.args[0]);
- if (hasDirection) {
- imageData.args[0].split(/\s+/).reverse().forEach(function (position, index) {
- switch (position) {
- case "left":
- this.x0 = 0;
- this.x1 = 1;
- break;
- case "top":
- this.y0 = 0;
- this.y1 = 1;
- break;
- case "right":
- this.x0 = 1;
- this.x1 = 0;
- break;
- case "bottom":
- this.y0 = 1;
- this.y1 = 0;
- break;
- case "to":
- var y0 = this.y0;
- var x0 = this.x0;
- this.y0 = this.y1;
- this.x0 = this.x1;
- this.x1 = x0;
- this.y1 = y0;
- break;
- case "center":
- break; // centered by default
- // Firefox internally converts position keywords to percentages:
- // http://www.w3.org/TR/2010/WD-CSS2-20101207/colors.html#propdef-background-position
- default: // percentage or absolute length
- // TODO: support absolute start point positions (e.g., use bounds to convert px to a ratio)
- var ratio = parseFloat(position, 10) * 1e-2;
- if (isNaN(ratio)) {// invalid or unhandled value
- break;
- }
- if (index === 0) {
- this.y0 = ratio;
- this.y1 = 1 - this.y0;
- } else {
- this.x0 = ratio;
- this.x1 = 1 - this.x0;
- }
- break;}
- }, this);
- } else {
- this.y0 = 0;
- this.y1 = 1;
- }
- this.colorStops = imageData.args.slice(hasDirection ? 1 : 0).map(function (colorStop) {
- var colorStopMatch = colorStop.match(GradientContainer.REGEXP_COLORSTOP);
- var value = +colorStopMatch[2];
- var unit = value === 0 ? "%" : colorStopMatch[3]; // treat "0" as "0%"
- return {
- color: new Color(colorStopMatch[1]),
- // TODO: support absolute stop positions (e.g., compute gradient line length & convert px to ratio)
- stop: unit === "%" ? value / 100 : null };
- });
- if (this.colorStops[0].stop === null) {
- this.colorStops[0].stop = 0;
- }
- if (this.colorStops[this.colorStops.length - 1].stop === null) {
- this.colorStops[this.colorStops.length - 1].stop = 1;
- }
- // calculates and fills-in explicit stop positions when omitted from rule
- this.colorStops.forEach(function (colorStop, index) {
- if (colorStop.stop === null) {
- this.colorStops.slice(index).some(function (find, count) {
- if (find.stop !== null) {
- colorStop.stop = (find.stop - this.colorStops[index - 1].stop) / (count + 1) + this.colorStops[index - 1].stop;
- return true;
- } else {
- return false;
- }
- }, this);
- }
- }, this);
- }
- LinearGradientContainer.prototype = Object.create(GradientContainer.prototype);
- // TODO: support <angle> (e.g. -?\d{1,3}(?:\.\d+)deg, etc. : https://developer.mozilla.org/docs/Web/CSS/angle )
- LinearGradientContainer.REGEXP_DIRECTION = /^\s*(?:to|left|right|top|bottom|center|\d{1,3}(?:\.\d+)?%?)(?:\s|$)/i;
- module.exports = LinearGradientContainer;
- }, { "./color": 3, "./gradientcontainer": 9 }], 13: [function (_dereq_, module, exports) {
- var logger = function logger() {
- if (logger.options.logging && window.console && window.console.log) {
- Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - logger.options.start + "ms", "html2canvas:"].concat([].slice.call(arguments, 0)));
- }
- };
- logger.options = { logging: false };
- module.exports = logger;
- }, {}], 14: [function (_dereq_, module, exports) {
- var Color = _dereq_('./color');
- var utils = _dereq_('./utils');
- var getBounds = utils.getBounds;
- var parseBackgrounds = utils.parseBackgrounds;
- var offsetBounds = utils.offsetBounds;
- function NodeContainer(node, parent) {
- this.node = node;
- this.parent = parent;
- this.stack = null;
- this.bounds = null;
- this.borders = null;
- this.clip = [];
- this.backgroundClip = [];
- this.offsetBounds = null;
- this.visible = null;
- this.computedStyles = null;
- this.colors = {};
- this.styles = {};
- this.backgroundImages = null;
- this.transformData = null;
- this.transformMatrix = null;
- this.isPseudoElement = false;
- this.opacity = null;
- }
- NodeContainer.prototype.cloneTo = function (stack) {
- stack.visible = this.visible;
- stack.borders = this.borders;
- stack.bounds = this.bounds;
- stack.clip = this.clip;
- stack.backgroundClip = this.backgroundClip;
- stack.computedStyles = this.computedStyles;
- stack.styles = this.styles;
- stack.backgroundImages = this.backgroundImages;
- stack.opacity = this.opacity;
- };
- NodeContainer.prototype.getOpacity = function () {
- return this.opacity === null ? this.opacity = this.cssFloat('opacity') : this.opacity;
- };
- NodeContainer.prototype.assignStack = function (stack) {
- this.stack = stack;
- stack.children.push(this);
- };
- NodeContainer.prototype.isElementVisible = function () {
- return this.node.nodeType === Node.TEXT_NODE ? this.parent.visible :
- this.css('display') !== "none" &&
- this.css('visibility') !== "hidden" &&
- !this.node.hasAttribute("data-html2canvas-ignore") && (
- this.node.nodeName !== "INPUT" || this.node.getAttribute("type") !== "hidden");
- };
- NodeContainer.prototype.css = function (attribute) {
- if (!this.computedStyles) {
- this.computedStyles = this.isPseudoElement ? this.parent.computedStyle(this.before ? ":before" : ":after") : this.computedStyle(null);
- }
- return this.styles[attribute] || (this.styles[attribute] = this.computedStyles[attribute]);
- };
- NodeContainer.prototype.prefixedCss = function (attribute) {
- var prefixes = ["webkit", "moz", "ms", "o"];
- var value = this.css(attribute);
- if (value === undefined) {
- prefixes.some(function (prefix) {
- value = this.css(prefix + attribute.substr(0, 1).toUpperCase() + attribute.substr(1));
- return value !== undefined;
- }, this);
- }
- return value === undefined ? null : value;
- };
- NodeContainer.prototype.computedStyle = function (type) {
- return this.node.ownerDocument.defaultView.getComputedStyle(this.node, type);
- };
- NodeContainer.prototype.cssInt = function (attribute) {
- var value = parseInt(this.css(attribute), 10);
- return isNaN(value) ? 0 : value; // borders in old IE are throwing 'medium' for demo.html
- };
- NodeContainer.prototype.color = function (attribute) {
- return this.colors[attribute] || (this.colors[attribute] = new Color(this.css(attribute)));
- };
- NodeContainer.prototype.cssFloat = function (attribute) {
- var value = parseFloat(this.css(attribute));
- return isNaN(value) ? 0 : value;
- };
- NodeContainer.prototype.fontWeight = function () {
- var weight = this.css("fontWeight");
- switch (parseInt(weight, 10)) {
- case 401:
- weight = "bold";
- break;
- case 400:
- weight = "normal";
- break;}
- return weight;
- };
- NodeContainer.prototype.parseClip = function () {
- var matches = this.css('clip').match(this.CLIP);
- if (matches) {
- return {
- top: parseInt(matches[1], 10),
- right: parseInt(matches[2], 10),
- bottom: parseInt(matches[3], 10),
- left: parseInt(matches[4], 10) };
- }
- return null;
- };
- NodeContainer.prototype.parseBackgroundImages = function () {
- return this.backgroundImages || (this.backgroundImages = parseBackgrounds(this.css("backgroundImage")));
- };
- NodeContainer.prototype.cssList = function (property, index) {
- var value = (this.css(property) || '').split(',');
- value = value[index || 0] || value[0] || 'auto';
- value = value.trim().split(' ');
- if (value.length === 1) {
- value = [value[0], isPercentage(value[0]) ? 'auto' : value[0]];
- }
- return value;
- };
- NodeContainer.prototype.parseBackgroundSize = function (bounds, image, index) {
- var size = this.cssList("backgroundSize", index);
- var width, height;
- if (isPercentage(size[0])) {
- width = bounds.width * parseFloat(size[0]) / 100;
- } else if (/contain|cover/.test(size[0])) {
- var targetRatio = bounds.width / bounds.height,currentRatio = image.width / image.height;
- return targetRatio < currentRatio ^ size[0] === 'contain' ? { width: bounds.height * currentRatio, height: bounds.height } : { width: bounds.width, height: bounds.width / currentRatio };
- } else {
- width = parseInt(size[0], 10);
- }
- if (size[0] === 'auto' && size[1] === 'auto') {
- height = image.height;
- } else if (size[1] === 'auto') {
- height = width / image.width * image.height;
- } else if (isPercentage(size[1])) {
- height = bounds.height * parseFloat(size[1]) / 100;
- } else {
- height = parseInt(size[1], 10);
- }
- if (size[0] === 'auto') {
- width = height / image.height * image.width;
- }
- return { width: width, height: height };
- };
- NodeContainer.prototype.parseBackgroundPosition = function (bounds, image, index, backgroundSize) {
- var position = this.cssList('backgroundPosition', index);
- var left, top;
- if (isPercentage(position[0])) {
- left = (bounds.width - (backgroundSize || image).width) * (parseFloat(position[0]) / 100);
- } else {
- left = parseInt(position[0], 10);
- }
- if (position[1] === 'auto') {
- top = left / image.width * image.height;
- } else if (isPercentage(position[1])) {
- top = (bounds.height - (backgroundSize || image).height) * parseFloat(position[1]) / 100;
- } else {
- top = parseInt(position[1], 10);
- }
- if (position[0] === 'auto') {
- left = top / image.height * image.width;
- }
- return { left: left, top: top };
- };
- NodeContainer.prototype.parseBackgroundRepeat = function (index) {
- return this.cssList("backgroundRepeat", index)[0];
- };
- NodeContainer.prototype.parseTextShadows = function () {
- var textShadow = this.css("textShadow");
- var results = [];
- if (textShadow && textShadow !== 'none') {
- var shadows = textShadow.match(this.TEXT_SHADOW_PROPERTY);
- for (var i = 0; shadows && i < shadows.length; i++) {
- var s = shadows[i].match(this.TEXT_SHADOW_VALUES);
- results.push({
- color: new Color(s[0]),
- offsetX: s[1] ? parseFloat(s[1].replace('px', '')) : 0,
- offsetY: s[2] ? parseFloat(s[2].replace('px', '')) : 0,
- blur: s[3] ? s[3].replace('px', '') : 0 });
- }
- }
- return results;
- };
- NodeContainer.prototype.parseTransform = function () {
- if (!this.transformData) {
- if (this.hasTransform()) {
- var offset = this.parseBounds();
- var origin = this.prefixedCss("transformOrigin").split(" ").map(removePx).map(asFloat);
- origin[0] += offset.left;
- origin[1] += offset.top;
- this.transformData = {
- origin: origin,
- matrix: this.parseTransformMatrix() };
- } else {
- this.transformData = {
- origin: [0, 0],
- matrix: [1, 0, 0, 1, 0, 0] };
- }
- }
- return this.transformData;
- };
- NodeContainer.prototype.parseTransformMatrix = function () {
- if (!this.transformMatrix) {
- var transform = this.prefixedCss("transform");
- var matrix = transform ? parseMatrix(transform.match(this.MATRIX_PROPERTY)) : null;
- this.transformMatrix = matrix ? matrix : [1, 0, 0, 1, 0, 0];
- }
- return this.transformMatrix;
- };
- NodeContainer.prototype.parseBounds = function () {
- return this.bounds || (this.bounds = this.hasTransform() ? offsetBounds(this.node) : getBounds(this.node));
- };
- NodeContainer.prototype.hasTransform = function () {
- return this.parseTransformMatrix().join(",") !== "1,0,0,1,0,0" || this.parent && this.parent.hasTransform();
- };
- NodeContainer.prototype.getValue = function () {
- var value = this.node.value || "";
- if (this.node.tagName === "SELECT") {
- value = selectionValue(this.node);
- } else if (this.node.type === "password") {
- value = Array(value.length + 1).join("\u2022"); // jshint ignore:line
- }
- return value.length === 0 ? this.node.placeholder || "" : value;
- };
- NodeContainer.prototype.MATRIX_PROPERTY = /(matrix|matrix3d)\((.+)\)/;
- NodeContainer.prototype.TEXT_SHADOW_PROPERTY = /((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g;
- NodeContainer.prototype.TEXT_SHADOW_VALUES = /(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g;
- NodeContainer.prototype.CLIP = /^rect\((\d+)px,? (\d+)px,? (\d+)px,? (\d+)px\)$/;
- function selectionValue(node) {
- var option = node.options[node.selectedIndex || 0];
- return option ? option.text || "" : "";
- }
- function parseMatrix(match) {
- if (match && match[1] === "matrix") {
- return match[2].split(",").map(function (s) {
- return parseFloat(s.trim());
- });
- } else if (match && match[1] === "matrix3d") {
- var matrix3d = match[2].split(",").map(function (s) {
- return parseFloat(s.trim());
- });
- return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]];
- }
- }
- function isPercentage(value) {
- return value.toString().indexOf("%") !== -1;
- }
- function removePx(str) {
- return str.replace("px", "");
- }
- function asFloat(str) {
- return parseFloat(str);
- }
- module.exports = NodeContainer;
- }, { "./color": 3, "./utils": 26 }], 15: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- var punycode = _dereq_('punycode');
- var NodeContainer = _dereq_('./nodecontainer');
- var TextContainer = _dereq_('./textcontainer');
- var PseudoElementContainer = _dereq_('./pseudoelementcontainer');
- var FontMetrics = _dereq_('./fontmetrics');
- var Color = _dereq_('./color');
- var StackingContext = _dereq_('./stackingcontext');
- var utils = _dereq_('./utils');
- var bind = utils.bind;
- var getBounds = utils.getBounds;
- var parseBackgrounds = utils.parseBackgrounds;
- var offsetBounds = utils.offsetBounds;
- function NodeParser(element, renderer, support, imageLoader, options) {
- log("Starting NodeParser");
- this.renderer = renderer;
- this.options = options;
- this.range = null;
- this.support = support;
- this.renderQueue = [];
- this.stack = new StackingContext(true, 1, element.ownerDocument, null);
- var parent = new NodeContainer(element, null);
- if (options.background) {
- renderer.rectangle(0, 0, renderer.width, renderer.height, new Color(options.background));
- }
- if (element === element.ownerDocument.documentElement) {
- // http://www.w3.org/TR/css3-background/#special-backgrounds
- var canvasBackground = new NodeContainer(parent.color('backgroundColor').isTransparent() ? element.ownerDocument.body : element.ownerDocument.documentElement, null);
- renderer.rectangle(0, 0, renderer.width, renderer.height, canvasBackground.color('backgroundColor'));
- }
- parent.visibile = parent.isElementVisible();
- this.createPseudoHideStyles(element.ownerDocument);
- this.disableAnimations(element.ownerDocument);
- this.nodes = flatten([parent].concat(this.getChildren(parent)).filter(function (container) {
- return container.visible = container.isElementVisible();
- }).map(this.getPseudoElements, this));
- this.fontMetrics = new FontMetrics();
- log("Fetched nodes, total:", this.nodes.length);
- log("Calculate overflow clips");
- this.calculateOverflowClips();
- log("Start fetching images");
- this.images = imageLoader.fetch(this.nodes.filter(isElement));
- this.ready = this.images.ready.then(bind(function () {
- log("Images loaded, starting parsing");
- log("Creating stacking contexts");
- this.createStackingContexts();
- log("Sorting stacking contexts");
- this.sortStackingContexts(this.stack);
- this.parse(this.stack);
- log("Render queue created with " + this.renderQueue.length + " items");
- return new Promise(bind(function (resolve) {
- if (!options.async) {
- this.renderQueue.forEach(this.paint, this);
- resolve();
- } else if (typeof options.async === "function") {
- options.async.call(this, this.renderQueue, resolve);
- } else if (this.renderQueue.length > 0) {
- this.renderIndex = 0;
- this.asyncRenderer(this.renderQueue, resolve);
- } else {
- resolve();
- }
- }, this));
- }, this));
- }
- NodeParser.prototype.calculateOverflowClips = function () {
- this.nodes.forEach(function (container) {
- if (isElement(container)) {
- if (isPseudoElement(container)) {
- container.appendToDOM();
- }
- container.borders = this.parseBorders(container);
- var clip = container.css('overflow') === "hidden" ? [container.borders.clip] : [];
- var cssClip = container.parseClip();
- if (cssClip && ["absolute", "fixed"].indexOf(container.css('position')) !== -1) {
- clip.push([["rect",
- container.bounds.left + cssClip.left,
- container.bounds.top + cssClip.top,
- cssClip.right - cssClip.left,
- cssClip.bottom - cssClip.top]]);
- }
- container.clip = hasParentClip(container) ? container.parent.clip.concat(clip) : clip;
- container.backgroundClip = container.css('overflow') !== "hidden" ? container.clip.concat([container.borders.clip]) : container.clip;
- if (isPseudoElement(container)) {
- container.cleanDOM();
- }
- } else if (isTextNode(container)) {
- container.clip = hasParentClip(container) ? container.parent.clip : [];
- }
- if (!isPseudoElement(container)) {
- container.bounds = null;
- }
- }, this);
- };
- function hasParentClip(container) {
- return container.parent && container.parent.clip.length;
- }
- NodeParser.prototype.asyncRenderer = function (queue, resolve, asyncTimer) {
- asyncTimer = asyncTimer || Date.now();
- this.paint(queue[this.renderIndex++]);
- if (queue.length === this.renderIndex) {
- resolve();
- } else if (asyncTimer + 20 > Date.now()) {
- this.asyncRenderer(queue, resolve, asyncTimer);
- } else {
- setTimeout(bind(function () {
- this.asyncRenderer(queue, resolve);
- }, this), 0);
- }
- };
- NodeParser.prototype.createPseudoHideStyles = function (document) {
- this.createStyles(document, '.' + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ':before { content: "" !important; display: none !important; }' +
- '.' + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER + ':after { content: "" !important; display: none !important; }');
- };
- NodeParser.prototype.disableAnimations = function (document) {
- this.createStyles(document, '* { -webkit-animation: none !important; -moz-animation: none !important; -o-animation: none !important; animation: none !important; ' +
- '-webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; transition: none !important;}');
- };
- NodeParser.prototype.createStyles = function (document, styles) {
- var hidePseudoElements = document.createElement('style');
- hidePseudoElements.innerHTML = styles;
- document.body.appendChild(hidePseudoElements);
- };
- NodeParser.prototype.getPseudoElements = function (container) {
- var nodes = [[container]];
- if (container.node.nodeType === Node.ELEMENT_NODE) {
- var before = this.getPseudoElement(container, ":before");
- var after = this.getPseudoElement(container, ":after");
- if (before) {
- nodes.push(before);
- }
- if (after) {
- nodes.push(after);
- }
- }
- return flatten(nodes);
- };
- function toCamelCase(str) {
- return str.replace(/(\-[a-z])/g, function (match) {
- return match.toUpperCase().replace('-', '');
- });
- }
- NodeParser.prototype.getPseudoElement = function (container, type) {
- var style = container.computedStyle(type);
- if (!style || !style.content || style.content === "none" || style.content === "-moz-alt-content" || style.display === "none") {
- return null;
- }
- var content = stripQuotes(style.content);
- var isImage = content.substr(0, 3) === 'url';
- var pseudoNode = document.createElement(isImage ? 'img' : 'html2canvaspseudoelement');
- var pseudoContainer = new PseudoElementContainer(pseudoNode, container, type);
- for (var i = style.length - 1; i >= 0; i--) {
- var property = toCamelCase(style.item(i));
- pseudoNode.style[property] = style[property];
- }
- pseudoNode.className = PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + " " + PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
- if (isImage) {
- pseudoNode.src = parseBackgrounds(content)[0].args[0];
- return [pseudoContainer];
- } else {
- var text = document.createTextNode(content);
- pseudoNode.appendChild(text);
- return [pseudoContainer, new TextContainer(text, pseudoContainer)];
- }
- };
- NodeParser.prototype.getChildren = function (parentContainer) {
- return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function (node) {
- var container = [node.nodeType === Node.TEXT_NODE ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
- return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : [] : container;
- }, this));
- };
- NodeParser.prototype.newStackingContext = function (container, hasOwnStacking) {
- var stack = new StackingContext(hasOwnStacking, container.getOpacity(), container.node, container.parent);
- container.cloneTo(stack);
- var parentStack = hasOwnStacking ? stack.getParentStack(this) : stack.parent.stack;
- parentStack.contexts.push(stack);
- container.stack = stack;
- };
- NodeParser.prototype.createStackingContexts = function () {
- this.nodes.forEach(function (container) {
- if (isElement(container) && (this.isRootElement(container) || hasOpacity(container) || isPositionedForStacking(container) || this.isBodyWithTransparentRoot(container) || container.hasTransform())) {
- this.newStackingContext(container, true);
- } else if (isElement(container) && (isPositioned(container) && zIndex0(container) || isInlineBlock(container) || isFloating(container))) {
- this.newStackingContext(container, false);
- } else {
- container.assignStack(container.parent.stack);
- }
- }, this);
- };
- NodeParser.prototype.isBodyWithTransparentRoot = function (container) {
- return container.node.nodeName === "BODY" && container.parent.color('backgroundColor').isTransparent();
- };
- NodeParser.prototype.isRootElement = function (container) {
- return container.parent === null;
- };
- NodeParser.prototype.sortStackingContexts = function (stack) {
- stack.contexts.sort(zIndexSort(stack.contexts.slice(0)));
- stack.contexts.forEach(this.sortStackingContexts, this);
- };
- NodeParser.prototype.parseTextBounds = function (container) {
- return function (text, index, textList) {
- if (container.parent.css("textDecoration").substr(0, 4) !== "none" || text.trim().length !== 0) {
- if (this.support.rangeBounds && !container.parent.hasTransform()) {
- var offset = textList.slice(0, index).join("").length;
- return this.getRangeBounds(container.node, offset, text.length);
- } else if (container.node && typeof container.node.data === "string") {
- var replacementNode = container.node.splitText(text.length);
- var bounds = this.getWrapperBounds(container.node, container.parent.hasTransform());
- container.node = replacementNode;
- return bounds;
- }
- } else if (!this.support.rangeBounds || container.parent.hasTransform()) {
- container.node = container.node.splitText(text.length);
- }
- return {};
- };
- };
- NodeParser.prototype.getWrapperBounds = function (node, transform) {
- var wrapper = node.ownerDocument.createElement('html2canvaswrapper');
- var parent = node.parentNode,
- backupText = node.cloneNode(true);
- wrapper.appendChild(node.cloneNode(true));
- parent.replaceChild(wrapper, node);
- var bounds = transform ? offsetBounds(wrapper) : getBounds(wrapper);
- parent.replaceChild(backupText, wrapper);
- return bounds;
- };
- NodeParser.prototype.getRangeBounds = function (node, offset, length) {
- var range = this.range || (this.range = node.ownerDocument.createRange());
- range.setStart(node, offset);
- range.setEnd(node, offset + length);
- return range.getBoundingClientRect();
- };
- function ClearTransform() {}
- NodeParser.prototype.parse = function (stack) {
- // http://www.w3.org/TR/CSS21/visuren.html#z-index
- var negativeZindex = stack.contexts.filter(negativeZIndex); // 2. the child stacking contexts with negative stack levels (most negative first).
- var descendantElements = stack.children.filter(isElement);
- var descendantNonFloats = descendantElements.filter(not(isFloating));
- var nonInlineNonPositionedDescendants = descendantNonFloats.filter(not(isPositioned)).filter(not(inlineLevel)); // 3 the in-flow, non-inline-level, non-positioned descendants.
- var nonPositionedFloats = descendantElements.filter(not(isPositioned)).filter(isFloating); // 4. the non-positioned floats.
- var inFlow = descendantNonFloats.filter(not(isPositioned)).filter(inlineLevel); // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.
- var stackLevel0 = stack.contexts.concat(descendantNonFloats.filter(isPositioned)).filter(zIndex0); // 6. the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.
- var text = stack.children.filter(isTextNode).filter(hasText);
- var positiveZindex = stack.contexts.filter(positiveZIndex); // 7. the child stacking contexts with positive stack levels (least positive first).
- negativeZindex.concat(nonInlineNonPositionedDescendants).concat(nonPositionedFloats).
- concat(inFlow).concat(stackLevel0).concat(text).concat(positiveZindex).forEach(function (container) {
- this.renderQueue.push(container);
- if (isStackingContext(container)) {
- this.parse(container);
- this.renderQueue.push(new ClearTransform());
- }
- }, this);
- };
- NodeParser.prototype.paint = function (container) {
- try {
- if (container instanceof ClearTransform) {
- this.renderer.ctx.restore();
- } else if (isTextNode(container)) {
- if (isPseudoElement(container.parent)) {
- container.parent.appendToDOM();
- }
- this.paintText(container);
- if (isPseudoElement(container.parent)) {
- container.parent.cleanDOM();
- }
- } else {
- this.paintNode(container);
- }
- } catch (e) {
- log(e);
- if (this.options.strict) {
- throw e;
- }
- }
- };
- NodeParser.prototype.paintNode = function (container) {
- if (isStackingContext(container)) {
- this.renderer.setOpacity(container.opacity);
- this.renderer.ctx.save();
- if (container.hasTransform()) {
- this.renderer.setTransform(container.parseTransform());
- }
- }
- if (container.node.nodeName === "INPUT" && container.node.type === "checkbox") {
- this.paintCheckbox(container);
- } else if (container.node.nodeName === "INPUT" && container.node.type === "radio") {
- this.paintRadio(container);
- } else {
- this.paintElement(container);
- }
- };
- NodeParser.prototype.paintElement = function (container) {
- var bounds = container.parseBounds();
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.renderBackground(container, bounds, container.borders.borders.map(getWidth));
- }, this);
- this.renderer.clip(container.clip, function () {
- this.renderer.renderBorders(container.borders.borders);
- }, this);
- this.renderer.clip(container.backgroundClip, function () {
- switch (container.node.nodeName) {
- case "svg":
- case "IFRAME":
- var imgContainer = this.images.get(container.node);
- if (imgContainer) {
- this.renderer.renderImage(container, bounds, container.borders, imgContainer);
- } else {
- log("Error loading <" + container.node.nodeName + ">", container.node);
- }
- break;
- case "IMG":
- var imageContainer = this.images.get(container.node.src);
- if (imageContainer) {
- this.renderer.renderImage(container, bounds, container.borders, imageContainer);
- } else {
- log("Error loading <img>", container.node.src);
- }
- break;
- case "CANVAS":
- this.renderer.renderImage(container, bounds, container.borders, { image: container.node });
- break;
- case "SELECT":
- case "INPUT":
- case "TEXTAREA":
- this.paintFormValue(container);
- break;}
- }, this);
- };
- NodeParser.prototype.paintCheckbox = function (container) {
- var b = container.parseBounds();
- var size = Math.min(b.width, b.height);
- var bounds = { width: size - 1, height: size - 1, top: b.top, left: b.left };
- var r = [3, 3];
- var radius = [r, r, r, r];
- var borders = [1, 1, 1, 1].map(function (w) {
- return { color: new Color('#A5A5A5'), width: w };
- });
- var borderPoints = calculateCurvePoints(bounds, radius, borders);
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.rectangle(bounds.left + 1, bounds.top + 1, bounds.width - 2, bounds.height - 2, new Color("#DEDEDE"));
- this.renderer.renderBorders(calculateBorders(borders, bounds, borderPoints, radius));
- if (container.node.checked) {
- this.renderer.font(new Color('#424242'), 'normal', 'normal', 'bold', size - 3 + "px", 'arial');
- this.renderer.text("\u2714", bounds.left + size / 6, bounds.top + size - 1);
- }
- }, this);
- };
- NodeParser.prototype.paintRadio = function (container) {
- var bounds = container.parseBounds();
- var size = Math.min(bounds.width, bounds.height) - 2;
- this.renderer.clip(container.backgroundClip, function () {
- this.renderer.circleStroke(bounds.left + 1, bounds.top + 1, size, new Color('#DEDEDE'), 1, new Color('#A5A5A5'));
- if (container.node.checked) {
- this.renderer.circle(Math.ceil(bounds.left + size / 4) + 1, Math.ceil(bounds.top + size / 4) + 1, Math.floor(size / 2), new Color('#424242'));
- }
- }, this);
- };
- NodeParser.prototype.paintFormValue = function (container) {
- var value = container.getValue();
- if (value.length > 0) {
- var document = container.node.ownerDocument;
- var wrapper = document.createElement('html2canvaswrapper');
- var properties = ['lineHeight', 'textAlign', 'fontFamily', 'fontWeight', 'fontSize', 'color',
- 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom',
- 'width', 'height', 'borderLeftStyle', 'borderTopStyle', 'borderLeftWidth', 'borderTopWidth',
- 'boxSizing', 'whiteSpace', 'wordWrap'];
- properties.forEach(function (property) {
- try {
- wrapper.style[property] = container.css(property);
- } catch (e) {
- // Older IE has issues with "border"
- log("html2canvas: Parse: Exception caught in renderFormValue: " + e.message);
- }
- });
- var bounds = container.parseBounds();
- wrapper.style.position = "fixed";
- wrapper.style.left = bounds.left + "px";
- wrapper.style.top = bounds.top + "px";
- wrapper.textContent = value;
- document.body.appendChild(wrapper);
- this.paintText(new TextContainer(wrapper.firstChild, container));
- document.body.removeChild(wrapper);
- }
- };
- NodeParser.prototype.paintText = function (container) {
- container.applyTextTransform();
- var characters = punycode.ucs2.decode(container.node.data);
- var textList = (!this.options.letterRendering || noLetterSpacing(container)) && !hasUnicode(container.node.data) ? getWords(characters) : characters.map(function (character) {
- return punycode.ucs2.encode([character]);
- });
- var weight = container.parent.fontWeight();
- var size = container.parent.css('fontSize');
- var family = container.parent.css('fontFamily');
- var shadows = container.parent.parseTextShadows();
- this.renderer.font(container.parent.color('color'), container.parent.css('fontStyle'), container.parent.css('fontVariant'), weight, size, family);
- if (shadows.length) {
- // TODO: support multiple text shadows
- this.renderer.fontShadow(shadows[0].color, shadows[0].offsetX, shadows[0].offsetY, shadows[0].blur);
- } else {
- this.renderer.clearShadow();
- }
- this.renderer.clip(container.parent.clip, function () {
- textList.map(this.parseTextBounds(container), this).forEach(function (bounds, index) {
- if (bounds) {
- this.renderer.text(textList[index], bounds.left, bounds.bottom);
- this.renderTextDecoration(container.parent, bounds, this.fontMetrics.getMetrics(family, size));
- }
- }, this);
- }, this);
- };
- NodeParser.prototype.renderTextDecoration = function (container, bounds, metrics) {
- switch (container.css("textDecoration").split(" ")[0]) {
- case "underline":
- // Draws a line at the baseline of the font
- // TODO As some browsers display the line as more than 1px if the font-size is big, need to take that into account both in position and size
- this.renderer.rectangle(bounds.left, Math.round(bounds.top + metrics.baseline + metrics.lineWidth), bounds.width, 1, container.color("color"));
- break;
- case "overline":
- this.renderer.rectangle(bounds.left, Math.round(bounds.top), bounds.width, 1, container.color("color"));
- break;
- case "line-through":
- // TODO try and find exact position for line-through
- this.renderer.rectangle(bounds.left, Math.ceil(bounds.top + metrics.middle + metrics.lineWidth), bounds.width, 1, container.color("color"));
- break;}
- };
- var borderColorTransforms = {
- inset: [
- ["darken", 0.60],
- ["darken", 0.10],
- ["darken", 0.10],
- ["darken", 0.60]] };
- NodeParser.prototype.parseBorders = function (container) {
- var nodeBounds = container.parseBounds();
- var radius = getBorderRadiusData(container);
- var borders = ["Top", "Right", "Bottom", "Left"].map(function (side, index) {
- var style = container.css('border' + side + 'Style');
- var color = container.color('border' + side + 'Color');
- if (style === "inset" && color.isBlack()) {
- color = new Color([255, 255, 255, color.a]); // this is wrong, but
- }
- var colorTransform = borderColorTransforms[style] ? borderColorTransforms[style][index] : null;
- return {
- width: container.cssInt('border' + side + 'Width'),
- color: colorTransform ? color[colorTransform[0]](colorTransform[1]) : color,
- args: null };
- });
- var borderPoints = calculateCurvePoints(nodeBounds, radius, borders);
- return {
- clip: this.parseBackgroundClip(container, borderPoints, borders, radius, nodeBounds),
- borders: calculateBorders(borders, nodeBounds, borderPoints, radius) };
- };
- function calculateBorders(borders, nodeBounds, borderPoints, radius) {
- return borders.map(function (border, borderSide) {
- if (border.width > 0) {
- var bx = nodeBounds.left;
- var by = nodeBounds.top;
- var bw = nodeBounds.width;
- var bh = nodeBounds.height - borders[2].width;
- switch (borderSide) {
- case 0:
- // top border
- bh = borders[0].width;
- border.args = drawSide({
- c1: [bx, by],
- c2: [bx + bw, by],
- c3: [bx + bw - borders[1].width, by + bh],
- c4: [bx + borders[3].width, by + bh] },
- radius[0], radius[1],
- borderPoints.topLeftOuter, borderPoints.topLeftInner, borderPoints.topRightOuter, borderPoints.topRightInner);
- break;
- case 1:
- // right border
- bx = nodeBounds.left + nodeBounds.width - borders[1].width;
- bw = borders[1].width;
- border.args = drawSide({
- c1: [bx + bw, by],
- c2: [bx + bw, by + bh + borders[2].width],
- c3: [bx, by + bh],
- c4: [bx, by + borders[0].width] },
- radius[1], radius[2],
- borderPoints.topRightOuter, borderPoints.topRightInner, borderPoints.bottomRightOuter, borderPoints.bottomRightInner);
- break;
- case 2:
- // bottom border
- by = by + nodeBounds.height - borders[2].width;
- bh = borders[2].width;
- border.args = drawSide({
- c1: [bx + bw, by + bh],
- c2: [bx, by + bh],
- c3: [bx + borders[3].width, by],
- c4: [bx + bw - borders[3].width, by] },
- radius[2], radius[3],
- borderPoints.bottomRightOuter, borderPoints.bottomRightInner, borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner);
- break;
- case 3:
- // left border
- bw = borders[3].width;
- border.args = drawSide({
- c1: [bx, by + bh + borders[2].width],
- c2: [bx, by],
- c3: [bx + bw, by + borders[0].width],
- c4: [bx + bw, by + bh] },
- radius[3], radius[0],
- borderPoints.bottomLeftOuter, borderPoints.bottomLeftInner, borderPoints.topLeftOuter, borderPoints.topLeftInner);
- break;}
- }
- return border;
- });
- }
- NodeParser.prototype.parseBackgroundClip = function (container, borderPoints, borders, radius, bounds) {
- var backgroundClip = container.css('backgroundClip'),
- borderArgs = [];
- switch (backgroundClip) {
- case "content-box":
- case "padding-box":
- parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftInner, borderPoints.topRightInner, bounds.left + borders[3].width, bounds.top + borders[0].width);
- parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightInner, borderPoints.bottomRightInner, bounds.left + bounds.width - borders[1].width, bounds.top + borders[0].width);
- parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightInner, borderPoints.bottomLeftInner, bounds.left + bounds.width - borders[1].width, bounds.top + bounds.height - borders[2].width);
- parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftInner, borderPoints.topLeftInner, bounds.left + borders[3].width, bounds.top + bounds.height - borders[2].width);
- break;
- default:
- parseCorner(borderArgs, radius[0], radius[1], borderPoints.topLeftOuter, borderPoints.topRightOuter, bounds.left, bounds.top);
- parseCorner(borderArgs, radius[1], radius[2], borderPoints.topRightOuter, borderPoints.bottomRightOuter, bounds.left + bounds.width, bounds.top);
- parseCorner(borderArgs, radius[2], radius[3], borderPoints.bottomRightOuter, borderPoints.bottomLeftOuter, bounds.left + bounds.width, bounds.top + bounds.height);
- parseCorner(borderArgs, radius[3], radius[0], borderPoints.bottomLeftOuter, borderPoints.topLeftOuter, bounds.left, bounds.top + bounds.height);
- break;}
- return borderArgs;
- };
- function getCurvePoints(x, y, r1, r2) {
- var kappa = 4 * ((Math.sqrt(2) - 1) / 3);
- var ox = r1 * kappa, // control point offset horizontal
- oy = r2 * kappa, // control point offset vertical
- xm = x + r1, // x-middle
- ym = y + r2; // y-middle
- return {
- topLeft: bezierCurve({ x: x, y: ym }, { x: x, y: ym - oy }, { x: xm - ox, y: y }, { x: xm, y: y }),
- topRight: bezierCurve({ x: x, y: y }, { x: x + ox, y: y }, { x: xm, y: ym - oy }, { x: xm, y: ym }),
- bottomRight: bezierCurve({ x: xm, y: y }, { x: xm, y: y + oy }, { x: x + ox, y: ym }, { x: x, y: ym }),
- bottomLeft: bezierCurve({ x: xm, y: ym }, { x: xm - ox, y: ym }, { x: x, y: y + oy }, { x: x, y: y }) };
- }
- function calculateCurvePoints(bounds, borderRadius, borders) {
- var x = bounds.left,
- y = bounds.top,
- width = bounds.width,
- height = bounds.height,
- tlh = borderRadius[0][0] < width / 2 ? borderRadius[0][0] : width / 2,
- tlv = borderRadius[0][1] < height / 2 ? borderRadius[0][1] : height / 2,
- trh = borderRadius[1][0] < width / 2 ? borderRadius[1][0] : width / 2,
- trv = borderRadius[1][1] < height / 2 ? borderRadius[1][1] : height / 2,
- brh = borderRadius[2][0] < width / 2 ? borderRadius[2][0] : width / 2,
- brv = borderRadius[2][1] < height / 2 ? borderRadius[2][1] : height / 2,
- blh = borderRadius[3][0] < width / 2 ? borderRadius[3][0] : width / 2,
- blv = borderRadius[3][1] < height / 2 ? borderRadius[3][1] : height / 2;
- var topWidth = width - trh,
- rightHeight = height - brv,
- bottomWidth = width - brh,
- leftHeight = height - blv;
- return {
- topLeftOuter: getCurvePoints(x, y, tlh, tlv).topLeft.subdivide(0.5),
- topLeftInner: getCurvePoints(x + borders[3].width, y + borders[0].width, Math.max(0, tlh - borders[3].width), Math.max(0, tlv - borders[0].width)).topLeft.subdivide(0.5),
- topRightOuter: getCurvePoints(x + topWidth, y, trh, trv).topRight.subdivide(0.5),
- topRightInner: getCurvePoints(x + Math.min(topWidth, width + borders[3].width), y + borders[0].width, topWidth > width + borders[3].width ? 0 : trh - borders[3].width, trv - borders[0].width).topRight.subdivide(0.5),
- bottomRightOuter: getCurvePoints(x + bottomWidth, y + rightHeight, brh, brv).bottomRight.subdivide(0.5),
- bottomRightInner: getCurvePoints(x + Math.min(bottomWidth, width - borders[3].width), y + Math.min(rightHeight, height + borders[0].width), Math.max(0, brh - borders[1].width), brv - borders[2].width).bottomRight.subdivide(0.5),
- bottomLeftOuter: getCurvePoints(x, y + leftHeight, blh, blv).bottomLeft.subdivide(0.5),
- bottomLeftInner: getCurvePoints(x + borders[3].width, y + leftHeight, Math.max(0, blh - borders[3].width), blv - borders[2].width).bottomLeft.subdivide(0.5) };
- }
- function bezierCurve(start, startControl, endControl, end) {
- var lerp = function lerp(a, b, t) {
- return {
- x: a.x + (b.x - a.x) * t,
- y: a.y + (b.y - a.y) * t };
- };
- return {
- start: start,
- startControl: startControl,
- endControl: endControl,
- end: end,
- subdivide: function subdivide(t) {
- var ab = lerp(start, startControl, t),
- bc = lerp(startControl, endControl, t),
- cd = lerp(endControl, end, t),
- abbc = lerp(ab, bc, t),
- bccd = lerp(bc, cd, t),
- dest = lerp(abbc, bccd, t);
- return [bezierCurve(start, ab, abbc, dest), bezierCurve(dest, bccd, cd, end)];
- },
- curveTo: function curveTo(borderArgs) {
- borderArgs.push(["bezierCurve", startControl.x, startControl.y, endControl.x, endControl.y, end.x, end.y]);
- },
- curveToReversed: function curveToReversed(borderArgs) {
- borderArgs.push(["bezierCurve", endControl.x, endControl.y, startControl.x, startControl.y, start.x, start.y]);
- } };
- }
- function drawSide(borderData, radius1, radius2, outer1, inner1, outer2, inner2) {
- var borderArgs = [];
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", outer1[1].start.x, outer1[1].start.y]);
- outer1[1].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c1[0], borderData.c1[1]]);
- }
- if (radius2[0] > 0 || radius2[1] > 0) {
- borderArgs.push(["line", outer2[0].start.x, outer2[0].start.y]);
- outer2[0].curveTo(borderArgs);
- borderArgs.push(["line", inner2[0].end.x, inner2[0].end.y]);
- inner2[0].curveToReversed(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c2[0], borderData.c2[1]]);
- borderArgs.push(["line", borderData.c3[0], borderData.c3[1]]);
- }
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", inner1[1].end.x, inner1[1].end.y]);
- inner1[1].curveToReversed(borderArgs);
- } else {
- borderArgs.push(["line", borderData.c4[0], borderData.c4[1]]);
- }
- return borderArgs;
- }
- function parseCorner(borderArgs, radius1, radius2, corner1, corner2, x, y) {
- if (radius1[0] > 0 || radius1[1] > 0) {
- borderArgs.push(["line", corner1[0].start.x, corner1[0].start.y]);
- corner1[0].curveTo(borderArgs);
- corner1[1].curveTo(borderArgs);
- } else {
- borderArgs.push(["line", x, y]);
- }
- if (radius2[0] > 0 || radius2[1] > 0) {
- borderArgs.push(["line", corner2[0].start.x, corner2[0].start.y]);
- }
- }
- function negativeZIndex(container) {
- return container.cssInt("zIndex") < 0;
- }
- function positiveZIndex(container) {
- return container.cssInt("zIndex") > 0;
- }
- function zIndex0(container) {
- return container.cssInt("zIndex") === 0;
- }
- function inlineLevel(container) {
- return ["inline", "inline-block", "inline-table"].indexOf(container.css("display")) !== -1;
- }
- function isStackingContext(container) {
- return container instanceof StackingContext;
- }
- function hasText(container) {
- return container.node.data.trim().length > 0;
- }
- function noLetterSpacing(container) {
- return /^(normal|none|0px)$/.test(container.parent.css("letterSpacing"));
- }
- function getBorderRadiusData(container) {
- return ["TopLeft", "TopRight", "BottomRight", "BottomLeft"].map(function (side) {
- var value = container.css('border' + side + 'Radius');
- var arr = value.split(" ");
- if (arr.length <= 1) {
- arr[1] = arr[0];
- }
- return arr.map(asInt);
- });
- }
- function renderableNode(node) {
- return node.nodeType === Node.TEXT_NODE || node.nodeType === Node.ELEMENT_NODE;
- }
- function isPositionedForStacking(container) {
- var position = container.css("position");
- var zIndex = ["absolute", "relative", "fixed"].indexOf(position) !== -1 ? container.css("zIndex") : "auto";
- return zIndex !== "auto";
- }
- function isPositioned(container) {
- return container.css("position") !== "static";
- }
- function isFloating(container) {
- return container.css("float") !== "none";
- }
- function isInlineBlock(container) {
- return ["inline-block", "inline-table"].indexOf(container.css("display")) !== -1;
- }
- function not(callback) {
- var context = this;
- return function () {
- return !callback.apply(context, arguments);
- };
- }
- function isElement(container) {
- return container.node.nodeType === Node.ELEMENT_NODE;
- }
- function isPseudoElement(container) {
- return container.isPseudoElement === true;
- }
- function isTextNode(container) {
- return container.node.nodeType === Node.TEXT_NODE;
- }
- function zIndexSort(contexts) {
- return function (a, b) {
- return a.cssInt("zIndex") + contexts.indexOf(a) / contexts.length - (b.cssInt("zIndex") + contexts.indexOf(b) / contexts.length);
- };
- }
- function hasOpacity(container) {
- return container.getOpacity() < 1;
- }
- function asInt(value) {
- return parseInt(value, 10);
- }
- function getWidth(border) {
- return border.width;
- }
- function nonIgnoredElement(nodeContainer) {
- return nodeContainer.node.nodeType !== Node.ELEMENT_NODE || ["SCRIPT", "HEAD", "TITLE", "OBJECT", "BR", "OPTION"].indexOf(nodeContainer.node.nodeName) === -1;
- }
- function flatten(arrays) {
- return [].concat.apply([], arrays);
- }
- function stripQuotes(content) {
- var first = content.substr(0, 1);
- return first === content.substr(content.length - 1) && first.match(/'|"/) ? content.substr(1, content.length - 2) : content;
- }
- function getWords(characters) {
- var words = [],i = 0,onWordBoundary = false,word;
- while (characters.length) {
- if (isWordBoundary(characters[i]) === onWordBoundary) {
- word = characters.splice(0, i);
- if (word.length) {
- words.push(punycode.ucs2.encode(word));
- }
- onWordBoundary = !onWordBoundary;
- i = 0;
- } else {
- i++;
- }
- if (i >= characters.length) {
- word = characters.splice(0, i);
- if (word.length) {
- words.push(punycode.ucs2.encode(word));
- }
- }
- }
- return words;
- }
- function isWordBoundary(characterCode) {
- return [
- 32, // <space>
- 13, // \r
- 10, // \n
- 9, // \t
- 45 // -
- ].indexOf(characterCode) !== -1;
- }
- function hasUnicode(string) {
- return /[^\u0000-\u00ff]/.test(string);
- }
- module.exports = NodeParser;
- }, { "./color": 3, "./fontmetrics": 7, "./log": 13, "./nodecontainer": 14, "./pseudoelementcontainer": 18, "./stackingcontext": 21, "./textcontainer": 25, "./utils": 26, "punycode": 1 }], 16: [function (_dereq_, module, exports) {
- var XHR = _dereq_('./xhr');
- var utils = _dereq_('./utils');
- var log = _dereq_('./log');
- var createWindowClone = _dereq_('./clone');
- var decode64 = utils.decode64;
- function Proxy(src, proxyUrl, document) {
- var supportsCORS = ('withCredentials' in new XMLHttpRequest());
- if (!proxyUrl) {
- return Promise.reject("No proxy configured");
- }
- var callback = createCallback(supportsCORS);
- var url = createProxyUrl(proxyUrl, src, callback);
- return supportsCORS ? XHR(url) : jsonp(document, url, callback).then(function (response) {
- return decode64(response.content);
- });
- }
- var proxyCount = 0;
- function ProxyURL(src, proxyUrl, document) {
- var supportsCORSImage = ('crossOrigin' in new Image());
- var callback = createCallback(supportsCORSImage);
- var url = createProxyUrl(proxyUrl, src, callback);
- return supportsCORSImage ? Promise.resolve(url) : jsonp(document, url, callback).then(function (response) {
- return "data:" + response.type + ";base64," + response.content;
- });
- }
- function jsonp(document, url, callback) {
- return new Promise(function (resolve, reject) {
- var s = document.createElement("script");
- var cleanup = function cleanup() {
- delete window.html2canvas.proxy[callback];
- document.body.removeChild(s);
- };
- window.html2canvas.proxy[callback] = function (response) {
- cleanup();
- resolve(response);
- };
- s.src = url;
- s.onerror = function (e) {
- cleanup();
- reject(e);
- };
- document.body.appendChild(s);
- });
- }
- function createCallback(useCORS) {
- return !useCORS ? "html2canvas_" + Date.now() + "_" + ++proxyCount + "_" + Math.round(Math.random() * 100000) : "";
- }
- function createProxyUrl(proxyUrl, src, callback) {
- return proxyUrl + "?url=" + encodeURIComponent(src) + (callback.length ? "&callback=html2canvas.proxy." + callback : "");
- }
- function documentFromHTML(src) {
- return function (html) {
- var parser = new DOMParser(),doc;
- try {
- doc = parser.parseFromString(html, "text/html");
- } catch (e) {
- log("DOMParser not supported, falling back to createHTMLDocument");
- doc = document.implementation.createHTMLDocument("");
- try {
- doc.open();
- doc.write(html);
- doc.close();
- } catch (ee) {
- log("createHTMLDocument write not supported, falling back to document.body.innerHTML");
- doc.body.innerHTML = html; // ie9 doesnt support writing to documentElement
- }
- }
- var b = doc.querySelector("base");
- if (!b || !b.href.host) {
- var base = doc.createElement("base");
- base.href = src;
- doc.head.insertBefore(base, doc.head.firstChild);
- }
- return doc;
- };
- }
- function loadUrlDocument(src, proxy, document, width, height, options) {
- return new Proxy(src, proxy, window.document).then(documentFromHTML(src)).then(function (doc) {
- return createWindowClone(doc, document, width, height, options, 0, 0);
- });
- }
- exports.Proxy = Proxy;
- exports.ProxyURL = ProxyURL;
- exports.loadUrlDocument = loadUrlDocument;
- }, { "./clone": 2, "./log": 13, "./utils": 26, "./xhr": 28 }], 17: [function (_dereq_, module, exports) {
- var ProxyURL = _dereq_('./proxy').ProxyURL;
- function ProxyImageContainer(src, proxy) {
- var link = document.createElement("a");
- link.href = src;
- src = link.href;
- this.src = src;
- this.image = new Image();
- var self = this;
- this.promise = new Promise(function (resolve, reject) {
- self.image.crossOrigin = "Anonymous";
- self.image.onload = resolve;
- self.image.onerror = reject;
- new ProxyURL(src, proxy, document).then(function (url) {
- self.image.src = url;
- })['catch'](reject);
- });
- }
- module.exports = ProxyImageContainer;
- }, { "./proxy": 16 }], 18: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function PseudoElementContainer(node, parent, type) {
- NodeContainer.call(this, node, parent);
- this.isPseudoElement = true;
- this.before = type === ":before";
- }
- PseudoElementContainer.prototype.cloneTo = function (stack) {
- PseudoElementContainer.prototype.cloneTo.call(this, stack);
- stack.isPseudoElement = true;
- stack.before = this.before;
- };
- PseudoElementContainer.prototype = Object.create(NodeContainer.prototype);
- PseudoElementContainer.prototype.appendToDOM = function () {
- if (this.before) {
- this.parent.node.insertBefore(this.node, this.parent.node.firstChild);
- } else {
- this.parent.node.appendChild(this.node);
- }
- this.parent.node.className += " " + this.getHideClass();
- };
- PseudoElementContainer.prototype.cleanDOM = function () {
- this.node.parentNode.removeChild(this.node);
- this.parent.node.className = this.parent.node.className.replace(this.getHideClass(), "");
- };
- PseudoElementContainer.prototype.getHideClass = function () {
- return this["PSEUDO_HIDE_ELEMENT_CLASS_" + (this.before ? "BEFORE" : "AFTER")];
- };
- PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = "___html2canvas___pseudoelement_before";
- PseudoElementContainer.prototype.PSEUDO_HIDE_ELEMENT_CLASS_AFTER = "___html2canvas___pseudoelement_after";
- module.exports = PseudoElementContainer;
- }, { "./nodecontainer": 14 }], 19: [function (_dereq_, module, exports) {
- var log = _dereq_('./log');
- function Renderer(width, height, images, options, document) {
- this.width = width;
- this.height = height;
- this.images = images;
- this.options = options;
- this.document = document;
- }
- Renderer.prototype.renderImage = function (container, bounds, borderData, imageContainer) {
- var paddingLeft = container.cssInt('paddingLeft'),
- paddingTop = container.cssInt('paddingTop'),
- paddingRight = container.cssInt('paddingRight'),
- paddingBottom = container.cssInt('paddingBottom'),
- borders = borderData.borders;
- var width = bounds.width - (borders[1].width + borders[3].width + paddingLeft + paddingRight);
- var height = bounds.height - (borders[0].width + borders[2].width + paddingTop + paddingBottom);
- this.drawImage(
- imageContainer,
- 0,
- 0,
- imageContainer.image.width || width,
- imageContainer.image.height || height,
- bounds.left + paddingLeft + borders[3].width,
- bounds.top + paddingTop + borders[0].width,
- width,
- height);
- };
- Renderer.prototype.renderBackground = function (container, bounds, borderData) {
- if (bounds.height > 0 && bounds.width > 0) {
- this.renderBackgroundColor(container, bounds);
- this.renderBackgroundImage(container, bounds, borderData);
- }
- };
- Renderer.prototype.renderBackgroundColor = function (container, bounds) {
- var color = container.color("backgroundColor");
- if (!color.isTransparent()) {
- this.rectangle(bounds.left, bounds.top, bounds.width, bounds.height, color);
- }
- };
- Renderer.prototype.renderBorders = function (borders) {
- borders.forEach(this.renderBorder, this);
- };
- Renderer.prototype.renderBorder = function (data) {
- if (!data.color.isTransparent() && data.args !== null) {
- this.drawShape(data.args, data.color);
- }
- };
- Renderer.prototype.renderBackgroundImage = function (container, bounds, borderData) {
- var backgroundImages = container.parseBackgroundImages();
- backgroundImages.reverse().forEach(function (backgroundImage, index, arr) {
- switch (backgroundImage.method) {
- case "url":
- var image = this.images.get(backgroundImage.args[0]);
- if (image) {
- this.renderBackgroundRepeating(container, bounds, image, arr.length - (index + 1), borderData);
- } else {
- log("Error loading background-image", backgroundImage.args[0]);
- }
- break;
- case "linear-gradient":
- case "gradient":
- var gradientImage = this.images.get(backgroundImage.value);
- if (gradientImage) {
- this.renderBackgroundGradient(gradientImage, bounds, borderData);
- } else {
- log("Error loading background-image", backgroundImage.args[0]);
- }
- break;
- case "none":
- break;
- default:
- log("Unknown background-image type", backgroundImage.args[0]);}
- }, this);
- };
- Renderer.prototype.renderBackgroundRepeating = function (container, bounds, imageContainer, index, borderData) {
- var size = container.parseBackgroundSize(bounds, imageContainer.image, index);
- var position = container.parseBackgroundPosition(bounds, imageContainer.image, index, size);
- var repeat = container.parseBackgroundRepeat(index);
- switch (repeat) {
- case "repeat-x":
- case "repeat no-repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + borderData[3], bounds.top + position.top + borderData[0], 99999, size.height, borderData);
- break;
- case "repeat-y":
- case "no-repeat repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + position.left + borderData[3], bounds.top + borderData[0], size.width, 99999, borderData);
- break;
- case "no-repeat":
- this.backgroundRepeatShape(imageContainer, position, size, bounds, bounds.left + position.left + borderData[3], bounds.top + position.top + borderData[0], size.width, size.height, borderData);
- break;
- default:
- this.renderBackgroundRepeat(imageContainer, position, size, { top: bounds.top, left: bounds.left }, borderData[3], borderData[0]);
- break;}
- };
- module.exports = Renderer;
- }, { "./log": 13 }], 20: [function (_dereq_, module, exports) {
- var Renderer = _dereq_('../renderer');
- var LinearGradientContainer = _dereq_('../lineargradientcontainer');
- var log = _dereq_('../log');
- function CanvasRenderer(width, height) {
- Renderer.apply(this, arguments);
- this.canvas = this.options.canvas || this.document.createElement("canvas");
- if (!this.options.canvas) {
- this.canvas.width = width;
- this.canvas.height = height;
- }
- this.ctx = this.canvas.getContext("2d");
- this.taintCtx = this.document.createElement("canvas").getContext("2d");
- this.ctx.textBaseline = "bottom";
- this.variables = {};
- log("Initialized CanvasRenderer with size", width, "x", height);
- }
- CanvasRenderer.prototype = Object.create(Renderer.prototype);
- CanvasRenderer.prototype.setFillStyle = function (fillStyle) {
- this.ctx.fillStyle = typeof fillStyle === "object" && !!fillStyle.isColor ? fillStyle.toString() : fillStyle;
- return this.ctx;
- };
- CanvasRenderer.prototype.rectangle = function (left, top, width, height, color) {
- this.setFillStyle(color).fillRect(left, top, width, height);
- };
- CanvasRenderer.prototype.circle = function (left, top, size, color) {
- this.setFillStyle(color);
- this.ctx.beginPath();
- this.ctx.arc(left + size / 2, top + size / 2, size / 2, 0, Math.PI * 2, true);
- this.ctx.closePath();
- this.ctx.fill();
- };
- CanvasRenderer.prototype.circleStroke = function (left, top, size, color, stroke, strokeColor) {
- this.circle(left, top, size, color);
- this.ctx.strokeStyle = strokeColor.toString();
- this.ctx.stroke();
- };
- CanvasRenderer.prototype.drawShape = function (shape, color) {
- this.shape(shape);
- this.setFillStyle(color).fill();
- };
- CanvasRenderer.prototype.taints = function (imageContainer) {
- if (imageContainer.tainted === null) {
- this.taintCtx.drawImage(imageContainer.image, 0, 0);
- try {
- this.taintCtx.getImageData(0, 0, 1, 1);
- imageContainer.tainted = false;
- } catch (e) {
- this.taintCtx = document.createElement("canvas").getContext("2d");
- imageContainer.tainted = true;
- }
- }
- return imageContainer.tainted;
- };
- CanvasRenderer.prototype.drawImage = function (imageContainer, sx, sy, sw, sh, dx, dy, dw, dh) {
- if (!this.taints(imageContainer) || this.options.allowTaint) {
- this.ctx.drawImage(imageContainer.image, sx, sy, sw, sh, dx, dy, dw, dh);
- }
- };
- CanvasRenderer.prototype.clip = function (shapes, callback, context) {
- this.ctx.save();
- shapes.filter(hasEntries).forEach(function (shape) {
- this.shape(shape).clip();
- }, this);
- callback.call(context);
- this.ctx.restore();
- };
- CanvasRenderer.prototype.shape = function (shape) {
- this.ctx.beginPath();
- shape.forEach(function (point, index) {
- if (point[0] === "rect") {
- this.ctx.rect.apply(this.ctx, point.slice(1));
- } else {
- this.ctx[index === 0 ? "moveTo" : point[0] + "To"].apply(this.ctx, point.slice(1));
- }
- }, this);
- this.ctx.closePath();
- return this.ctx;
- };
- CanvasRenderer.prototype.font = function (color, style, variant, weight, size, family) {
- this.setFillStyle(color).font = [style, variant, weight, size, family].join(" ").split(",")[0];
- };
- CanvasRenderer.prototype.fontShadow = function (color, offsetX, offsetY, blur) {
- this.setVariable("shadowColor", color.toString()).
- setVariable("shadowOffsetY", offsetX).
- setVariable("shadowOffsetX", offsetY).
- setVariable("shadowBlur", blur);
- };
- CanvasRenderer.prototype.clearShadow = function () {
- this.setVariable("shadowColor", "rgba(0,0,0,0)");
- };
- CanvasRenderer.prototype.setOpacity = function (opacity) {
- this.ctx.globalAlpha = opacity;
- };
- CanvasRenderer.prototype.setTransform = function (transform) {
- this.ctx.translate(transform.origin[0], transform.origin[1]);
- this.ctx.transform.apply(this.ctx, transform.matrix);
- this.ctx.translate(-transform.origin[0], -transform.origin[1]);
- };
- CanvasRenderer.prototype.setVariable = function (property, value) {
- if (this.variables[property] !== value) {
- this.variables[property] = this.ctx[property] = value;
- }
- return this;
- };
- CanvasRenderer.prototype.text = function (text, left, bottom) {
- this.ctx.fillText(text, left, bottom);
- };
- CanvasRenderer.prototype.backgroundRepeatShape = function (imageContainer, backgroundPosition, size, bounds, left, top, width, height, borderData) {
- var shape = [
- ["line", Math.round(left), Math.round(top)],
- ["line", Math.round(left + width), Math.round(top)],
- ["line", Math.round(left + width), Math.round(height + top)],
- ["line", Math.round(left), Math.round(height + top)]];
- this.clip([shape], function () {
- this.renderBackgroundRepeat(imageContainer, backgroundPosition, size, bounds, borderData[3], borderData[0]);
- }, this);
- };
- CanvasRenderer.prototype.renderBackgroundRepeat = function (imageContainer, backgroundPosition, size, bounds, borderLeft, borderTop) {
- var offsetX = Math.round(bounds.left + backgroundPosition.left + borderLeft),offsetY = Math.round(bounds.top + backgroundPosition.top + borderTop);
- this.setFillStyle(this.ctx.createPattern(this.resizeImage(imageContainer, size), "repeat"));
- this.ctx.translate(offsetX, offsetY);
- this.ctx.fill();
- this.ctx.translate(-offsetX, -offsetY);
- };
- CanvasRenderer.prototype.renderBackgroundGradient = function (gradientImage, bounds) {
- if (gradientImage instanceof LinearGradientContainer) {
- var gradient = this.ctx.createLinearGradient(
- bounds.left + bounds.width * gradientImage.x0,
- bounds.top + bounds.height * gradientImage.y0,
- bounds.left + bounds.width * gradientImage.x1,
- bounds.top + bounds.height * gradientImage.y1);
- gradientImage.colorStops.forEach(function (colorStop) {
- gradient.addColorStop(colorStop.stop, colorStop.color.toString());
- });
- this.rectangle(bounds.left, bounds.top, bounds.width, bounds.height, gradient);
- }
- };
- CanvasRenderer.prototype.resizeImage = function (imageContainer, size) {
- var image = imageContainer.image;
- if (image.width === size.width && image.height === size.height) {
- return image;
- }
- var ctx,canvas = document.createElement('canvas');
- canvas.width = size.width;
- canvas.height = size.height;
- ctx = canvas.getContext("2d");
- ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height);
- return canvas;
- };
- function hasEntries(array) {
- return array.length > 0;
- }
- module.exports = CanvasRenderer;
- }, { "../lineargradientcontainer": 12, "../log": 13, "../renderer": 19 }], 21: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function StackingContext(hasOwnStacking, opacity, element, parent) {
- NodeContainer.call(this, element, parent);
- this.ownStacking = hasOwnStacking;
- this.contexts = [];
- this.children = [];
- this.opacity = (this.parent ? this.parent.stack.opacity : 1) * opacity;
- }
- StackingContext.prototype = Object.create(NodeContainer.prototype);
- StackingContext.prototype.getParentStack = function (context) {
- var parentStack = this.parent ? this.parent.stack : null;
- return parentStack ? parentStack.ownStacking ? parentStack : parentStack.getParentStack(context) : context.stack;
- };
- module.exports = StackingContext;
- }, { "./nodecontainer": 14 }], 22: [function (_dereq_, module, exports) {
- function Support(document) {
- this.rangeBounds = this.testRangeBounds(document);
- this.cors = this.testCORS();
- this.svg = this.testSVG();
- }
- Support.prototype.testRangeBounds = function (document) {
- var range,testElement,rangeBounds,rangeHeight,support = false;
- if (document.createRange) {
- range = document.createRange();
- if (range.getBoundingClientRect) {
- testElement = document.createElement('boundtest');
- testElement.style.height = "123px";
- testElement.style.display = "block";
- document.body.appendChild(testElement);
- range.selectNode(testElement);
- rangeBounds = range.getBoundingClientRect();
- rangeHeight = rangeBounds.height;
- if (rangeHeight === 123) {
- support = true;
- }
- document.body.removeChild(testElement);
- }
- }
- return support;
- };
- Support.prototype.testCORS = function () {
- return typeof new Image().crossOrigin !== "undefined";
- };
- Support.prototype.testSVG = function () {
- var img = new Image();
- var canvas = document.createElement("canvas");
- var ctx = canvas.getContext("2d");
- img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
- try {
- ctx.drawImage(img, 0, 0);
- canvas.toDataURL();
- } catch (e) {
- return false;
- }
- return true;
- };
- module.exports = Support;
- }, {}], 23: [function (_dereq_, module, exports) {
- var XHR = _dereq_('./xhr');
- var decode64 = _dereq_('./utils').decode64;
- function SVGContainer(src) {
- this.src = src;
- this.image = null;
- var self = this;
- this.promise = this.hasFabric().then(function () {
- return self.isInline(src) ? Promise.resolve(self.inlineFormatting(src)) : XHR(src);
- }).then(function (svg) {
- return new Promise(function (resolve) {
- window.html2canvas.svg.fabric.loadSVGFromString(svg, self.createCanvas.call(self, resolve));
- });
- });
- }
- SVGContainer.prototype.hasFabric = function () {
- return !window.html2canvas.svg || !window.html2canvas.svg.fabric ? Promise.reject(new Error("html2canvas.svg.js is not loaded, cannot render svg")) : Promise.resolve();
- };
- SVGContainer.prototype.inlineFormatting = function (src) {
- return /^data:image\/svg\+xml;base64,/.test(src) ? this.decode64(this.removeContentType(src)) : this.removeContentType(src);
- };
- SVGContainer.prototype.removeContentType = function (src) {
- return src.replace(/^data:image\/svg\+xml(;base64)?,/, '');
- };
- SVGContainer.prototype.isInline = function (src) {
- return /^data:image\/svg\+xml/i.test(src);
- };
- SVGContainer.prototype.createCanvas = function (resolve) {
- var self = this;
- return function (objects, options) {
- var canvas = new window.html2canvas.svg.fabric.StaticCanvas('c');
- self.image = canvas.lowerCanvasEl;
- canvas.
- setWidth(options.width).
- setHeight(options.height).
- add(window.html2canvas.svg.fabric.util.groupSVGElements(objects, options)).
- renderAll();
- resolve(canvas.lowerCanvasEl);
- };
- };
- SVGContainer.prototype.decode64 = function (str) {
- return typeof window.atob === "function" ? window.atob(str) : decode64(str);
- };
- module.exports = SVGContainer;
- }, { "./utils": 26, "./xhr": 28 }], 24: [function (_dereq_, module, exports) {
- var SVGContainer = _dereq_('./svgcontainer');
- function SVGNodeContainer(node, _native) {
- this.src = node;
- this.image = null;
- var self = this;
- this.promise = _native ? new Promise(function (resolve, reject) {
- self.image = new Image();
- self.image.onload = resolve;
- self.image.onerror = reject;
- self.image.src = "data:image/svg+xml," + new XMLSerializer().serializeToString(node);
- if (self.image.complete === true) {
- resolve(self.image);
- }
- }) : this.hasFabric().then(function () {
- return new Promise(function (resolve) {
- window.html2canvas.svg.fabric.parseSVGDocument(node, self.createCanvas.call(self, resolve));
- });
- });
- }
- SVGNodeContainer.prototype = Object.create(SVGContainer.prototype);
- module.exports = SVGNodeContainer;
- }, { "./svgcontainer": 23 }], 25: [function (_dereq_, module, exports) {
- var NodeContainer = _dereq_('./nodecontainer');
- function TextContainer(node, parent) {
- NodeContainer.call(this, node, parent);
- }
- TextContainer.prototype = Object.create(NodeContainer.prototype);
- TextContainer.prototype.applyTextTransform = function () {
- this.node.data = this.transform(this.parent.css("textTransform"));
- };
- TextContainer.prototype.transform = function (transform) {
- var text = this.node.data;
- switch (transform) {
- case "lowercase":
- return text.toLowerCase();
- case "capitalize":
- return text.replace(/(^|\s|:|-|\(|\))([a-z])/g, capitalize);
- case "uppercase":
- return text.toUpperCase();
- default:
- return text;}
- };
- function capitalize(m, p1, p2) {
- if (m.length > 0) {
- return p1 + p2.toUpperCase();
- }
- }
- module.exports = TextContainer;
- }, { "./nodecontainer": 14 }], 26: [function (_dereq_, module, exports) {
- exports.smallImage = function smallImage() {
- return "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
- };
- exports.bind = function (callback, context) {
- return function () {
- return callback.apply(context, arguments);
- };
- };
- /*
- * base64-arraybuffer
- * https://github.com/niklasvh/base64-arraybuffer
- *
- * Copyright (c) 2012 Niklas von Hertzen
- * Licensed under the MIT license.
- */
- exports.decode64 = function (base64) {
- var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- var len = base64.length,i,encoded1,encoded2,encoded3,encoded4,byte1,byte2,byte3;
- var output = "";
- for (i = 0; i < len; i += 4) {
- encoded1 = chars.indexOf(base64[i]);
- encoded2 = chars.indexOf(base64[i + 1]);
- encoded3 = chars.indexOf(base64[i + 2]);
- encoded4 = chars.indexOf(base64[i + 3]);
- byte1 = encoded1 << 2 | encoded2 >> 4;
- byte2 = (encoded2 & 15) << 4 | encoded3 >> 2;
- byte3 = (encoded3 & 3) << 6 | encoded4;
- if (encoded3 === 64) {
- output += String.fromCharCode(byte1);
- } else if (encoded4 === 64 || encoded4 === -1) {
- output += String.fromCharCode(byte1, byte2);
- } else {
- output += String.fromCharCode(byte1, byte2, byte3);
- }
- }
- return output;
- };
- exports.getBounds = function (node) {
- if (node.getBoundingClientRect) {
- var clientRect = node.getBoundingClientRect();
- var width = node.offsetWidth == null ? clientRect.width : node.offsetWidth;
- return {
- top: clientRect.top,
- bottom: clientRect.bottom || clientRect.top + clientRect.height,
- right: clientRect.left + width,
- left: clientRect.left,
- width: width,
- height: node.offsetHeight == null ? clientRect.height : node.offsetHeight };
- }
- return {};
- };
- exports.offsetBounds = function (node) {
- var parent = node.offsetParent ? exports.offsetBounds(node.offsetParent) : { top: 0, left: 0 };
- return {
- top: node.offsetTop + parent.top,
- bottom: node.offsetTop + node.offsetHeight + parent.top,
- right: node.offsetLeft + parent.left + node.offsetWidth,
- left: node.offsetLeft + parent.left,
- width: node.offsetWidth,
- height: node.offsetHeight };
- };
- exports.parseBackgrounds = function (backgroundImage) {
- var whitespace = ' \r\n\t',
- method,definition,prefix,prefix_i,block,results = [],
- mode = 0,numParen = 0,quote,args;
- var appendResult = function appendResult() {
- if (method) {
- if (definition.substr(0, 1) === '"') {
- definition = definition.substr(1, definition.length - 2);
- }
- if (definition) {
- args.push(definition);
- }
- if (method.substr(0, 1) === '-' && (prefix_i = method.indexOf('-', 1) + 1) > 0) {
- prefix = method.substr(0, prefix_i);
- method = method.substr(prefix_i);
- }
- results.push({
- prefix: prefix,
- method: method.toLowerCase(),
- value: block,
- args: args,
- image: null });
- }
- args = [];
- method = prefix = definition = block = '';
- };
- args = [];
- method = prefix = definition = block = '';
- backgroundImage.split("").forEach(function (c) {
- if (mode === 0 && whitespace.indexOf(c) > -1) {
- return;
- }
- switch (c) {
- case '"':
- if (!quote) {
- quote = c;
- } else if (quote === c) {
- quote = null;
- }
- break;
- case '(':
- if (quote) {
- break;
- } else if (mode === 0) {
- mode = 1;
- block += c;
- return;
- } else {
- numParen++;
- }
- break;
- case ')':
- if (quote) {
- break;
- } else if (mode === 1) {
- if (numParen === 0) {
- mode = 0;
- block += c;
- appendResult();
- return;
- } else {
- numParen--;
- }
- }
- break;
- case ',':
- if (quote) {
- break;
- } else if (mode === 0) {
- appendResult();
- return;
- } else if (mode === 1) {
- if (numParen === 0 && !method.match(/^url$/i)) {
- args.push(definition);
- definition = '';
- block += c;
- return;
- }
- }
- break;}
- block += c;
- if (mode === 0) {
- method += c;
- } else {
- definition += c;
- }
- });
- appendResult();
- return results;
- };
- }, {}], 27: [function (_dereq_, module, exports) {
- var GradientContainer = _dereq_('./gradientcontainer');
- function WebkitGradientContainer(imageData) {
- GradientContainer.apply(this, arguments);
- this.type = imageData.args[0] === "linear" ? GradientContainer.TYPES.LINEAR : GradientContainer.TYPES.RADIAL;
- }
- WebkitGradientContainer.prototype = Object.create(GradientContainer.prototype);
- module.exports = WebkitGradientContainer;
- }, { "./gradientcontainer": 9 }], 28: [function (_dereq_, module, exports) {
- function XHR(url) {
- return new Promise(function (resolve, reject) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url);
- xhr.onload = function () {
- if (xhr.status === 200) {
- resolve(xhr.responseText);
- } else {
- reject(new Error(xhr.statusText));
- }
- };
- xhr.onerror = function () {
- reject(new Error("Network Error"));
- };
- xhr.send();
- });
- }
- module.exports = XHR;
- }, {}] }, {}, [4])(4);
- });
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../../../../Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/node_modules/webpack/buildin/global.js */ 3)))
- /***/ }),
- /***/ 62:
- /*!**************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/static/html2canvas.js ***!
- \**************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- /*!
- * html2canvas 1.0.0-rc.7 <https://html2canvas.hertzen.com>
- * Copyright (c) 2020 Niklas von Hertzen <https://hertzen.com>
- * Released under MIT License
- */
- (function (global, factory) {
- true ? module.exports = factory() :
- undefined;
- })(this, function () {'use strict';
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
- this file except in compliance with the License. You may obtain a copy of the
- License at http://www.apache.org/licenses/LICENSE-2.0
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
- MERCHANTABLITY OR NON-INFRINGEMENT.
- See the Apache Version 2.0 License for specific language governing permissions
- and limitations under the License.
- ***************************************************************************** */
- /* global Reflect, Promise */
- var _extendStatics = function extendStatics(d, b) {
- _extendStatics = Object.setPrototypeOf ||
- { __proto__: [] } instanceof Array && function (d, b) {d.__proto__ = b;} ||
- function (d, b) {for (var p in b) {if (b.hasOwnProperty(p)) d[p] = b[p];}};
- return _extendStatics(d, b);
- };
- function __extends(d, b) {
- _extendStatics(d, b);
- function __() {this.constructor = d;}
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
- var _assign = function __assign() {
- _assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) {if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];}
- }
- return t;
- };
- return _assign.apply(this, arguments);
- };
- function __awaiter(thisArg, _arguments, P, generator) {
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) {try {step(generator.next(value));} catch (e) {reject(e);}}
- function rejected(value) {try {step(generator["throw"](value));} catch (e) {reject(e);}}
- function step(result) {result.done ? resolve(result.value) : new P(function (resolve) {resolve(result.value);}).then(fulfilled, rejected);}
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- }
- function __generator(thisArg, body) {
- var _ = { label: 0, sent: function sent() {if (t[0] & 1) throw t[1];return t[1];}, trys: [], ops: [] },f,y,t,g;
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {return this;}), g;
- function verb(n) {return function (v) {return step([n, v]);};}
- function step(op) {
- if (f) throw new TypeError("Generator is already executing.");
- while (_) {try {
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
- if (y = 0, t) op = [op[0] & 2, t.value];
- switch (op[0]) {
- case 0:case 1:t = op;break;
- case 4:_.label++;return { value: op[1], done: false };
- case 5:_.label++;y = op[1];op = [0];continue;
- case 7:op = _.ops.pop();_.trys.pop();continue;
- default:
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {_ = 0;continue;}
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {_.label = op[1];break;}
- if (op[0] === 6 && _.label < t[1]) {_.label = t[1];t = op;break;}
- if (t && _.label < t[2]) {_.label = t[2];_.ops.push(op);break;}
- if (t[2]) _.ops.pop();
- _.trys.pop();continue;}
- op = body.call(thisArg, _);
- } catch (e) {op = [6, e];y = 0;} finally {f = t = 0;}}
- if (op[0] & 5) throw op[1];return { value: op[0] ? op[1] : void 0, done: true };
- }
- }
- var Bounds = /** @class */function () {
- function Bounds(x, y, w, h) {
- this.left = x;
- this.top = y;
- this.width = w;
- this.height = h;
- }
- Bounds.prototype.add = function (x, y, w, h) {
- return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);
- };
- Bounds.fromClientRect = function (clientRect) {
- return new Bounds(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
- };
- return Bounds;
- }();
- var parseBounds = function parseBounds(node) {
- return Bounds.fromClientRect(node.getBoundingClientRect());
- };
- var parseDocumentSize = function parseDocumentSize(document) {
- var body = document.body;
- var documentElement = document.documentElement;
- if (!body || !documentElement) {
- throw new Error("Unable to get document size");
- }
- var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));
- var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));
- return new Bounds(0, 0, width, height);
- };
- /*
- * css-line-break 1.1.1 <https://github.com/niklasvh/css-line-break#readme>
- * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>
- * Released under MIT License
- */
- var toCodePoints = function toCodePoints(str) {
- var codePoints = [];
- var i = 0;
- var length = str.length;
- while (i < length) {
- var value = str.charCodeAt(i++);
- if (value >= 0xd800 && value <= 0xdbff && i < length) {
- var extra = str.charCodeAt(i++);
- if ((extra & 0xfc00) === 0xdc00) {
- codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);
- } else
- {
- codePoints.push(value);
- i--;
- }
- } else
- {
- codePoints.push(value);
- }
- }
- return codePoints;
- };
- var fromCodePoint = function fromCodePoint() {
- var codePoints = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- codePoints[_i] = arguments[_i];
- }
- if (String.fromCodePoint) {
- return String.fromCodePoint.apply(String, codePoints);
- }
- var length = codePoints.length;
- if (!length) {
- return '';
- }
- var codeUnits = [];
- var index = -1;
- var result = '';
- while (++index < length) {
- var codePoint = codePoints[index];
- if (codePoint <= 0xffff) {
- codeUnits.push(codePoint);
- } else
- {
- codePoint -= 0x10000;
- codeUnits.push((codePoint >> 10) + 0xd800, codePoint % 0x400 + 0xdc00);
- }
- if (index + 1 === length || codeUnits.length > 0x4000) {
- result += String.fromCharCode.apply(String, codeUnits);
- codeUnits.length = 0;
- }
- }
- return result;
- };
- var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
- // Use a lookup table to find the index.
- var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
- for (var i = 0; i < chars.length; i++) {
- lookup[chars.charCodeAt(i)] = i;
- }
- var decode = function decode(base64) {
- var bufferLength = base64.length * 0.75,len = base64.length,i,p = 0,encoded1,encoded2,encoded3,encoded4;
- if (base64[base64.length - 1] === '=') {
- bufferLength--;
- if (base64[base64.length - 2] === '=') {
- bufferLength--;
- }
- }
- var buffer = typeof ArrayBuffer !== 'undefined' &&
- typeof Uint8Array !== 'undefined' &&
- typeof Uint8Array.prototype.slice !== 'undefined' ?
- new ArrayBuffer(bufferLength) :
- new Array(bufferLength);
- var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);
- for (i = 0; i < len; i += 4) {
- encoded1 = lookup[base64.charCodeAt(i)];
- encoded2 = lookup[base64.charCodeAt(i + 1)];
- encoded3 = lookup[base64.charCodeAt(i + 2)];
- encoded4 = lookup[base64.charCodeAt(i + 3)];
- bytes[p++] = encoded1 << 2 | encoded2 >> 4;
- bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
- bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
- }
- return buffer;
- };
- var polyUint16Array = function polyUint16Array(buffer) {
- var length = buffer.length;
- var bytes = [];
- for (var i = 0; i < length; i += 2) {
- bytes.push(buffer[i + 1] << 8 | buffer[i]);
- }
- return bytes;
- };
- var polyUint32Array = function polyUint32Array(buffer) {
- var length = buffer.length;
- var bytes = [];
- for (var i = 0; i < length; i += 4) {
- bytes.push(buffer[i + 3] << 24 | buffer[i + 2] << 16 | buffer[i + 1] << 8 | buffer[i]);
- }
- return bytes;
- };
- /** Shift size for getting the index-2 table offset. */
- var UTRIE2_SHIFT_2 = 5;
- /** Shift size for getting the index-1 table offset. */
- var UTRIE2_SHIFT_1 = 6 + 5;
- /**
- * Shift size for shifting left the index array values.
- * Increases possible data size with 16-bit index values at the cost
- * of compactability.
- * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.
- */
- var UTRIE2_INDEX_SHIFT = 2;
- /**
- * Difference between the two shift sizes,
- * for getting an index-1 offset from an index-2 offset. 6=11-5
- */
- var UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;
- /**
- * The part of the index-2 table for U+D800..U+DBFF stores values for
- * lead surrogate code _units_ not code _points_.
- * Values for lead surrogate code _points_ are indexed with this portion of the table.
- * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)
- */
- var UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;
- /** Number of entries in a data block. 32=0x20 */
- var UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;
- /** Mask for getting the lower bits for the in-data-block offset. */
- var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;
- var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;
- /** Count the lengths of both BMP pieces. 2080=0x820 */
- var UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;
- /**
- * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.
- * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.
- */
- var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;
- var UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */
- /**
- * The index-1 table, only used for supplementary code points, at offset 2112=0x840.
- * Variable length, for code points up to highStart, where the last single-value range starts.
- * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.
- * (For 0x100000 supplementary code points U+10000..U+10ffff.)
- *
- * The part of the index-2 table for supplementary code points starts
- * after this index-1 table.
- *
- * Both the index-1 table and the following part of the index-2 table
- * are omitted completely if there is only BMP data.
- */
- var UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;
- /**
- * Number of index-1 entries for the BMP. 32=0x20
- * This part of the index-1 table is omitted from the serialized form.
- */
- var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;
- /** Number of entries in an index-2 block. 64=0x40 */
- var UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;
- /** Mask for getting the lower bits for the in-index-2-block offset. */
- var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;
- var slice16 = function slice16(view, start, end) {
- if (view.slice) {
- return view.slice(start, end);
- }
- return new Uint16Array(Array.prototype.slice.call(view, start, end));
- };
- var slice32 = function slice32(view, start, end) {
- if (view.slice) {
- return view.slice(start, end);
- }
- return new Uint32Array(Array.prototype.slice.call(view, start, end));
- };
- var createTrieFromBase64 = function createTrieFromBase64(base64) {
- var buffer = decode(base64);
- var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);
- var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);
- var headerLength = 24;
- var index = slice16(view16, headerLength / 2, view32[4] / 2);
- var data = view32[5] === 2 ?
- slice16(view16, (headerLength + view32[4]) / 2) :
- slice32(view32, Math.ceil((headerLength + view32[4]) / 4));
- return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);
- };
- var Trie = /** @class */function () {
- function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {
- this.initialValue = initialValue;
- this.errorValue = errorValue;
- this.highStart = highStart;
- this.highValueIndex = highValueIndex;
- this.index = index;
- this.data = data;
- }
- /**
- * Get the value for a code point as stored in the Trie.
- *
- * @param codePoint the code point
- * @return the value
- */
- Trie.prototype.get = function (codePoint) {
- var ix;
- if (codePoint >= 0) {
- if (codePoint < 0x0d800 || codePoint > 0x0dbff && codePoint <= 0x0ffff) {
- // Ordinary BMP code point, excluding leading surrogates.
- // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index.
- // 16 bit data is stored in the index array itself.
- ix = this.index[codePoint >> UTRIE2_SHIFT_2];
- ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
- return this.data[ix];
- }
- if (codePoint <= 0xffff) {
- // Lead Surrogate Code Point. A Separate index section is stored for
- // lead surrogate code units and code points.
- // The main index has the code unit data.
- // For this function, we need the code point data.
- // Note: this expression could be refactored for slightly improved efficiency, but
- // surrogate code points will be so rare in practice that it's not worth it.
- ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + (codePoint - 0xd800 >> UTRIE2_SHIFT_2)];
- ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
- return this.data[ix];
- }
- if (codePoint < this.highStart) {
- // Supplemental code point, use two-level lookup.
- ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);
- ix = this.index[ix];
- ix += codePoint >> UTRIE2_SHIFT_2 & UTRIE2_INDEX_2_MASK;
- ix = this.index[ix];
- ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
- return this.data[ix];
- }
- if (codePoint <= 0x10ffff) {
- return this.data[this.highValueIndex];
- }
- }
- // Fall through. The code point is outside of the legal range of 0..0x10ffff.
- return this.errorValue;
- };
- return Trie;
- }();
- var base64 = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAAXgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwAKAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AHQAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATwBPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA';
- /* @flow */
- var LETTER_NUMBER_MODIFIER = 50;
- // Non-tailorable Line Breaking Classes
- var BK = 1; // Cause a line break (after)
- var CR = 2; // Cause a line break (after), except between CR and LF
- var LF = 3; // Cause a line break (after)
- var CM = 4; // Prohibit a line break between the character and the preceding character
- var NL = 5; // Cause a line break (after)
- var WJ = 7; // Prohibit line breaks before and after
- var ZW = 8; // Provide a break opportunity
- var GL = 9; // Prohibit line breaks before and after
- var SP = 10; // Enable indirect line breaks
- var ZWJ = 11; // Prohibit line breaks within joiner sequences
- // Break Opportunities
- var B2 = 12; // Provide a line break opportunity before and after the character
- var BA = 13; // Generally provide a line break opportunity after the character
- var BB = 14; // Generally provide a line break opportunity before the character
- var HY = 15; // Provide a line break opportunity after the character, except in numeric context
- var CB = 16; // Provide a line break opportunity contingent on additional information
- // Characters Prohibiting Certain Breaks
- var CL = 17; // Prohibit line breaks before
- var CP = 18; // Prohibit line breaks before
- var EX = 19; // Prohibit line breaks before
- var IN = 20; // Allow only indirect line breaks between pairs
- var NS = 21; // Allow only indirect line breaks before
- var OP = 22; // Prohibit line breaks after
- var QU = 23; // Act like they are both opening and closing
- // Numeric Context
- var IS = 24; // Prevent breaks after any and before numeric
- var NU = 25; // Form numeric expressions for line breaking purposes
- var PO = 26; // Do not break following a numeric expression
- var PR = 27; // Do not break in front of a numeric expression
- var SY = 28; // Prevent a break before; and allow a break after
- // Other Characters
- var AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID
- var AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters
- var CJ = 31; // Treat as NS or ID for strict or normal breaking.
- var EB = 32; // Do not break from following Emoji Modifier
- var EM = 33; // Do not break from preceding Emoji Base
- var H2 = 34; // Form Korean syllable blocks
- var H3 = 35; // Form Korean syllable blocks
- var HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic
- var ID = 37; // Break before or after; except in some numeric context
- var JL = 38; // Form Korean syllable blocks
- var JV = 39; // Form Korean syllable blocks
- var JT = 40; // Form Korean syllable blocks
- var RI = 41; // Keep pairs together. For pairs; break before and after other classes
- var SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis
- var XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions
- var BREAK_MANDATORY = '!';
- var BREAK_NOT_ALLOWED = '×';
- var BREAK_ALLOWED = '÷';
- var UnicodeTrie = createTrieFromBase64(base64);
- var ALPHABETICS = [AL, HL];
- var HARD_LINE_BREAKS = [BK, CR, LF, NL];
- var SPACE = [SP, ZW];
- var PREFIX_POSTFIX = [PR, PO];
- var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);
- var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];
- var HYPHEN = [HY, BA];
- var codePointsToCharacterClasses = function codePointsToCharacterClasses(codePoints, lineBreak) {
- if (lineBreak === void 0) {lineBreak = 'strict';}
- var types = [];
- var indicies = [];
- var categories = [];
- codePoints.forEach(function (codePoint, index) {
- var classType = UnicodeTrie.get(codePoint);
- if (classType > LETTER_NUMBER_MODIFIER) {
- categories.push(true);
- classType -= LETTER_NUMBER_MODIFIER;
- } else
- {
- categories.push(false);
- }
- if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {
- // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0
- if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {
- indicies.push(index);
- return types.push(CB);
- }
- }
- if (classType === CM || classType === ZWJ) {
- // LB10 Treat any remaining combining mark or ZWJ as AL.
- if (index === 0) {
- indicies.push(index);
- return types.push(AL);
- }
- // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of
- // the base character in all of the following rules. Treat ZWJ as if it were CM.
- var prev = types[index - 1];
- if (LINE_BREAKS.indexOf(prev) === -1) {
- indicies.push(indicies[index - 1]);
- return types.push(prev);
- }
- indicies.push(index);
- return types.push(AL);
- }
- indicies.push(index);
- if (classType === CJ) {
- return types.push(lineBreak === 'strict' ? NS : ID);
- }
- if (classType === SA) {
- return types.push(AL);
- }
- if (classType === AI) {
- return types.push(AL);
- }
- // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL
- // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised
- // to take into account the actual line breaking properties for these characters.
- if (classType === XX) {
- if (codePoint >= 0x20000 && codePoint <= 0x2fffd || codePoint >= 0x30000 && codePoint <= 0x3fffd) {
- return types.push(ID);
- } else
- {
- return types.push(AL);
- }
- }
- types.push(classType);
- });
- return [indicies, types, categories];
- };
- var isAdjacentWithSpaceIgnored = function isAdjacentWithSpaceIgnored(a, b, currentIndex, classTypes) {
- var current = classTypes[currentIndex];
- if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {
- var i = currentIndex;
- while (i <= classTypes.length) {
- i++;
- var next = classTypes[i];
- if (next === b) {
- return true;
- }
- if (next !== SP) {
- break;
- }
- }
- }
- if (current === SP) {
- var i = currentIndex;
- while (i > 0) {
- i--;
- var prev = classTypes[i];
- if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {
- var n = currentIndex;
- while (n <= classTypes.length) {
- n++;
- var next = classTypes[n];
- if (next === b) {
- return true;
- }
- if (next !== SP) {
- break;
- }
- }
- }
- if (prev !== SP) {
- break;
- }
- }
- }
- return false;
- };
- var previousNonSpaceClassType = function previousNonSpaceClassType(currentIndex, classTypes) {
- var i = currentIndex;
- while (i >= 0) {
- var type = classTypes[i];
- if (type === SP) {
- i--;
- } else
- {
- return type;
- }
- }
- return 0;
- };
- var _lineBreakAtIndex = function _lineBreakAtIndex(codePoints, classTypes, indicies, index, forbiddenBreaks) {
- if (indicies[index] === 0) {
- return BREAK_NOT_ALLOWED;
- }
- var currentIndex = index - 1;
- if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {
- return BREAK_NOT_ALLOWED;
- }
- var beforeIndex = currentIndex - 1;
- var afterIndex = currentIndex + 1;
- var current = classTypes[currentIndex];
- // LB4 Always break after hard line breaks.
- // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.
- var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;
- var next = classTypes[afterIndex];
- if (current === CR && next === LF) {
- return BREAK_NOT_ALLOWED;
- }
- if (HARD_LINE_BREAKS.indexOf(current) !== -1) {
- return BREAK_MANDATORY;
- }
- // LB6 Do not break before hard line breaks.
- if (HARD_LINE_BREAKS.indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB7 Do not break before spaces or zero width space.
- if (SPACE.indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.
- if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {
- return BREAK_ALLOWED;
- }
- // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier.
- if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) {
- return BREAK_NOT_ALLOWED;
- }
- // LB11 Do not break before or after Word joiner and related characters.
- if (current === WJ || next === WJ) {
- return BREAK_NOT_ALLOWED;
- }
- // LB12 Do not break after NBSP and related characters.
- if (current === GL) {
- return BREAK_NOT_ALLOWED;
- }
- // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.
- if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {
- return BREAK_NOT_ALLOWED;
- }
- // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.
- if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB14 Do not break after ‘[’, even after spaces.
- if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {
- return BREAK_NOT_ALLOWED;
- }
- // LB15 Do not break within ‘”[’, even with intervening spaces.
- if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {
- return BREAK_NOT_ALLOWED;
- }
- // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.
- if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {
- return BREAK_NOT_ALLOWED;
- }
- // LB17 Do not break within ‘——’, even with intervening spaces.
- if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {
- return BREAK_NOT_ALLOWED;
- }
- // LB18 Break after spaces.
- if (current === SP) {
- return BREAK_ALLOWED;
- }
- // LB19 Do not break before or after quotation marks, such as ‘ ” ’.
- if (current === QU || next === QU) {
- return BREAK_NOT_ALLOWED;
- }
- // LB20 Break before and after unresolved CB.
- if (next === CB || current === CB) {
- return BREAK_ALLOWED;
- }
- // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.
- if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {
- return BREAK_NOT_ALLOWED;
- }
- // LB21a Don't break after Hebrew + Hyphen.
- if (before === HL && HYPHEN.indexOf(current) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB21b Don’t break between Solidus and Hebrew letters.
- if (current === SY && next === HL) {
- return BREAK_NOT_ALLOWED;
- }
- // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis.
- if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB23 Do not break between digits and letters.
- if (ALPHABETICS.indexOf(next) !== -1 && current === NU || ALPHABETICS.indexOf(current) !== -1 && next === NU) {
- return BREAK_NOT_ALLOWED;
- }
- // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.
- if (current === PR && [ID, EB, EM].indexOf(next) !== -1 ||
- [ID, EB, EM].indexOf(current) !== -1 && next === PO) {
- return BREAK_NOT_ALLOWED;
- }
- // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.
- if (ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1 ||
- PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB25 Do not break between the following pairs of classes relevant to numbers:
- if (
- // (PR | PO) × ( OP | HY )? NU
- [PR, PO].indexOf(current) !== -1 && (
- next === NU || [OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU) ||
- // ( OP | HY ) × NU
- [OP, HY].indexOf(current) !== -1 && next === NU ||
- // NU × (NU | SY | IS)
- current === NU && [NU, SY, IS].indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)
- if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {
- var prevIndex = currentIndex;
- while (prevIndex >= 0) {
- var type = classTypes[prevIndex];
- if (type === NU) {
- return BREAK_NOT_ALLOWED;
- } else
- if ([SY, IS].indexOf(type) !== -1) {
- prevIndex--;
- } else
- {
- break;
- }
- }
- }
- // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))
- if ([PR, PO].indexOf(next) !== -1) {
- var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;
- while (prevIndex >= 0) {
- var type = classTypes[prevIndex];
- if (type === NU) {
- return BREAK_NOT_ALLOWED;
- } else
- if ([SY, IS].indexOf(type) !== -1) {
- prevIndex--;
- } else
- {
- break;
- }
- }
- }
- // LB26 Do not break a Korean syllable.
- if (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1 ||
- [JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1 ||
- [JT, H3].indexOf(current) !== -1 && next === JT) {
- return BREAK_NOT_ALLOWED;
- }
- // LB27 Treat a Korean Syllable Block the same as ID.
- if (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1 ||
- KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR) {
- return BREAK_NOT_ALLOWED;
- }
- // LB28 Do not break between alphabetics (“at”).
- if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).
- if (current === IS && ALPHABETICS.indexOf(next) !== -1) {
- return BREAK_NOT_ALLOWED;
- }
- // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.
- if (ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP ||
- ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) {
- return BREAK_NOT_ALLOWED;
- }
- // LB30a Break between two regional indicator symbols if and only if there are an even number of regional
- // indicators preceding the position of the break.
- if (current === RI && next === RI) {
- var i = indicies[currentIndex];
- var count = 1;
- while (i > 0) {
- i--;
- if (classTypes[i] === RI) {
- count++;
- } else
- {
- break;
- }
- }
- if (count % 2 !== 0) {
- return BREAK_NOT_ALLOWED;
- }
- }
- // LB30b Do not break between an emoji base and an emoji modifier.
- if (current === EB && next === EM) {
- return BREAK_NOT_ALLOWED;
- }
- return BREAK_ALLOWED;
- };
- var cssFormattedClasses = function cssFormattedClasses(codePoints, options) {
- if (!options) {
- options = { lineBreak: 'normal', wordBreak: 'normal' };
- }
- var _a = codePointsToCharacterClasses(codePoints, options.lineBreak),indicies = _a[0],classTypes = _a[1],isLetterNumber = _a[2];
- if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {
- classTypes = classTypes.map(function (type) {return [NU, AL, SA].indexOf(type) !== -1 ? ID : type;});
- }
- var forbiddenBreakpoints = options.wordBreak === 'keep-all' ?
- isLetterNumber.map(function (letterNumber, i) {
- return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;
- }) :
- undefined;
- return [indicies, classTypes, forbiddenBreakpoints];
- };
- var Break = /** @class */function () {
- function Break(codePoints, lineBreak, start, end) {
- this.codePoints = codePoints;
- this.required = lineBreak === BREAK_MANDATORY;
- this.start = start;
- this.end = end;
- }
- Break.prototype.slice = function () {
- return fromCodePoint.apply(void 0, this.codePoints.slice(this.start, this.end));
- };
- return Break;
- }();
- var LineBreaker = function LineBreaker(str, options) {
- var codePoints = toCodePoints(str);
- var _a = cssFormattedClasses(codePoints, options),indicies = _a[0],classTypes = _a[1],forbiddenBreakpoints = _a[2];
- var length = codePoints.length;
- var lastEnd = 0;
- var nextIndex = 0;
- return {
- next: function next() {
- if (nextIndex >= length) {
- return { done: true, value: null };
- }
- var lineBreak = BREAK_NOT_ALLOWED;
- while (nextIndex < length &&
- (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===
- BREAK_NOT_ALLOWED) {}
- if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {
- var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);
- lastEnd = nextIndex;
- return { value: value, done: false };
- }
- return { done: true, value: null };
- } };
- };
- // https://www.w3.org/TR/css-syntax-3
- var TokenType;
- (function (TokenType) {
- TokenType[TokenType["STRING_TOKEN"] = 0] = "STRING_TOKEN";
- TokenType[TokenType["BAD_STRING_TOKEN"] = 1] = "BAD_STRING_TOKEN";
- TokenType[TokenType["LEFT_PARENTHESIS_TOKEN"] = 2] = "LEFT_PARENTHESIS_TOKEN";
- TokenType[TokenType["RIGHT_PARENTHESIS_TOKEN"] = 3] = "RIGHT_PARENTHESIS_TOKEN";
- TokenType[TokenType["COMMA_TOKEN"] = 4] = "COMMA_TOKEN";
- TokenType[TokenType["HASH_TOKEN"] = 5] = "HASH_TOKEN";
- TokenType[TokenType["DELIM_TOKEN"] = 6] = "DELIM_TOKEN";
- TokenType[TokenType["AT_KEYWORD_TOKEN"] = 7] = "AT_KEYWORD_TOKEN";
- TokenType[TokenType["PREFIX_MATCH_TOKEN"] = 8] = "PREFIX_MATCH_TOKEN";
- TokenType[TokenType["DASH_MATCH_TOKEN"] = 9] = "DASH_MATCH_TOKEN";
- TokenType[TokenType["INCLUDE_MATCH_TOKEN"] = 10] = "INCLUDE_MATCH_TOKEN";
- TokenType[TokenType["LEFT_CURLY_BRACKET_TOKEN"] = 11] = "LEFT_CURLY_BRACKET_TOKEN";
- TokenType[TokenType["RIGHT_CURLY_BRACKET_TOKEN"] = 12] = "RIGHT_CURLY_BRACKET_TOKEN";
- TokenType[TokenType["SUFFIX_MATCH_TOKEN"] = 13] = "SUFFIX_MATCH_TOKEN";
- TokenType[TokenType["SUBSTRING_MATCH_TOKEN"] = 14] = "SUBSTRING_MATCH_TOKEN";
- TokenType[TokenType["DIMENSION_TOKEN"] = 15] = "DIMENSION_TOKEN";
- TokenType[TokenType["PERCENTAGE_TOKEN"] = 16] = "PERCENTAGE_TOKEN";
- TokenType[TokenType["NUMBER_TOKEN"] = 17] = "NUMBER_TOKEN";
- TokenType[TokenType["FUNCTION"] = 18] = "FUNCTION";
- TokenType[TokenType["FUNCTION_TOKEN"] = 19] = "FUNCTION_TOKEN";
- TokenType[TokenType["IDENT_TOKEN"] = 20] = "IDENT_TOKEN";
- TokenType[TokenType["COLUMN_TOKEN"] = 21] = "COLUMN_TOKEN";
- TokenType[TokenType["URL_TOKEN"] = 22] = "URL_TOKEN";
- TokenType[TokenType["BAD_URL_TOKEN"] = 23] = "BAD_URL_TOKEN";
- TokenType[TokenType["CDC_TOKEN"] = 24] = "CDC_TOKEN";
- TokenType[TokenType["CDO_TOKEN"] = 25] = "CDO_TOKEN";
- TokenType[TokenType["COLON_TOKEN"] = 26] = "COLON_TOKEN";
- TokenType[TokenType["SEMICOLON_TOKEN"] = 27] = "SEMICOLON_TOKEN";
- TokenType[TokenType["LEFT_SQUARE_BRACKET_TOKEN"] = 28] = "LEFT_SQUARE_BRACKET_TOKEN";
- TokenType[TokenType["RIGHT_SQUARE_BRACKET_TOKEN"] = 29] = "RIGHT_SQUARE_BRACKET_TOKEN";
- TokenType[TokenType["UNICODE_RANGE_TOKEN"] = 30] = "UNICODE_RANGE_TOKEN";
- TokenType[TokenType["WHITESPACE_TOKEN"] = 31] = "WHITESPACE_TOKEN";
- TokenType[TokenType["EOF_TOKEN"] = 32] = "EOF_TOKEN";
- })(TokenType || (TokenType = {}));
- var FLAG_UNRESTRICTED = 1 << 0;
- var FLAG_ID = 1 << 1;
- var FLAG_INTEGER = 1 << 2;
- var FLAG_NUMBER = 1 << 3;
- var LINE_FEED = 0x000a;
- var SOLIDUS = 0x002f;
- var REVERSE_SOLIDUS = 0x005c;
- var CHARACTER_TABULATION = 0x0009;
- var SPACE$1 = 0x0020;
- var QUOTATION_MARK = 0x0022;
- var EQUALS_SIGN = 0x003d;
- var NUMBER_SIGN = 0x0023;
- var DOLLAR_SIGN = 0x0024;
- var PERCENTAGE_SIGN = 0x0025;
- var APOSTROPHE = 0x0027;
- var LEFT_PARENTHESIS = 0x0028;
- var RIGHT_PARENTHESIS = 0x0029;
- var LOW_LINE = 0x005f;
- var HYPHEN_MINUS = 0x002d;
- var EXCLAMATION_MARK = 0x0021;
- var LESS_THAN_SIGN = 0x003c;
- var GREATER_THAN_SIGN = 0x003e;
- var COMMERCIAL_AT = 0x0040;
- var LEFT_SQUARE_BRACKET = 0x005b;
- var RIGHT_SQUARE_BRACKET = 0x005d;
- var CIRCUMFLEX_ACCENT = 0x003d;
- var LEFT_CURLY_BRACKET = 0x007b;
- var QUESTION_MARK = 0x003f;
- var RIGHT_CURLY_BRACKET = 0x007d;
- var VERTICAL_LINE = 0x007c;
- var TILDE = 0x007e;
- var CONTROL = 0x0080;
- var REPLACEMENT_CHARACTER = 0xfffd;
- var ASTERISK = 0x002a;
- var PLUS_SIGN = 0x002b;
- var COMMA = 0x002c;
- var COLON = 0x003a;
- var SEMICOLON = 0x003b;
- var FULL_STOP = 0x002e;
- var NULL = 0x0000;
- var BACKSPACE = 0x0008;
- var LINE_TABULATION = 0x000b;
- var SHIFT_OUT = 0x000e;
- var INFORMATION_SEPARATOR_ONE = 0x001f;
- var DELETE = 0x007f;
- var EOF = -1;
- var ZERO = 0x0030;
- var a = 0x0061;
- var e = 0x0065;
- var f = 0x0066;
- var u = 0x0075;
- var z = 0x007a;
- var A = 0x0041;
- var E = 0x0045;
- var F = 0x0046;
- var U = 0x0055;
- var Z = 0x005a;
- var isDigit = function isDigit(codePoint) {return codePoint >= ZERO && codePoint <= 0x0039;};
- var isSurrogateCodePoint = function isSurrogateCodePoint(codePoint) {return codePoint >= 0xd800 && codePoint <= 0xdfff;};
- var isHex = function isHex(codePoint) {
- return isDigit(codePoint) || codePoint >= A && codePoint <= F || codePoint >= a && codePoint <= f;
- };
- var isLowerCaseLetter = function isLowerCaseLetter(codePoint) {return codePoint >= a && codePoint <= z;};
- var isUpperCaseLetter = function isUpperCaseLetter(codePoint) {return codePoint >= A && codePoint <= Z;};
- var isLetter = function isLetter(codePoint) {return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint);};
- var isNonASCIICodePoint = function isNonASCIICodePoint(codePoint) {return codePoint >= CONTROL;};
- var isWhiteSpace = function isWhiteSpace(codePoint) {
- return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE$1;
- };
- var isNameStartCodePoint = function isNameStartCodePoint(codePoint) {
- return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;
- };
- var isNameCodePoint = function isNameCodePoint(codePoint) {
- return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;
- };
- var isNonPrintableCodePoint = function isNonPrintableCodePoint(codePoint) {
- return codePoint >= NULL && codePoint <= BACKSPACE ||
- codePoint === LINE_TABULATION ||
- codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE ||
- codePoint === DELETE;
- };
- var isValidEscape = function isValidEscape(c1, c2) {
- if (c1 !== REVERSE_SOLIDUS) {
- return false;
- }
- return c2 !== LINE_FEED;
- };
- var isIdentifierStart = function isIdentifierStart(c1, c2, c3) {
- if (c1 === HYPHEN_MINUS) {
- return isNameStartCodePoint(c2) || isValidEscape(c2, c3);
- } else
- if (isNameStartCodePoint(c1)) {
- return true;
- } else
- if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {
- return true;
- }
- return false;
- };
- var isNumberStart = function isNumberStart(c1, c2, c3) {
- if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
- if (isDigit(c2)) {
- return true;
- }
- return c2 === FULL_STOP && isDigit(c3);
- }
- if (c1 === FULL_STOP) {
- return isDigit(c2);
- }
- return isDigit(c1);
- };
- var stringToNumber = function stringToNumber(codePoints) {
- var c = 0;
- var sign = 1;
- if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
- if (codePoints[c] === HYPHEN_MINUS) {
- sign = -1;
- }
- c++;
- }
- var integers = [];
- while (isDigit(codePoints[c])) {
- integers.push(codePoints[c++]);
- }
- var _int = integers.length ? parseInt(fromCodePoint.apply(void 0, integers), 10) : 0;
- if (codePoints[c] === FULL_STOP) {
- c++;
- }
- var fraction = [];
- while (isDigit(codePoints[c])) {
- fraction.push(codePoints[c++]);
- }
- var fracd = fraction.length;
- var frac = fracd ? parseInt(fromCodePoint.apply(void 0, fraction), 10) : 0;
- if (codePoints[c] === E || codePoints[c] === e) {
- c++;
- }
- var expsign = 1;
- if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
- if (codePoints[c] === HYPHEN_MINUS) {
- expsign = -1;
- }
- c++;
- }
- var exponent = [];
- while (isDigit(codePoints[c])) {
- exponent.push(codePoints[c++]);
- }
- var exp = exponent.length ? parseInt(fromCodePoint.apply(void 0, exponent), 10) : 0;
- return sign * (_int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);
- };
- var LEFT_PARENTHESIS_TOKEN = {
- type: TokenType.LEFT_PARENTHESIS_TOKEN };
- var RIGHT_PARENTHESIS_TOKEN = {
- type: TokenType.RIGHT_PARENTHESIS_TOKEN };
- var COMMA_TOKEN = { type: TokenType.COMMA_TOKEN };
- var SUFFIX_MATCH_TOKEN = { type: TokenType.SUFFIX_MATCH_TOKEN };
- var PREFIX_MATCH_TOKEN = { type: TokenType.PREFIX_MATCH_TOKEN };
- var COLUMN_TOKEN = { type: TokenType.COLUMN_TOKEN };
- var DASH_MATCH_TOKEN = { type: TokenType.DASH_MATCH_TOKEN };
- var INCLUDE_MATCH_TOKEN = { type: TokenType.INCLUDE_MATCH_TOKEN };
- var LEFT_CURLY_BRACKET_TOKEN = {
- type: TokenType.LEFT_CURLY_BRACKET_TOKEN };
- var RIGHT_CURLY_BRACKET_TOKEN = {
- type: TokenType.RIGHT_CURLY_BRACKET_TOKEN };
- var SUBSTRING_MATCH_TOKEN = { type: TokenType.SUBSTRING_MATCH_TOKEN };
- var BAD_URL_TOKEN = { type: TokenType.BAD_URL_TOKEN };
- var BAD_STRING_TOKEN = { type: TokenType.BAD_STRING_TOKEN };
- var CDO_TOKEN = { type: TokenType.CDO_TOKEN };
- var CDC_TOKEN = { type: TokenType.CDC_TOKEN };
- var COLON_TOKEN = { type: TokenType.COLON_TOKEN };
- var SEMICOLON_TOKEN = { type: TokenType.SEMICOLON_TOKEN };
- var LEFT_SQUARE_BRACKET_TOKEN = {
- type: TokenType.LEFT_SQUARE_BRACKET_TOKEN };
- var RIGHT_SQUARE_BRACKET_TOKEN = {
- type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN };
- var WHITESPACE_TOKEN = { type: TokenType.WHITESPACE_TOKEN };
- var EOF_TOKEN = { type: TokenType.EOF_TOKEN };
- var Tokenizer = /** @class */function () {
- function Tokenizer() {
- this._value = [];
- }
- Tokenizer.prototype.write = function (chunk) {
- this._value = this._value.concat(toCodePoints(chunk));
- };
- Tokenizer.prototype.read = function () {
- var tokens = [];
- var token = this.consumeToken();
- while (token !== EOF_TOKEN) {
- tokens.push(token);
- token = this.consumeToken();
- }
- return tokens;
- };
- Tokenizer.prototype.consumeToken = function () {
- var codePoint = this.consumeCodePoint();
- switch (codePoint) {
- case QUOTATION_MARK:
- return this.consumeStringToken(QUOTATION_MARK);
- case NUMBER_SIGN:
- var c1 = this.peekCodePoint(0);
- var c2 = this.peekCodePoint(1);
- var c3 = this.peekCodePoint(2);
- if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {
- var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;
- var value = this.consumeName();
- return { type: TokenType.HASH_TOKEN, value: value, flags: flags };
- }
- break;
- case DOLLAR_SIGN:
- if (this.peekCodePoint(0) === EQUALS_SIGN) {
- this.consumeCodePoint();
- return SUFFIX_MATCH_TOKEN;
- }
- break;
- case APOSTROPHE:
- return this.consumeStringToken(APOSTROPHE);
- case LEFT_PARENTHESIS:
- return LEFT_PARENTHESIS_TOKEN;
- case RIGHT_PARENTHESIS:
- return RIGHT_PARENTHESIS_TOKEN;
- case ASTERISK:
- if (this.peekCodePoint(0) === EQUALS_SIGN) {
- this.consumeCodePoint();
- return SUBSTRING_MATCH_TOKEN;
- }
- break;
- case PLUS_SIGN:
- if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeNumericToken();
- }
- break;
- case COMMA:
- return COMMA_TOKEN;
- case HYPHEN_MINUS:
- var e1 = codePoint;
- var e2 = this.peekCodePoint(0);
- var e3 = this.peekCodePoint(1);
- if (isNumberStart(e1, e2, e3)) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeNumericToken();
- }
- if (isIdentifierStart(e1, e2, e3)) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeIdentLikeToken();
- }
- if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {
- this.consumeCodePoint();
- this.consumeCodePoint();
- return CDC_TOKEN;
- }
- break;
- case FULL_STOP:
- if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeNumericToken();
- }
- break;
- case SOLIDUS:
- if (this.peekCodePoint(0) === ASTERISK) {
- this.consumeCodePoint();
- while (true) {
- var c = this.consumeCodePoint();
- if (c === ASTERISK) {
- c = this.consumeCodePoint();
- if (c === SOLIDUS) {
- return this.consumeToken();
- }
- }
- if (c === EOF) {
- return this.consumeToken();
- }
- }
- }
- break;
- case COLON:
- return COLON_TOKEN;
- case SEMICOLON:
- return SEMICOLON_TOKEN;
- case LESS_THAN_SIGN:
- if (this.peekCodePoint(0) === EXCLAMATION_MARK &&
- this.peekCodePoint(1) === HYPHEN_MINUS &&
- this.peekCodePoint(2) === HYPHEN_MINUS) {
- this.consumeCodePoint();
- this.consumeCodePoint();
- return CDO_TOKEN;
- }
- break;
- case COMMERCIAL_AT:
- var a1 = this.peekCodePoint(0);
- var a2 = this.peekCodePoint(1);
- var a3 = this.peekCodePoint(2);
- if (isIdentifierStart(a1, a2, a3)) {
- var value = this.consumeName();
- return { type: TokenType.AT_KEYWORD_TOKEN, value: value };
- }
- break;
- case LEFT_SQUARE_BRACKET:
- return LEFT_SQUARE_BRACKET_TOKEN;
- case REVERSE_SOLIDUS:
- if (isValidEscape(codePoint, this.peekCodePoint(0))) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeIdentLikeToken();
- }
- break;
- case RIGHT_SQUARE_BRACKET:
- return RIGHT_SQUARE_BRACKET_TOKEN;
- case CIRCUMFLEX_ACCENT:
- if (this.peekCodePoint(0) === EQUALS_SIGN) {
- this.consumeCodePoint();
- return PREFIX_MATCH_TOKEN;
- }
- break;
- case LEFT_CURLY_BRACKET:
- return LEFT_CURLY_BRACKET_TOKEN;
- case RIGHT_CURLY_BRACKET:
- return RIGHT_CURLY_BRACKET_TOKEN;
- case u:
- case U:
- var u1 = this.peekCodePoint(0);
- var u2 = this.peekCodePoint(1);
- if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {
- this.consumeCodePoint();
- this.consumeUnicodeRangeToken();
- }
- this.reconsumeCodePoint(codePoint);
- return this.consumeIdentLikeToken();
- case VERTICAL_LINE:
- if (this.peekCodePoint(0) === EQUALS_SIGN) {
- this.consumeCodePoint();
- return DASH_MATCH_TOKEN;
- }
- if (this.peekCodePoint(0) === VERTICAL_LINE) {
- this.consumeCodePoint();
- return COLUMN_TOKEN;
- }
- break;
- case TILDE:
- if (this.peekCodePoint(0) === EQUALS_SIGN) {
- this.consumeCodePoint();
- return INCLUDE_MATCH_TOKEN;
- }
- break;
- case EOF:
- return EOF_TOKEN;}
- if (isWhiteSpace(codePoint)) {
- this.consumeWhiteSpace();
- return WHITESPACE_TOKEN;
- }
- if (isDigit(codePoint)) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeNumericToken();
- }
- if (isNameStartCodePoint(codePoint)) {
- this.reconsumeCodePoint(codePoint);
- return this.consumeIdentLikeToken();
- }
- return { type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint) };
- };
- Tokenizer.prototype.consumeCodePoint = function () {
- var value = this._value.shift();
- return typeof value === 'undefined' ? -1 : value;
- };
- Tokenizer.prototype.reconsumeCodePoint = function (codePoint) {
- this._value.unshift(codePoint);
- };
- Tokenizer.prototype.peekCodePoint = function (delta) {
- if (delta >= this._value.length) {
- return -1;
- }
- return this._value[delta];
- };
- Tokenizer.prototype.consumeUnicodeRangeToken = function () {
- var digits = [];
- var codePoint = this.consumeCodePoint();
- while (isHex(codePoint) && digits.length < 6) {
- digits.push(codePoint);
- codePoint = this.consumeCodePoint();
- }
- var questionMarks = false;
- while (codePoint === QUESTION_MARK && digits.length < 6) {
- digits.push(codePoint);
- codePoint = this.consumeCodePoint();
- questionMarks = true;
- }
- if (questionMarks) {
- var start_1 = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) {return digit === QUESTION_MARK ? ZERO : digit;})), 16);
- var end = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) {return digit === QUESTION_MARK ? F : digit;})), 16);
- return { type: TokenType.UNICODE_RANGE_TOKEN, start: start_1, end: end };
- }
- var start = parseInt(fromCodePoint.apply(void 0, digits), 16);
- if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {
- this.consumeCodePoint();
- codePoint = this.consumeCodePoint();
- var endDigits = [];
- while (isHex(codePoint) && endDigits.length < 6) {
- endDigits.push(codePoint);
- codePoint = this.consumeCodePoint();
- }
- var end = parseInt(fromCodePoint.apply(void 0, endDigits), 16);
- return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: end };
- } else
- {
- return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: start };
- }
- };
- Tokenizer.prototype.consumeIdentLikeToken = function () {
- var value = this.consumeName();
- if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {
- this.consumeCodePoint();
- return this.consumeUrlToken();
- } else
- if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {
- this.consumeCodePoint();
- return { type: TokenType.FUNCTION_TOKEN, value: value };
- }
- return { type: TokenType.IDENT_TOKEN, value: value };
- };
- Tokenizer.prototype.consumeUrlToken = function () {
- var value = [];
- this.consumeWhiteSpace();
- if (this.peekCodePoint(0) === EOF) {
- return { type: TokenType.URL_TOKEN, value: '' };
- }
- var next = this.peekCodePoint(0);
- if (next === APOSTROPHE || next === QUOTATION_MARK) {
- var stringToken = this.consumeStringToken(this.consumeCodePoint());
- if (stringToken.type === TokenType.STRING_TOKEN) {
- this.consumeWhiteSpace();
- if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
- this.consumeCodePoint();
- return { type: TokenType.URL_TOKEN, value: stringToken.value };
- }
- }
- this.consumeBadUrlRemnants();
- return BAD_URL_TOKEN;
- }
- while (true) {
- var codePoint = this.consumeCodePoint();
- if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {
- return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
- } else
- if (isWhiteSpace(codePoint)) {
- this.consumeWhiteSpace();
- if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
- this.consumeCodePoint();
- return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
- }
- this.consumeBadUrlRemnants();
- return BAD_URL_TOKEN;
- } else
- if (codePoint === QUOTATION_MARK ||
- codePoint === APOSTROPHE ||
- codePoint === LEFT_PARENTHESIS ||
- isNonPrintableCodePoint(codePoint)) {
- this.consumeBadUrlRemnants();
- return BAD_URL_TOKEN;
- } else
- if (codePoint === REVERSE_SOLIDUS) {
- if (isValidEscape(codePoint, this.peekCodePoint(0))) {
- value.push(this.consumeEscapedCodePoint());
- } else
- {
- this.consumeBadUrlRemnants();
- return BAD_URL_TOKEN;
- }
- } else
- {
- value.push(codePoint);
- }
- }
- };
- Tokenizer.prototype.consumeWhiteSpace = function () {
- while (isWhiteSpace(this.peekCodePoint(0))) {
- this.consumeCodePoint();
- }
- };
- Tokenizer.prototype.consumeBadUrlRemnants = function () {
- while (true) {
- var codePoint = this.consumeCodePoint();
- if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {
- return;
- }
- if (isValidEscape(codePoint, this.peekCodePoint(0))) {
- this.consumeEscapedCodePoint();
- }
- }
- };
- Tokenizer.prototype.consumeStringSlice = function (count) {
- var SLICE_STACK_SIZE = 60000;
- var value = '';
- while (count > 0) {
- var amount = Math.min(SLICE_STACK_SIZE, count);
- value += fromCodePoint.apply(void 0, this._value.splice(0, amount));
- count -= amount;
- }
- this._value.shift();
- return value;
- };
- Tokenizer.prototype.consumeStringToken = function (endingCodePoint) {
- var value = '';
- var i = 0;
- do {
- var codePoint = this._value[i];
- if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {
- value += this.consumeStringSlice(i);
- return { type: TokenType.STRING_TOKEN, value: value };
- }
- if (codePoint === LINE_FEED) {
- this._value.splice(0, i);
- return BAD_STRING_TOKEN;
- }
- if (codePoint === REVERSE_SOLIDUS) {
- var next = this._value[i + 1];
- if (next !== EOF && next !== undefined) {
- if (next === LINE_FEED) {
- value += this.consumeStringSlice(i);
- i = -1;
- this._value.shift();
- } else
- if (isValidEscape(codePoint, next)) {
- value += this.consumeStringSlice(i);
- value += fromCodePoint(this.consumeEscapedCodePoint());
- i = -1;
- }
- }
- }
- i++;
- } while (true);
- };
- Tokenizer.prototype.consumeNumber = function () {
- var repr = [];
- var type = FLAG_INTEGER;
- var c1 = this.peekCodePoint(0);
- if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
- repr.push(this.consumeCodePoint());
- }
- while (isDigit(this.peekCodePoint(0))) {
- repr.push(this.consumeCodePoint());
- }
- c1 = this.peekCodePoint(0);
- var c2 = this.peekCodePoint(1);
- if (c1 === FULL_STOP && isDigit(c2)) {
- repr.push(this.consumeCodePoint(), this.consumeCodePoint());
- type = FLAG_NUMBER;
- while (isDigit(this.peekCodePoint(0))) {
- repr.push(this.consumeCodePoint());
- }
- }
- c1 = this.peekCodePoint(0);
- c2 = this.peekCodePoint(1);
- var c3 = this.peekCodePoint(2);
- if ((c1 === E || c1 === e) && ((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3) || isDigit(c2))) {
- repr.push(this.consumeCodePoint(), this.consumeCodePoint());
- type = FLAG_NUMBER;
- while (isDigit(this.peekCodePoint(0))) {
- repr.push(this.consumeCodePoint());
- }
- }
- return [stringToNumber(repr), type];
- };
- Tokenizer.prototype.consumeNumericToken = function () {
- var _a = this.consumeNumber(),number = _a[0],flags = _a[1];
- var c1 = this.peekCodePoint(0);
- var c2 = this.peekCodePoint(1);
- var c3 = this.peekCodePoint(2);
- if (isIdentifierStart(c1, c2, c3)) {
- var unit = this.consumeName();
- return { type: TokenType.DIMENSION_TOKEN, number: number, flags: flags, unit: unit };
- }
- if (c1 === PERCENTAGE_SIGN) {
- this.consumeCodePoint();
- return { type: TokenType.PERCENTAGE_TOKEN, number: number, flags: flags };
- }
- return { type: TokenType.NUMBER_TOKEN, number: number, flags: flags };
- };
- Tokenizer.prototype.consumeEscapedCodePoint = function () {
- var codePoint = this.consumeCodePoint();
- if (isHex(codePoint)) {
- var hex = fromCodePoint(codePoint);
- while (isHex(this.peekCodePoint(0)) && hex.length < 6) {
- hex += fromCodePoint(this.consumeCodePoint());
- }
- if (isWhiteSpace(this.peekCodePoint(0))) {
- this.consumeCodePoint();
- }
- var hexCodePoint = parseInt(hex, 16);
- if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {
- return REPLACEMENT_CHARACTER;
- }
- return hexCodePoint;
- }
- if (codePoint === EOF) {
- return REPLACEMENT_CHARACTER;
- }
- return codePoint;
- };
- Tokenizer.prototype.consumeName = function () {
- var result = '';
- while (true) {
- var codePoint = this.consumeCodePoint();
- if (isNameCodePoint(codePoint)) {
- result += fromCodePoint(codePoint);
- } else
- if (isValidEscape(codePoint, this.peekCodePoint(0))) {
- result += fromCodePoint(this.consumeEscapedCodePoint());
- } else
- {
- this.reconsumeCodePoint(codePoint);
- return result;
- }
- }
- };
- return Tokenizer;
- }();
- var Parser = /** @class */function () {
- function Parser(tokens) {
- this._tokens = tokens;
- }
- Parser.create = function (value) {
- var tokenizer = new Tokenizer();
- tokenizer.write(value);
- return new Parser(tokenizer.read());
- };
- Parser.parseValue = function (value) {
- return Parser.create(value).parseComponentValue();
- };
- Parser.parseValues = function (value) {
- return Parser.create(value).parseComponentValues();
- };
- Parser.prototype.parseComponentValue = function () {
- var token = this.consumeToken();
- while (token.type === TokenType.WHITESPACE_TOKEN) {
- token = this.consumeToken();
- }
- if (token.type === TokenType.EOF_TOKEN) {
- throw new SyntaxError("Error parsing CSS component value, unexpected EOF");
- }
- this.reconsumeToken(token);
- var value = this.consumeComponentValue();
- do {
- token = this.consumeToken();
- } while (token.type === TokenType.WHITESPACE_TOKEN);
- if (token.type === TokenType.EOF_TOKEN) {
- return value;
- }
- throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one");
- };
- Parser.prototype.parseComponentValues = function () {
- var values = [];
- while (true) {
- var value = this.consumeComponentValue();
- if (value.type === TokenType.EOF_TOKEN) {
- return values;
- }
- values.push(value);
- values.push();
- }
- };
- Parser.prototype.consumeComponentValue = function () {
- var token = this.consumeToken();
- switch (token.type) {
- case TokenType.LEFT_CURLY_BRACKET_TOKEN:
- case TokenType.LEFT_SQUARE_BRACKET_TOKEN:
- case TokenType.LEFT_PARENTHESIS_TOKEN:
- return this.consumeSimpleBlock(token.type);
- case TokenType.FUNCTION_TOKEN:
- return this.consumeFunction(token);}
- return token;
- };
- Parser.prototype.consumeSimpleBlock = function (type) {
- var block = { type: type, values: [] };
- var token = this.consumeToken();
- while (true) {
- if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {
- return block;
- }
- this.reconsumeToken(token);
- block.values.push(this.consumeComponentValue());
- token = this.consumeToken();
- }
- };
- Parser.prototype.consumeFunction = function (functionToken) {
- var cssFunction = {
- name: functionToken.value,
- values: [],
- type: TokenType.FUNCTION };
- while (true) {
- var token = this.consumeToken();
- if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {
- return cssFunction;
- }
- this.reconsumeToken(token);
- cssFunction.values.push(this.consumeComponentValue());
- }
- };
- Parser.prototype.consumeToken = function () {
- var token = this._tokens.shift();
- return typeof token === 'undefined' ? EOF_TOKEN : token;
- };
- Parser.prototype.reconsumeToken = function (token) {
- this._tokens.unshift(token);
- };
- return Parser;
- }();
- var isDimensionToken = function isDimensionToken(token) {return token.type === TokenType.DIMENSION_TOKEN;};
- var isNumberToken = function isNumberToken(token) {return token.type === TokenType.NUMBER_TOKEN;};
- var isIdentToken = function isIdentToken(token) {return token.type === TokenType.IDENT_TOKEN;};
- var isStringToken = function isStringToken(token) {return token.type === TokenType.STRING_TOKEN;};
- var isIdentWithValue = function isIdentWithValue(token, value) {
- return isIdentToken(token) && token.value === value;
- };
- var nonWhiteSpace = function nonWhiteSpace(token) {return token.type !== TokenType.WHITESPACE_TOKEN;};
- var nonFunctionArgSeparator = function nonFunctionArgSeparator(token) {
- return token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;
- };
- var parseFunctionArgs = function parseFunctionArgs(tokens) {
- var args = [];
- var arg = [];
- tokens.forEach(function (token) {
- if (token.type === TokenType.COMMA_TOKEN) {
- if (arg.length === 0) {
- throw new Error("Error parsing function args, zero tokens for arg");
- }
- args.push(arg);
- arg = [];
- return;
- }
- if (token.type !== TokenType.WHITESPACE_TOKEN) {
- arg.push(token);
- }
- });
- if (arg.length) {
- args.push(arg);
- }
- return args;
- };
- var isEndingTokenFor = function isEndingTokenFor(token, type) {
- if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {
- return true;
- }
- if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {
- return true;
- }
- return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;
- };
- var isLength = function isLength(token) {
- return token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;
- };
- var isLengthPercentage = function isLengthPercentage(token) {
- return token.type === TokenType.PERCENTAGE_TOKEN || isLength(token);
- };
- var parseLengthPercentageTuple = function parseLengthPercentageTuple(tokens) {
- return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];
- };
- var ZERO_LENGTH = {
- type: TokenType.NUMBER_TOKEN,
- number: 0,
- flags: FLAG_INTEGER };
- var FIFTY_PERCENT = {
- type: TokenType.PERCENTAGE_TOKEN,
- number: 50,
- flags: FLAG_INTEGER };
- var HUNDRED_PERCENT = {
- type: TokenType.PERCENTAGE_TOKEN,
- number: 100,
- flags: FLAG_INTEGER };
- var getAbsoluteValueForTuple = function getAbsoluteValueForTuple(tuple, width, height) {
- var x = tuple[0],y = tuple[1];
- return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];
- };
- var getAbsoluteValue = function getAbsoluteValue(token, parent) {
- if (token.type === TokenType.PERCENTAGE_TOKEN) {
- return token.number / 100 * parent;
- }
- if (isDimensionToken(token)) {
- switch (token.unit) {
- case 'rem':
- case 'em':
- return 16 * token.number; // TODO use correct font-size
- case 'px':
- default:
- return token.number;}
- }
- return token.number;
- };
- var DEG = 'deg';
- var GRAD = 'grad';
- var RAD = 'rad';
- var TURN = 'turn';
- var angle = {
- name: 'angle',
- parse: function parse(value) {
- if (value.type === TokenType.DIMENSION_TOKEN) {
- switch (value.unit) {
- case DEG:
- return Math.PI * value.number / 180;
- case GRAD:
- return Math.PI / 200 * value.number;
- case RAD:
- return value.number;
- case TURN:
- return Math.PI * 2 * value.number;}
- }
- throw new Error("Unsupported angle type");
- } };
- var isAngle = function isAngle(value) {
- if (value.type === TokenType.DIMENSION_TOKEN) {
- if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {
- return true;
- }
- }
- return false;
- };
- var parseNamedSide = function parseNamedSide(tokens) {
- var sideOrCorner = tokens.
- filter(isIdentToken).
- map(function (ident) {return ident.value;}).
- join(' ');
- switch (sideOrCorner) {
- case 'to bottom right':
- case 'to right bottom':
- case 'left top':
- case 'top left':
- return [ZERO_LENGTH, ZERO_LENGTH];
- case 'to top':
- case 'bottom':
- return deg(0);
- case 'to bottom left':
- case 'to left bottom':
- case 'right top':
- case 'top right':
- return [ZERO_LENGTH, HUNDRED_PERCENT];
- case 'to right':
- case 'left':
- return deg(90);
- case 'to top left':
- case 'to left top':
- case 'right bottom':
- case 'bottom right':
- return [HUNDRED_PERCENT, HUNDRED_PERCENT];
- case 'to bottom':
- case 'top':
- return deg(180);
- case 'to top right':
- case 'to right top':
- case 'left bottom':
- case 'bottom left':
- return [HUNDRED_PERCENT, ZERO_LENGTH];
- case 'to left':
- case 'right':
- return deg(270);}
- return 0;
- };
- var deg = function deg(_deg) {return Math.PI * _deg / 180;};
- var color = {
- name: 'color',
- parse: function parse(value) {
- if (value.type === TokenType.FUNCTION) {
- var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];
- if (typeof colorFunction === 'undefined') {
- throw new Error("Attempting to parse an unsupported color function \"" + value.name + "\"");
- }
- return colorFunction(value.values);
- }
- if (value.type === TokenType.HASH_TOKEN) {
- if (value.value.length === 3) {
- var r = value.value.substring(0, 1);
- var g = value.value.substring(1, 2);
- var b = value.value.substring(2, 3);
- return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);
- }
- if (value.value.length === 4) {
- var r = value.value.substring(0, 1);
- var g = value.value.substring(1, 2);
- var b = value.value.substring(2, 3);
- var a = value.value.substring(3, 4);
- return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255);
- }
- if (value.value.length === 6) {
- var r = value.value.substring(0, 2);
- var g = value.value.substring(2, 4);
- var b = value.value.substring(4, 6);
- return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);
- }
- if (value.value.length === 8) {
- var r = value.value.substring(0, 2);
- var g = value.value.substring(2, 4);
- var b = value.value.substring(4, 6);
- var a = value.value.substring(6, 8);
- return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);
- }
- }
- if (value.type === TokenType.IDENT_TOKEN) {
- var namedColor = COLORS[value.value.toUpperCase()];
- if (typeof namedColor !== 'undefined') {
- return namedColor;
- }
- }
- return COLORS.TRANSPARENT;
- } };
- var isTransparent = function isTransparent(color) {return (0xff & color) === 0;};
- var asString = function asString(color) {
- var alpha = 0xff & color;
- var blue = 0xff & color >> 8;
- var green = 0xff & color >> 16;
- var red = 0xff & color >> 24;
- return alpha < 255 ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" : "rgb(" + red + "," + green + "," + blue + ")";
- };
- var pack = function pack(r, g, b, a) {
- return (r << 24 | g << 16 | b << 8 | Math.round(a * 255) << 0) >>> 0;
- };
- var getTokenColorValue = function getTokenColorValue(token, i) {
- if (token.type === TokenType.NUMBER_TOKEN) {
- return token.number;
- }
- if (token.type === TokenType.PERCENTAGE_TOKEN) {
- var max = i === 3 ? 1 : 255;
- return i === 3 ? token.number / 100 * max : Math.round(token.number / 100 * max);
- }
- return 0;
- };
- var rgb = function rgb(args) {
- var tokens = args.filter(nonFunctionArgSeparator);
- if (tokens.length === 3) {
- var _a = tokens.map(getTokenColorValue),r = _a[0],g = _a[1],b = _a[2];
- return pack(r, g, b, 1);
- }
- if (tokens.length === 4) {
- var _b = tokens.map(getTokenColorValue),r = _b[0],g = _b[1],b = _b[2],a = _b[3];
- return pack(r, g, b, a);
- }
- return 0;
- };
- function hue2rgb(t1, t2, hue) {
- if (hue < 0) {
- hue += 1;
- }
- if (hue >= 1) {
- hue -= 1;
- }
- if (hue < 1 / 6) {
- return (t2 - t1) * hue * 6 + t1;
- } else
- if (hue < 1 / 2) {
- return t2;
- } else
- if (hue < 2 / 3) {
- return (t2 - t1) * 6 * (2 / 3 - hue) + t1;
- } else
- {
- return t1;
- }
- }
- var hsl = function hsl(args) {
- var tokens = args.filter(nonFunctionArgSeparator);
- var hue = tokens[0],saturation = tokens[1],lightness = tokens[2],alpha = tokens[3];
- var h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(hue)) / (Math.PI * 2);
- var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;
- var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;
- var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;
- if (s === 0) {
- return pack(l * 255, l * 255, l * 255, 1);
- }
- var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
- var t1 = l * 2 - t2;
- var r = hue2rgb(t1, t2, h + 1 / 3);
- var g = hue2rgb(t1, t2, h);
- var b = hue2rgb(t1, t2, h - 1 / 3);
- return pack(r * 255, g * 255, b * 255, a);
- };
- var SUPPORTED_COLOR_FUNCTIONS = {
- hsl: hsl,
- hsla: hsl,
- rgb: rgb,
- rgba: rgb };
- var COLORS = {
- ALICEBLUE: 0xf0f8ffff,
- ANTIQUEWHITE: 0xfaebd7ff,
- AQUA: 0x00ffffff,
- AQUAMARINE: 0x7fffd4ff,
- AZURE: 0xf0ffffff,
- BEIGE: 0xf5f5dcff,
- BISQUE: 0xffe4c4ff,
- BLACK: 0x000000ff,
- BLANCHEDALMOND: 0xffebcdff,
- BLUE: 0x0000ffff,
- BLUEVIOLET: 0x8a2be2ff,
- BROWN: 0xa52a2aff,
- BURLYWOOD: 0xdeb887ff,
- CADETBLUE: 0x5f9ea0ff,
- CHARTREUSE: 0x7fff00ff,
- CHOCOLATE: 0xd2691eff,
- CORAL: 0xff7f50ff,
- CORNFLOWERBLUE: 0x6495edff,
- CORNSILK: 0xfff8dcff,
- CRIMSON: 0xdc143cff,
- CYAN: 0x00ffffff,
- DARKBLUE: 0x00008bff,
- DARKCYAN: 0x008b8bff,
- DARKGOLDENROD: 0xb886bbff,
- DARKGRAY: 0xa9a9a9ff,
- DARKGREEN: 0x006400ff,
- DARKGREY: 0xa9a9a9ff,
- DARKKHAKI: 0xbdb76bff,
- DARKMAGENTA: 0x8b008bff,
- DARKOLIVEGREEN: 0x556b2fff,
- DARKORANGE: 0xff8c00ff,
- DARKORCHID: 0x9932ccff,
- DARKRED: 0x8b0000ff,
- DARKSALMON: 0xe9967aff,
- DARKSEAGREEN: 0x8fbc8fff,
- DARKSLATEBLUE: 0x483d8bff,
- DARKSLATEGRAY: 0x2f4f4fff,
- DARKSLATEGREY: 0x2f4f4fff,
- DARKTURQUOISE: 0x00ced1ff,
- DARKVIOLET: 0x9400d3ff,
- DEEPPINK: 0xff1493ff,
- DEEPSKYBLUE: 0x00bfffff,
- DIMGRAY: 0x696969ff,
- DIMGREY: 0x696969ff,
- DODGERBLUE: 0x1e90ffff,
- FIREBRICK: 0xb22222ff,
- FLORALWHITE: 0xfffaf0ff,
- FORESTGREEN: 0x228b22ff,
- FUCHSIA: 0xff00ffff,
- GAINSBORO: 0xdcdcdcff,
- GHOSTWHITE: 0xf8f8ffff,
- GOLD: 0xffd700ff,
- GOLDENROD: 0xdaa520ff,
- GRAY: 0x808080ff,
- GREEN: 0x008000ff,
- GREENYELLOW: 0xadff2fff,
- GREY: 0x808080ff,
- HONEYDEW: 0xf0fff0ff,
- HOTPINK: 0xff69b4ff,
- INDIANRED: 0xcd5c5cff,
- INDIGO: 0x4b0082ff,
- IVORY: 0xfffff0ff,
- KHAKI: 0xf0e68cff,
- LAVENDER: 0xe6e6faff,
- LAVENDERBLUSH: 0xfff0f5ff,
- LAWNGREEN: 0x7cfc00ff,
- LEMONCHIFFON: 0xfffacdff,
- LIGHTBLUE: 0xadd8e6ff,
- LIGHTCORAL: 0xf08080ff,
- LIGHTCYAN: 0xe0ffffff,
- LIGHTGOLDENRODYELLOW: 0xfafad2ff,
- LIGHTGRAY: 0xd3d3d3ff,
- LIGHTGREEN: 0x90ee90ff,
- LIGHTGREY: 0xd3d3d3ff,
- LIGHTPINK: 0xffb6c1ff,
- LIGHTSALMON: 0xffa07aff,
- LIGHTSEAGREEN: 0x20b2aaff,
- LIGHTSKYBLUE: 0x87cefaff,
- LIGHTSLATEGRAY: 0x778899ff,
- LIGHTSLATEGREY: 0x778899ff,
- LIGHTSTEELBLUE: 0xb0c4deff,
- LIGHTYELLOW: 0xffffe0ff,
- LIME: 0x00ff00ff,
- LIMEGREEN: 0x32cd32ff,
- LINEN: 0xfaf0e6ff,
- MAGENTA: 0xff00ffff,
- MAROON: 0x800000ff,
- MEDIUMAQUAMARINE: 0x66cdaaff,
- MEDIUMBLUE: 0x0000cdff,
- MEDIUMORCHID: 0xba55d3ff,
- MEDIUMPURPLE: 0x9370dbff,
- MEDIUMSEAGREEN: 0x3cb371ff,
- MEDIUMSLATEBLUE: 0x7b68eeff,
- MEDIUMSPRINGGREEN: 0x00fa9aff,
- MEDIUMTURQUOISE: 0x48d1ccff,
- MEDIUMVIOLETRED: 0xc71585ff,
- MIDNIGHTBLUE: 0x191970ff,
- MINTCREAM: 0xf5fffaff,
- MISTYROSE: 0xffe4e1ff,
- MOCCASIN: 0xffe4b5ff,
- NAVAJOWHITE: 0xffdeadff,
- NAVY: 0x000080ff,
- OLDLACE: 0xfdf5e6ff,
- OLIVE: 0x808000ff,
- OLIVEDRAB: 0x6b8e23ff,
- ORANGE: 0xffa500ff,
- ORANGERED: 0xff4500ff,
- ORCHID: 0xda70d6ff,
- PALEGOLDENROD: 0xeee8aaff,
- PALEGREEN: 0x98fb98ff,
- PALETURQUOISE: 0xafeeeeff,
- PALEVIOLETRED: 0xdb7093ff,
- PAPAYAWHIP: 0xffefd5ff,
- PEACHPUFF: 0xffdab9ff,
- PERU: 0xcd853fff,
- PINK: 0xffc0cbff,
- PLUM: 0xdda0ddff,
- POWDERBLUE: 0xb0e0e6ff,
- PURPLE: 0x800080ff,
- REBECCAPURPLE: 0x663399ff,
- RED: 0xff0000ff,
- ROSYBROWN: 0xbc8f8fff,
- ROYALBLUE: 0x4169e1ff,
- SADDLEBROWN: 0x8b4513ff,
- SALMON: 0xfa8072ff,
- SANDYBROWN: 0xf4a460ff,
- SEAGREEN: 0x2e8b57ff,
- SEASHELL: 0xfff5eeff,
- SIENNA: 0xa0522dff,
- SILVER: 0xc0c0c0ff,
- SKYBLUE: 0x87ceebff,
- SLATEBLUE: 0x6a5acdff,
- SLATEGRAY: 0x708090ff,
- SLATEGREY: 0x708090ff,
- SNOW: 0xfffafaff,
- SPRINGGREEN: 0x00ff7fff,
- STEELBLUE: 0x4682b4ff,
- TAN: 0xd2b48cff,
- TEAL: 0x008080ff,
- THISTLE: 0xd8bfd8ff,
- TOMATO: 0xff6347ff,
- TRANSPARENT: 0x00000000,
- TURQUOISE: 0x40e0d0ff,
- VIOLET: 0xee82eeff,
- WHEAT: 0xf5deb3ff,
- WHITE: 0xffffffff,
- WHITESMOKE: 0xf5f5f5ff,
- YELLOW: 0xffff00ff,
- YELLOWGREEN: 0x9acd32ff };
- var PropertyDescriptorParsingType;
- (function (PropertyDescriptorParsingType) {
- PropertyDescriptorParsingType[PropertyDescriptorParsingType["VALUE"] = 0] = "VALUE";
- PropertyDescriptorParsingType[PropertyDescriptorParsingType["LIST"] = 1] = "LIST";
- PropertyDescriptorParsingType[PropertyDescriptorParsingType["IDENT_VALUE"] = 2] = "IDENT_VALUE";
- PropertyDescriptorParsingType[PropertyDescriptorParsingType["TYPE_VALUE"] = 3] = "TYPE_VALUE";
- PropertyDescriptorParsingType[PropertyDescriptorParsingType["TOKEN_VALUE"] = 4] = "TOKEN_VALUE";
- })(PropertyDescriptorParsingType || (PropertyDescriptorParsingType = {}));
- var BACKGROUND_CLIP;
- (function (BACKGROUND_CLIP) {
- BACKGROUND_CLIP[BACKGROUND_CLIP["BORDER_BOX"] = 0] = "BORDER_BOX";
- BACKGROUND_CLIP[BACKGROUND_CLIP["PADDING_BOX"] = 1] = "PADDING_BOX";
- BACKGROUND_CLIP[BACKGROUND_CLIP["CONTENT_BOX"] = 2] = "CONTENT_BOX";
- })(BACKGROUND_CLIP || (BACKGROUND_CLIP = {}));
- var backgroundClip = {
- name: 'background-clip',
- initialValue: 'border-box',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return tokens.map(function (token) {
- if (isIdentToken(token)) {
- switch (token.value) {
- case 'padding-box':
- return BACKGROUND_CLIP.PADDING_BOX;
- case 'content-box':
- return BACKGROUND_CLIP.CONTENT_BOX;}
- }
- return BACKGROUND_CLIP.BORDER_BOX;
- });
- } };
- var backgroundColor = {
- name: "background-color",
- initialValue: 'transparent',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'color' };
- var parseColorStop = function parseColorStop(args) {
- var color$1 = color.parse(args[0]);
- var stop = args[1];
- return stop && isLengthPercentage(stop) ? { color: color$1, stop: stop } : { color: color$1, stop: null };
- };
- var processColorStops = function processColorStops(stops, lineLength) {
- var first = stops[0];
- var last = stops[stops.length - 1];
- if (first.stop === null) {
- first.stop = ZERO_LENGTH;
- }
- if (last.stop === null) {
- last.stop = HUNDRED_PERCENT;
- }
- var processStops = [];
- var previous = 0;
- for (var i = 0; i < stops.length; i++) {
- var stop_1 = stops[i].stop;
- if (stop_1 !== null) {
- var absoluteValue = getAbsoluteValue(stop_1, lineLength);
- if (absoluteValue > previous) {
- processStops.push(absoluteValue);
- } else
- {
- processStops.push(previous);
- }
- previous = absoluteValue;
- } else
- {
- processStops.push(null);
- }
- }
- var gapBegin = null;
- for (var i = 0; i < processStops.length; i++) {
- var stop_2 = processStops[i];
- if (stop_2 === null) {
- if (gapBegin === null) {
- gapBegin = i;
- }
- } else
- if (gapBegin !== null) {
- var gapLength = i - gapBegin;
- var beforeGap = processStops[gapBegin - 1];
- var gapValue = (stop_2 - beforeGap) / (gapLength + 1);
- for (var g = 1; g <= gapLength; g++) {
- processStops[gapBegin + g - 1] = gapValue * g;
- }
- gapBegin = null;
- }
- }
- return stops.map(function (_a, i) {
- var color = _a.color;
- return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) };
- });
- };
- var getAngleFromCorner = function getAngleFromCorner(corner, width, height) {
- var centerX = width / 2;
- var centerY = height / 2;
- var x = getAbsoluteValue(corner[0], width) - centerX;
- var y = centerY - getAbsoluteValue(corner[1], height);
- return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);
- };
- var calculateGradientDirection = function calculateGradientDirection(angle, width, height) {
- var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);
- var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));
- var halfWidth = width / 2;
- var halfHeight = height / 2;
- var halfLineLength = lineLength / 2;
- var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;
- var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;
- return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];
- };
- var distance = function distance(a, b) {return Math.sqrt(a * a + b * b);};
- var findCorner = function findCorner(width, height, x, y, closest) {
- var corners = [[0, 0], [0, height], [width, 0], [width, height]];
- return corners.reduce(function (stat, corner) {
- var cx = corner[0],cy = corner[1];
- var d = distance(x - cx, y - cy);
- if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {
- return {
- optimumCorner: corner,
- optimumDistance: d };
- }
- return stat;
- }, {
- optimumDistance: closest ? Infinity : -Infinity,
- optimumCorner: null }).
- optimumCorner;
- };
- var calculateRadius = function calculateRadius(gradient, x, y, width, height) {
- var rx = 0;
- var ry = 0;
- switch (gradient.size) {
- case CSSRadialExtent.CLOSEST_SIDE:
- // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.
- // If the shape is an ellipse, it exactly meets the closest side in each dimension.
- if (gradient.shape === CSSRadialShape.CIRCLE) {
- rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
- } else
- if (gradient.shape === CSSRadialShape.ELLIPSE) {
- rx = Math.min(Math.abs(x), Math.abs(x - width));
- ry = Math.min(Math.abs(y), Math.abs(y - height));
- }
- break;
- case CSSRadialExtent.CLOSEST_CORNER:
- // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.
- // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.
- if (gradient.shape === CSSRadialShape.CIRCLE) {
- rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
- } else
- if (gradient.shape === CSSRadialShape.ELLIPSE) {
- // Compute the ratio ry/rx (which is to be the same as for "closest-side")
- var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));
- var _a = findCorner(width, height, x, y, true),cx = _a[0],cy = _a[1];
- rx = distance(cx - x, (cy - y) / c);
- ry = c * rx;
- }
- break;
- case CSSRadialExtent.FARTHEST_SIDE:
- // Same as closest-side, except the ending shape is sized based on the farthest side(s)
- if (gradient.shape === CSSRadialShape.CIRCLE) {
- rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
- } else
- if (gradient.shape === CSSRadialShape.ELLIPSE) {
- rx = Math.max(Math.abs(x), Math.abs(x - width));
- ry = Math.max(Math.abs(y), Math.abs(y - height));
- }
- break;
- case CSSRadialExtent.FARTHEST_CORNER:
- // Same as closest-corner, except the ending shape is sized based on the farthest corner.
- // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.
- if (gradient.shape === CSSRadialShape.CIRCLE) {
- rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
- } else
- if (gradient.shape === CSSRadialShape.ELLIPSE) {
- // Compute the ratio ry/rx (which is to be the same as for "farthest-side")
- var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));
- var _b = findCorner(width, height, x, y, false),cx = _b[0],cy = _b[1];
- rx = distance(cx - x, (cy - y) / c);
- ry = c * rx;
- }
- break;}
- if (Array.isArray(gradient.size)) {
- rx = getAbsoluteValue(gradient.size[0], width);
- ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;
- }
- return [rx, ry];
- };
- var linearGradient = function linearGradient(tokens) {
- var angle$1 = deg(180);
- var stops = [];
- parseFunctionArgs(tokens).forEach(function (arg, i) {
- if (i === 0) {
- var firstToken = arg[0];
- if (firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {
- angle$1 = parseNamedSide(arg);
- return;
- } else
- if (isAngle(firstToken)) {
- angle$1 = angle.parse(firstToken);
- return;
- }
- }
- var colorStop = parseColorStop(arg);
- stops.push(colorStop);
- });
- return { angle: angle$1, stops: stops, type: CSSImageType.LINEAR_GRADIENT };
- };
- var prefixLinearGradient = function prefixLinearGradient(tokens) {
- var angle$1 = deg(180);
- var stops = [];
- parseFunctionArgs(tokens).forEach(function (arg, i) {
- if (i === 0) {
- var firstToken = arg[0];
- if (firstToken.type === TokenType.IDENT_TOKEN &&
- ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) {
- angle$1 = parseNamedSide(arg);
- return;
- } else
- if (isAngle(firstToken)) {
- angle$1 = (angle.parse(firstToken) + deg(270)) % deg(360);
- return;
- }
- }
- var colorStop = parseColorStop(arg);
- stops.push(colorStop);
- });
- return {
- angle: angle$1,
- stops: stops,
- type: CSSImageType.LINEAR_GRADIENT };
- };
- var testRangeBounds = function testRangeBounds(document) {
- var TEST_HEIGHT = 123;
- if (document.createRange) {
- var range = document.createRange();
- if (range.getBoundingClientRect) {
- var testElement = document.createElement('boundtest');
- testElement.style.height = TEST_HEIGHT + "px";
- testElement.style.display = 'block';
- document.body.appendChild(testElement);
- range.selectNode(testElement);
- var rangeBounds = range.getBoundingClientRect();
- var rangeHeight = Math.round(rangeBounds.height);
- document.body.removeChild(testElement);
- if (rangeHeight === TEST_HEIGHT) {
- return true;
- }
- }
- }
- return false;
- };
- var testCORS = function testCORS() {return typeof new Image().crossOrigin !== 'undefined';};
- var testResponseType = function testResponseType() {return typeof new XMLHttpRequest().responseType === 'string';};
- var testSVG = function testSVG(document) {
- var img = new Image();
- var canvas = document.createElement('canvas');
- var ctx = canvas.getContext('2d');
- if (!ctx) {
- return false;
- }
- img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
- try {
- ctx.drawImage(img, 0, 0);
- canvas.toDataURL();
- }
- catch (e) {
- return false;
- }
- return true;
- };
- var isGreenPixel = function isGreenPixel(data) {
- return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;
- };
- var testForeignObject = function testForeignObject(document) {
- var canvas = document.createElement('canvas');
- var size = 100;
- canvas.width = size;
- canvas.height = size;
- var ctx = canvas.getContext('2d');
- if (!ctx) {
- return Promise.reject(false);
- }
- ctx.fillStyle = 'rgb(0, 255, 0)';
- ctx.fillRect(0, 0, size, size);
- var img = new Image();
- var greenImageSrc = canvas.toDataURL();
- img.src = greenImageSrc;
- var svg = createForeignObjectSVG(size, size, 0, 0, img);
- ctx.fillStyle = 'red';
- ctx.fillRect(0, 0, size, size);
- return loadSerializedSVG(svg).
- then(function (img) {
- ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, size, size).data;
- ctx.fillStyle = 'red';
- ctx.fillRect(0, 0, size, size);
- var node = document.createElement('div');
- node.style.backgroundImage = "url(" + greenImageSrc + ")";
- node.style.height = size + "px";
- // Firefox 55 does not render inline <img /> tags
- return isGreenPixel(data) ?
- loadSerializedSVG(createForeignObjectSVG(size, size, 0, 0, node)) :
- Promise.reject(false);
- }).
- then(function (img) {
- ctx.drawImage(img, 0, 0);
- // Edge does not render background-images
- return isGreenPixel(ctx.getImageData(0, 0, size, size).data);
- }).
- catch(function () {return false;});
- };
- var createForeignObjectSVG = function createForeignObjectSVG(width, height, x, y, node) {
- var xmlns = 'http://www.w3.org/2000/svg';
- var svg = document.createElementNS(xmlns, 'svg');
- var foreignObject = document.createElementNS(xmlns, 'foreignObject');
- svg.setAttributeNS(null, 'width', width.toString());
- svg.setAttributeNS(null, 'height', height.toString());
- foreignObject.setAttributeNS(null, 'width', '100%');
- foreignObject.setAttributeNS(null, 'height', '100%');
- foreignObject.setAttributeNS(null, 'x', x.toString());
- foreignObject.setAttributeNS(null, 'y', y.toString());
- foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');
- svg.appendChild(foreignObject);
- foreignObject.appendChild(node);
- return svg;
- };
- var loadSerializedSVG = function loadSerializedSVG(svg) {
- return new Promise(function (resolve, reject) {
- var img = new Image();
- img.onload = function () {return resolve(img);};
- img.onerror = reject;
- img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));
- });
- };
- var FEATURES = {
- get SUPPORT_RANGE_BOUNDS() {
- var value = testRangeBounds(document);
- Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });
- return value;
- },
- get SUPPORT_SVG_DRAWING() {
- var value = testSVG(document);
- Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });
- return value;
- },
- get SUPPORT_FOREIGNOBJECT_DRAWING() {
- var value = typeof Array.from === 'function' && typeof window.fetch === 'function' ?
- testForeignObject(document) :
- Promise.resolve(false);
- Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });
- return value;
- },
- get SUPPORT_CORS_IMAGES() {
- var value = testCORS();
- Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });
- return value;
- },
- get SUPPORT_RESPONSE_TYPE() {
- var value = testResponseType();
- Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });
- return value;
- },
- get SUPPORT_CORS_XHR() {
- var value = ('withCredentials' in new XMLHttpRequest());
- Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });
- return value;
- } };
- var Logger = /** @class */function () {
- function Logger(_a) {
- var id = _a.id,enabled = _a.enabled;
- this.id = id;
- this.enabled = enabled;
- this.start = Date.now();
- }
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- Logger.prototype.debug = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this.enabled) {
- // eslint-disable-next-line no-console
- if (typeof window !== 'undefined' && window.console && typeof console.debug === 'function') {
- // eslint-disable-next-line no-console
- console.debug.apply(console, [this.id, this.getTime() + "ms"].concat(args));
- } else
- {
- this.info.apply(this, args);
- }
- }
- };
- Logger.prototype.getTime = function () {
- return Date.now() - this.start;
- };
- Logger.create = function (options) {
- Logger.instances[options.id] = new Logger(options);
- };
- Logger.destroy = function (id) {
- delete Logger.instances[id];
- };
- Logger.getInstance = function (id) {
- var instance = Logger.instances[id];
- if (typeof instance === 'undefined') {
- throw new Error("No logger instance found with id " + id);
- }
- return instance;
- };
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- Logger.prototype.info = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this.enabled) {
- // eslint-disable-next-line no-console
- if (typeof window !== 'undefined' && window.console && typeof console.info === 'function') {
- // eslint-disable-next-line no-console
- console.info.apply(console, [this.id, this.getTime() + "ms"].concat(args));
- }
- }
- };
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- Logger.prototype.error = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (this.enabled) {
- // eslint-disable-next-line no-console
- if (typeof window !== 'undefined' && window.console && typeof console.error === 'function') {
- // eslint-disable-next-line no-console
- console.error.apply(console, [this.id, this.getTime() + "ms"].concat(args));
- } else
- {
- this.info.apply(this, args);
- }
- }
- };
- Logger.instances = {};
- return Logger;
- }();
- var CacheStorage = /** @class */function () {
- function CacheStorage() {
- }
- CacheStorage.create = function (name, options) {
- return CacheStorage._caches[name] = new Cache(name, options);
- };
- CacheStorage.destroy = function (name) {
- delete CacheStorage._caches[name];
- };
- CacheStorage.open = function (name) {
- var cache = CacheStorage._caches[name];
- if (typeof cache !== 'undefined') {
- return cache;
- }
- throw new Error("Cache with key \"" + name + "\" not found");
- };
- CacheStorage.getOrigin = function (url) {
- var link = CacheStorage._link;
- if (!link) {
- return 'about:blank';
- }
- link.href = url;
- link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/
- return link.protocol + link.hostname + link.port;
- };
- CacheStorage.isSameOrigin = function (src) {
- return CacheStorage.getOrigin(src) === CacheStorage._origin;
- };
- CacheStorage.setContext = function (window) {
- CacheStorage._link = window.document.createElement('a');
- CacheStorage._origin = CacheStorage.getOrigin(window.location.href);
- };
- CacheStorage.getInstance = function () {
- var current = CacheStorage._current;
- if (current === null) {
- throw new Error("No cache instance attached");
- }
- return current;
- };
- CacheStorage.attachInstance = function (cache) {
- CacheStorage._current = cache;
- };
- CacheStorage.detachInstance = function () {
- CacheStorage._current = null;
- };
- CacheStorage._caches = {};
- CacheStorage._origin = 'about:blank';
- CacheStorage._current = null;
- return CacheStorage;
- }();
- var Cache = /** @class */function () {
- function Cache(id, options) {
- this.id = id;
- this._options = options;
- this._cache = {};
- }
- Cache.prototype.addImage = function (src) {
- var result = Promise.resolve();
- if (this.has(src)) {
- return result;
- }
- if (isBlobImage(src) || isRenderable(src)) {
- this._cache[src] = this.loadImage(src);
- return result;
- }
- return result;
- };
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- Cache.prototype.match = function (src) {
- return this._cache[src];
- };
- Cache.prototype.loadImage = function (key) {
- return __awaiter(this, void 0, void 0, function () {
- var isSameOrigin, useCORS, useProxy, src;
- var _this = this;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- isSameOrigin = CacheStorage.isSameOrigin(key);
- useCORS = !isInlineImage(key) && this._options.useCORS === true && FEATURES.SUPPORT_CORS_IMAGES && !isSameOrigin;
- useProxy = !isInlineImage(key) &&
- !isSameOrigin &&
- typeof this._options.proxy === 'string' &&
- FEATURES.SUPPORT_CORS_XHR &&
- !useCORS;
- if (!isSameOrigin && this._options.allowTaint === false && !isInlineImage(key) && !useProxy && !useCORS) {
- return [2 /*return*/];
- }
- src = key;
- if (!useProxy) return [3 /*break*/, 2];
- return [4 /*yield*/, this.proxy(src)];
- case 1:
- src = _a.sent();
- _a.label = 2;
- case 2:
- Logger.getInstance(this.id).debug("Added image " + key.substring(0, 256));
- return [4 /*yield*/, new Promise(function (resolve, reject) {
- var img = new Image();
- img.onload = function () {return resolve(img);};
- img.onerror = reject;
- //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous
- if (isInlineBase64Image(src) || useCORS) {
- img.crossOrigin = 'anonymous';
- }
- img.src = src;
- if (img.complete === true) {
- // Inline XML images may fail to parse, throwing an Error later on
- setTimeout(function () {return resolve(img);}, 500);
- }
- if (_this._options.imageTimeout > 0) {
- setTimeout(function () {return reject("Timed out (" + _this._options.imageTimeout + "ms) loading image");}, _this._options.imageTimeout);
- }
- })];
- case 3:return [2 /*return*/, _a.sent()];}
- });
- });
- };
- Cache.prototype.has = function (key) {
- return typeof this._cache[key] !== 'undefined';
- };
- Cache.prototype.keys = function () {
- return Promise.resolve(Object.keys(this._cache));
- };
- Cache.prototype.proxy = function (src) {
- var _this = this;
- var proxy = this._options.proxy;
- if (!proxy) {
- throw new Error('No proxy defined');
- }
- var key = src.substring(0, 256);
- return new Promise(function (resolve, reject) {
- var responseType = FEATURES.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';
- var xhr = new XMLHttpRequest();
- xhr.onload = function () {
- if (xhr.status === 200) {
- if (responseType === 'text') {
- resolve(xhr.response);
- } else
- {
- var reader_1 = new FileReader();
- reader_1.addEventListener('load', function () {return resolve(reader_1.result);}, false);
- reader_1.addEventListener('error', function (e) {return reject(e);}, false);
- reader_1.readAsDataURL(xhr.response);
- }
- } else
- {
- reject("Failed to proxy resource " + key + " with status code " + xhr.status);
- }
- };
- xhr.onerror = reject;
- xhr.open('GET', proxy + "?url=" + encodeURIComponent(src) + "&responseType=" + responseType);
- if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {
- xhr.responseType = responseType;
- }
- if (_this._options.imageTimeout) {
- var timeout_1 = _this._options.imageTimeout;
- xhr.timeout = timeout_1;
- xhr.ontimeout = function () {return reject("Timed out (" + timeout_1 + "ms) proxying " + key);};
- }
- xhr.send();
- });
- };
- return Cache;
- }();
- var INLINE_SVG = /^data:image\/svg\+xml/i;
- var INLINE_BASE64 = /^data:image\/.*;base64,/i;
- var INLINE_IMG = /^data:image\/.*/i;
- var isRenderable = function isRenderable(src) {return FEATURES.SUPPORT_SVG_DRAWING || !isSVG(src);};
- var isInlineImage = function isInlineImage(src) {return INLINE_IMG.test(src);};
- var isInlineBase64Image = function isInlineBase64Image(src) {return INLINE_BASE64.test(src);};
- var isBlobImage = function isBlobImage(src) {return src.substr(0, 4) === 'blob';};
- var isSVG = function isSVG(src) {return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src);};
- var webkitGradient = function webkitGradient(tokens) {
- var angle = deg(180);
- var stops = [];
- var type = CSSImageType.LINEAR_GRADIENT;
- var shape = CSSRadialShape.CIRCLE;
- var size = CSSRadialExtent.FARTHEST_CORNER;
- var position = [];
- parseFunctionArgs(tokens).forEach(function (arg, i) {
- var firstToken = arg[0];
- if (i === 0) {
- if (isIdentToken(firstToken) && firstToken.value === 'linear') {
- type = CSSImageType.LINEAR_GRADIENT;
- return;
- } else
- if (isIdentToken(firstToken) && firstToken.value === 'radial') {
- type = CSSImageType.RADIAL_GRADIENT;
- return;
- }
- }
- if (firstToken.type === TokenType.FUNCTION) {
- if (firstToken.name === 'from') {
- var color$1 = color.parse(firstToken.values[0]);
- stops.push({ stop: ZERO_LENGTH, color: color$1 });
- } else
- if (firstToken.name === 'to') {
- var color$1 = color.parse(firstToken.values[0]);
- stops.push({ stop: HUNDRED_PERCENT, color: color$1 });
- } else
- if (firstToken.name === 'color-stop') {
- var values = firstToken.values.filter(nonFunctionArgSeparator);
- if (values.length === 2) {
- var color$1 = color.parse(values[1]);
- var stop_1 = values[0];
- if (isNumberToken(stop_1)) {
- stops.push({
- stop: { type: TokenType.PERCENTAGE_TOKEN, number: stop_1.number * 100, flags: stop_1.flags },
- color: color$1 });
- }
- }
- }
- }
- });
- return type === CSSImageType.LINEAR_GRADIENT ?
- {
- angle: (angle + deg(180)) % deg(360),
- stops: stops,
- type: type } :
- { size: size, shape: shape, stops: stops, position: position, type: type };
- };
- var CLOSEST_SIDE = 'closest-side';
- var FARTHEST_SIDE = 'farthest-side';
- var CLOSEST_CORNER = 'closest-corner';
- var FARTHEST_CORNER = 'farthest-corner';
- var CIRCLE = 'circle';
- var ELLIPSE = 'ellipse';
- var COVER = 'cover';
- var CONTAIN = 'contain';
- var radialGradient = function radialGradient(tokens) {
- var shape = CSSRadialShape.CIRCLE;
- var size = CSSRadialExtent.FARTHEST_CORNER;
- var stops = [];
- var position = [];
- parseFunctionArgs(tokens).forEach(function (arg, i) {
- var isColorStop = true;
- if (i === 0) {
- var isAtPosition_1 = false;
- isColorStop = arg.reduce(function (acc, token) {
- if (isAtPosition_1) {
- if (isIdentToken(token)) {
- switch (token.value) {
- case 'center':
- position.push(FIFTY_PERCENT);
- return acc;
- case 'top':
- case 'left':
- position.push(ZERO_LENGTH);
- return acc;
- case 'right':
- case 'bottom':
- position.push(HUNDRED_PERCENT);
- return acc;}
- } else
- if (isLengthPercentage(token) || isLength(token)) {
- position.push(token);
- }
- } else
- if (isIdentToken(token)) {
- switch (token.value) {
- case CIRCLE:
- shape = CSSRadialShape.CIRCLE;
- return false;
- case ELLIPSE:
- shape = CSSRadialShape.ELLIPSE;
- return false;
- case 'at':
- isAtPosition_1 = true;
- return false;
- case CLOSEST_SIDE:
- size = CSSRadialExtent.CLOSEST_SIDE;
- return false;
- case COVER:
- case FARTHEST_SIDE:
- size = CSSRadialExtent.FARTHEST_SIDE;
- return false;
- case CONTAIN:
- case CLOSEST_CORNER:
- size = CSSRadialExtent.CLOSEST_CORNER;
- return false;
- case FARTHEST_CORNER:
- size = CSSRadialExtent.FARTHEST_CORNER;
- return false;}
- } else
- if (isLength(token) || isLengthPercentage(token)) {
- if (!Array.isArray(size)) {
- size = [];
- }
- size.push(token);
- return false;
- }
- return acc;
- }, isColorStop);
- }
- if (isColorStop) {
- var colorStop = parseColorStop(arg);
- stops.push(colorStop);
- }
- });
- return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
- };
- var prefixRadialGradient = function prefixRadialGradient(tokens) {
- var shape = CSSRadialShape.CIRCLE;
- var size = CSSRadialExtent.FARTHEST_CORNER;
- var stops = [];
- var position = [];
- parseFunctionArgs(tokens).forEach(function (arg, i) {
- var isColorStop = true;
- if (i === 0) {
- isColorStop = arg.reduce(function (acc, token) {
- if (isIdentToken(token)) {
- switch (token.value) {
- case 'center':
- position.push(FIFTY_PERCENT);
- return false;
- case 'top':
- case 'left':
- position.push(ZERO_LENGTH);
- return false;
- case 'right':
- case 'bottom':
- position.push(HUNDRED_PERCENT);
- return false;}
- } else
- if (isLengthPercentage(token) || isLength(token)) {
- position.push(token);
- return false;
- }
- return acc;
- }, isColorStop);
- } else
- if (i === 1) {
- isColorStop = arg.reduce(function (acc, token) {
- if (isIdentToken(token)) {
- switch (token.value) {
- case CIRCLE:
- shape = CSSRadialShape.CIRCLE;
- return false;
- case ELLIPSE:
- shape = CSSRadialShape.ELLIPSE;
- return false;
- case CONTAIN:
- case CLOSEST_SIDE:
- size = CSSRadialExtent.CLOSEST_SIDE;
- return false;
- case FARTHEST_SIDE:
- size = CSSRadialExtent.FARTHEST_SIDE;
- return false;
- case CLOSEST_CORNER:
- size = CSSRadialExtent.CLOSEST_CORNER;
- return false;
- case COVER:
- case FARTHEST_CORNER:
- size = CSSRadialExtent.FARTHEST_CORNER;
- return false;}
- } else
- if (isLength(token) || isLengthPercentage(token)) {
- if (!Array.isArray(size)) {
- size = [];
- }
- size.push(token);
- return false;
- }
- return acc;
- }, isColorStop);
- }
- if (isColorStop) {
- var colorStop = parseColorStop(arg);
- stops.push(colorStop);
- }
- });
- return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
- };
- var CSSImageType;
- (function (CSSImageType) {
- CSSImageType[CSSImageType["URL"] = 0] = "URL";
- CSSImageType[CSSImageType["LINEAR_GRADIENT"] = 1] = "LINEAR_GRADIENT";
- CSSImageType[CSSImageType["RADIAL_GRADIENT"] = 2] = "RADIAL_GRADIENT";
- })(CSSImageType || (CSSImageType = {}));
- var isLinearGradient = function isLinearGradient(background) {
- return background.type === CSSImageType.LINEAR_GRADIENT;
- };
- var isRadialGradient = function isRadialGradient(background) {
- return background.type === CSSImageType.RADIAL_GRADIENT;
- };
- var CSSRadialShape;
- (function (CSSRadialShape) {
- CSSRadialShape[CSSRadialShape["CIRCLE"] = 0] = "CIRCLE";
- CSSRadialShape[CSSRadialShape["ELLIPSE"] = 1] = "ELLIPSE";
- })(CSSRadialShape || (CSSRadialShape = {}));
- var CSSRadialExtent;
- (function (CSSRadialExtent) {
- CSSRadialExtent[CSSRadialExtent["CLOSEST_SIDE"] = 0] = "CLOSEST_SIDE";
- CSSRadialExtent[CSSRadialExtent["FARTHEST_SIDE"] = 1] = "FARTHEST_SIDE";
- CSSRadialExtent[CSSRadialExtent["CLOSEST_CORNER"] = 2] = "CLOSEST_CORNER";
- CSSRadialExtent[CSSRadialExtent["FARTHEST_CORNER"] = 3] = "FARTHEST_CORNER";
- })(CSSRadialExtent || (CSSRadialExtent = {}));
- var image = {
- name: 'image',
- parse: function parse(value) {
- if (value.type === TokenType.URL_TOKEN) {
- var image_1 = { url: value.value, type: CSSImageType.URL };
- CacheStorage.getInstance().addImage(value.value);
- return image_1;
- }
- if (value.type === TokenType.FUNCTION) {
- var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];
- if (typeof imageFunction === 'undefined') {
- throw new Error("Attempting to parse an unsupported image function \"" + value.name + "\"");
- }
- return imageFunction(value.values);
- }
- throw new Error("Unsupported image type");
- } };
- function isSupportedImage(value) {
- return value.type !== TokenType.FUNCTION || SUPPORTED_IMAGE_FUNCTIONS[value.name];
- }
- var SUPPORTED_IMAGE_FUNCTIONS = {
- 'linear-gradient': linearGradient,
- '-moz-linear-gradient': prefixLinearGradient,
- '-ms-linear-gradient': prefixLinearGradient,
- '-o-linear-gradient': prefixLinearGradient,
- '-webkit-linear-gradient': prefixLinearGradient,
- 'radial-gradient': radialGradient,
- '-moz-radial-gradient': prefixRadialGradient,
- '-ms-radial-gradient': prefixRadialGradient,
- '-o-radial-gradient': prefixRadialGradient,
- '-webkit-radial-gradient': prefixRadialGradient,
- '-webkit-gradient': webkitGradient };
- var backgroundImage = {
- name: 'background-image',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- if (tokens.length === 0) {
- return [];
- }
- var first = tokens[0];
- if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
- return [];
- }
- return tokens.filter(function (value) {return nonFunctionArgSeparator(value) && isSupportedImage(value);}).map(image.parse);
- } };
- var backgroundOrigin = {
- name: 'background-origin',
- initialValue: 'border-box',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return tokens.map(function (token) {
- if (isIdentToken(token)) {
- switch (token.value) {
- case 'padding-box':
- return 1 /* PADDING_BOX */;
- case 'content-box':
- return 2 /* CONTENT_BOX */;}
- }
- return 0 /* BORDER_BOX */;
- });
- } };
- var backgroundPosition = {
- name: 'background-position',
- initialValue: '0% 0%',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- return parseFunctionArgs(tokens).
- map(function (values) {return values.filter(isLengthPercentage);}).
- map(parseLengthPercentageTuple);
- } };
- var BACKGROUND_REPEAT;
- (function (BACKGROUND_REPEAT) {
- BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT"] = 0] = "REPEAT";
- BACKGROUND_REPEAT[BACKGROUND_REPEAT["NO_REPEAT"] = 1] = "NO_REPEAT";
- BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_X"] = 2] = "REPEAT_X";
- BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_Y"] = 3] = "REPEAT_Y";
- })(BACKGROUND_REPEAT || (BACKGROUND_REPEAT = {}));
- var backgroundRepeat = {
- name: 'background-repeat',
- initialValue: 'repeat',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return parseFunctionArgs(tokens).
- map(function (values) {
- return values.
- filter(isIdentToken).
- map(function (token) {return token.value;}).
- join(' ');
- }).
- map(parseBackgroundRepeat);
- } };
- var parseBackgroundRepeat = function parseBackgroundRepeat(value) {
- switch (value) {
- case 'no-repeat':
- return BACKGROUND_REPEAT.NO_REPEAT;
- case 'repeat-x':
- case 'repeat no-repeat':
- return BACKGROUND_REPEAT.REPEAT_X;
- case 'repeat-y':
- case 'no-repeat repeat':
- return BACKGROUND_REPEAT.REPEAT_Y;
- case 'repeat':
- default:
- return BACKGROUND_REPEAT.REPEAT;}
- };
- var BACKGROUND_SIZE;
- (function (BACKGROUND_SIZE) {
- BACKGROUND_SIZE["AUTO"] = "auto";
- BACKGROUND_SIZE["CONTAIN"] = "contain";
- BACKGROUND_SIZE["COVER"] = "cover";
- })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {}));
- var backgroundSize = {
- name: 'background-size',
- initialValue: '0',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return parseFunctionArgs(tokens).map(function (values) {return values.filter(isBackgroundSizeInfoToken);});
- } };
- var isBackgroundSizeInfoToken = function isBackgroundSizeInfoToken(value) {
- return isIdentToken(value) || isLengthPercentage(value);
- };
- var borderColorForSide = function borderColorForSide(side) {return {
- name: "border-" + side + "-color",
- initialValue: 'transparent',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'color' };
- };
- var borderTopColor = borderColorForSide('top');
- var borderRightColor = borderColorForSide('right');
- var borderBottomColor = borderColorForSide('bottom');
- var borderLeftColor = borderColorForSide('left');
- var borderRadiusForSide = function borderRadiusForSide(side) {return {
- name: "border-radius-" + side,
- initialValue: '0 0',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {return parseLengthPercentageTuple(tokens.filter(isLengthPercentage));} };
- };
- var borderTopLeftRadius = borderRadiusForSide('top-left');
- var borderTopRightRadius = borderRadiusForSide('top-right');
- var borderBottomRightRadius = borderRadiusForSide('bottom-right');
- var borderBottomLeftRadius = borderRadiusForSide('bottom-left');
- var BORDER_STYLE;
- (function (BORDER_STYLE) {
- BORDER_STYLE[BORDER_STYLE["NONE"] = 0] = "NONE";
- BORDER_STYLE[BORDER_STYLE["SOLID"] = 1] = "SOLID";
- })(BORDER_STYLE || (BORDER_STYLE = {}));
- var borderStyleForSide = function borderStyleForSide(side) {return {
- name: "border-" + side + "-style",
- initialValue: 'solid',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(style) {
- switch (style) {
- case 'none':
- return BORDER_STYLE.NONE;}
- return BORDER_STYLE.SOLID;
- } };
- };
- var borderTopStyle = borderStyleForSide('top');
- var borderRightStyle = borderStyleForSide('right');
- var borderBottomStyle = borderStyleForSide('bottom');
- var borderLeftStyle = borderStyleForSide('left');
- var borderWidthForSide = function borderWidthForSide(side) {return {
- name: "border-" + side + "-width",
- initialValue: '0',
- type: PropertyDescriptorParsingType.VALUE,
- prefix: false,
- parse: function parse(token) {
- if (isDimensionToken(token)) {
- return token.number;
- }
- return 0;
- } };
- };
- var borderTopWidth = borderWidthForSide('top');
- var borderRightWidth = borderWidthForSide('right');
- var borderBottomWidth = borderWidthForSide('bottom');
- var borderLeftWidth = borderWidthForSide('left');
- var color$1 = {
- name: "color",
- initialValue: 'transparent',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'color' };
- var display = {
- name: 'display',
- initialValue: 'inline-block',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return tokens.filter(isIdentToken).reduce(function (bit, token) {
- return bit | parseDisplayValue(token.value);
- }, 0 /* NONE */);
- } };
- var parseDisplayValue = function parseDisplayValue(display) {
- switch (display) {
- case 'block':
- return 2 /* BLOCK */;
- case 'inline':
- return 4 /* INLINE */;
- case 'run-in':
- return 8 /* RUN_IN */;
- case 'flow':
- return 16 /* FLOW */;
- case 'flow-root':
- return 32 /* FLOW_ROOT */;
- case 'table':
- return 64 /* TABLE */;
- case 'flex':
- case '-webkit-flex':
- return 128 /* FLEX */;
- case 'grid':
- case '-ms-grid':
- return 256 /* GRID */;
- case 'ruby':
- return 512 /* RUBY */;
- case 'subgrid':
- return 1024 /* SUBGRID */;
- case 'list-item':
- return 2048 /* LIST_ITEM */;
- case 'table-row-group':
- return 4096 /* TABLE_ROW_GROUP */;
- case 'table-header-group':
- return 8192 /* TABLE_HEADER_GROUP */;
- case 'table-footer-group':
- return 16384 /* TABLE_FOOTER_GROUP */;
- case 'table-row':
- return 32768 /* TABLE_ROW */;
- case 'table-cell':
- return 65536 /* TABLE_CELL */;
- case 'table-column-group':
- return 131072 /* TABLE_COLUMN_GROUP */;
- case 'table-column':
- return 262144 /* TABLE_COLUMN */;
- case 'table-caption':
- return 524288 /* TABLE_CAPTION */;
- case 'ruby-base':
- return 1048576 /* RUBY_BASE */;
- case 'ruby-text':
- return 2097152 /* RUBY_TEXT */;
- case 'ruby-base-container':
- return 4194304 /* RUBY_BASE_CONTAINER */;
- case 'ruby-text-container':
- return 8388608 /* RUBY_TEXT_CONTAINER */;
- case 'contents':
- return 16777216 /* CONTENTS */;
- case 'inline-block':
- return 33554432 /* INLINE_BLOCK */;
- case 'inline-list-item':
- return 67108864 /* INLINE_LIST_ITEM */;
- case 'inline-table':
- return 134217728 /* INLINE_TABLE */;
- case 'inline-flex':
- return 268435456 /* INLINE_FLEX */;
- case 'inline-grid':
- return 536870912 /* INLINE_GRID */;}
- return 0 /* NONE */;
- };
- var FLOAT;
- (function (FLOAT) {
- FLOAT[FLOAT["NONE"] = 0] = "NONE";
- FLOAT[FLOAT["LEFT"] = 1] = "LEFT";
- FLOAT[FLOAT["RIGHT"] = 2] = "RIGHT";
- FLOAT[FLOAT["INLINE_START"] = 3] = "INLINE_START";
- FLOAT[FLOAT["INLINE_END"] = 4] = "INLINE_END";
- })(FLOAT || (FLOAT = {}));
- var _float = {
- name: 'float',
- initialValue: 'none',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(_float2) {
- switch (_float2) {
- case 'left':
- return FLOAT.LEFT;
- case 'right':
- return FLOAT.RIGHT;
- case 'inline-start':
- return FLOAT.INLINE_START;
- case 'inline-end':
- return FLOAT.INLINE_END;}
- return FLOAT.NONE;
- } };
- var letterSpacing = {
- name: 'letter-spacing',
- initialValue: '0',
- prefix: false,
- type: PropertyDescriptorParsingType.VALUE,
- parse: function parse(token) {
- if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {
- return 0;
- }
- if (token.type === TokenType.NUMBER_TOKEN) {
- return token.number;
- }
- if (token.type === TokenType.DIMENSION_TOKEN) {
- return token.number;
- }
- return 0;
- } };
- var LINE_BREAK;
- (function (LINE_BREAK) {
- LINE_BREAK["NORMAL"] = "normal";
- LINE_BREAK["STRICT"] = "strict";
- })(LINE_BREAK || (LINE_BREAK = {}));
- var lineBreak = {
- name: 'line-break',
- initialValue: 'normal',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(lineBreak) {
- switch (lineBreak) {
- case 'strict':
- return LINE_BREAK.STRICT;
- case 'normal':
- default:
- return LINE_BREAK.NORMAL;}
- } };
- var lineHeight = {
- name: 'line-height',
- initialValue: 'normal',
- prefix: false,
- type: PropertyDescriptorParsingType.TOKEN_VALUE };
- var computeLineHeight = function computeLineHeight(token, fontSize) {
- if (isIdentToken(token) && token.value === 'normal') {
- return 1.2 * fontSize;
- } else
- if (token.type === TokenType.NUMBER_TOKEN) {
- return fontSize * token.number;
- } else
- if (isLengthPercentage(token)) {
- return getAbsoluteValue(token, fontSize);
- }
- return fontSize;
- };
- var listStyleImage = {
- name: 'list-style-image',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.VALUE,
- prefix: false,
- parse: function parse(token) {
- if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
- return null;
- }
- return image.parse(token);
- } };
- var LIST_STYLE_POSITION;
- (function (LIST_STYLE_POSITION) {
- LIST_STYLE_POSITION[LIST_STYLE_POSITION["INSIDE"] = 0] = "INSIDE";
- LIST_STYLE_POSITION[LIST_STYLE_POSITION["OUTSIDE"] = 1] = "OUTSIDE";
- })(LIST_STYLE_POSITION || (LIST_STYLE_POSITION = {}));
- var listStylePosition = {
- name: 'list-style-position',
- initialValue: 'outside',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(position) {
- switch (position) {
- case 'inside':
- return LIST_STYLE_POSITION.INSIDE;
- case 'outside':
- default:
- return LIST_STYLE_POSITION.OUTSIDE;}
- } };
- var LIST_STYLE_TYPE;
- (function (LIST_STYLE_TYPE) {
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["NONE"] = -1] = "NONE";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISC"] = 0] = "DISC";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CIRCLE"] = 1] = "CIRCLE";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["SQUARE"] = 2] = "SQUARE";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL"] = 3] = "DECIMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_DECIMAL"] = 4] = "CJK_DECIMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL_LEADING_ZERO"] = 5] = "DECIMAL_LEADING_ZERO";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ROMAN"] = 6] = "LOWER_ROMAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ROMAN"] = 7] = "UPPER_ROMAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_GREEK"] = 8] = "LOWER_GREEK";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ALPHA"] = 9] = "LOWER_ALPHA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ALPHA"] = 10] = "UPPER_ALPHA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARABIC_INDIC"] = 11] = "ARABIC_INDIC";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARMENIAN"] = 12] = "ARMENIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["BENGALI"] = 13] = "BENGALI";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CAMBODIAN"] = 14] = "CAMBODIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_EARTHLY_BRANCH"] = 15] = "CJK_EARTHLY_BRANCH";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_HEAVENLY_STEM"] = 16] = "CJK_HEAVENLY_STEM";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_IDEOGRAPHIC"] = 17] = "CJK_IDEOGRAPHIC";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DEVANAGARI"] = 18] = "DEVANAGARI";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["ETHIOPIC_NUMERIC"] = 19] = "ETHIOPIC_NUMERIC";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["GEORGIAN"] = 20] = "GEORGIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["GUJARATI"] = 21] = "GUJARATI";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["GURMUKHI"] = 22] = "GURMUKHI";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["HEBREW"] = 22] = "HEBREW";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA"] = 23] = "HIRAGANA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA_IROHA"] = 24] = "HIRAGANA_IROHA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_FORMAL"] = 25] = "JAPANESE_FORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_INFORMAL"] = 26] = "JAPANESE_INFORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KANNADA"] = 27] = "KANNADA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA"] = 28] = "KATAKANA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA_IROHA"] = 29] = "KATAKANA_IROHA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KHMER"] = 30] = "KHMER";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANGUL_FORMAL"] = 31] = "KOREAN_HANGUL_FORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_FORMAL"] = 32] = "KOREAN_HANJA_FORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_INFORMAL"] = 33] = "KOREAN_HANJA_INFORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["LAO"] = 34] = "LAO";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ARMENIAN"] = 35] = "LOWER_ARMENIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["MALAYALAM"] = 36] = "MALAYALAM";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["MONGOLIAN"] = 37] = "MONGOLIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["MYANMAR"] = 38] = "MYANMAR";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["ORIYA"] = 39] = "ORIYA";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["PERSIAN"] = 40] = "PERSIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_FORMAL"] = 41] = "SIMP_CHINESE_FORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_INFORMAL"] = 42] = "SIMP_CHINESE_INFORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["TAMIL"] = 43] = "TAMIL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["TELUGU"] = 44] = "TELUGU";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["THAI"] = 45] = "THAI";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["TIBETAN"] = 46] = "TIBETAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_FORMAL"] = 47] = "TRAD_CHINESE_FORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_INFORMAL"] = 48] = "TRAD_CHINESE_INFORMAL";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ARMENIAN"] = 49] = "UPPER_ARMENIAN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_OPEN"] = 50] = "DISCLOSURE_OPEN";
- LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_CLOSED"] = 51] = "DISCLOSURE_CLOSED";
- })(LIST_STYLE_TYPE || (LIST_STYLE_TYPE = {}));
- var listStyleType = {
- name: 'list-style-type',
- initialValue: 'none',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(type) {
- switch (type) {
- case 'disc':
- return LIST_STYLE_TYPE.DISC;
- case 'circle':
- return LIST_STYLE_TYPE.CIRCLE;
- case 'square':
- return LIST_STYLE_TYPE.SQUARE;
- case 'decimal':
- return LIST_STYLE_TYPE.DECIMAL;
- case 'cjk-decimal':
- return LIST_STYLE_TYPE.CJK_DECIMAL;
- case 'decimal-leading-zero':
- return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;
- case 'lower-roman':
- return LIST_STYLE_TYPE.LOWER_ROMAN;
- case 'upper-roman':
- return LIST_STYLE_TYPE.UPPER_ROMAN;
- case 'lower-greek':
- return LIST_STYLE_TYPE.LOWER_GREEK;
- case 'lower-alpha':
- return LIST_STYLE_TYPE.LOWER_ALPHA;
- case 'upper-alpha':
- return LIST_STYLE_TYPE.UPPER_ALPHA;
- case 'arabic-indic':
- return LIST_STYLE_TYPE.ARABIC_INDIC;
- case 'armenian':
- return LIST_STYLE_TYPE.ARMENIAN;
- case 'bengali':
- return LIST_STYLE_TYPE.BENGALI;
- case 'cambodian':
- return LIST_STYLE_TYPE.CAMBODIAN;
- case 'cjk-earthly-branch':
- return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;
- case 'cjk-heavenly-stem':
- return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;
- case 'cjk-ideographic':
- return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;
- case 'devanagari':
- return LIST_STYLE_TYPE.DEVANAGARI;
- case 'ethiopic-numeric':
- return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;
- case 'georgian':
- return LIST_STYLE_TYPE.GEORGIAN;
- case 'gujarati':
- return LIST_STYLE_TYPE.GUJARATI;
- case 'gurmukhi':
- return LIST_STYLE_TYPE.GURMUKHI;
- case 'hebrew':
- return LIST_STYLE_TYPE.HEBREW;
- case 'hiragana':
- return LIST_STYLE_TYPE.HIRAGANA;
- case 'hiragana-iroha':
- return LIST_STYLE_TYPE.HIRAGANA_IROHA;
- case 'japanese-formal':
- return LIST_STYLE_TYPE.JAPANESE_FORMAL;
- case 'japanese-informal':
- return LIST_STYLE_TYPE.JAPANESE_INFORMAL;
- case 'kannada':
- return LIST_STYLE_TYPE.KANNADA;
- case 'katakana':
- return LIST_STYLE_TYPE.KATAKANA;
- case 'katakana-iroha':
- return LIST_STYLE_TYPE.KATAKANA_IROHA;
- case 'khmer':
- return LIST_STYLE_TYPE.KHMER;
- case 'korean-hangul-formal':
- return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;
- case 'korean-hanja-formal':
- return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;
- case 'korean-hanja-informal':
- return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;
- case 'lao':
- return LIST_STYLE_TYPE.LAO;
- case 'lower-armenian':
- return LIST_STYLE_TYPE.LOWER_ARMENIAN;
- case 'malayalam':
- return LIST_STYLE_TYPE.MALAYALAM;
- case 'mongolian':
- return LIST_STYLE_TYPE.MONGOLIAN;
- case 'myanmar':
- return LIST_STYLE_TYPE.MYANMAR;
- case 'oriya':
- return LIST_STYLE_TYPE.ORIYA;
- case 'persian':
- return LIST_STYLE_TYPE.PERSIAN;
- case 'simp-chinese-formal':
- return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;
- case 'simp-chinese-informal':
- return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;
- case 'tamil':
- return LIST_STYLE_TYPE.TAMIL;
- case 'telugu':
- return LIST_STYLE_TYPE.TELUGU;
- case 'thai':
- return LIST_STYLE_TYPE.THAI;
- case 'tibetan':
- return LIST_STYLE_TYPE.TIBETAN;
- case 'trad-chinese-formal':
- return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;
- case 'trad-chinese-informal':
- return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;
- case 'upper-armenian':
- return LIST_STYLE_TYPE.UPPER_ARMENIAN;
- case 'disclosure-open':
- return LIST_STYLE_TYPE.DISCLOSURE_OPEN;
- case 'disclosure-closed':
- return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;
- case 'none':
- default:
- return LIST_STYLE_TYPE.NONE;}
- } };
- var marginForSide = function marginForSide(side) {return {
- name: "margin-" + side,
- initialValue: '0',
- prefix: false,
- type: PropertyDescriptorParsingType.TOKEN_VALUE };
- };
- var marginTop = marginForSide('top');
- var marginRight = marginForSide('right');
- var marginBottom = marginForSide('bottom');
- var marginLeft = marginForSide('left');
- var OVERFLOW;
- (function (OVERFLOW) {
- OVERFLOW[OVERFLOW["VISIBLE"] = 0] = "VISIBLE";
- OVERFLOW[OVERFLOW["HIDDEN"] = 1] = "HIDDEN";
- OVERFLOW[OVERFLOW["SCROLL"] = 2] = "SCROLL";
- OVERFLOW[OVERFLOW["AUTO"] = 3] = "AUTO";
- })(OVERFLOW || (OVERFLOW = {}));
- var overflow = {
- name: 'overflow',
- initialValue: 'visible',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return tokens.filter(isIdentToken).map(function (overflow) {
- switch (overflow.value) {
- case 'hidden':
- return OVERFLOW.HIDDEN;
- case 'scroll':
- return OVERFLOW.SCROLL;
- case 'auto':
- return OVERFLOW.AUTO;
- case 'visible':
- default:
- return OVERFLOW.VISIBLE;}
- });
- } };
- var OVERFLOW_WRAP;
- (function (OVERFLOW_WRAP) {
- OVERFLOW_WRAP["NORMAL"] = "normal";
- OVERFLOW_WRAP["BREAK_WORD"] = "break-word";
- })(OVERFLOW_WRAP || (OVERFLOW_WRAP = {}));
- var overflowWrap = {
- name: 'overflow-wrap',
- initialValue: 'normal',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(overflow) {
- switch (overflow) {
- case 'break-word':
- return OVERFLOW_WRAP.BREAK_WORD;
- case 'normal':
- default:
- return OVERFLOW_WRAP.NORMAL;}
- } };
- var paddingForSide = function paddingForSide(side) {return {
- name: "padding-" + side,
- initialValue: '0',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'length-percentage' };
- };
- var paddingTop = paddingForSide('top');
- var paddingRight = paddingForSide('right');
- var paddingBottom = paddingForSide('bottom');
- var paddingLeft = paddingForSide('left');
- var TEXT_ALIGN;
- (function (TEXT_ALIGN) {
- TEXT_ALIGN[TEXT_ALIGN["LEFT"] = 0] = "LEFT";
- TEXT_ALIGN[TEXT_ALIGN["CENTER"] = 1] = "CENTER";
- TEXT_ALIGN[TEXT_ALIGN["RIGHT"] = 2] = "RIGHT";
- })(TEXT_ALIGN || (TEXT_ALIGN = {}));
- var textAlign = {
- name: 'text-align',
- initialValue: 'left',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(textAlign) {
- switch (textAlign) {
- case 'right':
- return TEXT_ALIGN.RIGHT;
- case 'center':
- case 'justify':
- return TEXT_ALIGN.CENTER;
- case 'left':
- default:
- return TEXT_ALIGN.LEFT;}
- } };
- var POSITION;
- (function (POSITION) {
- POSITION[POSITION["STATIC"] = 0] = "STATIC";
- POSITION[POSITION["RELATIVE"] = 1] = "RELATIVE";
- POSITION[POSITION["ABSOLUTE"] = 2] = "ABSOLUTE";
- POSITION[POSITION["FIXED"] = 3] = "FIXED";
- POSITION[POSITION["STICKY"] = 4] = "STICKY";
- })(POSITION || (POSITION = {}));
- var position = {
- name: 'position',
- initialValue: 'static',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(position) {
- switch (position) {
- case 'relative':
- return POSITION.RELATIVE;
- case 'absolute':
- return POSITION.ABSOLUTE;
- case 'fixed':
- return POSITION.FIXED;
- case 'sticky':
- return POSITION.STICKY;}
- return POSITION.STATIC;
- } };
- var textShadow = {
- name: 'text-shadow',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
- return [];
- }
- return parseFunctionArgs(tokens).map(function (values) {
- var shadow = {
- color: COLORS.TRANSPARENT,
- offsetX: ZERO_LENGTH,
- offsetY: ZERO_LENGTH,
- blur: ZERO_LENGTH };
- var c = 0;
- for (var i = 0; i < values.length; i++) {
- var token = values[i];
- if (isLength(token)) {
- if (c === 0) {
- shadow.offsetX = token;
- } else
- if (c === 1) {
- shadow.offsetY = token;
- } else
- {
- shadow.blur = token;
- }
- c++;
- } else
- {
- shadow.color = color.parse(token);
- }
- }
- return shadow;
- });
- } };
- var TEXT_TRANSFORM;
- (function (TEXT_TRANSFORM) {
- TEXT_TRANSFORM[TEXT_TRANSFORM["NONE"] = 0] = "NONE";
- TEXT_TRANSFORM[TEXT_TRANSFORM["LOWERCASE"] = 1] = "LOWERCASE";
- TEXT_TRANSFORM[TEXT_TRANSFORM["UPPERCASE"] = 2] = "UPPERCASE";
- TEXT_TRANSFORM[TEXT_TRANSFORM["CAPITALIZE"] = 3] = "CAPITALIZE";
- })(TEXT_TRANSFORM || (TEXT_TRANSFORM = {}));
- var textTransform = {
- name: 'text-transform',
- initialValue: 'none',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(textTransform) {
- switch (textTransform) {
- case 'uppercase':
- return TEXT_TRANSFORM.UPPERCASE;
- case 'lowercase':
- return TEXT_TRANSFORM.LOWERCASE;
- case 'capitalize':
- return TEXT_TRANSFORM.CAPITALIZE;}
- return TEXT_TRANSFORM.NONE;
- } };
- var transform = {
- name: 'transform',
- initialValue: 'none',
- prefix: true,
- type: PropertyDescriptorParsingType.VALUE,
- parse: function parse(token) {
- if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
- return null;
- }
- if (token.type === TokenType.FUNCTION) {
- var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];
- if (typeof transformFunction === 'undefined') {
- throw new Error("Attempting to parse an unsupported transform function \"" + token.name + "\"");
- }
- return transformFunction(token.values);
- }
- return null;
- } };
- var matrix = function matrix(args) {
- var values = args.filter(function (arg) {return arg.type === TokenType.NUMBER_TOKEN;}).map(function (arg) {return arg.number;});
- return values.length === 6 ? values : null;
- };
- // doesn't support 3D transforms at the moment
- var matrix3d = function matrix3d(args) {
- var values = args.filter(function (arg) {return arg.type === TokenType.NUMBER_TOKEN;}).map(function (arg) {return arg.number;});
- var a1 = values[0],b1 = values[1],_a = values[2],_b = values[3],a2 = values[4],b2 = values[5],_c = values[6],_d = values[7],_e = values[8],_f = values[9],_g = values[10],_h = values[11],a4 = values[12],b4 = values[13],_j = values[14],_k = values[15];
- return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;
- };
- var SUPPORTED_TRANSFORM_FUNCTIONS = {
- matrix: matrix,
- matrix3d: matrix3d };
- var DEFAULT_VALUE = {
- type: TokenType.PERCENTAGE_TOKEN,
- number: 50,
- flags: FLAG_INTEGER };
- var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE];
- var transformOrigin = {
- name: 'transform-origin',
- initialValue: '50% 50%',
- prefix: true,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- var origins = tokens.filter(isLengthPercentage);
- if (origins.length !== 2) {
- return DEFAULT;
- }
- return [origins[0], origins[1]];
- } };
- var VISIBILITY;
- (function (VISIBILITY) {
- VISIBILITY[VISIBILITY["VISIBLE"] = 0] = "VISIBLE";
- VISIBILITY[VISIBILITY["HIDDEN"] = 1] = "HIDDEN";
- VISIBILITY[VISIBILITY["COLLAPSE"] = 2] = "COLLAPSE";
- })(VISIBILITY || (VISIBILITY = {}));
- var visibility = {
- name: 'visible',
- initialValue: 'none',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(visibility) {
- switch (visibility) {
- case 'hidden':
- return VISIBILITY.HIDDEN;
- case 'collapse':
- return VISIBILITY.COLLAPSE;
- case 'visible':
- default:
- return VISIBILITY.VISIBLE;}
- } };
- var WORD_BREAK;
- (function (WORD_BREAK) {
- WORD_BREAK["NORMAL"] = "normal";
- WORD_BREAK["BREAK_ALL"] = "break-all";
- WORD_BREAK["KEEP_ALL"] = "keep-all";
- })(WORD_BREAK || (WORD_BREAK = {}));
- var wordBreak = {
- name: 'word-break',
- initialValue: 'normal',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(wordBreak) {
- switch (wordBreak) {
- case 'break-all':
- return WORD_BREAK.BREAK_ALL;
- case 'keep-all':
- return WORD_BREAK.KEEP_ALL;
- case 'normal':
- default:
- return WORD_BREAK.NORMAL;}
- } };
- var zIndex = {
- name: 'z-index',
- initialValue: 'auto',
- prefix: false,
- type: PropertyDescriptorParsingType.VALUE,
- parse: function parse(token) {
- if (token.type === TokenType.IDENT_TOKEN) {
- return { auto: true, order: 0 };
- }
- if (isNumberToken(token)) {
- return { auto: false, order: token.number };
- }
- throw new Error("Invalid z-index number parsed");
- } };
- var opacity = {
- name: 'opacity',
- initialValue: '1',
- type: PropertyDescriptorParsingType.VALUE,
- prefix: false,
- parse: function parse(token) {
- if (isNumberToken(token)) {
- return token.number;
- }
- return 1;
- } };
- var textDecorationColor = {
- name: "text-decoration-color",
- initialValue: 'transparent',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'color' };
- var textDecorationLine = {
- name: 'text-decoration-line',
- initialValue: 'none',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- return tokens.
- filter(isIdentToken).
- map(function (token) {
- switch (token.value) {
- case 'underline':
- return 1 /* UNDERLINE */;
- case 'overline':
- return 2 /* OVERLINE */;
- case 'line-through':
- return 3 /* LINE_THROUGH */;
- case 'none':
- return 4 /* BLINK */;}
- return 0 /* NONE */;
- }).
- filter(function (line) {return line !== 0 /* NONE */;});
- } };
- var fontFamily = {
- name: "font-family",
- initialValue: '',
- prefix: false,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- var accumulator = [];
- var results = [];
- tokens.forEach(function (token) {
- switch (token.type) {
- case TokenType.IDENT_TOKEN:
- case TokenType.STRING_TOKEN:
- accumulator.push(token.value);
- break;
- case TokenType.NUMBER_TOKEN:
- accumulator.push(token.number.toString());
- break;
- case TokenType.COMMA_TOKEN:
- results.push(accumulator.join(' '));
- accumulator.length = 0;
- break;}
- });
- if (accumulator.length) {
- results.push(accumulator.join(' '));
- }
- return results.map(function (result) {return result.indexOf(' ') === -1 ? result : "'" + result + "'";});
- } };
- var fontSize = {
- name: "font-size",
- initialValue: '0',
- prefix: false,
- type: PropertyDescriptorParsingType.TYPE_VALUE,
- format: 'length' };
- var fontWeight = {
- name: 'font-weight',
- initialValue: 'normal',
- type: PropertyDescriptorParsingType.VALUE,
- prefix: false,
- parse: function parse(token) {
- if (isNumberToken(token)) {
- return token.number;
- }
- if (isIdentToken(token)) {
- switch (token.value) {
- case 'bold':
- return 700;
- case 'normal':
- default:
- return 400;}
- }
- return 400;
- } };
- var fontVariant = {
- name: 'font-variant',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- return tokens.filter(isIdentToken).map(function (token) {return token.value;});
- } };
- var FONT_STYLE;
- (function (FONT_STYLE) {
- FONT_STYLE["NORMAL"] = "normal";
- FONT_STYLE["ITALIC"] = "italic";
- FONT_STYLE["OBLIQUE"] = "oblique";
- })(FONT_STYLE || (FONT_STYLE = {}));
- var fontStyle = {
- name: 'font-style',
- initialValue: 'normal',
- prefix: false,
- type: PropertyDescriptorParsingType.IDENT_VALUE,
- parse: function parse(overflow) {
- switch (overflow) {
- case 'oblique':
- return FONT_STYLE.OBLIQUE;
- case 'italic':
- return FONT_STYLE.ITALIC;
- case 'normal':
- default:
- return FONT_STYLE.NORMAL;}
- } };
- var contains = function contains(bit, value) {return (bit & value) !== 0;};
- var content = {
- name: 'content',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- if (tokens.length === 0) {
- return [];
- }
- var first = tokens[0];
- if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
- return [];
- }
- return tokens;
- } };
- var counterIncrement = {
- name: 'counter-increment',
- initialValue: 'none',
- prefix: true,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- if (tokens.length === 0) {
- return null;
- }
- var first = tokens[0];
- if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
- return null;
- }
- var increments = [];
- var filtered = tokens.filter(nonWhiteSpace);
- for (var i = 0; i < filtered.length; i++) {
- var counter = filtered[i];
- var next = filtered[i + 1];
- if (counter.type === TokenType.IDENT_TOKEN) {
- var increment = next && isNumberToken(next) ? next.number : 1;
- increments.push({ counter: counter.value, increment: increment });
- }
- }
- return increments;
- } };
- var counterReset = {
- name: 'counter-reset',
- initialValue: 'none',
- prefix: true,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- if (tokens.length === 0) {
- return [];
- }
- var resets = [];
- var filtered = tokens.filter(nonWhiteSpace);
- for (var i = 0; i < filtered.length; i++) {
- var counter = filtered[i];
- var next = filtered[i + 1];
- if (isIdentToken(counter) && counter.value !== 'none') {
- var reset = next && isNumberToken(next) ? next.number : 0;
- resets.push({ counter: counter.value, reset: reset });
- }
- }
- return resets;
- } };
- var quotes = {
- name: 'quotes',
- initialValue: 'none',
- prefix: true,
- type: PropertyDescriptorParsingType.LIST,
- parse: function parse(tokens) {
- if (tokens.length === 0) {
- return null;
- }
- var first = tokens[0];
- if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
- return null;
- }
- var quotes = [];
- var filtered = tokens.filter(isStringToken);
- if (filtered.length % 2 !== 0) {
- return null;
- }
- for (var i = 0; i < filtered.length; i += 2) {
- var open_1 = filtered[i].value;
- var close_1 = filtered[i + 1].value;
- quotes.push({ open: open_1, close: close_1 });
- }
- return quotes;
- } };
- var getQuote = function getQuote(quotes, depth, open) {
- if (!quotes) {
- return '';
- }
- var quote = quotes[Math.min(depth, quotes.length - 1)];
- if (!quote) {
- return '';
- }
- return open ? quote.open : quote.close;
- };
- var boxShadow = {
- name: 'box-shadow',
- initialValue: 'none',
- type: PropertyDescriptorParsingType.LIST,
- prefix: false,
- parse: function parse(tokens) {
- if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
- return [];
- }
- return parseFunctionArgs(tokens).map(function (values) {
- var shadow = {
- color: 0x000000ff,
- offsetX: ZERO_LENGTH,
- offsetY: ZERO_LENGTH,
- blur: ZERO_LENGTH,
- spread: ZERO_LENGTH,
- inset: false };
- var c = 0;
- for (var i = 0; i < values.length; i++) {
- var token = values[i];
- if (isIdentWithValue(token, 'inset')) {
- shadow.inset = true;
- } else
- if (isLength(token)) {
- if (c === 0) {
- shadow.offsetX = token;
- } else
- if (c === 1) {
- shadow.offsetY = token;
- } else
- if (c === 2) {
- shadow.blur = token;
- } else
- {
- shadow.spread = token;
- }
- c++;
- } else
- {
- shadow.color = color.parse(token);
- }
- }
- return shadow;
- });
- } };
- var CSSParsedDeclaration = /** @class */function () {
- function CSSParsedDeclaration(declaration) {
- this.backgroundClip = parse(backgroundClip, declaration.backgroundClip);
- this.backgroundColor = parse(backgroundColor, declaration.backgroundColor);
- this.backgroundImage = parse(backgroundImage, declaration.backgroundImage);
- this.backgroundOrigin = parse(backgroundOrigin, declaration.backgroundOrigin);
- this.backgroundPosition = parse(backgroundPosition, declaration.backgroundPosition);
- this.backgroundRepeat = parse(backgroundRepeat, declaration.backgroundRepeat);
- this.backgroundSize = parse(backgroundSize, declaration.backgroundSize);
- this.borderTopColor = parse(borderTopColor, declaration.borderTopColor);
- this.borderRightColor = parse(borderRightColor, declaration.borderRightColor);
- this.borderBottomColor = parse(borderBottomColor, declaration.borderBottomColor);
- this.borderLeftColor = parse(borderLeftColor, declaration.borderLeftColor);
- this.borderTopLeftRadius = parse(borderTopLeftRadius, declaration.borderTopLeftRadius);
- this.borderTopRightRadius = parse(borderTopRightRadius, declaration.borderTopRightRadius);
- this.borderBottomRightRadius = parse(borderBottomRightRadius, declaration.borderBottomRightRadius);
- this.borderBottomLeftRadius = parse(borderBottomLeftRadius, declaration.borderBottomLeftRadius);
- this.borderTopStyle = parse(borderTopStyle, declaration.borderTopStyle);
- this.borderRightStyle = parse(borderRightStyle, declaration.borderRightStyle);
- this.borderBottomStyle = parse(borderBottomStyle, declaration.borderBottomStyle);
- this.borderLeftStyle = parse(borderLeftStyle, declaration.borderLeftStyle);
- this.borderTopWidth = parse(borderTopWidth, declaration.borderTopWidth);
- this.borderRightWidth = parse(borderRightWidth, declaration.borderRightWidth);
- this.borderBottomWidth = parse(borderBottomWidth, declaration.borderBottomWidth);
- this.borderLeftWidth = parse(borderLeftWidth, declaration.borderLeftWidth);
- this.boxShadow = parse(boxShadow, declaration.boxShadow);
- this.color = parse(color$1, declaration.color);
- this.display = parse(display, declaration.display);
- this.float = parse(_float, declaration.cssFloat);
- this.fontFamily = parse(fontFamily, declaration.fontFamily);
- this.fontSize = parse(fontSize, declaration.fontSize);
- this.fontStyle = parse(fontStyle, declaration.fontStyle);
- this.fontVariant = parse(fontVariant, declaration.fontVariant);
- this.fontWeight = parse(fontWeight, declaration.fontWeight);
- this.letterSpacing = parse(letterSpacing, declaration.letterSpacing);
- this.lineBreak = parse(lineBreak, declaration.lineBreak);
- this.lineHeight = parse(lineHeight, declaration.lineHeight);
- this.listStyleImage = parse(listStyleImage, declaration.listStyleImage);
- this.listStylePosition = parse(listStylePosition, declaration.listStylePosition);
- this.listStyleType = parse(listStyleType, declaration.listStyleType);
- this.marginTop = parse(marginTop, declaration.marginTop);
- this.marginRight = parse(marginRight, declaration.marginRight);
- this.marginBottom = parse(marginBottom, declaration.marginBottom);
- this.marginLeft = parse(marginLeft, declaration.marginLeft);
- this.opacity = parse(opacity, declaration.opacity);
- var overflowTuple = parse(overflow, declaration.overflow);
- this.overflowX = overflowTuple[0];
- this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];
- this.overflowWrap = parse(overflowWrap, declaration.overflowWrap);
- this.paddingTop = parse(paddingTop, declaration.paddingTop);
- this.paddingRight = parse(paddingRight, declaration.paddingRight);
- this.paddingBottom = parse(paddingBottom, declaration.paddingBottom);
- this.paddingLeft = parse(paddingLeft, declaration.paddingLeft);
- this.position = parse(position, declaration.position);
- this.textAlign = parse(textAlign, declaration.textAlign);
- this.textDecorationColor = parse(textDecorationColor, declaration.textDecorationColor || declaration.color);
- this.textDecorationLine = parse(textDecorationLine, declaration.textDecorationLine);
- this.textShadow = parse(textShadow, declaration.textShadow);
- this.textTransform = parse(textTransform, declaration.textTransform);
- this.transform = parse(transform, declaration.transform);
- this.transformOrigin = parse(transformOrigin, declaration.transformOrigin);
- this.visibility = parse(visibility, declaration.visibility);
- this.wordBreak = parse(wordBreak, declaration.wordBreak);
- this.zIndex = parse(zIndex, declaration.zIndex);
- }
- CSSParsedDeclaration.prototype.isVisible = function () {
- return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;
- };
- CSSParsedDeclaration.prototype.isTransparent = function () {
- return isTransparent(this.backgroundColor);
- };
- CSSParsedDeclaration.prototype.isTransformed = function () {
- return this.transform !== null;
- };
- CSSParsedDeclaration.prototype.isPositioned = function () {
- return this.position !== POSITION.STATIC;
- };
- CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () {
- return this.isPositioned() && !this.zIndex.auto;
- };
- CSSParsedDeclaration.prototype.isFloating = function () {
- return this.float !== FLOAT.NONE;
- };
- CSSParsedDeclaration.prototype.isInlineLevel = function () {
- return contains(this.display, 4 /* INLINE */) ||
- contains(this.display, 33554432 /* INLINE_BLOCK */) ||
- contains(this.display, 268435456 /* INLINE_FLEX */) ||
- contains(this.display, 536870912 /* INLINE_GRID */) ||
- contains(this.display, 67108864 /* INLINE_LIST_ITEM */) ||
- contains(this.display, 134217728 /* INLINE_TABLE */);
- };
- return CSSParsedDeclaration;
- }();
- var CSSParsedPseudoDeclaration = /** @class */function () {
- function CSSParsedPseudoDeclaration(declaration) {
- this.content = parse(content, declaration.content);
- this.quotes = parse(quotes, declaration.quotes);
- }
- return CSSParsedPseudoDeclaration;
- }();
- var CSSParsedCounterDeclaration = /** @class */function () {
- function CSSParsedCounterDeclaration(declaration) {
- this.counterIncrement = parse(counterIncrement, declaration.counterIncrement);
- this.counterReset = parse(counterReset, declaration.counterReset);
- }
- return CSSParsedCounterDeclaration;
- }();
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- var parse = function parse(descriptor, style) {
- var tokenizer = new Tokenizer();
- var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;
- tokenizer.write(value);
- var parser = new Parser(tokenizer.read());
- switch (descriptor.type) {
- case PropertyDescriptorParsingType.IDENT_VALUE:
- var token = parser.parseComponentValue();
- return descriptor.parse(isIdentToken(token) ? token.value : descriptor.initialValue);
- case PropertyDescriptorParsingType.VALUE:
- return descriptor.parse(parser.parseComponentValue());
- case PropertyDescriptorParsingType.LIST:
- return descriptor.parse(parser.parseComponentValues());
- case PropertyDescriptorParsingType.TOKEN_VALUE:
- return parser.parseComponentValue();
- case PropertyDescriptorParsingType.TYPE_VALUE:
- switch (descriptor.format) {
- case 'angle':
- return angle.parse(parser.parseComponentValue());
- case 'color':
- return color.parse(parser.parseComponentValue());
- case 'image':
- return image.parse(parser.parseComponentValue());
- case 'length':
- var length_1 = parser.parseComponentValue();
- return isLength(length_1) ? length_1 : ZERO_LENGTH;
- case 'length-percentage':
- var value_1 = parser.parseComponentValue();
- return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH;}}
- throw new Error("Attempting to parse unsupported css format type " + descriptor.format);
- };
- var ElementContainer = /** @class */function () {
- function ElementContainer(element) {
- this.styles = new CSSParsedDeclaration(window.getComputedStyle(element, null));
- this.textNodes = [];
- this.elements = [];
- if (this.styles.transform !== null && isHTMLElementNode(element)) {
- // getBoundingClientRect takes transforms into account
- element.style.transform = 'none';
- }
- this.bounds = parseBounds(element);
- this.flags = 0;
- }
- return ElementContainer;
- }();
- var TextBounds = /** @class */function () {
- function TextBounds(text, bounds) {
- this.text = text;
- this.bounds = bounds;
- }
- return TextBounds;
- }();
- var parseTextBounds = function parseTextBounds(value, styles, node) {
- var textList = breakText(value, styles);
- var textBounds = [];
- var offset = 0;
- textList.forEach(function (text) {
- if (styles.textDecorationLine.length || text.trim().length > 0) {
- if (FEATURES.SUPPORT_RANGE_BOUNDS) {
- textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length)));
- } else
- {
- var replacementNode = node.splitText(text.length);
- textBounds.push(new TextBounds(text, getWrapperBounds(node)));
- node = replacementNode;
- }
- } else
- if (!FEATURES.SUPPORT_RANGE_BOUNDS) {
- node = node.splitText(text.length);
- }
- offset += text.length;
- });
- return textBounds;
- };
- var getWrapperBounds = function getWrapperBounds(node) {
- var ownerDocument = node.ownerDocument;
- if (ownerDocument) {
- var wrapper = ownerDocument.createElement('html2canvaswrapper');
- wrapper.appendChild(node.cloneNode(true));
- var parentNode = node.parentNode;
- if (parentNode) {
- parentNode.replaceChild(wrapper, node);
- var bounds = parseBounds(wrapper);
- if (wrapper.firstChild) {
- parentNode.replaceChild(wrapper.firstChild, wrapper);
- }
- return bounds;
- }
- }
- return new Bounds(0, 0, 0, 0);
- };
- var getRangeBounds = function getRangeBounds(node, offset, length) {
- var ownerDocument = node.ownerDocument;
- if (!ownerDocument) {
- throw new Error('Node has no owner document');
- }
- var range = ownerDocument.createRange();
- range.setStart(node, offset);
- range.setEnd(node, offset + length);
- return Bounds.fromClientRect(range.getBoundingClientRect());
- };
- var breakText = function breakText(value, styles) {
- return styles.letterSpacing !== 0 ? toCodePoints(value).map(function (i) {return fromCodePoint(i);}) : breakWords(value, styles);
- };
- var breakWords = function breakWords(str, styles) {
- var breaker = LineBreaker(str, {
- lineBreak: styles.lineBreak,
- wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak });
- var words = [];
- var bk;
- while (!(bk = breaker.next()).done) {
- if (bk.value) {
- words.push(bk.value.slice());
- }
- }
- return words;
- };
- var TextContainer = /** @class */function () {
- function TextContainer(node, styles) {
- this.text = transform$1(node.data, styles.textTransform);
- this.textBounds = parseTextBounds(this.text, styles, node);
- }
- return TextContainer;
- }();
- var transform$1 = function transform$1(text, transform) {
- switch (transform) {
- case TEXT_TRANSFORM.LOWERCASE:
- return text.toLowerCase();
- case TEXT_TRANSFORM.CAPITALIZE:
- return text.replace(CAPITALIZE, capitalize);
- case TEXT_TRANSFORM.UPPERCASE:
- return text.toUpperCase();
- default:
- return text;}
- };
- var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g;
- var capitalize = function capitalize(m, p1, p2) {
- if (m.length > 0) {
- return p1 + p2.toUpperCase();
- }
- return m;
- };
- var ImageElementContainer = /** @class */function (_super) {
- __extends(ImageElementContainer, _super);
- function ImageElementContainer(img) {
- var _this = _super.call(this, img) || this;
- _this.src = img.currentSrc || img.src;
- _this.intrinsicWidth = img.naturalWidth;
- _this.intrinsicHeight = img.naturalHeight;
- CacheStorage.getInstance().addImage(_this.src);
- return _this;
- }
- return ImageElementContainer;
- }(ElementContainer);
- var CanvasElementContainer = /** @class */function (_super) {
- __extends(CanvasElementContainer, _super);
- function CanvasElementContainer(canvas) {
- var _this = _super.call(this, canvas) || this;
- _this.canvas = canvas;
- _this.intrinsicWidth = canvas.width;
- _this.intrinsicHeight = canvas.height;
- return _this;
- }
- return CanvasElementContainer;
- }(ElementContainer);
- var SVGElementContainer = /** @class */function (_super) {
- __extends(SVGElementContainer, _super);
- function SVGElementContainer(img) {
- var _this = _super.call(this, img) || this;
- var s = new XMLSerializer();
- _this.svg = "data:image/svg+xml," + encodeURIComponent(s.serializeToString(img));
- _this.intrinsicWidth = img.width.baseVal.value;
- _this.intrinsicHeight = img.height.baseVal.value;
- CacheStorage.getInstance().addImage(_this.svg);
- return _this;
- }
- return SVGElementContainer;
- }(ElementContainer);
- var LIElementContainer = /** @class */function (_super) {
- __extends(LIElementContainer, _super);
- function LIElementContainer(element) {
- var _this = _super.call(this, element) || this;
- _this.value = element.value;
- return _this;
- }
- return LIElementContainer;
- }(ElementContainer);
- var OLElementContainer = /** @class */function (_super) {
- __extends(OLElementContainer, _super);
- function OLElementContainer(element) {
- var _this = _super.call(this, element) || this;
- _this.start = element.start;
- _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;
- return _this;
- }
- return OLElementContainer;
- }(ElementContainer);
- var CHECKBOX_BORDER_RADIUS = [
- {
- type: TokenType.DIMENSION_TOKEN,
- flags: 0,
- unit: 'px',
- number: 3 }];
- var RADIO_BORDER_RADIUS = [
- {
- type: TokenType.PERCENTAGE_TOKEN,
- flags: 0,
- number: 50 }];
- var reformatInputBounds = function reformatInputBounds(bounds) {
- if (bounds.width > bounds.height) {
- return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);
- } else
- if (bounds.width < bounds.height) {
- return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);
- }
- return bounds;
- };
- var getInputValue = function getInputValue(node) {
- var value = node.type === PASSWORD ? new Array(node.value.length + 1).join("\u2022") : node.value;
- return value.length === 0 ? node.placeholder || '' : value;
- };
- var CHECKBOX = 'checkbox';
- var RADIO = 'radio';
- var PASSWORD = 'password';
- var INPUT_COLOR = 0x2a2a2aff;
- var InputElementContainer = /** @class */function (_super) {
- __extends(InputElementContainer, _super);
- function InputElementContainer(input) {
- var _this = _super.call(this, input) || this;
- _this.type = input.type.toLowerCase();
- _this.checked = input.checked;
- _this.value = getInputValue(input);
- if (_this.type === CHECKBOX || _this.type === RADIO) {
- _this.styles.backgroundColor = 0xdededeff;
- _this.styles.borderTopColor = _this.styles.borderRightColor = _this.styles.borderBottomColor = _this.styles.borderLeftColor = 0xa5a5a5ff;
- _this.styles.borderTopWidth = _this.styles.borderRightWidth = _this.styles.borderBottomWidth = _this.styles.borderLeftWidth = 1;
- _this.styles.borderTopStyle = _this.styles.borderRightStyle = _this.styles.borderBottomStyle = _this.styles.borderLeftStyle =
- BORDER_STYLE.SOLID;
- _this.styles.backgroundClip = [BACKGROUND_CLIP.BORDER_BOX];
- _this.styles.backgroundOrigin = [0 /* BORDER_BOX */];
- _this.bounds = reformatInputBounds(_this.bounds);
- }
- switch (_this.type) {
- case CHECKBOX:
- _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = CHECKBOX_BORDER_RADIUS;
- break;
- case RADIO:
- _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = RADIO_BORDER_RADIUS;
- break;}
- return _this;
- }
- return InputElementContainer;
- }(ElementContainer);
- var SelectElementContainer = /** @class */function (_super) {
- __extends(SelectElementContainer, _super);
- function SelectElementContainer(element) {
- var _this = _super.call(this, element) || this;
- var option = element.options[element.selectedIndex || 0];
- _this.value = option ? option.text || '' : '';
- return _this;
- }
- return SelectElementContainer;
- }(ElementContainer);
- var TextareaElementContainer = /** @class */function (_super) {
- __extends(TextareaElementContainer, _super);
- function TextareaElementContainer(element) {
- var _this = _super.call(this, element) || this;
- _this.value = element.value;
- return _this;
- }
- return TextareaElementContainer;
- }(ElementContainer);
- var parseColor = function parseColor(value) {return color.parse(Parser.create(value).parseComponentValue());};
- var IFrameElementContainer = /** @class */function (_super) {
- __extends(IFrameElementContainer, _super);
- function IFrameElementContainer(iframe) {
- var _this = _super.call(this, iframe) || this;
- _this.src = iframe.src;
- _this.width = parseInt(iframe.width, 10) || 0;
- _this.height = parseInt(iframe.height, 10) || 0;
- _this.backgroundColor = _this.styles.backgroundColor;
- try {
- if (iframe.contentWindow &&
- iframe.contentWindow.document &&
- iframe.contentWindow.document.documentElement) {
- _this.tree = parseTree(iframe.contentWindow.document.documentElement);
- // http://www.w3.org/TR/css3-background/#special-backgrounds
- var documentBackgroundColor = iframe.contentWindow.document.documentElement ?
- parseColor(getComputedStyle(iframe.contentWindow.document.documentElement).
- backgroundColor) :
- COLORS.TRANSPARENT;
- var bodyBackgroundColor = iframe.contentWindow.document.body ?
- parseColor(getComputedStyle(iframe.contentWindow.document.body).backgroundColor) :
- COLORS.TRANSPARENT;
- _this.backgroundColor = isTransparent(documentBackgroundColor) ?
- isTransparent(bodyBackgroundColor) ?
- _this.styles.backgroundColor :
- bodyBackgroundColor :
- documentBackgroundColor;
- }
- }
- catch (e) {}
- return _this;
- }
- return IFrameElementContainer;
- }(ElementContainer);
- var LIST_OWNERS = ['OL', 'UL', 'MENU'];
- var parseNodeTree = function parseNodeTree(node, parent, root) {
- for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) {
- nextNode = childNode.nextSibling;
- if (isTextNode(childNode) && childNode.data.trim().length > 0) {
- parent.textNodes.push(new TextContainer(childNode, parent.styles));
- } else
- if (isElementNode(childNode)) {
- var container = createContainer(childNode);
- if (container.styles.isVisible()) {
- if (createsRealStackingContext(childNode, container, root)) {
- container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;
- } else
- if (createsStackingContext(container.styles)) {
- container.flags |= 2 /* CREATES_STACKING_CONTEXT */;
- }
- if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {
- container.flags |= 8 /* IS_LIST_OWNER */;
- }
- parent.elements.push(container);
- if (!isTextareaElement(childNode) && !isSVGElement(childNode) && !isSelectElement(childNode)) {
- parseNodeTree(childNode, container, root);
- }
- }
- }
- }
- };
- var createContainer = function createContainer(element) {
- if (isImageElement(element)) {
- return new ImageElementContainer(element);
- }
- if (isCanvasElement(element)) {
- return new CanvasElementContainer(element);
- }
- if (isSVGElement(element)) {
- return new SVGElementContainer(element);
- }
- if (isLIElement(element)) {
- return new LIElementContainer(element);
- }
- if (isOLElement(element)) {
- return new OLElementContainer(element);
- }
- if (isInputElement(element)) {
- return new InputElementContainer(element);
- }
- if (isSelectElement(element)) {
- return new SelectElementContainer(element);
- }
- if (isTextareaElement(element)) {
- return new TextareaElementContainer(element);
- }
- if (isIFrameElement(element)) {
- return new IFrameElementContainer(element);
- }
- return new ElementContainer(element);
- };
- var parseTree = function parseTree(element) {
- var container = createContainer(element);
- container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;
- parseNodeTree(element, container, container);
- return container;
- };
- var createsRealStackingContext = function createsRealStackingContext(node, container, root) {
- return container.styles.isPositionedWithZIndex() ||
- container.styles.opacity < 1 ||
- container.styles.isTransformed() ||
- isBodyElement(node) && root.styles.isTransparent();
- };
- var createsStackingContext = function createsStackingContext(styles) {return styles.isPositioned() || styles.isFloating();};
- var isTextNode = function isTextNode(node) {return node.nodeType === Node.TEXT_NODE;};
- var isElementNode = function isElementNode(node) {return node.nodeType === Node.ELEMENT_NODE;};
- var isHTMLElementNode = function isHTMLElementNode(node) {
- return isElementNode(node) && typeof node.style !== 'undefined' && !isSVGElementNode(node);
- };
- var isSVGElementNode = function isSVGElementNode(element) {
- return typeof element.className === 'object';
- };
- var isLIElement = function isLIElement(node) {return node.tagName === 'LI';};
- var isOLElement = function isOLElement(node) {return node.tagName === 'OL';};
- var isInputElement = function isInputElement(node) {return node.tagName === 'INPUT';};
- var isHTMLElement = function isHTMLElement(node) {return node.tagName === 'HTML';};
- var isSVGElement = function isSVGElement(node) {return node.tagName === 'svg';};
- var isBodyElement = function isBodyElement(node) {return node.tagName === 'BODY';};
- var isCanvasElement = function isCanvasElement(node) {return node.tagName === 'CANVAS';};
- var isImageElement = function isImageElement(node) {return node.tagName === 'IMG';};
- var isIFrameElement = function isIFrameElement(node) {return node.tagName === 'IFRAME';};
- var isStyleElement = function isStyleElement(node) {return node.tagName === 'STYLE';};
- var isScriptElement = function isScriptElement(node) {return node.tagName === 'SCRIPT';};
- var isTextareaElement = function isTextareaElement(node) {return node.tagName === 'TEXTAREA';};
- var isSelectElement = function isSelectElement(node) {return node.tagName === 'SELECT';};
- var CounterState = /** @class */function () {
- function CounterState() {
- this.counters = {};
- }
- CounterState.prototype.getCounterValue = function (name) {
- var counter = this.counters[name];
- if (counter && counter.length) {
- return counter[counter.length - 1];
- }
- return 1;
- };
- CounterState.prototype.getCounterValues = function (name) {
- var counter = this.counters[name];
- return counter ? counter : [];
- };
- CounterState.prototype.pop = function (counters) {
- var _this = this;
- counters.forEach(function (counter) {return _this.counters[counter].pop();});
- };
- CounterState.prototype.parse = function (style) {
- var _this = this;
- var counterIncrement = style.counterIncrement;
- var counterReset = style.counterReset;
- var canReset = true;
- if (counterIncrement !== null) {
- counterIncrement.forEach(function (entry) {
- var counter = _this.counters[entry.counter];
- if (counter && entry.increment !== 0) {
- canReset = false;
- counter[Math.max(0, counter.length - 1)] += entry.increment;
- }
- });
- }
- var counterNames = [];
- if (canReset) {
- counterReset.forEach(function (entry) {
- var counter = _this.counters[entry.counter];
- counterNames.push(entry.counter);
- if (!counter) {
- counter = _this.counters[entry.counter] = [];
- }
- counter.push(entry.reset);
- });
- }
- return counterNames;
- };
- return CounterState;
- }();
- var ROMAN_UPPER = {
- integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
- values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] };
- var ARMENIAN = {
- integers: [
- 9000,
- 8000,
- 7000,
- 6000,
- 5000,
- 4000,
- 3000,
- 2000,
- 1000,
- 900,
- 800,
- 700,
- 600,
- 500,
- 400,
- 300,
- 200,
- 100,
- 90,
- 80,
- 70,
- 60,
- 50,
- 40,
- 30,
- 20,
- 10,
- 9,
- 8,
- 7,
- 6,
- 5,
- 4,
- 3,
- 2,
- 1],
- values: [
- 'Ք',
- 'Փ',
- 'Ւ',
- 'Ց',
- 'Ր',
- 'Տ',
- 'Վ',
- 'Ս',
- 'Ռ',
- 'Ջ',
- 'Պ',
- 'Չ',
- 'Ո',
- 'Շ',
- 'Ն',
- 'Յ',
- 'Մ',
- 'Ճ',
- 'Ղ',
- 'Ձ',
- 'Հ',
- 'Կ',
- 'Ծ',
- 'Խ',
- 'Լ',
- 'Ի',
- 'Ժ',
- 'Թ',
- 'Ը',
- 'Է',
- 'Զ',
- 'Ե',
- 'Դ',
- 'Գ',
- 'Բ',
- 'Ա'] };
- var HEBREW = {
- integers: [
- 10000,
- 9000,
- 8000,
- 7000,
- 6000,
- 5000,
- 4000,
- 3000,
- 2000,
- 1000,
- 400,
- 300,
- 200,
- 100,
- 90,
- 80,
- 70,
- 60,
- 50,
- 40,
- 30,
- 20,
- 19,
- 18,
- 17,
- 16,
- 15,
- 10,
- 9,
- 8,
- 7,
- 6,
- 5,
- 4,
- 3,
- 2,
- 1],
- values: [
- 'י׳',
- 'ט׳',
- 'ח׳',
- 'ז׳',
- 'ו׳',
- 'ה׳',
- 'ד׳',
- 'ג׳',
- 'ב׳',
- 'א׳',
- 'ת',
- 'ש',
- 'ר',
- 'ק',
- 'צ',
- 'פ',
- 'ע',
- 'ס',
- 'נ',
- 'מ',
- 'ל',
- 'כ',
- 'יט',
- 'יח',
- 'יז',
- 'טז',
- 'טו',
- 'י',
- 'ט',
- 'ח',
- 'ז',
- 'ו',
- 'ה',
- 'ד',
- 'ג',
- 'ב',
- 'א'] };
- var GEORGIAN = {
- integers: [
- 10000,
- 9000,
- 8000,
- 7000,
- 6000,
- 5000,
- 4000,
- 3000,
- 2000,
- 1000,
- 900,
- 800,
- 700,
- 600,
- 500,
- 400,
- 300,
- 200,
- 100,
- 90,
- 80,
- 70,
- 60,
- 50,
- 40,
- 30,
- 20,
- 10,
- 9,
- 8,
- 7,
- 6,
- 5,
- 4,
- 3,
- 2,
- 1],
- values: [
- 'ჵ',
- 'ჰ',
- 'ჯ',
- 'ჴ',
- 'ხ',
- 'ჭ',
- 'წ',
- 'ძ',
- 'ც',
- 'ჩ',
- 'შ',
- 'ყ',
- 'ღ',
- 'ქ',
- 'ფ',
- 'ჳ',
- 'ტ',
- 'ს',
- 'რ',
- 'ჟ',
- 'პ',
- 'ო',
- 'ჲ',
- 'ნ',
- 'მ',
- 'ლ',
- 'კ',
- 'ი',
- 'თ',
- 'ჱ',
- 'ზ',
- 'ვ',
- 'ე',
- 'დ',
- 'გ',
- 'ბ',
- 'ა'] };
- var createAdditiveCounter = function createAdditiveCounter(value, min, max, symbols, fallback, suffix) {
- if (value < min || value > max) {
- return createCounterText(value, fallback, suffix.length > 0);
- }
- return symbols.integers.reduce(function (string, integer, index) {
- while (value >= integer) {
- value -= integer;
- string += symbols.values[index];
- }
- return string;
- }, '') + suffix;
- };
- var createCounterStyleWithSymbolResolver = function createCounterStyleWithSymbolResolver(value, codePointRangeLength, isNumeric, resolver) {
- var string = '';
- do {
- if (!isNumeric) {
- value--;
- }
- string = resolver(value) + string;
- value /= codePointRangeLength;
- } while (value * codePointRangeLength >= codePointRangeLength);
- return string;
- };
- var createCounterStyleFromRange = function createCounterStyleFromRange(value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) {
- var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;
- return (value < 0 ? '-' : '') + (
- createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) {
- return fromCodePoint(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart);
- }) +
- suffix);
- };
- var createCounterStyleFromSymbols = function createCounterStyleFromSymbols(value, symbols, suffix) {
- if (suffix === void 0) {suffix = '. ';}
- var codePointRangeLength = symbols.length;
- return createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) {return symbols[Math.floor(codePoint % codePointRangeLength)];}) + suffix;
- };
- var CJK_ZEROS = 1 << 0;
- var CJK_TEN_COEFFICIENTS = 1 << 1;
- var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;
- var CJK_HUNDRED_COEFFICIENTS = 1 << 3;
- var createCJKCounter = function createCJKCounter(value, numbers, multipliers, negativeSign, suffix, flags) {
- if (value < -9999 || value > 9999) {
- return createCounterText(value, LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0);
- }
- var tmp = Math.abs(value);
- var string = suffix;
- if (tmp === 0) {
- return numbers[0] + string;
- }
- for (var digit = 0; tmp > 0 && digit <= 4; digit++) {
- var coefficient = tmp % 10;
- if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {
- string = numbers[coefficient] + string;
- } else
- if (coefficient > 1 ||
- coefficient === 1 && digit === 0 ||
- coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS) ||
- coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100 ||
- coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS)) {
- string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string;
- } else
- if (coefficient === 1 && digit > 0) {
- string = multipliers[digit - 1] + string;
- }
- tmp = Math.floor(tmp / 10);
- }
- return (value < 0 ? negativeSign : '') + string;
- };
- var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';
- var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';
- var JAPANESE_NEGATIVE = 'マイナス';
- var KOREAN_NEGATIVE = '마이너스';
- var createCounterText = function createCounterText(value, type, appendSuffix) {
- var defaultSuffix = appendSuffix ? '. ' : '';
- var cjkSuffix = appendSuffix ? '、' : '';
- var koreanSuffix = appendSuffix ? ', ' : '';
- var spaceSuffix = appendSuffix ? ' ' : '';
- switch (type) {
- case LIST_STYLE_TYPE.DISC:
- return '•' + spaceSuffix;
- case LIST_STYLE_TYPE.CIRCLE:
- return '◦' + spaceSuffix;
- case LIST_STYLE_TYPE.SQUARE:
- return '◾' + spaceSuffix;
- case LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO:
- var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);
- return string.length < 4 ? "0" + string : string;
- case LIST_STYLE_TYPE.CJK_DECIMAL:
- return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);
- case LIST_STYLE_TYPE.LOWER_ROMAN:
- return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();
- case LIST_STYLE_TYPE.UPPER_ROMAN:
- return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
- case LIST_STYLE_TYPE.LOWER_GREEK:
- return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);
- case LIST_STYLE_TYPE.LOWER_ALPHA:
- return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);
- case LIST_STYLE_TYPE.UPPER_ALPHA:
- return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);
- case LIST_STYLE_TYPE.ARABIC_INDIC:
- return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);
- case LIST_STYLE_TYPE.ARMENIAN:
- case LIST_STYLE_TYPE.UPPER_ARMENIAN:
- return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
- case LIST_STYLE_TYPE.LOWER_ARMENIAN:
- return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();
- case LIST_STYLE_TYPE.BENGALI:
- return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);
- case LIST_STYLE_TYPE.CAMBODIAN:
- case LIST_STYLE_TYPE.KHMER:
- return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);
- case LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH:
- return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);
- case LIST_STYLE_TYPE.CJK_HEAVENLY_STEM:
- return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);
- case LIST_STYLE_TYPE.CJK_IDEOGRAPHIC:
- case LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL:
- return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
- case LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL:
- return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
- case LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL:
- return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
- case LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL:
- return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
- case LIST_STYLE_TYPE.JAPANESE_INFORMAL:
- return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);
- case LIST_STYLE_TYPE.JAPANESE_FORMAL:
- return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
- case LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL:
- return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
- case LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL:
- return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);
- case LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL:
- return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
- case LIST_STYLE_TYPE.DEVANAGARI:
- return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);
- case LIST_STYLE_TYPE.GEORGIAN:
- return createAdditiveCounter(value, 1, 19999, GEORGIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
- case LIST_STYLE_TYPE.GUJARATI:
- return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);
- case LIST_STYLE_TYPE.GURMUKHI:
- return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);
- case LIST_STYLE_TYPE.HEBREW:
- return createAdditiveCounter(value, 1, 10999, HEBREW, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
- case LIST_STYLE_TYPE.HIRAGANA:
- return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん');
- case LIST_STYLE_TYPE.HIRAGANA_IROHA:
- return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす');
- case LIST_STYLE_TYPE.KANNADA:
- return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);
- case LIST_STYLE_TYPE.KATAKANA:
- return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix);
- case LIST_STYLE_TYPE.KATAKANA_IROHA:
- return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix);
- case LIST_STYLE_TYPE.LAO:
- return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);
- case LIST_STYLE_TYPE.MONGOLIAN:
- return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);
- case LIST_STYLE_TYPE.MYANMAR:
- return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);
- case LIST_STYLE_TYPE.ORIYA:
- return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);
- case LIST_STYLE_TYPE.PERSIAN:
- return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);
- case LIST_STYLE_TYPE.TAMIL:
- return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);
- case LIST_STYLE_TYPE.TELUGU:
- return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);
- case LIST_STYLE_TYPE.THAI:
- return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);
- case LIST_STYLE_TYPE.TIBETAN:
- return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);
- case LIST_STYLE_TYPE.DECIMAL:
- default:
- return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);}
- };
- var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';
- var DocumentCloner = /** @class */function () {
- function DocumentCloner(element, options) {
- this.options = options;
- this.scrolledElements = [];
- this.referenceElement = element;
- this.counters = new CounterState();
- this.quoteDepth = 0;
- if (!element.ownerDocument) {
- throw new Error('Cloned element does not have an owner document');
- }
- this.documentElement = this.cloneNode(element.ownerDocument.documentElement);
- }
- DocumentCloner.prototype.toIFrame = function (ownerDocument, windowSize) {
- var _this = this;
- var iframe = createIFrameContainer(ownerDocument, windowSize);
- if (!iframe.contentWindow) {
- return Promise.reject("Unable to find iframe window");
- }
- var scrollX = ownerDocument.defaultView.pageXOffset;
- var scrollY = ownerDocument.defaultView.pageYOffset;
- var cloneWindow = iframe.contentWindow;
- var documentClone = cloneWindow.document;
- /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle
- if window url is about:blank, we can assign the url to current by writing onto the document
- */
- var iframeLoad = iframeLoader(iframe).then(function () {return __awaiter(_this, void 0, void 0, function () {
- var onclone;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- this.scrolledElements.forEach(restoreNodeScroll);
- if (cloneWindow) {
- cloneWindow.scrollTo(windowSize.left, windowSize.top);
- if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) && (
- cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)) {
- documentClone.documentElement.style.top = -windowSize.top + 'px';
- documentClone.documentElement.style.left = -windowSize.left + 'px';
- documentClone.documentElement.style.position = 'absolute';
- }
- }
- onclone = this.options.onclone;
- if (typeof this.clonedReferenceElement === 'undefined') {
- return [2 /*return*/, Promise.reject("Error finding the " + this.referenceElement.nodeName + " in the cloned document")];
- }
- if (!(documentClone.fonts && documentClone.fonts.ready)) return [3 /*break*/, 2];
- return [4 /*yield*/, documentClone.fonts.ready];
- case 1:
- _a.sent();
- _a.label = 2;
- case 2:
- if (typeof onclone === 'function') {
- return [2 /*return*/, Promise.resolve().
- then(function () {return onclone(documentClone);}).
- then(function () {return iframe;})];
- }
- return [2 /*return*/, iframe];}
- });
- });});
- documentClone.open();
- documentClone.write(serializeDoctype(document.doctype) + "<html></html>");
- // Chrome scrolls the parent document for some reason after the write to the cloned window???
- restoreOwnerScroll(this.referenceElement.ownerDocument, scrollX, scrollY);
- documentClone.replaceChild(documentClone.adoptNode(this.documentElement), documentClone.documentElement);
- documentClone.close();
- return iframeLoad;
- };
- DocumentCloner.prototype.createElementClone = function (node) {
- if (isCanvasElement(node)) {
- return this.createCanvasClone(node);
- }
- /*
- if (isIFrameElement(node)) {
- return this.createIFrameClone(node);
- }
- */
- if (isStyleElement(node)) {
- return this.createStyleClone(node);
- }
- var clone = node.cloneNode(false);
- // @ts-ignore
- if (isImageElement(clone) && clone.loading === 'lazy') {
- // @ts-ignore
- clone.loading = 'eager';
- }
- return clone;
- };
- DocumentCloner.prototype.createStyleClone = function (node) {
- try {
- var sheet = node.sheet;
- if (sheet && sheet.cssRules) {
- var css = [].slice.call(sheet.cssRules, 0).reduce(function (css, rule) {
- if (rule && typeof rule.cssText === 'string') {
- return css + rule.cssText;
- }
- return css;
- }, '');
- var style = node.cloneNode(false);
- style.textContent = css;
- return style;
- }
- }
- catch (e) {
- // accessing node.sheet.cssRules throws a DOMException
- Logger.getInstance(this.options.id).error('Unable to access cssRules property', e);
- if (e.name !== 'SecurityError') {
- throw e;
- }
- }
- return node.cloneNode(false);
- };
- DocumentCloner.prototype.createCanvasClone = function (canvas) {
- if (this.options.inlineImages && canvas.ownerDocument) {
- var img = canvas.ownerDocument.createElement('img');
- try {
- img.src = canvas.toDataURL();
- return img;
- }
- catch (e) {
- Logger.getInstance(this.options.id).info("Unable to clone canvas contents, canvas is tainted");
- }
- }
- var clonedCanvas = canvas.cloneNode(false);
- try {
- clonedCanvas.width = canvas.width;
- clonedCanvas.height = canvas.height;
- var ctx = canvas.getContext('2d');
- var clonedCtx = clonedCanvas.getContext('2d');
- if (clonedCtx) {
- if (ctx) {
- clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);
- } else
- {
- clonedCtx.drawImage(canvas, 0, 0);
- }
- }
- return clonedCanvas;
- }
- catch (e) {}
- return clonedCanvas;
- };
- /*
- createIFrameClone(iframe: HTMLIFrameElement) {
- const tempIframe = <HTMLIFrameElement>iframe.cloneNode(false);
- const iframeKey = generateIframeKey();
- tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);
- const {width, height} = parseBounds(iframe);
- this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(iframe, this.options)
- .then(documentElement => {
- return this.renderer(
- documentElement,
- {
- allowTaint: this.options.allowTaint,
- backgroundColor: '#ffffff',
- canvas: null,
- imageTimeout: this.options.imageTimeout,
- logging: this.options.logging,
- proxy: this.options.proxy,
- removeContainer: this.options.removeContainer,
- scale: this.options.scale,
- foreignObjectRendering: this.options.foreignObjectRendering,
- useCORS: this.options.useCORS,
- target: new CanvasRenderer(),
- width,
- height,
- x: 0,
- y: 0,
- windowWidth: documentElement.ownerDocument.defaultView.innerWidth,
- windowHeight: documentElement.ownerDocument.defaultView.innerHeight,
- scrollX: documentElement.ownerDocument.defaultView.pageXOffset,
- scrollY: documentElement.ownerDocument.defaultView.pageYOffset
- },
- );
- })
- .then(
- (canvas: HTMLCanvasElement) =>
- new Promise((resolve, reject) => {
- const iframeCanvas = document.createElement('img');
- iframeCanvas.onload = () => resolve(canvas);
- iframeCanvas.onerror = (event) => {
- // Empty iframes may result in empty "data:," URLs, which are invalid from the <img>'s point of view
- // and instead of `onload` cause `onerror` and unhandled rejection warnings
- // https://github.com/niklasvh/html2canvas/issues/1502
- iframeCanvas.src == 'data:,' ? resolve(canvas) : reject(event);
- };
- iframeCanvas.src = canvas.toDataURL();
- if (tempIframe.parentNode && iframe.ownerDocument && iframe.ownerDocument.defaultView) {
- tempIframe.parentNode.replaceChild(
- copyCSSStyles(
- iframe.ownerDocument.defaultView.getComputedStyle(iframe),
- iframeCanvas
- ),
- tempIframe
- );
- }
- })
- );
- return tempIframe;
- }
- */
- DocumentCloner.prototype.cloneNode = function (node) {
- if (isTextNode(node)) {
- return document.createTextNode(node.data);
- }
- if (!node.ownerDocument) {
- return node.cloneNode(false);
- }
- var window = node.ownerDocument.defaultView;
- if (window && isElementNode(node) && (isHTMLElementNode(node) || isSVGElementNode(node))) {
- var clone = this.createElementClone(node);
- var style = window.getComputedStyle(node);
- var styleBefore = window.getComputedStyle(node, ':before');
- var styleAfter = window.getComputedStyle(node, ':after');
- if (this.referenceElement === node && isHTMLElementNode(clone)) {
- this.clonedReferenceElement = clone;
- }
- if (isBodyElement(clone)) {
- createPseudoHideStyles(clone);
- }
- var counters = this.counters.parse(new CSSParsedCounterDeclaration(style));
- var before = this.resolvePseudoContent(node, clone, styleBefore, PseudoElementType.BEFORE);
- for (var child = node.firstChild; child; child = child.nextSibling) {
- if (!isElementNode(child) ||
- !isScriptElement(child) &&
- !child.hasAttribute(IGNORE_ATTRIBUTE) && (
- typeof this.options.ignoreElements !== 'function' || !this.options.ignoreElements(child))) {
- if (!this.options.copyStyles || !isElementNode(child) || !isStyleElement(child)) {
- clone.appendChild(this.cloneNode(child));
- }
- }
- }
- if (before) {
- clone.insertBefore(before, clone.firstChild);
- }
- var after = this.resolvePseudoContent(node, clone, styleAfter, PseudoElementType.AFTER);
- if (after) {
- clone.appendChild(after);
- }
- this.counters.pop(counters);
- if (style && (this.options.copyStyles || isSVGElementNode(node)) && !isIFrameElement(node)) {
- copyCSSStyles(style, clone);
- }
- //this.inlineAllImages(clone);
- if (node.scrollTop !== 0 || node.scrollLeft !== 0) {
- this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);
- }
- if ((isTextareaElement(node) || isSelectElement(node)) && (
- isTextareaElement(clone) || isSelectElement(clone))) {
- clone.value = node.value;
- }
- return clone;
- }
- return node.cloneNode(false);
- };
- DocumentCloner.prototype.resolvePseudoContent = function (node, clone, style, pseudoElt) {
- var _this = this;
- if (!style) {
- return;
- }
- var value = style.content;
- var document = clone.ownerDocument;
- if (!document || !value || value === 'none' || value === '-moz-alt-content' || style.display === 'none') {
- return;
- }
- this.counters.parse(new CSSParsedCounterDeclaration(style));
- var declaration = new CSSParsedPseudoDeclaration(style);
- var anonymousReplacedElement = document.createElement('html2canvaspseudoelement');
- copyCSSStyles(style, anonymousReplacedElement);
- declaration.content.forEach(function (token) {
- if (token.type === TokenType.STRING_TOKEN) {
- anonymousReplacedElement.appendChild(document.createTextNode(token.value));
- } else
- if (token.type === TokenType.URL_TOKEN) {
- var img = document.createElement('img');
- img.src = token.value;
- img.style.opacity = '1';
- anonymousReplacedElement.appendChild(img);
- } else
- if (token.type === TokenType.FUNCTION) {
- if (token.name === 'attr') {
- var attr = token.values.filter(isIdentToken);
- if (attr.length) {
- anonymousReplacedElement.appendChild(document.createTextNode(node.getAttribute(attr[0].value) || ''));
- }
- } else
- if (token.name === 'counter') {
- var _a = token.values.filter(nonFunctionArgSeparator),counter = _a[0],counterStyle = _a[1];
- if (counter && isIdentToken(counter)) {
- var counterState = _this.counters.getCounterValue(counter.value);
- var counterType = counterStyle && isIdentToken(counterStyle) ?
- listStyleType.parse(counterStyle.value) :
- LIST_STYLE_TYPE.DECIMAL;
- anonymousReplacedElement.appendChild(document.createTextNode(createCounterText(counterState, counterType, false)));
- }
- } else
- if (token.name === 'counters') {
- var _b = token.values.filter(nonFunctionArgSeparator),counter = _b[0],delim = _b[1],counterStyle = _b[2];
- if (counter && isIdentToken(counter)) {
- var counterStates = _this.counters.getCounterValues(counter.value);
- var counterType_1 = counterStyle && isIdentToken(counterStyle) ?
- listStyleType.parse(counterStyle.value) :
- LIST_STYLE_TYPE.DECIMAL;
- var separator = delim && delim.type === TokenType.STRING_TOKEN ? delim.value : '';
- var text = counterStates.
- map(function (value) {return createCounterText(value, counterType_1, false);}).
- join(separator);
- anonymousReplacedElement.appendChild(document.createTextNode(text));
- }
- }
- } else
- if (token.type === TokenType.IDENT_TOKEN) {
- switch (token.value) {
- case 'open-quote':
- anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, _this.quoteDepth++, true)));
- break;
- case 'close-quote':
- anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, --_this.quoteDepth, false)));
- break;
- default:
- // safari doesn't parse string tokens correctly because of lack of quotes
- anonymousReplacedElement.appendChild(document.createTextNode(token.value));}
- }
- });
- anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + " " + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
- var newClassName = pseudoElt === PseudoElementType.BEFORE ?
- " " + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE :
- " " + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
- if (isSVGElementNode(clone)) {
- clone.className.baseValue += newClassName;
- } else
- {
- clone.className += newClassName;
- }
- return anonymousReplacedElement;
- };
- DocumentCloner.destroy = function (container) {
- if (container.parentNode) {
- container.parentNode.removeChild(container);
- return true;
- }
- return false;
- };
- return DocumentCloner;
- }();
- var PseudoElementType;
- (function (PseudoElementType) {
- PseudoElementType[PseudoElementType["BEFORE"] = 0] = "BEFORE";
- PseudoElementType[PseudoElementType["AFTER"] = 1] = "AFTER";
- })(PseudoElementType || (PseudoElementType = {}));
- var createIFrameContainer = function createIFrameContainer(ownerDocument, bounds) {
- var cloneIframeContainer = ownerDocument.createElement('iframe');
- cloneIframeContainer.className = 'html2canvas-container';
- cloneIframeContainer.style.visibility = 'hidden';
- cloneIframeContainer.style.position = 'fixed';
- cloneIframeContainer.style.left = '-10000px';
- cloneIframeContainer.style.top = '0px';
- cloneIframeContainer.style.border = '0';
- cloneIframeContainer.width = bounds.width.toString();
- cloneIframeContainer.height = bounds.height.toString();
- cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it
- cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');
- ownerDocument.body.appendChild(cloneIframeContainer);
- return cloneIframeContainer;
- };
- var iframeLoader = function iframeLoader(iframe) {
- return new Promise(function (resolve, reject) {
- var cloneWindow = iframe.contentWindow;
- if (!cloneWindow) {
- return reject("No window assigned for iframe");
- }
- var documentClone = cloneWindow.document;
- cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = function () {
- cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = null;
- var interval = setInterval(function () {
- if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {
- clearInterval(interval);
- resolve(iframe);
- }
- }, 50);
- };
- });
- };
- var copyCSSStyles = function copyCSSStyles(style, target) {
- // Edge does not provide value for cssText
- for (var i = style.length - 1; i >= 0; i--) {
- var property = style.item(i);
- // Safari shows pseudoelements if content is set
- if (property !== 'content') {
- target.style.setProperty(property, style.getPropertyValue(property));
- }
- }
- return target;
- };
- var serializeDoctype = function serializeDoctype(doctype) {
- var str = '';
- if (doctype) {
- str += '<!DOCTYPE ';
- if (doctype.name) {
- str += doctype.name;
- }
- if (doctype.internalSubset) {
- str += doctype.internalSubset;
- }
- if (doctype.publicId) {
- str += "\"" + doctype.publicId + "\"";
- }
- if (doctype.systemId) {
- str += "\"" + doctype.systemId + "\"";
- }
- str += '>';
- }
- return str;
- };
- var restoreOwnerScroll = function restoreOwnerScroll(ownerDocument, x, y) {
- if (ownerDocument &&
- ownerDocument.defaultView && (
- x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {
- ownerDocument.defaultView.scrollTo(x, y);
- }
- };
- var restoreNodeScroll = function restoreNodeScroll(_a) {
- var element = _a[0],x = _a[1],y = _a[2];
- element.scrollLeft = x;
- element.scrollTop = y;
- };
- var PSEUDO_BEFORE = ':before';
- var PSEUDO_AFTER = ':after';
- var PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';
- var PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';
- var PSEUDO_HIDE_ELEMENT_STYLE = "{\n content: \"\" !important;\n display: none !important;\n}";
- var createPseudoHideStyles = function createPseudoHideStyles(body) {
- createStyles(body, "." + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + "\n ." + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE);
- };
- var createStyles = function createStyles(body, styles) {
- var document = body.ownerDocument;
- if (document) {
- var style = document.createElement('style');
- style.textContent = styles;
- body.appendChild(style);
- }
- };
- var PathType;
- (function (PathType) {
- PathType[PathType["VECTOR"] = 0] = "VECTOR";
- PathType[PathType["BEZIER_CURVE"] = 1] = "BEZIER_CURVE";
- })(PathType || (PathType = {}));
- var equalPath = function equalPath(a, b) {
- if (a.length === b.length) {
- return a.some(function (v, i) {return v === b[i];});
- }
- return false;
- };
- var transformPath = function transformPath(path, deltaX, deltaY, deltaW, deltaH) {
- return path.map(function (point, index) {
- switch (index) {
- case 0:
- return point.add(deltaX, deltaY);
- case 1:
- return point.add(deltaX + deltaW, deltaY);
- case 2:
- return point.add(deltaX + deltaW, deltaY + deltaH);
- case 3:
- return point.add(deltaX, deltaY + deltaH);}
- return point;
- });
- };
- var Vector = /** @class */function () {
- function Vector(x, y) {
- this.type = PathType.VECTOR;
- this.x = x;
- this.y = y;
- }
- Vector.prototype.add = function (deltaX, deltaY) {
- return new Vector(this.x + deltaX, this.y + deltaY);
- };
- return Vector;
- }();
- var lerp = function lerp(a, b, t) {
- return new Vector(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);
- };
- var BezierCurve = /** @class */function () {
- function BezierCurve(start, startControl, endControl, end) {
- this.type = PathType.BEZIER_CURVE;
- this.start = start;
- this.startControl = startControl;
- this.endControl = endControl;
- this.end = end;
- }
- BezierCurve.prototype.subdivide = function (t, firstHalf) {
- var ab = lerp(this.start, this.startControl, t);
- var bc = lerp(this.startControl, this.endControl, t);
- var cd = lerp(this.endControl, this.end, t);
- var abbc = lerp(ab, bc, t);
- var bccd = lerp(bc, cd, t);
- var dest = lerp(abbc, bccd, t);
- return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);
- };
- BezierCurve.prototype.add = function (deltaX, deltaY) {
- return new BezierCurve(this.start.add(deltaX, deltaY), this.startControl.add(deltaX, deltaY), this.endControl.add(deltaX, deltaY), this.end.add(deltaX, deltaY));
- };
- BezierCurve.prototype.reverse = function () {
- return new BezierCurve(this.end, this.endControl, this.startControl, this.start);
- };
- return BezierCurve;
- }();
- var isBezierCurve = function isBezierCurve(path) {return path.type === PathType.BEZIER_CURVE;};
- var BoundCurves = /** @class */function () {
- function BoundCurves(element) {
- var styles = element.styles;
- var bounds = element.bounds;
- var _a = getAbsoluteValueForTuple(styles.borderTopLeftRadius, bounds.width, bounds.height),tlh = _a[0],tlv = _a[1];
- var _b = getAbsoluteValueForTuple(styles.borderTopRightRadius, bounds.width, bounds.height),trh = _b[0],trv = _b[1];
- var _c = getAbsoluteValueForTuple(styles.borderBottomRightRadius, bounds.width, bounds.height),brh = _c[0],brv = _c[1];
- var _d = getAbsoluteValueForTuple(styles.borderBottomLeftRadius, bounds.width, bounds.height),blh = _d[0],blv = _d[1];
- var factors = [];
- factors.push((tlh + trh) / bounds.width);
- factors.push((blh + brh) / bounds.width);
- factors.push((tlv + blv) / bounds.height);
- factors.push((trv + brv) / bounds.height);
- var maxFactor = Math.max.apply(Math, factors);
- if (maxFactor > 1) {
- tlh /= maxFactor;
- tlv /= maxFactor;
- trh /= maxFactor;
- trv /= maxFactor;
- brh /= maxFactor;
- brv /= maxFactor;
- blh /= maxFactor;
- blv /= maxFactor;
- }
- var topWidth = bounds.width - trh;
- var rightHeight = bounds.height - brv;
- var bottomWidth = bounds.width - brh;
- var leftHeight = bounds.height - blv;
- var borderTopWidth = styles.borderTopWidth;
- var borderRightWidth = styles.borderRightWidth;
- var borderBottomWidth = styles.borderBottomWidth;
- var borderLeftWidth = styles.borderLeftWidth;
- var paddingTop = getAbsoluteValue(styles.paddingTop, element.bounds.width);
- var paddingRight = getAbsoluteValue(styles.paddingRight, element.bounds.width);
- var paddingBottom = getAbsoluteValue(styles.paddingBottom, element.bounds.width);
- var paddingLeft = getAbsoluteValue(styles.paddingLeft, element.bounds.width);
- this.topLeftBorderBox =
- tlh > 0 || tlv > 0 ?
- getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT) :
- new Vector(bounds.left, bounds.top);
- this.topRightBorderBox =
- trh > 0 || trv > 0 ?
- getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT) :
- new Vector(bounds.left + bounds.width, bounds.top);
- this.bottomRightBorderBox =
- brh > 0 || brv > 0 ?
- getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT) :
- new Vector(bounds.left + bounds.width, bounds.top + bounds.height);
- this.bottomLeftBorderBox =
- blh > 0 || blv > 0 ?
- getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT) :
- new Vector(bounds.left, bounds.top + bounds.height);
- this.topLeftPaddingBox =
- tlh > 0 || tlv > 0 ?
- getCurvePoints(bounds.left + borderLeftWidth, bounds.top + borderTopWidth, Math.max(0, tlh - borderLeftWidth), Math.max(0, tlv - borderTopWidth), CORNER.TOP_LEFT) :
- new Vector(bounds.left + borderLeftWidth, bounds.top + borderTopWidth);
- this.topRightPaddingBox =
- trh > 0 || trv > 0 ?
- getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth), bounds.top + borderTopWidth, topWidth > bounds.width + borderLeftWidth ? 0 : trh - borderLeftWidth, trv - borderTopWidth, CORNER.TOP_RIGHT) :
- new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + borderTopWidth);
- this.bottomRightPaddingBox =
- brh > 0 || brv > 0 ?
- getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borderLeftWidth), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth), Math.max(0, brh - borderRightWidth), brv - borderBottomWidth, CORNER.BOTTOM_RIGHT) :
- new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + bounds.height - borderBottomWidth);
- this.bottomLeftPaddingBox =
- blh > 0 || blv > 0 ?
- getCurvePoints(bounds.left + borderLeftWidth, bounds.top + leftHeight, Math.max(0, blh - borderLeftWidth), blv - borderBottomWidth, CORNER.BOTTOM_LEFT) :
- new Vector(bounds.left + borderLeftWidth, bounds.top + bounds.height - borderBottomWidth);
- this.topLeftContentBox =
- tlh > 0 || tlv > 0 ?
- getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop, Math.max(0, tlh - (borderLeftWidth + paddingLeft)), Math.max(0, tlv - (borderTopWidth + paddingTop)), CORNER.TOP_LEFT) :
- new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop);
- this.topRightContentBox =
- trh > 0 || trv > 0 ?
- getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth + paddingLeft), bounds.top + borderTopWidth + paddingTop, topWidth > bounds.width + borderLeftWidth + paddingLeft ? 0 : trh - borderLeftWidth + paddingLeft, trv - (borderTopWidth + paddingTop), CORNER.TOP_RIGHT) :
- new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + borderTopWidth + paddingTop);
- this.bottomRightContentBox =
- brh > 0 || brv > 0 ?
- getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - (borderLeftWidth + paddingLeft)), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth + paddingTop), Math.max(0, brh - (borderRightWidth + paddingRight)), brv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_RIGHT) :
- new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + bounds.height - (borderBottomWidth + paddingBottom));
- this.bottomLeftContentBox =
- blh > 0 || blv > 0 ?
- getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + leftHeight, Math.max(0, blh - (borderLeftWidth + paddingLeft)), blv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_LEFT) :
- new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + bounds.height - (borderBottomWidth + paddingBottom));
- }
- return BoundCurves;
- }();
- var CORNER;
- (function (CORNER) {
- CORNER[CORNER["TOP_LEFT"] = 0] = "TOP_LEFT";
- CORNER[CORNER["TOP_RIGHT"] = 1] = "TOP_RIGHT";
- CORNER[CORNER["BOTTOM_RIGHT"] = 2] = "BOTTOM_RIGHT";
- CORNER[CORNER["BOTTOM_LEFT"] = 3] = "BOTTOM_LEFT";
- })(CORNER || (CORNER = {}));
- var getCurvePoints = function getCurvePoints(x, y, r1, r2, position) {
- var kappa = 4 * ((Math.sqrt(2) - 1) / 3);
- var ox = r1 * kappa; // control point offset horizontal
- var oy = r2 * kappa; // control point offset vertical
- var xm = x + r1; // x-middle
- var ym = y + r2; // y-middle
- switch (position) {
- case CORNER.TOP_LEFT:
- return new BezierCurve(new Vector(x, ym), new Vector(x, ym - oy), new Vector(xm - ox, y), new Vector(xm, y));
- case CORNER.TOP_RIGHT:
- return new BezierCurve(new Vector(x, y), new Vector(x + ox, y), new Vector(xm, ym - oy), new Vector(xm, ym));
- case CORNER.BOTTOM_RIGHT:
- return new BezierCurve(new Vector(xm, y), new Vector(xm, y + oy), new Vector(x + ox, ym), new Vector(x, ym));
- case CORNER.BOTTOM_LEFT:
- default:
- return new BezierCurve(new Vector(xm, ym), new Vector(xm - ox, ym), new Vector(x, y + oy), new Vector(x, y));}
- };
- var calculateBorderBoxPath = function calculateBorderBoxPath(curves) {
- return [curves.topLeftBorderBox, curves.topRightBorderBox, curves.bottomRightBorderBox, curves.bottomLeftBorderBox];
- };
- var calculateContentBoxPath = function calculateContentBoxPath(curves) {
- return [
- curves.topLeftContentBox,
- curves.topRightContentBox,
- curves.bottomRightContentBox,
- curves.bottomLeftContentBox];
- };
- var calculatePaddingBoxPath = function calculatePaddingBoxPath(curves) {
- return [
- curves.topLeftPaddingBox,
- curves.topRightPaddingBox,
- curves.bottomRightPaddingBox,
- curves.bottomLeftPaddingBox];
- };
- var TransformEffect = /** @class */function () {
- function TransformEffect(offsetX, offsetY, matrix) {
- this.type = 0 /* TRANSFORM */;
- this.target = 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */;
- this.offsetX = offsetX;
- this.offsetY = offsetY;
- this.matrix = matrix;
- }
- return TransformEffect;
- }();
- var ClipEffect = /** @class */function () {
- function ClipEffect(path, target) {
- this.type = 1 /* CLIP */;
- this.target = target;
- this.path = path;
- }
- return ClipEffect;
- }();
- var OpacityEffect = /** @class */function () {
- function OpacityEffect(opacity) {
- this.type = 2 /* OPACITY */;
- this.target = 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */;
- this.opacity = opacity;
- }
- return OpacityEffect;
- }();
- var isTransformEffect = function isTransformEffect(effect) {
- return effect.type === 0 /* TRANSFORM */;
- };
- var isClipEffect = function isClipEffect(effect) {return effect.type === 1 /* CLIP */;};
- var isOpacityEffect = function isOpacityEffect(effect) {return effect.type === 2 /* OPACITY */;};
- var StackingContext = /** @class */function () {
- function StackingContext(container) {
- this.element = container;
- this.inlineLevel = [];
- this.nonInlineLevel = [];
- this.negativeZIndex = [];
- this.zeroOrAutoZIndexOrTransformedOrOpacity = [];
- this.positiveZIndex = [];
- this.nonPositionedFloats = [];
- this.nonPositionedInlineLevel = [];
- }
- return StackingContext;
- }();
- var ElementPaint = /** @class */function () {
- function ElementPaint(element, parentStack) {
- this.container = element;
- this.effects = parentStack.slice(0);
- this.curves = new BoundCurves(element);
- if (element.styles.opacity < 1) {
- this.effects.push(new OpacityEffect(element.styles.opacity));
- }
- if (element.styles.transform !== null) {
- var offsetX = element.bounds.left + element.styles.transformOrigin[0].number;
- var offsetY = element.bounds.top + element.styles.transformOrigin[1].number;
- var matrix = element.styles.transform;
- this.effects.push(new TransformEffect(offsetX, offsetY, matrix));
- }
- if (element.styles.overflowX !== OVERFLOW.VISIBLE) {
- var borderBox = calculateBorderBoxPath(this.curves);
- var paddingBox = calculatePaddingBoxPath(this.curves);
- if (equalPath(borderBox, paddingBox)) {
- this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));
- } else
- {
- this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */));
- this.effects.push(new ClipEffect(paddingBox, 4 /* CONTENT */));
- }
- }
- }
- ElementPaint.prototype.getParentEffects = function () {
- var effects = this.effects.slice(0);
- if (this.container.styles.overflowX !== OVERFLOW.VISIBLE) {
- var borderBox = calculateBorderBoxPath(this.curves);
- var paddingBox = calculatePaddingBoxPath(this.curves);
- if (!equalPath(borderBox, paddingBox)) {
- effects.push(new ClipEffect(paddingBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));
- }
- }
- return effects;
- };
- return ElementPaint;
- }();
- var parseStackTree = function parseStackTree(parent, stackingContext, realStackingContext, listItems) {
- parent.container.elements.forEach(function (child) {
- var treatAsRealStackingContext = contains(child.flags, 4 /* CREATES_REAL_STACKING_CONTEXT */);
- var createsStackingContext = contains(child.flags, 2 /* CREATES_STACKING_CONTEXT */);
- var paintContainer = new ElementPaint(child, parent.getParentEffects());
- if (contains(child.styles.display, 2048 /* LIST_ITEM */)) {
- listItems.push(paintContainer);
- }
- var listOwnerItems = contains(child.flags, 8 /* IS_LIST_OWNER */) ? [] : listItems;
- if (treatAsRealStackingContext || createsStackingContext) {
- var parentStack = treatAsRealStackingContext || child.styles.isPositioned() ? realStackingContext : stackingContext;
- var stack = new StackingContext(paintContainer);
- if (child.styles.isPositioned() || child.styles.opacity < 1 || child.styles.isTransformed()) {
- var order_1 = child.styles.zIndex.order;
- if (order_1 < 0) {
- var index_1 = 0;
- parentStack.negativeZIndex.some(function (current, i) {
- if (order_1 > current.element.container.styles.zIndex.order) {
- index_1 = i;
- return false;
- } else
- if (index_1 > 0) {
- return true;
- }
- return false;
- });
- parentStack.negativeZIndex.splice(index_1, 0, stack);
- } else
- if (order_1 > 0) {
- var index_2 = 0;
- parentStack.positiveZIndex.some(function (current, i) {
- if (order_1 >= current.element.container.styles.zIndex.order) {
- index_2 = i + 1;
- return false;
- } else
- if (index_2 > 0) {
- return true;
- }
- return false;
- });
- parentStack.positiveZIndex.splice(index_2, 0, stack);
- } else
- {
- parentStack.zeroOrAutoZIndexOrTransformedOrOpacity.push(stack);
- }
- } else
- {
- if (child.styles.isFloating()) {
- parentStack.nonPositionedFloats.push(stack);
- } else
- {
- parentStack.nonPositionedInlineLevel.push(stack);
- }
- }
- parseStackTree(paintContainer, stack, treatAsRealStackingContext ? stack : realStackingContext, listOwnerItems);
- } else
- {
- if (child.styles.isInlineLevel()) {
- stackingContext.inlineLevel.push(paintContainer);
- } else
- {
- stackingContext.nonInlineLevel.push(paintContainer);
- }
- parseStackTree(paintContainer, stackingContext, realStackingContext, listOwnerItems);
- }
- if (contains(child.flags, 8 /* IS_LIST_OWNER */)) {
- processListItems(child, listOwnerItems);
- }
- });
- };
- var processListItems = function processListItems(owner, elements) {
- var numbering = owner instanceof OLElementContainer ? owner.start : 1;
- var reversed = owner instanceof OLElementContainer ? owner.reversed : false;
- for (var i = 0; i < elements.length; i++) {
- var item = elements[i];
- if (item.container instanceof LIElementContainer &&
- typeof item.container.value === 'number' &&
- item.container.value !== 0) {
- numbering = item.container.value;
- }
- item.listValue = createCounterText(numbering, item.container.styles.listStyleType, true);
- numbering += reversed ? -1 : 1;
- }
- };
- var parseStackingContexts = function parseStackingContexts(container) {
- var paintContainer = new ElementPaint(container, []);
- var root = new StackingContext(paintContainer);
- var listItems = [];
- parseStackTree(paintContainer, root, root, listItems);
- processListItems(paintContainer.container, listItems);
- return root;
- };
- var parsePathForBorder = function parsePathForBorder(curves, borderSide) {
- switch (borderSide) {
- case 0:
- return createPathFromCurves(curves.topLeftBorderBox, curves.topLeftPaddingBox, curves.topRightBorderBox, curves.topRightPaddingBox);
- case 1:
- return createPathFromCurves(curves.topRightBorderBox, curves.topRightPaddingBox, curves.bottomRightBorderBox, curves.bottomRightPaddingBox);
- case 2:
- return createPathFromCurves(curves.bottomRightBorderBox, curves.bottomRightPaddingBox, curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox);
- case 3:
- default:
- return createPathFromCurves(curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox, curves.topLeftBorderBox, curves.topLeftPaddingBox);}
- };
- var createPathFromCurves = function createPathFromCurves(outer1, inner1, outer2, inner2) {
- var path = [];
- if (isBezierCurve(outer1)) {
- path.push(outer1.subdivide(0.5, false));
- } else
- {
- path.push(outer1);
- }
- if (isBezierCurve(outer2)) {
- path.push(outer2.subdivide(0.5, true));
- } else
- {
- path.push(outer2);
- }
- if (isBezierCurve(inner2)) {
- path.push(inner2.subdivide(0.5, true).reverse());
- } else
- {
- path.push(inner2);
- }
- if (isBezierCurve(inner1)) {
- path.push(inner1.subdivide(0.5, false).reverse());
- } else
- {
- path.push(inner1);
- }
- return path;
- };
- var paddingBox = function paddingBox(element) {
- var bounds = element.bounds;
- var styles = element.styles;
- return bounds.add(styles.borderLeftWidth, styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth), -(styles.borderTopWidth + styles.borderBottomWidth));
- };
- var contentBox = function contentBox(element) {
- var styles = element.styles;
- var bounds = element.bounds;
- var paddingLeft = getAbsoluteValue(styles.paddingLeft, bounds.width);
- var paddingRight = getAbsoluteValue(styles.paddingRight, bounds.width);
- var paddingTop = getAbsoluteValue(styles.paddingTop, bounds.width);
- var paddingBottom = getAbsoluteValue(styles.paddingBottom, bounds.width);
- return bounds.add(paddingLeft + styles.borderLeftWidth, paddingTop + styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth + paddingLeft + paddingRight), -(styles.borderTopWidth + styles.borderBottomWidth + paddingTop + paddingBottom));
- };
- var calculateBackgroundPositioningArea = function calculateBackgroundPositioningArea(backgroundOrigin, element) {
- if (backgroundOrigin === 0 /* BORDER_BOX */) {
- return element.bounds;
- }
- if (backgroundOrigin === 2 /* CONTENT_BOX */) {
- return contentBox(element);
- }
- return paddingBox(element);
- };
- var calculateBackgroundPaintingArea = function calculateBackgroundPaintingArea(backgroundClip, element) {
- if (backgroundClip === BACKGROUND_CLIP.BORDER_BOX) {
- return element.bounds;
- }
- if (backgroundClip === BACKGROUND_CLIP.CONTENT_BOX) {
- return contentBox(element);
- }
- return paddingBox(element);
- };
- var calculateBackgroundRendering = function calculateBackgroundRendering(container, index, intrinsicSize) {
- var backgroundPositioningArea = calculateBackgroundPositioningArea(getBackgroundValueForIndex(container.styles.backgroundOrigin, index), container);
- var backgroundPaintingArea = calculateBackgroundPaintingArea(getBackgroundValueForIndex(container.styles.backgroundClip, index), container);
- var backgroundImageSize = calculateBackgroundSize(getBackgroundValueForIndex(container.styles.backgroundSize, index), intrinsicSize, backgroundPositioningArea);
- var sizeWidth = backgroundImageSize[0],sizeHeight = backgroundImageSize[1];
- var position = getAbsoluteValueForTuple(getBackgroundValueForIndex(container.styles.backgroundPosition, index), backgroundPositioningArea.width - sizeWidth, backgroundPositioningArea.height - sizeHeight);
- var path = calculateBackgroundRepeatPath(getBackgroundValueForIndex(container.styles.backgroundRepeat, index), position, backgroundImageSize, backgroundPositioningArea, backgroundPaintingArea);
- var offsetX = Math.round(backgroundPositioningArea.left + position[0]);
- var offsetY = Math.round(backgroundPositioningArea.top + position[1]);
- return [path, offsetX, offsetY, sizeWidth, sizeHeight];
- };
- var isAuto = function isAuto(token) {return isIdentToken(token) && token.value === BACKGROUND_SIZE.AUTO;};
- var hasIntrinsicValue = function hasIntrinsicValue(value) {return typeof value === 'number';};
- var calculateBackgroundSize = function calculateBackgroundSize(size, _a, bounds) {
- var intrinsicWidth = _a[0],intrinsicHeight = _a[1],intrinsicProportion = _a[2];
- var first = size[0],second = size[1];
- if (isLengthPercentage(first) && second && isLengthPercentage(second)) {
- return [getAbsoluteValue(first, bounds.width), getAbsoluteValue(second, bounds.height)];
- }
- var hasIntrinsicProportion = hasIntrinsicValue(intrinsicProportion);
- if (isIdentToken(first) && (first.value === BACKGROUND_SIZE.CONTAIN || first.value === BACKGROUND_SIZE.COVER)) {
- if (hasIntrinsicValue(intrinsicProportion)) {
- var targetRatio = bounds.width / bounds.height;
- return targetRatio < intrinsicProportion !== (first.value === BACKGROUND_SIZE.COVER) ?
- [bounds.width, bounds.width / intrinsicProportion] :
- [bounds.height * intrinsicProportion, bounds.height];
- }
- return [bounds.width, bounds.height];
- }
- var hasIntrinsicWidth = hasIntrinsicValue(intrinsicWidth);
- var hasIntrinsicHeight = hasIntrinsicValue(intrinsicHeight);
- var hasIntrinsicDimensions = hasIntrinsicWidth || hasIntrinsicHeight;
- // If the background-size is auto or auto auto:
- if (isAuto(first) && (!second || isAuto(second))) {
- // If the image has both horizontal and vertical intrinsic dimensions, it's rendered at that size.
- if (hasIntrinsicWidth && hasIntrinsicHeight) {
- return [intrinsicWidth, intrinsicHeight];
- }
- // If the image has no intrinsic dimensions and has no intrinsic proportions,
- // it's rendered at the size of the background positioning area.
- if (!hasIntrinsicProportion && !hasIntrinsicDimensions) {
- return [bounds.width, bounds.height];
- }
- // TODO If the image has no intrinsic dimensions but has intrinsic proportions, it's rendered as if contain had been specified instead.
- // If the image has only one intrinsic dimension and has intrinsic proportions, it's rendered at the size corresponding to that one dimension.
- // The other dimension is computed using the specified dimension and the intrinsic proportions.
- if (hasIntrinsicDimensions && hasIntrinsicProportion) {
- var width_1 = hasIntrinsicWidth ?
- intrinsicWidth :
- intrinsicHeight * intrinsicProportion;
- var height_1 = hasIntrinsicHeight ?
- intrinsicHeight :
- intrinsicWidth / intrinsicProportion;
- return [width_1, height_1];
- }
- // If the image has only one intrinsic dimension but has no intrinsic proportions,
- // it's rendered using the specified dimension and the other dimension of the background positioning area.
- var width_2 = hasIntrinsicWidth ? intrinsicWidth : bounds.width;
- var height_2 = hasIntrinsicHeight ? intrinsicHeight : bounds.height;
- return [width_2, height_2];
- }
- // If the image has intrinsic proportions, it's stretched to the specified dimension.
- // The unspecified dimension is computed using the specified dimension and the intrinsic proportions.
- if (hasIntrinsicProportion) {
- var width_3 = 0;
- var height_3 = 0;
- if (isLengthPercentage(first)) {
- width_3 = getAbsoluteValue(first, bounds.width);
- } else
- if (isLengthPercentage(second)) {
- height_3 = getAbsoluteValue(second, bounds.height);
- }
- if (isAuto(first)) {
- width_3 = height_3 * intrinsicProportion;
- } else
- if (!second || isAuto(second)) {
- height_3 = width_3 / intrinsicProportion;
- }
- return [width_3, height_3];
- }
- // If the image has no intrinsic proportions, it's stretched to the specified dimension.
- // The unspecified dimension is computed using the image's corresponding intrinsic dimension,
- // if there is one. If there is no such intrinsic dimension,
- // it becomes the corresponding dimension of the background positioning area.
- var width = null;
- var height = null;
- if (isLengthPercentage(first)) {
- width = getAbsoluteValue(first, bounds.width);
- } else
- if (second && isLengthPercentage(second)) {
- height = getAbsoluteValue(second, bounds.height);
- }
- if (width !== null && (!second || isAuto(second))) {
- height =
- hasIntrinsicWidth && hasIntrinsicHeight ?
- width / intrinsicWidth * intrinsicHeight :
- bounds.height;
- }
- if (height !== null && isAuto(first)) {
- width =
- hasIntrinsicWidth && hasIntrinsicHeight ?
- height / intrinsicHeight * intrinsicWidth :
- bounds.width;
- }
- if (width !== null && height !== null) {
- return [width, height];
- }
- throw new Error("Unable to calculate background-size for element");
- };
- var getBackgroundValueForIndex = function getBackgroundValueForIndex(values, index) {
- var value = values[index];
- if (typeof value === 'undefined') {
- return values[0];
- }
- return value;
- };
- var calculateBackgroundRepeatPath = function calculateBackgroundRepeatPath(repeat, _a, _b, backgroundPositioningArea, backgroundPaintingArea) {
- var x = _a[0],y = _a[1];
- var width = _b[0],height = _b[1];
- switch (repeat) {
- case BACKGROUND_REPEAT.REPEAT_X:
- return [
- new Vector(Math.round(backgroundPositioningArea.left), Math.round(backgroundPositioningArea.top + y)),
- new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(backgroundPositioningArea.top + y)),
- new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(height + backgroundPositioningArea.top + y)),
- new Vector(Math.round(backgroundPositioningArea.left), Math.round(height + backgroundPositioningArea.top + y))];
- case BACKGROUND_REPEAT.REPEAT_Y:
- return [
- new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top)),
- new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top)),
- new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)),
- new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top))];
- case BACKGROUND_REPEAT.NO_REPEAT:
- return [
- new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y)),
- new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y)),
- new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y + height)),
- new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y + height))];
- default:
- return [
- new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.top)),
- new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.top)),
- new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)),
- new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top))];}
- };
- var SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
- var SAMPLE_TEXT = 'Hidden Text';
- var FontMetrics = /** @class */function () {
- function FontMetrics(document) {
- this._data = {};
- this._document = document;
- }
- FontMetrics.prototype.parseMetrics = function (fontFamily, fontSize) {
- var container = this._document.createElement('div');
- var img = this._document.createElement('img');
- var span = this._document.createElement('span');
- var body = this._document.body;
- container.style.visibility = 'hidden';
- container.style.fontFamily = fontFamily;
- container.style.fontSize = fontSize;
- container.style.margin = '0';
- container.style.padding = '0';
- body.appendChild(container);
- img.src = SMALL_IMAGE;
- img.width = 1;
- img.height = 1;
- img.style.margin = '0';
- img.style.padding = '0';
- img.style.verticalAlign = 'baseline';
- span.style.fontFamily = fontFamily;
- span.style.fontSize = fontSize;
- span.style.margin = '0';
- span.style.padding = '0';
- span.appendChild(this._document.createTextNode(SAMPLE_TEXT));
- container.appendChild(span);
- container.appendChild(img);
- var baseline = img.offsetTop - span.offsetTop + 2;
- container.removeChild(span);
- container.appendChild(this._document.createTextNode(SAMPLE_TEXT));
- container.style.lineHeight = 'normal';
- img.style.verticalAlign = 'super';
- var middle = img.offsetTop - container.offsetTop + 2;
- body.removeChild(container);
- return { baseline: baseline, middle: middle };
- };
- FontMetrics.prototype.getMetrics = function (fontFamily, fontSize) {
- var key = fontFamily + " " + fontSize;
- if (typeof this._data[key] === 'undefined') {
- this._data[key] = this.parseMetrics(fontFamily, fontSize);
- }
- return this._data[key];
- };
- return FontMetrics;
- }();
- var MASK_OFFSET = 10000;
- var CanvasRenderer = /** @class */function () {
- function CanvasRenderer(options) {
- this._activeEffects = [];
- this.canvas = options.canvas ? options.canvas : document.createElement('canvas');
- this.ctx = this.canvas.getContext('2d');
- this.options = options;
- if (!options.canvas) {
- this.canvas.width = Math.floor(options.width * options.scale);
- this.canvas.height = Math.floor(options.height * options.scale);
- this.canvas.style.width = options.width + "px";
- this.canvas.style.height = options.height + "px";
- }
- this.fontMetrics = new FontMetrics(document);
- this.ctx.scale(this.options.scale, this.options.scale);
- this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);
- this.ctx.textBaseline = 'bottom';
- this._activeEffects = [];
- Logger.getInstance(options.id).debug("Canvas renderer initialized (" + options.width + "x" + options.height + " at " + options.x + "," + options.y + ") with scale " + options.scale);
- }
- CanvasRenderer.prototype.applyEffects = function (effects, target) {
- var _this = this;
- while (this._activeEffects.length) {
- this.popEffect();
- }
- effects.filter(function (effect) {return contains(effect.target, target);}).forEach(function (effect) {return _this.applyEffect(effect);});
- };
- CanvasRenderer.prototype.applyEffect = function (effect) {
- this.ctx.save();
- if (isOpacityEffect(effect)) {
- this.ctx.globalAlpha = effect.opacity;
- }
- if (isTransformEffect(effect)) {
- this.ctx.translate(effect.offsetX, effect.offsetY);
- this.ctx.transform(effect.matrix[0], effect.matrix[1], effect.matrix[2], effect.matrix[3], effect.matrix[4], effect.matrix[5]);
- this.ctx.translate(-effect.offsetX, -effect.offsetY);
- }
- if (isClipEffect(effect)) {
- this.path(effect.path);
- this.ctx.clip();
- }
- this._activeEffects.push(effect);
- };
- CanvasRenderer.prototype.popEffect = function () {
- this._activeEffects.pop();
- this.ctx.restore();
- };
- CanvasRenderer.prototype.renderStack = function (stack) {
- return __awaiter(this, void 0, void 0, function () {
- var styles;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- styles = stack.element.container.styles;
- if (!styles.isVisible()) return [3 /*break*/, 2];
- return [4 /*yield*/, this.renderStackContent(stack)];
- case 1:
- _a.sent();
- _a.label = 2;
- case 2:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.renderNode = function (paint) {
- return __awaiter(this, void 0, void 0, function () {
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- if (!paint.container.styles.isVisible()) return [3 /*break*/, 3];
- return [4 /*yield*/, this.renderNodeBackgroundAndBorders(paint)];
- case 1:
- _a.sent();
- return [4 /*yield*/, this.renderNodeContent(paint)];
- case 2:
- _a.sent();
- _a.label = 3;
- case 3:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.renderTextWithLetterSpacing = function (text, letterSpacing) {
- var _this = this;
- if (letterSpacing === 0) {
- this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);
- } else
- {
- var letters = toCodePoints(text.text).map(function (i) {return fromCodePoint(i);});
- letters.reduce(function (left, letter) {
- _this.ctx.fillText(letter, left, text.bounds.top + text.bounds.height);
- return left + _this.ctx.measureText(letter).width;
- }, text.bounds.left);
- }
- };
- CanvasRenderer.prototype.createFontStyle = function (styles) {
- var fontVariant = styles.fontVariant.
- filter(function (variant) {return variant === 'normal' || variant === 'small-caps';}).
- join('');
- var fontFamily = styles.fontFamily.join(', ');
- var fontSize = isDimensionToken(styles.fontSize) ?
- "" + styles.fontSize.number + styles.fontSize.unit :
- styles.fontSize.number + "px";
- return [
- [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),
- fontFamily,
- fontSize];
- };
- CanvasRenderer.prototype.renderTextNode = function (text, styles) {
- return __awaiter(this, void 0, void 0, function () {
- var _a, font, fontFamily, fontSize;
- var _this = this;
- return __generator(this, function (_b) {
- _a = this.createFontStyle(styles), font = _a[0], fontFamily = _a[1], fontSize = _a[2];
- this.ctx.font = font;
- text.textBounds.forEach(function (text) {
- _this.ctx.fillStyle = asString(styles.color);
- _this.renderTextWithLetterSpacing(text, styles.letterSpacing);
- var textShadows = styles.textShadow;
- if (textShadows.length && text.text.trim().length) {
- textShadows.
- slice(0).
- reverse().
- forEach(function (textShadow) {
- _this.ctx.shadowColor = asString(textShadow.color);
- _this.ctx.shadowOffsetX = textShadow.offsetX.number * _this.options.scale;
- _this.ctx.shadowOffsetY = textShadow.offsetY.number * _this.options.scale;
- _this.ctx.shadowBlur = textShadow.blur.number;
- _this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);
- });
- _this.ctx.shadowColor = '';
- _this.ctx.shadowOffsetX = 0;
- _this.ctx.shadowOffsetY = 0;
- _this.ctx.shadowBlur = 0;
- }
- if (styles.textDecorationLine.length) {
- _this.ctx.fillStyle = asString(styles.textDecorationColor || styles.color);
- styles.textDecorationLine.forEach(function (textDecorationLine) {
- switch (textDecorationLine) {
- case 1 /* UNDERLINE */:
- // Draws a line at the baseline of the font
- // TODO As some browsers display the line as more than 1px if the font-size is big,
- // need to take that into account both in position and size
- var baseline = _this.fontMetrics.getMetrics(fontFamily, fontSize).baseline;
- _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1);
- break;
- case 2 /* OVERLINE */:
- _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1);
- break;
- case 3 /* LINE_THROUGH */:
- // TODO try and find exact position for line-through
- var middle = _this.fontMetrics.getMetrics(fontFamily, fontSize).middle;
- _this.ctx.fillRect(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1);
- break;}
- });
- }
- });
- return [2 /*return*/];
- });
- });
- };
- CanvasRenderer.prototype.renderReplacedElement = function (container, curves, image) {
- if (image && container.intrinsicWidth > 0 && container.intrinsicHeight > 0) {
- var box = contentBox(container);
- var path = calculatePaddingBoxPath(curves);
- this.path(path);
- this.ctx.save();
- this.ctx.clip();
- this.ctx.drawImage(image, 0, 0, container.intrinsicWidth, container.intrinsicHeight, box.left, box.top, box.width, box.height);
- this.ctx.restore();
- }
- };
- CanvasRenderer.prototype.renderNodeContent = function (paint) {
- return __awaiter(this, void 0, void 0, function () {
- var container, curves, styles, _i, _a, child, image, e_1, image, e_2, iframeRenderer, canvas, size, bounds, x, textBounds, img, image, url, e_3, bounds;
- return __generator(this, function (_b) {
- switch (_b.label) {
- case 0:
- this.applyEffects(paint.effects, 4 /* CONTENT */);
- container = paint.container;
- curves = paint.curves;
- styles = container.styles;
- _i = 0, _a = container.textNodes;
- _b.label = 1;
- case 1:
- if (!(_i < _a.length)) return [3 /*break*/, 4];
- child = _a[_i];
- return [4 /*yield*/, this.renderTextNode(child, styles)];
- case 2:
- _b.sent();
- _b.label = 3;
- case 3:
- _i++;
- return [3 /*break*/, 1];
- case 4:
- if (!(container instanceof ImageElementContainer)) return [3 /*break*/, 8];
- _b.label = 5;
- case 5:
- _b.trys.push([5, 7,, 8]);
- return [4 /*yield*/, this.options.cache.match(container.src)];
- case 6:
- image = _b.sent();
- this.renderReplacedElement(container, curves, image);
- return [3 /*break*/, 8];
- case 7:
- e_1 = _b.sent();
- Logger.getInstance(this.options.id).error("Error loading image " + container.src);
- return [3 /*break*/, 8];
- case 8:
- if (container instanceof CanvasElementContainer) {
- this.renderReplacedElement(container, curves, container.canvas);
- }
- if (!(container instanceof SVGElementContainer)) return [3 /*break*/, 12];
- _b.label = 9;
- case 9:
- _b.trys.push([9, 11,, 12]);
- return [4 /*yield*/, this.options.cache.match(container.svg)];
- case 10:
- image = _b.sent();
- this.renderReplacedElement(container, curves, image);
- return [3 /*break*/, 12];
- case 11:
- e_2 = _b.sent();
- Logger.getInstance(this.options.id).error("Error loading svg " + container.svg.substring(0, 255));
- return [3 /*break*/, 12];
- case 12:
- if (!(container instanceof IFrameElementContainer && container.tree)) return [3 /*break*/, 14];
- iframeRenderer = new CanvasRenderer({
- id: this.options.id,
- scale: this.options.scale,
- backgroundColor: container.backgroundColor,
- x: 0,
- y: 0,
- scrollX: 0,
- scrollY: 0,
- width: container.width,
- height: container.height,
- cache: this.options.cache,
- windowWidth: container.width,
- windowHeight: container.height });
- return [4 /*yield*/, iframeRenderer.render(container.tree)];
- case 13:
- canvas = _b.sent();
- if (container.width && container.height) {
- this.ctx.drawImage(canvas, 0, 0, container.width, container.height, container.bounds.left, container.bounds.top, container.bounds.width, container.bounds.height);
- }
- _b.label = 14;
- case 14:
- if (container instanceof InputElementContainer) {
- size = Math.min(container.bounds.width, container.bounds.height);
- if (container.type === CHECKBOX) {
- if (container.checked) {
- this.ctx.save();
- this.path([
- new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79),
- new Vector(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549),
- new Vector(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071),
- new Vector(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649),
- new Vector(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23),
- new Vector(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085),
- new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)]);
- this.ctx.fillStyle = asString(INPUT_COLOR);
- this.ctx.fill();
- this.ctx.restore();
- }
- } else
- if (container.type === RADIO) {
- if (container.checked) {
- this.ctx.save();
- this.ctx.beginPath();
- this.ctx.arc(container.bounds.left + size / 2, container.bounds.top + size / 2, size / 4, 0, Math.PI * 2, true);
- this.ctx.fillStyle = asString(INPUT_COLOR);
- this.ctx.fill();
- this.ctx.restore();
- }
- }
- }
- if (isTextInputElement(container) && container.value.length) {
- this.ctx.font = this.createFontStyle(styles)[0];
- this.ctx.fillStyle = asString(styles.color);
- this.ctx.textBaseline = 'middle';
- this.ctx.textAlign = canvasTextAlign(container.styles.textAlign);
- bounds = contentBox(container);
- x = 0;
- switch (container.styles.textAlign) {
- case TEXT_ALIGN.CENTER:
- x += bounds.width / 2;
- break;
- case TEXT_ALIGN.RIGHT:
- x += bounds.width;
- break;}
- textBounds = bounds.add(x, 0, 0, -bounds.height / 2 + 1);
- this.ctx.save();
- this.path([
- new Vector(bounds.left, bounds.top),
- new Vector(bounds.left + bounds.width, bounds.top),
- new Vector(bounds.left + bounds.width, bounds.top + bounds.height),
- new Vector(bounds.left, bounds.top + bounds.height)]);
- this.ctx.clip();
- this.renderTextWithLetterSpacing(new TextBounds(container.value, textBounds), styles.letterSpacing);
- this.ctx.restore();
- this.ctx.textBaseline = 'bottom';
- this.ctx.textAlign = 'left';
- }
- if (!contains(container.styles.display, 2048 /* LIST_ITEM */)) return [3 /*break*/, 20];
- if (!(container.styles.listStyleImage !== null)) return [3 /*break*/, 19];
- img = container.styles.listStyleImage;
- if (!(img.type === CSSImageType.URL)) return [3 /*break*/, 18];
- image = void 0;
- url = img.url;
- _b.label = 15;
- case 15:
- _b.trys.push([15, 17,, 18]);
- return [4 /*yield*/, this.options.cache.match(url)];
- case 16:
- image = _b.sent();
- this.ctx.drawImage(image, container.bounds.left - (image.width + 10), container.bounds.top);
- return [3 /*break*/, 18];
- case 17:
- e_3 = _b.sent();
- Logger.getInstance(this.options.id).error("Error loading list-style-image " + url);
- return [3 /*break*/, 18];
- case 18:return [3 /*break*/, 20];
- case 19:
- if (paint.listValue && container.styles.listStyleType !== LIST_STYLE_TYPE.NONE) {
- this.ctx.font = this.createFontStyle(styles)[0];
- this.ctx.fillStyle = asString(styles.color);
- this.ctx.textBaseline = 'middle';
- this.ctx.textAlign = 'right';
- bounds = new Bounds(container.bounds.left, container.bounds.top + getAbsoluteValue(container.styles.paddingTop, container.bounds.width), container.bounds.width, computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2 + 1);
- this.renderTextWithLetterSpacing(new TextBounds(paint.listValue, bounds), styles.letterSpacing);
- this.ctx.textBaseline = 'bottom';
- this.ctx.textAlign = 'left';
- }
- _b.label = 20;
- case 20:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.renderStackContent = function (stack) {
- return __awaiter(this, void 0, void 0, function () {
- var _i, _a, child, _b, _c, child, _d, _e, child, _f, _g, child, _h, _j, child, _k, _l, child, _m, _o, child;
- return __generator(this, function (_p) {
- switch (_p.label) {
- case 0:
- // https://www.w3.org/TR/css-position-3/#painting-order
- // 1. the background and borders of the element forming the stacking context.
- return [4 /*yield*/, this.renderNodeBackgroundAndBorders(stack.element)];
- case 1:
- // https://www.w3.org/TR/css-position-3/#painting-order
- // 1. the background and borders of the element forming the stacking context.
- _p.sent();
- _i = 0, _a = stack.negativeZIndex;
- _p.label = 2;
- case 2:
- if (!(_i < _a.length)) return [3 /*break*/, 5];
- child = _a[_i];
- return [4 /*yield*/, this.renderStack(child)];
- case 3:
- _p.sent();
- _p.label = 4;
- case 4:
- _i++;
- return [3 /*break*/, 2];
- case 5:
- // 3. For all its in-flow, non-positioned, block-level descendants in tree order:
- return [4 /*yield*/, this.renderNodeContent(stack.element)];
- case 6:
- // 3. For all its in-flow, non-positioned, block-level descendants in tree order:
- _p.sent();
- _b = 0, _c = stack.nonInlineLevel;
- _p.label = 7;
- case 7:
- if (!(_b < _c.length)) return [3 /*break*/, 10];
- child = _c[_b];
- return [4 /*yield*/, this.renderNode(child)];
- case 8:
- _p.sent();
- _p.label = 9;
- case 9:
- _b++;
- return [3 /*break*/, 7];
- case 10:
- _d = 0, _e = stack.nonPositionedFloats;
- _p.label = 11;
- case 11:
- if (!(_d < _e.length)) return [3 /*break*/, 14];
- child = _e[_d];
- return [4 /*yield*/, this.renderStack(child)];
- case 12:
- _p.sent();
- _p.label = 13;
- case 13:
- _d++;
- return [3 /*break*/, 11];
- case 14:
- _f = 0, _g = stack.nonPositionedInlineLevel;
- _p.label = 15;
- case 15:
- if (!(_f < _g.length)) return [3 /*break*/, 18];
- child = _g[_f];
- return [4 /*yield*/, this.renderStack(child)];
- case 16:
- _p.sent();
- _p.label = 17;
- case 17:
- _f++;
- return [3 /*break*/, 15];
- case 18:
- _h = 0, _j = stack.inlineLevel;
- _p.label = 19;
- case 19:
- if (!(_h < _j.length)) return [3 /*break*/, 22];
- child = _j[_h];
- return [4 /*yield*/, this.renderNode(child)];
- case 20:
- _p.sent();
- _p.label = 21;
- case 21:
- _h++;
- return [3 /*break*/, 19];
- case 22:
- _k = 0, _l = stack.zeroOrAutoZIndexOrTransformedOrOpacity;
- _p.label = 23;
- case 23:
- if (!(_k < _l.length)) return [3 /*break*/, 26];
- child = _l[_k];
- return [4 /*yield*/, this.renderStack(child)];
- case 24:
- _p.sent();
- _p.label = 25;
- case 25:
- _k++;
- return [3 /*break*/, 23];
- case 26:
- _m = 0, _o = stack.positiveZIndex;
- _p.label = 27;
- case 27:
- if (!(_m < _o.length)) return [3 /*break*/, 30];
- child = _o[_m];
- return [4 /*yield*/, this.renderStack(child)];
- case 28:
- _p.sent();
- _p.label = 29;
- case 29:
- _m++;
- return [3 /*break*/, 27];
- case 30:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.mask = function (paths) {
- this.ctx.beginPath();
- this.ctx.moveTo(0, 0);
- this.ctx.lineTo(this.canvas.width, 0);
- this.ctx.lineTo(this.canvas.width, this.canvas.height);
- this.ctx.lineTo(0, this.canvas.height);
- this.ctx.lineTo(0, 0);
- this.formatPath(paths.slice(0).reverse());
- this.ctx.closePath();
- };
- CanvasRenderer.prototype.path = function (paths) {
- this.ctx.beginPath();
- this.formatPath(paths);
- this.ctx.closePath();
- };
- CanvasRenderer.prototype.formatPath = function (paths) {
- var _this = this;
- paths.forEach(function (point, index) {
- var start = isBezierCurve(point) ? point.start : point;
- if (index === 0) {
- _this.ctx.moveTo(start.x, start.y);
- } else
- {
- _this.ctx.lineTo(start.x, start.y);
- }
- if (isBezierCurve(point)) {
- _this.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);
- }
- });
- };
- CanvasRenderer.prototype.renderRepeat = function (path, pattern, offsetX, offsetY) {
- this.path(path);
- this.ctx.fillStyle = pattern;
- this.ctx.translate(offsetX, offsetY);
- this.ctx.fill();
- this.ctx.translate(-offsetX, -offsetY);
- };
- CanvasRenderer.prototype.resizeImage = function (image, width, height) {
- if (image.width === width && image.height === height) {
- return image;
- }
- var canvas = this.canvas.ownerDocument.createElement('canvas');
- canvas.width = width;
- canvas.height = height;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);
- return canvas;
- };
- CanvasRenderer.prototype.renderBackgroundImage = function (container) {
- return __awaiter(this, void 0, void 0, function () {
- var index, _loop_1, this_1, _i, _a, backgroundImage;
- return __generator(this, function (_b) {
- switch (_b.label) {
- case 0:
- index = container.styles.backgroundImage.length - 1;
- _loop_1 = function _loop_1(backgroundImage) {
- var image, url, e_4, _a, path, x, y, width, height, pattern, _b, path, x, y, width, height, _c, lineLength, x0, x1, y0, y1, canvas, ctx, gradient_1, pattern, _d, path, left, top_1, width, height, position, x, y, _e, rx, ry, radialGradient_1, midX, midY, f, invF;
- return __generator(this, function (_f) {
- switch (_f.label) {
- case 0:
- if (!(backgroundImage.type === CSSImageType.URL)) return [3 /*break*/, 5];
- image = void 0;
- url = backgroundImage.url;
- _f.label = 1;
- case 1:
- _f.trys.push([1, 3,, 4]);
- return [4 /*yield*/, this_1.options.cache.match(url)];
- case 2:
- image = _f.sent();
- return [3 /*break*/, 4];
- case 3:
- e_4 = _f.sent();
- Logger.getInstance(this_1.options.id).error("Error loading background-image " + url);
- return [3 /*break*/, 4];
- case 4:
- if (image) {
- _a = calculateBackgroundRendering(container, index, [
- image.width,
- image.height,
- image.width / image.height]),
- path = _a[0], x = _a[1], y = _a[2], width = _a[3], height = _a[4];
- pattern = this_1.ctx.createPattern(this_1.resizeImage(image, width, height), 'repeat');
- this_1.renderRepeat(path, pattern, x, y);
- }
- return [3 /*break*/, 6];
- case 5:
- if (isLinearGradient(backgroundImage)) {
- _b = calculateBackgroundRendering(container, index, [null, null, null]), path = _b[0], x = _b[1], y = _b[2], width = _b[3], height = _b[4];
- _c = calculateGradientDirection(backgroundImage.angle, width, height), lineLength = _c[0], x0 = _c[1], x1 = _c[2], y0 = _c[3], y1 = _c[4];
- canvas = document.createElement('canvas');
- canvas.width = width;
- canvas.height = height;
- ctx = canvas.getContext('2d');
- gradient_1 = ctx.createLinearGradient(x0, y0, x1, y1);
- processColorStops(backgroundImage.stops, lineLength).forEach(function (colorStop) {
- return gradient_1.addColorStop(colorStop.stop, asString(colorStop.color));
- });
- ctx.fillStyle = gradient_1;
- ctx.fillRect(0, 0, width, height);
- if (width > 0 && height > 0) {
- pattern = this_1.ctx.createPattern(canvas, 'repeat');
- this_1.renderRepeat(path, pattern, x, y);
- }
- } else
- if (isRadialGradient(backgroundImage)) {
- _d = calculateBackgroundRendering(container, index, [
- null,
- null,
- null]),
- path = _d[0], left = _d[1], top_1 = _d[2], width = _d[3], height = _d[4];
- position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;
- x = getAbsoluteValue(position[0], width);
- y = getAbsoluteValue(position[position.length - 1], height);
- _e = calculateRadius(backgroundImage, x, y, width, height), rx = _e[0], ry = _e[1];
- if (rx > 0 && rx > 0) {
- radialGradient_1 = this_1.ctx.createRadialGradient(left + x, top_1 + y, 0, left + x, top_1 + y, rx);
- processColorStops(backgroundImage.stops, rx * 2).forEach(function (colorStop) {
- return radialGradient_1.addColorStop(colorStop.stop, asString(colorStop.color));
- });
- this_1.path(path);
- this_1.ctx.fillStyle = radialGradient_1;
- if (rx !== ry) {
- midX = container.bounds.left + 0.5 * container.bounds.width;
- midY = container.bounds.top + 0.5 * container.bounds.height;
- f = ry / rx;
- invF = 1 / f;
- this_1.ctx.save();
- this_1.ctx.translate(midX, midY);
- this_1.ctx.transform(1, 0, 0, f, 0, 0);
- this_1.ctx.translate(-midX, -midY);
- this_1.ctx.fillRect(left, invF * (top_1 - midY) + midY, width, height * invF);
- this_1.ctx.restore();
- } else
- {
- this_1.ctx.fill();
- }
- }
- }
- _f.label = 6;
- case 6:
- index--;
- return [2 /*return*/];}
- });
- };
- this_1 = this;
- _i = 0, _a = container.styles.backgroundImage.slice(0).reverse();
- _b.label = 1;
- case 1:
- if (!(_i < _a.length)) return [3 /*break*/, 4];
- backgroundImage = _a[_i];
- return [5 /*yield**/, _loop_1(backgroundImage)];
- case 2:
- _b.sent();
- _b.label = 3;
- case 3:
- _i++;
- return [3 /*break*/, 1];
- case 4:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.renderBorder = function (color, side, curvePoints) {
- return __awaiter(this, void 0, void 0, function () {
- return __generator(this, function (_a) {
- this.path(parsePathForBorder(curvePoints, side));
- this.ctx.fillStyle = asString(color);
- this.ctx.fill();
- return [2 /*return*/];
- });
- });
- };
- CanvasRenderer.prototype.renderNodeBackgroundAndBorders = function (paint) {
- return __awaiter(this, void 0, void 0, function () {
- var styles, hasBackground, borders, backgroundPaintingArea, side, _i, borders_1, border;
- var _this = this;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- this.applyEffects(paint.effects, 2 /* BACKGROUND_BORDERS */);
- styles = paint.container.styles;
- hasBackground = !isTransparent(styles.backgroundColor) || styles.backgroundImage.length;
- borders = [
- { style: styles.borderTopStyle, color: styles.borderTopColor },
- { style: styles.borderRightStyle, color: styles.borderRightColor },
- { style: styles.borderBottomStyle, color: styles.borderBottomColor },
- { style: styles.borderLeftStyle, color: styles.borderLeftColor }];
- backgroundPaintingArea = calculateBackgroundCurvedPaintingArea(getBackgroundValueForIndex(styles.backgroundClip, 0), paint.curves);
- if (!(hasBackground || styles.boxShadow.length)) return [3 /*break*/, 2];
- this.ctx.save();
- this.path(backgroundPaintingArea);
- this.ctx.clip();
- if (!isTransparent(styles.backgroundColor)) {
- this.ctx.fillStyle = asString(styles.backgroundColor);
- this.ctx.fill();
- }
- return [4 /*yield*/, this.renderBackgroundImage(paint.container)];
- case 1:
- _a.sent();
- this.ctx.restore();
- styles.boxShadow.
- slice(0).
- reverse().
- forEach(function (shadow) {
- _this.ctx.save();
- var borderBoxArea = calculateBorderBoxPath(paint.curves);
- var maskOffset = shadow.inset ? 0 : MASK_OFFSET;
- var shadowPaintingArea = transformPath(borderBoxArea, -maskOffset + (shadow.inset ? 1 : -1) * shadow.spread.number, (shadow.inset ? 1 : -1) * shadow.spread.number, shadow.spread.number * (shadow.inset ? -2 : 2), shadow.spread.number * (shadow.inset ? -2 : 2));
- if (shadow.inset) {
- _this.path(borderBoxArea);
- _this.ctx.clip();
- _this.mask(shadowPaintingArea);
- } else
- {
- _this.mask(borderBoxArea);
- _this.ctx.clip();
- _this.path(shadowPaintingArea);
- }
- _this.ctx.shadowOffsetX = shadow.offsetX.number + maskOffset;
- _this.ctx.shadowOffsetY = shadow.offsetY.number;
- _this.ctx.shadowColor = asString(shadow.color);
- _this.ctx.shadowBlur = shadow.blur.number;
- _this.ctx.fillStyle = shadow.inset ? asString(shadow.color) : 'rgba(0,0,0,1)';
- _this.ctx.fill();
- _this.ctx.restore();
- });
- _a.label = 2;
- case 2:
- side = 0;
- _i = 0, borders_1 = borders;
- _a.label = 3;
- case 3:
- if (!(_i < borders_1.length)) return [3 /*break*/, 7];
- border = borders_1[_i];
- if (!(border.style !== BORDER_STYLE.NONE && !isTransparent(border.color))) return [3 /*break*/, 5];
- return [4 /*yield*/, this.renderBorder(border.color, side, paint.curves)];
- case 4:
- _a.sent();
- _a.label = 5;
- case 5:
- side++;
- _a.label = 6;
- case 6:
- _i++;
- return [3 /*break*/, 3];
- case 7:return [2 /*return*/];}
- });
- });
- };
- CanvasRenderer.prototype.render = function (element) {
- return __awaiter(this, void 0, void 0, function () {
- var stack;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- if (this.options.backgroundColor) {
- this.ctx.fillStyle = asString(this.options.backgroundColor);
- this.ctx.fillRect(this.options.x - this.options.scrollX, this.options.y - this.options.scrollY, this.options.width, this.options.height);
- }
- stack = parseStackingContexts(element);
- return [4 /*yield*/, this.renderStack(stack)];
- case 1:
- _a.sent();
- this.applyEffects([], 2 /* BACKGROUND_BORDERS */);
- return [2 /*return*/, this.canvas];}
- });
- });
- };
- return CanvasRenderer;
- }();
- var isTextInputElement = function isTextInputElement(container) {
- if (container instanceof TextareaElementContainer) {
- return true;
- } else
- if (container instanceof SelectElementContainer) {
- return true;
- } else
- if (container instanceof InputElementContainer && container.type !== RADIO && container.type !== CHECKBOX) {
- return true;
- }
- return false;
- };
- var calculateBackgroundCurvedPaintingArea = function calculateBackgroundCurvedPaintingArea(clip, curves) {
- switch (clip) {
- case BACKGROUND_CLIP.BORDER_BOX:
- return calculateBorderBoxPath(curves);
- case BACKGROUND_CLIP.CONTENT_BOX:
- return calculateContentBoxPath(curves);
- case BACKGROUND_CLIP.PADDING_BOX:
- default:
- return calculatePaddingBoxPath(curves);}
- };
- var canvasTextAlign = function canvasTextAlign(textAlign) {
- switch (textAlign) {
- case TEXT_ALIGN.CENTER:
- return 'center';
- case TEXT_ALIGN.RIGHT:
- return 'right';
- case TEXT_ALIGN.LEFT:
- default:
- return 'left';}
- };
- var ForeignObjectRenderer = /** @class */function () {
- function ForeignObjectRenderer(options) {
- this.canvas = options.canvas ? options.canvas : document.createElement('canvas');
- this.ctx = this.canvas.getContext('2d');
- this.options = options;
- this.canvas.width = Math.floor(options.width * options.scale);
- this.canvas.height = Math.floor(options.height * options.scale);
- this.canvas.style.width = options.width + "px";
- this.canvas.style.height = options.height + "px";
- this.ctx.scale(this.options.scale, this.options.scale);
- this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);
- Logger.getInstance(options.id).debug("EXPERIMENTAL ForeignObject renderer initialized (" + options.width + "x" + options.height + " at " + options.x + "," + options.y + ") with scale " + options.scale);
- }
- ForeignObjectRenderer.prototype.render = function (element) {
- return __awaiter(this, void 0, void 0, function () {
- var svg, img;
- return __generator(this, function (_a) {
- switch (_a.label) {
- case 0:
- svg = createForeignObjectSVG(Math.max(this.options.windowWidth, this.options.width) * this.options.scale, Math.max(this.options.windowHeight, this.options.height) * this.options.scale, this.options.scrollX * this.options.scale, this.options.scrollY * this.options.scale, element);
- return [4 /*yield*/, loadSerializedSVG$1(svg)];
- case 1:
- img = _a.sent();
- if (this.options.backgroundColor) {
- this.ctx.fillStyle = asString(this.options.backgroundColor);
- this.ctx.fillRect(0, 0, this.options.width * this.options.scale, this.options.height * this.options.scale);
- }
- this.ctx.drawImage(img, -this.options.x * this.options.scale, -this.options.y * this.options.scale);
- return [2 /*return*/, this.canvas];}
- });
- });
- };
- return ForeignObjectRenderer;
- }();
- var loadSerializedSVG$1 = function loadSerializedSVG$1(svg) {
- return new Promise(function (resolve, reject) {
- var img = new Image();
- img.onload = function () {
- resolve(img);
- };
- img.onerror = reject;
- img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));
- });
- };
- var _this = undefined;
- var parseColor$1 = function parseColor$1(value) {return color.parse(Parser.create(value).parseComponentValue());};
- var html2canvas = function html2canvas(element, options) {
- if (options === void 0) {options = {};}
- return renderElement(element, options);
- };
- if (typeof window !== 'undefined') {
- CacheStorage.setContext(window);
- }
- var renderElement = function renderElement(element, opts) {return __awaiter(_this, void 0, void 0, function () {
- var ownerDocument, defaultView, instanceName, _a, width, height, left, top, defaultResourceOptions, resourceOptions, defaultOptions, options, windowBounds, documentCloner, clonedElement, container, documentBackgroundColor, bodyBackgroundColor, bgColor, defaultBackgroundColor, backgroundColor, renderOptions, canvas, renderer, root, renderer;
- return __generator(this, function (_b) {
- switch (_b.label) {
- case 0:
- ownerDocument = element.ownerDocument;
- if (!ownerDocument) {
- throw new Error("Element is not attached to a Document");
- }
- defaultView = ownerDocument.defaultView;
- if (!defaultView) {
- throw new Error("Document is not attached to a Window");
- }
- instanceName = (Math.round(Math.random() * 1000) + Date.now()).toString(16);
- _a = isBodyElement(element) || isHTMLElement(element) ? parseDocumentSize(ownerDocument) : parseBounds(element), width = _a.width, height = _a.height, left = _a.left, top = _a.top;
- defaultResourceOptions = {
- allowTaint: false,
- imageTimeout: 15000,
- proxy: undefined,
- useCORS: false };
- resourceOptions = _assign({}, defaultResourceOptions, opts);
- defaultOptions = {
- backgroundColor: '#ffffff',
- cache: opts.cache ? opts.cache : CacheStorage.create(instanceName, resourceOptions),
- logging: true,
- removeContainer: true,
- foreignObjectRendering: false,
- scale: defaultView.devicePixelRatio || 1,
- windowWidth: defaultView.innerWidth,
- windowHeight: defaultView.innerHeight,
- scrollX: defaultView.pageXOffset,
- scrollY: defaultView.pageYOffset,
- x: left,
- y: top,
- width: Math.ceil(width),
- height: Math.ceil(height),
- id: instanceName };
- options = _assign({}, defaultOptions, resourceOptions, opts);
- windowBounds = new Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight);
- Logger.create({ id: instanceName, enabled: options.logging });
- Logger.getInstance(instanceName).debug("Starting document clone");
- documentCloner = new DocumentCloner(element, {
- id: instanceName,
- onclone: options.onclone,
- ignoreElements: options.ignoreElements,
- inlineImages: options.foreignObjectRendering,
- copyStyles: options.foreignObjectRendering });
- clonedElement = documentCloner.clonedReferenceElement;
- if (!clonedElement) {
- return [2 /*return*/, Promise.reject("Unable to find element in cloned iframe")];
- }
- return [4 /*yield*/, documentCloner.toIFrame(ownerDocument, windowBounds)];
- case 1:
- container = _b.sent();
- documentBackgroundColor = ownerDocument.documentElement ?
- parseColor$1(getComputedStyle(ownerDocument.documentElement).backgroundColor) :
- COLORS.TRANSPARENT;
- bodyBackgroundColor = ownerDocument.body ?
- parseColor$1(getComputedStyle(ownerDocument.body).backgroundColor) :
- COLORS.TRANSPARENT;
- bgColor = opts.backgroundColor;
- defaultBackgroundColor = typeof bgColor === 'string' ? parseColor$1(bgColor) : bgColor === null ? COLORS.TRANSPARENT : 0xffffffff;
- backgroundColor = element === ownerDocument.documentElement ?
- isTransparent(documentBackgroundColor) ?
- isTransparent(bodyBackgroundColor) ?
- defaultBackgroundColor :
- bodyBackgroundColor :
- documentBackgroundColor :
- defaultBackgroundColor;
- renderOptions = {
- id: instanceName,
- cache: options.cache,
- canvas: options.canvas,
- backgroundColor: backgroundColor,
- scale: options.scale,
- x: options.x,
- y: options.y,
- scrollX: options.scrollX,
- scrollY: options.scrollY,
- width: options.width,
- height: options.height,
- windowWidth: options.windowWidth,
- windowHeight: options.windowHeight };
- if (!options.foreignObjectRendering) return [3 /*break*/, 3];
- Logger.getInstance(instanceName).debug("Document cloned, using foreign object rendering");
- renderer = new ForeignObjectRenderer(renderOptions);
- return [4 /*yield*/, renderer.render(clonedElement)];
- case 2:
- canvas = _b.sent();
- return [3 /*break*/, 5];
- case 3:
- Logger.getInstance(instanceName).debug("Document cloned, using computed rendering");
- CacheStorage.attachInstance(options.cache);
- Logger.getInstance(instanceName).debug("Starting DOM parsing");
- root = parseTree(clonedElement);
- CacheStorage.detachInstance();
- if (backgroundColor === root.styles.backgroundColor) {
- root.styles.backgroundColor = COLORS.TRANSPARENT;
- }
- Logger.getInstance(instanceName).debug("Starting renderer");
- renderer = new CanvasRenderer(renderOptions);
- return [4 /*yield*/, renderer.render(root)];
- case 4:
- canvas = _b.sent();
- _b.label = 5;
- case 5:
- if (options.removeContainer === true) {
- if (!DocumentCloner.destroy(container)) {
- Logger.getInstance(instanceName).error("Cannot detach cloned iframe as it is not in the DOM anymore");
- }
- }
- Logger.getInstance(instanceName).debug("Finished rendering");
- Logger.destroy(instanceName);
- CacheStorage.destroy(instanceName);
- return [2 /*return*/, canvas];}
- });
- });};
- return html2canvas;
- });
- /***/ }),
- /***/ 94:
- /*!****************************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/uParse-master/src/libs/html2json.js ***!
- \****************************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- /* WEBPACK VAR INJECTION */(function(uni) {Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;
- var _wxDiscode = _interopRequireDefault(__webpack_require__(/*! ./wxDiscode */ 95));
- var _htmlparser = _interopRequireDefault(__webpack_require__(/*! ./htmlparser */ 96));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
- * html2Json 改造来自: https://github.com/Jxck/html2json
- *
- *
- * author: Di (微信小程序开发工程师)
- * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
- * 垂直微信小程序开发交流社区
- *
- * github地址: https://github.com/icindy/wxParse
- *
- * for: 微信小程序富文本解析
- * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
- */function makeMap(str) {var obj = {};var items = str.split(',');for (var i = 0; i < items.length; i += 1) {obj[items[i]] = true;}return obj;} // Block Elements - HTML 5
- var block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5
- var inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
- // Elements that you can, intentionally, leave open
- // (and which close themselves)
- var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
- function removeDOCTYPE(html) {
- var isDocument = /<body.*>([^]*)<\/body>/.test(html);
- return isDocument ? RegExp.$1 : html;
- }
- function trimHtml(html) {
- return html.
- replace(/<!--.*?-->/gi, '').
- replace(/\/\*.*?\*\//gi, '').
- replace(/[ ]+</gi, '<').
- replace(/<script[^]*<\/script>/gi, '').
- replace(/<style[^]*<\/style>/gi, '');
- }
- function getScreenInfo() {
- var screen = {};
- uni.getSystemInfo({
- success: function success(res) {
- screen.width = res.windowWidth;
- screen.height = res.windowHeight;
- } });
- return screen;
- }
- function html2json(html, customHandler, imageProp, host) {
- // 处理字符串
- html = removeDOCTYPE(html);
- html = trimHtml(html);
- html = _wxDiscode.default.strDiscode(html);
- // 生成node节点
- var bufArray = [];
- var results = {
- nodes: [],
- imageUrls: [] };
- var screen = getScreenInfo();
- function Node(tag) {
- this.node = 'element';
- this.tag = tag;
- this.$screen = screen;
- }
- (0, _htmlparser.default)(html, {
- start: function start(tag, attrs, unary) {
- // node for this element
- var node = new Node(tag);
- if (bufArray.length !== 0) {
- var parent = bufArray[0];
- if (parent.nodes === undefined) {
- parent.nodes = [];
- }
- }
- if (block[tag]) {
- node.tagType = 'block';
- } else if (inline[tag]) {
- node.tagType = 'inline';
- } else if (closeSelf[tag]) {
- node.tagType = 'closeSelf';
- }
- node.attr = attrs.reduce(function (pre, attr) {var
- name = attr.name;var
- value = attr.value;
- if (name === 'class') {
- node.classStr = value;
- }
- // has multi attibutes
- // make it array of attribute
- if (name === 'style') {
- node.styleStr = value;
- }
- if (value.match(/ /)) {
- value = value.split(' ');
- }
- // if attr already exists
- // merge it
- if (pre[name]) {
- if (Array.isArray(pre[name])) {
- // already array, push to last
- pre[name].push(value);
- } else {
- // single value, make it array
- pre[name] = [pre[name], value];
- }
- } else {
- // not exist, put it
- pre[name] = value;
- }
- return pre;
- }, {});
- // 优化样式相关属性
- if (node.classStr) {
- node.classStr += " ".concat(node.tag);
- } else {
- node.classStr = node.tag;
- }
- if (node.tagType === 'inline') {
- node.classStr += ' inline';
- }
- // 对img添加额外数据
- if (node.tag === 'img') {
- var imgUrl = node.attr.src;
- imgUrl = _wxDiscode.default.urlToHttpUrl(imgUrl, imageProp.domain);
- Object.assign(node.attr, imageProp, {
- src: imgUrl || '' });
- if (imgUrl) {
- results.imageUrls.push(imgUrl);
- }
- }
- // 处理a标签属性
- if (node.tag === 'a') {
- node.attr.href = node.attr.href || '';
- }
- // 处理font标签样式属性
- if (node.tag === 'font') {
- var fontSize = [
- 'x-small',
- 'small',
- 'medium',
- 'large',
- 'x-large',
- 'xx-large',
- '-webkit-xxx-large'];
- var styleAttrs = {
- color: 'color',
- face: 'font-family',
- size: 'font-size' };
- if (!node.styleStr) node.styleStr = '';
- Object.keys(styleAttrs).forEach(function (key) {
- if (node.attr[key]) {
- var value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key];
- node.styleStr += "".concat(styleAttrs[key], ": ").concat(value, ";");
- }
- });
- }
- // 临时记录source资源
- if (node.tag === 'source') {
- results.source = node.attr.src;
- }
- if (customHandler.start) {
- customHandler.start(node, results);
- }
- if (unary) {
- // if this tag doesn't have end tag
- // like <img src="hoge.png"/>
- // add to parents
- var _parent = bufArray[0] || results;
- if (_parent.nodes === undefined) {
- _parent.nodes = [];
- }
- _parent.nodes.push(node);
- } else {
- bufArray.unshift(node);
- }
- },
- end: function end(tag) {
- // merge into parent tag
- var node = bufArray.shift();
- if (node.tag !== tag) {
- console.error('invalid state: mismatch end tag');
- }
- // 当有缓存source资源时于于video补上src资源
- if (node.tag === 'video' && results.source) {
- node.attr.src = results.source;
- delete results.source;
- }
- if (customHandler.end) {
- customHandler.end(node, results);
- }
- if (bufArray.length === 0) {
- results.nodes.push(node);
- } else {
- var parent = bufArray[0];
- if (!parent.nodes) {
- parent.nodes = [];
- }
- parent.nodes.push(node);
- }
- },
- chars: function chars(text) {
- if (!text.trim()) return;
- var node = {
- node: 'text',
- text: text };
- if (customHandler.chars) {
- customHandler.chars(node, results);
- }
- if (bufArray.length === 0) {
- results.nodes.push(node);
- } else {
- var parent = bufArray[0];
- if (parent.nodes === undefined) {
- parent.nodes = [];
- }
- parent.nodes.push(node);
- }
- } });
- return results;
- }var _default =
- html2json;exports.default = _default;
- /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-weixin/dist/index.js */ 1)["default"]))
- /***/ }),
- /***/ 95:
- /*!****************************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/uParse-master/src/libs/wxDiscode.js ***!
- \****************************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0; // HTML 支持的数学符号
- function strNumDiscode(str) {
- str = str.replace(/∀/g, '∀');
- str = str.replace(/∂/g, '∂');
- str = str.replace(/∃/g, '∃');
- str = str.replace(/∅/g, '∅');
- str = str.replace(/∇/g, '∇');
- str = str.replace(/∈/g, '∈');
- str = str.replace(/∉/g, '∉');
- str = str.replace(/∋/g, '∋');
- str = str.replace(/∏/g, '∏');
- str = str.replace(/∑/g, '∑');
- str = str.replace(/−/g, '−');
- str = str.replace(/∗/g, '∗');
- str = str.replace(/√/g, '√');
- str = str.replace(/∝/g, '∝');
- str = str.replace(/∞/g, '∞');
- str = str.replace(/∠/g, '∠');
- str = str.replace(/∧/g, '∧');
- str = str.replace(/∨/g, '∨');
- str = str.replace(/∩/g, '∩');
- str = str.replace(/∪/g, '∪');
- str = str.replace(/∫/g, '∫');
- str = str.replace(/∴/g, '∴');
- str = str.replace(/∼/g, '∼');
- str = str.replace(/≅/g, '≅');
- str = str.replace(/≈/g, '≈');
- str = str.replace(/≠/g, '≠');
- str = str.replace(/≤/g, '≤');
- str = str.replace(/≥/g, '≥');
- str = str.replace(/⊂/g, '⊂');
- str = str.replace(/⊃/g, '⊃');
- str = str.replace(/⊄/g, '⊄');
- str = str.replace(/⊆/g, '⊆');
- str = str.replace(/⊇/g, '⊇');
- str = str.replace(/⊕/g, '⊕');
- str = str.replace(/⊗/g, '⊗');
- str = str.replace(/⊥/g, '⊥');
- str = str.replace(/⋅/g, '⋅');
- return str;
- }
- // HTML 支持的希腊字母
- function strGreeceDiscode(str) {
- str = str.replace(/Α/g, 'Α');
- str = str.replace(/Β/g, 'Β');
- str = str.replace(/Γ/g, 'Γ');
- str = str.replace(/Δ/g, 'Δ');
- str = str.replace(/Ε/g, 'Ε');
- str = str.replace(/Ζ/g, 'Ζ');
- str = str.replace(/Η/g, 'Η');
- str = str.replace(/Θ/g, 'Θ');
- str = str.replace(/Ι/g, 'Ι');
- str = str.replace(/Κ/g, 'Κ');
- str = str.replace(/Λ/g, 'Λ');
- str = str.replace(/Μ/g, 'Μ');
- str = str.replace(/Ν/g, 'Ν');
- str = str.replace(/Ξ/g, 'Ν');
- str = str.replace(/Ο/g, 'Ο');
- str = str.replace(/Π/g, 'Π');
- str = str.replace(/Ρ/g, 'Ρ');
- str = str.replace(/Σ/g, 'Σ');
- str = str.replace(/Τ/g, 'Τ');
- str = str.replace(/Υ/g, 'Υ');
- str = str.replace(/Φ/g, 'Φ');
- str = str.replace(/Χ/g, 'Χ');
- str = str.replace(/Ψ/g, 'Ψ');
- str = str.replace(/Ω/g, 'Ω');
- str = str.replace(/α/g, 'α');
- str = str.replace(/β/g, 'β');
- str = str.replace(/γ/g, 'γ');
- str = str.replace(/δ/g, 'δ');
- str = str.replace(/ε/g, 'ε');
- str = str.replace(/ζ/g, 'ζ');
- str = str.replace(/η/g, 'η');
- str = str.replace(/θ/g, 'θ');
- str = str.replace(/ι/g, 'ι');
- str = str.replace(/κ/g, 'κ');
- str = str.replace(/λ/g, 'λ');
- str = str.replace(/μ/g, 'μ');
- str = str.replace(/ν/g, 'ν');
- str = str.replace(/ξ/g, 'ξ');
- str = str.replace(/ο/g, 'ο');
- str = str.replace(/π/g, 'π');
- str = str.replace(/ρ/g, 'ρ');
- str = str.replace(/ς/g, 'ς');
- str = str.replace(/σ/g, 'σ');
- str = str.replace(/τ/g, 'τ');
- str = str.replace(/υ/g, 'υ');
- str = str.replace(/φ/g, 'φ');
- str = str.replace(/χ/g, 'χ');
- str = str.replace(/ψ/g, 'ψ');
- str = str.replace(/ω/g, 'ω');
- str = str.replace(/ϑ/g, 'ϑ');
- str = str.replace(/ϒ/g, 'ϒ');
- str = str.replace(/ϖ/g, 'ϖ');
- str = str.replace(/·/g, '·');
- return str;
- }
- function strcharacterDiscode(str) {
- // 加入常用解析
- str = str.replace(/ /g, ' ');
- str = str.replace(/ /g, ' ');
- str = str.replace(/ /g, ' ');
- str = str.replace(/"/g, "'");
- str = str.replace(/&/g, '&');
- str = str.replace(/</g, '<');
- str = str.replace(/>/g, '>');
- str = str.replace(/•/g, '•');
- return str;
- }
- // HTML 支持的其他实体
- function strOtherDiscode(str) {
- str = str.replace(/Œ/g, 'Œ');
- str = str.replace(/œ/g, 'œ');
- str = str.replace(/Š/g, 'Š');
- str = str.replace(/š/g, 'š');
- str = str.replace(/Ÿ/g, 'Ÿ');
- str = str.replace(/ƒ/g, 'ƒ');
- str = str.replace(/ˆ/g, 'ˆ');
- str = str.replace(/˜/g, '˜');
- str = str.replace(/ /g, '');
- str = str.replace(/ /g, '');
- str = str.replace(/ /g, '');
- str = str.replace(/‌/g, '');
- str = str.replace(/‍/g, '');
- str = str.replace(/‎/g, '');
- str = str.replace(/‏/g, '');
- str = str.replace(/–/g, '–');
- str = str.replace(/—/g, '—');
- str = str.replace(/‘/g, '‘');
- str = str.replace(/’/g, '’');
- str = str.replace(/‚/g, '‚');
- str = str.replace(/“/g, '“');
- str = str.replace(/”/g, '”');
- str = str.replace(/„/g, '„');
- str = str.replace(/†/g, '†');
- str = str.replace(/‡/g, '‡');
- str = str.replace(/•/g, '•');
- str = str.replace(/…/g, '…');
- str = str.replace(/‰/g, '‰');
- str = str.replace(/′/g, '′');
- str = str.replace(/″/g, '″');
- str = str.replace(/‹/g, '‹');
- str = str.replace(/›/g, '›');
- str = str.replace(/‾/g, '‾');
- str = str.replace(/€/g, '€');
- str = str.replace(/™/g, '™');
- str = str.replace(/←/g, '←');
- str = str.replace(/↑/g, '↑');
- str = str.replace(/→/g, '→');
- str = str.replace(/↓/g, '↓');
- str = str.replace(/↔/g, '↔');
- str = str.replace(/↵/g, '↵');
- str = str.replace(/⌈/g, '⌈');
- str = str.replace(/⌉/g, '⌉');
- str = str.replace(/⌊/g, '⌊');
- str = str.replace(/⌋/g, '⌋');
- str = str.replace(/◊/g, '◊');
- str = str.replace(/♠/g, '♠');
- str = str.replace(/♣/g, '♣');
- str = str.replace(/♥/g, '♥');
- str = str.replace(/♦/g, '♦');
- str = str.replace(/'/g, "'");
- return str;
- }
- function strDiscode(str) {
- str = strNumDiscode(str);
- str = strGreeceDiscode(str);
- str = strcharacterDiscode(str);
- str = strOtherDiscode(str);
- return str;
- }
- function urlToHttpUrl(url, domain) {
- if (/^\/\//.test(url)) {
- return "https:".concat(url);
- } else if (/^\//.test(url)) {
- return "https://".concat(domain).concat(url);
- }
- return url;
- }var _default =
- {
- strDiscode: strDiscode,
- urlToHttpUrl: urlToHttpUrl };exports.default = _default;
- /***/ }),
- /***/ 96:
- /*!*****************************************************************************!*\
- !*** /Users/mead/Code/vue/epidemic-h5/uParse-master/src/libs/htmlparser.js ***!
- \*****************************************************************************/
- /*! no static exports found */
- /***/ (function(module, exports, __webpack_require__) {
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0; /**
- *
- * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser
- *
- * author: Di (微信小程序开发工程师)
- * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)
- * 垂直微信小程序开发交流社区
- *
- * github地址: https://github.com/icindy/wxParse
- *
- * for: 微信小程序富文本解析
- * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184
- */
- // Regular Expressions for parsing tags and attributes
- var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
- var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
- var attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
- function makeMap(str) {
- var obj = {};
- var items = str.split(',');
- for (var i = 0; i < items.length; i += 1) {obj[items[i]] = true;}
- return obj;
- }
- // Empty Elements - HTML 5
- var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr');
- // Block Elements - HTML 5
- var block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video');
- // Inline Elements - HTML 5
- var inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var');
- // Elements that you can, intentionally, leave open
- // (and which close themselves)
- var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr');
- // Attributes that have their values filled in disabled="disabled"
- var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected');
- function HTMLParser(html, handler) {
- var index;
- var chars;
- var match;
- var last = html;
- var stack = [];
- stack.last = function () {return stack[stack.length - 1];};
- function parseEndTag(tag, tagName) {
- // If no tag name is provided, clean shop
- var pos;
- if (!tagName) {
- pos = 0;
- } else {
- // Find the closest opened tag of the same type
- tagName = tagName.toLowerCase();
- for (pos = stack.length - 1; pos >= 0; pos -= 1) {
- if (stack[pos] === tagName) break;
- }
- }
- if (pos >= 0) {
- // Close all the open elements, up the stack
- for (var i = stack.length - 1; i >= pos; i -= 1) {
- if (handler.end) handler.end(stack[i]);
- }
- // Remove the open elements from the stack
- stack.length = pos;
- }
- }
- function parseStartTag(tag, tagName, rest, unary) {
- tagName = tagName.toLowerCase();
- if (block[tagName]) {
- while (stack.last() && inline[stack.last()]) {
- parseEndTag('', stack.last());
- }
- }
- if (closeSelf[tagName] && stack.last() === tagName) {
- parseEndTag('', tagName);
- }
- unary = empty[tagName] || !!unary;
- if (!unary) stack.push(tagName);
- if (handler.start) {
- var attrs = [];
- rest.replace(attr, function genAttr(matches, name) {
- var value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : '');
- attrs.push({
- name: name,
- value: value,
- escaped: value.replace(/(^|[^\\])"/g, '$1\\"') // "
- });
- });
- if (handler.start) {
- handler.start(tagName, attrs, unary);
- }
- }
- }
- while (html) {
- chars = true;
- if (html.indexOf('</') === 0) {
- match = html.match(endTag);
- if (match) {
- html = html.substring(match[0].length);
- match[0].replace(endTag, parseEndTag);
- chars = false;
- }
- // start tag
- } else if (html.indexOf('<') === 0) {
- match = html.match(startTag);
- if (match) {
- html = html.substring(match[0].length);
- match[0].replace(startTag, parseStartTag);
- chars = false;
- }
- }
- if (chars) {
- index = html.indexOf('<');
- var text = '';
- while (index === 0) {
- text += '<';
- html = html.substring(1);
- index = html.indexOf('<');
- }
- text += index < 0 ? html : html.substring(0, index);
- html = index < 0 ? '' : html.substring(index);
- if (handler.chars) handler.chars(text);
- }
- if (html === last) throw new Error("Parse Error: ".concat(html));
- last = html;
- }
- // Clean up any remaining tags
- parseEndTag();
- }var _default =
- HTMLParser;exports.default = _default;
- /***/ })
- }]);
- //# sourceMappingURL=../../.sourcemap/mp-weixin/common/vendor.js.map
|