| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280 |
- <!doctype html>
- <html lang="en">
- <head>
- <title>Code coverage report for src/pages/PrintersPage.tsx</title>
- <meta charset="utf-8" />
- <link rel="stylesheet" href="../../prettify.css" />
- <link rel="stylesheet" href="../../base.css" />
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <style type='text/css'>
- .coverage-summary .sorter {
- background-image: url(../../sort-arrow-sprite.png);
- }
- </style>
- </head>
-
- <body>
- <div class='wrapper'>
- <div class='pad1'>
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> PrintersPage.tsx</h1>
- <div class='clearfix'>
-
- <div class='fl pad1y space-right2'>
- <span class="strong">0% </span>
- <span class="quiet">Statements</span>
- <span class='fraction'>0/1594</span>
- </div>
-
-
- <div class='fl pad1y space-right2'>
- <span class="strong">0% </span>
- <span class="quiet">Branches</span>
- <span class='fraction'>0/1</span>
- </div>
-
-
- <div class='fl pad1y space-right2'>
- <span class="strong">0% </span>
- <span class="quiet">Functions</span>
- <span class='fraction'>0/1</span>
- </div>
-
-
- <div class='fl pad1y space-right2'>
- <span class="strong">0% </span>
- <span class="quiet">Lines</span>
- <span class='fraction'>0/1594</span>
- </div>
-
-
- </div>
- <p class="quiet">
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
- </p>
- <template id="filterTemplate">
- <div class="quiet">
- Filter:
- <input type="search" id="fileSearch">
- </div>
- </template>
- </div>
- <div class='status-line low'></div>
- <pre><table class="coverage">
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
- <a name='L2'></a><a href='#L2'>2</a>
- <a name='L3'></a><a href='#L3'>3</a>
- <a name='L4'></a><a href='#L4'>4</a>
- <a name='L5'></a><a href='#L5'>5</a>
- <a name='L6'></a><a href='#L6'>6</a>
- <a name='L7'></a><a href='#L7'>7</a>
- <a name='L8'></a><a href='#L8'>8</a>
- <a name='L9'></a><a href='#L9'>9</a>
- <a name='L10'></a><a href='#L10'>10</a>
- <a name='L11'></a><a href='#L11'>11</a>
- <a name='L12'></a><a href='#L12'>12</a>
- <a name='L13'></a><a href='#L13'>13</a>
- <a name='L14'></a><a href='#L14'>14</a>
- <a name='L15'></a><a href='#L15'>15</a>
- <a name='L16'></a><a href='#L16'>16</a>
- <a name='L17'></a><a href='#L17'>17</a>
- <a name='L18'></a><a href='#L18'>18</a>
- <a name='L19'></a><a href='#L19'>19</a>
- <a name='L20'></a><a href='#L20'>20</a>
- <a name='L21'></a><a href='#L21'>21</a>
- <a name='L22'></a><a href='#L22'>22</a>
- <a name='L23'></a><a href='#L23'>23</a>
- <a name='L24'></a><a href='#L24'>24</a>
- <a name='L25'></a><a href='#L25'>25</a>
- <a name='L26'></a><a href='#L26'>26</a>
- <a name='L27'></a><a href='#L27'>27</a>
- <a name='L28'></a><a href='#L28'>28</a>
- <a name='L29'></a><a href='#L29'>29</a>
- <a name='L30'></a><a href='#L30'>30</a>
- <a name='L31'></a><a href='#L31'>31</a>
- <a name='L32'></a><a href='#L32'>32</a>
- <a name='L33'></a><a href='#L33'>33</a>
- <a name='L34'></a><a href='#L34'>34</a>
- <a name='L35'></a><a href='#L35'>35</a>
- <a name='L36'></a><a href='#L36'>36</a>
- <a name='L37'></a><a href='#L37'>37</a>
- <a name='L38'></a><a href='#L38'>38</a>
- <a name='L39'></a><a href='#L39'>39</a>
- <a name='L40'></a><a href='#L40'>40</a>
- <a name='L41'></a><a href='#L41'>41</a>
- <a name='L42'></a><a href='#L42'>42</a>
- <a name='L43'></a><a href='#L43'>43</a>
- <a name='L44'></a><a href='#L44'>44</a>
- <a name='L45'></a><a href='#L45'>45</a>
- <a name='L46'></a><a href='#L46'>46</a>
- <a name='L47'></a><a href='#L47'>47</a>
- <a name='L48'></a><a href='#L48'>48</a>
- <a name='L49'></a><a href='#L49'>49</a>
- <a name='L50'></a><a href='#L50'>50</a>
- <a name='L51'></a><a href='#L51'>51</a>
- <a name='L52'></a><a href='#L52'>52</a>
- <a name='L53'></a><a href='#L53'>53</a>
- <a name='L54'></a><a href='#L54'>54</a>
- <a name='L55'></a><a href='#L55'>55</a>
- <a name='L56'></a><a href='#L56'>56</a>
- <a name='L57'></a><a href='#L57'>57</a>
- <a name='L58'></a><a href='#L58'>58</a>
- <a name='L59'></a><a href='#L59'>59</a>
- <a name='L60'></a><a href='#L60'>60</a>
- <a name='L61'></a><a href='#L61'>61</a>
- <a name='L62'></a><a href='#L62'>62</a>
- <a name='L63'></a><a href='#L63'>63</a>
- <a name='L64'></a><a href='#L64'>64</a>
- <a name='L65'></a><a href='#L65'>65</a>
- <a name='L66'></a><a href='#L66'>66</a>
- <a name='L67'></a><a href='#L67'>67</a>
- <a name='L68'></a><a href='#L68'>68</a>
- <a name='L69'></a><a href='#L69'>69</a>
- <a name='L70'></a><a href='#L70'>70</a>
- <a name='L71'></a><a href='#L71'>71</a>
- <a name='L72'></a><a href='#L72'>72</a>
- <a name='L73'></a><a href='#L73'>73</a>
- <a name='L74'></a><a href='#L74'>74</a>
- <a name='L75'></a><a href='#L75'>75</a>
- <a name='L76'></a><a href='#L76'>76</a>
- <a name='L77'></a><a href='#L77'>77</a>
- <a name='L78'></a><a href='#L78'>78</a>
- <a name='L79'></a><a href='#L79'>79</a>
- <a name='L80'></a><a href='#L80'>80</a>
- <a name='L81'></a><a href='#L81'>81</a>
- <a name='L82'></a><a href='#L82'>82</a>
- <a name='L83'></a><a href='#L83'>83</a>
- <a name='L84'></a><a href='#L84'>84</a>
- <a name='L85'></a><a href='#L85'>85</a>
- <a name='L86'></a><a href='#L86'>86</a>
- <a name='L87'></a><a href='#L87'>87</a>
- <a name='L88'></a><a href='#L88'>88</a>
- <a name='L89'></a><a href='#L89'>89</a>
- <a name='L90'></a><a href='#L90'>90</a>
- <a name='L91'></a><a href='#L91'>91</a>
- <a name='L92'></a><a href='#L92'>92</a>
- <a name='L93'></a><a href='#L93'>93</a>
- <a name='L94'></a><a href='#L94'>94</a>
- <a name='L95'></a><a href='#L95'>95</a>
- <a name='L96'></a><a href='#L96'>96</a>
- <a name='L97'></a><a href='#L97'>97</a>
- <a name='L98'></a><a href='#L98'>98</a>
- <a name='L99'></a><a href='#L99'>99</a>
- <a name='L100'></a><a href='#L100'>100</a>
- <a name='L101'></a><a href='#L101'>101</a>
- <a name='L102'></a><a href='#L102'>102</a>
- <a name='L103'></a><a href='#L103'>103</a>
- <a name='L104'></a><a href='#L104'>104</a>
- <a name='L105'></a><a href='#L105'>105</a>
- <a name='L106'></a><a href='#L106'>106</a>
- <a name='L107'></a><a href='#L107'>107</a>
- <a name='L108'></a><a href='#L108'>108</a>
- <a name='L109'></a><a href='#L109'>109</a>
- <a name='L110'></a><a href='#L110'>110</a>
- <a name='L111'></a><a href='#L111'>111</a>
- <a name='L112'></a><a href='#L112'>112</a>
- <a name='L113'></a><a href='#L113'>113</a>
- <a name='L114'></a><a href='#L114'>114</a>
- <a name='L115'></a><a href='#L115'>115</a>
- <a name='L116'></a><a href='#L116'>116</a>
- <a name='L117'></a><a href='#L117'>117</a>
- <a name='L118'></a><a href='#L118'>118</a>
- <a name='L119'></a><a href='#L119'>119</a>
- <a name='L120'></a><a href='#L120'>120</a>
- <a name='L121'></a><a href='#L121'>121</a>
- <a name='L122'></a><a href='#L122'>122</a>
- <a name='L123'></a><a href='#L123'>123</a>
- <a name='L124'></a><a href='#L124'>124</a>
- <a name='L125'></a><a href='#L125'>125</a>
- <a name='L126'></a><a href='#L126'>126</a>
- <a name='L127'></a><a href='#L127'>127</a>
- <a name='L128'></a><a href='#L128'>128</a>
- <a name='L129'></a><a href='#L129'>129</a>
- <a name='L130'></a><a href='#L130'>130</a>
- <a name='L131'></a><a href='#L131'>131</a>
- <a name='L132'></a><a href='#L132'>132</a>
- <a name='L133'></a><a href='#L133'>133</a>
- <a name='L134'></a><a href='#L134'>134</a>
- <a name='L135'></a><a href='#L135'>135</a>
- <a name='L136'></a><a href='#L136'>136</a>
- <a name='L137'></a><a href='#L137'>137</a>
- <a name='L138'></a><a href='#L138'>138</a>
- <a name='L139'></a><a href='#L139'>139</a>
- <a name='L140'></a><a href='#L140'>140</a>
- <a name='L141'></a><a href='#L141'>141</a>
- <a name='L142'></a><a href='#L142'>142</a>
- <a name='L143'></a><a href='#L143'>143</a>
- <a name='L144'></a><a href='#L144'>144</a>
- <a name='L145'></a><a href='#L145'>145</a>
- <a name='L146'></a><a href='#L146'>146</a>
- <a name='L147'></a><a href='#L147'>147</a>
- <a name='L148'></a><a href='#L148'>148</a>
- <a name='L149'></a><a href='#L149'>149</a>
- <a name='L150'></a><a href='#L150'>150</a>
- <a name='L151'></a><a href='#L151'>151</a>
- <a name='L152'></a><a href='#L152'>152</a>
- <a name='L153'></a><a href='#L153'>153</a>
- <a name='L154'></a><a href='#L154'>154</a>
- <a name='L155'></a><a href='#L155'>155</a>
- <a name='L156'></a><a href='#L156'>156</a>
- <a name='L157'></a><a href='#L157'>157</a>
- <a name='L158'></a><a href='#L158'>158</a>
- <a name='L159'></a><a href='#L159'>159</a>
- <a name='L160'></a><a href='#L160'>160</a>
- <a name='L161'></a><a href='#L161'>161</a>
- <a name='L162'></a><a href='#L162'>162</a>
- <a name='L163'></a><a href='#L163'>163</a>
- <a name='L164'></a><a href='#L164'>164</a>
- <a name='L165'></a><a href='#L165'>165</a>
- <a name='L166'></a><a href='#L166'>166</a>
- <a name='L167'></a><a href='#L167'>167</a>
- <a name='L168'></a><a href='#L168'>168</a>
- <a name='L169'></a><a href='#L169'>169</a>
- <a name='L170'></a><a href='#L170'>170</a>
- <a name='L171'></a><a href='#L171'>171</a>
- <a name='L172'></a><a href='#L172'>172</a>
- <a name='L173'></a><a href='#L173'>173</a>
- <a name='L174'></a><a href='#L174'>174</a>
- <a name='L175'></a><a href='#L175'>175</a>
- <a name='L176'></a><a href='#L176'>176</a>
- <a name='L177'></a><a href='#L177'>177</a>
- <a name='L178'></a><a href='#L178'>178</a>
- <a name='L179'></a><a href='#L179'>179</a>
- <a name='L180'></a><a href='#L180'>180</a>
- <a name='L181'></a><a href='#L181'>181</a>
- <a name='L182'></a><a href='#L182'>182</a>
- <a name='L183'></a><a href='#L183'>183</a>
- <a name='L184'></a><a href='#L184'>184</a>
- <a name='L185'></a><a href='#L185'>185</a>
- <a name='L186'></a><a href='#L186'>186</a>
- <a name='L187'></a><a href='#L187'>187</a>
- <a name='L188'></a><a href='#L188'>188</a>
- <a name='L189'></a><a href='#L189'>189</a>
- <a name='L190'></a><a href='#L190'>190</a>
- <a name='L191'></a><a href='#L191'>191</a>
- <a name='L192'></a><a href='#L192'>192</a>
- <a name='L193'></a><a href='#L193'>193</a>
- <a name='L194'></a><a href='#L194'>194</a>
- <a name='L195'></a><a href='#L195'>195</a>
- <a name='L196'></a><a href='#L196'>196</a>
- <a name='L197'></a><a href='#L197'>197</a>
- <a name='L198'></a><a href='#L198'>198</a>
- <a name='L199'></a><a href='#L199'>199</a>
- <a name='L200'></a><a href='#L200'>200</a>
- <a name='L201'></a><a href='#L201'>201</a>
- <a name='L202'></a><a href='#L202'>202</a>
- <a name='L203'></a><a href='#L203'>203</a>
- <a name='L204'></a><a href='#L204'>204</a>
- <a name='L205'></a><a href='#L205'>205</a>
- <a name='L206'></a><a href='#L206'>206</a>
- <a name='L207'></a><a href='#L207'>207</a>
- <a name='L208'></a><a href='#L208'>208</a>
- <a name='L209'></a><a href='#L209'>209</a>
- <a name='L210'></a><a href='#L210'>210</a>
- <a name='L211'></a><a href='#L211'>211</a>
- <a name='L212'></a><a href='#L212'>212</a>
- <a name='L213'></a><a href='#L213'>213</a>
- <a name='L214'></a><a href='#L214'>214</a>
- <a name='L215'></a><a href='#L215'>215</a>
- <a name='L216'></a><a href='#L216'>216</a>
- <a name='L217'></a><a href='#L217'>217</a>
- <a name='L218'></a><a href='#L218'>218</a>
- <a name='L219'></a><a href='#L219'>219</a>
- <a name='L220'></a><a href='#L220'>220</a>
- <a name='L221'></a><a href='#L221'>221</a>
- <a name='L222'></a><a href='#L222'>222</a>
- <a name='L223'></a><a href='#L223'>223</a>
- <a name='L224'></a><a href='#L224'>224</a>
- <a name='L225'></a><a href='#L225'>225</a>
- <a name='L226'></a><a href='#L226'>226</a>
- <a name='L227'></a><a href='#L227'>227</a>
- <a name='L228'></a><a href='#L228'>228</a>
- <a name='L229'></a><a href='#L229'>229</a>
- <a name='L230'></a><a href='#L230'>230</a>
- <a name='L231'></a><a href='#L231'>231</a>
- <a name='L232'></a><a href='#L232'>232</a>
- <a name='L233'></a><a href='#L233'>233</a>
- <a name='L234'></a><a href='#L234'>234</a>
- <a name='L235'></a><a href='#L235'>235</a>
- <a name='L236'></a><a href='#L236'>236</a>
- <a name='L237'></a><a href='#L237'>237</a>
- <a name='L238'></a><a href='#L238'>238</a>
- <a name='L239'></a><a href='#L239'>239</a>
- <a name='L240'></a><a href='#L240'>240</a>
- <a name='L241'></a><a href='#L241'>241</a>
- <a name='L242'></a><a href='#L242'>242</a>
- <a name='L243'></a><a href='#L243'>243</a>
- <a name='L244'></a><a href='#L244'>244</a>
- <a name='L245'></a><a href='#L245'>245</a>
- <a name='L246'></a><a href='#L246'>246</a>
- <a name='L247'></a><a href='#L247'>247</a>
- <a name='L248'></a><a href='#L248'>248</a>
- <a name='L249'></a><a href='#L249'>249</a>
- <a name='L250'></a><a href='#L250'>250</a>
- <a name='L251'></a><a href='#L251'>251</a>
- <a name='L252'></a><a href='#L252'>252</a>
- <a name='L253'></a><a href='#L253'>253</a>
- <a name='L254'></a><a href='#L254'>254</a>
- <a name='L255'></a><a href='#L255'>255</a>
- <a name='L256'></a><a href='#L256'>256</a>
- <a name='L257'></a><a href='#L257'>257</a>
- <a name='L258'></a><a href='#L258'>258</a>
- <a name='L259'></a><a href='#L259'>259</a>
- <a name='L260'></a><a href='#L260'>260</a>
- <a name='L261'></a><a href='#L261'>261</a>
- <a name='L262'></a><a href='#L262'>262</a>
- <a name='L263'></a><a href='#L263'>263</a>
- <a name='L264'></a><a href='#L264'>264</a>
- <a name='L265'></a><a href='#L265'>265</a>
- <a name='L266'></a><a href='#L266'>266</a>
- <a name='L267'></a><a href='#L267'>267</a>
- <a name='L268'></a><a href='#L268'>268</a>
- <a name='L269'></a><a href='#L269'>269</a>
- <a name='L270'></a><a href='#L270'>270</a>
- <a name='L271'></a><a href='#L271'>271</a>
- <a name='L272'></a><a href='#L272'>272</a>
- <a name='L273'></a><a href='#L273'>273</a>
- <a name='L274'></a><a href='#L274'>274</a>
- <a name='L275'></a><a href='#L275'>275</a>
- <a name='L276'></a><a href='#L276'>276</a>
- <a name='L277'></a><a href='#L277'>277</a>
- <a name='L278'></a><a href='#L278'>278</a>
- <a name='L279'></a><a href='#L279'>279</a>
- <a name='L280'></a><a href='#L280'>280</a>
- <a name='L281'></a><a href='#L281'>281</a>
- <a name='L282'></a><a href='#L282'>282</a>
- <a name='L283'></a><a href='#L283'>283</a>
- <a name='L284'></a><a href='#L284'>284</a>
- <a name='L285'></a><a href='#L285'>285</a>
- <a name='L286'></a><a href='#L286'>286</a>
- <a name='L287'></a><a href='#L287'>287</a>
- <a name='L288'></a><a href='#L288'>288</a>
- <a name='L289'></a><a href='#L289'>289</a>
- <a name='L290'></a><a href='#L290'>290</a>
- <a name='L291'></a><a href='#L291'>291</a>
- <a name='L292'></a><a href='#L292'>292</a>
- <a name='L293'></a><a href='#L293'>293</a>
- <a name='L294'></a><a href='#L294'>294</a>
- <a name='L295'></a><a href='#L295'>295</a>
- <a name='L296'></a><a href='#L296'>296</a>
- <a name='L297'></a><a href='#L297'>297</a>
- <a name='L298'></a><a href='#L298'>298</a>
- <a name='L299'></a><a href='#L299'>299</a>
- <a name='L300'></a><a href='#L300'>300</a>
- <a name='L301'></a><a href='#L301'>301</a>
- <a name='L302'></a><a href='#L302'>302</a>
- <a name='L303'></a><a href='#L303'>303</a>
- <a name='L304'></a><a href='#L304'>304</a>
- <a name='L305'></a><a href='#L305'>305</a>
- <a name='L306'></a><a href='#L306'>306</a>
- <a name='L307'></a><a href='#L307'>307</a>
- <a name='L308'></a><a href='#L308'>308</a>
- <a name='L309'></a><a href='#L309'>309</a>
- <a name='L310'></a><a href='#L310'>310</a>
- <a name='L311'></a><a href='#L311'>311</a>
- <a name='L312'></a><a href='#L312'>312</a>
- <a name='L313'></a><a href='#L313'>313</a>
- <a name='L314'></a><a href='#L314'>314</a>
- <a name='L315'></a><a href='#L315'>315</a>
- <a name='L316'></a><a href='#L316'>316</a>
- <a name='L317'></a><a href='#L317'>317</a>
- <a name='L318'></a><a href='#L318'>318</a>
- <a name='L319'></a><a href='#L319'>319</a>
- <a name='L320'></a><a href='#L320'>320</a>
- <a name='L321'></a><a href='#L321'>321</a>
- <a name='L322'></a><a href='#L322'>322</a>
- <a name='L323'></a><a href='#L323'>323</a>
- <a name='L324'></a><a href='#L324'>324</a>
- <a name='L325'></a><a href='#L325'>325</a>
- <a name='L326'></a><a href='#L326'>326</a>
- <a name='L327'></a><a href='#L327'>327</a>
- <a name='L328'></a><a href='#L328'>328</a>
- <a name='L329'></a><a href='#L329'>329</a>
- <a name='L330'></a><a href='#L330'>330</a>
- <a name='L331'></a><a href='#L331'>331</a>
- <a name='L332'></a><a href='#L332'>332</a>
- <a name='L333'></a><a href='#L333'>333</a>
- <a name='L334'></a><a href='#L334'>334</a>
- <a name='L335'></a><a href='#L335'>335</a>
- <a name='L336'></a><a href='#L336'>336</a>
- <a name='L337'></a><a href='#L337'>337</a>
- <a name='L338'></a><a href='#L338'>338</a>
- <a name='L339'></a><a href='#L339'>339</a>
- <a name='L340'></a><a href='#L340'>340</a>
- <a name='L341'></a><a href='#L341'>341</a>
- <a name='L342'></a><a href='#L342'>342</a>
- <a name='L343'></a><a href='#L343'>343</a>
- <a name='L344'></a><a href='#L344'>344</a>
- <a name='L345'></a><a href='#L345'>345</a>
- <a name='L346'></a><a href='#L346'>346</a>
- <a name='L347'></a><a href='#L347'>347</a>
- <a name='L348'></a><a href='#L348'>348</a>
- <a name='L349'></a><a href='#L349'>349</a>
- <a name='L350'></a><a href='#L350'>350</a>
- <a name='L351'></a><a href='#L351'>351</a>
- <a name='L352'></a><a href='#L352'>352</a>
- <a name='L353'></a><a href='#L353'>353</a>
- <a name='L354'></a><a href='#L354'>354</a>
- <a name='L355'></a><a href='#L355'>355</a>
- <a name='L356'></a><a href='#L356'>356</a>
- <a name='L357'></a><a href='#L357'>357</a>
- <a name='L358'></a><a href='#L358'>358</a>
- <a name='L359'></a><a href='#L359'>359</a>
- <a name='L360'></a><a href='#L360'>360</a>
- <a name='L361'></a><a href='#L361'>361</a>
- <a name='L362'></a><a href='#L362'>362</a>
- <a name='L363'></a><a href='#L363'>363</a>
- <a name='L364'></a><a href='#L364'>364</a>
- <a name='L365'></a><a href='#L365'>365</a>
- <a name='L366'></a><a href='#L366'>366</a>
- <a name='L367'></a><a href='#L367'>367</a>
- <a name='L368'></a><a href='#L368'>368</a>
- <a name='L369'></a><a href='#L369'>369</a>
- <a name='L370'></a><a href='#L370'>370</a>
- <a name='L371'></a><a href='#L371'>371</a>
- <a name='L372'></a><a href='#L372'>372</a>
- <a name='L373'></a><a href='#L373'>373</a>
- <a name='L374'></a><a href='#L374'>374</a>
- <a name='L375'></a><a href='#L375'>375</a>
- <a name='L376'></a><a href='#L376'>376</a>
- <a name='L377'></a><a href='#L377'>377</a>
- <a name='L378'></a><a href='#L378'>378</a>
- <a name='L379'></a><a href='#L379'>379</a>
- <a name='L380'></a><a href='#L380'>380</a>
- <a name='L381'></a><a href='#L381'>381</a>
- <a name='L382'></a><a href='#L382'>382</a>
- <a name='L383'></a><a href='#L383'>383</a>
- <a name='L384'></a><a href='#L384'>384</a>
- <a name='L385'></a><a href='#L385'>385</a>
- <a name='L386'></a><a href='#L386'>386</a>
- <a name='L387'></a><a href='#L387'>387</a>
- <a name='L388'></a><a href='#L388'>388</a>
- <a name='L389'></a><a href='#L389'>389</a>
- <a name='L390'></a><a href='#L390'>390</a>
- <a name='L391'></a><a href='#L391'>391</a>
- <a name='L392'></a><a href='#L392'>392</a>
- <a name='L393'></a><a href='#L393'>393</a>
- <a name='L394'></a><a href='#L394'>394</a>
- <a name='L395'></a><a href='#L395'>395</a>
- <a name='L396'></a><a href='#L396'>396</a>
- <a name='L397'></a><a href='#L397'>397</a>
- <a name='L398'></a><a href='#L398'>398</a>
- <a name='L399'></a><a href='#L399'>399</a>
- <a name='L400'></a><a href='#L400'>400</a>
- <a name='L401'></a><a href='#L401'>401</a>
- <a name='L402'></a><a href='#L402'>402</a>
- <a name='L403'></a><a href='#L403'>403</a>
- <a name='L404'></a><a href='#L404'>404</a>
- <a name='L405'></a><a href='#L405'>405</a>
- <a name='L406'></a><a href='#L406'>406</a>
- <a name='L407'></a><a href='#L407'>407</a>
- <a name='L408'></a><a href='#L408'>408</a>
- <a name='L409'></a><a href='#L409'>409</a>
- <a name='L410'></a><a href='#L410'>410</a>
- <a name='L411'></a><a href='#L411'>411</a>
- <a name='L412'></a><a href='#L412'>412</a>
- <a name='L413'></a><a href='#L413'>413</a>
- <a name='L414'></a><a href='#L414'>414</a>
- <a name='L415'></a><a href='#L415'>415</a>
- <a name='L416'></a><a href='#L416'>416</a>
- <a name='L417'></a><a href='#L417'>417</a>
- <a name='L418'></a><a href='#L418'>418</a>
- <a name='L419'></a><a href='#L419'>419</a>
- <a name='L420'></a><a href='#L420'>420</a>
- <a name='L421'></a><a href='#L421'>421</a>
- <a name='L422'></a><a href='#L422'>422</a>
- <a name='L423'></a><a href='#L423'>423</a>
- <a name='L424'></a><a href='#L424'>424</a>
- <a name='L425'></a><a href='#L425'>425</a>
- <a name='L426'></a><a href='#L426'>426</a>
- <a name='L427'></a><a href='#L427'>427</a>
- <a name='L428'></a><a href='#L428'>428</a>
- <a name='L429'></a><a href='#L429'>429</a>
- <a name='L430'></a><a href='#L430'>430</a>
- <a name='L431'></a><a href='#L431'>431</a>
- <a name='L432'></a><a href='#L432'>432</a>
- <a name='L433'></a><a href='#L433'>433</a>
- <a name='L434'></a><a href='#L434'>434</a>
- <a name='L435'></a><a href='#L435'>435</a>
- <a name='L436'></a><a href='#L436'>436</a>
- <a name='L437'></a><a href='#L437'>437</a>
- <a name='L438'></a><a href='#L438'>438</a>
- <a name='L439'></a><a href='#L439'>439</a>
- <a name='L440'></a><a href='#L440'>440</a>
- <a name='L441'></a><a href='#L441'>441</a>
- <a name='L442'></a><a href='#L442'>442</a>
- <a name='L443'></a><a href='#L443'>443</a>
- <a name='L444'></a><a href='#L444'>444</a>
- <a name='L445'></a><a href='#L445'>445</a>
- <a name='L446'></a><a href='#L446'>446</a>
- <a name='L447'></a><a href='#L447'>447</a>
- <a name='L448'></a><a href='#L448'>448</a>
- <a name='L449'></a><a href='#L449'>449</a>
- <a name='L450'></a><a href='#L450'>450</a>
- <a name='L451'></a><a href='#L451'>451</a>
- <a name='L452'></a><a href='#L452'>452</a>
- <a name='L453'></a><a href='#L453'>453</a>
- <a name='L454'></a><a href='#L454'>454</a>
- <a name='L455'></a><a href='#L455'>455</a>
- <a name='L456'></a><a href='#L456'>456</a>
- <a name='L457'></a><a href='#L457'>457</a>
- <a name='L458'></a><a href='#L458'>458</a>
- <a name='L459'></a><a href='#L459'>459</a>
- <a name='L460'></a><a href='#L460'>460</a>
- <a name='L461'></a><a href='#L461'>461</a>
- <a name='L462'></a><a href='#L462'>462</a>
- <a name='L463'></a><a href='#L463'>463</a>
- <a name='L464'></a><a href='#L464'>464</a>
- <a name='L465'></a><a href='#L465'>465</a>
- <a name='L466'></a><a href='#L466'>466</a>
- <a name='L467'></a><a href='#L467'>467</a>
- <a name='L468'></a><a href='#L468'>468</a>
- <a name='L469'></a><a href='#L469'>469</a>
- <a name='L470'></a><a href='#L470'>470</a>
- <a name='L471'></a><a href='#L471'>471</a>
- <a name='L472'></a><a href='#L472'>472</a>
- <a name='L473'></a><a href='#L473'>473</a>
- <a name='L474'></a><a href='#L474'>474</a>
- <a name='L475'></a><a href='#L475'>475</a>
- <a name='L476'></a><a href='#L476'>476</a>
- <a name='L477'></a><a href='#L477'>477</a>
- <a name='L478'></a><a href='#L478'>478</a>
- <a name='L479'></a><a href='#L479'>479</a>
- <a name='L480'></a><a href='#L480'>480</a>
- <a name='L481'></a><a href='#L481'>481</a>
- <a name='L482'></a><a href='#L482'>482</a>
- <a name='L483'></a><a href='#L483'>483</a>
- <a name='L484'></a><a href='#L484'>484</a>
- <a name='L485'></a><a href='#L485'>485</a>
- <a name='L486'></a><a href='#L486'>486</a>
- <a name='L487'></a><a href='#L487'>487</a>
- <a name='L488'></a><a href='#L488'>488</a>
- <a name='L489'></a><a href='#L489'>489</a>
- <a name='L490'></a><a href='#L490'>490</a>
- <a name='L491'></a><a href='#L491'>491</a>
- <a name='L492'></a><a href='#L492'>492</a>
- <a name='L493'></a><a href='#L493'>493</a>
- <a name='L494'></a><a href='#L494'>494</a>
- <a name='L495'></a><a href='#L495'>495</a>
- <a name='L496'></a><a href='#L496'>496</a>
- <a name='L497'></a><a href='#L497'>497</a>
- <a name='L498'></a><a href='#L498'>498</a>
- <a name='L499'></a><a href='#L499'>499</a>
- <a name='L500'></a><a href='#L500'>500</a>
- <a name='L501'></a><a href='#L501'>501</a>
- <a name='L502'></a><a href='#L502'>502</a>
- <a name='L503'></a><a href='#L503'>503</a>
- <a name='L504'></a><a href='#L504'>504</a>
- <a name='L505'></a><a href='#L505'>505</a>
- <a name='L506'></a><a href='#L506'>506</a>
- <a name='L507'></a><a href='#L507'>507</a>
- <a name='L508'></a><a href='#L508'>508</a>
- <a name='L509'></a><a href='#L509'>509</a>
- <a name='L510'></a><a href='#L510'>510</a>
- <a name='L511'></a><a href='#L511'>511</a>
- <a name='L512'></a><a href='#L512'>512</a>
- <a name='L513'></a><a href='#L513'>513</a>
- <a name='L514'></a><a href='#L514'>514</a>
- <a name='L515'></a><a href='#L515'>515</a>
- <a name='L516'></a><a href='#L516'>516</a>
- <a name='L517'></a><a href='#L517'>517</a>
- <a name='L518'></a><a href='#L518'>518</a>
- <a name='L519'></a><a href='#L519'>519</a>
- <a name='L520'></a><a href='#L520'>520</a>
- <a name='L521'></a><a href='#L521'>521</a>
- <a name='L522'></a><a href='#L522'>522</a>
- <a name='L523'></a><a href='#L523'>523</a>
- <a name='L524'></a><a href='#L524'>524</a>
- <a name='L525'></a><a href='#L525'>525</a>
- <a name='L526'></a><a href='#L526'>526</a>
- <a name='L527'></a><a href='#L527'>527</a>
- <a name='L528'></a><a href='#L528'>528</a>
- <a name='L529'></a><a href='#L529'>529</a>
- <a name='L530'></a><a href='#L530'>530</a>
- <a name='L531'></a><a href='#L531'>531</a>
- <a name='L532'></a><a href='#L532'>532</a>
- <a name='L533'></a><a href='#L533'>533</a>
- <a name='L534'></a><a href='#L534'>534</a>
- <a name='L535'></a><a href='#L535'>535</a>
- <a name='L536'></a><a href='#L536'>536</a>
- <a name='L537'></a><a href='#L537'>537</a>
- <a name='L538'></a><a href='#L538'>538</a>
- <a name='L539'></a><a href='#L539'>539</a>
- <a name='L540'></a><a href='#L540'>540</a>
- <a name='L541'></a><a href='#L541'>541</a>
- <a name='L542'></a><a href='#L542'>542</a>
- <a name='L543'></a><a href='#L543'>543</a>
- <a name='L544'></a><a href='#L544'>544</a>
- <a name='L545'></a><a href='#L545'>545</a>
- <a name='L546'></a><a href='#L546'>546</a>
- <a name='L547'></a><a href='#L547'>547</a>
- <a name='L548'></a><a href='#L548'>548</a>
- <a name='L549'></a><a href='#L549'>549</a>
- <a name='L550'></a><a href='#L550'>550</a>
- <a name='L551'></a><a href='#L551'>551</a>
- <a name='L552'></a><a href='#L552'>552</a>
- <a name='L553'></a><a href='#L553'>553</a>
- <a name='L554'></a><a href='#L554'>554</a>
- <a name='L555'></a><a href='#L555'>555</a>
- <a name='L556'></a><a href='#L556'>556</a>
- <a name='L557'></a><a href='#L557'>557</a>
- <a name='L558'></a><a href='#L558'>558</a>
- <a name='L559'></a><a href='#L559'>559</a>
- <a name='L560'></a><a href='#L560'>560</a>
- <a name='L561'></a><a href='#L561'>561</a>
- <a name='L562'></a><a href='#L562'>562</a>
- <a name='L563'></a><a href='#L563'>563</a>
- <a name='L564'></a><a href='#L564'>564</a>
- <a name='L565'></a><a href='#L565'>565</a>
- <a name='L566'></a><a href='#L566'>566</a>
- <a name='L567'></a><a href='#L567'>567</a>
- <a name='L568'></a><a href='#L568'>568</a>
- <a name='L569'></a><a href='#L569'>569</a>
- <a name='L570'></a><a href='#L570'>570</a>
- <a name='L571'></a><a href='#L571'>571</a>
- <a name='L572'></a><a href='#L572'>572</a>
- <a name='L573'></a><a href='#L573'>573</a>
- <a name='L574'></a><a href='#L574'>574</a>
- <a name='L575'></a><a href='#L575'>575</a>
- <a name='L576'></a><a href='#L576'>576</a>
- <a name='L577'></a><a href='#L577'>577</a>
- <a name='L578'></a><a href='#L578'>578</a>
- <a name='L579'></a><a href='#L579'>579</a>
- <a name='L580'></a><a href='#L580'>580</a>
- <a name='L581'></a><a href='#L581'>581</a>
- <a name='L582'></a><a href='#L582'>582</a>
- <a name='L583'></a><a href='#L583'>583</a>
- <a name='L584'></a><a href='#L584'>584</a>
- <a name='L585'></a><a href='#L585'>585</a>
- <a name='L586'></a><a href='#L586'>586</a>
- <a name='L587'></a><a href='#L587'>587</a>
- <a name='L588'></a><a href='#L588'>588</a>
- <a name='L589'></a><a href='#L589'>589</a>
- <a name='L590'></a><a href='#L590'>590</a>
- <a name='L591'></a><a href='#L591'>591</a>
- <a name='L592'></a><a href='#L592'>592</a>
- <a name='L593'></a><a href='#L593'>593</a>
- <a name='L594'></a><a href='#L594'>594</a>
- <a name='L595'></a><a href='#L595'>595</a>
- <a name='L596'></a><a href='#L596'>596</a>
- <a name='L597'></a><a href='#L597'>597</a>
- <a name='L598'></a><a href='#L598'>598</a>
- <a name='L599'></a><a href='#L599'>599</a>
- <a name='L600'></a><a href='#L600'>600</a>
- <a name='L601'></a><a href='#L601'>601</a>
- <a name='L602'></a><a href='#L602'>602</a>
- <a name='L603'></a><a href='#L603'>603</a>
- <a name='L604'></a><a href='#L604'>604</a>
- <a name='L605'></a><a href='#L605'>605</a>
- <a name='L606'></a><a href='#L606'>606</a>
- <a name='L607'></a><a href='#L607'>607</a>
- <a name='L608'></a><a href='#L608'>608</a>
- <a name='L609'></a><a href='#L609'>609</a>
- <a name='L610'></a><a href='#L610'>610</a>
- <a name='L611'></a><a href='#L611'>611</a>
- <a name='L612'></a><a href='#L612'>612</a>
- <a name='L613'></a><a href='#L613'>613</a>
- <a name='L614'></a><a href='#L614'>614</a>
- <a name='L615'></a><a href='#L615'>615</a>
- <a name='L616'></a><a href='#L616'>616</a>
- <a name='L617'></a><a href='#L617'>617</a>
- <a name='L618'></a><a href='#L618'>618</a>
- <a name='L619'></a><a href='#L619'>619</a>
- <a name='L620'></a><a href='#L620'>620</a>
- <a name='L621'></a><a href='#L621'>621</a>
- <a name='L622'></a><a href='#L622'>622</a>
- <a name='L623'></a><a href='#L623'>623</a>
- <a name='L624'></a><a href='#L624'>624</a>
- <a name='L625'></a><a href='#L625'>625</a>
- <a name='L626'></a><a href='#L626'>626</a>
- <a name='L627'></a><a href='#L627'>627</a>
- <a name='L628'></a><a href='#L628'>628</a>
- <a name='L629'></a><a href='#L629'>629</a>
- <a name='L630'></a><a href='#L630'>630</a>
- <a name='L631'></a><a href='#L631'>631</a>
- <a name='L632'></a><a href='#L632'>632</a>
- <a name='L633'></a><a href='#L633'>633</a>
- <a name='L634'></a><a href='#L634'>634</a>
- <a name='L635'></a><a href='#L635'>635</a>
- <a name='L636'></a><a href='#L636'>636</a>
- <a name='L637'></a><a href='#L637'>637</a>
- <a name='L638'></a><a href='#L638'>638</a>
- <a name='L639'></a><a href='#L639'>639</a>
- <a name='L640'></a><a href='#L640'>640</a>
- <a name='L641'></a><a href='#L641'>641</a>
- <a name='L642'></a><a href='#L642'>642</a>
- <a name='L643'></a><a href='#L643'>643</a>
- <a name='L644'></a><a href='#L644'>644</a>
- <a name='L645'></a><a href='#L645'>645</a>
- <a name='L646'></a><a href='#L646'>646</a>
- <a name='L647'></a><a href='#L647'>647</a>
- <a name='L648'></a><a href='#L648'>648</a>
- <a name='L649'></a><a href='#L649'>649</a>
- <a name='L650'></a><a href='#L650'>650</a>
- <a name='L651'></a><a href='#L651'>651</a>
- <a name='L652'></a><a href='#L652'>652</a>
- <a name='L653'></a><a href='#L653'>653</a>
- <a name='L654'></a><a href='#L654'>654</a>
- <a name='L655'></a><a href='#L655'>655</a>
- <a name='L656'></a><a href='#L656'>656</a>
- <a name='L657'></a><a href='#L657'>657</a>
- <a name='L658'></a><a href='#L658'>658</a>
- <a name='L659'></a><a href='#L659'>659</a>
- <a name='L660'></a><a href='#L660'>660</a>
- <a name='L661'></a><a href='#L661'>661</a>
- <a name='L662'></a><a href='#L662'>662</a>
- <a name='L663'></a><a href='#L663'>663</a>
- <a name='L664'></a><a href='#L664'>664</a>
- <a name='L665'></a><a href='#L665'>665</a>
- <a name='L666'></a><a href='#L666'>666</a>
- <a name='L667'></a><a href='#L667'>667</a>
- <a name='L668'></a><a href='#L668'>668</a>
- <a name='L669'></a><a href='#L669'>669</a>
- <a name='L670'></a><a href='#L670'>670</a>
- <a name='L671'></a><a href='#L671'>671</a>
- <a name='L672'></a><a href='#L672'>672</a>
- <a name='L673'></a><a href='#L673'>673</a>
- <a name='L674'></a><a href='#L674'>674</a>
- <a name='L675'></a><a href='#L675'>675</a>
- <a name='L676'></a><a href='#L676'>676</a>
- <a name='L677'></a><a href='#L677'>677</a>
- <a name='L678'></a><a href='#L678'>678</a>
- <a name='L679'></a><a href='#L679'>679</a>
- <a name='L680'></a><a href='#L680'>680</a>
- <a name='L681'></a><a href='#L681'>681</a>
- <a name='L682'></a><a href='#L682'>682</a>
- <a name='L683'></a><a href='#L683'>683</a>
- <a name='L684'></a><a href='#L684'>684</a>
- <a name='L685'></a><a href='#L685'>685</a>
- <a name='L686'></a><a href='#L686'>686</a>
- <a name='L687'></a><a href='#L687'>687</a>
- <a name='L688'></a><a href='#L688'>688</a>
- <a name='L689'></a><a href='#L689'>689</a>
- <a name='L690'></a><a href='#L690'>690</a>
- <a name='L691'></a><a href='#L691'>691</a>
- <a name='L692'></a><a href='#L692'>692</a>
- <a name='L693'></a><a href='#L693'>693</a>
- <a name='L694'></a><a href='#L694'>694</a>
- <a name='L695'></a><a href='#L695'>695</a>
- <a name='L696'></a><a href='#L696'>696</a>
- <a name='L697'></a><a href='#L697'>697</a>
- <a name='L698'></a><a href='#L698'>698</a>
- <a name='L699'></a><a href='#L699'>699</a>
- <a name='L700'></a><a href='#L700'>700</a>
- <a name='L701'></a><a href='#L701'>701</a>
- <a name='L702'></a><a href='#L702'>702</a>
- <a name='L703'></a><a href='#L703'>703</a>
- <a name='L704'></a><a href='#L704'>704</a>
- <a name='L705'></a><a href='#L705'>705</a>
- <a name='L706'></a><a href='#L706'>706</a>
- <a name='L707'></a><a href='#L707'>707</a>
- <a name='L708'></a><a href='#L708'>708</a>
- <a name='L709'></a><a href='#L709'>709</a>
- <a name='L710'></a><a href='#L710'>710</a>
- <a name='L711'></a><a href='#L711'>711</a>
- <a name='L712'></a><a href='#L712'>712</a>
- <a name='L713'></a><a href='#L713'>713</a>
- <a name='L714'></a><a href='#L714'>714</a>
- <a name='L715'></a><a href='#L715'>715</a>
- <a name='L716'></a><a href='#L716'>716</a>
- <a name='L717'></a><a href='#L717'>717</a>
- <a name='L718'></a><a href='#L718'>718</a>
- <a name='L719'></a><a href='#L719'>719</a>
- <a name='L720'></a><a href='#L720'>720</a>
- <a name='L721'></a><a href='#L721'>721</a>
- <a name='L722'></a><a href='#L722'>722</a>
- <a name='L723'></a><a href='#L723'>723</a>
- <a name='L724'></a><a href='#L724'>724</a>
- <a name='L725'></a><a href='#L725'>725</a>
- <a name='L726'></a><a href='#L726'>726</a>
- <a name='L727'></a><a href='#L727'>727</a>
- <a name='L728'></a><a href='#L728'>728</a>
- <a name='L729'></a><a href='#L729'>729</a>
- <a name='L730'></a><a href='#L730'>730</a>
- <a name='L731'></a><a href='#L731'>731</a>
- <a name='L732'></a><a href='#L732'>732</a>
- <a name='L733'></a><a href='#L733'>733</a>
- <a name='L734'></a><a href='#L734'>734</a>
- <a name='L735'></a><a href='#L735'>735</a>
- <a name='L736'></a><a href='#L736'>736</a>
- <a name='L737'></a><a href='#L737'>737</a>
- <a name='L738'></a><a href='#L738'>738</a>
- <a name='L739'></a><a href='#L739'>739</a>
- <a name='L740'></a><a href='#L740'>740</a>
- <a name='L741'></a><a href='#L741'>741</a>
- <a name='L742'></a><a href='#L742'>742</a>
- <a name='L743'></a><a href='#L743'>743</a>
- <a name='L744'></a><a href='#L744'>744</a>
- <a name='L745'></a><a href='#L745'>745</a>
- <a name='L746'></a><a href='#L746'>746</a>
- <a name='L747'></a><a href='#L747'>747</a>
- <a name='L748'></a><a href='#L748'>748</a>
- <a name='L749'></a><a href='#L749'>749</a>
- <a name='L750'></a><a href='#L750'>750</a>
- <a name='L751'></a><a href='#L751'>751</a>
- <a name='L752'></a><a href='#L752'>752</a>
- <a name='L753'></a><a href='#L753'>753</a>
- <a name='L754'></a><a href='#L754'>754</a>
- <a name='L755'></a><a href='#L755'>755</a>
- <a name='L756'></a><a href='#L756'>756</a>
- <a name='L757'></a><a href='#L757'>757</a>
- <a name='L758'></a><a href='#L758'>758</a>
- <a name='L759'></a><a href='#L759'>759</a>
- <a name='L760'></a><a href='#L760'>760</a>
- <a name='L761'></a><a href='#L761'>761</a>
- <a name='L762'></a><a href='#L762'>762</a>
- <a name='L763'></a><a href='#L763'>763</a>
- <a name='L764'></a><a href='#L764'>764</a>
- <a name='L765'></a><a href='#L765'>765</a>
- <a name='L766'></a><a href='#L766'>766</a>
- <a name='L767'></a><a href='#L767'>767</a>
- <a name='L768'></a><a href='#L768'>768</a>
- <a name='L769'></a><a href='#L769'>769</a>
- <a name='L770'></a><a href='#L770'>770</a>
- <a name='L771'></a><a href='#L771'>771</a>
- <a name='L772'></a><a href='#L772'>772</a>
- <a name='L773'></a><a href='#L773'>773</a>
- <a name='L774'></a><a href='#L774'>774</a>
- <a name='L775'></a><a href='#L775'>775</a>
- <a name='L776'></a><a href='#L776'>776</a>
- <a name='L777'></a><a href='#L777'>777</a>
- <a name='L778'></a><a href='#L778'>778</a>
- <a name='L779'></a><a href='#L779'>779</a>
- <a name='L780'></a><a href='#L780'>780</a>
- <a name='L781'></a><a href='#L781'>781</a>
- <a name='L782'></a><a href='#L782'>782</a>
- <a name='L783'></a><a href='#L783'>783</a>
- <a name='L784'></a><a href='#L784'>784</a>
- <a name='L785'></a><a href='#L785'>785</a>
- <a name='L786'></a><a href='#L786'>786</a>
- <a name='L787'></a><a href='#L787'>787</a>
- <a name='L788'></a><a href='#L788'>788</a>
- <a name='L789'></a><a href='#L789'>789</a>
- <a name='L790'></a><a href='#L790'>790</a>
- <a name='L791'></a><a href='#L791'>791</a>
- <a name='L792'></a><a href='#L792'>792</a>
- <a name='L793'></a><a href='#L793'>793</a>
- <a name='L794'></a><a href='#L794'>794</a>
- <a name='L795'></a><a href='#L795'>795</a>
- <a name='L796'></a><a href='#L796'>796</a>
- <a name='L797'></a><a href='#L797'>797</a>
- <a name='L798'></a><a href='#L798'>798</a>
- <a name='L799'></a><a href='#L799'>799</a>
- <a name='L800'></a><a href='#L800'>800</a>
- <a name='L801'></a><a href='#L801'>801</a>
- <a name='L802'></a><a href='#L802'>802</a>
- <a name='L803'></a><a href='#L803'>803</a>
- <a name='L804'></a><a href='#L804'>804</a>
- <a name='L805'></a><a href='#L805'>805</a>
- <a name='L806'></a><a href='#L806'>806</a>
- <a name='L807'></a><a href='#L807'>807</a>
- <a name='L808'></a><a href='#L808'>808</a>
- <a name='L809'></a><a href='#L809'>809</a>
- <a name='L810'></a><a href='#L810'>810</a>
- <a name='L811'></a><a href='#L811'>811</a>
- <a name='L812'></a><a href='#L812'>812</a>
- <a name='L813'></a><a href='#L813'>813</a>
- <a name='L814'></a><a href='#L814'>814</a>
- <a name='L815'></a><a href='#L815'>815</a>
- <a name='L816'></a><a href='#L816'>816</a>
- <a name='L817'></a><a href='#L817'>817</a>
- <a name='L818'></a><a href='#L818'>818</a>
- <a name='L819'></a><a href='#L819'>819</a>
- <a name='L820'></a><a href='#L820'>820</a>
- <a name='L821'></a><a href='#L821'>821</a>
- <a name='L822'></a><a href='#L822'>822</a>
- <a name='L823'></a><a href='#L823'>823</a>
- <a name='L824'></a><a href='#L824'>824</a>
- <a name='L825'></a><a href='#L825'>825</a>
- <a name='L826'></a><a href='#L826'>826</a>
- <a name='L827'></a><a href='#L827'>827</a>
- <a name='L828'></a><a href='#L828'>828</a>
- <a name='L829'></a><a href='#L829'>829</a>
- <a name='L830'></a><a href='#L830'>830</a>
- <a name='L831'></a><a href='#L831'>831</a>
- <a name='L832'></a><a href='#L832'>832</a>
- <a name='L833'></a><a href='#L833'>833</a>
- <a name='L834'></a><a href='#L834'>834</a>
- <a name='L835'></a><a href='#L835'>835</a>
- <a name='L836'></a><a href='#L836'>836</a>
- <a name='L837'></a><a href='#L837'>837</a>
- <a name='L838'></a><a href='#L838'>838</a>
- <a name='L839'></a><a href='#L839'>839</a>
- <a name='L840'></a><a href='#L840'>840</a>
- <a name='L841'></a><a href='#L841'>841</a>
- <a name='L842'></a><a href='#L842'>842</a>
- <a name='L843'></a><a href='#L843'>843</a>
- <a name='L844'></a><a href='#L844'>844</a>
- <a name='L845'></a><a href='#L845'>845</a>
- <a name='L846'></a><a href='#L846'>846</a>
- <a name='L847'></a><a href='#L847'>847</a>
- <a name='L848'></a><a href='#L848'>848</a>
- <a name='L849'></a><a href='#L849'>849</a>
- <a name='L850'></a><a href='#L850'>850</a>
- <a name='L851'></a><a href='#L851'>851</a>
- <a name='L852'></a><a href='#L852'>852</a>
- <a name='L853'></a><a href='#L853'>853</a>
- <a name='L854'></a><a href='#L854'>854</a>
- <a name='L855'></a><a href='#L855'>855</a>
- <a name='L856'></a><a href='#L856'>856</a>
- <a name='L857'></a><a href='#L857'>857</a>
- <a name='L858'></a><a href='#L858'>858</a>
- <a name='L859'></a><a href='#L859'>859</a>
- <a name='L860'></a><a href='#L860'>860</a>
- <a name='L861'></a><a href='#L861'>861</a>
- <a name='L862'></a><a href='#L862'>862</a>
- <a name='L863'></a><a href='#L863'>863</a>
- <a name='L864'></a><a href='#L864'>864</a>
- <a name='L865'></a><a href='#L865'>865</a>
- <a name='L866'></a><a href='#L866'>866</a>
- <a name='L867'></a><a href='#L867'>867</a>
- <a name='L868'></a><a href='#L868'>868</a>
- <a name='L869'></a><a href='#L869'>869</a>
- <a name='L870'></a><a href='#L870'>870</a>
- <a name='L871'></a><a href='#L871'>871</a>
- <a name='L872'></a><a href='#L872'>872</a>
- <a name='L873'></a><a href='#L873'>873</a>
- <a name='L874'></a><a href='#L874'>874</a>
- <a name='L875'></a><a href='#L875'>875</a>
- <a name='L876'></a><a href='#L876'>876</a>
- <a name='L877'></a><a href='#L877'>877</a>
- <a name='L878'></a><a href='#L878'>878</a>
- <a name='L879'></a><a href='#L879'>879</a>
- <a name='L880'></a><a href='#L880'>880</a>
- <a name='L881'></a><a href='#L881'>881</a>
- <a name='L882'></a><a href='#L882'>882</a>
- <a name='L883'></a><a href='#L883'>883</a>
- <a name='L884'></a><a href='#L884'>884</a>
- <a name='L885'></a><a href='#L885'>885</a>
- <a name='L886'></a><a href='#L886'>886</a>
- <a name='L887'></a><a href='#L887'>887</a>
- <a name='L888'></a><a href='#L888'>888</a>
- <a name='L889'></a><a href='#L889'>889</a>
- <a name='L890'></a><a href='#L890'>890</a>
- <a name='L891'></a><a href='#L891'>891</a>
- <a name='L892'></a><a href='#L892'>892</a>
- <a name='L893'></a><a href='#L893'>893</a>
- <a name='L894'></a><a href='#L894'>894</a>
- <a name='L895'></a><a href='#L895'>895</a>
- <a name='L896'></a><a href='#L896'>896</a>
- <a name='L897'></a><a href='#L897'>897</a>
- <a name='L898'></a><a href='#L898'>898</a>
- <a name='L899'></a><a href='#L899'>899</a>
- <a name='L900'></a><a href='#L900'>900</a>
- <a name='L901'></a><a href='#L901'>901</a>
- <a name='L902'></a><a href='#L902'>902</a>
- <a name='L903'></a><a href='#L903'>903</a>
- <a name='L904'></a><a href='#L904'>904</a>
- <a name='L905'></a><a href='#L905'>905</a>
- <a name='L906'></a><a href='#L906'>906</a>
- <a name='L907'></a><a href='#L907'>907</a>
- <a name='L908'></a><a href='#L908'>908</a>
- <a name='L909'></a><a href='#L909'>909</a>
- <a name='L910'></a><a href='#L910'>910</a>
- <a name='L911'></a><a href='#L911'>911</a>
- <a name='L912'></a><a href='#L912'>912</a>
- <a name='L913'></a><a href='#L913'>913</a>
- <a name='L914'></a><a href='#L914'>914</a>
- <a name='L915'></a><a href='#L915'>915</a>
- <a name='L916'></a><a href='#L916'>916</a>
- <a name='L917'></a><a href='#L917'>917</a>
- <a name='L918'></a><a href='#L918'>918</a>
- <a name='L919'></a><a href='#L919'>919</a>
- <a name='L920'></a><a href='#L920'>920</a>
- <a name='L921'></a><a href='#L921'>921</a>
- <a name='L922'></a><a href='#L922'>922</a>
- <a name='L923'></a><a href='#L923'>923</a>
- <a name='L924'></a><a href='#L924'>924</a>
- <a name='L925'></a><a href='#L925'>925</a>
- <a name='L926'></a><a href='#L926'>926</a>
- <a name='L927'></a><a href='#L927'>927</a>
- <a name='L928'></a><a href='#L928'>928</a>
- <a name='L929'></a><a href='#L929'>929</a>
- <a name='L930'></a><a href='#L930'>930</a>
- <a name='L931'></a><a href='#L931'>931</a>
- <a name='L932'></a><a href='#L932'>932</a>
- <a name='L933'></a><a href='#L933'>933</a>
- <a name='L934'></a><a href='#L934'>934</a>
- <a name='L935'></a><a href='#L935'>935</a>
- <a name='L936'></a><a href='#L936'>936</a>
- <a name='L937'></a><a href='#L937'>937</a>
- <a name='L938'></a><a href='#L938'>938</a>
- <a name='L939'></a><a href='#L939'>939</a>
- <a name='L940'></a><a href='#L940'>940</a>
- <a name='L941'></a><a href='#L941'>941</a>
- <a name='L942'></a><a href='#L942'>942</a>
- <a name='L943'></a><a href='#L943'>943</a>
- <a name='L944'></a><a href='#L944'>944</a>
- <a name='L945'></a><a href='#L945'>945</a>
- <a name='L946'></a><a href='#L946'>946</a>
- <a name='L947'></a><a href='#L947'>947</a>
- <a name='L948'></a><a href='#L948'>948</a>
- <a name='L949'></a><a href='#L949'>949</a>
- <a name='L950'></a><a href='#L950'>950</a>
- <a name='L951'></a><a href='#L951'>951</a>
- <a name='L952'></a><a href='#L952'>952</a>
- <a name='L953'></a><a href='#L953'>953</a>
- <a name='L954'></a><a href='#L954'>954</a>
- <a name='L955'></a><a href='#L955'>955</a>
- <a name='L956'></a><a href='#L956'>956</a>
- <a name='L957'></a><a href='#L957'>957</a>
- <a name='L958'></a><a href='#L958'>958</a>
- <a name='L959'></a><a href='#L959'>959</a>
- <a name='L960'></a><a href='#L960'>960</a>
- <a name='L961'></a><a href='#L961'>961</a>
- <a name='L962'></a><a href='#L962'>962</a>
- <a name='L963'></a><a href='#L963'>963</a>
- <a name='L964'></a><a href='#L964'>964</a>
- <a name='L965'></a><a href='#L965'>965</a>
- <a name='L966'></a><a href='#L966'>966</a>
- <a name='L967'></a><a href='#L967'>967</a>
- <a name='L968'></a><a href='#L968'>968</a>
- <a name='L969'></a><a href='#L969'>969</a>
- <a name='L970'></a><a href='#L970'>970</a>
- <a name='L971'></a><a href='#L971'>971</a>
- <a name='L972'></a><a href='#L972'>972</a>
- <a name='L973'></a><a href='#L973'>973</a>
- <a name='L974'></a><a href='#L974'>974</a>
- <a name='L975'></a><a href='#L975'>975</a>
- <a name='L976'></a><a href='#L976'>976</a>
- <a name='L977'></a><a href='#L977'>977</a>
- <a name='L978'></a><a href='#L978'>978</a>
- <a name='L979'></a><a href='#L979'>979</a>
- <a name='L980'></a><a href='#L980'>980</a>
- <a name='L981'></a><a href='#L981'>981</a>
- <a name='L982'></a><a href='#L982'>982</a>
- <a name='L983'></a><a href='#L983'>983</a>
- <a name='L984'></a><a href='#L984'>984</a>
- <a name='L985'></a><a href='#L985'>985</a>
- <a name='L986'></a><a href='#L986'>986</a>
- <a name='L987'></a><a href='#L987'>987</a>
- <a name='L988'></a><a href='#L988'>988</a>
- <a name='L989'></a><a href='#L989'>989</a>
- <a name='L990'></a><a href='#L990'>990</a>
- <a name='L991'></a><a href='#L991'>991</a>
- <a name='L992'></a><a href='#L992'>992</a>
- <a name='L993'></a><a href='#L993'>993</a>
- <a name='L994'></a><a href='#L994'>994</a>
- <a name='L995'></a><a href='#L995'>995</a>
- <a name='L996'></a><a href='#L996'>996</a>
- <a name='L997'></a><a href='#L997'>997</a>
- <a name='L998'></a><a href='#L998'>998</a>
- <a name='L999'></a><a href='#L999'>999</a>
- <a name='L1000'></a><a href='#L1000'>1000</a>
- <a name='L1001'></a><a href='#L1001'>1001</a>
- <a name='L1002'></a><a href='#L1002'>1002</a>
- <a name='L1003'></a><a href='#L1003'>1003</a>
- <a name='L1004'></a><a href='#L1004'>1004</a>
- <a name='L1005'></a><a href='#L1005'>1005</a>
- <a name='L1006'></a><a href='#L1006'>1006</a>
- <a name='L1007'></a><a href='#L1007'>1007</a>
- <a name='L1008'></a><a href='#L1008'>1008</a>
- <a name='L1009'></a><a href='#L1009'>1009</a>
- <a name='L1010'></a><a href='#L1010'>1010</a>
- <a name='L1011'></a><a href='#L1011'>1011</a>
- <a name='L1012'></a><a href='#L1012'>1012</a>
- <a name='L1013'></a><a href='#L1013'>1013</a>
- <a name='L1014'></a><a href='#L1014'>1014</a>
- <a name='L1015'></a><a href='#L1015'>1015</a>
- <a name='L1016'></a><a href='#L1016'>1016</a>
- <a name='L1017'></a><a href='#L1017'>1017</a>
- <a name='L1018'></a><a href='#L1018'>1018</a>
- <a name='L1019'></a><a href='#L1019'>1019</a>
- <a name='L1020'></a><a href='#L1020'>1020</a>
- <a name='L1021'></a><a href='#L1021'>1021</a>
- <a name='L1022'></a><a href='#L1022'>1022</a>
- <a name='L1023'></a><a href='#L1023'>1023</a>
- <a name='L1024'></a><a href='#L1024'>1024</a>
- <a name='L1025'></a><a href='#L1025'>1025</a>
- <a name='L1026'></a><a href='#L1026'>1026</a>
- <a name='L1027'></a><a href='#L1027'>1027</a>
- <a name='L1028'></a><a href='#L1028'>1028</a>
- <a name='L1029'></a><a href='#L1029'>1029</a>
- <a name='L1030'></a><a href='#L1030'>1030</a>
- <a name='L1031'></a><a href='#L1031'>1031</a>
- <a name='L1032'></a><a href='#L1032'>1032</a>
- <a name='L1033'></a><a href='#L1033'>1033</a>
- <a name='L1034'></a><a href='#L1034'>1034</a>
- <a name='L1035'></a><a href='#L1035'>1035</a>
- <a name='L1036'></a><a href='#L1036'>1036</a>
- <a name='L1037'></a><a href='#L1037'>1037</a>
- <a name='L1038'></a><a href='#L1038'>1038</a>
- <a name='L1039'></a><a href='#L1039'>1039</a>
- <a name='L1040'></a><a href='#L1040'>1040</a>
- <a name='L1041'></a><a href='#L1041'>1041</a>
- <a name='L1042'></a><a href='#L1042'>1042</a>
- <a name='L1043'></a><a href='#L1043'>1043</a>
- <a name='L1044'></a><a href='#L1044'>1044</a>
- <a name='L1045'></a><a href='#L1045'>1045</a>
- <a name='L1046'></a><a href='#L1046'>1046</a>
- <a name='L1047'></a><a href='#L1047'>1047</a>
- <a name='L1048'></a><a href='#L1048'>1048</a>
- <a name='L1049'></a><a href='#L1049'>1049</a>
- <a name='L1050'></a><a href='#L1050'>1050</a>
- <a name='L1051'></a><a href='#L1051'>1051</a>
- <a name='L1052'></a><a href='#L1052'>1052</a>
- <a name='L1053'></a><a href='#L1053'>1053</a>
- <a name='L1054'></a><a href='#L1054'>1054</a>
- <a name='L1055'></a><a href='#L1055'>1055</a>
- <a name='L1056'></a><a href='#L1056'>1056</a>
- <a name='L1057'></a><a href='#L1057'>1057</a>
- <a name='L1058'></a><a href='#L1058'>1058</a>
- <a name='L1059'></a><a href='#L1059'>1059</a>
- <a name='L1060'></a><a href='#L1060'>1060</a>
- <a name='L1061'></a><a href='#L1061'>1061</a>
- <a name='L1062'></a><a href='#L1062'>1062</a>
- <a name='L1063'></a><a href='#L1063'>1063</a>
- <a name='L1064'></a><a href='#L1064'>1064</a>
- <a name='L1065'></a><a href='#L1065'>1065</a>
- <a name='L1066'></a><a href='#L1066'>1066</a>
- <a name='L1067'></a><a href='#L1067'>1067</a>
- <a name='L1068'></a><a href='#L1068'>1068</a>
- <a name='L1069'></a><a href='#L1069'>1069</a>
- <a name='L1070'></a><a href='#L1070'>1070</a>
- <a name='L1071'></a><a href='#L1071'>1071</a>
- <a name='L1072'></a><a href='#L1072'>1072</a>
- <a name='L1073'></a><a href='#L1073'>1073</a>
- <a name='L1074'></a><a href='#L1074'>1074</a>
- <a name='L1075'></a><a href='#L1075'>1075</a>
- <a name='L1076'></a><a href='#L1076'>1076</a>
- <a name='L1077'></a><a href='#L1077'>1077</a>
- <a name='L1078'></a><a href='#L1078'>1078</a>
- <a name='L1079'></a><a href='#L1079'>1079</a>
- <a name='L1080'></a><a href='#L1080'>1080</a>
- <a name='L1081'></a><a href='#L1081'>1081</a>
- <a name='L1082'></a><a href='#L1082'>1082</a>
- <a name='L1083'></a><a href='#L1083'>1083</a>
- <a name='L1084'></a><a href='#L1084'>1084</a>
- <a name='L1085'></a><a href='#L1085'>1085</a>
- <a name='L1086'></a><a href='#L1086'>1086</a>
- <a name='L1087'></a><a href='#L1087'>1087</a>
- <a name='L1088'></a><a href='#L1088'>1088</a>
- <a name='L1089'></a><a href='#L1089'>1089</a>
- <a name='L1090'></a><a href='#L1090'>1090</a>
- <a name='L1091'></a><a href='#L1091'>1091</a>
- <a name='L1092'></a><a href='#L1092'>1092</a>
- <a name='L1093'></a><a href='#L1093'>1093</a>
- <a name='L1094'></a><a href='#L1094'>1094</a>
- <a name='L1095'></a><a href='#L1095'>1095</a>
- <a name='L1096'></a><a href='#L1096'>1096</a>
- <a name='L1097'></a><a href='#L1097'>1097</a>
- <a name='L1098'></a><a href='#L1098'>1098</a>
- <a name='L1099'></a><a href='#L1099'>1099</a>
- <a name='L1100'></a><a href='#L1100'>1100</a>
- <a name='L1101'></a><a href='#L1101'>1101</a>
- <a name='L1102'></a><a href='#L1102'>1102</a>
- <a name='L1103'></a><a href='#L1103'>1103</a>
- <a name='L1104'></a><a href='#L1104'>1104</a>
- <a name='L1105'></a><a href='#L1105'>1105</a>
- <a name='L1106'></a><a href='#L1106'>1106</a>
- <a name='L1107'></a><a href='#L1107'>1107</a>
- <a name='L1108'></a><a href='#L1108'>1108</a>
- <a name='L1109'></a><a href='#L1109'>1109</a>
- <a name='L1110'></a><a href='#L1110'>1110</a>
- <a name='L1111'></a><a href='#L1111'>1111</a>
- <a name='L1112'></a><a href='#L1112'>1112</a>
- <a name='L1113'></a><a href='#L1113'>1113</a>
- <a name='L1114'></a><a href='#L1114'>1114</a>
- <a name='L1115'></a><a href='#L1115'>1115</a>
- <a name='L1116'></a><a href='#L1116'>1116</a>
- <a name='L1117'></a><a href='#L1117'>1117</a>
- <a name='L1118'></a><a href='#L1118'>1118</a>
- <a name='L1119'></a><a href='#L1119'>1119</a>
- <a name='L1120'></a><a href='#L1120'>1120</a>
- <a name='L1121'></a><a href='#L1121'>1121</a>
- <a name='L1122'></a><a href='#L1122'>1122</a>
- <a name='L1123'></a><a href='#L1123'>1123</a>
- <a name='L1124'></a><a href='#L1124'>1124</a>
- <a name='L1125'></a><a href='#L1125'>1125</a>
- <a name='L1126'></a><a href='#L1126'>1126</a>
- <a name='L1127'></a><a href='#L1127'>1127</a>
- <a name='L1128'></a><a href='#L1128'>1128</a>
- <a name='L1129'></a><a href='#L1129'>1129</a>
- <a name='L1130'></a><a href='#L1130'>1130</a>
- <a name='L1131'></a><a href='#L1131'>1131</a>
- <a name='L1132'></a><a href='#L1132'>1132</a>
- <a name='L1133'></a><a href='#L1133'>1133</a>
- <a name='L1134'></a><a href='#L1134'>1134</a>
- <a name='L1135'></a><a href='#L1135'>1135</a>
- <a name='L1136'></a><a href='#L1136'>1136</a>
- <a name='L1137'></a><a href='#L1137'>1137</a>
- <a name='L1138'></a><a href='#L1138'>1138</a>
- <a name='L1139'></a><a href='#L1139'>1139</a>
- <a name='L1140'></a><a href='#L1140'>1140</a>
- <a name='L1141'></a><a href='#L1141'>1141</a>
- <a name='L1142'></a><a href='#L1142'>1142</a>
- <a name='L1143'></a><a href='#L1143'>1143</a>
- <a name='L1144'></a><a href='#L1144'>1144</a>
- <a name='L1145'></a><a href='#L1145'>1145</a>
- <a name='L1146'></a><a href='#L1146'>1146</a>
- <a name='L1147'></a><a href='#L1147'>1147</a>
- <a name='L1148'></a><a href='#L1148'>1148</a>
- <a name='L1149'></a><a href='#L1149'>1149</a>
- <a name='L1150'></a><a href='#L1150'>1150</a>
- <a name='L1151'></a><a href='#L1151'>1151</a>
- <a name='L1152'></a><a href='#L1152'>1152</a>
- <a name='L1153'></a><a href='#L1153'>1153</a>
- <a name='L1154'></a><a href='#L1154'>1154</a>
- <a name='L1155'></a><a href='#L1155'>1155</a>
- <a name='L1156'></a><a href='#L1156'>1156</a>
- <a name='L1157'></a><a href='#L1157'>1157</a>
- <a name='L1158'></a><a href='#L1158'>1158</a>
- <a name='L1159'></a><a href='#L1159'>1159</a>
- <a name='L1160'></a><a href='#L1160'>1160</a>
- <a name='L1161'></a><a href='#L1161'>1161</a>
- <a name='L1162'></a><a href='#L1162'>1162</a>
- <a name='L1163'></a><a href='#L1163'>1163</a>
- <a name='L1164'></a><a href='#L1164'>1164</a>
- <a name='L1165'></a><a href='#L1165'>1165</a>
- <a name='L1166'></a><a href='#L1166'>1166</a>
- <a name='L1167'></a><a href='#L1167'>1167</a>
- <a name='L1168'></a><a href='#L1168'>1168</a>
- <a name='L1169'></a><a href='#L1169'>1169</a>
- <a name='L1170'></a><a href='#L1170'>1170</a>
- <a name='L1171'></a><a href='#L1171'>1171</a>
- <a name='L1172'></a><a href='#L1172'>1172</a>
- <a name='L1173'></a><a href='#L1173'>1173</a>
- <a name='L1174'></a><a href='#L1174'>1174</a>
- <a name='L1175'></a><a href='#L1175'>1175</a>
- <a name='L1176'></a><a href='#L1176'>1176</a>
- <a name='L1177'></a><a href='#L1177'>1177</a>
- <a name='L1178'></a><a href='#L1178'>1178</a>
- <a name='L1179'></a><a href='#L1179'>1179</a>
- <a name='L1180'></a><a href='#L1180'>1180</a>
- <a name='L1181'></a><a href='#L1181'>1181</a>
- <a name='L1182'></a><a href='#L1182'>1182</a>
- <a name='L1183'></a><a href='#L1183'>1183</a>
- <a name='L1184'></a><a href='#L1184'>1184</a>
- <a name='L1185'></a><a href='#L1185'>1185</a>
- <a name='L1186'></a><a href='#L1186'>1186</a>
- <a name='L1187'></a><a href='#L1187'>1187</a>
- <a name='L1188'></a><a href='#L1188'>1188</a>
- <a name='L1189'></a><a href='#L1189'>1189</a>
- <a name='L1190'></a><a href='#L1190'>1190</a>
- <a name='L1191'></a><a href='#L1191'>1191</a>
- <a name='L1192'></a><a href='#L1192'>1192</a>
- <a name='L1193'></a><a href='#L1193'>1193</a>
- <a name='L1194'></a><a href='#L1194'>1194</a>
- <a name='L1195'></a><a href='#L1195'>1195</a>
- <a name='L1196'></a><a href='#L1196'>1196</a>
- <a name='L1197'></a><a href='#L1197'>1197</a>
- <a name='L1198'></a><a href='#L1198'>1198</a>
- <a name='L1199'></a><a href='#L1199'>1199</a>
- <a name='L1200'></a><a href='#L1200'>1200</a>
- <a name='L1201'></a><a href='#L1201'>1201</a>
- <a name='L1202'></a><a href='#L1202'>1202</a>
- <a name='L1203'></a><a href='#L1203'>1203</a>
- <a name='L1204'></a><a href='#L1204'>1204</a>
- <a name='L1205'></a><a href='#L1205'>1205</a>
- <a name='L1206'></a><a href='#L1206'>1206</a>
- <a name='L1207'></a><a href='#L1207'>1207</a>
- <a name='L1208'></a><a href='#L1208'>1208</a>
- <a name='L1209'></a><a href='#L1209'>1209</a>
- <a name='L1210'></a><a href='#L1210'>1210</a>
- <a name='L1211'></a><a href='#L1211'>1211</a>
- <a name='L1212'></a><a href='#L1212'>1212</a>
- <a name='L1213'></a><a href='#L1213'>1213</a>
- <a name='L1214'></a><a href='#L1214'>1214</a>
- <a name='L1215'></a><a href='#L1215'>1215</a>
- <a name='L1216'></a><a href='#L1216'>1216</a>
- <a name='L1217'></a><a href='#L1217'>1217</a>
- <a name='L1218'></a><a href='#L1218'>1218</a>
- <a name='L1219'></a><a href='#L1219'>1219</a>
- <a name='L1220'></a><a href='#L1220'>1220</a>
- <a name='L1221'></a><a href='#L1221'>1221</a>
- <a name='L1222'></a><a href='#L1222'>1222</a>
- <a name='L1223'></a><a href='#L1223'>1223</a>
- <a name='L1224'></a><a href='#L1224'>1224</a>
- <a name='L1225'></a><a href='#L1225'>1225</a>
- <a name='L1226'></a><a href='#L1226'>1226</a>
- <a name='L1227'></a><a href='#L1227'>1227</a>
- <a name='L1228'></a><a href='#L1228'>1228</a>
- <a name='L1229'></a><a href='#L1229'>1229</a>
- <a name='L1230'></a><a href='#L1230'>1230</a>
- <a name='L1231'></a><a href='#L1231'>1231</a>
- <a name='L1232'></a><a href='#L1232'>1232</a>
- <a name='L1233'></a><a href='#L1233'>1233</a>
- <a name='L1234'></a><a href='#L1234'>1234</a>
- <a name='L1235'></a><a href='#L1235'>1235</a>
- <a name='L1236'></a><a href='#L1236'>1236</a>
- <a name='L1237'></a><a href='#L1237'>1237</a>
- <a name='L1238'></a><a href='#L1238'>1238</a>
- <a name='L1239'></a><a href='#L1239'>1239</a>
- <a name='L1240'></a><a href='#L1240'>1240</a>
- <a name='L1241'></a><a href='#L1241'>1241</a>
- <a name='L1242'></a><a href='#L1242'>1242</a>
- <a name='L1243'></a><a href='#L1243'>1243</a>
- <a name='L1244'></a><a href='#L1244'>1244</a>
- <a name='L1245'></a><a href='#L1245'>1245</a>
- <a name='L1246'></a><a href='#L1246'>1246</a>
- <a name='L1247'></a><a href='#L1247'>1247</a>
- <a name='L1248'></a><a href='#L1248'>1248</a>
- <a name='L1249'></a><a href='#L1249'>1249</a>
- <a name='L1250'></a><a href='#L1250'>1250</a>
- <a name='L1251'></a><a href='#L1251'>1251</a>
- <a name='L1252'></a><a href='#L1252'>1252</a>
- <a name='L1253'></a><a href='#L1253'>1253</a>
- <a name='L1254'></a><a href='#L1254'>1254</a>
- <a name='L1255'></a><a href='#L1255'>1255</a>
- <a name='L1256'></a><a href='#L1256'>1256</a>
- <a name='L1257'></a><a href='#L1257'>1257</a>
- <a name='L1258'></a><a href='#L1258'>1258</a>
- <a name='L1259'></a><a href='#L1259'>1259</a>
- <a name='L1260'></a><a href='#L1260'>1260</a>
- <a name='L1261'></a><a href='#L1261'>1261</a>
- <a name='L1262'></a><a href='#L1262'>1262</a>
- <a name='L1263'></a><a href='#L1263'>1263</a>
- <a name='L1264'></a><a href='#L1264'>1264</a>
- <a name='L1265'></a><a href='#L1265'>1265</a>
- <a name='L1266'></a><a href='#L1266'>1266</a>
- <a name='L1267'></a><a href='#L1267'>1267</a>
- <a name='L1268'></a><a href='#L1268'>1268</a>
- <a name='L1269'></a><a href='#L1269'>1269</a>
- <a name='L1270'></a><a href='#L1270'>1270</a>
- <a name='L1271'></a><a href='#L1271'>1271</a>
- <a name='L1272'></a><a href='#L1272'>1272</a>
- <a name='L1273'></a><a href='#L1273'>1273</a>
- <a name='L1274'></a><a href='#L1274'>1274</a>
- <a name='L1275'></a><a href='#L1275'>1275</a>
- <a name='L1276'></a><a href='#L1276'>1276</a>
- <a name='L1277'></a><a href='#L1277'>1277</a>
- <a name='L1278'></a><a href='#L1278'>1278</a>
- <a name='L1279'></a><a href='#L1279'>1279</a>
- <a name='L1280'></a><a href='#L1280'>1280</a>
- <a name='L1281'></a><a href='#L1281'>1281</a>
- <a name='L1282'></a><a href='#L1282'>1282</a>
- <a name='L1283'></a><a href='#L1283'>1283</a>
- <a name='L1284'></a><a href='#L1284'>1284</a>
- <a name='L1285'></a><a href='#L1285'>1285</a>
- <a name='L1286'></a><a href='#L1286'>1286</a>
- <a name='L1287'></a><a href='#L1287'>1287</a>
- <a name='L1288'></a><a href='#L1288'>1288</a>
- <a name='L1289'></a><a href='#L1289'>1289</a>
- <a name='L1290'></a><a href='#L1290'>1290</a>
- <a name='L1291'></a><a href='#L1291'>1291</a>
- <a name='L1292'></a><a href='#L1292'>1292</a>
- <a name='L1293'></a><a href='#L1293'>1293</a>
- <a name='L1294'></a><a href='#L1294'>1294</a>
- <a name='L1295'></a><a href='#L1295'>1295</a>
- <a name='L1296'></a><a href='#L1296'>1296</a>
- <a name='L1297'></a><a href='#L1297'>1297</a>
- <a name='L1298'></a><a href='#L1298'>1298</a>
- <a name='L1299'></a><a href='#L1299'>1299</a>
- <a name='L1300'></a><a href='#L1300'>1300</a>
- <a name='L1301'></a><a href='#L1301'>1301</a>
- <a name='L1302'></a><a href='#L1302'>1302</a>
- <a name='L1303'></a><a href='#L1303'>1303</a>
- <a name='L1304'></a><a href='#L1304'>1304</a>
- <a name='L1305'></a><a href='#L1305'>1305</a>
- <a name='L1306'></a><a href='#L1306'>1306</a>
- <a name='L1307'></a><a href='#L1307'>1307</a>
- <a name='L1308'></a><a href='#L1308'>1308</a>
- <a name='L1309'></a><a href='#L1309'>1309</a>
- <a name='L1310'></a><a href='#L1310'>1310</a>
- <a name='L1311'></a><a href='#L1311'>1311</a>
- <a name='L1312'></a><a href='#L1312'>1312</a>
- <a name='L1313'></a><a href='#L1313'>1313</a>
- <a name='L1314'></a><a href='#L1314'>1314</a>
- <a name='L1315'></a><a href='#L1315'>1315</a>
- <a name='L1316'></a><a href='#L1316'>1316</a>
- <a name='L1317'></a><a href='#L1317'>1317</a>
- <a name='L1318'></a><a href='#L1318'>1318</a>
- <a name='L1319'></a><a href='#L1319'>1319</a>
- <a name='L1320'></a><a href='#L1320'>1320</a>
- <a name='L1321'></a><a href='#L1321'>1321</a>
- <a name='L1322'></a><a href='#L1322'>1322</a>
- <a name='L1323'></a><a href='#L1323'>1323</a>
- <a name='L1324'></a><a href='#L1324'>1324</a>
- <a name='L1325'></a><a href='#L1325'>1325</a>
- <a name='L1326'></a><a href='#L1326'>1326</a>
- <a name='L1327'></a><a href='#L1327'>1327</a>
- <a name='L1328'></a><a href='#L1328'>1328</a>
- <a name='L1329'></a><a href='#L1329'>1329</a>
- <a name='L1330'></a><a href='#L1330'>1330</a>
- <a name='L1331'></a><a href='#L1331'>1331</a>
- <a name='L1332'></a><a href='#L1332'>1332</a>
- <a name='L1333'></a><a href='#L1333'>1333</a>
- <a name='L1334'></a><a href='#L1334'>1334</a>
- <a name='L1335'></a><a href='#L1335'>1335</a>
- <a name='L1336'></a><a href='#L1336'>1336</a>
- <a name='L1337'></a><a href='#L1337'>1337</a>
- <a name='L1338'></a><a href='#L1338'>1338</a>
- <a name='L1339'></a><a href='#L1339'>1339</a>
- <a name='L1340'></a><a href='#L1340'>1340</a>
- <a name='L1341'></a><a href='#L1341'>1341</a>
- <a name='L1342'></a><a href='#L1342'>1342</a>
- <a name='L1343'></a><a href='#L1343'>1343</a>
- <a name='L1344'></a><a href='#L1344'>1344</a>
- <a name='L1345'></a><a href='#L1345'>1345</a>
- <a name='L1346'></a><a href='#L1346'>1346</a>
- <a name='L1347'></a><a href='#L1347'>1347</a>
- <a name='L1348'></a><a href='#L1348'>1348</a>
- <a name='L1349'></a><a href='#L1349'>1349</a>
- <a name='L1350'></a><a href='#L1350'>1350</a>
- <a name='L1351'></a><a href='#L1351'>1351</a>
- <a name='L1352'></a><a href='#L1352'>1352</a>
- <a name='L1353'></a><a href='#L1353'>1353</a>
- <a name='L1354'></a><a href='#L1354'>1354</a>
- <a name='L1355'></a><a href='#L1355'>1355</a>
- <a name='L1356'></a><a href='#L1356'>1356</a>
- <a name='L1357'></a><a href='#L1357'>1357</a>
- <a name='L1358'></a><a href='#L1358'>1358</a>
- <a name='L1359'></a><a href='#L1359'>1359</a>
- <a name='L1360'></a><a href='#L1360'>1360</a>
- <a name='L1361'></a><a href='#L1361'>1361</a>
- <a name='L1362'></a><a href='#L1362'>1362</a>
- <a name='L1363'></a><a href='#L1363'>1363</a>
- <a name='L1364'></a><a href='#L1364'>1364</a>
- <a name='L1365'></a><a href='#L1365'>1365</a>
- <a name='L1366'></a><a href='#L1366'>1366</a>
- <a name='L1367'></a><a href='#L1367'>1367</a>
- <a name='L1368'></a><a href='#L1368'>1368</a>
- <a name='L1369'></a><a href='#L1369'>1369</a>
- <a name='L1370'></a><a href='#L1370'>1370</a>
- <a name='L1371'></a><a href='#L1371'>1371</a>
- <a name='L1372'></a><a href='#L1372'>1372</a>
- <a name='L1373'></a><a href='#L1373'>1373</a>
- <a name='L1374'></a><a href='#L1374'>1374</a>
- <a name='L1375'></a><a href='#L1375'>1375</a>
- <a name='L1376'></a><a href='#L1376'>1376</a>
- <a name='L1377'></a><a href='#L1377'>1377</a>
- <a name='L1378'></a><a href='#L1378'>1378</a>
- <a name='L1379'></a><a href='#L1379'>1379</a>
- <a name='L1380'></a><a href='#L1380'>1380</a>
- <a name='L1381'></a><a href='#L1381'>1381</a>
- <a name='L1382'></a><a href='#L1382'>1382</a>
- <a name='L1383'></a><a href='#L1383'>1383</a>
- <a name='L1384'></a><a href='#L1384'>1384</a>
- <a name='L1385'></a><a href='#L1385'>1385</a>
- <a name='L1386'></a><a href='#L1386'>1386</a>
- <a name='L1387'></a><a href='#L1387'>1387</a>
- <a name='L1388'></a><a href='#L1388'>1388</a>
- <a name='L1389'></a><a href='#L1389'>1389</a>
- <a name='L1390'></a><a href='#L1390'>1390</a>
- <a name='L1391'></a><a href='#L1391'>1391</a>
- <a name='L1392'></a><a href='#L1392'>1392</a>
- <a name='L1393'></a><a href='#L1393'>1393</a>
- <a name='L1394'></a><a href='#L1394'>1394</a>
- <a name='L1395'></a><a href='#L1395'>1395</a>
- <a name='L1396'></a><a href='#L1396'>1396</a>
- <a name='L1397'></a><a href='#L1397'>1397</a>
- <a name='L1398'></a><a href='#L1398'>1398</a>
- <a name='L1399'></a><a href='#L1399'>1399</a>
- <a name='L1400'></a><a href='#L1400'>1400</a>
- <a name='L1401'></a><a href='#L1401'>1401</a>
- <a name='L1402'></a><a href='#L1402'>1402</a>
- <a name='L1403'></a><a href='#L1403'>1403</a>
- <a name='L1404'></a><a href='#L1404'>1404</a>
- <a name='L1405'></a><a href='#L1405'>1405</a>
- <a name='L1406'></a><a href='#L1406'>1406</a>
- <a name='L1407'></a><a href='#L1407'>1407</a>
- <a name='L1408'></a><a href='#L1408'>1408</a>
- <a name='L1409'></a><a href='#L1409'>1409</a>
- <a name='L1410'></a><a href='#L1410'>1410</a>
- <a name='L1411'></a><a href='#L1411'>1411</a>
- <a name='L1412'></a><a href='#L1412'>1412</a>
- <a name='L1413'></a><a href='#L1413'>1413</a>
- <a name='L1414'></a><a href='#L1414'>1414</a>
- <a name='L1415'></a><a href='#L1415'>1415</a>
- <a name='L1416'></a><a href='#L1416'>1416</a>
- <a name='L1417'></a><a href='#L1417'>1417</a>
- <a name='L1418'></a><a href='#L1418'>1418</a>
- <a name='L1419'></a><a href='#L1419'>1419</a>
- <a name='L1420'></a><a href='#L1420'>1420</a>
- <a name='L1421'></a><a href='#L1421'>1421</a>
- <a name='L1422'></a><a href='#L1422'>1422</a>
- <a name='L1423'></a><a href='#L1423'>1423</a>
- <a name='L1424'></a><a href='#L1424'>1424</a>
- <a name='L1425'></a><a href='#L1425'>1425</a>
- <a name='L1426'></a><a href='#L1426'>1426</a>
- <a name='L1427'></a><a href='#L1427'>1427</a>
- <a name='L1428'></a><a href='#L1428'>1428</a>
- <a name='L1429'></a><a href='#L1429'>1429</a>
- <a name='L1430'></a><a href='#L1430'>1430</a>
- <a name='L1431'></a><a href='#L1431'>1431</a>
- <a name='L1432'></a><a href='#L1432'>1432</a>
- <a name='L1433'></a><a href='#L1433'>1433</a>
- <a name='L1434'></a><a href='#L1434'>1434</a>
- <a name='L1435'></a><a href='#L1435'>1435</a>
- <a name='L1436'></a><a href='#L1436'>1436</a>
- <a name='L1437'></a><a href='#L1437'>1437</a>
- <a name='L1438'></a><a href='#L1438'>1438</a>
- <a name='L1439'></a><a href='#L1439'>1439</a>
- <a name='L1440'></a><a href='#L1440'>1440</a>
- <a name='L1441'></a><a href='#L1441'>1441</a>
- <a name='L1442'></a><a href='#L1442'>1442</a>
- <a name='L1443'></a><a href='#L1443'>1443</a>
- <a name='L1444'></a><a href='#L1444'>1444</a>
- <a name='L1445'></a><a href='#L1445'>1445</a>
- <a name='L1446'></a><a href='#L1446'>1446</a>
- <a name='L1447'></a><a href='#L1447'>1447</a>
- <a name='L1448'></a><a href='#L1448'>1448</a>
- <a name='L1449'></a><a href='#L1449'>1449</a>
- <a name='L1450'></a><a href='#L1450'>1450</a>
- <a name='L1451'></a><a href='#L1451'>1451</a>
- <a name='L1452'></a><a href='#L1452'>1452</a>
- <a name='L1453'></a><a href='#L1453'>1453</a>
- <a name='L1454'></a><a href='#L1454'>1454</a>
- <a name='L1455'></a><a href='#L1455'>1455</a>
- <a name='L1456'></a><a href='#L1456'>1456</a>
- <a name='L1457'></a><a href='#L1457'>1457</a>
- <a name='L1458'></a><a href='#L1458'>1458</a>
- <a name='L1459'></a><a href='#L1459'>1459</a>
- <a name='L1460'></a><a href='#L1460'>1460</a>
- <a name='L1461'></a><a href='#L1461'>1461</a>
- <a name='L1462'></a><a href='#L1462'>1462</a>
- <a name='L1463'></a><a href='#L1463'>1463</a>
- <a name='L1464'></a><a href='#L1464'>1464</a>
- <a name='L1465'></a><a href='#L1465'>1465</a>
- <a name='L1466'></a><a href='#L1466'>1466</a>
- <a name='L1467'></a><a href='#L1467'>1467</a>
- <a name='L1468'></a><a href='#L1468'>1468</a>
- <a name='L1469'></a><a href='#L1469'>1469</a>
- <a name='L1470'></a><a href='#L1470'>1470</a>
- <a name='L1471'></a><a href='#L1471'>1471</a>
- <a name='L1472'></a><a href='#L1472'>1472</a>
- <a name='L1473'></a><a href='#L1473'>1473</a>
- <a name='L1474'></a><a href='#L1474'>1474</a>
- <a name='L1475'></a><a href='#L1475'>1475</a>
- <a name='L1476'></a><a href='#L1476'>1476</a>
- <a name='L1477'></a><a href='#L1477'>1477</a>
- <a name='L1478'></a><a href='#L1478'>1478</a>
- <a name='L1479'></a><a href='#L1479'>1479</a>
- <a name='L1480'></a><a href='#L1480'>1480</a>
- <a name='L1481'></a><a href='#L1481'>1481</a>
- <a name='L1482'></a><a href='#L1482'>1482</a>
- <a name='L1483'></a><a href='#L1483'>1483</a>
- <a name='L1484'></a><a href='#L1484'>1484</a>
- <a name='L1485'></a><a href='#L1485'>1485</a>
- <a name='L1486'></a><a href='#L1486'>1486</a>
- <a name='L1487'></a><a href='#L1487'>1487</a>
- <a name='L1488'></a><a href='#L1488'>1488</a>
- <a name='L1489'></a><a href='#L1489'>1489</a>
- <a name='L1490'></a><a href='#L1490'>1490</a>
- <a name='L1491'></a><a href='#L1491'>1491</a>
- <a name='L1492'></a><a href='#L1492'>1492</a>
- <a name='L1493'></a><a href='#L1493'>1493</a>
- <a name='L1494'></a><a href='#L1494'>1494</a>
- <a name='L1495'></a><a href='#L1495'>1495</a>
- <a name='L1496'></a><a href='#L1496'>1496</a>
- <a name='L1497'></a><a href='#L1497'>1497</a>
- <a name='L1498'></a><a href='#L1498'>1498</a>
- <a name='L1499'></a><a href='#L1499'>1499</a>
- <a name='L1500'></a><a href='#L1500'>1500</a>
- <a name='L1501'></a><a href='#L1501'>1501</a>
- <a name='L1502'></a><a href='#L1502'>1502</a>
- <a name='L1503'></a><a href='#L1503'>1503</a>
- <a name='L1504'></a><a href='#L1504'>1504</a>
- <a name='L1505'></a><a href='#L1505'>1505</a>
- <a name='L1506'></a><a href='#L1506'>1506</a>
- <a name='L1507'></a><a href='#L1507'>1507</a>
- <a name='L1508'></a><a href='#L1508'>1508</a>
- <a name='L1509'></a><a href='#L1509'>1509</a>
- <a name='L1510'></a><a href='#L1510'>1510</a>
- <a name='L1511'></a><a href='#L1511'>1511</a>
- <a name='L1512'></a><a href='#L1512'>1512</a>
- <a name='L1513'></a><a href='#L1513'>1513</a>
- <a name='L1514'></a><a href='#L1514'>1514</a>
- <a name='L1515'></a><a href='#L1515'>1515</a>
- <a name='L1516'></a><a href='#L1516'>1516</a>
- <a name='L1517'></a><a href='#L1517'>1517</a>
- <a name='L1518'></a><a href='#L1518'>1518</a>
- <a name='L1519'></a><a href='#L1519'>1519</a>
- <a name='L1520'></a><a href='#L1520'>1520</a>
- <a name='L1521'></a><a href='#L1521'>1521</a>
- <a name='L1522'></a><a href='#L1522'>1522</a>
- <a name='L1523'></a><a href='#L1523'>1523</a>
- <a name='L1524'></a><a href='#L1524'>1524</a>
- <a name='L1525'></a><a href='#L1525'>1525</a>
- <a name='L1526'></a><a href='#L1526'>1526</a>
- <a name='L1527'></a><a href='#L1527'>1527</a>
- <a name='L1528'></a><a href='#L1528'>1528</a>
- <a name='L1529'></a><a href='#L1529'>1529</a>
- <a name='L1530'></a><a href='#L1530'>1530</a>
- <a name='L1531'></a><a href='#L1531'>1531</a>
- <a name='L1532'></a><a href='#L1532'>1532</a>
- <a name='L1533'></a><a href='#L1533'>1533</a>
- <a name='L1534'></a><a href='#L1534'>1534</a>
- <a name='L1535'></a><a href='#L1535'>1535</a>
- <a name='L1536'></a><a href='#L1536'>1536</a>
- <a name='L1537'></a><a href='#L1537'>1537</a>
- <a name='L1538'></a><a href='#L1538'>1538</a>
- <a name='L1539'></a><a href='#L1539'>1539</a>
- <a name='L1540'></a><a href='#L1540'>1540</a>
- <a name='L1541'></a><a href='#L1541'>1541</a>
- <a name='L1542'></a><a href='#L1542'>1542</a>
- <a name='L1543'></a><a href='#L1543'>1543</a>
- <a name='L1544'></a><a href='#L1544'>1544</a>
- <a name='L1545'></a><a href='#L1545'>1545</a>
- <a name='L1546'></a><a href='#L1546'>1546</a>
- <a name='L1547'></a><a href='#L1547'>1547</a>
- <a name='L1548'></a><a href='#L1548'>1548</a>
- <a name='L1549'></a><a href='#L1549'>1549</a>
- <a name='L1550'></a><a href='#L1550'>1550</a>
- <a name='L1551'></a><a href='#L1551'>1551</a>
- <a name='L1552'></a><a href='#L1552'>1552</a>
- <a name='L1553'></a><a href='#L1553'>1553</a>
- <a name='L1554'></a><a href='#L1554'>1554</a>
- <a name='L1555'></a><a href='#L1555'>1555</a>
- <a name='L1556'></a><a href='#L1556'>1556</a>
- <a name='L1557'></a><a href='#L1557'>1557</a>
- <a name='L1558'></a><a href='#L1558'>1558</a>
- <a name='L1559'></a><a href='#L1559'>1559</a>
- <a name='L1560'></a><a href='#L1560'>1560</a>
- <a name='L1561'></a><a href='#L1561'>1561</a>
- <a name='L1562'></a><a href='#L1562'>1562</a>
- <a name='L1563'></a><a href='#L1563'>1563</a>
- <a name='L1564'></a><a href='#L1564'>1564</a>
- <a name='L1565'></a><a href='#L1565'>1565</a>
- <a name='L1566'></a><a href='#L1566'>1566</a>
- <a name='L1567'></a><a href='#L1567'>1567</a>
- <a name='L1568'></a><a href='#L1568'>1568</a>
- <a name='L1569'></a><a href='#L1569'>1569</a>
- <a name='L1570'></a><a href='#L1570'>1570</a>
- <a name='L1571'></a><a href='#L1571'>1571</a>
- <a name='L1572'></a><a href='#L1572'>1572</a>
- <a name='L1573'></a><a href='#L1573'>1573</a>
- <a name='L1574'></a><a href='#L1574'>1574</a>
- <a name='L1575'></a><a href='#L1575'>1575</a>
- <a name='L1576'></a><a href='#L1576'>1576</a>
- <a name='L1577'></a><a href='#L1577'>1577</a>
- <a name='L1578'></a><a href='#L1578'>1578</a>
- <a name='L1579'></a><a href='#L1579'>1579</a>
- <a name='L1580'></a><a href='#L1580'>1580</a>
- <a name='L1581'></a><a href='#L1581'>1581</a>
- <a name='L1582'></a><a href='#L1582'>1582</a>
- <a name='L1583'></a><a href='#L1583'>1583</a>
- <a name='L1584'></a><a href='#L1584'>1584</a>
- <a name='L1585'></a><a href='#L1585'>1585</a>
- <a name='L1586'></a><a href='#L1586'>1586</a>
- <a name='L1587'></a><a href='#L1587'>1587</a>
- <a name='L1588'></a><a href='#L1588'>1588</a>
- <a name='L1589'></a><a href='#L1589'>1589</a>
- <a name='L1590'></a><a href='#L1590'>1590</a>
- <a name='L1591'></a><a href='#L1591'>1591</a>
- <a name='L1592'></a><a href='#L1592'>1592</a>
- <a name='L1593'></a><a href='#L1593'>1593</a>
- <a name='L1594'></a><a href='#L1594'>1594</a>
- <a name='L1595'></a><a href='#L1595'>1595</a>
- <a name='L1596'></a><a href='#L1596'>1596</a>
- <a name='L1597'></a><a href='#L1597'>1597</a>
- <a name='L1598'></a><a href='#L1598'>1598</a>
- <a name='L1599'></a><a href='#L1599'>1599</a>
- <a name='L1600'></a><a href='#L1600'>1600</a>
- <a name='L1601'></a><a href='#L1601'>1601</a>
- <a name='L1602'></a><a href='#L1602'>1602</a>
- <a name='L1603'></a><a href='#L1603'>1603</a>
- <a name='L1604'></a><a href='#L1604'>1604</a>
- <a name='L1605'></a><a href='#L1605'>1605</a>
- <a name='L1606'></a><a href='#L1606'>1606</a>
- <a name='L1607'></a><a href='#L1607'>1607</a>
- <a name='L1608'></a><a href='#L1608'>1608</a>
- <a name='L1609'></a><a href='#L1609'>1609</a>
- <a name='L1610'></a><a href='#L1610'>1610</a>
- <a name='L1611'></a><a href='#L1611'>1611</a>
- <a name='L1612'></a><a href='#L1612'>1612</a>
- <a name='L1613'></a><a href='#L1613'>1613</a>
- <a name='L1614'></a><a href='#L1614'>1614</a>
- <a name='L1615'></a><a href='#L1615'>1615</a>
- <a name='L1616'></a><a href='#L1616'>1616</a>
- <a name='L1617'></a><a href='#L1617'>1617</a>
- <a name='L1618'></a><a href='#L1618'>1618</a>
- <a name='L1619'></a><a href='#L1619'>1619</a>
- <a name='L1620'></a><a href='#L1620'>1620</a>
- <a name='L1621'></a><a href='#L1621'>1621</a>
- <a name='L1622'></a><a href='#L1622'>1622</a>
- <a name='L1623'></a><a href='#L1623'>1623</a>
- <a name='L1624'></a><a href='#L1624'>1624</a>
- <a name='L1625'></a><a href='#L1625'>1625</a>
- <a name='L1626'></a><a href='#L1626'>1626</a>
- <a name='L1627'></a><a href='#L1627'>1627</a>
- <a name='L1628'></a><a href='#L1628'>1628</a>
- <a name='L1629'></a><a href='#L1629'>1629</a>
- <a name='L1630'></a><a href='#L1630'>1630</a>
- <a name='L1631'></a><a href='#L1631'>1631</a>
- <a name='L1632'></a><a href='#L1632'>1632</a>
- <a name='L1633'></a><a href='#L1633'>1633</a>
- <a name='L1634'></a><a href='#L1634'>1634</a>
- <a name='L1635'></a><a href='#L1635'>1635</a>
- <a name='L1636'></a><a href='#L1636'>1636</a>
- <a name='L1637'></a><a href='#L1637'>1637</a>
- <a name='L1638'></a><a href='#L1638'>1638</a>
- <a name='L1639'></a><a href='#L1639'>1639</a>
- <a name='L1640'></a><a href='#L1640'>1640</a>
- <a name='L1641'></a><a href='#L1641'>1641</a>
- <a name='L1642'></a><a href='#L1642'>1642</a>
- <a name='L1643'></a><a href='#L1643'>1643</a>
- <a name='L1644'></a><a href='#L1644'>1644</a>
- <a name='L1645'></a><a href='#L1645'>1645</a>
- <a name='L1646'></a><a href='#L1646'>1646</a>
- <a name='L1647'></a><a href='#L1647'>1647</a>
- <a name='L1648'></a><a href='#L1648'>1648</a>
- <a name='L1649'></a><a href='#L1649'>1649</a>
- <a name='L1650'></a><a href='#L1650'>1650</a>
- <a name='L1651'></a><a href='#L1651'>1651</a>
- <a name='L1652'></a><a href='#L1652'>1652</a>
- <a name='L1653'></a><a href='#L1653'>1653</a>
- <a name='L1654'></a><a href='#L1654'>1654</a>
- <a name='L1655'></a><a href='#L1655'>1655</a>
- <a name='L1656'></a><a href='#L1656'>1656</a>
- <a name='L1657'></a><a href='#L1657'>1657</a>
- <a name='L1658'></a><a href='#L1658'>1658</a>
- <a name='L1659'></a><a href='#L1659'>1659</a>
- <a name='L1660'></a><a href='#L1660'>1660</a>
- <a name='L1661'></a><a href='#L1661'>1661</a>
- <a name='L1662'></a><a href='#L1662'>1662</a>
- <a name='L1663'></a><a href='#L1663'>1663</a>
- <a name='L1664'></a><a href='#L1664'>1664</a>
- <a name='L1665'></a><a href='#L1665'>1665</a>
- <a name='L1666'></a><a href='#L1666'>1666</a>
- <a name='L1667'></a><a href='#L1667'>1667</a>
- <a name='L1668'></a><a href='#L1668'>1668</a>
- <a name='L1669'></a><a href='#L1669'>1669</a>
- <a name='L1670'></a><a href='#L1670'>1670</a>
- <a name='L1671'></a><a href='#L1671'>1671</a>
- <a name='L1672'></a><a href='#L1672'>1672</a>
- <a name='L1673'></a><a href='#L1673'>1673</a>
- <a name='L1674'></a><a href='#L1674'>1674</a>
- <a name='L1675'></a><a href='#L1675'>1675</a>
- <a name='L1676'></a><a href='#L1676'>1676</a>
- <a name='L1677'></a><a href='#L1677'>1677</a>
- <a name='L1678'></a><a href='#L1678'>1678</a>
- <a name='L1679'></a><a href='#L1679'>1679</a>
- <a name='L1680'></a><a href='#L1680'>1680</a>
- <a name='L1681'></a><a href='#L1681'>1681</a>
- <a name='L1682'></a><a href='#L1682'>1682</a>
- <a name='L1683'></a><a href='#L1683'>1683</a>
- <a name='L1684'></a><a href='#L1684'>1684</a>
- <a name='L1685'></a><a href='#L1685'>1685</a>
- <a name='L1686'></a><a href='#L1686'>1686</a>
- <a name='L1687'></a><a href='#L1687'>1687</a>
- <a name='L1688'></a><a href='#L1688'>1688</a>
- <a name='L1689'></a><a href='#L1689'>1689</a>
- <a name='L1690'></a><a href='#L1690'>1690</a>
- <a name='L1691'></a><a href='#L1691'>1691</a>
- <a name='L1692'></a><a href='#L1692'>1692</a>
- <a name='L1693'></a><a href='#L1693'>1693</a>
- <a name='L1694'></a><a href='#L1694'>1694</a>
- <a name='L1695'></a><a href='#L1695'>1695</a>
- <a name='L1696'></a><a href='#L1696'>1696</a>
- <a name='L1697'></a><a href='#L1697'>1697</a>
- <a name='L1698'></a><a href='#L1698'>1698</a>
- <a name='L1699'></a><a href='#L1699'>1699</a>
- <a name='L1700'></a><a href='#L1700'>1700</a>
- <a name='L1701'></a><a href='#L1701'>1701</a>
- <a name='L1702'></a><a href='#L1702'>1702</a>
- <a name='L1703'></a><a href='#L1703'>1703</a>
- <a name='L1704'></a><a href='#L1704'>1704</a>
- <a name='L1705'></a><a href='#L1705'>1705</a>
- <a name='L1706'></a><a href='#L1706'>1706</a>
- <a name='L1707'></a><a href='#L1707'>1707</a>
- <a name='L1708'></a><a href='#L1708'>1708</a>
- <a name='L1709'></a><a href='#L1709'>1709</a>
- <a name='L1710'></a><a href='#L1710'>1710</a>
- <a name='L1711'></a><a href='#L1711'>1711</a>
- <a name='L1712'></a><a href='#L1712'>1712</a>
- <a name='L1713'></a><a href='#L1713'>1713</a>
- <a name='L1714'></a><a href='#L1714'>1714</a>
- <a name='L1715'></a><a href='#L1715'>1715</a>
- <a name='L1716'></a><a href='#L1716'>1716</a>
- <a name='L1717'></a><a href='#L1717'>1717</a>
- <a name='L1718'></a><a href='#L1718'>1718</a>
- <a name='L1719'></a><a href='#L1719'>1719</a>
- <a name='L1720'></a><a href='#L1720'>1720</a>
- <a name='L1721'></a><a href='#L1721'>1721</a>
- <a name='L1722'></a><a href='#L1722'>1722</a>
- <a name='L1723'></a><a href='#L1723'>1723</a>
- <a name='L1724'></a><a href='#L1724'>1724</a>
- <a name='L1725'></a><a href='#L1725'>1725</a>
- <a name='L1726'></a><a href='#L1726'>1726</a>
- <a name='L1727'></a><a href='#L1727'>1727</a>
- <a name='L1728'></a><a href='#L1728'>1728</a>
- <a name='L1729'></a><a href='#L1729'>1729</a>
- <a name='L1730'></a><a href='#L1730'>1730</a>
- <a name='L1731'></a><a href='#L1731'>1731</a>
- <a name='L1732'></a><a href='#L1732'>1732</a>
- <a name='L1733'></a><a href='#L1733'>1733</a>
- <a name='L1734'></a><a href='#L1734'>1734</a>
- <a name='L1735'></a><a href='#L1735'>1735</a>
- <a name='L1736'></a><a href='#L1736'>1736</a>
- <a name='L1737'></a><a href='#L1737'>1737</a>
- <a name='L1738'></a><a href='#L1738'>1738</a>
- <a name='L1739'></a><a href='#L1739'>1739</a>
- <a name='L1740'></a><a href='#L1740'>1740</a>
- <a name='L1741'></a><a href='#L1741'>1741</a>
- <a name='L1742'></a><a href='#L1742'>1742</a>
- <a name='L1743'></a><a href='#L1743'>1743</a>
- <a name='L1744'></a><a href='#L1744'>1744</a>
- <a name='L1745'></a><a href='#L1745'>1745</a>
- <a name='L1746'></a><a href='#L1746'>1746</a>
- <a name='L1747'></a><a href='#L1747'>1747</a>
- <a name='L1748'></a><a href='#L1748'>1748</a>
- <a name='L1749'></a><a href='#L1749'>1749</a>
- <a name='L1750'></a><a href='#L1750'>1750</a>
- <a name='L1751'></a><a href='#L1751'>1751</a>
- <a name='L1752'></a><a href='#L1752'>1752</a>
- <a name='L1753'></a><a href='#L1753'>1753</a>
- <a name='L1754'></a><a href='#L1754'>1754</a>
- <a name='L1755'></a><a href='#L1755'>1755</a>
- <a name='L1756'></a><a href='#L1756'>1756</a>
- <a name='L1757'></a><a href='#L1757'>1757</a>
- <a name='L1758'></a><a href='#L1758'>1758</a>
- <a name='L1759'></a><a href='#L1759'>1759</a>
- <a name='L1760'></a><a href='#L1760'>1760</a>
- <a name='L1761'></a><a href='#L1761'>1761</a>
- <a name='L1762'></a><a href='#L1762'>1762</a>
- <a name='L1763'></a><a href='#L1763'>1763</a>
- <a name='L1764'></a><a href='#L1764'>1764</a>
- <a name='L1765'></a><a href='#L1765'>1765</a>
- <a name='L1766'></a><a href='#L1766'>1766</a>
- <a name='L1767'></a><a href='#L1767'>1767</a>
- <a name='L1768'></a><a href='#L1768'>1768</a>
- <a name='L1769'></a><a href='#L1769'>1769</a>
- <a name='L1770'></a><a href='#L1770'>1770</a>
- <a name='L1771'></a><a href='#L1771'>1771</a>
- <a name='L1772'></a><a href='#L1772'>1772</a>
- <a name='L1773'></a><a href='#L1773'>1773</a>
- <a name='L1774'></a><a href='#L1774'>1774</a>
- <a name='L1775'></a><a href='#L1775'>1775</a>
- <a name='L1776'></a><a href='#L1776'>1776</a>
- <a name='L1777'></a><a href='#L1777'>1777</a>
- <a name='L1778'></a><a href='#L1778'>1778</a>
- <a name='L1779'></a><a href='#L1779'>1779</a>
- <a name='L1780'></a><a href='#L1780'>1780</a>
- <a name='L1781'></a><a href='#L1781'>1781</a>
- <a name='L1782'></a><a href='#L1782'>1782</a>
- <a name='L1783'></a><a href='#L1783'>1783</a>
- <a name='L1784'></a><a href='#L1784'>1784</a>
- <a name='L1785'></a><a href='#L1785'>1785</a>
- <a name='L1786'></a><a href='#L1786'>1786</a>
- <a name='L1787'></a><a href='#L1787'>1787</a>
- <a name='L1788'></a><a href='#L1788'>1788</a>
- <a name='L1789'></a><a href='#L1789'>1789</a>
- <a name='L1790'></a><a href='#L1790'>1790</a>
- <a name='L1791'></a><a href='#L1791'>1791</a>
- <a name='L1792'></a><a href='#L1792'>1792</a>
- <a name='L1793'></a><a href='#L1793'>1793</a>
- <a name='L1794'></a><a href='#L1794'>1794</a>
- <a name='L1795'></a><a href='#L1795'>1795</a>
- <a name='L1796'></a><a href='#L1796'>1796</a>
- <a name='L1797'></a><a href='#L1797'>1797</a>
- <a name='L1798'></a><a href='#L1798'>1798</a>
- <a name='L1799'></a><a href='#L1799'>1799</a>
- <a name='L1800'></a><a href='#L1800'>1800</a>
- <a name='L1801'></a><a href='#L1801'>1801</a>
- <a name='L1802'></a><a href='#L1802'>1802</a>
- <a name='L1803'></a><a href='#L1803'>1803</a>
- <a name='L1804'></a><a href='#L1804'>1804</a>
- <a name='L1805'></a><a href='#L1805'>1805</a>
- <a name='L1806'></a><a href='#L1806'>1806</a>
- <a name='L1807'></a><a href='#L1807'>1807</a>
- <a name='L1808'></a><a href='#L1808'>1808</a>
- <a name='L1809'></a><a href='#L1809'>1809</a>
- <a name='L1810'></a><a href='#L1810'>1810</a>
- <a name='L1811'></a><a href='#L1811'>1811</a>
- <a name='L1812'></a><a href='#L1812'>1812</a>
- <a name='L1813'></a><a href='#L1813'>1813</a>
- <a name='L1814'></a><a href='#L1814'>1814</a>
- <a name='L1815'></a><a href='#L1815'>1815</a>
- <a name='L1816'></a><a href='#L1816'>1816</a>
- <a name='L1817'></a><a href='#L1817'>1817</a>
- <a name='L1818'></a><a href='#L1818'>1818</a>
- <a name='L1819'></a><a href='#L1819'>1819</a>
- <a name='L1820'></a><a href='#L1820'>1820</a>
- <a name='L1821'></a><a href='#L1821'>1821</a>
- <a name='L1822'></a><a href='#L1822'>1822</a>
- <a name='L1823'></a><a href='#L1823'>1823</a>
- <a name='L1824'></a><a href='#L1824'>1824</a>
- <a name='L1825'></a><a href='#L1825'>1825</a>
- <a name='L1826'></a><a href='#L1826'>1826</a>
- <a name='L1827'></a><a href='#L1827'>1827</a>
- <a name='L1828'></a><a href='#L1828'>1828</a>
- <a name='L1829'></a><a href='#L1829'>1829</a>
- <a name='L1830'></a><a href='#L1830'>1830</a>
- <a name='L1831'></a><a href='#L1831'>1831</a>
- <a name='L1832'></a><a href='#L1832'>1832</a>
- <a name='L1833'></a><a href='#L1833'>1833</a>
- <a name='L1834'></a><a href='#L1834'>1834</a>
- <a name='L1835'></a><a href='#L1835'>1835</a>
- <a name='L1836'></a><a href='#L1836'>1836</a>
- <a name='L1837'></a><a href='#L1837'>1837</a>
- <a name='L1838'></a><a href='#L1838'>1838</a>
- <a name='L1839'></a><a href='#L1839'>1839</a>
- <a name='L1840'></a><a href='#L1840'>1840</a>
- <a name='L1841'></a><a href='#L1841'>1841</a>
- <a name='L1842'></a><a href='#L1842'>1842</a>
- <a name='L1843'></a><a href='#L1843'>1843</a>
- <a name='L1844'></a><a href='#L1844'>1844</a>
- <a name='L1845'></a><a href='#L1845'>1845</a>
- <a name='L1846'></a><a href='#L1846'>1846</a>
- <a name='L1847'></a><a href='#L1847'>1847</a>
- <a name='L1848'></a><a href='#L1848'>1848</a>
- <a name='L1849'></a><a href='#L1849'>1849</a>
- <a name='L1850'></a><a href='#L1850'>1850</a>
- <a name='L1851'></a><a href='#L1851'>1851</a>
- <a name='L1852'></a><a href='#L1852'>1852</a>
- <a name='L1853'></a><a href='#L1853'>1853</a>
- <a name='L1854'></a><a href='#L1854'>1854</a>
- <a name='L1855'></a><a href='#L1855'>1855</a>
- <a name='L1856'></a><a href='#L1856'>1856</a>
- <a name='L1857'></a><a href='#L1857'>1857</a>
- <a name='L1858'></a><a href='#L1858'>1858</a>
- <a name='L1859'></a><a href='#L1859'>1859</a>
- <a name='L1860'></a><a href='#L1860'>1860</a>
- <a name='L1861'></a><a href='#L1861'>1861</a>
- <a name='L1862'></a><a href='#L1862'>1862</a>
- <a name='L1863'></a><a href='#L1863'>1863</a>
- <a name='L1864'></a><a href='#L1864'>1864</a>
- <a name='L1865'></a><a href='#L1865'>1865</a>
- <a name='L1866'></a><a href='#L1866'>1866</a>
- <a name='L1867'></a><a href='#L1867'>1867</a>
- <a name='L1868'></a><a href='#L1868'>1868</a>
- <a name='L1869'></a><a href='#L1869'>1869</a>
- <a name='L1870'></a><a href='#L1870'>1870</a>
- <a name='L1871'></a><a href='#L1871'>1871</a>
- <a name='L1872'></a><a href='#L1872'>1872</a>
- <a name='L1873'></a><a href='#L1873'>1873</a>
- <a name='L1874'></a><a href='#L1874'>1874</a>
- <a name='L1875'></a><a href='#L1875'>1875</a>
- <a name='L1876'></a><a href='#L1876'>1876</a>
- <a name='L1877'></a><a href='#L1877'>1877</a>
- <a name='L1878'></a><a href='#L1878'>1878</a>
- <a name='L1879'></a><a href='#L1879'>1879</a>
- <a name='L1880'></a><a href='#L1880'>1880</a>
- <a name='L1881'></a><a href='#L1881'>1881</a>
- <a name='L1882'></a><a href='#L1882'>1882</a>
- <a name='L1883'></a><a href='#L1883'>1883</a>
- <a name='L1884'></a><a href='#L1884'>1884</a>
- <a name='L1885'></a><a href='#L1885'>1885</a>
- <a name='L1886'></a><a href='#L1886'>1886</a>
- <a name='L1887'></a><a href='#L1887'>1887</a>
- <a name='L1888'></a><a href='#L1888'>1888</a>
- <a name='L1889'></a><a href='#L1889'>1889</a>
- <a name='L1890'></a><a href='#L1890'>1890</a>
- <a name='L1891'></a><a href='#L1891'>1891</a>
- <a name='L1892'></a><a href='#L1892'>1892</a>
- <a name='L1893'></a><a href='#L1893'>1893</a>
- <a name='L1894'></a><a href='#L1894'>1894</a>
- <a name='L1895'></a><a href='#L1895'>1895</a>
- <a name='L1896'></a><a href='#L1896'>1896</a>
- <a name='L1897'></a><a href='#L1897'>1897</a>
- <a name='L1898'></a><a href='#L1898'>1898</a>
- <a name='L1899'></a><a href='#L1899'>1899</a>
- <a name='L1900'></a><a href='#L1900'>1900</a>
- <a name='L1901'></a><a href='#L1901'>1901</a>
- <a name='L1902'></a><a href='#L1902'>1902</a>
- <a name='L1903'></a><a href='#L1903'>1903</a>
- <a name='L1904'></a><a href='#L1904'>1904</a>
- <a name='L1905'></a><a href='#L1905'>1905</a>
- <a name='L1906'></a><a href='#L1906'>1906</a>
- <a name='L1907'></a><a href='#L1907'>1907</a>
- <a name='L1908'></a><a href='#L1908'>1908</a>
- <a name='L1909'></a><a href='#L1909'>1909</a>
- <a name='L1910'></a><a href='#L1910'>1910</a>
- <a name='L1911'></a><a href='#L1911'>1911</a>
- <a name='L1912'></a><a href='#L1912'>1912</a>
- <a name='L1913'></a><a href='#L1913'>1913</a>
- <a name='L1914'></a><a href='#L1914'>1914</a>
- <a name='L1915'></a><a href='#L1915'>1915</a>
- <a name='L1916'></a><a href='#L1916'>1916</a>
- <a name='L1917'></a><a href='#L1917'>1917</a>
- <a name='L1918'></a><a href='#L1918'>1918</a>
- <a name='L1919'></a><a href='#L1919'>1919</a>
- <a name='L1920'></a><a href='#L1920'>1920</a>
- <a name='L1921'></a><a href='#L1921'>1921</a>
- <a name='L1922'></a><a href='#L1922'>1922</a>
- <a name='L1923'></a><a href='#L1923'>1923</a>
- <a name='L1924'></a><a href='#L1924'>1924</a>
- <a name='L1925'></a><a href='#L1925'>1925</a>
- <a name='L1926'></a><a href='#L1926'>1926</a>
- <a name='L1927'></a><a href='#L1927'>1927</a>
- <a name='L1928'></a><a href='#L1928'>1928</a>
- <a name='L1929'></a><a href='#L1929'>1929</a>
- <a name='L1930'></a><a href='#L1930'>1930</a>
- <a name='L1931'></a><a href='#L1931'>1931</a>
- <a name='L1932'></a><a href='#L1932'>1932</a>
- <a name='L1933'></a><a href='#L1933'>1933</a>
- <a name='L1934'></a><a href='#L1934'>1934</a>
- <a name='L1935'></a><a href='#L1935'>1935</a>
- <a name='L1936'></a><a href='#L1936'>1936</a>
- <a name='L1937'></a><a href='#L1937'>1937</a>
- <a name='L1938'></a><a href='#L1938'>1938</a>
- <a name='L1939'></a><a href='#L1939'>1939</a>
- <a name='L1940'></a><a href='#L1940'>1940</a>
- <a name='L1941'></a><a href='#L1941'>1941</a>
- <a name='L1942'></a><a href='#L1942'>1942</a>
- <a name='L1943'></a><a href='#L1943'>1943</a>
- <a name='L1944'></a><a href='#L1944'>1944</a>
- <a name='L1945'></a><a href='#L1945'>1945</a>
- <a name='L1946'></a><a href='#L1946'>1946</a>
- <a name='L1947'></a><a href='#L1947'>1947</a>
- <a name='L1948'></a><a href='#L1948'>1948</a>
- <a name='L1949'></a><a href='#L1949'>1949</a>
- <a name='L1950'></a><a href='#L1950'>1950</a>
- <a name='L1951'></a><a href='#L1951'>1951</a>
- <a name='L1952'></a><a href='#L1952'>1952</a>
- <a name='L1953'></a><a href='#L1953'>1953</a>
- <a name='L1954'></a><a href='#L1954'>1954</a>
- <a name='L1955'></a><a href='#L1955'>1955</a>
- <a name='L1956'></a><a href='#L1956'>1956</a>
- <a name='L1957'></a><a href='#L1957'>1957</a>
- <a name='L1958'></a><a href='#L1958'>1958</a>
- <a name='L1959'></a><a href='#L1959'>1959</a>
- <a name='L1960'></a><a href='#L1960'>1960</a>
- <a name='L1961'></a><a href='#L1961'>1961</a>
- <a name='L1962'></a><a href='#L1962'>1962</a>
- <a name='L1963'></a><a href='#L1963'>1963</a>
- <a name='L1964'></a><a href='#L1964'>1964</a>
- <a name='L1965'></a><a href='#L1965'>1965</a>
- <a name='L1966'></a><a href='#L1966'>1966</a>
- <a name='L1967'></a><a href='#L1967'>1967</a>
- <a name='L1968'></a><a href='#L1968'>1968</a>
- <a name='L1969'></a><a href='#L1969'>1969</a>
- <a name='L1970'></a><a href='#L1970'>1970</a>
- <a name='L1971'></a><a href='#L1971'>1971</a>
- <a name='L1972'></a><a href='#L1972'>1972</a>
- <a name='L1973'></a><a href='#L1973'>1973</a>
- <a name='L1974'></a><a href='#L1974'>1974</a>
- <a name='L1975'></a><a href='#L1975'>1975</a>
- <a name='L1976'></a><a href='#L1976'>1976</a>
- <a name='L1977'></a><a href='#L1977'>1977</a>
- <a name='L1978'></a><a href='#L1978'>1978</a>
- <a name='L1979'></a><a href='#L1979'>1979</a>
- <a name='L1980'></a><a href='#L1980'>1980</a>
- <a name='L1981'></a><a href='#L1981'>1981</a>
- <a name='L1982'></a><a href='#L1982'>1982</a>
- <a name='L1983'></a><a href='#L1983'>1983</a>
- <a name='L1984'></a><a href='#L1984'>1984</a>
- <a name='L1985'></a><a href='#L1985'>1985</a>
- <a name='L1986'></a><a href='#L1986'>1986</a>
- <a name='L1987'></a><a href='#L1987'>1987</a>
- <a name='L1988'></a><a href='#L1988'>1988</a>
- <a name='L1989'></a><a href='#L1989'>1989</a>
- <a name='L1990'></a><a href='#L1990'>1990</a>
- <a name='L1991'></a><a href='#L1991'>1991</a>
- <a name='L1992'></a><a href='#L1992'>1992</a>
- <a name='L1993'></a><a href='#L1993'>1993</a>
- <a name='L1994'></a><a href='#L1994'>1994</a>
- <a name='L1995'></a><a href='#L1995'>1995</a>
- <a name='L1996'></a><a href='#L1996'>1996</a>
- <a name='L1997'></a><a href='#L1997'>1997</a>
- <a name='L1998'></a><a href='#L1998'>1998</a>
- <a name='L1999'></a><a href='#L1999'>1999</a>
- <a name='L2000'></a><a href='#L2000'>2000</a>
- <a name='L2001'></a><a href='#L2001'>2001</a>
- <a name='L2002'></a><a href='#L2002'>2002</a>
- <a name='L2003'></a><a href='#L2003'>2003</a>
- <a name='L2004'></a><a href='#L2004'>2004</a>
- <a name='L2005'></a><a href='#L2005'>2005</a>
- <a name='L2006'></a><a href='#L2006'>2006</a>
- <a name='L2007'></a><a href='#L2007'>2007</a>
- <a name='L2008'></a><a href='#L2008'>2008</a>
- <a name='L2009'></a><a href='#L2009'>2009</a>
- <a name='L2010'></a><a href='#L2010'>2010</a>
- <a name='L2011'></a><a href='#L2011'>2011</a>
- <a name='L2012'></a><a href='#L2012'>2012</a>
- <a name='L2013'></a><a href='#L2013'>2013</a>
- <a name='L2014'></a><a href='#L2014'>2014</a>
- <a name='L2015'></a><a href='#L2015'>2015</a>
- <a name='L2016'></a><a href='#L2016'>2016</a>
- <a name='L2017'></a><a href='#L2017'>2017</a>
- <a name='L2018'></a><a href='#L2018'>2018</a>
- <a name='L2019'></a><a href='#L2019'>2019</a>
- <a name='L2020'></a><a href='#L2020'>2020</a>
- <a name='L2021'></a><a href='#L2021'>2021</a>
- <a name='L2022'></a><a href='#L2022'>2022</a>
- <a name='L2023'></a><a href='#L2023'>2023</a>
- <a name='L2024'></a><a href='#L2024'>2024</a>
- <a name='L2025'></a><a href='#L2025'>2025</a>
- <a name='L2026'></a><a href='#L2026'>2026</a>
- <a name='L2027'></a><a href='#L2027'>2027</a>
- <a name='L2028'></a><a href='#L2028'>2028</a>
- <a name='L2029'></a><a href='#L2029'>2029</a>
- <a name='L2030'></a><a href='#L2030'>2030</a>
- <a name='L2031'></a><a href='#L2031'>2031</a>
- <a name='L2032'></a><a href='#L2032'>2032</a>
- <a name='L2033'></a><a href='#L2033'>2033</a>
- <a name='L2034'></a><a href='#L2034'>2034</a>
- <a name='L2035'></a><a href='#L2035'>2035</a>
- <a name='L2036'></a><a href='#L2036'>2036</a>
- <a name='L2037'></a><a href='#L2037'>2037</a>
- <a name='L2038'></a><a href='#L2038'>2038</a>
- <a name='L2039'></a><a href='#L2039'>2039</a>
- <a name='L2040'></a><a href='#L2040'>2040</a>
- <a name='L2041'></a><a href='#L2041'>2041</a>
- <a name='L2042'></a><a href='#L2042'>2042</a>
- <a name='L2043'></a><a href='#L2043'>2043</a>
- <a name='L2044'></a><a href='#L2044'>2044</a>
- <a name='L2045'></a><a href='#L2045'>2045</a>
- <a name='L2046'></a><a href='#L2046'>2046</a>
- <a name='L2047'></a><a href='#L2047'>2047</a>
- <a name='L2048'></a><a href='#L2048'>2048</a>
- <a name='L2049'></a><a href='#L2049'>2049</a>
- <a name='L2050'></a><a href='#L2050'>2050</a>
- <a name='L2051'></a><a href='#L2051'>2051</a>
- <a name='L2052'></a><a href='#L2052'>2052</a>
- <a name='L2053'></a><a href='#L2053'>2053</a>
- <a name='L2054'></a><a href='#L2054'>2054</a>
- <a name='L2055'></a><a href='#L2055'>2055</a>
- <a name='L2056'></a><a href='#L2056'>2056</a>
- <a name='L2057'></a><a href='#L2057'>2057</a>
- <a name='L2058'></a><a href='#L2058'>2058</a>
- <a name='L2059'></a><a href='#L2059'>2059</a>
- <a name='L2060'></a><a href='#L2060'>2060</a>
- <a name='L2061'></a><a href='#L2061'>2061</a>
- <a name='L2062'></a><a href='#L2062'>2062</a>
- <a name='L2063'></a><a href='#L2063'>2063</a>
- <a name='L2064'></a><a href='#L2064'>2064</a>
- <a name='L2065'></a><a href='#L2065'>2065</a>
- <a name='L2066'></a><a href='#L2066'>2066</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span>
- <span class="cline-any cline-no"> </span>
- <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import { useState, useEffect, useMemo, useRef } from 'react';</span></span></span>
- import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
- import { useTheme } from '../contexts/ThemeContext';
- import {
- Plus,
- Link,
- Unlink,
- Signal,
- Thermometer,
- Clock,
- MoreVertical,
- Trash2,
- RefreshCw,
- Box,
- HardDrive,
- AlertTriangle,
- Terminal,
- Power,
- PowerOff,
- Zap,
- Wrench,
- ChevronDown,
- Pencil,
- ArrowUp,
- ArrowDown,
- LayoutGrid,
- LayoutList,
- Layers,
- Video,
- } from 'lucide-react';
- import { useNavigate } from 'react-router-dom';
- import { api } from '../api/client';
- import type { Printer, PrinterCreate, AMSUnit } from '../api/client';
- import { Card, CardContent } from '../components/Card';
- import { Button } from '../components/Button';
- import { ConfirmModal } from '../components/ConfirmModal';
- import { FileManagerModal } from '../components/FileManagerModal';
- import { MQTTDebugModal } from '../components/MQTTDebugModal';
- import { HMSErrorModal } from '../components/HMSErrorModal';
- import { PrinterQueueWidget } from '../components/PrinterQueueWidget';
- import { AMSHistoryModal } from '../components/AMSHistoryModal';
-
- // Nozzle side indicators (Bambu Lab style - square badge with L/R)
- <span class="cstat-no" title="statement not covered" >function NozzleBadge({ side }: { side: 'L' | 'R' }) {</span>
- <span class="cstat-no" title="statement not covered" > const { theme } = useTheme();</span>
- // Light theme: #e7f5e9 (light green), Dark theme: #1a4d2e (dark green)
- <span class="cstat-no" title="statement not covered" > const bgColor = theme === 'dark' ? '#1a4d2e' : '#e7f5e9';</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className="inline-flex items-center justify-center w-4 h-4 text-[10px] font-bold rounded"</span>
- <span class="cstat-no" title="statement not covered" > style={{ backgroundColor: bgColor, color: '#00ae42' }}</span>
- >
- <span class="cstat-no" title="statement not covered" > {side}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // AMS 4-tray device icon with fillable colored spool slots (Bambu Studio style)
- interface AMS4TrayIconProps {
- colors: (string | null)[]; // Array of 4 colors (hex) or null for empty
- className?: string;
- }
-
- <span class="cstat-no" title="statement not covered" >function AMS4TrayIcon({ colors, className }: AMS4TrayIconProps) {</span>
- // Spool positions: x start, centered at 12.5, 21.5, 30.5, 39.5
- // Each spool slot is 6 units wide (from 9.5-15.5, 18.5-24.5, etc.)
- <span class="cstat-no" title="statement not covered" > const spoolSlots = [</span>
- <span class="cstat-no" title="statement not covered" > { x: 9.5, cx: 12.5 },</span>
- <span class="cstat-no" title="statement not covered" > { x: 18.5, cx: 21.5 },</span>
- <span class="cstat-no" title="statement not covered" > { x: 27.5, cx: 30.5 },</span>
- <span class="cstat-no" title="statement not covered" > { x: 36.5, cx: 39.5 },</span>
- <span class="cstat-no" title="statement not covered" > ];</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} width="56" height="34" viewBox="0 0 52 32" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- {/* Outer casing with window */}
- <span class="cstat-no" title="statement not covered" > <path</span>
- <span class="cstat-no" title="statement not covered" > fillRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > clipRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > d="M4 0C1.79086 0 0 1.79086 0 4V28C0 30.2091 1.79086 32 4 32H48C50.2091 32 52 30.2091 52 28V4C52 1.79086 50.2091 0 48 0H4ZM44 8H8V24H44V8Z"</span>
- <span class="cstat-no" title="statement not covered" > fill="#2F2E33"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- {/* Spool color fills - rectangles that fill the visible window area */}
- <span class="cstat-no" title="statement not covered" > {spoolSlots.map((slot, i) => (</span>
- <span class="cstat-no" title="statement not covered" > colors[i] ? (</span>
- <span class="cstat-no" title="statement not covered" > <rect key={i} x={slot.x} y="8" width="6" height="16" fill={colors[i]!} /></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <g key={i}></span>
- <span class="cstat-no" title="statement not covered" > <rect x={slot.x} y="8" width="6" height="16" fill="#ffffff" /></span>
- <span class="cstat-no" title="statement not covered" > <line x1={slot.x} y1="8" x2={slot.x + 6} y2="24" stroke="#555555" strokeWidth="1.5" /></span>
- <span class="cstat-no" title="statement not covered" > </g></span>
- )
- <span class="cstat-no" title="statement not covered" > ))}</span>
- {/* Bottom half overlay (spool holders - creates rounded bottom edges) */}
- <span class="cstat-no" title="statement not covered" > <path</span>
- <span class="cstat-no" title="statement not covered" > fillRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > clipRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > d="M36.5 16H33.5V18.2617C33.5 19.9186 32.1569 21.2617 30.5 21.2617C28.8431 21.2617 27.5 19.9186 27.5 18.2617V16H24.5V18.2617C24.5 19.9186 23.1569 21.2617 21.5 21.2617C19.8431 21.2617 18.5 19.9186 18.5 18.2617V16H15.5V18.2617C15.5 19.9186 14.1569 21.2617 12.5 21.2617C10.8432 21.2617 9.5 19.9186 9.5 18.2617V16H4V28H48V16H42.5V18.2617C42.5 19.9186 41.1569 21.2617 39.5 21.2617C37.8431 21.2617 36.5 19.9186 36.5 18.2617V16Z"</span>
- <span class="cstat-no" title="statement not covered" > fill="#767676"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- {/* Top half overlay (spool tops - creates rounded top edges) */}
- <span class="cstat-no" title="statement not covered" > <path</span>
- <span class="cstat-no" title="statement not covered" > fillRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > clipRule="evenodd"</span>
- <span class="cstat-no" title="statement not covered" > d="M6 9.18382C6 6.32088 8.32088 4 11.1838 4H40.8162C43.6791 4 46 6.32088 46 9.18382V16H42.5V12.2617C42.5 10.6049 41.1569 9.26172 39.5 9.26172C37.8431 9.26172 36.5 10.6049 36.5 12.2617V16H33.5V12.2617C33.5 10.6049 32.1569 9.26172 30.5 9.26172C28.8431 9.26172 27.5 10.6049 27.5 12.2617V16H24.5V12.2617C24.5 10.6049 23.1569 9.26172 21.5 9.26172C19.8431 9.26172 18.5 10.6049 18.5 12.2617V16H15.5V12.2617C15.5 10.6049 14.1569 9.26172 12.5 9.26172C10.8432 9.26172 9.5 10.6049 9.5 12.2617V16H6V9.18382Z"</span>
- <span class="cstat-no" title="statement not covered" > fill="#BFBFBF"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // AMS 1-tray device icon (AMS-HT) with fillable colored slot (Bambu Studio style)
- interface AMS1TrayIconProps {
- color: string | null; // Hex color or null for empty
- className?: string;
- }
-
- <span class="cstat-no" title="statement not covered" >function AMS1TrayIcon({ color, className }: AMS1TrayIconProps) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} width="56" height="56" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- {/* Filament color fill */}
- <span class="cstat-no" title="statement not covered" > {color ? (</span>
- <span class="cstat-no" title="statement not covered" > <rect x="8.3" y="5.2" width="3.8" height="5.1" fill={color} rx="0.3"/></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <g></span>
- <span class="cstat-no" title="statement not covered" > <rect x="8.3" y="5.2" width="3.8" height="5.1" fill="#ffffff" rx="0.3"/></span>
- <span class="cstat-no" title="statement not covered" > <line x1="8.3" y1="5.2" x2="12.1" y2="10.3" stroke="#555555" strokeWidth="0.8" /></span>
- <span class="cstat-no" title="statement not covered" > </g></span>
- )}
- {/* Device outline - top housing */}
- <span class="cstat-no" title="statement not covered" > <path d="M5.88312 4.68555C5.88312 4.13326 6.33083 3.68555 6.88312 3.68555H13.5059C14.0582 3.68555 14.5059 4.13326 14.5059 4.68555V10.3887H5.88312V4.68555Z" stroke="#6B6B6B"/></span>
- {/* Bottom base */}
- <span class="cstat-no" title="statement not covered" > <rect x="3.8725" y="10.3887" width="12.7037" height="7.55371" rx="1.2" stroke="#6B6B6B"/></span>
- {/* Inner tray outline */}
- <span class="cstat-no" title="statement not covered" > <path d="M8.21991 5.65234C8.21991 5.3762 8.44377 5.15234 8.71991 5.15234H11.7288C12.005 5.15234 12.2288 5.3762 12.2288 5.65234V10.3887H8.21991V5.65234Z" stroke="#6B6B6B"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Water drop SVG - empty outline (Bambu Lab style from bambu-humidity)
- <span class="cstat-no" title="statement not covered" >function WaterDropEmpty({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 36 54" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <path d="M17.8131 0.00538C18.4463 -0.15091 20.3648 3.14642 20.8264 3.84781C25.4187 10.816 35.3089 26.9368 35.9383 34.8694C37.4182 53.5822 11.882 61.3357 2.53721 45.3789C-1.73471 38.0791 0.016 32.2049 3.178 25.0232C6.99221 16.3662 12.6411 7.90372 17.8131 0.00538ZM18.3738 7.24807L17.5881 7.48441C14.4452 12.9431 10.917 18.2341 8.19369 23.9368C4.6808 31.29 1.18317 38.5479 7.69403 45.5657C17.3058 55.9228 34.9847 46.8808 31.4604 32.8681C29.2558 24.0969 22.4207 15.2913 18.3776 7.24807H18.3738Z" fill="#C3C2C1"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Water drop SVG - half filled with blue water (Bambu Lab style from bambu-humidity)
- <span class="cstat-no" title="statement not covered" >function WaterDropHalf({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 35 53" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <path d="M17.3165 0.0038C17.932 -0.14959 19.7971 3.08645 20.2458 3.77481C24.7103 10.6135 34.3251 26.4346 34.937 34.2198C36.3757 52.5848 11.5505 60.1942 2.46584 44.534C-1.68714 37.3735 0.0148 31.6085 3.08879 24.5603C6.79681 16.0605 12.2884 7.75907 17.3165 0.0038ZM17.8615 7.11561L17.0977 7.34755C14.0423 12.7048 10.6124 17.8974 7.96483 23.4941C4.54975 30.7107 1.14949 37.8337 7.47908 44.721C16.8233 54.8856 34.01 46.0117 30.5838 32.2595C28.4405 23.6512 21.7957 15.0093 17.8652 7.11561H17.8615Z" fill="#C3C2C1"/></span>
- <span class="cstat-no" title="statement not covered" > <path d="M5.03547 30.112C9.64453 30.4936 11.632 35.7985 16.4154 35.791C19.6339 35.7873 20.2161 33.2283 22.3853 31.6197C31.6776 24.7286 33.5835 37.4894 27.9881 44.4254C18.1878 56.5653 -1.16063 44.6013 5.03917 30.1158L5.03547 30.112Z" fill="#1F8FEB"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Water drop SVG - fully filled with blue water (Bambu Lab style from bambu-humidity)
- <span class="cstat-no" title="statement not covered" >function WaterDropFull({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 36 54" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <path d="M17.9625 4.48059L4.77216 26.3154L2.08228 40.2175L10.0224 50.8414H23.1594L33.3246 42.1693V30.2455L17.9625 4.48059Z" fill="#1F8FEB"/></span>
- <span class="cstat-no" title="statement not covered" > <path d="M17.7948 0.00538C18.4273 -0.15091 20.3438 3.14642 20.8048 3.84781C25.3921 10.816 35.2715 26.9368 35.9001 34.8694C37.3784 53.5822 11.8702 61.3357 2.53562 45.3789C-1.73163 38.0829 0.0134 32.2087 3.1757 25.027C6.98574 16.3662 12.6284 7.90372 17.7948 0.00538ZM18.3549 7.24807L17.57 7.48441C14.4306 12.9431 10.9063 18.2341 8.1859 23.9368C4.67686 31.29 1.18305 38.5479 7.68679 45.5657C17.2881 55.9228 34.9476 46.8808 31.4271 32.8681C29.2249 24.0969 22.3974 15.2913 18.3587 7.24807H18.3549Z" fill="#C3C2C1"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Thermometer SVG - empty outline
- <span class="cstat-no" title="statement not covered" >function ThermometerEmpty({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/></span>
- <span class="cstat-no" title="statement not covered" > <circle cx="6" cy="15" r="2.5" stroke="#C3C2C1" strokeWidth="1" fill="none"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Thermometer SVG - half filled (gold - same as humidity fair)
- <span class="cstat-no" title="statement not covered" >function ThermometerHalf({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <rect x="4.5" y="8" width="3" height="4.5" fill="#d4a017" rx="0.5"/></span>
- <span class="cstat-no" title="statement not covered" > <circle cx="6" cy="15" r="2" fill="#d4a017"/></span>
- <span class="cstat-no" title="statement not covered" > <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Thermometer SVG - fully filled (red - same as humidity bad)
- <span class="cstat-no" title="statement not covered" >function ThermometerFull({ className }: { className?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <svg className={className} viewBox="0 0 12 20" fill="none" xmlns="http://www.w3.org/2000/svg"></span>
- <span class="cstat-no" title="statement not covered" > <rect x="4.5" y="3" width="3" height="9.5" fill="#c62828" rx="0.5"/></span>
- <span class="cstat-no" title="statement not covered" > <circle cx="6" cy="15" r="2" fill="#c62828"/></span>
- <span class="cstat-no" title="statement not covered" > <path d="M6 0.5C4.6 0.5 3.5 1.6 3.5 3V12.1C2.6 12.8 2 13.9 2 15C2 17.2 3.8 19 6 19C8.2 19 10 17.2 10 15C10 13.9 9.4 12.8 8.5 12.1V3C8.5 1.6 7.4 0.5 6 0.5Z" stroke="#C3C2C1" strokeWidth="1" fill="none"/></span>
- <span class="cstat-no" title="statement not covered" > </svg></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Humidity indicator with water drop that fills based on level (Bambu Lab style)
- // Reference: https://github.com/theicedmango/bambu-humidity
- interface HumidityIndicatorProps {
- humidity: number | string;
- goodThreshold?: number; // <= this is green
- fairThreshold?: number; // <= this is orange, > is red
- onClick?: () => void;
- }
-
- <span class="cstat-no" title="statement not covered" >function HumidityIndicator({ humidity, goodThreshold = 40, fairThreshold = 60, onClick }: HumidityIndicatorProps) {</span>
- <span class="cstat-no" title="statement not covered" > const humidityValue = typeof humidity === 'string' ? parseInt(humidity, 10) : humidity;</span>
- <span class="cstat-no" title="statement not covered" > const good = typeof goodThreshold === 'number' ? goodThreshold : 40;</span>
- <span class="cstat-no" title="statement not covered" > const fair = typeof fairThreshold === 'number' ? fairThreshold : 60;</span>
-
- // Status thresholds (configurable via settings)
- // Good: ≤goodThreshold (green #22a352), Fair: ≤fairThreshold (gold #d4a017), Bad: >fairThreshold (red #c62828)
- <span class="cstat-no" title="statement not covered" > let textColor: string;</span>
- <span class="cstat-no" title="statement not covered" > let statusText: string;</span>
-
- <span class="cstat-no" title="statement not covered" > if (isNaN(humidityValue)) {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#C3C2C1';</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Unknown';</span>
- <span class="cstat-no" title="statement not covered" > } else if (humidityValue <= good) {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#22a352'; // Green - Good</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Good';</span>
- <span class="cstat-no" title="statement not covered" > } else if (humidityValue <= fair) {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#d4a017'; // Gold - Fair</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Fair';</span>
- <span class="cstat-no" title="statement not covered" > } else {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#c62828'; // Red - Bad</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Bad';</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- // Fill level based on status: Good=Empty (dry), Fair=Half, Bad=Full (wet)
- <span class="cstat-no" title="statement not covered" > let DropComponent: React.FC<{ className?: string }>;</span>
- <span class="cstat-no" title="statement not covered" > if (isNaN(humidityValue)) {</span>
- <span class="cstat-no" title="statement not covered" > DropComponent = WaterDropEmpty;</span>
- <span class="cstat-no" title="statement not covered" > } else if (humidityValue <= good) {</span>
- <span class="cstat-no" title="statement not covered" > DropComponent = WaterDropEmpty; // Good - empty drop (dry)</span>
- <span class="cstat-no" title="statement not covered" > } else if (humidityValue <= fair) {</span>
- <span class="cstat-no" title="statement not covered" > DropComponent = WaterDropHalf; // Fair - half filled</span>
- <span class="cstat-no" title="statement not covered" > } else {</span>
- <span class="cstat-no" title="statement not covered" > DropComponent = WaterDropFull; // Bad - full (too humid)</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > type="button"</span>
- <span class="cstat-no" title="statement not covered" > onClick={onClick}</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center justify-end gap-1 ${onClick ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''}`}</span>
- <span class="cstat-no" title="statement not covered" > title={`Humidity: ${humidityValue}% - ${statusText}${onClick ? ' (click for history)' : ''}`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <DropComponent className="w-3 h-4" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-xs font-medium tabular-nums w-8 text-right" style={{ color: textColor }}>{humidityValue}%</span></span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Temperature indicator with dynamic icon and coloring
- interface TemperatureIndicatorProps {
- temp: number;
- goodThreshold?: number; // <= this is blue
- fairThreshold?: number; // <= this is orange, > is red
- onClick?: () => void;
- }
-
- <span class="cstat-no" title="statement not covered" >function TemperatureIndicator({ temp, goodThreshold = 28, fairThreshold = 35, onClick }: TemperatureIndicatorProps) {</span>
- // Ensure thresholds are numbers
- <span class="cstat-no" title="statement not covered" > const good = typeof goodThreshold === 'number' ? goodThreshold : 28;</span>
- <span class="cstat-no" title="statement not covered" > const fair = typeof fairThreshold === 'number' ? fairThreshold : 35;</span>
-
- <span class="cstat-no" title="statement not covered" > let textColor: string;</span>
- <span class="cstat-no" title="statement not covered" > let statusText: string;</span>
- <span class="cstat-no" title="statement not covered" > let ThermoComponent: React.FC<{ className?: string }>;</span>
-
- <span class="cstat-no" title="statement not covered" > if (temp <= good) {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#22a352'; // Green - good (same as humidity)</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Good';</span>
- <span class="cstat-no" title="statement not covered" > ThermoComponent = ThermometerEmpty;</span>
- <span class="cstat-no" title="statement not covered" > } else if (temp <= fair) {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#d4a017'; // Gold - fair (same as humidity)</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Fair';</span>
- <span class="cstat-no" title="statement not covered" > ThermoComponent = ThermometerHalf;</span>
- <span class="cstat-no" title="statement not covered" > } else {</span>
- <span class="cstat-no" title="statement not covered" > textColor = '#c62828'; // Red - bad (same as humidity)</span>
- <span class="cstat-no" title="statement not covered" > statusText = 'Bad';</span>
- <span class="cstat-no" title="statement not covered" > ThermoComponent = ThermometerFull;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > type="button"</span>
- <span class="cstat-no" title="statement not covered" > onClick={onClick}</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center gap-1 ${onClick ? 'cursor-pointer hover:opacity-80 transition-opacity' : ''}`}</span>
- <span class="cstat-no" title="statement not covered" > title={`Temperature: ${temp}°C - ${statusText}${onClick ? ' (click for history)' : ''}`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <ThermoComponent className="w-3 h-4" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="tabular-nums w-12 text-right" style={{ color: textColor }}>{temp}°C</span></span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Get AMS label: AMS-A/B/C/D for regular AMS, HT-A/B for AMS-HT (single spool)
- // Always use tray count as the source of truth (1 tray = AMS-HT, 4 trays = regular AMS)
- // AMS-HT uses IDs 128+ while regular AMS uses 0-3
- <span class="cstat-no" title="statement not covered" >function getAmsLabel(amsId: number | string, trayCount: number): string {</span>
- // Ensure amsId is a number (backend might send string)
- <span class="cstat-no" title="statement not covered" > const id = typeof amsId === 'string' ? parseInt(amsId, 10) : amsId;</span>
- <span class="cstat-no" title="statement not covered" > const safeId = isNaN(id) ? 0 : id;</span>
- <span class="cstat-no" title="statement not covered" > const isHt = trayCount === 1;</span>
- // AMS-HT uses IDs starting at 128, regular AMS uses 0-3
- <span class="cstat-no" title="statement not covered" > const normalizedId = safeId >= 128 ? safeId - 128 : safeId;</span>
- <span class="cstat-no" title="statement not covered" > const letter = String.fromCharCode(65 + normalizedId); // 0=A, 1=B, 2=C, 3=D</span>
- <span class="cstat-no" title="statement not covered" > return isHt ? `HT-${letter}` : `AMS-${letter}`;</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function formatTime(seconds: number): string {</span>
- <span class="cstat-no" title="statement not covered" > const hours = Math.floor(seconds / 3600);</span>
- <span class="cstat-no" title="statement not covered" > const minutes = Math.floor((seconds % 3600) / 60);</span>
- <span class="cstat-no" title="statement not covered" > return hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function formatETA(remainingMinutes: number): string {</span>
- <span class="cstat-no" title="statement not covered" > const now = new Date();</span>
- <span class="cstat-no" title="statement not covered" > const eta = new Date(now.getTime() + remainingMinutes * 60 * 1000);</span>
- <span class="cstat-no" title="statement not covered" > const today = new Date();</span>
- <span class="cstat-no" title="statement not covered" > today.setHours(0, 0, 0, 0);</span>
- <span class="cstat-no" title="statement not covered" > const etaDay = new Date(eta);</span>
- <span class="cstat-no" title="statement not covered" > etaDay.setHours(0, 0, 0, 0);</span>
-
- <span class="cstat-no" title="statement not covered" > const timeStr = eta.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });</span>
-
- // Check if it's tomorrow or later
- <span class="cstat-no" title="statement not covered" > const dayDiff = Math.floor((etaDay.getTime() - today.getTime()) / (1000 * 60 * 60 * 24));</span>
- <span class="cstat-no" title="statement not covered" > if (dayDiff === 0) {</span>
- <span class="cstat-no" title="statement not covered" > return timeStr;</span>
- <span class="cstat-no" title="statement not covered" > } else if (dayDiff === 1) {</span>
- <span class="cstat-no" title="statement not covered" > return `Tomorrow ${timeStr}`;</span>
- <span class="cstat-no" title="statement not covered" > } else {</span>
- <span class="cstat-no" title="statement not covered" > return eta.toLocaleDateString([], { weekday: 'short' }) + ' ' + timeStr;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function getPrinterImage(model: string | null | undefined): string {</span>
- <span class="cstat-no" title="statement not covered" > if (!model) return '/img/printers/default.png';</span>
-
- <span class="cstat-no" title="statement not covered" > const modelLower = model.toLowerCase().replace(/\s+/g, '');</span>
-
- // Map model names to image files
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('x1e')) return '/img/printers/x1e.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('x1c') || modelLower.includes('x1carbon')) return '/img/printers/x1c.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('x1')) return '/img/printers/x1c.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('h2d')) return '/img/printers/h2d.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('h2c') || modelLower.includes('h2s')) return '/img/printers/h2d.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('p2s')) return '/img/printers/p1s.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('p1s')) return '/img/printers/p1s.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('p1p')) return '/img/printers/p1p.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('a1mini')) return '/img/printers/a1mini.png';</span>
- <span class="cstat-no" title="statement not covered" > if (modelLower.includes('a1')) return '/img/printers/a1.png';</span>
-
- <span class="cstat-no" title="statement not covered" > return '/img/printers/default.png';</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function getWifiStrength(rssi: number | null | undefined): { label: string; color: string; bars: number } {</span>
- <span class="cstat-no" title="statement not covered" > if (rssi == null) return { label: '', color: 'text-bambu-gray', bars: 0 };</span>
- <span class="cstat-no" title="statement not covered" > if (rssi >= -50) return { label: 'Excellent', color: 'text-bambu-green', bars: 4 };</span>
- <span class="cstat-no" title="statement not covered" > if (rssi >= -60) return { label: 'Good', color: 'text-bambu-green', bars: 3 };</span>
- <span class="cstat-no" title="statement not covered" > if (rssi >= -70) return { label: 'Fair', color: 'text-yellow-400', bars: 2 };</span>
- <span class="cstat-no" title="statement not covered" > if (rssi >= -80) return { label: 'Weak', color: 'text-orange-400', bars: 1 };</span>
- <span class="cstat-no" title="statement not covered" > return { label: 'Very weak', color: 'text-red-400', bars: 1 };</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function CoverImage({ url, printName }: { url: string | null; printName?: string }) {</span>
- <span class="cstat-no" title="statement not covered" > const [loaded, setLoaded] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [error, setError] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showOverlay, setShowOverlay] = useState(false);</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className={`w-20 h-20 flex-shrink-0 rounded-lg overflow-hidden bg-bambu-dark-tertiary flex items-center justify-center ${url && loaded ? 'cursor-pointer' : ''}`}</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => url && loaded && setShowOverlay(true)}</span>
- >
- <span class="cstat-no" title="statement not covered" > {url && !error ? (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <img</span>
- <span class="cstat-no" title="statement not covered" > src={url}</span>
- <span class="cstat-no" title="statement not covered" > alt="Print preview"</span>
- <span class="cstat-no" title="statement not covered" > className={`w-full h-full object-cover ${loaded ? 'block' : 'hidden'}`}</span>
- <span class="cstat-no" title="statement not covered" > onLoad={() => setLoaded(true)}</span>
- <span class="cstat-no" title="statement not covered" > onError={() => setError(true)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > {!loaded && <Box className="w-8 h-8 text-bambu-gray" />}</span>
- <span class="cstat-no" title="statement not covered" > </></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <Box className="w-8 h-8 text-bambu-gray" /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Cover Image Overlay */}
- <span class="cstat-no" title="statement not covered" > {showOverlay && url && (</span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="fixed inset-0 bg-black/80 flex items-center justify-center z-50 p-8"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowOverlay(false)}</span>
- >
- <span class="cstat-no" title="statement not covered" > <div className="relative max-w-2xl max-h-full"></span>
- <span class="cstat-no" title="statement not covered" > <img</span>
- <span class="cstat-no" title="statement not covered" > src={url}</span>
- <span class="cstat-no" title="statement not covered" > alt="Print preview"</span>
- <span class="cstat-no" title="statement not covered" > className="max-w-full max-h-[80vh] rounded-lg shadow-2xl"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > {printName && (</span>
- <span class="cstat-no" title="statement not covered" > <p className="text-white text-center mt-4 text-lg">{printName}</p></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- interface PrinterMaintenanceInfo {
- due_count: number;
- warning_count: number;
- total_print_hours: number;
- }
-
- // Status summary bar component - uses queryClient to read cached statuses
- <span class="cstat-no" title="statement not covered" >function StatusSummaryBar({ printers }: { printers: Printer[] | undefined }) {</span>
- <span class="cstat-no" title="statement not covered" > const queryClient = useQueryClient();</span>
-
- <span class="cstat-no" title="statement not covered" > const counts = useMemo(() => {</span>
- <span class="cstat-no" title="statement not covered" > let printing = 0;</span>
- <span class="cstat-no" title="statement not covered" > let idle = 0;</span>
- <span class="cstat-no" title="statement not covered" > let offline = 0;</span>
- <span class="cstat-no" title="statement not covered" > let loading = 0;</span>
-
- <span class="cstat-no" title="statement not covered" > printers?.forEach((printer) => {</span>
- <span class="cstat-no" title="statement not covered" > const status = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', printer.id]);</span>
- <span class="cstat-no" title="statement not covered" > if (status === undefined) {</span>
- // Status not yet loaded - don't count as offline yet
- <span class="cstat-no" title="statement not covered" > loading++;</span>
- <span class="cstat-no" title="statement not covered" > } else if (!status.connected) {</span>
- <span class="cstat-no" title="statement not covered" > offline++;</span>
- <span class="cstat-no" title="statement not covered" > } else if (status.state === 'RUNNING') {</span>
- <span class="cstat-no" title="statement not covered" > printing++;</span>
- <span class="cstat-no" title="statement not covered" > } else {</span>
- <span class="cstat-no" title="statement not covered" > idle++;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > return { printing, idle, offline, loading, total: (printers?.length || 0) };</span>
- <span class="cstat-no" title="statement not covered" > }, [printers, queryClient]);</span>
-
- // Subscribe to query cache changes to re-render when status updates
- <span class="cstat-no" title="statement not covered" > const [, setTick] = useState(0);</span>
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > const unsubscribe = queryClient.getQueryCache().subscribe(() => {</span>
- <span class="cstat-no" title="statement not covered" > setTick(t => t + 1);</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > return () => unsubscribe();</span>
- <span class="cstat-no" title="statement not covered" > }, [queryClient]);</span>
-
- <span class="cstat-no" title="statement not covered" > if (!printers?.length) return null;</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-4 text-sm"></span>
- <span class="cstat-no" title="statement not covered" > {counts.printing > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1.5"></span>
- <span class="cstat-no" title="statement not covered" > <div className="w-2 h-2 rounded-full bg-bambu-green animate-pulse" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-white font-medium">{counts.printing}</span> printing</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > {counts.idle > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1.5"></span>
- <span class="cstat-no" title="statement not covered" > <div className="w-2 h-2 rounded-full bg-blue-400" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-white font-medium">{counts.idle}</span> idle</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > {counts.offline > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1.5"></span>
- <span class="cstat-no" title="statement not covered" > <div className="w-2 h-2 rounded-full bg-gray-400" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-white font-medium">{counts.offline}</span> offline</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- type SortOption = 'name' | 'status' | 'model' | 'location';
- type ViewMode = 'expanded' | 'compact';
-
- <span class="cstat-no" title="statement not covered" >function PrinterCard({</span>
- <span class="cstat-no" title="statement not covered" > printer,</span>
- <span class="cstat-no" title="statement not covered" > hideIfDisconnected,</span>
- <span class="cstat-no" title="statement not covered" > maintenanceInfo,</span>
- <span class="cstat-no" title="statement not covered" > viewMode = 'expanded',</span>
- <span class="cstat-no" title="statement not covered" > amsThresholds,</span>
- <span class="cstat-no" title="statement not covered" >}: {</span>
- printer: Printer;
- hideIfDisconnected?: boolean;
- maintenanceInfo?: PrinterMaintenanceInfo;
- viewMode?: ViewMode;
- amsThresholds?: {
- humidityGood: number;
- humidityFair: number;
- tempGood: number;
- tempFair: number;
- };
- <span class="cstat-no" title="statement not covered" >}) {</span>
- <span class="cstat-no" title="statement not covered" > const queryClient = useQueryClient();</span>
- <span class="cstat-no" title="statement not covered" > const navigate = useNavigate();</span>
- <span class="cstat-no" title="statement not covered" > const [showMenu, setShowMenu] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showEditModal, setShowEditModal] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showFileManager, setShowFileManager] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showMQTTDebug, setShowMQTTDebug] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showPowerOnConfirm, setShowPowerOnConfirm] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showPowerOffConfirm, setShowPowerOffConfirm] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [showHMSModal, setShowHMSModal] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [amsHistoryModal, setAmsHistoryModal] = useState<{</span>
- amsId: number;
- amsLabel: string;
- mode: 'humidity' | 'temperature';
- <span class="cstat-no" title="statement not covered" > } | null>(null);</span>
-
- <span class="cstat-no" title="statement not covered" > const { data: status } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['printerStatus', printer.id],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getPrinterStatus(printer.id),</span>
- <span class="cstat-no" title="statement not covered" > refetchInterval: 30000, // Fallback polling, WebSocket handles real-time</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Cache WiFi signal to prevent it disappearing on updates
- <span class="cstat-no" title="statement not covered" > const [cachedWifiSignal, setCachedWifiSignal] = useState<number | null>(null);</span>
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > if (status?.wifi_signal != null) {</span>
- <span class="cstat-no" title="statement not covered" > setCachedWifiSignal(status.wifi_signal);</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > }, [status?.wifi_signal]);</span>
- <span class="cstat-no" title="statement not covered" > const wifiSignal = status?.wifi_signal ?? cachedWifiSignal;</span>
-
- // Cache ams_extruder_map to prevent L/R indicators bouncing on updates
- <span class="cstat-no" title="statement not covered" > const cachedAmsExtruderMap = useRef<Record<string, number>>({});</span>
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > if (status?.ams_extruder_map && Object.keys(status.ams_extruder_map).length > 0) {</span>
- <span class="cstat-no" title="statement not covered" > cachedAmsExtruderMap.current = status.ams_extruder_map;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > }, [status?.ams_extruder_map]);</span>
- <span class="cstat-no" title="statement not covered" > const amsExtruderMap = (status?.ams_extruder_map && Object.keys(status.ams_extruder_map).length > 0)</span>
- <span class="cstat-no" title="statement not covered" > ? status.ams_extruder_map</span>
- <span class="cstat-no" title="statement not covered" > : cachedAmsExtruderMap.current;</span>
-
- // Cache AMS data to prevent it disappearing on idle/offline printers
- <span class="cstat-no" title="statement not covered" > const cachedAmsData = useRef<AMSUnit[]>([]);</span>
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > if (status?.ams && status.ams.length > 0) {</span>
- <span class="cstat-no" title="statement not covered" > cachedAmsData.current = status.ams;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > }, [status?.ams]);</span>
- <span class="cstat-no" title="statement not covered" > const amsData = (status?.ams && status.ams.length > 0) ? status.ams : cachedAmsData.current;</span>
-
- // Fetch smart plug for this printer
- <span class="cstat-no" title="statement not covered" > const { data: smartPlug } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['smartPlugByPrinter', printer.id],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getSmartPlugByPrinter(printer.id),</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Fetch smart plug status if plug exists (faster refresh for energy monitoring)
- <span class="cstat-no" title="statement not covered" > const { data: plugStatus } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['smartPlugStatus', smartPlug?.id],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => smartPlug ? api.getSmartPlugStatus(smartPlug.id) : null,</span>
- <span class="cstat-no" title="statement not covered" > enabled: !!smartPlug,</span>
- <span class="cstat-no" title="statement not covered" > refetchInterval: 10000, // 10 seconds for real-time power display</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Fetch queue count for this printer
- <span class="cstat-no" title="statement not covered" > const { data: queueItems } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['queue', printer.id, 'pending'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getQueue(printer.id, 'pending'),</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const queueCount = queueItems?.length || 0;</span>
-
- // Fetch last completed print for this printer
- <span class="cstat-no" title="statement not covered" > const { data: lastPrints } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['archives', printer.id, 'last'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getArchives(printer.id, 1, 0),</span>
- <span class="cstat-no" title="statement not covered" > enabled: status?.connected && status?.state !== 'RUNNING',</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const lastPrint = lastPrints?.[0];</span>
-
- // Determine if this card should be hidden
- <span class="cstat-no" title="statement not covered" > const shouldHide = hideIfDisconnected && status && !status.connected;</span>
-
- <span class="cstat-no" title="statement not covered" > const deleteMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: () => api.deletePrinter(printer.id),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['printers'] });</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > const connectMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: () => api.connectPrinter(printer.id),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Smart plug control mutations
- <span class="cstat-no" title="statement not covered" > const powerControlMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: (action: 'on' | 'off') =></span>
- <span class="cstat-no" title="statement not covered" > smartPlug ? api.controlSmartPlug(smartPlug.id, action) : Promise.reject('No plug'),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['smartPlugStatus', smartPlug?.id] });</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > const toggleAutoOffMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: (enabled: boolean) =></span>
- <span class="cstat-no" title="statement not covered" > smartPlug ? api.updateSmartPlug(smartPlug.id, { auto_off: enabled }) : Promise.reject('No plug'),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['smartPlugByPrinter', printer.id] });</span>
- // Also invalidate the smart-plugs list to keep Settings page in sync
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > if (shouldHide) {</span>
- <span class="cstat-no" title="statement not covered" > return null;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <Card className="relative"></span>
- <span class="cstat-no" title="statement not covered" > <CardContent></span>
- {/* Header */}
- <span class="cstat-no" title="statement not covered" > <div className={viewMode === 'compact' ? 'mb-2' : 'mb-4'}></span>
- {/* Top row: Image, Name, Menu */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-start justify-between gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3 min-w-0 flex-1"></span>
- {/* Printer Model Image */}
- <span class="cstat-no" title="statement not covered" > <img</span>
- <span class="cstat-no" title="statement not covered" > src={getPrinterImage(printer.model)}</span>
- <span class="cstat-no" title="statement not covered" > alt={printer.model || 'Printer'}</span>
- <span class="cstat-no" title="statement not covered" > className={`object-contain rounded-lg bg-bambu-dark flex-shrink-0 ${viewMode === 'compact' ? 'w-10 h-10' : 'w-14 h-14'}`}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <div className="min-w-0 flex-1"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <h3 className={`font-semibold text-white ${viewMode === 'compact' ? 'text-base truncate' : 'text-lg'}`}>{printer.name}</h3></span>
- {/* Connection indicator dot for compact mode */}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'compact' && (</span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className={`w-2 h-2 rounded-full flex-shrink-0 ${</span>
- <span class="cstat-no" title="statement not covered" > status?.connected ? 'bg-bambu-green' : 'bg-red-500'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- <span class="cstat-no" title="statement not covered" > title={status?.connected ? 'Connected' : 'Offline'}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > {printer.model || 'Unknown Model'}</span>
- {/* Nozzle Info - only in expanded */}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'expanded' && status?.nozzles && status.nozzles[0]?.nozzle_diameter && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="ml-1.5 text-bambu-gray" title={status.nozzles[0].nozzle_type || 'Nozzle'}></span>
- <span class="cstat-no" title="statement not covered" > • {status.nozzles[0].nozzle_diameter}mm</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'expanded' && maintenanceInfo && maintenanceInfo.total_print_hours > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="ml-2 text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > <Clock className="w-3 h-3 inline-block mr-1" /></span>
- <span class="cstat-no" title="statement not covered" > {Math.round(maintenanceInfo.total_print_hours)}h</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- {/* Menu button */}
- <span class="cstat-no" title="statement not covered" > <div className="relative flex-shrink-0"></span>
- <span class="cstat-no" title="statement not covered" > <Button</span>
- <span class="cstat-no" title="statement not covered" > variant="ghost"</span>
- <span class="cstat-no" title="statement not covered" > size="sm"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowMenu(!showMenu)}</span>
- >
- <span class="cstat-no" title="statement not covered" > <MoreVertical className="w-4 h-4" /></span>
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > {showMenu && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="absolute right-0 mt-2 w-48 bg-bambu-dark-secondary border border-bambu-dark-tertiary rounded-lg shadow-lg z-10"></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => {</span>
- <span class="cstat-no" title="statement not covered" > setShowEditModal(true);</span>
- <span class="cstat-no" title="statement not covered" > setShowMenu(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Pencil className="w-4 h-4" /></span>
- Edit
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => {</span>
- <span class="cstat-no" title="statement not covered" > connectMutation.mutate();</span>
- <span class="cstat-no" title="statement not covered" > setShowMenu(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- >
- <span class="cstat-no" title="statement not covered" > <RefreshCw className="w-4 h-4" /></span>
- Reconnect
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-4 py-2 text-left text-sm hover:bg-bambu-dark-tertiary flex items-center gap-2"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => {</span>
- <span class="cstat-no" title="statement not covered" > setShowMQTTDebug(true);</span>
- <span class="cstat-no" title="statement not covered" > setShowMenu(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Terminal className="w-4 h-4" /></span>
- MQTT Debug
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-4 py-2 text-left text-sm text-red-400 hover:bg-bambu-dark-tertiary flex items-center gap-2"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => {</span>
- <span class="cstat-no" title="statement not covered" > setShowDeleteConfirm(true);</span>
- <span class="cstat-no" title="statement not covered" > setShowMenu(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Trash2 className="w-4 h-4" /></span>
- Delete
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Badges row - only in expanded mode */}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'expanded' && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex flex-wrap items-center gap-2 mt-2"></span>
- {/* Connection status badge */}
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center gap-1.5 px-2 py-1 rounded-full text-xs ${</span>
- <span class="cstat-no" title="statement not covered" > status?.connected</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-red-500/20 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > {status?.connected ? (</span>
- <span class="cstat-no" title="statement not covered" > <Link className="w-3 h-3" /></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <Unlink className="w-3 h-3" /></span>
- )}
- <span class="cstat-no" title="statement not covered" > {status?.connected ? 'Connected' : 'Offline'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- {/* WiFi signal strength indicator */}
- <span class="cstat-no" title="statement not covered" > {status?.connected && wifiSignal != null && (</span>
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs ${</span>
- <span class="cstat-no" title="statement not covered" > wifiSignal >= -50</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > : wifiSignal >= -60</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > : wifiSignal >= -70</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-amber-500/20 text-amber-600'</span>
- <span class="cstat-no" title="statement not covered" > : wifiSignal >= -80</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-orange-500/20 text-orange-600'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-red-500/20 text-red-600'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- <span class="cstat-no" title="statement not covered" > title={`WiFi: ${wifiSignal} dBm - ${getWifiStrength(wifiSignal).label}`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Signal className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {wifiSignal}dBm</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- {/* HMS Status Indicator */}
- <span class="cstat-no" title="statement not covered" > {status?.connected && (</span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowHMSModal(true)}</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${</span>
- <span class="cstat-no" title="statement not covered" > status.hms_errors && status.hms_errors.length > 0</span>
- <span class="cstat-no" title="statement not covered" > ? status.hms_errors.some(e => e.severity <= 2)</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-red-500/20 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-orange-500/20 text-orange-400'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- <span class="cstat-no" title="statement not covered" > title="Click to view HMS errors"</span>
- >
- <span class="cstat-no" title="statement not covered" > <AlertTriangle className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {status.hms_errors && status.hms_errors.length > 0</span>
- <span class="cstat-no" title="statement not covered" > ? status.hms_errors.length</span>
- <span class="cstat-no" title="statement not covered" > : 'OK'}</span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- )}
- {/* Maintenance Status Indicator */}
- <span class="cstat-no" title="statement not covered" > {maintenanceInfo && (</span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => navigate('/maintenance')}</span>
- <span class="cstat-no" title="statement not covered" > className={`flex items-center gap-1 px-2 py-1 rounded-full text-xs cursor-pointer hover:opacity-80 transition-opacity ${</span>
- <span class="cstat-no" title="statement not covered" > maintenanceInfo.due_count > 0</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-red-500/20 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > : maintenanceInfo.warning_count > 0</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-orange-500/20 text-orange-400'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- <span class="cstat-no" title="statement not covered" > title={</span>
- <span class="cstat-no" title="statement not covered" > maintenanceInfo.due_count > 0 || maintenanceInfo.warning_count > 0</span>
- <span class="cstat-no" title="statement not covered" > ? `${maintenanceInfo.due_count > 0 ? `${maintenanceInfo.due_count} maintenance due` : ''}${maintenanceInfo.due_count > 0 && maintenanceInfo.warning_count > 0 ? ', ' : ''}${maintenanceInfo.warning_count > 0 ? `${maintenanceInfo.warning_count} due soon` : ''} - Click to view`</span>
- <span class="cstat-no" title="statement not covered" > : 'All maintenance up to date - Click to view'</span>
- }
- >
- <span class="cstat-no" title="statement not covered" > <Wrench className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {maintenanceInfo.due_count > 0 || maintenanceInfo.warning_count > 0</span>
- <span class="cstat-no" title="statement not covered" > ? maintenanceInfo.due_count + maintenanceInfo.warning_count</span>
- <span class="cstat-no" title="statement not covered" > : 'OK'}</span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- )}
- {/* Queue Count Badge */}
- <span class="cstat-no" title="statement not covered" > {queueCount > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => navigate('/queue')}</span>
- <span class="cstat-no" title="statement not covered" > className="flex items-center gap-1 px-2 py-1 rounded-full text-xs bg-purple-500/20 text-purple-400 hover:opacity-80 transition-opacity"</span>
- <span class="cstat-no" title="statement not covered" > title={`${queueCount} print${queueCount > 1 ? 's' : ''} in queue`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Layers className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {queueCount}</span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Delete Confirmation */}
- <span class="cstat-no" title="statement not covered" > {showDeleteConfirm && (</span>
- <span class="cstat-no" title="statement not covered" > <ConfirmModal</span>
- <span class="cstat-no" title="statement not covered" > title="Delete Printer"</span>
- <span class="cstat-no" title="statement not covered" > message={`Are you sure you want to delete "${printer.name}"? This will also remove all connection settings.`}</span>
- <span class="cstat-no" title="statement not covered" > confirmText="Delete"</span>
- <span class="cstat-no" title="statement not covered" > variant="danger"</span>
- <span class="cstat-no" title="statement not covered" > onConfirm={() => {</span>
- <span class="cstat-no" title="statement not covered" > deleteMutation.mutate();</span>
- <span class="cstat-no" title="statement not covered" > setShowDeleteConfirm(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > onCancel={() => setShowDeleteConfirm(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* Status */}
- <span class="cstat-no" title="statement not covered" > {status?.connected && (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- {/* Compact: Simple status bar */}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'compact' ? (</span>
- <span class="cstat-no" title="statement not covered" > <div className="mt-2"></span>
- <span class="cstat-no" title="statement not covered" > {status.state === 'RUNNING' ? (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-1.5"></span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="bg-bambu-green h-1.5 rounded-full transition-all"</span>
- <span class="cstat-no" title="statement not covered" > style={{ width: `${status.progress || 0}%` }}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-xs text-white">{Math.round(status.progress || 0)}%</span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray capitalize">{status.state?.toLowerCase() || 'Idle'}</p></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- ) : (
- /* Expanded: Full status section */
- <span class="cstat-no" title="statement not covered" > <></span>
- {/* Current Print or Idle Placeholder */}
- <span class="cstat-no" title="statement not covered" > <div className="mb-4 p-3 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex gap-3"></span>
- {/* Cover Image */}
- <span class="cstat-no" title="statement not covered" > <CoverImage</span>
- <span class="cstat-no" title="statement not covered" > url={status.state === 'RUNNING' ? status.cover_url : null}</span>
- <span class="cstat-no" title="statement not covered" > printName={status.state === 'RUNNING' ? (status.subtask_name || status.current_print || undefined) : undefined}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- {/* Print Info */}
- <span class="cstat-no" title="statement not covered" > <div className="flex-1 min-w-0"></span>
- <span class="cstat-no" title="statement not covered" > {status.current_print && status.state === 'RUNNING' ? (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-bambu-gray mb-1">Printing</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-white text-sm mb-2 truncate"></span>
- <span class="cstat-no" title="statement not covered" > {status.subtask_name || status.current_print}</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center justify-between text-sm"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3"></span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="bg-bambu-green h-2 rounded-full transition-all"</span>
- <span class="cstat-no" title="statement not covered" > style={{ width: `${status.progress || 0}%` }}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-white">{Math.round(status.progress || 0)}%</span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3 mt-2 text-xs text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > {status.remaining_time != null && status.remaining_time > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <span className="flex items-center gap-1"></span>
- <span class="cstat-no" title="statement not covered" > <Clock className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {formatTime(status.remaining_time * 60)}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-green font-medium" title="Estimated completion time"></span>
- <span class="cstat-no" title="statement not covered" > ETA {formatETA(status.remaining_time)}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
- <span class="cstat-no" title="statement not covered" > {status.layer_num != null && status.total_layers != null && status.total_layers > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="flex items-center gap-1"></span>
- <span class="cstat-no" title="statement not covered" > <Layers className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {status.layer_num}/{status.total_layers}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-bambu-gray mb-1">Status</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-white text-sm mb-2 capitalize"></span>
- <span class="cstat-no" title="statement not covered" > {status.state?.toLowerCase() || 'Idle'}</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center justify-between text-sm"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex-1 bg-bambu-dark-tertiary rounded-full h-2 mr-3"></span>
- <span class="cstat-no" title="statement not covered" > <div className="bg-bambu-dark-tertiary h-2 rounded-full" /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray">—</span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > {lastPrint ? (</span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray mt-2 truncate" title={lastPrint.print_name || lastPrint.filename}></span>
- <span class="cstat-no" title="statement not covered" > Last: {lastPrint.print_name || lastPrint.filename}</span>
- <span class="cstat-no" title="statement not covered" > {lastPrint.completed_at && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="ml-1 text-bambu-gray/60"></span>
- <span class="cstat-no" title="statement not covered" > • {new Date(lastPrint.completed_at).toLocaleDateString([], { month: 'short', day: 'numeric' })}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </p></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray mt-2">Ready to print</p></span>
- )}
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Queue Widget - shows next scheduled print */}
- <span class="cstat-no" title="statement not covered" > {status.state !== 'RUNNING' && (</span>
- <span class="cstat-no" title="statement not covered" > <PrinterQueueWidget printerId={printer.id} /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
-
- {/* Temperatures */}
- <span class="cstat-no" title="statement not covered" > {status.temperatures && viewMode === 'expanded' && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="grid grid-cols-3 gap-3"></span>
- {/* Nozzle temp - combined for dual nozzle */}
- <span class="cstat-no" title="statement not covered" > <div className="text-center p-2 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <Thermometer className="w-4 h-4 mx-auto mb-1 text-orange-400" /></span>
- <span class="cstat-no" title="statement not covered" > {status.temperatures.nozzle_2 !== undefined ? (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray">Left / Right</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-white"></span>
- <span class="cstat-no" title="statement not covered" > {Math.round(status.temperatures.nozzle || 0)}°C / {Math.round(status.temperatures.nozzle_2 || 0)}°C</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray">Nozzle</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-white"></span>
- <span class="cstat-no" title="statement not covered" > {Math.round(status.temperatures.nozzle || 0)}°C</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="text-center p-2 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <Thermometer className="w-4 h-4 mx-auto mb-1 text-blue-400" /></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray">Bed</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-white"></span>
- <span class="cstat-no" title="statement not covered" > {Math.round(status.temperatures.bed || 0)}°C</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > {status.temperatures.chamber !== undefined && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="text-center p-2 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <Thermometer className="w-4 h-4 mx-auto mb-1 text-green-400" /></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray">Chamber</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-sm text-white"></span>
- <span class="cstat-no" title="statement not covered" > {Math.round(status.temperatures.chamber || 0)}°C</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
-
- {/* AMS Units with Device Icons, Humidity & Temperature */}
- <span class="cstat-no" title="statement not covered" > {amsData && amsData.length > 0 && viewMode === 'expanded' && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="mt-3 space-y-2"></span>
- <span class="cstat-no" title="statement not covered" > {amsData.map((ams) => {</span>
- // For dual nozzle printers, determine which nozzle this AMS is connected to
- // Use actual ams.id for map lookup (map uses real IDs: 0-3 for AMS, 128+ for AMS-HT)
- <span class="cstat-no" title="statement not covered" > const mappedExtruderId = amsExtruderMap[String(ams.id)];</span>
- // Fallback: normalize ID for conventional mapping (0=R, 1=L)
- <span class="cstat-no" title="statement not covered" > const normalizedId = ams.id >= 128 ? ams.id - 128 : ams.id;</span>
- <span class="cstat-no" title="statement not covered" > const extruderId = mappedExtruderId !== undefined</span>
- <span class="cstat-no" title="statement not covered" > ? mappedExtruderId</span>
- <span class="cstat-no" title="statement not covered" > : normalizedId; // Fallback: AMS 0 → extruder 0 (R), AMS 1 → extruder 1 (L)</span>
- // Use printer.nozzle_count as primary source (stable), fallback to nozzle_2 temp
- <span class="cstat-no" title="statement not covered" > const isDualNozzle = printer.nozzle_count === 2 || status?.temperatures?.nozzle_2 !== undefined;</span>
- // extruder 0 = Right, extruder 1 = Left
- <span class="cstat-no" title="statement not covered" > const isLeftNozzle = extruderId === 1;</span>
- <span class="cstat-no" title="statement not covered" > const isRightNozzle = extruderId === 0;</span>
-
- // Get colors for the AMS icon (null for empty slots)
- <span class="cstat-no" title="statement not covered" > const slotColors = ams.tray.map(tray =></span>
- <span class="cstat-no" title="statement not covered" > tray.tray_color ? `#${tray.tray_color}` : (tray.tray_type ? '#333' : null)</span>
- <span class="cstat-no" title="statement not covered" > );</span>
- <span class="cstat-no" title="statement not covered" > const isHtAms = ams.tray.length === 1;</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div key={ams.id} className="p-2 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3"></span>
- {/* Nozzle badge + AMS device icon */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1"></span>
- <span class="cstat-no" title="statement not covered" > {isDualNozzle && (isLeftNozzle || isRightNozzle) && (</span>
- <span class="cstat-no" title="statement not covered" > <NozzleBadge side={isLeftNozzle ? 'L' : 'R'} /></span>
- )}
- <span class="cstat-no" title="statement not covered" > {isHtAms ? (</span>
- <span class="cstat-no" title="statement not covered" > <AMS1TrayIcon</span>
- <span class="cstat-no" title="statement not covered" > color={slotColors[0]}</span>
- <span class="cstat-no" title="statement not covered" > className="flex-shrink-0"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <AMS4TrayIcon</span>
- <span class="cstat-no" title="statement not covered" > colors={slotColors as (string | null)[]}</span>
- <span class="cstat-no" title="statement not covered" > className="flex-shrink-0"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Label and filament info */}
- <span class="cstat-no" title="statement not covered" > <div className="flex-1 min-w-0"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-xs text-bambu-gray font-medium"></span>
- <span class="cstat-no" title="statement not covered" > {getAmsLabel(ams.id, ams.tray.length)}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- {/* Filament types and fill levels */}
- <span class="cstat-no" title="statement not covered" > <div className="mt-0.5 text-[10px] flex items-start"></span>
- <span class="cstat-no" title="statement not covered" > {ams.tray.map((tray, i) => (</span>
- <span class="cstat-no" title="statement not covered" > <div key={i} className="flex items-start"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex flex-col"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray/70 truncate"></span>
- <span class="cstat-no" title="statement not covered" > {tray.tray_type ? (tray.tray_sub_brands || tray.tray_type) : '—'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray/50 truncate"></span>
- <span class="cstat-no" title="statement not covered" > {tray.tray_type && tray.remain >= 0 ? `${tray.remain}%` : '—'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > {i < ams.tray.length - 1 && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="text-bambu-gray/50 mx-1 flex flex-col"></span>
- <span class="cstat-no" title="statement not covered" > <span>·</span></span>
- <span class="cstat-no" title="statement not covered" > <span>·</span></span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > ))}</span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- {/* Humidity/temp - vertically centered */}
- <span class="cstat-no" title="statement not covered" > {(ams.humidity != null || ams.temp != null) && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2 text-xs flex-shrink-0"></span>
- <span class="cstat-no" title="statement not covered" > {ams.humidity != null && (</span>
- <span class="cstat-no" title="statement not covered" > <HumidityIndicator</span>
- <span class="cstat-no" title="statement not covered" > humidity={ams.humidity}</span>
- <span class="cstat-no" title="statement not covered" > goodThreshold={amsThresholds?.humidityGood}</span>
- <span class="cstat-no" title="statement not covered" > fairThreshold={amsThresholds?.humidityFair}</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setAmsHistoryModal({</span>
- <span class="cstat-no" title="statement not covered" > amsId: ams.id,</span>
- <span class="cstat-no" title="statement not covered" > amsLabel: getAmsLabel(ams.id, ams.tray.length),</span>
- <span class="cstat-no" title="statement not covered" > mode: 'humidity',</span>
- <span class="cstat-no" title="statement not covered" > })}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > {ams.temp != null && (</span>
- <span class="cstat-no" title="statement not covered" > <TemperatureIndicator</span>
- <span class="cstat-no" title="statement not covered" > temp={ams.temp}</span>
- <span class="cstat-no" title="statement not covered" > goodThreshold={amsThresholds?.tempGood}</span>
- <span class="cstat-no" title="statement not covered" > fairThreshold={amsThresholds?.tempFair}</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setAmsHistoryModal({</span>
- <span class="cstat-no" title="statement not covered" > amsId: ams.id,</span>
- <span class="cstat-no" title="statement not covered" > amsLabel: getAmsLabel(ams.id, ams.tray.length),</span>
- <span class="cstat-no" title="statement not covered" > mode: 'temperature',</span>
- <span class="cstat-no" title="statement not covered" > })}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" > })}</span>
- {/* External spool indicator */}
- <span class="cstat-no" title="statement not covered" > {status.vt_tray && status.vt_tray.tray_type && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="p-2 bg-bambu-dark rounded-lg"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3"></span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="w-10 h-10 rounded-full border-2 border-white/20 flex-shrink-0"</span>
- <span class="cstat-no" title="statement not covered" > style={{</span>
- <span class="cstat-no" title="statement not covered" > backgroundColor: status.vt_tray.tray_color ? `#${status.vt_tray.tray_color}` : '#333',</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-xs text-bambu-gray font-medium">External</span></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-[10px] text-bambu-gray/70"></span>
- <span class="cstat-no" title="statement not covered" > {status.vt_tray.tray_sub_brands || status.vt_tray.tray_type || 'Spool'}</span>
- <span class="cstat-no" title="statement not covered" > </p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
-
- {/* Smart Plug Controls - hidden in compact mode */}
- <span class="cstat-no" title="statement not covered" > {smartPlug && viewMode === 'expanded' && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="mt-4 pt-4 border-t border-bambu-dark-tertiary"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3"></span>
- {/* Plug name and status */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2 min-w-0"></span>
- <span class="cstat-no" title="statement not covered" > <Zap className="w-4 h-4 text-bambu-gray flex-shrink-0" /></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-sm text-white truncate">{smartPlug.name}</span></span>
- <span class="cstat-no" title="statement not covered" > {plugStatus && (</span>
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className={`text-xs px-1.5 py-0.5 rounded flex-shrink-0 ${</span>
- <span class="cstat-no" title="statement not covered" > plugStatus.state === 'ON'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > : plugStatus.state === 'OFF'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-red-500/20 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-gray/20 text-bambu-gray'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > {plugStatus.state || '?'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- {/* Power consumption display */}
- <span class="cstat-no" title="statement not covered" > {plugStatus?.energy?.power != null && plugStatus.state === 'ON' && (</span>
- <span class="cstat-no" title="statement not covered" > <span className="text-xs text-yellow-400 font-medium flex-shrink-0"></span>
- <span class="cstat-no" title="statement not covered" > {plugStatus.energy.power}W</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Spacer */}
- <span class="cstat-no" title="statement not covered" > <div className="flex-1" /></span>
-
- {/* Power buttons */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1"></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowPowerOnConfirm(true)}</span>
- <span class="cstat-no" title="statement not covered" > disabled={powerControlMutation.isPending || plugStatus?.state === 'ON'}</span>
- <span class="cstat-no" title="statement not covered" > className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${</span>
- <span class="cstat-no" title="statement not covered" > plugStatus?.state === 'ON'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green text-white'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Power className="w-3 h-3" /></span>
- On
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowPowerOffConfirm(true)}</span>
- <span class="cstat-no" title="statement not covered" > disabled={powerControlMutation.isPending || plugStatus?.state === 'OFF'}</span>
- <span class="cstat-no" title="statement not covered" > className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${</span>
- <span class="cstat-no" title="statement not covered" > plugStatus?.state === 'OFF'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-red-500/30 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-dark text-bambu-gray hover:text-white hover:bg-bambu-dark-tertiary'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <PowerOff className="w-3 h-3" /></span>
- Off
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* Auto-off toggle */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2 flex-shrink-0"></span>
- <span class="cstat-no" title="statement not covered" > <span className={`text-xs hidden sm:inline ${smartPlug.auto_off_executed ? 'text-bambu-green' : 'text-bambu-gray'}`}></span>
- <span class="cstat-no" title="statement not covered" > {smartPlug.auto_off_executed ? 'Auto-off done' : 'Auto-off'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => toggleAutoOffMutation.mutate(!smartPlug.auto_off)}</span>
- <span class="cstat-no" title="statement not covered" > disabled={toggleAutoOffMutation.isPending || smartPlug.auto_off_executed}</span>
- <span class="cstat-no" title="statement not covered" > title={smartPlug.auto_off_executed ? 'Auto-off was executed - turn printer on to reset' : 'Auto power-off after print'}</span>
- <span class="cstat-no" title="statement not covered" > className={`relative w-9 h-5 rounded-full transition-colors flex-shrink-0 ${</span>
- <span class="cstat-no" title="statement not covered" > smartPlug.auto_off_executed</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/50 cursor-not-allowed'</span>
- <span class="cstat-no" title="statement not covered" > : smartPlug.auto_off ? 'bg-bambu-green' : 'bg-bambu-dark-tertiary'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className={`absolute top-[2px] left-[2px] w-4 h-4 bg-white rounded-full transition-transform ${</span>
- <span class="cstat-no" title="statement not covered" > smartPlug.auto_off || smartPlug.auto_off_executed ? 'translate-x-4' : 'translate-x-0'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
-
- {/* Connection Info & Actions - hidden in compact mode */}
- <span class="cstat-no" title="statement not covered" > {viewMode === 'expanded' && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="mt-4 pt-4 border-t border-bambu-dark-tertiary flex items-center justify-between"></span>
- <span class="cstat-no" title="statement not covered" > <div className="text-xs text-bambu-gray"></span>
- <span class="cstat-no" title="statement not covered" > <p>{printer.ip_address}</p></span>
- <span class="cstat-no" title="statement not covered" > <p className="truncate">{printer.serial_number}</p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <Button</span>
- <span class="cstat-no" title="statement not covered" > variant="secondary"</span>
- <span class="cstat-no" title="statement not covered" > size="sm"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => {</span>
- <span class="cstat-no" title="statement not covered" > window.open(</span>
- <span class="cstat-no" title="statement not covered" > `/camera/${printer.id}`,</span>
- <span class="cstat-no" title="statement not covered" > `camera-${printer.id}`,</span>
- <span class="cstat-no" title="statement not covered" > 'width=640,height=400,menubar=no,toolbar=no,location=no,status=no'</span>
- <span class="cstat-no" title="statement not covered" > );</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > disabled={!status?.connected}</span>
- <span class="cstat-no" title="statement not covered" > title="Open camera in new window"</span>
- >
- <span class="cstat-no" title="statement not covered" > <Video className="w-4 h-4" /></span>
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > <Button</span>
- <span class="cstat-no" title="statement not covered" > variant="secondary"</span>
- <span class="cstat-no" title="statement not covered" > size="sm"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowFileManager(true)}</span>
- <span class="cstat-no" title="statement not covered" > title="Browse printer files"</span>
- >
- <span class="cstat-no" title="statement not covered" > <HardDrive className="w-4 h-4" /></span>
- Files
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </CardContent></span>
-
- {/* File Manager Modal */}
- <span class="cstat-no" title="statement not covered" > {showFileManager && (</span>
- <span class="cstat-no" title="statement not covered" > <FileManagerModal</span>
- <span class="cstat-no" title="statement not covered" > printerId={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printerName={printer.name}</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setShowFileManager(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* MQTT Debug Modal */}
- <span class="cstat-no" title="statement not covered" > {showMQTTDebug && (</span>
- <span class="cstat-no" title="statement not covered" > <MQTTDebugModal</span>
- <span class="cstat-no" title="statement not covered" > printerId={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printerName={printer.name}</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setShowMQTTDebug(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* Power On Confirmation */}
- <span class="cstat-no" title="statement not covered" > {showPowerOnConfirm && smartPlug && (</span>
- <span class="cstat-no" title="statement not covered" > <ConfirmModal</span>
- <span class="cstat-no" title="statement not covered" > title="Power On Printer"</span>
- <span class="cstat-no" title="statement not covered" > message={`Are you sure you want to turn ON the power for "${printer.name}"?`}</span>
- <span class="cstat-no" title="statement not covered" > confirmText="Power On"</span>
- <span class="cstat-no" title="statement not covered" > variant="default"</span>
- <span class="cstat-no" title="statement not covered" > onConfirm={() => {</span>
- <span class="cstat-no" title="statement not covered" > powerControlMutation.mutate('on');</span>
- <span class="cstat-no" title="statement not covered" > setShowPowerOnConfirm(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > onCancel={() => setShowPowerOnConfirm(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* Power Off Confirmation */}
- <span class="cstat-no" title="statement not covered" > {showPowerOffConfirm && smartPlug && (</span>
- <span class="cstat-no" title="statement not covered" > <ConfirmModal</span>
- <span class="cstat-no" title="statement not covered" > title="Power Off Printer"</span>
- <span class="cstat-no" title="statement not covered" > message={</span>
- <span class="cstat-no" title="statement not covered" > status?.state === 'RUNNING'</span>
- <span class="cstat-no" title="statement not covered" > ? `WARNING: "${printer.name}" is currently printing! Are you sure you want to turn OFF the power? This will interrupt the print and may damage the printer.`</span>
- <span class="cstat-no" title="statement not covered" > : `Are you sure you want to turn OFF the power for "${printer.name}"?`</span>
- }
- <span class="cstat-no" title="statement not covered" > confirmText="Power Off"</span>
- <span class="cstat-no" title="statement not covered" > variant="danger"</span>
- <span class="cstat-no" title="statement not covered" > onConfirm={() => {</span>
- <span class="cstat-no" title="statement not covered" > powerControlMutation.mutate('off');</span>
- <span class="cstat-no" title="statement not covered" > setShowPowerOffConfirm(false);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > onCancel={() => setShowPowerOffConfirm(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* HMS Error Modal */}
- <span class="cstat-no" title="statement not covered" > {showHMSModal && (</span>
- <span class="cstat-no" title="statement not covered" > <HMSErrorModal</span>
- <span class="cstat-no" title="statement not covered" > printerName={printer.name}</span>
- <span class="cstat-no" title="statement not covered" > errors={status?.hms_errors || []}</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setShowHMSModal(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* AMS History Modal */}
- <span class="cstat-no" title="statement not covered" > {amsHistoryModal && (</span>
- <span class="cstat-no" title="statement not covered" > <AMSHistoryModal</span>
- <span class="cstat-no" title="statement not covered" > isOpen={!!amsHistoryModal}</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setAmsHistoryModal(null)}</span>
- <span class="cstat-no" title="statement not covered" > printerId={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printerName={printer.name}</span>
- <span class="cstat-no" title="statement not covered" > amsId={amsHistoryModal.amsId}</span>
- <span class="cstat-no" title="statement not covered" > amsLabel={amsHistoryModal.amsLabel}</span>
- <span class="cstat-no" title="statement not covered" > initialMode={amsHistoryModal.mode}</span>
- <span class="cstat-no" title="statement not covered" > thresholds={amsThresholds}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
-
- {/* Edit Printer Modal */}
- <span class="cstat-no" title="statement not covered" > {showEditModal && (</span>
- <span class="cstat-no" title="statement not covered" > <EditPrinterModal</span>
- <span class="cstat-no" title="statement not covered" > printer={printer}</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setShowEditModal(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </Card></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function AddPrinterModal({</span>
- <span class="cstat-no" title="statement not covered" > onClose,</span>
- <span class="cstat-no" title="statement not covered" > onAdd,</span>
- <span class="cstat-no" title="statement not covered" >}: {</span>
- onClose: () => void;
- onAdd: (data: PrinterCreate) => void;
- <span class="cstat-no" title="statement not covered" >}) {</span>
- <span class="cstat-no" title="statement not covered" > const [form, setForm] = useState<PrinterCreate>({</span>
- <span class="cstat-no" title="statement not covered" > name: '',</span>
- <span class="cstat-no" title="statement not covered" > serial_number: '',</span>
- <span class="cstat-no" title="statement not covered" > ip_address: '',</span>
- <span class="cstat-no" title="statement not covered" > access_code: '',</span>
- <span class="cstat-no" title="statement not covered" > model: '',</span>
- <span class="cstat-no" title="statement not covered" > auto_archive: true,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Close on Escape key
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > const handleKeyDown = (e: KeyboardEvent) => {</span>
- <span class="cstat-no" title="statement not covered" > if (e.key === 'Escape') onClose();</span>
- <span class="cstat-no" title="statement not covered" > };</span>
- <span class="cstat-no" title="statement not covered" > window.addEventListener('keydown', handleKeyDown);</span>
- <span class="cstat-no" title="statement not covered" > return () => window.removeEventListener('keydown', handleKeyDown);</span>
- <span class="cstat-no" title="statement not covered" > }, [onClose]);</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="fixed inset-0 bg-black/50 flex items-center justify-center z-50"</span>
- <span class="cstat-no" title="statement not covered" > onClick={onClose}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Card className="w-full max-w-md" onClick={(e: React.MouseEvent) => e.stopPropagation()}></span>
- <span class="cstat-no" title="statement not covered" > <CardContent></span>
- <span class="cstat-no" title="statement not covered" > <h2 className="text-xl font-semibold mb-4">Add Printer</h2></span>
- <span class="cstat-no" title="statement not covered" > <form</span>
- <span class="cstat-no" title="statement not covered" > onSubmit={(e) => {</span>
- <span class="cstat-no" title="statement not covered" > e.preventDefault();</span>
- <span class="cstat-no" title="statement not covered" > onAdd(form);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > className="space-y-4"</span>
- >
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Name</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.name}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, name: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="My Printer"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">IP Address</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.ip_address}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, ip_address: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="192.168.1.100"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Serial Number</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.serial_number}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, serial_number: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="01P00A000000000"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Access Code</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="password"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.access_code}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, access_code: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="From printer settings"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Model (optional)</label></span>
- <span class="cstat-no" title="statement not covered" > <select</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.model || ''}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, model: e.target.value })}</span>
- >
- <span class="cstat-no" title="statement not covered" > <option value="">Select model...</option></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="H2 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2C">H2C</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2D">H2D</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2S">H2S</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="X1 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1E">X1E</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1C">X1 Carbon</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1">X1</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="P Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="P2S">P2S</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="P1S">P1S</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="P1P">P1P</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="A1 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="A1">A1</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="A1 Mini">A1 Mini</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > </select></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="checkbox"</span>
- <span class="cstat-no" title="statement not covered" > id="auto_archive"</span>
- <span class="cstat-no" title="statement not covered" > checked={form.auto_archive}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, auto_archive: e.target.checked })}</span>
- <span class="cstat-no" title="statement not covered" > className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <label htmlFor="auto_archive" className="text-sm text-bambu-gray"></span>
- Auto-archive completed prints
- <span class="cstat-no" title="statement not covered" > </label></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex gap-3 pt-4"></span>
- <span class="cstat-no" title="statement not covered" > <Button type="button" variant="secondary" onClick={onClose} className="flex-1"></span>
- Cancel
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > <Button type="submit" className="flex-1"></span>
- Add Printer
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </form></span>
- <span class="cstat-no" title="statement not covered" > </CardContent></span>
- <span class="cstat-no" title="statement not covered" > </Card></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >function EditPrinterModal({</span>
- <span class="cstat-no" title="statement not covered" > printer,</span>
- <span class="cstat-no" title="statement not covered" > onClose,</span>
- <span class="cstat-no" title="statement not covered" >}: {</span>
- printer: Printer;
- onClose: () => void;
- <span class="cstat-no" title="statement not covered" >}) {</span>
- <span class="cstat-no" title="statement not covered" > const queryClient = useQueryClient();</span>
- <span class="cstat-no" title="statement not covered" > const [form, setForm] = useState({</span>
- <span class="cstat-no" title="statement not covered" > name: printer.name,</span>
- <span class="cstat-no" title="statement not covered" > ip_address: printer.ip_address,</span>
- <span class="cstat-no" title="statement not covered" > access_code: '',</span>
- <span class="cstat-no" title="statement not covered" > model: printer.model || '',</span>
- <span class="cstat-no" title="statement not covered" > location: printer.location || '',</span>
- <span class="cstat-no" title="statement not covered" > auto_archive: printer.auto_archive,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > const updateMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: (data: Partial<PrinterCreate>) => api.updatePrinter(printer.id, data),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['printers'] });</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });</span>
- <span class="cstat-no" title="statement not covered" > onClose();</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Close on Escape key
- <span class="cstat-no" title="statement not covered" > useEffect(() => {</span>
- <span class="cstat-no" title="statement not covered" > const handleKeyDown = (e: KeyboardEvent) => {</span>
- <span class="cstat-no" title="statement not covered" > if (e.key === 'Escape') onClose();</span>
- <span class="cstat-no" title="statement not covered" > };</span>
- <span class="cstat-no" title="statement not covered" > window.addEventListener('keydown', handleKeyDown);</span>
- <span class="cstat-no" title="statement not covered" > return () => window.removeEventListener('keydown', handleKeyDown);</span>
- <span class="cstat-no" title="statement not covered" > }, [onClose]);</span>
-
- <span class="cstat-no" title="statement not covered" > const handleSubmit = (e: React.FormEvent) => {</span>
- <span class="cstat-no" title="statement not covered" > e.preventDefault();</span>
- <span class="cstat-no" title="statement not covered" > const data: Partial<PrinterCreate> = {</span>
- <span class="cstat-no" title="statement not covered" > name: form.name,</span>
- <span class="cstat-no" title="statement not covered" > ip_address: form.ip_address,</span>
- <span class="cstat-no" title="statement not covered" > model: form.model || undefined,</span>
- <span class="cstat-no" title="statement not covered" > location: form.location || undefined,</span>
- <span class="cstat-no" title="statement not covered" > auto_archive: form.auto_archive,</span>
- <span class="cstat-no" title="statement not covered" > };</span>
- // Only include access_code if it was changed
- <span class="cstat-no" title="statement not covered" > if (form.access_code) {</span>
- <span class="cstat-no" title="statement not covered" > data.access_code = form.access_code;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > updateMutation.mutate(data);</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="fixed inset-0 bg-black/50 flex items-center justify-center z-50"</span>
- <span class="cstat-no" title="statement not covered" > onClick={onClose}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Card className="w-full max-w-md" onClick={(e: React.MouseEvent) => e.stopPropagation()}></span>
- <span class="cstat-no" title="statement not covered" > <CardContent></span>
- <span class="cstat-no" title="statement not covered" > <h2 className="text-xl font-semibold mb-4">Edit Printer</h2></span>
- <span class="cstat-no" title="statement not covered" > <form onSubmit={handleSubmit} className="space-y-4"></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Name</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.name}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, name: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="My Printer"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">IP Address</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > required</span>
- <span class="cstat-no" title="statement not covered" > pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.ip_address}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, ip_address: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="192.168.1.100"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Serial Number</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > disabled</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-bambu-gray cursor-not-allowed"</span>
- <span class="cstat-no" title="statement not covered" > value={printer.serial_number}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray mt-1">Serial number cannot be changed</p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Access Code</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="password"</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.access_code}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, access_code: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="Leave empty to keep current"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Model</label></span>
- <span class="cstat-no" title="statement not covered" > <select</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.model}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, model: e.target.value })}</span>
- >
- <span class="cstat-no" title="statement not covered" > <option value="">Select model...</option></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="H2 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2C">H2C</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2D">H2D</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="H2S">H2S</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="X1 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1E">X1E</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1C">X1 Carbon</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="X1">X1</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="P Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="P2S">P2S</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="P1S">P1S</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="P1P">P1P</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > <optgroup label="A1 Series"></span>
- <span class="cstat-no" title="statement not covered" > <option value="A1">A1</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="A1 Mini">A1 Mini</option></span>
- <span class="cstat-no" title="statement not covered" > </optgroup></span>
- <span class="cstat-no" title="statement not covered" > </select></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <label className="block text-sm text-bambu-gray mb-1">Location / Group</label></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="text"</span>
- <span class="cstat-no" title="statement not covered" > className="w-full px-3 py-2 bg-bambu-dark border border-bambu-dark-tertiary rounded-lg text-white focus:border-bambu-green focus:outline-none"</span>
- <span class="cstat-no" title="statement not covered" > value={form.location}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, location: e.target.value })}</span>
- <span class="cstat-no" title="statement not covered" > placeholder="e.g., Workshop, Office, Basement"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-xs text-bambu-gray mt-1">Used to group printers on the dashboard</p></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="checkbox"</span>
- <span class="cstat-no" title="statement not covered" > id="edit_auto_archive"</span>
- <span class="cstat-no" title="statement not covered" > checked={form.auto_archive}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => setForm({ ...form, auto_archive: e.target.checked })}</span>
- <span class="cstat-no" title="statement not covered" > className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <label htmlFor="edit_auto_archive" className="text-sm text-bambu-gray"></span>
- Auto-archive completed prints
- <span class="cstat-no" title="statement not covered" > </label></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex gap-3 pt-4"></span>
- <span class="cstat-no" title="statement not covered" > <Button type="button" variant="secondary" onClick={onClose} className="flex-1"></span>
- Cancel
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > <Button type="submit" className="flex-1" disabled={updateMutation.isPending}></span>
- <span class="cstat-no" title="statement not covered" > {updateMutation.isPending ? 'Saving...' : 'Save Changes'}</span>
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </form></span>
- <span class="cstat-no" title="statement not covered" > </CardContent></span>
- <span class="cstat-no" title="statement not covered" > </Card></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Component to check if a printer is offline (for power dropdown)
- <span class="cstat-no" title="statement not covered" >function usePrinterOfflineStatus(printerId: number) {</span>
- <span class="cstat-no" title="statement not covered" > const { data: status } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['printerStatus', printerId],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getPrinterStatus(printerId),</span>
- <span class="cstat-no" title="statement not covered" > refetchInterval: 30000,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > return !status?.connected;</span>
- <span class="cstat-no" title="statement not covered" >}</span>
-
- // Power dropdown item for an offline printer
- <span class="cstat-no" title="statement not covered" >function PowerDropdownItem({</span>
- <span class="cstat-no" title="statement not covered" > printer,</span>
- <span class="cstat-no" title="statement not covered" > plug,</span>
- <span class="cstat-no" title="statement not covered" > onPowerOn,</span>
- <span class="cstat-no" title="statement not covered" > isPowering,</span>
- <span class="cstat-no" title="statement not covered" >}: {</span>
- printer: Printer;
- plug: { id: number; name: string };
- onPowerOn: (plugId: number) => void;
- isPowering: boolean;
- <span class="cstat-no" title="statement not covered" >}) {</span>
- <span class="cstat-no" title="statement not covered" > const isOffline = usePrinterOfflineStatus(printer.id);</span>
-
- // Fetch plug status
- <span class="cstat-no" title="statement not covered" > const { data: plugStatus } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['smartPlugStatus', plug.id],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: () => api.getSmartPlugStatus(plug.id),</span>
- <span class="cstat-no" title="statement not covered" > refetchInterval: 10000,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Only show if printer is offline
- <span class="cstat-no" title="statement not covered" > if (!isOffline) {</span>
- <span class="cstat-no" title="statement not covered" > return null;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center justify-between px-3 py-2 hover:bg-gray-100 dark:hover:bg-bambu-dark-tertiary"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-2 min-w-0"></span>
- <span class="cstat-no" title="statement not covered" > <span className="text-sm text-gray-900 dark:text-white truncate">{printer.name}</span></span>
- <span class="cstat-no" title="statement not covered" > {plugStatus && (</span>
- <span class="cstat-no" title="statement not covered" > <span</span>
- <span class="cstat-no" title="statement not covered" > className={`text-xs px-1.5 py-0.5 rounded ${</span>
- <span class="cstat-no" title="statement not covered" > plugStatus.state === 'ON'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-red-500/20 text-red-400'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > {plugStatus.state || '?'}</span>
- <span class="cstat-no" title="statement not covered" > </span></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => onPowerOn(plug.id)}</span>
- <span class="cstat-no" title="statement not covered" > disabled={isPowering || plugStatus?.state === 'ON'}</span>
- <span class="cstat-no" title="statement not covered" > className={`px-2 py-1 text-xs rounded transition-colors flex items-center gap-1 ${</span>
- <span class="cstat-no" title="statement not covered" > plugStatus?.state === 'ON'</span>
- <span class="cstat-no" title="statement not covered" > ? 'bg-bambu-green/20 text-bambu-green cursor-default'</span>
- <span class="cstat-no" title="statement not covered" > : 'bg-bambu-green/20 text-bambu-green hover:bg-bambu-green hover:text-white'</span>
- <span class="cstat-no" title="statement not covered" > }`}</span>
- >
- <span class="cstat-no" title="statement not covered" > <Power className="w-3 h-3" /></span>
- <span class="cstat-no" title="statement not covered" > {isPowering ? '...' : 'On'}</span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
-
- <span class="cstat-no" title="statement not covered" >export function PrintersPage() {</span>
- <span class="cstat-no" title="statement not covered" > const [showAddModal, setShowAddModal] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [hideDisconnected, setHideDisconnected] = useState(() => {</span>
- <span class="cstat-no" title="statement not covered" > return localStorage.getItem('hideDisconnectedPrinters') === 'true';</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const [showPowerDropdown, setShowPowerDropdown] = useState(false);</span>
- <span class="cstat-no" title="statement not covered" > const [poweringOn, setPoweringOn] = useState<number | null>(null);</span>
- <span class="cstat-no" title="statement not covered" > const [sortBy, setSortBy] = useState<SortOption>(() => {</span>
- <span class="cstat-no" title="statement not covered" > return (localStorage.getItem('printerSortBy') as SortOption) || 'name';</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const [sortAsc, setSortAsc] = useState<boolean>(() => {</span>
- <span class="cstat-no" title="statement not covered" > return localStorage.getItem('printerSortAsc') !== 'false';</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const [viewMode, setViewMode] = useState<ViewMode>(() => {</span>
- <span class="cstat-no" title="statement not covered" > return (localStorage.getItem('printerViewMode') as ViewMode) || 'expanded';</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > const queryClient = useQueryClient();</span>
-
- <span class="cstat-no" title="statement not covered" > const { data: printers, isLoading } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['printers'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: api.getPrinters,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Fetch app settings for AMS thresholds
- <span class="cstat-no" title="statement not covered" > const { data: settings } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['settings'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: api.getSettings,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Fetch all smart plugs to know which printers have them
- <span class="cstat-no" title="statement not covered" > const { data: smartPlugs } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['smart-plugs'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: api.getSmartPlugs,</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Fetch maintenance overview for all printers to show badges
- <span class="cstat-no" title="statement not covered" > const { data: maintenanceOverview } = useQuery({</span>
- <span class="cstat-no" title="statement not covered" > queryKey: ['maintenanceOverview'],</span>
- <span class="cstat-no" title="statement not covered" > queryFn: api.getMaintenanceOverview,</span>
- <span class="cstat-no" title="statement not covered" > staleTime: 60 * 1000, // 1 minute</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- // Create a map of printer_id -> maintenance info for quick lookup
- <span class="cstat-no" title="statement not covered" > const maintenanceByPrinter = maintenanceOverview?.reduce(</span>
- <span class="cstat-no" title="statement not covered" > (acc, overview) => {</span>
- <span class="cstat-no" title="statement not covered" > acc[overview.printer_id] = {</span>
- <span class="cstat-no" title="statement not covered" > due_count: overview.due_count,</span>
- <span class="cstat-no" title="statement not covered" > warning_count: overview.warning_count,</span>
- <span class="cstat-no" title="statement not covered" > total_print_hours: overview.total_print_hours,</span>
- <span class="cstat-no" title="statement not covered" > };</span>
- <span class="cstat-no" title="statement not covered" > return acc;</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > {} as Record<number, PrinterMaintenanceInfo></span>
- <span class="cstat-no" title="statement not covered" > ) || {};</span>
-
- // Create a map of printer_id -> smart plug
- <span class="cstat-no" title="statement not covered" > const smartPlugByPrinter = smartPlugs?.reduce(</span>
- <span class="cstat-no" title="statement not covered" > (acc, plug) => {</span>
- <span class="cstat-no" title="statement not covered" > if (plug.printer_id) {</span>
- <span class="cstat-no" title="statement not covered" > acc[plug.printer_id] = plug;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
- <span class="cstat-no" title="statement not covered" > return acc;</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > {} as Record<number, typeof smartPlugs[0]></span>
- <span class="cstat-no" title="statement not covered" > ) || {};</span>
-
- <span class="cstat-no" title="statement not covered" > const addMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: api.createPrinter,</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['printers'] });</span>
- <span class="cstat-no" title="statement not covered" > setShowAddModal(false);</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > const powerOnMutation = useMutation({</span>
- <span class="cstat-no" title="statement not covered" > mutationFn: (plugId: number) => api.controlSmartPlug(plugId, 'on'),</span>
- <span class="cstat-no" title="statement not covered" > onSuccess: () => {</span>
- <span class="cstat-no" title="statement not covered" > queryClient.invalidateQueries({ queryKey: ['smart-plugs'] });</span>
- <span class="cstat-no" title="statement not covered" > setPoweringOn(null);</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > onError: () => {</span>
- <span class="cstat-no" title="statement not covered" > setPoweringOn(null);</span>
- <span class="cstat-no" title="statement not covered" > },</span>
- <span class="cstat-no" title="statement not covered" > });</span>
-
- <span class="cstat-no" title="statement not covered" > const toggleHideDisconnected = () => {</span>
- <span class="cstat-no" title="statement not covered" > const newValue = !hideDisconnected;</span>
- <span class="cstat-no" title="statement not covered" > setHideDisconnected(newValue);</span>
- <span class="cstat-no" title="statement not covered" > localStorage.setItem('hideDisconnectedPrinters', String(newValue));</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- <span class="cstat-no" title="statement not covered" > const handleSortChange = (newSort: SortOption) => {</span>
- <span class="cstat-no" title="statement not covered" > setSortBy(newSort);</span>
- <span class="cstat-no" title="statement not covered" > localStorage.setItem('printerSortBy', newSort);</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- <span class="cstat-no" title="statement not covered" > const toggleSortDirection = () => {</span>
- <span class="cstat-no" title="statement not covered" > const newAsc = !sortAsc;</span>
- <span class="cstat-no" title="statement not covered" > setSortAsc(newAsc);</span>
- <span class="cstat-no" title="statement not covered" > localStorage.setItem('printerSortAsc', String(newAsc));</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- <span class="cstat-no" title="statement not covered" > const toggleViewMode = () => {</span>
- <span class="cstat-no" title="statement not covered" > const newMode = viewMode === 'expanded' ? 'compact' : 'expanded';</span>
- <span class="cstat-no" title="statement not covered" > setViewMode(newMode);</span>
- <span class="cstat-no" title="statement not covered" > localStorage.setItem('printerViewMode', newMode);</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- // Sort printers based on selected option
- <span class="cstat-no" title="statement not covered" > const sortedPrinters = useMemo(() => {</span>
- <span class="cstat-no" title="statement not covered" > if (!printers) return [];</span>
- <span class="cstat-no" title="statement not covered" > const sorted = [...printers];</span>
-
- <span class="cstat-no" title="statement not covered" > switch (sortBy) {</span>
- <span class="cstat-no" title="statement not covered" > case 'name':</span>
- <span class="cstat-no" title="statement not covered" > sorted.sort((a, b) => a.name.localeCompare(b.name));</span>
- <span class="cstat-no" title="statement not covered" > break;</span>
- <span class="cstat-no" title="statement not covered" > case 'model':</span>
- <span class="cstat-no" title="statement not covered" > sorted.sort((a, b) => (a.model || '').localeCompare(b.model || ''));</span>
- <span class="cstat-no" title="statement not covered" > break;</span>
- <span class="cstat-no" title="statement not covered" > case 'location':</span>
- // Sort by location, with ungrouped printers last
- <span class="cstat-no" title="statement not covered" > sorted.sort((a, b) => {</span>
- <span class="cstat-no" title="statement not covered" > const locA = a.location || '';</span>
- <span class="cstat-no" title="statement not covered" > const locB = b.location || '';</span>
- <span class="cstat-no" title="statement not covered" > if (!locA && locB) return 1;</span>
- <span class="cstat-no" title="statement not covered" > if (locA && !locB) return -1;</span>
- <span class="cstat-no" title="statement not covered" > return locA.localeCompare(locB) || a.name.localeCompare(b.name);</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > break;</span>
- <span class="cstat-no" title="statement not covered" > case 'status':</span>
- // Sort by status: printing > idle > offline
- <span class="cstat-no" title="statement not covered" > sorted.sort((a, b) => {</span>
- <span class="cstat-no" title="statement not covered" > const statusA = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', a.id]);</span>
- <span class="cstat-no" title="statement not covered" > const statusB = queryClient.getQueryData<{ connected: boolean; state: string | null }>(['printerStatus', b.id]);</span>
-
- <span class="cstat-no" title="statement not covered" > const getPriority = (s: typeof statusA) => {</span>
- <span class="cstat-no" title="statement not covered" > if (!s?.connected) return 2; // offline</span>
- <span class="cstat-no" title="statement not covered" > if (s.state === 'RUNNING') return 0; // printing</span>
- <span class="cstat-no" title="statement not covered" > return 1; // idle</span>
- <span class="cstat-no" title="statement not covered" > };</span>
-
- <span class="cstat-no" title="statement not covered" > return getPriority(statusA) - getPriority(statusB);</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > break;</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- // Apply ascending/descending
- <span class="cstat-no" title="statement not covered" > if (!sortAsc) {</span>
- <span class="cstat-no" title="statement not covered" > sorted.reverse();</span>
- <span class="cstat-no" title="statement not covered" > }</span>
-
- <span class="cstat-no" title="statement not covered" > return sorted;</span>
- <span class="cstat-no" title="statement not covered" > }, [printers, sortBy, sortAsc, queryClient]);</span>
-
- // Group printers by location when sorted by location
- <span class="cstat-no" title="statement not covered" > const groupedPrinters = useMemo(() => {</span>
- <span class="cstat-no" title="statement not covered" > if (sortBy !== 'location') return null;</span>
-
- <span class="cstat-no" title="statement not covered" > const groups: Record<string, typeof sortedPrinters> = {};</span>
- <span class="cstat-no" title="statement not covered" > sortedPrinters.forEach(printer => {</span>
- <span class="cstat-no" title="statement not covered" > const location = printer.location || 'Ungrouped';</span>
- <span class="cstat-no" title="statement not covered" > if (!groups[location]) groups[location] = [];</span>
- <span class="cstat-no" title="statement not covered" > groups[location].push(printer);</span>
- <span class="cstat-no" title="statement not covered" > });</span>
- <span class="cstat-no" title="statement not covered" > return groups;</span>
- <span class="cstat-no" title="statement not covered" > }, [sortBy, sortedPrinters]);</span>
-
- <span class="cstat-no" title="statement not covered" > return (</span>
- <span class="cstat-no" title="statement not covered" > <div className="p-4 md:p-8"></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center justify-between mb-6"></span>
- <span class="cstat-no" title="statement not covered" > <div></span>
- <span class="cstat-no" title="statement not covered" > <h1 className="text-2xl font-bold text-white">Printers</h1></span>
- <span class="cstat-no" title="statement not covered" > <StatusSummaryBar printers={printers} /></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-3"></span>
- {/* Sort dropdown */}
- <span class="cstat-no" title="statement not covered" > <div className="flex items-center gap-1"></span>
- <span class="cstat-no" title="statement not covered" > <select</span>
- <span class="cstat-no" title="statement not covered" > value={sortBy}</span>
- <span class="cstat-no" title="statement not covered" > onChange={(e) => handleSortChange(e.target.value as SortOption)}</span>
- <span class="cstat-no" title="statement not covered" > className="text-sm bg-bambu-dark border border-bambu-dark-tertiary rounded-lg px-2 py-1.5 text-white focus:border-bambu-green focus:outline-none"</span>
- >
- <span class="cstat-no" title="statement not covered" > <option value="name">Name</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="status">Status</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="model">Model</option></span>
- <span class="cstat-no" title="statement not covered" > <option value="location">Location</option></span>
- <span class="cstat-no" title="statement not covered" > </select></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={toggleSortDirection}</span>
- <span class="cstat-no" title="statement not covered" > className="p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors"</span>
- <span class="cstat-no" title="statement not covered" > title={sortAsc ? 'Sort descending' : 'Sort ascending'}</span>
- >
- <span class="cstat-no" title="statement not covered" > {sortAsc ? (</span>
- <span class="cstat-no" title="statement not covered" > <ArrowUp className="w-4 h-4 text-bambu-gray" /></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <ArrowDown className="w-4 h-4 text-bambu-gray" /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- {/* View mode toggle */}
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={toggleViewMode}</span>
- <span class="cstat-no" title="statement not covered" > className="p-1.5 rounded-lg hover:bg-bambu-dark-tertiary transition-colors"</span>
- <span class="cstat-no" title="statement not covered" > title={viewMode === 'expanded' ? 'Switch to compact view' : 'Switch to expanded view'}</span>
- >
- <span class="cstat-no" title="statement not covered" > {viewMode === 'expanded' ? (</span>
- <span class="cstat-no" title="statement not covered" > <LayoutList className="w-5 h-5 text-bambu-gray" /></span>
- ) : (
- <span class="cstat-no" title="statement not covered" > <LayoutGrid className="w-5 h-5 text-bambu-gray" /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </button></span>
-
- <span class="cstat-no" title="statement not covered" > <div className="w-px h-6 bg-bambu-dark-tertiary" /></span>
-
- <span class="cstat-no" title="statement not covered" > <label className="flex items-center gap-2 text-sm text-bambu-gray cursor-pointer"></span>
- <span class="cstat-no" title="statement not covered" > <input</span>
- <span class="cstat-no" title="statement not covered" > type="checkbox"</span>
- <span class="cstat-no" title="statement not covered" > checked={hideDisconnected}</span>
- <span class="cstat-no" title="statement not covered" > onChange={toggleHideDisconnected}</span>
- <span class="cstat-no" title="statement not covered" > className="rounded border-bambu-dark-tertiary bg-bambu-dark text-bambu-green focus:ring-bambu-green"</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- Hide offline
- <span class="cstat-no" title="statement not covered" > </label></span>
- {/* Power dropdown for offline printers with smart plugs */}
- <span class="cstat-no" title="statement not covered" > {hideDisconnected && Object.keys(smartPlugByPrinter).length > 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="relative"></span>
- <span class="cstat-no" title="statement not covered" > <button</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowPowerDropdown(!showPowerDropdown)}</span>
- <span class="cstat-no" title="statement not covered" > className="flex items-center gap-1.5 px-3 py-1.5 text-sm bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg text-gray-600 dark:text-bambu-gray hover:text-gray-900 dark:hover:text-white hover:border-bambu-green transition-colors"</span>
- >
- <span class="cstat-no" title="statement not covered" > <Power className="w-4 h-4" /></span>
- Power On
- <span class="cstat-no" title="statement not covered" > <ChevronDown className={`w-3 h-3 transition-transform ${showPowerDropdown ? 'rotate-180' : ''}`} /></span>
- <span class="cstat-no" title="statement not covered" > </button></span>
- <span class="cstat-no" title="statement not covered" > {showPowerDropdown && (</span>
- <span class="cstat-no" title="statement not covered" > <></span>
- {/* Backdrop to close dropdown */}
- <span class="cstat-no" title="statement not covered" > <div</span>
- <span class="cstat-no" title="statement not covered" > className="fixed inset-0 z-10"</span>
- <span class="cstat-no" title="statement not covered" > onClick={() => setShowPowerDropdown(false)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > <div className="absolute right-0 mt-2 w-56 bg-white dark:bg-bambu-dark-secondary border border-gray-200 dark:border-bambu-dark-tertiary rounded-lg shadow-lg z-20 py-1"></span>
- <span class="cstat-no" title="statement not covered" > <div className="px-3 py-2 text-xs text-gray-500 dark:text-bambu-gray border-b border-gray-200 dark:border-bambu-dark-tertiary"></span>
- Offline printers with smart plugs
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > {printers?.filter(p => smartPlugByPrinter[p.id]).map(printer => (</span>
- <span class="cstat-no" title="statement not covered" > <PowerDropdownItem</span>
- <span class="cstat-no" title="statement not covered" > key={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printer={printer}</span>
- <span class="cstat-no" title="statement not covered" > plug={smartPlugByPrinter[printer.id]}</span>
- <span class="cstat-no" title="statement not covered" > onPowerOn={(plugId) => {</span>
- <span class="cstat-no" title="statement not covered" > setPoweringOn(plugId);</span>
- <span class="cstat-no" title="statement not covered" > powerOnMutation.mutate(plugId);</span>
- <span class="cstat-no" title="statement not covered" > }}</span>
- <span class="cstat-no" title="statement not covered" > isPowering={poweringOn === smartPlugByPrinter[printer.id]?.id}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > ))}</span>
- <span class="cstat-no" title="statement not covered" > {printers?.filter(p => smartPlugByPrinter[p.id]).length === 0 && (</span>
- <span class="cstat-no" title="statement not covered" > <div className="px-3 py-2 text-sm text-bambu-gray"></span>
- No printers with smart plugs
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
- <span class="cstat-no" title="statement not covered" > <Button onClick={() => setShowAddModal(true)}></span>
- <span class="cstat-no" title="statement not covered" > <Plus className="w-4 h-4" /></span>
- Add Printer
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
-
- <span class="cstat-no" title="statement not covered" > {isLoading ? (</span>
- <span class="cstat-no" title="statement not covered" > <div className="text-center py-12 text-bambu-gray">Loading printers...</div></span>
- <span class="cstat-no" title="statement not covered" > ) : printers?.length === 0 ? (</span>
- <span class="cstat-no" title="statement not covered" > <Card></span>
- <span class="cstat-no" title="statement not covered" > <CardContent className="text-center py-12"></span>
- <span class="cstat-no" title="statement not covered" > <p className="text-bambu-gray mb-4">No printers configured yet</p></span>
- <span class="cstat-no" title="statement not covered" > <Button onClick={() => setShowAddModal(true)}></span>
- <span class="cstat-no" title="statement not covered" > <Plus className="w-4 h-4" /></span>
- Add Your First Printer
- <span class="cstat-no" title="statement not covered" > </Button></span>
- <span class="cstat-no" title="statement not covered" > </CardContent></span>
- <span class="cstat-no" title="statement not covered" > </Card></span>
- <span class="cstat-no" title="statement not covered" > ) : groupedPrinters ? (</span>
- /* Grouped by location view */
- <span class="cstat-no" title="statement not covered" > <div className="space-y-6"></span>
- <span class="cstat-no" title="statement not covered" > {Object.entries(groupedPrinters).map(([location, locationPrinters]) => (</span>
- <span class="cstat-no" title="statement not covered" > <div key={location}></span>
- <span class="cstat-no" title="statement not covered" > <h2 className="text-lg font-semibold text-white mb-3 flex items-center gap-2"></span>
- <span class="cstat-no" title="statement not covered" > <span className="w-2 h-2 rounded-full bg-bambu-green" /></span>
- <span class="cstat-no" title="statement not covered" > {location}</span>
- <span class="cstat-no" title="statement not covered" > <span className="text-sm font-normal text-bambu-gray">({locationPrinters.length})</span></span>
- <span class="cstat-no" title="statement not covered" > </h2></span>
- <span class="cstat-no" title="statement not covered" > <div className={`grid gap-4 ${</span>
- <span class="cstat-no" title="statement not covered" > viewMode === 'compact'</span>
- <span class="cstat-no" title="statement not covered" > ? 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4'</span>
- <span class="cstat-no" title="statement not covered" > : 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6'</span>
- <span class="cstat-no" title="statement not covered" > }`}></span>
- <span class="cstat-no" title="statement not covered" > {locationPrinters.map((printer) => (</span>
- <span class="cstat-no" title="statement not covered" > <PrinterCard</span>
- <span class="cstat-no" title="statement not covered" > key={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printer={printer}</span>
- <span class="cstat-no" title="statement not covered" > hideIfDisconnected={hideDisconnected}</span>
- <span class="cstat-no" title="statement not covered" > maintenanceInfo={maintenanceByPrinter[printer.id]}</span>
- <span class="cstat-no" title="statement not covered" > viewMode={viewMode}</span>
- <span class="cstat-no" title="statement not covered" > amsThresholds={settings ? {</span>
- <span class="cstat-no" title="statement not covered" > humidityGood: Number(settings.ams_humidity_good) || 40,</span>
- <span class="cstat-no" title="statement not covered" > humidityFair: Number(settings.ams_humidity_fair) || 60,</span>
- <span class="cstat-no" title="statement not covered" > tempGood: Number(settings.ams_temp_good) || 28,</span>
- <span class="cstat-no" title="statement not covered" > tempFair: Number(settings.ams_temp_fair) || 35,</span>
- <span class="cstat-no" title="statement not covered" > } : undefined}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > ))}</span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- <span class="cstat-no" title="statement not covered" > ))}</span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- ) : (
- /* Regular grid view */
- <span class="cstat-no" title="statement not covered" > <div className={`grid gap-4 ${</span>
- <span class="cstat-no" title="statement not covered" > viewMode === 'compact'</span>
- <span class="cstat-no" title="statement not covered" > ? 'grid-cols-1 md:grid-cols-2 lg:grid-cols-4'</span>
- <span class="cstat-no" title="statement not covered" > : 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6'</span>
- <span class="cstat-no" title="statement not covered" > }`}></span>
- <span class="cstat-no" title="statement not covered" > {sortedPrinters.map((printer) => (</span>
- <span class="cstat-no" title="statement not covered" > <PrinterCard</span>
- <span class="cstat-no" title="statement not covered" > key={printer.id}</span>
- <span class="cstat-no" title="statement not covered" > printer={printer}</span>
- <span class="cstat-no" title="statement not covered" > hideIfDisconnected={hideDisconnected}</span>
- <span class="cstat-no" title="statement not covered" > maintenanceInfo={maintenanceByPrinter[printer.id]}</span>
- <span class="cstat-no" title="statement not covered" > viewMode={viewMode}</span>
- <span class="cstat-no" title="statement not covered" > amsThresholds={settings ? {</span>
- <span class="cstat-no" title="statement not covered" > humidityGood: Number(settings.ams_humidity_good) || 40,</span>
- <span class="cstat-no" title="statement not covered" > humidityFair: Number(settings.ams_humidity_fair) || 60,</span>
- <span class="cstat-no" title="statement not covered" > tempGood: Number(settings.ams_temp_good) || 28,</span>
- <span class="cstat-no" title="statement not covered" > tempFair: Number(settings.ams_temp_fair) || 35,</span>
- <span class="cstat-no" title="statement not covered" > } : undefined}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- <span class="cstat-no" title="statement not covered" > ))}</span>
- <span class="cstat-no" title="statement not covered" > </div></span>
- )}
-
- <span class="cstat-no" title="statement not covered" > {showAddModal && (</span>
- <span class="cstat-no" title="statement not covered" > <AddPrinterModal</span>
- <span class="cstat-no" title="statement not covered" > onClose={() => setShowAddModal(false)}</span>
- <span class="cstat-no" title="statement not covered" > onAdd={(data) => addMutation.mutate(data)}</span>
- <span class="cstat-no" title="statement not covered" > /></span>
- )}
- <span class="cstat-no" title="statement not covered" > </div></span>
- );
- <span class="cstat-no" title="statement not covered" >}</span>
- </pre></td></tr></table></pre>
- <div class='push'></div><!-- for sticky footer -->
- </div><!-- /wrapper -->
- <div class='footer quiet pad2 space-top1 center small'>
- Code coverage generated by
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
- at 2025-12-11T08:38:30.022Z
- </div>
- <script src="../../prettify.js"></script>
- <script>
- window.onload = function () {
- prettyPrint();
- };
- </script>
- <script src="../../sorter.js"></script>
- <script src="../../block-navigation.js"></script>
- </body>
- </html>
-
|